Loading...
g_todorov avatar g_todorov 106 Точки

Задача - 06. Square of Stars

Здравейте,

намерих много кратко и удачно решение на задачата посочена в заглавието на въпроса ми, но

не мога да си я обясня. Тази задача е от лекцията First Steps in Coding r и e 6-та поредна. Решението 

го намерих тук във форума, но не мога да го намеря отново и забравих името на създателя му, за което се извинявам. Моля менторите и тези които са по-напреднали да обяснят ред по ред логиката на сорскода по-долу, за да намаля простотията си по тая задача! :) Преварително Ви благодаря за съдействието:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace square_of_Stars
{
    class Program
    {
        static void Main(string[] args)
        {
            var n = int.Parse(Console.ReadLine());

            for (int i = 1; i <= n; i++)
            {
                if (i == 1 || i == n) Console.WriteLine(new string('*', n));
                else Console.WriteLine("*{0}*", new string(' ', n - 2));
            }
        }
    }
}


        
    

Тагове:
0
Programming Fundamentals 18/10/2016 20:58:45
ZornitsaSerbezova avatar ZornitsaSerbezova 455 Точки

            for (int i = 1; i <= n; i++) // завърташ цикъл за броят редове
            {
                if (i == 1 || i == n) Console.WriteLine(new string('*', n)); // за първи и последен ред печаташ стринг - ред от звездички
                else Console.WriteLine("*{0}*", new string(' ', n - 2)); // ако не е първи или последен ред, печаташ стринг, на който първия и последния символ са звездички, а всички останали са интервали.
            }

0
16/10/2016 19:12:15
g_todorov avatar g_todorov 106 Точки

Благодаря много Зорница Сербезова!

Въпросите са ми вероятно банални, защото само от няколко дни се занимавам с програмиране.

Не съм наясно със синтактичната структура на If и за това не успях да си обясня какво всъщност прави компилатора (дали това беше правилната дума) като стигне до този ред.  До колкото разбирам (поправи ме ако греша) ако i e идентично на 1(или това да е първо завъртане на цикъла  mhm mhm), тогава конзолата трябва да изпише нов низ от звездички n пъти в случая 1 звездичка (или първоначално зададения брой *). (Двете успоредни прави за разделител на аргументите в скобите на if са просто разделител или притежават и др. функция в първа лекция не бе споменато, но ще намеря 2-ра от минал курс където сигурно споменават или ще гугълна.) Във всички останали случаи, когато n не е идентично на 1 (или не е първо и последно завъртане на циъла) конзолата трябва да изпише нов низ от празни места (вероятно 0 в скобите това означава), които празни места да са заобиколени от * в началото и * края, като броя на празните места да е равен на ръчно зададения брой * - 2 (който всъщност е сбора от звездичките в началото и края на реда) ?

0
Pilgrimage avatar Pilgrimage 515 Точки

Двете успоредни вертикални черти "||" означават логическа функция ИЛИ, т.е. "OR".

В изражението (i == 1 || i == n) това означава, че или i трябва да е равно 1 или да е равно на n. (т.е. да е първи или последен ред) за да разпечата стринга с пълният брой звездички.

В следващият ред:

Console.WriteLine("*{0}*", new string(' ', n - 2))

се разпечатва това, което е заградено в кавичките, т.е. *{0}*, където звездичките са ясни (първа и последна на реда), а {0} е нещо, което се нарича плейсхолдер (placeholder) и представлява място, където да се отпечата стойността на променлива или израз. Нулата означава, че това е първата променлива след затварящите кавички, т.е. в случая съдържанието на new string(' ', n - 2)). което е стринг от (n-2) броя празни интервали.

0
g_todorov avatar g_todorov 106 Точки

Още веднъж благодарст и признателност Pilgrimage за доуточняващия отговор.

С твоя помощ и на колежката ZornitsaSerbezova вече съм напълно наясно с логиката и детайлите на решение на тази задача.

0
Pilgrimage avatar Pilgrimage 515 Точки

Колежката ZornitsaSerbezova добре ти е обяснила общата логика.
Съдейки по това как аз се чудих преди време, ще ти обясня по-подробно това new string('*', n).

Разписано не толкова кратко:

string firstLastLine = new string('*', n);

string middleLine = new string('*', n-2);

Отляво на знака = декларираме променлива firstLastLine от тип string .

От дясната страна го инициализираме. С new му казваме да си задели място в паметта.

Конструктора string('*', n) генерира стринг, като повтаря символа между апострофите, който е от тип char (в случая *), n на брой пъти.

Ако си създал стрингoвете предварително, в цикъла можеш можеш да напишеш:

if (i == 1 || i == n) Console.WriteLine(firstLastLine);
else Console.WriteLine("*{0}*", middleLine);            // или по-просто:  else Console.WriteLine("*" + middleLine + "*");

 

1
16/10/2016 19:44:36
g_todorov avatar g_todorov 106 Точки

Благодаря много Pilgrimage!

Твоят отговор заедно с на колежката ZornitsaSerbezova много ми помогнаха да осмисля синтаксиса на решението.  Нещо съвсем дребно ми убягва, но това вече е въпрос на научаване на струкурите ползвани в for  и if, което в момента разучавам. Радвам се и ме впечатляват бързите Ви отговори, защото идвам от сфера, където всичко може да се случи, но не и някой да ти обясни  или насочи към пътя за решаване на даден казус.

Желая на всички тук здраве, добро настроение и смело напред в програмирането!

0
WifiAvivi avatar WifiAvivi 151 Точки

Предлагам ти едно по-изчистено решение на задачата, което може да разбереш по-лесно.

 

using System;

class SquareOfStars
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        string star = new string('*', n);

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

 

0
17/10/2016 14:47:41
g_todorov avatar g_todorov 106 Точки

Благодаря много WifiAvivi !

Сядам да разуча новия код. 

От позицията на лайк все още се удивлявам, как различни кодове дават еднакъв резултат и си давам

сметка как програмирането развива креативното мислене.

1
ivan.d.uzunov avatar ivan.d.uzunov 22 Точки

 for (int i = 1; i <= n; i++)  - Цикъла ще ти се върти от 1 до n, тоест ако n e 5 , значи 5 пъти. 

if (i == 1 || i == n) - Ако е първа стъпка или последна на цикъла отпечатай "*" N-пъти 

тоест в този случай първия и посления ред ще изглеждат така - "*****"

else Console.WriteLine("*{0}*", new string(' ', n - 2)); - Ако не отпечатай "*"(звездичка),' ', n - 2 (интервал N-2 пъти) и после пак звездичка.

Тоест, след като излезем от цикъла, ще ни отпечата това:

 

Ако си разбрал циклите, започни да си рисуваш на лист това което се получава и ще ги разбереш.

Това е най-удобния начин за решаване на тези задачи, а не с вложени цикли (според мен) .

Поздрави

 

 

0
g_todorov avatar g_todorov 106 Точки

Благодаря много ivan.d.uzunov .

Уважавам и отдавам почит на всички, които помогнаха да разбера тоя тип задачи, но най-лесно я разбирам от твоите обяснения.

Това с рисуването на листа ще го пробвам.

Пожелавам здраве, късмет и много мотивация в програмирането на всички ни дето сме се запалили по това!

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