USLOVNI CIKLUSI
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, sve dok je odgovor na pitanje 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.
Da bi uslov koji je u nekoliko iteracija bio
zadovoljen, odjednom 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 seodgovarajući momenat, da bi se ciklus završio. Ilustracija bi
bila klima uređaj koji se uključuje kada spoljašna temperatura pređe zadatu
vrednost, a isključuje ako ne pređe.
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. Takođe, pošto ćemo učiti Python, naši zadaci biće sa
preduslovom.
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.
Primer 1
Unose se celi brojevi dok
se ne unese 0. Izračunati i ispisati zbir recipročnih vrednosti unetih brojeva. Npr. za unete
brojeve 5, 3 i 9, dobijamo zbir 1/5 + 1/3 + 1/9.
Na početku programa unosimo
prvi broj. Ciklus kreće ako broj nije nula. Recipročnu vrednost broja dodajemo
na sumu i unosimo sledeći broj. Opet se ispituje uslov i ako je ispunjen
izvršava se telo ciklusa. Kada unesemo nulu, uslov više nije ispunjen i iz
ciklusa se izlazi.
Primer 2
Nacrtati algoritamsku šemu
za nalaženje aritmetičke sredine cifara prirodnog broja N.
Na početku programa
postavljamo dve promenljive na nulu. S koja će nam predstavljati zbir cifara i
promenljivu i koja će predstavljati broj cifara. Uslov za izvršavanje ciklusa
je da je broj N veći ili jednak od 1. Kada N postane nula, iz ciklusa se
izlazi.
U telu ciklusa najpre tražimo
ostatak deljenja broja N sa 10. Tako dobijamo cifru jedinica. Nju dodajemo na
sumu cifara. Zatim broj N celobrojno delimo sa 10, da bi eliminisali cifru
jedinica jer smo je već sabrali.
Promenljivu i tj. broj cifara
uvećavamo za 1 i vraćamo se u ciklus. Sve se izvršava sve dok nam ne ostane
jedna cifra, i kada nju podelimo sa 10 dobijamo količnik nula. To je znak da se
iz ciklusa izlazi. Tada računamo prosek kao količnik zbira cifara i broja
cifara.
Test primer:
Unosimo broj N-3678
I=0
S=0
Prva iteracija
N>=1 da
CIF=N%10 tj CIF=8
S=S+CIF tj S=0+CIF tj S=8
N=N//10 tj N=3678 //
10 tj N=367
I=i+1 tj i=0+1 tj i=1
Druga iteracija
Trenutna vrednost N je 367
N>=1 da
CIF=N%10 tj CIF=7
S=S+CIF tj S=8+CIF tj
S=8+7=15
N=N//10 tj N=367 //
10 tj N=36
I=i+1 tj i=1+1 tj i=2
Treća iteracija
Trenutna vrednost N je 36
N>=1 da
CIF=N%10 tj CIF=6
S=S+CIF tj S=15+CIF tj
S=15+6=21
N=N//10 tj N=36 // 10
tj N=3
I=i+1 tj i=2+1 tj i=3
Četvrta iteracija
Trenutna vrednost N je 3
N>=1 da
CIF=N%10 tj CIF=3
S=S+CIF tj S=21+CIF tj
S=21+3=24
N=N//10 tj N=3 // 10
tj N=0
I=i+1 tj i=3+1 tj i=4
Peta iteracija
Trenutna vrednost N je 0
N>=1 ne – iz ciklusa se
izlazi
Prosek = S/i tj Prosek=24/4 tj. Prosek=6
Zadaci za vežbu:
1. Unosi se niz
proizvoljnih brojeva. Za kraj unosa uneti nulu ( kao u primeru 1 ). Izračunati
posebno zbir pozitivnih ZP i zbir negativnih brojeva ZN.
2. Ispisati sve delioce
unetog celog pozitivnog broja X.
Uputstvo: Proveriti da li je
uneti celi pozitivan broj prost, tj proveriti da li je deljiv prvo sa 2, pa sa
3 itd. Proveru prekinuti onog trenutka
kada se naiđe na delilac.
Нема коментара:
Постави коментар