Loading...

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

Losko avatar Losko 69 Точки

Задача - 06. Triangle of 55 Stars

Здравейте. Имам проблем с тази задача. До колкото си спомням този код би трябвало да свърши работа, но ефекта е като все едно в скобите е само ("*").

        for (int i = 0; i < 55; i++)
        {
            Console.WriteLine("*", i);
        }

"Напишете C# конзолна програма, която отпечатва триъгълник от 55 звездички, разположени на 10 реда"

Тагове:
0
Programming Basics 18/10/2016 20:59:31
GeorgiItsev avatar GeorgiItsev 17 Точки

Почни да трупаш все едно трупаш сума в променлива 

Пример:

String star ="*";

Console.Write line(star);

 star +=star;

При първата инфлация на цикъла ще се отпечатат * при втората ще станат  "**" защото по този начин залепяш един стинг към друг

0
11/06/2016 18:40:29
Woofles avatar Woofles 7 Точки

Моля те кажи дали това ти е свършило работа понеже навсякъде чета че веднъж създаден по този начин стринг със съдържание, повторно не може да се презаписва (че и със съдържание надвишаващо началното като размер).

0
KrasimirPetkov avatar KrasimirPetkov 328 Точки

Woofles,

Най-вероятно въпросът ти е свързан с факта, че string-овете в C# са immutable (тоест не могат да бъдат модифицирани). В случая обаче, принципът е друг.

Ако имаш string greetings = "Hello", това означава, че е заделено парче памет, което съдържа в себе си "Hello". Когато се опиташ да го промениш, например: greetings = greetings + " C#", това което се случва е, че на друго място в паметта се създава цялото "Hello C#", а после тази стойност се присвоява на променливата greetings. Предишната стойност "Hello" остава, докато Garbage Collector-a не я премахне от паметта. Затова съществува и StringBuilder, който е mutable и позволява да се извършват операции като добавяне на текст към string, без да се създават излишни копия. На този етап от обучението, string ти върши идеална работа и няма за какво да се притесняваш.

Относно star += star от примера на колегата - може да се адаптира към конкретната задача, но трябва да се замени със star += "*", защото в противен случай броят на звездите няма да нараства с една, а ще се удвоява при всяко изпълнение. Препоръчвам ти да разучиш new string() за конкретната задача (има доста примерни решения с него).

1
Impheatuss avatar Impheatuss 23 Точки

По принцип за 10 реда трябва да използваш for (int i = 1; i <=10; i++),а за другия ред намери в нета как се използва new String(); 

1
11/06/2016 19:19:49
ragingbull avatar ragingbull 5 Точки

Здравей,

Това е моето решение на задачата  TriangleOf55Stars:https://github.com/ggramov/First-steps-in-coding-Homework-SofUni/blob/master/TriangleOf55Stars.cs

i <11 ! Гледа максимума на ред не на целия низ.

Има много различни варианти как да го направиш стига да се разровиш в нета :)

Поздрави!

Ragingbull

 

0
11/06/2016 18:38:58
Losko avatar Losko 69 Точки

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

0
KrasimirPetkov avatar KrasimirPetkov 328 Точки

Здравей,

в конкретната задача, основното е да разбереш зависимостта, че на всеки ред има толкова звездички, колкото е номерът му (в случай, че броим от 1 до 10). Затова, можеш да използваш new string(<char>,<брой>), което ти връща цял string, който съдържа зададения символ определен брой пъти.

Например: new string( 'a', 10 ), ще ти върне стринг, който съдържа 10 пъти 'a' - "aaaaaaaaaa". (забележи, че стойностите от тип char ограждаме в единични кавички, а string-овете са в двойни - new string( "a", 10 ) няма да работи).

По този начин, ако имаш цикъл for(int i = 1; i<11; i++) като използваш new string( '*', i ), ще се получи желаният резултат.

new string() ще ти трябва и при всички задачи с рисуване в конзолата, които ще решавате по-нататък, така че е хубаво да свикнеш с използването му. Опитай се да решиш и последната задача Square of Stars, където също може да ти бъде полезен.

Успех!

Ето и примерно решение: http://pastebin.com/BENXY2rB

7
11/06/2016 18:57:07
Losko avatar Losko 69 Точки

Много благодаря. Хубаво е когато освен примен има и обяснение. 

1
Losko avatar Losko 69 Точки

С по-горе казаното на ум, 8-ма задача се решава много бързо. Благодаря отноов.

0
heilin90 avatar heilin90 69 Точки

Аз реших задачата с два  for цикъла - един за редовете и един за колоните, но определено вече ще се възползвам от new string-а.

using System;

class TriangleOf55Stars
{
    static void Main()
    {
        for (int row = 1; row <= 10; row++)
        {
            for (int col = 1; col <= row; col++)
            {
                Console.Write("*");
            }
            Console.WriteLine();
        }
    }
}

0
mishoka303+deleted! avatar mishoka303+deleted! 19 Точки

Здравей!

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

Задачата е следната: Да се напише конзолна C# задача, която отпечатва триъгълник от 55 звездички, разположени на 10 реда. ОК, схванал си, че трябва със цикъл for да се направи, но как ще направиш така, че след 10 реда да имаш точно 55 звездички?

Нека помислим малко сега! 55 звездички е доста трудно да се изчисли по колко звезди на ред трябва за да се запълнят 10 реда, особено ако искат в ТРИЪГЪЛНА форма да се направи. Какво може да ни помогне? Еми, триъгълника има връх, тоест започва със 1 звездичка и постепенно се увеличава. Знаем, че имаме 10 реда, но ако нямахме указани как можем да ги изчислим точно 55? Започваме от 1 и добавяме по 1 отгоре за всеки ред и го запазваме като новия резултат:

1 ред - 1

2 ред - 1+1 = 2 (2 става новото число)

3 ред - 2 + 1 = 3

4 ред - 3 + 1 = 4 и т.н.

Получава се 1+2+3+4+5+6+7+8+9+10 = 55, това означава, че за всяка изпълнена команда ще се увеличава бройката с 1.

Ще използваме цикъл for (<променлива>; <условие>; <оператор>) като си декларираме променлива i = 1, условието ни ще е докато не стигне 10-ти ред, оператора ще е да се вдигне с 1 единица нагоре при изпълнението на оператора for.

 

В този смисъл, нека сега го напишем: for (int i = 1; i<=10; i++) . При деклариране на променлива ВИНАГИ се оказва от какъв тип е(в случая целочислено). След това, докато i не стане 10 да се изпълнява същия оператор пак и пак. Накрая, при завършване на всяка операция в цикъла променливата i да се вдигне с 1 единица(++ се използва за това).

И сега какво? Как да изпиша ТОЧНО толкова символи? Как да накарам програмата да ги пресметне?

Това е много лесно. В твоя случай ти си написал Console.WriteLine("*", i); . Това означава, че ще напише стринг(редица от символи) като повтаря символа ' * ' колкото пъти е i. Така става ли? Абсолютно! i започва от 1, тоест първия път когато изпълни този оператор ще ти изведе на екрана на един ред(защото имаш WriteLINE) 1 път звездичка. След завършване на оператора, i става на 2. Когато изпълни оператора пак, той пак ще напиши същото, но този път i е 2 и ще напише 2 звездички и т.н. 

Дано съм помогнал с решението на задачата ти и също така с обяснението кое за какво се ползва :)

Моето решение: http://pastebin.com/tcfn1FYZ

2
Losko avatar Losko 69 Точки

Още колегата по-горе когато ми обясни проблема с "For" цикъла ми стана ясно, но благодаря все пак.

0
SoichiroHonda avatar SoichiroHonda 1 Точки

Благодаря за изчерпателният отговор! :)

0
t_zhelev avatar t_zhelev 24 Точки

За да работи твоя код трябва да изглежда по този начин

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

не ти работи понеже нещото което искаш да повториш е стринг (оградено е с 2 кавички), а това става само с char. За целта на Console.WriteLine подаваме изход един стринг който се състои от символа '*' повторен еди колко си пъти.

 

2
12/06/2016 01:12:20
Woofles avatar Woofles 7 Точки

В случая конкретна грешка май нямаш ами бъркаш функционалностите на string и WriteLine.

При WriteLine след запетаята параметърът ти играе роля просто на променлива която би се принтирала на мястото на {0} ако имаше такова между кавичките.

При string можеш да погледнеш това което ти трябва от втората презентация > слайд 27:

new string('*',i)   -   звездичката ти в случая се третира като единичен символ (повече от два ще ти дадат грешка) понеже кавичките са единични.

0
Losko avatar Losko 69 Точки

По-скоро грешката ми е, че подходих все едно цикля масив там си слагам [] и всичко работи както се очаква.... Опитвам се да решавам задачите по спомени от стари лекции които съм глдал и допускам глупави грешки като тази, когато се търси остатък от деление аз да деля числата ...... 

0
Osama avatar Osama 7 Точки

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

namespace Nums1To20
{
    class Program
    {
        static void Main(string[] args)
        {   
            for (int i = 1; i <= 10; i++)
            {
               string star = new string('*', i);
                Console.WriteLine(star);

            }
        }
    }
}
 

1
12/06/2016 23:53:04
borislav9212 avatar borislav9212 745 Точки

Здравей,

Може да използваш два вложени цикъла да обикаляш редовете и колоните. На row му казваш да върти до <= 10 , (тоест включително и десетата '*' ) а на col до row, ето така:

for (int row = 0; row <= 10; row++)
            {
                for (int col = 0; col < row; col++)
                {
                    Console.Write('*');
                }
                Console.WriteLine();
            }

0
Losko avatar Losko 69 Точки

using System;


class TriangleOf55Stars
{
    static void Main()
    {
        for (int i = 1; i <= 10; i++)
        {
            Console.WriteLine(new string('*',i));
        }
    }
}

Това ми е решението дава 100/100

Както споменавам по-горе. Веднага щом колегата ми написа да използвам " new string('*',i) " и задачата беше решена. :)

0
borislav9212 avatar borislav9212 745 Точки

Аз ти го казвам като решение, че и така също става. Катого  видиш този код някъде да знаеш за какво служи.

0
ZornitsaSerbezova avatar ZornitsaSerbezova 455 Точки

Ами аз го написах с десет реда Console.Write() и пак дава 100/100

1
dakata avatar dakata 26 Точки

Ето едно решение с while (До достигане на заветните 55 звездички :-) :

        static void Main()
        {
            int i = 1;
            int count = 1;
            while (i <= 55)
            {
                Console.WriteLine($"{new string('*', count)}");
                count++;
                i += count;
            }
        }

Поздрави,

dakata

0
dakata avatar dakata 26 Точки

Предлагам и по-съкратен вариант:

        static void Main()
        {
            int i = 1, count = 1;
            while (i <= 55) Console.WriteLine($"{new string('*', count)}", i += count++);
        }

 

0
VladimirPetukhov avatar VladimirPetukhov 28 Точки

Може да се каже че има и по бърз начин

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