Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 61

7.

Petlje (2)
Proceduralno programiranje u C++
Podsjećanje
● Na prošlom času upoznali smo se s petljom for, njenom osnovnom strukturom i načinom rada, te kako
možemo, mijenjajući njenu inicijalizaciju, uslov i ažuriranje, riješiti različite programske zadatke.
● Danas ćemo se upoznati s još nekim osobinama for petlje.
Opadajuća petlja
● Petlja se može povećavati za bilo koju vrijednost koraka, pa se čak i promjenljiva može množiti.
● Korak može biti i negativan! Ovakvu petlju zovemo opadajućom, jer vrijednost kontrolne promjenljive i
opada u svakom prolazu:

#include <iostream>
i=5
i=4
int main() {
i=3
for (int i(5); i>0; i--) { i=2
std::cout << "i=" << i << std::endl;
i=1
}
return 0;
}
Opadajuća petlja

Početna vrijednost
#include <iostream> i je 5

int main() {
for (int i(5); i>0; i--) {
std::cout << "i=" << i << std::endl;
}
U svakom prolazu
return 0;
i se smanjuje za 1
}
Petlja se završava
kada i prestane biti
veće od 0
Greška!

i nikada nije manje


#include <iostream> od 0.

int main() {
for (int i(5); i<0; i--) {
std::cout << "i=" << i << std::endl;
}
return 0; Petlja se neće izvršiti
} nijednom
Greška!

Beskonačna petlja!
#include <iostream>
i=-1
int main() { i=-2
i=-3
for (int i(0); i<5; i--) {
i=-4
std::cout << "i=" << i << std::endl;
i=-5
} ...
return 0;
}
Beskonačna petlja
● Beskonačna petlja je petlja koja se izvršava sve dok korisnik ne prekine program.
● Beskonačne petlje su loša pojava jer korisnik ima dojam da se program "zaglavio". Često se dešava da neki
podaci nisu snimljeni.
● Petlja s prethodnog slajda ipak nije beskonačna jer će u jednom trenutku doći do prekoračenja i negativno i
će postati pozitivno.
● Nekada u programu namjerno pravimo beskonačnu petlju koja se prekida na neki drugi način.
Primjer beskonačne petlje

#include <iostream>

int main() {
int i(0), n(5);
for (;;) {
if (i>=n) break;
std::cout << "i=" << i << std::endl;
i++;
}
std::cout << "poslije petlje i je " << i << std::endl;
return 0;
}
Šta uočavamo?
● Polja zaglavlja for petlje (inicijalizacija, uslov i ažuriranje) smiju biti prazna, ali moramo navesti znakove
tačka-zarez. Dakle, možemo napisati for(;;)
● Naredba break u C++ ima dva značenja:
○ Završetak slučaja u switch-case bloku
○ Prekid petlje
● Kada u petlji naiđemo na break, petlja se prekida i nastavljamo izvršavanje poslije petlje.
● Ako napišete break, a niste u petlji ni u switch-case, dobit ćete grešku!
○ Ako napišete break unutar if-a, imate grešku, jer if nije petlja.
Česta greška!

#include <iostream>

int main() {
int sati, minute, sekunde;
std::cout << "Unesite sate: ";
std::cin >> sati;
if (sati < 0 || sati > 23) {
std::cout << "Sati su neispravni!";
break;
}
... Greška! Break nije u petlji
} ni u switch-case
Ispravno završavanje programa
● Ako želite da prekinete čitav program, bilo gdje u main funkciji možete napisati return 0.

#include <iostream>

int main() {
int sati, minute, sekunde;
std::cout << "Unesite sate: ";
std::cin >> sati;
if (sati < 0 || sati > 23) {
std::cout << "Sati su neispravni!";
return 0;
}
...
}
Naredba continue
● Naredba continue preskače ostale naredbe do kraja petlje i prelazi na sljedeći korak petlje.

#include <iostream> i=0


i=1
int main() { i=1
int i; i=2
i=3
for (i=0; i<5; i++) {
i=3
std::cout << "i=" << i << std::endl;
i=4
if (i%2 == 0) continue; poslije petlje i je 5
std::cout << "i=" << i << std::endl;
}
std::cout << "poslije petlje i je " << i << std::endl;
return 0;
}
Razlika između continue i break
● Naredba continue prelazi na sljedeći korak, a break prekida petlju.

#include <iostream>
i=0
int main() { poslije petlje i je 0
int i;
for (i=0; i<5; i++) {
std::cout << "i=" << i << std::endl;
if (i%2 == 0) break;
std::cout << "i=" << i << std::endl;
}
std::cout << "poslije petlje i je " << i << std::endl;
return 0;
}
Primjer
Napisati program koji na ekranu ispisuje sve neparne brojeve između 5 i 55 (uključujući i ta dva) u
opadajućem redoslijedu.
Primjer
Napisati program koji na ekranu ispisuje sve neparne brojeve između 5 i 55 (uključujući i ta dva) u
opadajućem redoslijedu.

