Drawing Figures - N x N stars - Софтуерен университет

Drawing Figures - N x N stars - Софтуерен университет

+ Нов въпрос
rado84 avatar rado84 1 Точки

Drawing Figures - N x N stars

Тая задача нещо ми се опъва - не иска да изкара интервал след звездичката и пише, че не можело да конвертира string в character. Последният ми опит е по-долу. Идеи?

        {
            int i = int.Parse(Console.ReadLine());
            int n = i;

            for (i = 1; i <= n; i++)
            { Console.WriteLine(new string('*' + ' ', n)); }
        }

Трябва да излязат така:

Тагове:
Plamen27 avatar Plamen27 597 Точки

Фикс: 

   var n = int.Parse(Console.ReadLine());

            for (int red = 1; red <= n; red++)
            {
                Console.Write("*");
                for (int kol = 1; kol < n; kol++)
                {
                    Console.Write(" *");
                }
                Console.WriteLine();
            }
 

1
30/06/2016 21:43:32
WaLkZ avatar WaLkZ 7 Точки

Или

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < 2 * n - 1; j++)
                {
                    Console.Write((j % 2 == 0) ? '*' : ' ');
                }

                Console.WriteLine();
            }

 

1
YavorSpassov avatar YavorSpassov 133 Точки
int n = int.Parse(Console.ReadLine());

            for (int i = 0; i < n; i++)
            {
                for (int k = 0; k < n; k++)
                {
                    Console.Write("* ");
                }
                Console.WriteLine();
            }

 

2
KrasimirPetkov avatar KrasimirPetkov 331 Точки

Ето и един по-различен начин да се реши (ще се опитам и да го обясня):

int n = int.Parse(Console.ReadLine());
for (int i = 0; i < n; i++)
{
    Console.WriteLine(new string('o', n).Replace("o","* ").Substring(0, 2*n-1));
}

1. С new string('o', n) създаваме string, който съдържа в себе си символа 'o', n на брой пъти.

2. С .Replace("o", "* ") поставяме "* " на мястото на всеки символ "o".

3. Крайното .Substring(0, 2*n-1) е по желание. То премахва излишния интервал след последната "*". Принципът му на работа е: задаваш начало (в случая 0) и брой символи (в случая 2*n-1), като то ти връща зададения брой символи, взети от зададеното начало. Например: "Good Morning".Substring(0,4) връща "Good".

Показвам това решение, тъй като много често спестява излишни проверки и вложени цикли, когато в дадена задача се иска да има поредица от повтарящи се символи на един ред. Надявам се да ви е било полезно.

Успех!

3
rado84 avatar rado84 1 Точки

Мерси, Краси. Т'ва изглежда интересно и ще го разцъкам допълнително, за да го доразбера. Обяснението ти е много добро, но аз най-добре запомням, когато го run-на и сам видя какво точно се случва. :)

А един въпрос извън задачата, просто от любопитство: да речем, че не искаш да ползваш цикъл, за да повториш дадена команда. Има ли някакъв начин (команда), с който да укажеш на конзолата, че искаш да повтори Console.WriteLine("...."); 4 пъти (примерно)?

0
01/07/2016 13:26:31
KrasimirPetkov avatar KrasimirPetkov 331 Точки

Накратко: не се сещам за такъв вариант, но има някои заобиколни начини (които като цяло не са добра идея).

Ще ти дам пример с конкретната задача, решена по друг начин:

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        var result = Enumerable.Repeat(new string('o', n).Replace("o", "* ").Substring(0, 2 * n - 1), n);
        Console.WriteLine(string.Join("\n", result));
    }
}

Разликите са:

1. Добавяме using System.Linq; което ни трябва за да използваме някои от методите за това решение.

2. Използваме Enumerable.Repeat(), като подаваме за аргументи нашия стринг и брой пъти, който искаме да се съдържа. То ни връща като резултат IEnumerable<string>, което съхраняваме в променливата result (използвал съм var вместо IEnumerable<string> за да е по-четливо). Така се получава колекция, която съдържа в себе си stringn на брой пъти.

3. Отпечатваме колекцията със String.Join(), като използваме "\n" за разделител, което C# го интерпретира като нов ред.

Като цяло този начин за решаване не е добър и е доста по-сложен като записване. По-добрият вариант остава да използваш цикъл.

Относно Console.WriteLine() и изпълнението му n на брой пъти - това е идеята при използване на цикъл. Може да се намерят заобиколни варианти, но едва ли ще са по-лесни или по-разбираеми.

PS: В това решение не повтаряме командата, а просто създаваме колекция от данни, която може да се изведе по друг начин на конзолата. Идеята ми беше, че всичко зависи от ситуацията. В конкретната задача има решение без да напишеш for-цикъл в Main() метода. За други задачи няма гаранции, че ще се намери такъв вариант. Като цяло циклите са един от основните елементи на програмирането и няма как да се справиш без тях. Дори и като използваш функции от сорта на Enumerable.Repeat() или String.Join() най-вероятно в изпълнението им си е заложен някой цикъл.

Надявам се информацията да ти е била от полза. Успех!

2
01/07/2016 13:56:50
KrasimirPetkov avatar KrasimirPetkov 331 Точки

Друг вариант е да използваш методи, като сам си направиш такъв, който да изпълнява функцията.

Ето и пример със същата задача: http://pastebin.com/r9wmJnc4

Методите са тема, която е доста обширна, така че трудно ще ти го обясня тук, без да изпиша цял роман. Виж го и ако имаш конкретни въпроси, бих се радвал да ти отговоря. Но като цяло сам ще разбереш, че без цикли няма как да се направят нещата :)

Успех!

0