среда, 20. мај 2020.

CIKLIČNE ALGORITAMSKE STRUKTURE (3)



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.








Нема коментара:

Постави коментар