$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \newcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$
Priručnik za početnike (C++) / Kombinovanje naredbi ponavljanja

Kombinovanje naredbi ponavljanja

  • Dozvoljeno polaganje
  • Lekcije
  • Nema
  • Teo
  • 7/25/2015

Ugnježdene petlje

U prethodnoj lekciji smo videli kako se koriste naredbe ponavljanja - petlje. Hajde sada da pogledamo kako ove naredbe mogu da se kombinuju.

 

Postavljanje jedne petlje unutar tela druge petlje se zove ugnježdavanje. Kada se dve petlje "ugnezde", spoljašnja petlja određuje broj ponavljanja unutrašnje petlje. Svi tipovi petlji se mogu ugnježdavati, no najčešće je ugnježdavanje for petlji.

 Ilustracija: 2 ugnježdene petlje

                    

Hajde sada da pogledamo kroz primer ugnježdene petlje na delu. Odometar (uređaj koji meri pređeno rastojanje) u automobilu radi po sličnom principu kao i ugnježdene petlje.

 Ilustracija: Prikaz brojača kilometraže na kontrolnoj tabli automobila

 

Ovaj brojač kilometraže u automobilu je veoma sličan sa sistemom od 6 ugnježdenih for petlji, gde svaka petlja "broji"/"ide" od 0 do 9. Krajnji desni broj/cifra se menja/iterira najbrže, tako što se "pomera" od 0 do 9 kako vozimo automobil. Evo for petlje koja imitira ove promene krajnje desne cifre brojčanika:

 

for(cifra1 = 0; cifra1 <= 9; cifra1++)

{

cout<< cifra1 << endl;

}

 

Krajnja desna cifra nije jedina koja se menja. Sve ostale cifre brojčanika se takođe menjaju, ali sa manjom brzinom promene. Za svakih 10 promena cifre sa desna, njoj susedna cifra brojčanika se uveća/inkrementira za jedan. Dve ugnježdene petlje prikazane ispod mogu poslužiti kao ilustracija promene krajnje dve cifre brojčanika odometra:

 

 

 

Petlja označena crvenim strelicama predstavlja unutrašnju petlju a ona označena zelenim strelicama je spoljašnja petlja. Broj cifara brojčanika odometra određuje broj ugnježdenih petlji koje služe za ilustraciju.

 

Pri radu sa ugnježdenim petljama, spoljašnja petlja se menja tek kada se unutrašnja petlja sasvim završi (ili se prekine).

 

Hajde sad da pogledamo šta se dešava u svakom koraku u primeru ugnježdenih petlji koji sledi. Da bismo sebi olakašali posao praćenja, smanjili smo broj ponavljanja obe petlje.

 

for(cifra2 = 0; cifra2 <= 3; cifra2++)

{

for(cifra1 = 0; cifra1 <= 2; cifra1++)

{

    cout<< cifra2 << " " << cifra1 << endl;

    }

}   

 

Evo kako to izgleda posle svakog koraka unutrašnje petlje:

 

Stanje promenljivih u memoriji

Ispis na ekranu

int cifra2

 

int cifra1

 

 

0

 

0

 

 

 

1

 

 

 

2

 

 

 

kraj petlje

 

1

 

0

 

 

 

1

 

 

 

2

 

 

 

kraj petlje

 

2

 

0

 

 

 

1

 

 

 

2

 

 

 

kraj petlje

 

3

 

0

 

 

 

1

 

 

 

2

 

 

 

kraj petlje

 

kraj petlje

 

 

 

 

0   0

0   1

0   2

 

 

 

1   0

1   1

1   2

 

 

 

2   0

2   1

2   2

 

 

 

3   0

3   1

3   2

Imaj na umu da će u memoriji vrednosti brojačkih promenljivih for petlji u jednom trenutku uzeti vrednost za 1 veću od same granice brojačkog for ciklusa da bi sama petlja mogla da se prekine.

 

