Naredbe ponavljanja

3. Petlja kod koje ponavljanje ovisi o uvjetu - while

Postoje problemi kod kojih ne možemo znati točan broj ponavljanja. Primjerice, želimo li izračunati zbroj znamenki nekog broja, a ne znamo koliko ima znamenki, moramo pronaći drugi način rješavanja tog problema.
Ili, ako želimo da korisnik unosi podatke (npr. o učenicima) sve dok to njemu odgovara. Ne znamo koliko će podataka unositi...
Ovakvih primjera ima još jako puno. Rješavamo ih petljom kod kojih ponavljanje ovisi o uvjetu.

Jedna od petlji s provjerom uvjeta je while petlja.

Njezin je opći oblik:

Python C/C++
while uvjet:
    naredba
while (uvjet)
    naredba;

Naredba (blok naredbi) unutar ove petlje ponavlja se sve dok je uvjet istinit. Ukoliko se treba ponavljati više od jedne naredbe, one se moraju staviti u blok.

Primjer 1:

Što će ispisati sljedeći dio programa ako je k cjelobrojna varijable?

Python C/C++
k = 3
while k <= 20:
    k = k + 3
print(k)
k = 3
while (k <= 20)
    k = k + 3;
printf("%d", k);

Na zaslon će se ispisati broj 21.

Kako to?

  • Na početku se varijabli k pridruži vrijednost 3.
  • Naredba while sada provjerava je li vrijednost varijable k manja ili jednaka od 20. Budući da je ta vrijednost jednaka 3, uvjet je ispunjen i vrijednost varijable k se uvećava za 3 (k=3+3=6).
  • Sada se izvršavanje programa vraća na ispitivanje uvjeta.
  • Šest je manje od 20 i uvjet je još uvijek ispunjen. To znači da će se vrijednost varijable k ponovo uvećati za 3 => k=6+3=9.
  • Devet je manji od 20 => k se uvećava za 3 => k=9+3=12
  • 12<20 => k=12+3=15
  • 15<20 => k=15+3=18
  • 18<20 => k=18+3=21
  • 21 nije manji ili jednak 20. Uvjet nije ispunjen i program nastavlja sa izvođenjem s prvom naredbom iza naredbe ponavljanja. To je funkcija za ispis pa se na zaslon ispisuje 21.
Primjer 2:

Što ako prethodni program zapišemo ovako:

Python C/C++
k = 3
while k <= 20:
    k = k + 3
    print(k)
k = 3
while (k <= 20){
    k = k + 3;
    printf("%d", k);}

Kako su sada naredbe k = k+3 i  funkcija za ispis unutar bloka, obje su dio naredbe za ponavljanje. To znači da će se sada nakon svakog uvećavanja vrijednosti varijable k, ta vrijednost i ispisati na zaslon.

Tako će se nakon ovog dijela programa na zaslon ispisati vrijednosti 6, 9, 12, 15, 18 i 21.
Početna vrijednost varijable k (k=3) se neće ispisati jer se naredba za izlaz nalazi iza naredbe za promjenu vrijednosti varijable.

Kada bi se funkcija za ispis nalazila prije naredbe za promjenu vrijednosti (k:=k+3), na zaslon bi se ispisivale vrijednosti: 3, 6, 9, 12, 15, 18.

Primjer 3:

Što će ispisati sljedeći dio programa?

Python C/C++
broj = int(input())
br = 0

while broj >0:
    br = br + 1
    broj = broj // 10

print (br)
scanf("%d", &broj);
br = 0
;
while (broj >0){
    br = br + 1;
    broj = broj / 10;}

printf ("%d", br);


Ovo je dio programa koji broji koliko uneseni broj ima znamenaka.

Provjerite je li to istina na nekom primjeru. Primjerice, neka je vrijednost varijable broj jednaka 3271. Koja će se vrijednost ispisati na zaslon?

Prilikom primjene uvjetnih petlji potrebno je voditi računa o tome da se izbjegne beskonačna petlja. Potrebno je pronaći uvjet koji će sigurno postati lažan u nekom trenutku.

Primjer 4:

Što će ispisati sljedeći dio programa?

Python C/C++
broj = int(input())
br = 0

while broj != 0:
    br = br + 1
broj = broj // 10

print (br)
scanf("%d", &broj);
br = 0
;
while (broj != 0)
    br = br + 1;
broj = broj / 10;

printf ("%d", br);


Ovo je klasičan primjer beskonačne petlje jer se u sklopu while petlje nalazi samo naredba br = br + 1, dok je naredba koja mijenja vrijednost varijable broj izvan bloka naredbi koje se ponavljaju. To znači da će se vrijednost varijable br povećavati, no vrijednost varijable broj će ostajati nepromijenjena (nikada neće postati nula) i uvjet nikada neće postati lažan!

Zadatak:

Napravite  program koji će za uneseni broj provjeriti je li potpuno paran. (Pomoć: Broj je potpuno paran ako mu je svaka znamenka paran broj).