17,18 Algoritmi sa cikličnom strukturom (petlje / ciklusi / iteracije)
Ciklična algoritamska struktura je ona kod koje se koraci mogu izvršiti više puta. Slično kao kod razgranate strukture, vrlo lako se može desiti da ne znamo koje će vrednosti korisnik uneti, ili čak koliko će ih biti.
Ogroman broj zadataka koje rešavamo u programiranju zahteva da se podatak za podatkom obrađuje na isti način. To sa stanovišta algoritma znači da se jedni isti koraci ponavljaju više puta. Kao što smo se upoznali sa različitim tipovima grananja, sada ćemo se upoznati sa nekoliko tipova ciklusa. Svim koracima kojima definišemo cikluse zajedničko je to što imaju "strelicu unazad". Na taj način "vraćaju" izvršavanje algoritma/programa nekoliko koraka unazad čime smo napravili ciklus ili petlju.
Svako ponavljanje ciklusa, naziva se iteracija. Koraci unutar ciklusa su uvek isti, ali vrednosti sa kojima se radi se menjaju. To je u stvari i poenta rada sa ciklusima.
Ciklusi se mogu kombinovati sa svim algoritamskim strkturama. To znači da možemo imati grananja unutar ciklusa ili cikluse unutar grananja.
Kako ciklus funkcioniše?
Sećate se razgranatih algoritama i koraka u kome smo "račvali" izvršenje programa na dve grane? E, sad zamislite da se izvršenje programa ne deli na dve mogućnosti, već se vraća unazad. Korak koji definiše ciklus, takođe sadrži izraz logičkog tipa, odnosno uslov. Pitanje koje se postavlja više nije "ako je (tačno)...", već "dok je (tačno), ponavljaj to-i-to". Sve što smo ranije pisali za uslove u razgranatim algoritmima važi i ovde. To znači da možemo zadati i kompleksne uslove.
Ovo su takozvani uslovni ciklusi.
Dakle, da zaključimo: sve dok je odgovor na pitalicu unutar koraka ciklusa, "da", ciklus će se ponavljati. To znači da do kraja ciklusa dolazimo kada uslov više nije zadovoljen. Tada se nastavlja sa normalnim izvršavanjem koraka koji dolaze posle ciklusa.
Ovo nas dovodi do jedne važne stvari. Da bi uslov koji je u nekoliko iteracija bio zadovoljen, odjedanput prestao da važi, mora doći do neke promene. Nosioci vrednosti u našim algoritmima su promenljive. Kroz ciklus, ta vrednost može (i treba) da se menja - posebno onih promenljivih koje učestvuju u uslovu. Praktično, čeka se "kap koja je prelila čašu", da bi se ciklus završio.
Mesto provere uslova
Uslov može da se proverava na početku ili na kraju ciklusa. Tako razlikujemo ciklus sa preduslovom i ciklus sa postuslovom. Možda vam se čini da je svejedno da li proveravamo uslov pre ili posle "tela" ciklusa, ali postoji jedna jako bitna razlika.
Kod ciklusa sa preduslovom, može da se desi da uslov već na početku ne bude zadovoljen. Tako je moguće da se ciklus ne izvrši ni jednom. Sa druge strane, kod ciklusa sa postuslovom, ciklus mora da se izvrši jednom, da bi uopšte došlo do provere uslova i odluke da li će se ciklus ponavljati.
U praksi ćete birati ciklus koji vam više odgovara za trenutni problem, ali pošto se isti zadaci vrlo često mogu rešiti i jednom i drugom metodom, programeri se najčešće odlučuju za cikluse sa preduslovom.
Objašnjenje uslovnih ciklusa
Ciklus sa preduslovom

Dakle, ovako izgleda ciklus koji se može izvršiti jednom, ni jednom ili više puta. Primećujete da se uslov proverava na početku. Ako je zadovoljen (vrednost true), izvršiće se iteracija ciklusa.
To znači da ako uslov nije zadovoljen več pri prvoj proveri, ceo ciklus se preskače - neće se izvršiti ni jedanput. Ovaj uslov se proverava svaki put na "ulasku" u iteraciju i sve dok je zadovoljen, naredbe ciklusa će se ponavljati.
Ciklus sa postuslovom

Ovakav ciklus će se izvršiti bar jednom ili više puta. Uslov se sada nalazi na kraju ciklusa, kao "ventil" koji određuje da li će izvršavanje ciklusa "skočiti" nazad na telo ciklusa, ili će se ciklus završiti.
Zbog toga se čak iako uslov nije zadovoljen pre ciklusa, telo ciklusa izvrši bar jednom, pre nego što dođe do provere.
Brojački ciklus
Kada u algoritmu računar stigne do uslovnog ciklusa, uglavnom je to situacija kada ne može da se zna koliko će se puta ciklus izvršiti. Dakle, ciklus će se "vrteti" sve dok je uslov zadovoljen, nepoznat broj puta.
Međutim, često se u programu zna (ili se može izračunati) broj ponavljanja ciklusa. To su npr. situacije kada u programu postoji informacija o broju elemenata niza ili se od korisnika unapred traži da unese maksimalan broj ponavljanja. Tada je mnogo optimalnije koristiti brojački ciklus.
Ovaj ciklus funkcioniše na pricipu brojačke promenljive, koja ima definisanu početnu i krajnju vrednost. U jednom koraku se objedinjuje postavljanje početne vrednosti, provera da li je dostignuta krajnja vrednost i računanje nove vrednosti brojača.
(slika ovog algoritma će biti postavljena kasnije)
Brojački ciklus se u različitim programskim jezicima optimizuje na različite načine, ali gotovo uvek je njegovo izvršavanje brže od običnog uslovnog ciklusa.
Mrtva petlja
Mrtva petlja je ciklus koji ne može da se zaustavi. Zove se još i beskonačni ciklus. To je situacija kada je uslov za ponavljanje ciklusa uvek zadovoljen, tako da ciklus nikada ne dođe do svog kraja.
Ovo je u 99% slučajeva rezultat greške programera. Moguće je da smo pogrešili u uslovu tako da on uvek vraća isti rezultat, ili u samom ciklusu ako zaboravimo da promenimo vrednosti promenljivih koje bi dovele do kraja ciklusa, ili to uradimo pogrešno.
Postoje i retke situacije kada želimo da napravimo beskonačni ciklus. Na primer, zatrebaće nam ako pravimo animaciju koja treba neprestano da se "vrti". Takođe može da se desi i da je uslov za izlazak iz ciklusa toliko kompleksan, da je programeru lakše da na više mesta unutar ciklusa zada nasilni prekid. Međutim, ovo se ne smatra "dobrom programerskom praksom" i u Viziji nije moguće.
Ovo je prvi put da pravimo takve algoritme koji mogu da "zaglave" računar! Budite jako, jako oprezni.
Primeri beskonačnih ciklusa
Namerno-beskonačan ciklus

Ako želimo da napravimo beskonačan ciklus, najjednostavniji način je uslovni ciklus sa uslovom true. To je svakako uslov koji je uvek ispunjen.