Софтуерно Инженерство
Loading...
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)); }
        }

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

Тагове:
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
rado84 avatar rado84 1 Точки

О, можеш да си сигурен, че ми е от полза. Харесва ми да научавам нови неща, а аз съм леко нетърпелив и непрекъснато си намирам неща из Гугъл, които вероятно ще учим чак на есен в следващия курс. А и е по-добре да знаеш алтернативата и да не ти трябва, отколкото обратното. :)

По същия начин с ровене из Гугъл открих например, че при пресмятане на изрази имаш различни начини да закръглиш едно число - нещо, което не се споменава в курса. Примерно числото 12.3456789 можеш да го закръглиш и с Math.Round, и с placeholder, или дори с Math.Truncate, като последното става дори още по-лесно с кастване, вместо с Math метод: кастваш го в инт и всичко след десетичната точка директно си заминава.

Това беше и причината да питам - хем ще науча нещо ново, хем не се знае кога и къде ще ми потрябва. ;)

1
rado84 avatar rado84 1 Точки

А, този ти пост от 14:11:53 късно го видях. Тук има само едно нещо, което не ми е ясно. Това след запетаята:

RepeatTimes(n, () => Console.WriteLine(row));

действащ код ли е или си го направил за по-голяма яснота? Щот' т'ва "равно по-голямо" май трябваше да е обратното. И ако е код, не може ли просто да се напише така?

RepeatTimes(n, (Console.WriteLine(row));

 

0
01/07/2016 14:31:04
KrasimirPetkov avatar KrasimirPetkov 331 Точки

Това с => е lambda израз. () означава че не декларираме аргументи за Action-a.

За повече информация: http://www.dotnetperls.com/lambda и http://www.dotnetperls.com/action

Извинявай, че не се старая повече да ти ги обясня тези неща, но се изискват доста странични знания, които не се покриват в Programming Basics, за да ги разбереш добре. Като за начало, най-добре се фокусирай върху основите - след това ще стигнеш и до тази област :)

1
01/07/2016 16:24:28