C програмиране 13; Цикли
В случай на програмиране, в много случаи е необходимо да повторите дадена дейност (инструкция) няколко пъти. Те са често срещани и в реалния живот.

- Вмъкнете 5 празни реда в таблицата.
- Направете 3 сандвича
- Хвърлете 3 зара (хвърляме веднъж, но теглим 3 числа)
- Запишете го 100 пъти, за да не забравя домашното си
Тези повтарящи се дейности са еднакви, като предварително знаят колко пъти трябва да бъдат извършени. Разбира се, случва се и да трябва да правите нещо толкова дълго, колкото можете.
- Обелете 2 кг ябълки
- Измий го
- Направете колкото се може повече сандвичи, докато не ви свършат студените разфасовки
Тези дейности също трябва да се повторят няколко пъти, но не знам колко пъти. Може да има по-малки ябълки, повече от които трябва да се белят, но ако са по-големи, 2 кг ще излязат от по-малко парчета. Мия чиниите, стига да има гърне. Правя сандвичите, стига да има какво да облека.
Тези принципи се отнасят и за програмирането. Според тях могат да се разграничат 3 различни вида цикли:
Според принципа на действие първият е различен от другите. В този случай знаем предварително колко пъти искаме да повторим задачите си, докато в последните два случая броят на повторенията е условен. Това всъщност прави картината малко по-нюансирана, защото Java е много гъвкава със своите цикли, но принципите на тях.
Инкрементален цикъл
Нека започнем с първия, инкременталният цикъл. Този тип цикъл изглежда така:
Ключовата дума for въвежда цикъла. След това идва главата на цикъла, където могат да се зададат 3 неща:
- началната стойност на променливата на цикъла, която ще се използва
- състоянието на бягане, т.е. кога да започне друга „обиколка“
- увеличете променливата на цикъла
Хубавото (или просто грозно, но това е въпрос на гледна точка) е, че нито едно от тези 3 неща не е задължително. Всяко или дори всички могат да бъдат пропуснати, като единственото ограничение е, че трите части се разделят; трябва да се запазят всички знаци:
Вярно е, че това обръща малко задачата и включва неизвестна досега инструкция, но виждаме, че е възможно.
Е, цикълът for се използва по подразбиране за увеличаване на променлива един по един, за да изпълнява дейност, докато условието, което посочим, позволява. Това ще бъде по-разбираемо чрез примери:
Бройте от 1 до 50 и напишете числата на екрана:
Ако погледнем главата на цикъла, можем да видим следното:
- променливата на цикъла се стартира от 1
- отиваме, докато достигнем 50
- променливата на цикъла се увеличава едно по едно
Разбира се, можех да напиша това така:
Преминавам от 0 до 49, но винаги изписвам номер едно по-голям.
Начертайте 10 произволни числа от интервала [1; 50] и ги запишете:
Горната глава на цикъла е много силна задача от типа и можете да видите основно правило в нея: Стартирайте i от 0 и отидете, докато тя е по-малка от броя, който искате да изпълните цикъла:
Напишете 20 четни числа, започвайки от 2:
Използвам толкова много трикове тук, че броим от 1 до 20 (това е колко числа ми трябват), но умножавайки ги по 2, винаги получавам четно число. Разбира се, ако погледна правилото, когато стартирам цикъла от 0 и спра на limit-1, бих могъл да напиша по същия начин:
И ако започнете от 1, имате нужда от 20 коефициента?
Изваждането на 1 от двойките дава нечетни. Или започвайки от 0:
Но само за да видим колко гъвкав е цикълът for, нека разгледаме друго решение за двойки:
Добре, изневерих малко. Знам, че 40 ще бъде последният, но не умножавам, но сега увеличавам променливата на цикъла с 2 вместо с 1. Ето един добър пример за оператора + =.
С една дума, като сто, цикълът for е гъвкав и ефективен инструмент, ако предварително знаете колко пъти искам да направя нещо. Но вече е ясно защо всичко е толкова разнообразно, защото мога да дам толкова много решения на един и същ проблем и всеки един решава перфектно задачата. Между тях има толкова много нюанси, че изобщо не е нужно да се справяте с това на ниво гимназия, въпросът е: дайте правилното решение.
Преден тестов цикъл - докато
Обикновено се използва тестовият цикъл отпред, когато не знаем предварително колко пъти трябва да се извърши повтарящата се дейност. Няма проблем, ако трябва да нарисувате 10 числа от интервал. Това е типова задача, съответстваща на цикъла for. Но какво, ако задачата е да се изтеглят 10 нечетни числа от даден интервал? Тогава, ако случайно получите четно число, то трябва да бъде игнорирано. Нека първо видим общата форма на цикъл while:
Както можете да видите, тук има и заглавие на цикъл, което съдържа условието за изпълнение. От оперативна гледна точка това означава, че цикълът работи (изпълнява ядрото на цикъла), стига условието да е вярно. Разбира се, трябва да се внимава да се гарантира, че условието е изпълнено веднъж, или да се прекъсне изпълнението в ядрото на цикъла, така че да не се сблъскаме с безкраен цикъл. Това означава, че той никога не може да спре, защото или не е спрян, или условието за изпълнение никога не може да бъде фалшиво. Най-простият случаен цикъл: