16.1.2012 dvije godine postojanja naših stranica

Petlja for

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