Loading...
antonio_rtodorov avatar antonio_rtodorov 74 Точки

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

Здравейте,

начинаещ съм в тази сфера и не съм срещал грандиозни трудности както при циклите. Много са ми трудни гледах най - различни материали, играх си с конзолата, дебъгъра и какво ли не. Мога да ги назубря, но не ми е това идеята. Искам да схвана логиката, процеса и като си задам въпроса "защо" трябва да имам максимално коректен отговор. За това се обърщам към по опитните за обяснение от тяхната гледна точка и начинаещите, които имат подобно затруднение да споделят от къде черпят информация и какво не им е ясно .

 

P.S. понеже търсих във форума подобна тема, ако трябва нещо да се коригира ще го направя.

Тагове:
1
Общи приказки
quickben avatar quickben 966 Точки

Ако говориш за това каква е логиката и съответно поведението на различните видове цикли на мен лично ми бяха най-полезни подобни на тази диаграми както и дебъгера естествено.

1
antonio_rtodorov avatar antonio_rtodorov 74 Точки

Така е много разбираема. Имаш ли някакви подобни диаграми, които имат int.Parse? и моита логика е, че ако имаме for(int i = 0; i < n; i++) int i е числото от което почва броенето, n e ограничението или въведеното число от потребитела, а i++ e, че след всяко превъртане се увеличава с +1. Не мога да разбера случая, в който имаме int.Parse  в цикъла и извън него.

0
torosian88 avatar torosian88 6 Точки

Линкът към диаграмата ти вече не е активен. Извинявай , но би ли го постнал пак ? Усилено търся информация и бих искала да погледна и тази диаграма . Благодаря ти :) !

0
RoYaL avatar RoYaL Trainer 6849 Точки

Здравей,

В лекциите обикновено се говориз а теорията около циклите, т.е. най-важното, което трябва да знаеш, за да ги разбереш.

От темата ти обаче не разбирам какво точно не разбираш в тях, за да е по-лесно да ти обясним все пак.

Генерално циклите са повтаряемост, според определено условие. Т.е. докато условието е TRUE, нещата в тялото на цикъла ще се повтарят. Различните цикли приемат различни условия, които се оценяват до TRUE или FALSE в последствие.

Най-простият от тази гледна точка е цикилът while. Той е буквален и като дума. ДОКАТО. Например искаме всяка година да пробваме да влезем в дискотеката веднъж, но нямаме 18 години. ДОКАТО годините са по-малко от 18 НЕ ДАВАЙ на човека да влезе в дискотеката.

Императивно това би изглеждало - дефинираме годините на човека. Правим while цикъл - ДОКАТО годините са по-малко от 18. В тялото на цикъла му казваме - НЕ МОЖЕШ ДА ВЛЕЗЕШ В ДИСКОТЕКАТА. И му увеличаваме годините с една - защото той пораства след всяко пробване да влезе в дискотеката (тъй като казахме, че пробва веднъж всяка година).

int age = 14;

while (age < 18)

{

    Console.WriteLine("Cannot enter the club");

    age = age + 1; // расте

}

 

Важното за while цикъла е, че почти винаги нещо трябва да се случи с условието, което проверяваме, иначе ще имаме безкраен цикъл. Т.е. ако спрем времето в реалния живот, то няма да растем и ще си останем на 14, следователно никога няма да влезем в дискотеката. Евивалента на това би бил, ако не модифицирахме годините всеки път в цикъла, т.е. така спираме времето, човекът винаги е на 14 години и това докато не ни излезе грешка на конзолата ще принтира безброй много пъти "Cannot enter the club".

for цикълът е другият доста прост цикъл, аз лично първо за него разбрах. Той освен булевата проверка дали нещо е истинност, има още два параметъра. Първият - в който се декларира променлива, и последният - в който се случва нещо с тази променлива. Така наречените фази Initialize и Update. По средата се намира фазата, която проверява дали нещо е истинност. В повечето случаи тази инициализирана и ъпдейтвата променлива, дали не е стигнала някаква стойност.

Най-просто обяснено би било с цикъл фор от 1 до 5.

for (int i = 1; i <= 5; i = i + 1)

{

    Console.WriteLine(i);

}