#include <iostream>

int main() {
for (int i(55); i>=5; i--) {
if (i % 2 == 1) {
std::cout << i << std::endl;
}
}
return 0;
}
Primjer
Napisati program koji na ekranu ispisuje sve neparne brojeve između 5 i 55 (uključujući i ta dva) u
opadajućem redoslijedu.

#include <iostream>

int main() {
for (int i(55); i>=5; i-=2) {
std::cout << i << std::endl;
}
return 0;
}
Ugniježđene (višestruke) petlje
● Unutar bloka naredbi petlje se može nalaziti bilo šta, pa i druga petlja!

i=0,j=0
#include <iostream> i=0,j=1
i=0,j=2
int main() { ...
for (int i(0); i<5; i++) { i=0,j=4
for (int j(0); j<5; j++) { i=1,j=0
std::cout << "i=" << ii=1,j=1
<<
",j=" << j << i=1,j=2
std::endl;
} ...
} i=4,j=2
return 0; i=4,j=3
i=4,j=4
}
Ugniježđene (višestruke) petlje
● Unutar bloka naredbi petlje se može nalaziti bilo šta, pa i druga petlja!

Ovu petlju ćemo zvati


#include <iostream> “petlja i”

int main() {
for (int i(0); i<5; i++) {
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
} A ovu petlju
return 0; “petlja j”
}
Ugniježđene (višestruke) petlje
i=0

#include <iostream>

