Petlja for se najčešće rabi ako se dijelovi programa (blokovi naredbi) ponavljaju unaprijed poznati broj puta.
for (pocetno_stanje; uvjet; prirast)
{
blok naredbi
}
naredba iza bloka
-
Svaka for petlja ima svoju kontrolnu varijablu kojoj se vrijednost svakim prolaskom kroz petlju mijenja ovisno o vrijednosti prirasta. Kontrolnu varijablu petlje potrebno je prije ulaska u petlju deklarirati.
-
Kao što je u prikazu osnovnog oblika for petlje vidljivo, prilikom zadavanja petlje najprije treba zadati početnu vrijednost kontrolne varijable petlje (pocetno_stanje).
-
Slijedi uvjet. Rezultat uvjeta mora biti logički podatak (tip bool). Blok naredbi koji se nalazi u petlji izvršava se sve dok je vrijednost uvjeta jednaka logičkoj istini (true, 1). Kad vrijednost uvjeta postane neistina (false, 0), petlja se prekida.
-
Treći podatak je prirast. To je iznos za koji se mijenja vrijednost kontrolne varijable petlje.
Vrijednosti početnog stanja, uvjeta i prirasta odvajaju se znakom točka‑zarez (;). Iza naredbe for ne stavlja se znak točka‑zarez (;). Ako se zabunom ipak stavi, neće se izvršiti blok naredbi u petlji.
Blok naredbi koji se ponavlja zadani broj puta označava se parom otvorena‑zatvorena vitičasta zagrada ({}).
U sljedećem primjeru je prikazan tijek izvršavanja petlje for.
|
Zadatak:
|
Potrebno je ispisati brojeve od 1 do 20. Ispis neka bude oblika:
Ispis brojeva od 1 do 20:
1 2 3 4 5 6 7 8 9 ......20
|
Potrebno je:
-
Deklarirati kontrolnu varijablu petlje i zadati joj početnu vrijednost: int brojac=1.
-
Postaviti uvjet (vrijednost varijable brojac mora biti manja od 20): brojac<=20.
-
Zadati vrijednost prirasta za koju se mijenja vrijednost kontrolne varijable petlje (u ovome slučaju za 1): brojac++.
-
Naredba koja se izvodi konačan broj puta je ispis trenutačnih vrijednosti varijable brojac.
Rješenje:
|
#include<iostream>
using namespace std;
int main()
{
int brojac;
cout<<"Ispis brojeva od 1 do 20:"<<endl;
for (brojac=1;brojac<=20;brojac++)
{
cout<<brojac<<" ";
}
cout<<endl;
return 0;
}
|
Rezultat (zbog preglednosti ispisa nakon svakog broja ispisuje se jedno prazno mjesto):
|
Ispis brojeva od 1 do 20:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
Varijabla brojac na početku ima vrijednost 1. Prvo se provjerava uvjet. Uvjet je ispunjen jer je istina da je (brojac<=20) zbog toga što je brojac trenutno jednak 1 pa izraz glasi (1<=20). Kako je uvjet ispunjen izvršavaju se narede bloka, tj. ispisuje se trenutačna vrijednost varijable brojac (a to je 1).
Zatim se djelovanjem unarnog operatora inkrement (brojac++) mijenja sadržaj varijable brojac za vrijednost prirasta (povećava se za 1). Sada je vrijednost varijable brojac jednaka 2.
Izvođenje se vraća na početak petlje, provjerava se uvjet (brojac<=20). Uvjet je ispunjen (jer je vrijednost brojac jednaka 2), ispisuje se trenutačna vrijednost varijable brojac (a to je 2), mijenja se sadržaj varijable brojac za vrijednost prirasta i tako redom.
Postupak se ponavlja do trenutka ispisa broja 20. Zatim se ponovo mijenja sadržaj varijable brojac i ona poprima vrijednost 21. Uvjet (brojac<=20) više nije ispunjen jer je vrijednost varijable brojac jednaka 21 i program kreće s izvršenjem prve naredbe iza petlje for. |
Sljedeći zadatak prikazuje primjer prirasta koji ima vrijednost različitu od 1.
|
Zadatak:
|
Treba ispisati parne brojeve u rasponu od 50 do 100. Ispis neka bude oblika:
Parni brojevi iz intervala od 50 do 100 su:
50 52 54 56......... 98 100
|
Prirast je 2 (jer je razlika dvaju susjednih parnih brojeva 2). Može se zapisati: brojac=brojac+2 ili brojac+=2
Rješenje:
|
#include<iostream>
using namespace std;
int main()
{
int brojac;
cout<<"Parni brojevi iz intervala od 50 do 100 su:"<<endl;
for (brojac=50;brojac<=100;brojac+=2)
{
cout<<brojac<<" ";
}
cout<<endl;
return 0;
}
|
Rezultat (zbog preglednosti ispisa nakon svakog broja ispisuje se jedno prazno mjesto):
|
Parni brojevi iz intervala od 50 do 100 su:
50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100
|
|
Osim pozitivnih vrijednosti prirasta moguće su i negativne vrijednosti prirasta. U tom se slučaju tijekom odvijanja petlje vrijednost kontrolne varijable smanjuje, stoga treba biti oprezan prilikom zadavanja početne vrijednosti kontrolne varijable petlje i uvjeta.
|
Zadatak:
|
Treba ispisati parne brojeve u rasponu od 100 do 50. Ispis neka bude oblika:
Parni brojevi iz intervala od 100 do 50 su:
100 98 96 94 .......... 52 50
|
Razlika u odnosu na prethodni zadatak je jedino u naredbovnom retku u kome je zadana petlja for.
Rješenje:
|
for (brojac=100;brojac>=50;brojac-=2)
|
Rezultat (zbog preglednosti ispisa nakon svakog broja ispisuje se jedno prazno mjesto):
|
Parni brojevi iz intervala od 100 do 50 su:
100 98 96 94 92 90 88 86 84 82 80 78 76 74 72 70 68 66 64 62 60 58 56 54 52 50
|
|
U nastavku su primjeri različitih mogućnosti uporabe petlje pri rješavanju zadataka.
|
Zadatak:
|
Potrebno je zbrojiti prvih N prirodnih brojeva. Ispis neka bude oblika:
Upisi broj do kojeg zelis zbrajati:
Zbroj prvih ... prirodnih brojeva je ....
|
-
Prije ulaska u petlju treba deklarirati varijablu zbroj i pridružiti joj početnu vrijednost 0. Ta će varijabla po završetku petlje sadržavati podatak o zbroju N prirodnih brojeva.
-
Potrebno je unijeti vrijednost za varijablu N koja označava posljednji broj željenog raspona. Petlja se treba ponavljati N puta stoga je tako valja i zadati.
-
Početna vrijednost kontrolne varijable brojac bit će 1(brojac=1), uvjet: (brojac<=N) a prirast (brojac++).
-
Naredba koja se izvodi konačan broj puta je uvećavanje vrijednosti varijable zbroj za tekuću vrijednost kontrolne varijable brojac (zbroj=zbroj+brojac;).
-
Kada uvijet petlje (brojac<=N) više ne bude ispunjen, petlja se prekida a izvršava se prva naredba iza petlje. To je ispis sadržaja varijable zbroj.
Rješenje:
|
#include<iostream>
using namespace std;
int main()
{
int brojac,zbroj,N;
cout<<" Upisi broj do kojeg zelis zbrajati: ";
cin>>N;
zbroj=0;
for (brojac=1;brojac<=100;brojac++)
{
zbroj=zbroj+brojac;
}
cout<<"Zbroj prvih "<<N<<" prirodnih brojeva je:"<<zbroj<<endl;
return 0;
}
|
Rezultat za upis broja 100:
|
Upisi broj do kojeg zelis zbrajati: 100
Zbroj prvih 100 prirodnih brojeva je: 5050
|
|
|
Zadatak:
|
Potrebno je prebrojiti sve prirodne brojeve djeljive sa 7 iz raspona od M do N. Ispis neka bude oblika:
Upisi pocetnu vrijednost raspona:
Upisi zavrsnu vrijednost raspona:
U rasponu od ... do ... ima ... brojeva djeljivih sa 7.
|
-
Prije ulaska u petlju treba deklarirati varijablu broj i pridružiti joj početnu vrijednost 0. Ta će varijabla po završetku petlje sadržavati podatak o broju brojeva djeljivih sa 7 iz zadanog raspona brojeva.
-
Potrebno je unijeti vrijednosti za varijable M i N koje označavaju početnu i završnu vrijednost željenog raspona brojeva. Kontrolna će varijabla petlje poprimati vrijednosti iz zadanog raspona brojeva: početna vrijednost: (brojac=M), uvjet: (brojac<=N), s prirastom 1 (brojac++).
-
U bloku naredbi petlje provjeravat će se djeljivost trenutne vrijednosti kontrolne varijable petlje sa brojem 7; if (brojac%7==0). Ako je uvijet ispunjen vrijednost varijable broj se uvećava za 1 (broj=broj+1;).
-
Kada uvijet (brojac<=N) više ne bude ispunjen, petlja se prekida a izvršava se prva naredba iza petlje. To je ispis sadržaja varijable broj.
Rješenje:
|
#include<iostream>
using namespace std;
int main()
{
int broj,brojac, M, N;
cout<<"Program prebrojava sve prirodne brojeve djeljive sa 7 iz raspona od M do N"<<endl;
cout<<"Upisi pocetnu vrijednost raspona: ";
cin>>M;
cout<<"Upisi zavrsnu vrijednost raspona: ";
cin>>N;
broj=0;
for(brojac=M;brojac<=N;brojac++)
{
if(brojac%7==0)
{
broj=broj+1;
}
}
cout<<"U rasponu od "<<M<<" do "<<N<<" ima "<<broj<<" brojeva djeljivih sa 7."<<endl;
return 0;
}
|
Rezultat za unos brojeva 1 i 100:
|
Program prebrojava sve prirodne brojeve djeljive sa 7 iz raspona od M do N.
Upisi pocetnu vrijednost raspona: 1
Upisi zavrsnu vrijednost raspona: 100
U rasponu od 1 do 100 ima 14 brojeva djeljivih sa 7.
|
|
|
Zadatak:
|
Potrebno je ispisati djelitelje odabranog prirodnog broja. Po unosu broja treba provjeriti da li je uneseni broj prirodan, ako nije valja ponoviti unos. Ispis neka bude oblika:
Upisi prirodni broj:
Djelitelji broja ... su: ...
|
-
Po unosu broja N, provjerava se da li je taj broj manji ili jednak 0 (N<=0). Ako je, broj nije prirodan i unos treba ponoviti.
-
Kontrolna se varijabla petlje, brojac mijenja od 1 do N.
-
U bloku naredbi petlje provjerava se djeljivost broja N sa svakom od trenutnih vrijednosti kontrolne varijable petlje if(N%brojac==0).
-
Ako je uvjet istinit (pronađen je djelitelj) ispisuje se trenutna vrijednost kontrolne varijable petlje.
Rješenje:
|
#include<iostream>
using namespace std;
int main()
{
int brojac,N;
upis:cout<<"Upisi prirodni broj: ";
cin>>N;
if (N<=0)
goto upis;
cout<<"Djelitelji broja "<<N<<" su: ";
for (brojac=1;brojac<=N;brojac++)
{
if(N%brojac==0)
cout<<brojac<<" ";
}
cout<<endl;
return 0;
}
|
Rezultat za unos broja 56:
|
Upisi prirodni broj: 56
Djelitelji broja 56 su: 1 2 4 7 8 14 28 56
|
|
|
Zadatak:
|
Potrebno je ispisati sve troznamenkaste brojeve čiji je zbroj znamenaka 5, a zadnja im je znamenka 0 (znamenka jedinice). Ispis neka bude oblika:
Troznamenkasti brojevi ciji je zbroj znamenaka 5, a zadnja im je znamenka 0 su:
...
...
|
-
Da bi se dobili svi troznamenkasti brojevi koje treba provjeriti, potrebno je načiniti petlju čija se vrijednost kontrolne varijable mijenja unutar potrebitog raspona: početna vrijednost: (brojac=100), uvjet: (brojac<=999), prirast: (brojac++).
-
Zatim iz svakog troznamenkastog broja treba izdvojiti znamenke jedinice, desetice i stotice. Problem se rješava uporabom aritmetičkih operatora za cjelobrojno i modularno dijeljenje: (j=brojac%10), (d=(brojac/10)%10), (s=brojac/100). Jedno od mogućih rješenja, npr. za broj 745:
745 % 10 = 5
(745 / 10) % 10 = 4
745 / 100 = 7
-
Kada se znamenke određenog broja izdvoje, potrebno ih je zbrojiti (zbroj=j+d+s).
-
Svaki od brojeva koje treba provjeriti mora zadovoljiti dva uvjeta: zbroj znamenaka mora biti jednak 5 (zbroj==5) a zadnja znamenka mora biti jednaka 0 (j==0). Stoga treba zadati složeni uvjet uporabom logičkog operatora I (AND).
-
Ako je složeni uvjet if((zbroj==5)&&(j==0)) istinit, broj se ispisuje.
Rješenje:
|
#include<iostream>
using namespace std;
int main()
{
int brojac,j,d,s,zbroj;
cout<<"Troznamenkasti brojevi ciji je zbroj znamenaka 5,";
cout<<" a zadnja im je znamenka 0 su: "<<endl;
for(brojac=100;brojac<=999;brojac++)
{
j=brojac%10;
d=( brojac /10)%10;
s= brojac /100;
zbroj=j+d+s;
if((zbroj==5)&&(j==0))
cout<< brojac <<" ";
}
return 0;
} |
Rezultat:
|
Troznamenkasti brojevi ciji je zbroj znamenaka 5, a zadnja im je znamenka 0 su:
140 230 320 410 500
|
| |
|