Naredba „while“
U jeziku C++ odgovarajuća upravljačka struktura koja vrši ponavljanje naredbi sve dok je
neki uslov ispunjen predstavljena je naredbom „w h i l e“. Ona se koristi u sljedećem
obliku:
Code:
while (neki_uslov)
{
naredba_1;
naredba_2;
naredba_3
...
}
Smisao naredbe „while“ je u sljedećem: uslov (izraz) u zagradi se izračunava, i ako je on
tačan (preciznije, različit od 0), izvršavaju se naredbe u bloku navedenom unutar vitičastih
zagrada neposredno iza naredbe while, slično kao i kod naredbe if. Nakon što se čitav blok
izvrši, uslov se ponovno provjerava, i ako je on i dalje tačan, blok naredbi se ponovo
izvršava, itd. Dakle, blok naredbi se izvršava sve dok je navedeni uslov tačan. Tek kada
uslov postane netačan, program se nastavlja izvršavati od sljedeće naredbe iza while-bloka.
U slučaju kada se blok sastoji od samo jedne naredbe, vitičaste zagrade koje određuju
pripadni blok se ne moraju pisati.
Kao ilustraciju naredbe while napišimo sekvencu naredbi koja će ispisivati sve brojeve od 1
do 100 (svaku u novi red):
Code:
int i=1;
while (i<= 100)
{cout<<i<<endl;
i++;
}
Ili:
int i =1;
while (i<=100)
cout<<i++<<endl;
Kako se kod naredbe while blok izvršava sve dok je naznačeni uslov ispunjen, slijedi da bi
petlja imala smisla, mora se nalaziti, makar negdje unutar petlje, neka od naredbi koja će
promijeniti vrijednost neke od varijabli koje se javljaju unutar uslova. U suprotnom, ako je
uslov na početku bio tačan, takav će sigurno i ostati, pa se petlja nikad neće završiti. U
ekstremnijim slučajevima, čak i samo uslov može mijenjati vlastite varijable, kao u
slijedećem primjeru, koja radi što i prethodna dva:
Code:
int i=0;
while (++i<=100)
cout<<i<< endl;
Sljedeći program omogućava korisniku da unosi nenegativne brojeve i pamti ukupnu sumu
unesenih brojeva. Kada se unese negativni broj, program ispisuje izračunatu sumu (ne
računajući i taj negativni broj) i završava sa radom. Ideja je u tome da uvedemo neku
varijablu, nazovimo je suma čija će početna vrijednost biti nula. Svaki put kada unesemo
novi broj, njega samo nadodajemo na trenutnu vrijednost sume. Postupak se ponavlja sve
dok su uneseni brojevi nenegativni:
Code:
#include <iostream>
using namespace std;
void main (void)
{
int suma =0; //Suma unesenih brojeva
int broj; //Broj unijet od strane korisnika
cout<<"Unesi brojeve koji ce se sabirati ";
cout<<" negativan broj oznacava prekid.\n ";
cout<<"Unesi broj ";
cin>>broj;
while (broj>=0)
{
suma+=broj;
cout<< "Unesi broj: ";
cin>> broj;
}
cout<< "\nSuma unesenih brojeva: "<<suma;
system ("PAUSE");
}
Primjećujete da smo ovdje istu naredbu za unos morali pisati 2 puta, jednom ispred petlje,
a drugi put unutar petlje. Razlog je u činjenici da se uslov kod naredbe while ispituje na
početku petlje, tako da odmah na početku moramo znati kakav je broj da bismo znali da li
petlja treba uopće da se izvrši ili ne. Taj problem možemo riješiti sljedećim, funkcionalno
ekvivalentnim, ali logički elegantnijm programom:
Code:
#include <iostream>
using namespace std;
void main (void)
{
int suma=0, broj=0;
cout<<"Unesi brojeve koji ce se sabirati ";
cout<<" negativan broj oznacava prekid.\n ";
while (broj>=0)
{
cout<<"Unesi broj:";
cin>>broj;
if (broj>=0)
suma+=broj;
}
cout<<"\nSuma unesenih brojeva je: "<<suma;
system ("PAUSE");
}
Primjećujete da smo ovdje, na prvi pogled nepotrebno, inicijalizirali i varijablu broj. Ovo je
neophodno iz sljedećeg razloga: ako varijablu broj ne inicijaliziramo, njena početna
vrijednost će biti slučajna (nepredvidiva).
Česta greška prilikom korištenja naredbe while je stavljanje tačka-zareza iza naredbe
while. Najgore je što u tom slučaju kompajler neće javiti grešku, nego će program raditi, ali
neispravno, jer će računar smatrati da je tijelo petlje prazno, a naredbe koje smo željeli da
budu u petlji izvršit će se izvan nje! Vjerojatno će se program „zaglaviti u mrtvoj petlji, jer
ako je uslov bio ispunjen na početku, takav će ostati zauvijek, jer su se naredbe koje
mijenjaju vrijednost varijabli koje učestvuju u izrazu najvjerojatnije nalazile unutar bloka,
koji nije shvaćen kao pripadni blok while petlje.
Zašto kompjaler ne otkriva grešku s tačka-zarezom?
Formalno gledajući, ovo nisu jezičke nego logičke greške: petlje bez tijela nisu zabranjene
u jeziku C++ i nekad čak imaju i smisla.
[Ovu poruku je menjao virtualVoid dana 16.11.2007. u 09:38 GMT+1]
...