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)); }
        }

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

Тагове:
0
Programming Basics
KrasimirPetkov avatar KrasimirPetkov 328 Точки

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

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 328 Точки

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

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

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 328 Точки

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

Ето и пример със същата задача: 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 328 Точки

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

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

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

1
01/07/2016 16:24:28
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.