int main() {
for (int i(0); i<5; i++) {
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA

#include <iostream>

int main() {
for (int i(0); i<5; i++) {
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje

Izvršava se tijelo
petlje i
#include <iostream>

int main() {
for (int i(0); i<5; i++) {
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
#include <iostream>

int main() {
for (int i(0); i<5; i++) {
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>

int main() {
for (int i(0); i<5; i++) {
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>

int main() {
for (int i(0); i<5; i++) {
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
i=0 j=0
int main() {
for (int i(0); i<5; i++) {
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
i=0 j=0
j++ => j=1
int main() {
for (int i(0); i<5; i++) {
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
i=0 j=0
j++ => j=1
int main() {
1<5? DA
for (int i(0); i<5; i++) {
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
"i=0,j=0"
j++ => j=1
int main() {
1<5? DA
for (int i(0); i<5; i++) {
"i=0,j=1"
for (int j(0); j<5; j++) {
std::cout << "i=" << i <<
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
"i=0,j=0"
j++ => j=1
int main() {
1<5? DA
for (int i(0); i<5; i++) {
"i=0,j=1"
for (int j(0); j<5; j++) {
...
std::cout << "i=" << i <<
"i=0,j=4"
",j=" << j << std::endl;
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
"i=0,j=0"
j++ => j=1
int main() {
1<5? DA
for (int i(0); i<5; i++) {
"i=0,j=1"
for (int j(0); j<5; j++) {
...
std::cout << "i=" << i <<
"i=0,j=4"
",j=" << j << std::endl;
j++ => j=5
}
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
"i=0,j=0"
j++ => j=1
int main() {
1<5? DA
for (int i(0); i<5; i++) {
"i=0,j=1"
for (int j(0); j<5; j++) {
...
std::cout << "i=" << i <<
"i=0,j=4"
",j=" << j << std::endl;
j++ => j=5
}
5<5? NE
}
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
"i=0,j=0"
j++ => j=1
int main() {
1<5? DA
for (int i(0); i<5; i++) {
"i=0,j=1"
for (int j(0); j<5; j++) {
...
std::cout << "i=" << i <<
"i=0,j=4"
",j=" << j << std::endl;
j++ => j=5
}
5<5? NE
}
return 0;
} Izvršavanje bi se trebalo
nastaviti ovdje, no to je
kraj tijela i petlje
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
"i=0,j=0"
j++ => j=1
int main() {
1<5? DA
for (int i(0); i<5; i++) {
"i=0,j=1"
for (int j(0); j<5; j++) {
...
std::cout << "i=" << i <<
"i=0,j=4"
",j=" << j << std::endl;
j++ => j=5
}
5<5? NE
}
i++ => i=1
return 0;
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
"i=0,j=0"
j++ => j=1
int main() {
1<5? DA
for (int i(0); i<5; i++) {
"i=0,j=1"
for (int j(0); j<5; j++) {
...
std::cout << "i=" << i <<
"i=0,j=4"
",j=" << j << std::endl;
j++ => j=5
}
5<5? NE
}
i++ => i=1
return 0;
1<5? DA
}
Ugniježđene (višestruke) petlje
i=0
0<5? DA
j=0
0<5? DA
#include <iostream>
"i=0,j=0"
j++ => j=1
int main() {
1<5? DA
for (int i(0); i<5; i++) {
"i=0,j=1"
for (int j(0); j<5; j++) {
...
std::cout << "i=" << i <<
"i=0,j=4"
",j=" << j << std::endl;
j++ => j=5
}
5<5? NE
}
i++ => i=1
return 0;
1<5? DA
}
j=0
...
Primjer dvostruke petlje
Napraviti program koji na ekranu crta kvadrat dimenzija nxn sastavljen od znakova zvijezda (*), pri čemu je
n uneseno s tastature.
Strategija rješavanja problema
● Opšta strategija (inspirisana latinskom izrekom “zavadi pa vladaj”) glasi:

Ako imate složeni problem koji ne znate (isprve) riješiti, podijelite ga na jednostavnije probleme koje
znate riješiti.

● Čak i ako ne uspijete riješiti sve dijelove, barem imate nešto što je u praksi bolje od ništa.
Primjer dvostruke petlje
Napraviti program koji na ekranu crta kvadrat dimenzija nxn sastavljen od znakova zvijezda (*), pri čemu je
n uneseno s tastature.

● Podzadatak 1: Nacrtati 1 red sastavljen od n zvjezdica


○ Potrebno je da zadatak ispisa jedne zvjezdice ponovimo n puta

for (int i(0); i<n; i++) {


std::cout << "*";
}
Primjer dvostruke petlje
Napraviti program koji na ekranu crta kvadrat dimenzija nxn sastavljen od znakova zvijezda (*), pri čemu je
n uneseno s tastature.

● Podzadatak 1: Nacrtati 1 red sastavljen od n zvjezdica


○ Potrebno je da zadatak ispisa jedne zvjezdice ponovimo n puta
● Podzadatak 2: Ponoviti podzadatak 1 n puta
○ Sve što treba ponoviti n puta stavljamo u for petlju!

for (int i(0); i<n; i++) {


for (int i(0); i<n; i++) {
std::cout << "*"; GREŠKA: Ne možete u for
} petlji imati drugu for petlju s
} istom kontrolnom
promjenljivom
Primjer dvostruke petlje
Napraviti program koji na ekranu crta kvadrat dimenzija nxn sastavljen od znakova zvijezda (*), pri čemu je
n uneseno s tastature.

● Podzadatak 1: Nacrtati 1 red sastavljen od n zvjezdica


○ Potrebno je da zadatak ispisa jedne zvjezdice ponovimo n puta
● Podzadatak 2: Ponoviti podzadatak 1 n puta
○ Sve što treba ponoviti n puta stavljamo u for petlju!

for (int i(0); i<n; i++) {


for (int j(0); j<n; j++) {
std::cout << "*";
}
}
Primjer dvostruke petlje
Napraviti program koji na ekranu crta kvadrat dimenzija nxn sastavljen od znakova zvijezda (*), pri čemu je
n uneseno s tastature.

#include <iostream>

int main() {
int n; Unesite broj n: 3
std::cout << "Unesite broj n: "; *********
std::cin >> n;
for (int i(0); i<n; i++) {
for (int j(0); j<n; j++) {
std::cout << "*";
Nedostaje prelazak
}
u novi red
}
return 0;
}
Primjer dvostruke petlje
Napraviti program koji na ekranu crta kvadrat dimenzija nxn sastavljen od znakova zvijezda (*), pri čemu je
n uneseno s tastature.

#include <iostream>

int main() { Unesite broj n: 3


int n; ***
std::cout << "Unesite broj n: "; ***
std::cin >> n; ***
for (int i(0); i<n; i++) {
for (int j(0); j<n; j++) {
std::cout << "*";
}
std::cout << std::endl;
}
return 0;
}
Petlja while
● Petlja while koristi se kada nam nije unaprijed poznat broj izvršenja, ali nam je poznat neki uslov.

while (uslov)
tijelo

● while znači “sve dok” - sve dok je uslov ispunjen ponavljaj (tijelo).
● Kao ni for petlja, ni while se ne mora izvršiti nijednom ako uslov nije ispunjen već po ulasku u petlju.

int x(0);
while (x>2) {
std::cout << "Lozinka glasi...";
}
while vs. for
● Svaka for petlja može se prepraviti u while petlju i obrnuto

for (int i(0); i<n; i++) {


std::cout << "i je " << i <<
std::endl;
}
while vs. for
● Svaka for petlja može se prepraviti u while petlju i obrnuto

int i(0);
for (; i<n; i++) {
std::cout << "i je " << i <<
std::endl;
}
while vs. for
● Svaka for petlja može se prepraviti u while petlju i obrnuto

int i(0);
for (; i<n; ) {
std::cout << "i je " << i <<
std::endl;
i++;
}
while vs. for
● Svaka for petlja može se prepraviti u while petlju i obrnuto

int i(0);
while (i<n) {
std::cout << "i je " << i <<
std::endl;
i++;
}
while vs. for
● Svaka for petlja može se prepraviti u while petlju i obrnuto

for (A; B; C) { A;
D; while(B) {
} D;
C;
}
Primjer petlje while
sve dok = while

Napisati program koji omogućava korisniku da unosi brojeve i računa sumu tih brojeva sve dok suma ne
prekorači vrijednost 100.

● Pitanja:
- Šta je uslov petlje?
- Šta je tijelo petlje? suma<=100
unos broja
dodavanje na sumu
Primjer petlje while
Napisati program koji omogućava korisniku da unosi brojeve i računa sumu tih brojeva sve dok suma ne
prekorači vrijednost 100.

#include <iostream>

int main() {
int x, suma(0);
while (suma <= 100) {
std::cout << "Unesite broj: ";
std::cin >> x;
suma += x;
}
std::cout << "Suma je " << suma << std::endl;
return 0;
}
Beskonačna while petlja
● Petlja while je posebno pogodna za formiranje beskonačne petlje:

while (true) {
std::cout << "Beskonacna petlja" <<
std::endl;
}

● Analogno, sljedeća petlja se neće nikada izvršiti:


while (false) {
std::cout << "Ovo je beskorisno" <<
std::endl;
}
Petlja do-while
● Treba razlikovati petlje while i do-while!
● Petlja do-while se uvijek izvršava barem jednom, dok se petlja while (zavisno od uslova) ne mora izvršiti
nijednom.
do
tijelo
while (uslov);
● Primjer:

do {
x = x * x;
} while (x < n);
Primjer: provjera ispravnosti unosa
#include <iostream> GREŠKA: Promjenljiva
nije inicijalizirana
int main() {
int mjesec;
while (mjesec < 1 || mjesec > 12) {
std::cout << "Unesite
mjesec: ";
std::cin >> mjesec;
}
if (mjesec == 1) {
std::cout << "Januar";
}
...
return 0;
}
Primjer: provjera ispravnosti unosa
#include <iostream> Magična vrijednost

int main() {
int mjesec(0);
while (mjesec < 1 || mjesec > 12) {
std::cout << "Unesite
mjesec: ";
std::cin >> mjesec;
}
if (mjesec == 1) {
std::cout << "Januar";
}
...
return 0;
}
Primjer: provjera ispravnosti unosa
#include <iostream>

int main() {
int mjesec; Ok :)
do {
std::cout << "Unesite
mjesec: ";
std::cin >> mjesec;
} while (mjesec < 1 || mjesec >
12);
if (mjesec == 1) {
std::cout << "Januar";
}
...
return 0;
}
Primjer: provjera ispravnosti unosa
#include <iostream>

int main() {
int mjesec;
greska:
std::cout << "Unesite
mjesec: ";
std::cin >> mjesec;
if (mjesec < 1 || mjesec > 12)
goto greska;
if (mjesec == 1) { if petlja???
std::coutgoto
<< petlja???
"Januar";
}
...
return 0;
}
Petlja goto
● Svaku od opisanih petlji možemo realizirati i pomoću naredbe goto.
● Takvu petlju bismo mogli nazvati goto petlja, jer je naredba goto ta koja postiže da se kod ponavlja. To opet
nije if petlja :)
● Radi bolje čitljivosti i lakšeg razumijevanja programa bolje je koristiti odgovarajuću petlju:
○ Ako je broj ponavljanja unaprijed poznat (fiksan ili u nekoj promjenljivoj), koristiti for petlju.
○ Ako broj ponavljanja zavisi od nekog uslova koji se mijenja, koristiti while petlju.
○ Ako se petlja uvijek mora izvršiti bar jednom, koristiti do-while petlju.
○ Poznavanje različitih programskih struktura dugoročno vam olakšava programiranje i čini vas boljim
programerima!
Zadatak 7.1
Napisati program koji omogućava unos cijelog broja n, a zatim ispisuje broj n, pa polovinu tog broja
zaokruženu na manji broj (npr. ako je n=15, treba ispisati 7). Zatim ispisuje polovinu tog broja itd. dok ne
dođe do 1. Primjer: za n=15 treba ispisati: 15, 7, 3, 1.
Zadatak 7.2
Napisati program koji omogućava unos neograničeno mnogo realnih brojeva (unos se završava kada
korisnik unese broj 0). Zatim se na ekranu ispisuje koliko je uneseno brojeva koji su dvostruko veći od
prethodnog. Npr. ako korisnik unese brojeve:
1.1 2.2 3.3 4.4 3 6 12 9 0
program treba ispisati poruku: "Uneseni broj je 3 puta bio dvostruko veci od prethodnog".
SRETNO! 😄
Hvala na pažnji!

61

You might also like