Тук подобно на while цикъла имаме i <= 5. Когато 'i' стане 6, ще излезем от този цикъл ин яма да принтираме повече променливата 'i'. Initialize фазата ни позволва да декларираме локална променлива, а ъпдейт фазата ни позволява всеки път когато се изпълни тялото на цикъла т.е. в случая когато се изпринтира 'i' на конзолата, да увеличим локалната променлива с 1. Така на всяко принтиране ще я увеличим с 1 докато тя не стане 5, след като стане 5, е принтираме 5, ще се увеличи още веднъж и ще стане 6. После ще влезе в булевия тест и ще попита i <= 5. Вече това няма да е TRUE и цикълът ще спре.

foreach, който няма смисъл да разглеждаш в момента, докато не разбереш останалите два, работи върху колекции. Докато колекцията не е празна, минава през всеки един елемент от нея. Това по-натам :)

Т.е. всички видове цикли разчитат по някакъв начин вътре в себе си на условна конструкция. Останалото е повтаряемост.

Сега е моментът да кажеш, кое конкретно те затруднява, за да можем разбира се по-конкретно да ти отговорим.

11
antonio_rtodorov avatar antonio_rtodorov 74 Точки

Повдигам темата предимно да се разгледат подробно най-различните случай на циклите, от простите до сложните, защото мисля, че ще е от голяма ползва да се разгледат различни гледни точки и примери, които ще помогнат както на мен, а и на доста колеги, за които предполагам, че циклите ги затруднява. Искам да използвам примера ти за цикъла for (int i = 1; i <= 5; i = i + 1) искам да използвам Parse в него и каква е ролята на "i"? Съжалявам ако не си формулирам въпроса правилно, но най- вече ме интересуват как работят цикли, които да кажеме потребиталя въвежда повече от една команда в конзолата, на думи, числа и т.н.

P.S. Благодаря за примерите.

0
23/06/2015 17:22:17
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей Антонио,

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

1
antonio_rtodorov avatar antonio_rtodorov 74 Точки

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

0
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Моят въпрос съвсем точно отразява начина ми на учене - аз с лекота се ориентирам в написан код. Проблемът ми беше, че мразех лекции, докато не се убедих, че в лекциите в СофтУни се показват много интересни неща, подходи, най-важното да не очаквам да знам, да очаквам да открия. Честно казано не съм имала проблеми с цикли.

Случвало ми се е да не се ориентирам в задача с цикъл напълно, да открия при самата употреба че съм разбрала нещо частично - да се доориентирам от самия конкретен случай за начална и крайна точка на цикъла, в while loop - къде да си декларирам променливите - но всичко това са детайли, които се усвояват само с практика. Да пишеш код е въпрос на разнообразна практика - точно това е едно от най-хубавите неща в СофтУни - разнообразие от интелигентно написани, практически ориентирани упражнения, всяко от които остава като ценен, и ежедневно необходим опит.

Затова и те питах за примери, защото аз самата съм учила само от добрите примери :)

(намеквам, че съм учила преди СофтУни и задачи, които не ми донесоха знание - тези тук носят)

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

Ето всъщност две от изпитните задачи, включени в домашно: Half Sum и Sunglasses

В първата задача искам да прочета от конзолата 2 * N числа, затова ползвам цикъл, от 0 до 2 * N:

for (int i = 0; i < 2 * n; i++)

Във втората задача е по-интересно, по примерните очила съм се ориентирала каква част от редовете в картинката с очилата принципно са еднакви, намерила съм крайната стойност на цикъла. Това може и с while loop, като сложа условия в какви случаи да печата нещо различно от стандартните редове, каква да е крайната стойност, при която да спра while loop-a.

0
antonio_rtodorov avatar antonio_rtodorov 74 Точки

Мога ли да те помоля да ми обясниш този случай, какво всъщност представлява и се случва:

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

int[] number = new int [2 * n];

fo r(int i = 0; i < 2 * n; i++)

{

   numbers[i] = int.Parse(Console.ReadLine());

}

0
antonio_rtodorov avatar antonio_rtodorov 74 Точки

Можете ли да ми кажете, защо в този случай min и maxValue не ми принтира числата, които съм въвел?

https://gist.github.com/antoniortodorov/51ddb2091ed9652c029d

0
DHristoskov avatar DHristoskov 211 Точки

