You are on page 1of 68

C++

Grananje
8. dio

(c) S.utalo i D.Grundler, 2005.

Grananje

Tijek programa katkad ovisi o ulaznim podacima


ili o meurezultatima obrade.

Struktura kod koje se ovisno o stanju podataka


odvija jedan od moguih dijelova (grana)
programa, naziva se grananje.

(c) S.utalo i D.Grundler, 2005.

Grananje

Kao primjer grananja moe posluiti ovaj zadatak.

Treba izraunati i ispisati


apsolutnu vrijednost broja
kojeg upie korisnik.

Treba uoiti da redoslijed izvravanja naredbi ovisi o


ulaznom podatku.
(c) S.utalo i D.Grundler, 2005.

Dijagram tijeka grananja

Dijagram toka
grananja za
raunanje apsolutne
vrijednosti broja.

(c) S.utalo i D.Grundler, 2005.

Blok naredbi

Dijelovi programa koji se uvjetno izvode


objedinjavaju se u blokove naredbi.

Blokovi naredbi se piu uvueno (zbog


preglednosti).

(c) S.utalo i D.Grundler, 2005.

Blok naredbi

Svaki se blok naredbi omeuje parom


otvorena-zatvorena vitiasta zagrada (osim
sluaja kada se blok sastoji od samo jedne
naredbe, tada se zagrade mogu izostaviti).

(c) S.utalo i D.Grundler, 2005.

Blok naredbi

Ako se varijable deklariraju unutar bloka,


vidljive su samo unutar bloka u kome su
deklarirane i u glavnoj funkciji ne postoje.

Varijable deklarirane unutar bloka nazivaju se


lokalne i mogu zakloniti istoimene varijable
prethodno deklarirane izvan bloka.
(Zbog toga unutar bloka nije uputno deklarirati varijable
istog imena kakvo je koriteno izvan bloka jer to moe
izazvati zabunu.)
(c) S.utalo i D.Grundler, 2005.

Primjer 34

Zadatak (varijabla deklarirana unutar bloka):

Treba deklarirati cjelobrojnu varijablu x unutar zasebnog


bloka, pa joj pridruiti vrijednost. Pokuati ispisati vrijednost
te varijable u glavnoj funkciji.
Ispis neka bude oblika:

Upisi cijeli broj u bloku:


Vrijednost varijable iz bloka x=....

(c) S.utalo i D.Grundler, 2005.

Primjer 34
BLOK

(c) S.utalo i D.Grundler, 2005.

#include<iostream>

Primjer 34

using namespace std;


int main()
{
{
int x;
cout<<endl<<"Upisi cijeli broj u bloku:";
cin>>x;
}
cout<<endl<<"Vrijednost varijable iz bloka x="
<<x<<endl;;
return 0;
}
(c) S.utalo i D.Grundler, 2005.

10

Primjer 34

Pri pokuaju prevoenja bit e prijavljena


pogreka.

Varijable deklarirane unutar bloka vidljive su


samo unutar tog bloka. U glavnoj funkciji
varijabla x ne postoji. Zato se pri prevoenju
javlja pogreka.
(c) S.utalo i D.Grundler, 2005.

11

Naredbe grananja

Struktura grananja se moe ostvariti


naredbama:

if (if else, if else if - else),

switch case.

(c) S.utalo i D.Grundler, 2005.

12

Grananje naredbom if

Naredba if omoguava uvjetno grananje


programa.

Daljnji tijek programa ovisi o ispunjenju


uvjeta navedenog iza kljune rijei if.

Uvjet (logiki izraz) se upisuje unutar para


okruglih zagrada.

Na kraju naredbe if ne stavlja se znak ;

(c) S.utalo i D.Grundler, 2005.

13

Naredba if osnovni oblik

(c) S.utalo i D.Grundler, 2005.

14

Naredba if osnovni oblik


if (logiki izraz)
1 {
blok naredbi
0 }
naredba iza bloka

Ako je vrijednost
logikog izraza
istina (1), izvodi
se blok naredbi
koji se nalazi iza
naredbe if.

Ako je vrijednost logikog izraza


