Cyklus while
Cyklus while má rovnakú úlohu ako cyklus for. Cyklus for už ako tak poznáte. Narozdiel od cyklu for má ale iný zápis. Ukážme si najprv základnú deklaráciu cyklu while.
Základná deklarácia:
while(podmienka) telo
Najprv, než prebehne cyklus, otestuje sa podmienka. Ak test podmienky vráti true, tak sa cyklus vykoná. Ak vráti false, tak sa nevykoná. Ešte poznámka, ak sa skončí vykonanie tela cyklu, tak opäť sa testuje podmienka cyklu. Ukážeme si názorný príklad.
1. príklad: Vyskúšanie si cyklus while
#include <iostream> using namespace std; int main() { string name; cout << "Napis svoje obcianske meno!\n"; cin >> name; if (name.empty()) { cout << "Ale daco musis napisat no, nestvi ma!"; return 0; } size_t i = 0; while (i < name.size()) { cout << name[i] << ": " << static_cast<int>(name[i]) << "\n"; // tu pretypujeme a vypíšeme na obrazovku i++; } return 0; }
Priebeh programu:
Napis svoje obcianske meno! Eduard E: 69 d: 100 u: 117 a: 97 r: 114 d: 100
Rozbor programu: Program má za úlohu, zistiť ASCII kód písmen z vášho mena. Program začína hláškou a vstupom od užívateľa. Následne začne prvý test cyklu. Podmienka i < name.size() znamená, že test bude úspešný, pokým premenná i je menšia ako dĺžka reťazca. V tele cyklu pomocou static_cast<int> pretypujeme premennú typu char (znak) na typ int (celé číslo). O pretypovaní premenných v C++ bude ešte niekedy v budúcností článok. Vo výsledku dostaneme pre každé jednotlivé písmeno zadaného reťazca jeho ASCII číselnú podobu.
Cyklus while verzus for
Aký je rozdiel medzi cyklom for a while? V podstate žiadny, len zápis je iný. Pozrime si deklarácie oboch cyklov.
Cyklus for:
for (inicializačný výraz; testovací výraz; zvýšenie/zníženie hodnoty inicializačného výrazu) { príkazy }
A cyklus while:
inicializačný výraz; while (testovací výraz) { príkazy zvýšenie/zníženie hodnoty inicilizačného výrazu; }
Ak si odmyslíme inicializáciu a zmeny hodnoty inicializácie, tak máme:
for (;testovací výraz;) telo while (testovací výraz) telo
Vidíte, sú si ekvivalentné tieto cykly.
Otázkou však je, aká je základná kostra oboch cyklov? Je vôbec nutné mať testovací výraz, aby mi prešla kompilácia?
Skúsime na príkladoch.
2. príklad: Kostra cyklu for
#include <iostream> using namespace std; int main() { for(;;) { cout << "Som paaaan programator!\n"; } return 0; }
Priebeh programu: Nechcite vidieť ten veľký report. Dalo by povedať, že by bol nekonečný, ak násilne neukončíme program. Otázka na zamyslenie, zastaví sa vôbec niekedy program bez pričinenia? Naštudujte si problém zastavenia (halting problem) a zistíte, že tento nekonečný cyklus nikdy neskončí.
Rozbor programu: Takže už vieme, že sme stvorili nekonečný cyklus. Zároveň je deklarácia for(;;) najzákladnejšia.
Fajn, predpokladajme, že i cyklu while nedáme testovací výraz. Prejde kompilácia?
3. príklad: Kostra cyklu while
#include <iostream> using namespace std; int main() { while() { cout << "Som paaaan programator!\n"; } return 0; }
Priebeh programu:
…/momo.cpp||In function 'int main()':| …/momo.cpp|5|error: expected primary-expression before ')' token| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Rozbor programu:
Ajajaj, ani nám to neskompilovalo. Ako to? V cykle while je povinný testovací výraz. Na vytvorenie nekonečného cyklu postačí, keď dáme napríklad 1. Keďže hodnotu 1 nebudeme meniť, stále bude hodnota 1 a cyklus sa tak nikdy neskončí.
4. príklad:
#include <iostream> using namespace std; int main() { while(1) { cout << "Som paaaan programator!\n"; } return 0; }
Priebeh makra: Náš nekonečný cyklus funguje.