Грешката ти е в това, че задаваш като начална стойност за maxValue = double.MaxValue, и всяко въведено от потребителя число ще бъде по малко от максималната стойност за double.Или с други думи няма да се промени.

Правилният начин е да зададеш :

        double maxOfNum = double.MinValue;- тогава всяко въведено число ще бъде по голямо от първоначално зададеното, и всеки път когато имаш по-голямо от предишното ще го запазваш в променивата maxOfNum.

        double minOfNum = double.MаxValue; -  респективно всяко въведено ще бъде по - малко.

        double sumAll = 0;

 

Знам че не e добре да ползваш LINQ още от сега, защото с него ще ти бъде по - лесно и няма да научиш основни неща, но все пак ако ползваш System.LINQ, задачата ти се свежда до:

numberUs.Min();

numberUs.Max();

numberUs.Average()

П.С Виждам че в няколко поста се интересуваш от циклите и срещаш трудности с това да разбереш как работят.Отвори ми профила цъкни на Skype и ми прати request ще се опитам да ти обясня

1
23/06/2015 22:19:07
antonio_rtodorov avatar antonio_rtodorov 74 Точки

Значи maxValue по подразбиране на името му, не трябва ли да показва най-голямото число, въведено от потребитела? За съжаление информацията за skype е достъпна само за SoftUni. Ако искаш намериме във FB Antonio Todorov

0
DHristoskov avatar DHristoskov 211 Точки

Достъпна е можеш да ме добавиш по всяко време над снимката има икона на Skype и можеш да цъкнеш на нея.

А относно въпроса, когато кажеш, че една променлива е равна на double.MaxValue ти казваш че е равна на

-1.79769313486232E+308 - MinValue
1.79769313486232E+308 - MaxValue

все едно казваш double maxOfNum  =1.79769313486232E+308, няма как да подадеш по голямо число от това на double и следователно няма как да го промениш след като условието ти е да се промени ако има по - голямо от него число.

За това му задаваш MinValue  и всяко подадено число ще бъде по голямо от него, запазваш го при следващата проверка проверяваш новото число дали не е по- голямо и така.

Успех!!

0
23/06/2015 21:53:22
AleksandurSeferinkin avatar AleksandurSeferinkin 333 Точки

Да добавя и аз нещо за for циклите. :)

За пояснение: for, while, foreach като декларации ще ги наричам loops, а цикъл (в буквалния смисъл) ще наричам изпълнението на тялото.

For loop-a се състои от 4 части - инициализатор, условие, допълнителна операция и тяло.

for ( `инициализатор`; `условие`; `допълнителна операция` ) { тяло }

Тялото са процедурите, които ще се изпълняват на всеки цикъл. Затуй ги наричаме "цикли"/loops. Не е задължително да имаш тяло.

Инициализатора потготвя loop-a за изпълнение. Изпълнява се преди първия цикъл. Там дефинираш помощни променливи, с които пазиш състоянието му. В много случаи ние слагаме едно "int i = 0". Така дефинираме променлива с име "i", която ни служи като брояч. "i" идва от index, предполагам. Не е задължително да имаш инициализатор.

Условието се изпълнява преди всеки цикъл, за да се провери дали процедурите в тялото ще се изпълнят. Ако резултата от проверката/условието е false или друга стойност, която се интерпретира като false (примерно "undefined" в javascript или 0 във всички езици), тялото не се изпълнява и loop-a приключва. Това също не е задължително да го пишеш.

Допълнителната операция се изпълнява в края на всеки цикъл. То служи за улеснение и изчистване на тялото от "ненужни" процедури. Също не е задължително.

Ще ти дам пример за един loop, който работи чудесно.

int counter = 0;
for ( ; ; )
{
    Console.WriteLine(counter); // Правим нещо

    counter++; // Това би могло да бъде дефинирано в допълнителната операция на loop-a

    if ( counter == 5 )
    {
        break; // Приключваме loop-a
    }
}

// Горното е еквивалентно на
for (int counter = 0; counter <= 5; counter++)
{
    Console.WriteLine(counter);
}

//Може да правим и нещо от сорта на
for (int counter = 0, otherCounter = 1; counter < 5 && otherCounter < 5; counter++, otherCounter += 2)
{
    Console.WriteLine(counter);
    Console.WriteLine(otherCounter);
}

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