neistina (0), blok se preskae i
izvoenje se nastavlja od prve
naredbe iza bloka.
(c) S.utalo i D.Grundler, 2005.

15

Primjer 35

Zadatak (osnovni oblik naredbe if):

Treba unijeti cijeli broj pa provjeriti da li je negativan ili


pozitivan. U oba sluaja ispisati apsolutnu vrijednost broja.
Ispis neka bude oblika:

Upisi broj:
Broj...je.... Njegova apsolutna vrijednost
je....

(c) S.utalo i D.Grundler, 2005.

16

Primjer 35

Primjer e biti rijeen pomou dvije if naredbe.

Ako je (a < 0) izvrit e se blok naredbi nakon if


naredbe.

Ako uvjet nije zadovoljen, blok naredbi nakon


prve if naredbe se preskae i izvoenje
programa se nastavlja od prve naredbe iza
bloka.

(c) S.utalo i D.Grundler, 2005.

17

Primjer 35

Prva naredba iza bloka je provjera drugog


uvjeta (a > 0).

Ako nije ispunjan niti prvi niti drugi uvjet (tj. ako
je a = 0), blok naredbi nakon druge if naredbe
se preskae i izvoenje programa se nastavlja
od naredbe iza drugog bloka.

(c) S.utalo i D.Grundler, 2005.

18

Primjer 35

1. BLOK
1

1
0
1
0
2. BLOK
(c) S.utalo i D.Grundler, 2005.

19

#include<iostream>
using namespace std;
int main()
{
int a;
cout<<"Upisi broj:";
cin>>a;
if(a<0)
{
cout<<"Broj "<<a<<" je negativan. Njegova apsolutna \
vrijednost je "<<-a<<endl;
}
if(a>0)
{
cout<<"Broj "<<a<<" je pozitivan. Njegova apsolutna \
vrijednost je "<<a<<endl;
}
return 0;
}

(c) S.utalo i D.Grundler, 2005.

Primjer 35

20

Primjer 35

Za (a < 0):

Za (a > 0):

(c) S.utalo i D.Grundler, 2005.

21

Primjer 35

Ako nije ispunjen ni prvi ni drugi uvjet, program


se prekida.
(a = 0)

(c) S.utalo i D.Grundler, 2005.

22

Grananje dvije neovisne grane

(c) S.utalo i D.Grundler, 2005.

23

Grananje dvije neovisne grane


if (logiki izraz)
1
0

prvi blok naredbi


else
drugi blok naredbi
naredba iza bloka

Ako je vrijednost logikog


izraza istina (1), izvodi se
prvi blok naredbi. Po
njegovom zavretku
izvoenje se nastavlja od
prve naredbe iza drugog
bloka.

Ako je vrijednost logikog izraza


neistina (0), preskae se prvi blok i
izvodi se drugi blok naredbi (iza
else). Nakon toga se izvode naredbe
kako slijede.
(c) S.utalo i D.Grundler, 2005.

24

Primjer 36

Zadatak (oblik naredbe if else):

Treba unijeti cijeli broj razliit od 0 pa provjeriti je li


negativan ili pozitivan. U oba sluaja ispisati apsolutnu
vrijednost broja.

Ispis neka bude oblika:

Upisi broj razlicit od 0:


Broj...je....Njegova apsolutna vrijednost
je....

(c) S.utalo i D.Grundler, 2005.

25

Primjer 36

Primjer je rijeen uz pomo if else naredbe.

Uneseni broj mora biti razliit od 0.

Ako je (a < 0) izvrit e se prvi blok naredbi.

Ako a nije manje od 0, preskae se prvi blok i


izvodi se drugi blok naredbi.

(c) S.utalo i D.Grundler, 2005.

26

Primjer 36

1. BLOK

2. BLOK

(c) S.utalo i D.Grundler, 2005.

27

#include<iostream>
using namespace std;
int main()
{
int a;
cout<<"Upisi broj razlicit od 0:";cin>>a;
if(a<0)
{
cout<<"Broj "<<a<<" je negativan. Njegova apsolutna\
vrijednost je "<<-a<<endl;
}
else
{
cout<<"Broj "<<a<<" je pozitivan. Njegova apsolutna\
vrijednost je "<<a<<endl;
}
return 0;
}