C++ dozvoljava kombinovanje/ugnježdavanje for, while i do while petlji.

 

Evo još jednog primera kombinovanja programa sa dve for petlje, koji ispisuje zvezdice u trougaonoj formi na ekranu:

 

#include <iostream>

using namespace std;

 

int main()

{

int brojac1, brojac2;

 

for (brojac2 = 1; brojac2 <= 5; brojac2++)

{

for (brojac1 = brojac2; brojac1 <= 5; brojac1++)

{

cout<<"*"; // ispis zvezdice na ekran

}

 

cout<< endl; // prelazak u novi red ekrana

}

 

return 0;

}

 

Ispis na ekranu:

*****

****

***

**

*

Jedna vrsta petlje se može ugnezditi sa drugim tipom petlje, na primer možemo koristiti  while petlju unutar for petlje. Evo primera programa koji kombinuje while u okviru for petlje:

 

#include <iostream>

using namespace std;

 

int main()

{

int brojac1, brojac2;

 

for (brojac2 = 0; brojac2 <= 2; brojac2++)

{

brojac1 = brojac2;

 

while(brojac1 <= 5)

{

cout<< brojac1 << endl;

brojac1++;

}

}

 

return 0;

}

 

Ispis na ekranu:

0

1

2

3

4

5

1

2

3

4

5

 

Sledeći program služi za ispis tablice množenja:

 

#include <iostream>

using namespace std;

 

int main()

{

int brojac1 = 1, brojac2 = 1;

 

cout<< "Tablice" << endl;

 

// promeni sa 2 na 5 ili 10 zavisno koliko zelis tablica da ispises

while(brojac2 <= 2)

{

while(brojac1 <= 10)

{

cout<<brojac2<<" * "<<brojac2<<" = "<<(brojac1 * brojac2)<<endl;

brojac1 ++;

}

 

brojac2++;

 

cout<< endl;

}

 

return 0;

}

 

Ispis na ekranu:

Tablice

1 * 1 = 1

1 * 2 = 2

1 * 3 = 3

1 * 4 = 4

1 * 5 = 5

1 * 6 = 6

1 * 7 = 7

1 * 8 = 8

1 * 9 = 9

1 * 10 = 10

 

2 * 1 = 2

2 * 2 = 4

2 * 3 = 6

2 * 4 = 8

2 * 5 = 10

2 * 6 = 12

2 * 7 = 14

2 * 8 = 16

2 * 9 = 18

2 * 10 = 20

 

Program koji ispisuje brojeve u trougaonoj formi uz pomoć ugnježdenih petlji:

 

#include<iostream>

using namespace std;

 

int main()

{

for(int brojac2 = 0; brojac2 <= 5; brojac2++)

{

for(int brojac1 = 0; brojac1 <= brojac2; brojac2++)

{

cout<< " "<<brojac1<<" ";

        }

       

cout<<endl;

    }

 

return 0;

}

 

Vrednosti promenljivih i stanja na ekranu posle svakog koraka:

 

brojac2=0 

brojac1=0

Trenutno stanje na ekranu:

         0

 

brojac2=1

brojac1=0 do brojac1=1

Trenutno stanje na ekranu:

          0

          0  1

 

brojac2=2

brojac1=0 do brojac1=2

Trenutno stanje na ekranu:

          0

          0  1

          0  1  2 

 

brojac2=3

brojac1=0 do brojac1=3

Trenutno stanje na ekranu:

          0

          0  1

          0  1  2 

          0  1  2  3

   

brojac2=4

brojac1=0 do brojac1=4

Trenutno stanje na ekranu:

          0

          0  1

          0  1  2 

          0  1  2  3

          0  1  2  3  4

   

brojac2=5

brojac1=0 do brojac1=5

Konačni ispis na ekranu: 

          0

          0  1

          0  1  2

          0  1  2  3

          0  1  2  3  4

          0  1  2  3  4  5