PETLJE U PROGRAMSKOM JEZIKU C++
Zamislite da želite da ispišete sve brojeve od 1 do 100 na ekranu. Bez petlji, morali biste ručno napisati 100 linija koda. Međutim, uz pomoć petlje, ovaj zadatak se svodi na nekoliko linija koda koje automatizuju proces.
Petlje nisu korisne samo za jednostavne zadatke poput ponavljanja, već se koriste i u složenijim scenarijima, kao što su:
- Obrada velikih količina podataka.
- Pronalaženje rešenja iterativnim pristupom, kao što je sortiranje ili pretraživanje.
- Upravljanje unosom korisnika dok ne unesu ispravan podatak.
Te naredbe, kojima omogućavamo kontrolisano ponavljanje, nazivamo ciklusima. U C++ jeziku se za to koriste for, while i do-while naredba.
Npr. Zamislite da želimo da ispišemo neki znak 20 puta.
To možemo uraditi komandom cout koju treba ponoviti 20 puta, dakle:
cout << "*" << endl;
cout << "*" << endl;
. . .
for (int i = 0; i < 20; i++) {cout<< "*" << endl;}
Izrazi u maloj zagradi služe da obezbede odgovarajući broj ponavljanja, u ovom slučaju 20.
Prvi izraz služi da se uvede neka promenljiva kojoj se zada neka početna vrednost i čija će se vrednost menjati tokom ciklusa.
Drugi izraz je zapravo uslov petlje od koga zavisi da li se ide u sledeći ciklus ili ne. To je zapravo logički izraz čija je vrednost logički podatak tipa bool, dakle može imati vrednost true, ako je vrednost izraza tačna, ili false, ako je netačna. U slučaju da je vrednost true, izvršiće se naredni ciklus.
Npr. ako smo uveli promenljivu " i " i zadali joj početnu vrednost nula u prvom izrazu, a drugi izraz glasi i < 20, to znači da će se ispisivanje ponavljati sve dok taj izraz bude tačan. Ako se vrednost promenljive "i" ne bi menjala tokom ciklusa, to bi značilo da će taj uslov uvek biti zadovoljen, što znači da će biti beskonačno ciklusa(program se neprekidno izvršava).
Za promenu promenljive je zadužen treći izraz. Tu se definiše za koliko se menja promenljiva koja je uvedena u prvom izrazu. U našem primeru i++ znači promenu za 1 i to povećanje.
Dakle ako je početno i = 0, korak povećanja 1, a uslov petlje i < 20, to znači da će ovaj uslov biti zadovoljen sve dok vrednost promenljive " i " ne dostigne vrednost 20. Dakle 20< 20 više nije tačno i ciklus se prekida.
Izraz tri je mogao da bude napisan i kao i=i+1. Ovo znači da se memoriji označenoj sa i dodeljuje vrednost koja je prethodno bila u toj memoriji uvećanoj za 1.
U opštem slučaju sintaksa for naredbe bi bila
for u c++ jeziku
{
Primer 1: Niz brojeva deljivih sa 3
{
- Pomerićemo početnu vrednost broja a na prvi sledeći broj koji je deljiv sa 3, tj. na -99
- Korak promene promenljive a staviti na 3, jer svaki treći broj, počev od -99 je takođe deljiv sa 3, dakle a=a+3
{
-99,-96,-93, ....0,3,6,........99
Nizovi u jeziku C i C++
Primer 2: Sabrati niz prirodnih brojeva od 1 do 10
printf( "zbir=%d",zbir );
cout<< "zbir=%d" << zbir << endl;
Prvo je potrebno uvesti promenljivu koja će predstavljati zbir:
int zbir=0;
Zatim bi trebalo u zbir dodavati jedan po jedan broj. Napisano bez ciklusa to bi izgledalo:
zbir = zbir + 1;
zbir = zbir + 2;
zbir = zbir + 3;
zbir = zbir + 4;
...
zbir = zbir + i;
...
zbir = zbir + 10;
ali umesto toga koristimo ciklus:
{
for(int i = 1; i <= 10; i = i + 1)
{
cout << "zbir=" << zbir << endl; // Štampa zbir
Primer 3: Određivanje proseka
Rešenje prethodnog primera bi bilo:
using namespace std;
int main() {
int broj, suma = 0;
double prosek;
// Učitavanje 5 brojeva od korisnika
for (int i = 1; i <= 5; i++) {
cin >> broj;
suma += broj; // Dodavanje broja na sumu
// Izračunavanje proseka
prosek = suma / 5.0;
// Ispis rezultata
cout << "Srednja vrednost je: " << prosek << endl;
return 0;
- Deklaracija promenljivih:
- broj: Čuva trenutni unos korisnika.
- suma: Zbir svih unetih brojeva, inicijalno postavljena na 0.
- prosek: Prosečna vrednost brojeva, definisana kao double radi preciznosti.
- Petlja za unos:
- Korisnik unosi 5 brojeva redom.
- Svaki uneseni broj se dodaje na suma.
- Izračunavanje proseka:
- Prosek se dobija deljenjem sume sa 5.0 (koristi se decimalna vrednost kako bi rezultat bio double).
- Ispis rezultata:
- Prosek se prikazuje korisniku koristeći cout.
Izrada simulacija pomoću ciklusa
Želimo da simuliramo promenu položaja s[m] pri ravnomernom kretanju za promenu vremena.Ovde se neće praviti vizuelna simulacija, nego samo ispisivanje trenutnih vrednosti položaja tela za svaku promenu vremena za interval dt.
Posmatraćemo promene položaja za svaki mali porast vremena od dt[s]
Uzmimo da je ta promena za dt=0.05s
Uvod u cikluse-simulacija ravnomernog kretanja
Početne vrednosti su s=0; t=0; v unosi korisnik
Dakle 20 puta bi ponavljali sledeće naredbe:
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
cout<< “s=“<<s<<endl; //Ispisivanje vrednosti pređenog puta. Više o naredbi cout pogledajte u lekciji stringovi
Ovakav kod nije dobar:
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
cout<< “s=“<<s<<endl;
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
cout<< “s=“<<s<<endl;
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
cout<< “s=“<<s<<endl;
...
Vidimo da se 3 naredbe ponavljaju 20 puta. Umesto toga treba napisati 3 naredbe jedan put a onda koristiti neku drugu naredbu koja će ih ciklično ponoviti onoliko puta koliko mi želimo.
To su naredbe koje zovemo ciklusi(petlje):
- for
- while
- do-while
for ciklus
{
t=t+dt; //promena vremena za 0.05s
s=s+v*dt; //promena položaja za 0.05s
cout<< "s=" << s << endl;
}
Ako ne znamo unapred broj ciklusa?
Tada broj ciklusa zavisi od nekog uslova i onda koristimo
while naredbu ili,
do-while
while ciklus
Primetimo da u maloj zagradi samo imamo jedan izraz logičkog tipa ili logičku promenljivu tipa bool. Naredbe u telu while naredbe će se ponavljati sve dok je taj izraz tačan tj. dok ima vrednost true. Pošto se uslov nalazi na početku while petlje, on se ispituje pre izvršenja naredbi. Može se desiti slučaj da u prvom ispitivanju vrednost bool izraza bude false, to znači da se u tom slučaju naredbe ne bi izvršile ni jedan put.
Ukoliko nam je iz bilo kog razloga važno da se naredbe izvrše bar jedan put, onda je pogodnije da uslov bude na kraju, što je slučaj kod do-while naredbe.
while, sintaksa
while( true )
{
While algoritam
Primer 5: Uneti ceo broj N. Ukloniti mu nule sa desne strane. Npr. za uneto N=12000, na ulazu treba da bude 12
cin >> N; //Učitavanje celog broja
while(N % 10 == 0)
{
cout << "N=" << N << endl;
Više o određivanju ostatka deljenja pročitajte u lekciji operatori.
Primer 6: Brojanje ciklusa
Da bi program sam odredio broj ciklusa uvešćemo brojač ciklusa. To je ceo broj inicijalizovan na nulu.
int broj=0;
Pogledajmo primer koji to ilustruje:
Brojanje ciklusa u while
petlji
U C++ jeziku, brojanje ciklusa u while
petlji može se postići korišćenjem brojača. Brojač je promenljiva celobrojnog tipa, inicijalizovana na nulu, koja se uvećava pri svakom prolasku kroz petlju.
Primer ispod ilustruje ovu tehniku.
using namespace std;
int main() {
int broj = 0; // Brojač ciklusa
int x = 10; // Početna vrednost
// Petlja koja se izvršava dok je x veće od 0
while (x > 0) {
x -= 2; // Smanjujemo vrednost x za 2
cout << "Vrednost x: " << x << ", Broj ciklusa: " << broj << endl;
// Ispis ukupnog broja ciklusa
cout << "Ukupan broj ciklusa: " << broj << endl;
return 0;
Primer 7: Trening
U ovom primeru koristimo while petlju da simuliramo dane treninga sportiste. Svakog dana korisnik unosi broj pretrčanih kilometara (u opsegu od 1 do 5). Petlja se izvršava dok ukupan broj pretrčanih kilometara ne dostigne ili premaši vrednost od 40. Ovo je idealan slučaj za while petlju, jer unapred nije poznat tačan broj iteracija (dana treninga). Kod uključuje proveru validnosti unosa kako bi se obezbedila korektnost rezultata. Na kraju, program ispisuje broj dana potrebnih da se pretrči 40 kilometara.
#include <iostream> using namespace std; int main() {int ukupno = 0; int dan = 0; int km; while (ukupno < 40) {}cout << "Unesite kilometre pretrčane za dan " << dan + 1 << " (1-5): "; cin >> km; if (km >= 1 && km <= 5) { ukupno += km; dan++; } else { cout << "Neispravan unos! Unesite broj od 1 do 5." << endl; }} cout << "Sportista je dostigao 40 km posle " << dan << " dana." << endl; return 0;
- Deklaracija promenljivih:
- ukupno: Čuva zbir pretrčanih kilometara, inicijalizovan na 0.
- dan: Brojač dana, povećava se za 1 nakon svakog validnog unosa.
- km: Čuva broj pretrčanih kilometara za trenutni dan.
- while petlja:
- Radi sve dok zbir (ukupno) ne dostigne 40 kilometara.
- Traži unos broja kilometara za svaki dan i validira ga.
- Validacija unosa:
- Ako unos nije u opsegu [1, 5], ispisuje se poruka o grešci i traži se novi unos.
- Ispis rezultata:
- Kada zbir pretrčanih kilometara dostigne 40, ispisuje se ukupan broj dana potrebnih da se postigne cilj.
Primer 8: Simulacija slobodnog pada
Za to vremene promeni se visina h kao i brzina v.
- Vreme se promeni za dt: t=t+dt;
- Visina za v*dt+g*dt*dt/2. Dakle h=h-(v*dt+g*dt*dt/2)
- Brzina za g*dt. Dakle, v=v+g*dt
cin >> h;
while(h>=0)
{
h=h-v*dt-g*dt*dt/2; //promena položaja u toku 0.05s
v=v+g*dt; //promena brzine u toku 0.05s
cout << "h=" << h << "m" << endl;
do-while ciklus
Prethodni primer bi se mogao odraditi i sa do-while ukoliko bi znali početne uslove pre nego što uđemo u ciklus, npr.
ako znamo da je sigurno h0>0 i
Početni uslovi:
h=h0; t=0;
tada bi kod izgledao:
do
{
h=h-v*dt-g*dt*dt/2; //promena položaja u toku 0.05s
v=v+g*dt; //promena brzine u toku 0.05s
cout << "h=" << h << "m" << endl;
while(h>=0);
Ako znamo da je sigurno h0>0
Tada se uslov postavlja na krajui zato koristimo do-while naredbu.
do - while , sintaksa
do
{
while( uslov);
Algoritam do-while petlje
Primeri sa upotrebom do-while naredbe
Primer 9: Unos brojeva dok korisnik ne unese 0
Rešenje:
#include <iostream> // Uključivanje biblioteke za standardne I/O funkcije int main() {int broj, zbir = 0; // Deklaracija promenljivih broj (unos korisnika) i zbir (inicijalizovan na 0) do {}cout << "Unesite broj (0 za kraj): "; // Poruka korisniku da unese broj. Unos 0 završava petlju cin >> broj; // Učitavanje broja unetog sa tastature zbir += broj; // Dodavanje unetog broja u zbir} while (broj != 0); // Petlja se ponavlja dok korisnik ne unese 0 cout << "Zbir unesenih brojeva je: " << zbir << endl; // Ispisivanje konačnog rezultata return 0; // Završavanje programa
- do-while petlja omogućava da korisnik unese brojeve, a unosi se ponavljaju sve dok se ne unese broj 0.
- S obzirom na to da je 0 signal za kraj, program dodaje unesene brojeve u zbir i nastavlja unos dok se ne unese nula.
- Kada korisnik unese 0, petlja se završava i program ispisuje zbir brojeva.
Primer 10: Ispis brojeva od 1 do n, gde n unosi korisnik
Rešenje:
#include <iostream> /* Uključivanje biblioteke za standardne I/O funkcije */ int n, i; /* Deklaracija promenljivih n (broj koji unosimo) i i (brojač u petlji) */ do { /* Početak do-while petlje koja se ponavlja dok broj n nije veći od 0 */cout << "Unesite broj n (veći od 0): "; /* Ispisivanje poruke korisniku da unese broj n */ cin >> n; /* Unos broja n sa tastature */ if (n <= 0) { /* Provera da li je broj manji ili jednak 0 */} while (n <= 0); /* Petlja se ponavlja dok broj n nije veći od 0 */ cout << "Brojevi od 1 do " << n << ":\n"; /* Ispisivanje poruke sa vrednošću n, koja označava koliko brojeva treba ispisati */ for (i = 1; i <= n; i++) { /* For petlja za ispis brojeva od 1 do n */cout << "Broj mora biti veći od 0. Pokušajte ponovo.\n"; /* Ako broj nije veći od 0, ispisuje se poruka greške */}cout << i << " "; /* Ispisivanje broja i u svakom prolazu petlje */} cout << "\n"; /* Novi red nakon ispisa svih brojeva */ return 0; /* Završavanje programa i vraćanje vrednosti 0 kao uspešan izlaz */
- do-while petlja osigurava da korisnik unese broj veći od 0.
- Ako korisnik unese broj manji ili jednak nuli, program će ponovo tražiti unos.
- Kada je unos validan, program koristi petlju za ispis brojeva od 1 do n.
Primer 11: Provera validnosti unosa lozinke
Rešenje:
#include <iostream> using namespace std; int lozinka; do {cout << "Unesite lozinku (broj): "; cin >> lozinka; if (lozinka != 1234) {} while (lozinka != 1234); cout << "Lozinka je tačna!\n"; return 0;cout << "Pogrešna lozinka. Pokušajte ponovo.\n";}
- Program koristi do-while petlju da bi omogućio korisniku unos lozinke u obliku broja.
- Ako korisnik unese netačnu lozinku, program traži ponovni unos.
- Kada korisnik unese tačnu lozinku (u ovom slučaju broj "1234"), petlja se završava i ispisuje se poruka o uspešnom unosu lozinke.
Beskonačne Petlje u C++
Beskonačne petlje su petlje koje nikada ne prestaju sa izvršavanjem. One se obično dešavaju kada je uslov petlje uvek true
, što može biti rezultat greške u kodu ili namernog dizajna za specifične zadatke.
Primer Beskonačne Petlje
while (true) { std::cout << "Ovo je beskonačna petlja!" << std::endl; }
Uobičajeni Uzroci
- Pogrešan ili nedostajući uslov za izlazak.
- Promenljive koje kontrolišu petlju se ne ažuriraju pravilno.
- Korišćenje konstante
true
u uslovu petlje bez mehanizma za izlazak.
Kako Izbeći Beskonačne Petlje
Postoji nekoliko koraka za izbegavanje beskonačnih petlji:
- Uvek proverite uslov petlje da li može postati
false
. - Obezbedite da se promenljive koje kontrolišu petlju ispravno ažuriraju.
- Dodajte logiku za prekidanje petlje pomoću
break
ukoliko je to potrebno.
Primer Korektne Petlje
int i = 0; while (i < 5) { std::cout << "i = " << i << std::endl; i++; }
Kada su Beskonačne Petlje Korisne?
Iako se beskonačne petlje često javljaju kao greška, postoje situacije kada su one korisne i čak neophodne:
- U server aplikacijama koje kontinuirano obrađuju zahteve.
- U igrama gde glavna petlja kontroliše tok igre.
- Za kreiranje menija koji traje dok korisnik ne odabere opciju za izlaz.
Primeri Beskonačnih Petlji
Evo nekoliko primera kako se beskonačne petlje koriste u praksi:
for (;;) { std::cout << "Ova petlja traje zauvek!" << std::endl; }
while (true) { std::string input; std::cout << "Unesite 'exit' za izlaz: "; std::cin >> input; if (input == "exit") { break; } }
Kako Izbeći Beskonačne Petlje
Postoji nekoliko koraka za izbegavanje beskonačnih petlji:
- Uvek proverite uslov petlje da li može postati
false
. - Obezbedite da se promenljive koje kontrolišu petlju ispravno ažuriraju.
- Dodajte logiku za prekidanje petlje pomoću
break
ukoliko je to potrebno.
Primer Korektne Petlje
int i = 0; while (i < 5) { std::cout << "i = " << i << std::endl; i++; }
Primer Beskonačne Petlje Koristeći for
for (int i = 0; true; i++) { std::cout << "Ovo je for beskonačna petlja, i = " << i << std::endl; }
Primer Beskonačne Petlje Koristeći do-while
int brojac = 0; do { std::cout << "Ovo je do-while beskonačna petlja, brojac = " << brojac << std::endl; brojac++; } while (true);
Naredbe break i continue
Korišćenje Naredbe break
u Petljama
U programiranju, naredba break
se koristi za trenutni izlazak iz petlje, bez obzira na to da li je uslov petlje još uvek zadovoljen. Ovo može biti korisno kada želite da prekinete izvršavanje petlje nakon što se postigne određeni uslov.
Primer Korišćenja break
u for
Petlji
for (int i = 0; i < 10; i++) { std::cout << "i = " << i << std::endl; if (i == 5) { break; // Izlazak iz petlje kada i dostigne 5 } }
Primer Korišćenja break
u while
Petlji
int broj = 0; while (true) { std::cout << "Unesite broj (unesite -1 za izlaz): "; std::cin >> broj; if (broj == -1) { break; // Izlazak iz petlje kada korisnik unese -1 } std::cout << "Uneli ste broj: " << broj << std::endl; }
Kao što se vidi u ovim primerima, naredba break
je moćan alat koji omogućava kontrolisano prekidanje toka izvršavanja petlji.
Upotreba continue
u Ciklusima
Naredba continue
koristi se u petljama da preskoči preostali deo trenutne iteracije i pređe na sledeću iteraciju. Ovo je korisno kada želite da ignorišete određene uslove tokom izvršavanja petlje, ali da ne prekinete celu petlju.
Primer Korišćenja continue
u for
Petlji
for (int i = 0; i < 10; i++) { if (i % 2 == 0) { continue; // Preskoči ispis ako je i paran broj } std::cout << "i = " << i << std::endl; }
Primer Korišćenja continue
u while
Petlji
int broj = 0; while (broj < 10) { broj++; if (broj == 5) { continue; // Preskoči ispis kada je broj jednak 5 } std::cout << "broj = " << broj << std::endl; }
Naredba continue
omogućava veću fleksibilnost u kontrolisanju toka izvršavanja unutar petlji, posebno kada treba da ignorišete određene uslove bez prekidanja celokupnog procesa iteracije.
Dodatni resursi za vežbanje petlji u C++
-
Petlje u C++ - primeri
Detaljni primeri petlji sa objašnjenjima za C++. -
LearnCpp.com - Uvod u petlje
Sveobuhvatan vodič za petlje u C++ sa praktičnim primerima. -
Priprema za okružna takmičenja
Zadaci i primeri za napredno vežbanje algoritama. -
Dodatni primeri iz petlji
Dodatni primeri i zadaci koji pokrivaju razne vrste petlji. -
GeeksforGeeks - Petlje u C++
Detaljan članak sa raznovrsnim primerima petlji u C++.
Za dodatna pitanja i objašnjenja, kontaktirajte nas putem formi za kontakt.
Sledeće
Ugnježdene petlje u C++ >| |
Srodni članci
Petlje u programskom jeziku JAVA
Nizovi-primeri
Fibonačijev niz
Podaci u C/C++ jeziku