(c) S.utalo i D.Grundler, 2005.

Primjer 36

28

Primjer 36

Za (a < 0):

Ako uvjet nije ispunjen:

(c) S.utalo i D.Grundler, 2005.

29

Primjer 36 dopuna

to ako korisnik ne proita uputu paljivo, pa


unese broj 0?

Rezultat nee biti ispravan:


Broj 0 je pozitivan. Njegova .....

Stoga bi bilo dobro izbjei takvu situaciju.

Ako korisnik unese nulu, neka dobije


upozorenje, pa neka ponovi unos broja koji e
zadovoljiti postavljeni uvjet.
(c) S.utalo i D.Grundler, 2005.

30

Primjer 36 goto

Da bi se program mogao nastaviti od


odabranog programskog retka (u ovome sluaju
od naredbe unosa broja), potrebna je
odgovarajua naredba koja e to i omoguiti.

Naredba goto je naredba bezuvjetnog skoka


(omoguava nastavak programa od odabranog
programskog retka).

(c) S.utalo i D.Grundler, 2005.

31

Naredba goto

Opi oblik je:


goto ime_oznake;

ime_oznake je simboliki naziv odabranog


programskog retka od kojeg se program eli
nastaviti.

(c) S.utalo i D.Grundler, 2005.

32

Naredba goto

Simboliki se naziv stavlja ispred naredbe na


koju se eli "skoiti" (preusmjeriti program). Iza
simbolikog naziva dolazi znak dvotoka (:).

Naredba na koju se eli skoiti moe se nalaziti


bilo gdje.
Naredba goto najee smanjuje razumljivost i
preglednost kda pa ju nije preporuljivo rabiti.

(c) S.utalo i D.Grundler, 2005.

33

Primjer 36 dopuna

(c) S.utalo i D.Grundler, 2005.

34

Primjer 36

