$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\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{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Ugneždene petlje

U prethodne dve lekcije videli smo kako se koriste naredbe ponavljanja - petlje. Ove naredbe mogu da se kombinuju. Postavljanje jedne petlje unutar tela druge petlje zove se ugneždavanje. Kada se dve petlje ugnezde, spoljašnja petlja određuje broj ponavljanja unutrašnje petlje. Svi tipovi petlji se mogu ugneždavati, ali je ipak najčešće ugneždavanje for petlji.

Možemo da pogledamo jedan primer iz života. Odometar (uređaj koji meri pređeno rastojanje) u automobilu radi po sličnom principu kao i ugneždene petlje.

Ovaj brojač kilometraže u automobilu je veoma sličan sistemu od 6 ugnež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. Sledeća for petlja 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, uveća se/inkrementira za jedan. Dve ugneždene petlje prikazane ispod mogu poslužiti kao ilustracija promene krajnje dve cifre brojčanika odometra.

for(cifra2 = 0; cifra2 <= 9; cifra2++)
{
    for(cifra1 = 0; cifra1 <= 9; cifra1++)
    {
        cout<< cifra2 << " " << cifra1 << endl;
    }
}

Prva petlja koju vidimo, petlja sa brojačem cifra2 je spoljašnja petlja, a druga, petlja sa brojačem cifra1 je unutrašnja petlja. Broj cifara brojčanika odometra određuje broj ugneždenih petlji koje služe za ilustraciju.

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

Pogledaćemo šta se dešava u svakom koraku u primeru ugnež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;
    }
}

U sledećoj tabeli može da se vidi stanje posle svakog koraka unutrašnje petlje.

|Stanje promenljivih u memoriji| | Ispis na ekranu| |:-----------------|:-------------:| | int cifra1 | int cifra2 | | | 0 | 0 | 0 0 | | | 1 | 0 1 | | | 2 | 0 2 | | | 3 kraj petlje | | | 1 | 0 | 1 0 | | | 1 | 1 1 | | | 2 | 1 2 | | | 3 kraj petlje | | | 2 | 0 | 2 0 | | | 1 | 2 1 | | | 2 | 2 2 | | | 3 kraj petlje | | | 3 | 0 | 3 0 | | | 1 | 3 1 | | | 2 | 3 2 | | | 3 kraj petlje | | | 4 kraj petlje | |

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.

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

Primer 1

Sledi programski kod koji upotrebom dve ugneždene for petlje, 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;
}

Na ekranu će se ispisati sledeće:

*****
****
***
**
*

Primer 2

Kao što je već rečeno, jedna vrsta petlje se može ugnezditi sa drugim tipom petlje. Možemo, na primer, koristiti while petlju unutar for petlje. U programskom kodu koji sledi, spoljašnja petlja će se izvršiti tri puta (za vrednosti promenljive brojac2: 0, 1, i 2). Kada se prvi put bude izvršila, unutrašnja će prikazati brojeve od 0 do 5. Za drugo izvršenje spoljašnje petlje, unutrašnja će prikazati brojeve od 1 do 5, a za treće brojeve od 2 do 5. Tako će konačan prikaz ovog programa biti: 012345123452345.

#include <iostream>
using namespace std;

int main()
{
    int brojac1, brojac2;
    for (brojac2 = 0; brojac2 <= 2; brojac2++)
    {
        brojac1 = brojac2;
        while(brojac1 <= 5)
        {
            cout<< brojac1;
            brojac1++;
        }
    }
  
  return 0;
}

Primer 3

Tablicu množenja možemo prikazati sledećim programom.

#include <iostream>
using namespace std;

int main()
{
    cout<< "Tablice" << endl;
    int brojac1 = 1, brojac2 = 1;

    while(brojac2 <= 10)
    {
        brojac1 = 1;	
        while(brojac1 <= 10)
        {
            cout<<brojac2<<" * "<<brojac1<<" = "<<(brojac1 * brojac2)
            << endl;
            brojac1++;
        }
    
        brojac2++;
        cout<< endl;
    }

    return 0;
}

Primer 4

Možemo da analiziramo program koji ispisuje brojeve u trougaonoj formi uz pomoć ugneždenih petlji.

#include<iostream>
using namespace std;

int main()
{
    for(int brojac2 = 0; brojac2 <= 5; brojac2++)
    {
        for(int brojac1 = 0; brojac1 <= brojac2; brojac1++)
        {
            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