#include<iostream>
using namespace std;
int main()
{

dopuna

int a;
upis:cout<<"Upisi broj razlicit od 0:";cin>>a;
if(a==0)
{
cout<<"Pogresan unos. Ponovi!"<<endl;

dopuna

goto upis;
}
if(a<0)
{ .

.
.
.

(c) S.utalo i D.Grundler, 2005.

35

Primjer 36 dopuna

Za a == 0

(c) S.utalo i D.Grundler, 2005.

36

Ulanena if naredba

Blokovi if naredbi se mogu ulaniti.

0
0

if (logiki izraz 1)
1
prvi blok naredbi
else if (logiki izraz 2)
1
drugi blok naredbi
.....
else
zadnji blok naredbi
(c) S.utalo i D.Grundler, 2005.

37

Ulanena if naredba

Ako je vrijednost logikog izraza1 logika istina (1), izvodi


se prvi blok naredbi. Po njegovom zavretku izvoenje se
nastavlja od prve naredbe iza zadnjeg bloka naredbi.

Ako vrijednost logikog izraza1 nije logika istina (0),


provjerava se vrijednost logikog izraza2 i ovisno u
njegovoj vrijednosti izvodi se drugi blok naredbi ili se
program nastavlja iza njega.

Ako niti jedna vrijednost logikih izraza nije logika istina


izvodi se zadnji blok naredbi iza naredbe else.
(c) S.utalo i D.Grundler, 2005.

38

Primjer 37

Zadatak (oblik ulanene naredbe if):

Primjer 36 treba dopuniti tako da se u sluaju unesene nule


ispie odgovarajua poruka.

Ispis neka bude oblika:


Upisi broj:
Broj...je....Njegova apsolutna vrijednost
je....
ili
Unio si 0. Apsolutna vrijednost od 0 je 0.

(c) S.utalo i D.Grundler, 2005.

39

Primjer 37

1
1

(c) S.utalo i D.Grundler, 2005.

40

Primjer 37a
#include<iostream>
using namespace std;
int main()
{
int a;
cout<<"Upisi broj:";cin>>a;
if (a==0)
{
cout<<"Unio si 0. Apsolutna vrijednost od 0 je 0. " <<endl;
}

(c) S.utalo i D.Grundler, 2005.

41

Primjer 37b
else if (a<0)
{
cout<<"Broj "<<a<<" je negativan. Njegova apsolutna \
vrijednost je "<<-a<<endl;
}
else
{
cout<<"Broj "<<a<<" je pozitivan. Njegova apsolutna \
vrijednost je "<<a<<endl;
}
return 0;
}

(c) S.utalo i D.Grundler, 2005.

42

Primjer 37

Ako se unese 0, poruka e biti:

U ostalim sluajevima, provjera je ista kao u


primjeru 36.

(c) S.utalo i D.Grundler, 2005.

43

Ugnjeivanje if naredbi

Mogue je ugnjeivati if naredbe jedne unutar


drugih.

Ugnjeivanje e biti prikazano na sljedeem


primjeru.

(c) S.utalo i D.Grundler, 2005.

44

Primjer 38

Zadatak (oblik ugnjeenih naredbi if):

Treba upisati cijeli broj razliit od 0. Treba provjeriti je li broj


vei ili manji od 100, te je li paran ili neparan.

Ispis neka bude oblika:

Upisi broj:
Uneseni broj je ... od 100 i ....

(c) S.utalo i D.Grundler, 2005.

45

Primjer 38

Vanjska if naredba provjerava je li broj vei ili


manji od 100.

Ako se unese broj 100, ispisuje se


odgovarajua poruka.

Unutarnje if naredbe (neovisno o tome je li broj


vei ili manji od 100) provjeravaju parnost broja.

Parnost se provjerava operatorom modulo


(ostatak dijeljenja sa 2 se usporeuje sa 0).
(c) S.utalo i D.Grundler, 2005.

46

ugnjeeni
if

Primjer
38

ugnjeeni
if

vanjski if

(c) S.utalo i D.Grundler, 2005.

47

#include<iostream>

Primjer 38

using namespace std;


int main()
{
int a;
cout<<"Upisi broj razlicit od 0:";cin>>a;
if (a<100)
{
cout<<"Uneseni broj je manji od 100 i ";
if (a%2==0)
cout<<" paran je."<<endl;
else
cout<<" neparan je."<<endl;
}

(c) S.utalo i D.Grundler, 2005.

48

Primjer 38
else if
{
cout<<"Uneseni broj je veci od 100 i ";
if (a%2==0)
cout<<" paran je."<<endl;
else
cout<<" neparan je."<<endl;
}
else
{
cout<<"Unesen je broj 100, on je paran<<endl;
}
return 0;
}
(c) S.utalo i D.Grundler, 2005.

49

Primjer 38

Provjera

(c) S.utalo i D.Grundler, 2005.

50

Uvjetna naredba kratki oblik

Ako su uvjet (logiki izraz) i naredbe blokova


kratki, umjesto if else naredbi moe se rabiti
skraeni oblik zapisa.

(logiki izraz) ? (1. blok naredbi) : (2. blok naredbi)


Ovaj se oblik koristi kada logiki izraz i naredbe blokova
stanu u jedan redak.
(c) S.utalo i D.Grundler, 2005.

51

Uvjetna naredba kratki oblik


if (a<0)
cout<<-a;
else

(a<0)?(cout<<-a):(cout<<a)

cout<<a;

(c) S.utalo i D.Grundler, 2005.

52

Primjer 39

Zadatak (uvjetna naredba skraenog oblika):

Treba unijeti cijeli broj razliit od 0 pa ispisati apsolutnu


vrijednost broja.

Ispis neka bude oblika:

Upisi broj:
Apsolutna vrijednost je....

(c) S.utalo i D.Grundler, 2005.

53

Primjer 39

(c) S.utalo i D.Grundler, 2005.

54

Primjer 39
#include<iostream>
using namespace std;
int main()
{
int a;
cout<<"Upisi broj:";
cin>>a;
(a<0)?(cout<<"Apsolutna vrijednost je
<<-a):(cout<<"Apsolutna vrijednost je "<<a);
return 0;
}

(c) S.utalo i D.Grundler, 2005.

55

Grananje naredbom switch

Naredba switch case omoguava


viestruko grananje.

Iza naredbe switch dolazi cjelobrojni izraz u


zagradi.

Rezultat cjelobrojnog izraza je cjelobrojna


konstanta. Ovisno o vrijednosti konstante
izvodi se odgovarajui blok naredbi (grana).

(c) S.utalo i D.Grundler, 2005.

56

switch case (opi oblik)

(c) S.utalo i D.Grundler, 2005.

57

switch (cjelobrojni izraz)


{
case (1. konstanta):
prvi blok naredbi

switch
(opi oblik)

break;
case (2. konstanta):
drugi blok naredbi
break;
.........
default:
zadnji blok naredbi
}
(c) S.utalo i D.Grundler, 2005.

58

switch (opi oblik)

Prvo se izraunava vrijednost cjelobrojnog


izraza u zagradi (to je postavljeni uvjet).

Zatim se dobivena vrijednost izraza (konstanta)


usporeuje s nizom zadanih konstanti.

Ako je dobivena vrijednost izraza jednaka bilo


kojoj od zadanih konstanti izvrava se blok
naredbi pridruen toj konstanti.

Po zavretku bloka naredba break oznaava


izlaz iz swith case bloka.
(c) S.utalo i D.Grundler, 2005.

59

switch (opi oblik)

Ako dobivena vrijednost izraza nije jednaka niti


jednoj od zadanih konstanti, izvrava se blok
naredbi pridruen default naredbi.

Cjelokupni switch case blok zapisuje se


unutar para otvorena-zatvorena vitiasta
zagrada.

(c) S.utalo i D.Grundler, 2005.

60

Primjer 40

Treba izraunati ukupni otpor za otpore R1 i R2 ovisno o


tome jesu li spojeni serijski ili paralelno.

Ispis neka bude oblika:

Otpor R1 (u omima):
Otpor R2 (u omima):
Za serijski spoj otpora upisi 1, a za
paralelni 2:
Ako se otpori od ... oma i ... oma spoje
u ... ukupni je otpor ... oma.

(c) S.utalo i D.Grundler, 2005.

61

Primjer 40

Rabi se naredba grananja switch case.

Postoje dvije grane (jedna za serijski spoj (1),


druga za paralelni (2) ).

Ovisno o tome to korisnik upie (broj 1 ili broj


2) izvrit e se jedna od dvije grane.

U sluaju da korisnik unese vrijednost koja nije


1 ili 2, ispisat e se upozorenje.

(c) S.utalo i D.Grundler, 2005.

62

Primjer
40

(c) S.utalo i D.Grundler, 2005.

63

Primjer 40a

#include<iostream>
using namespace std;
int main()
{
float R, R1,R2;
int i;
cout<<"Otpor R1 (u omima):";
cin>>R1;
cout<<"Otpor R2 (u omima):";
cin>>R2;

cout<<"Za spoj otpora u seriju upisi 1, a za paralelu 2:";


cin>>i;

(c) S.utalo i D.Grundler, 2005.

64

Primjer 40b

switch (i)
{
case 1:
R=R1+R2;

cout<<"Ako se otpori od "<<R1<<" oma i "<<R2


<<" oma spoje u seriju ukupni je otpor "
<<R<<" oma."<<endl;
break;
case 2:
R=(R1*R2)/(R1+R2);
cout<<"Ako se otpori od "<<R1<<" oma i "<<R2
<<" oma spoje u paralelu ukupni je otpor "
<<R<<" oma."<<endl;
break;

(c) S.utalo i D.Grundler, 2005.

65

Primjer 40c

default:
cout<<"Pogresan unos. Unesi 1 ili 2"<<endl;
}
return 0;
}

(c) S.utalo i D.Grundler, 2005.

66

Primjer 40

Provjera:

(c) S.utalo i D.Grundler, 2005.

67

Primjer 40

Ako se ne upie broj 1 ili 2 ispisat e se ova


poruka:

(c) S.utalo i D.Grundler, 2005.

68

You might also like