Угнежђено гранање
У задацима који следе користи се угнежђено гранање (наредбе гранања су наведене унутар тела ширих наредби гранања).
Елементи програмског језика
Уколико је потребно извршити гранање на основу неколико међусобно
искључујућих услова, то можемо да урадимо коришћењем
конструкције else-if
, која има следећи општи
облик:
if (uslov1)
naredba1else if (uslov2)
naredba2else if (uslov3)
naredba3...
else
naredbak
Приликом извршавања ове наредбе проверавају се редом услови
uslov1
, uslov2
итд. све док се не наиђе на
неки услов који је испуњен и чији се блок наредби извршава. Последња
else
ставка се извршава ако ниједан од услова није испуњен.
Тај део је опцион и не мора се навести.
Напоменимо да би на основу уобичајеног назубљивања наредби
if-else
кôд требало да буде назубљен на следећи начин:
if uslov1
naredba1else
if uslov2
naredba2else
if ...
...
else
naredbak
зато што је доња наредба if-else
угнежђена у горњу
if-else
наредбу и део је њене else
гране.
Ипак, else-if
конструкција се користи прилично често и
назубљује на горе приказани начин да би се нагласило да су све три гране
у њој равноправне.
Поменимо једну важну појаву познату као висеће else (енг. dangling else). Уколико имамо угнежђено гранање облика:
if (uslov1)
if (uslov2)
naredba1else
naredba2
поставља се питање за коју if
наредбу се везује
else
ставка: за прву или другу? С обзиром да преводилац не
може да погоди шта је програмер имао на уму, ово питање се регулише
правилом које гласи: еlse
ставка се везује за последњу
(дакле најближу) if
наредбу, те би у претходном случају
исправно форматирање било:
if (uslov1)
if (uslov2)
naredba1else
naredba2
Уколико желимо да постигнемо да се else
веже за прву
if
наредбу, то можемо постићи увођењем витичастих заграда и
одговарајућим груписањем:
if (uslov1) {
if (uslov2)
naredba1}
else
naredba2
Уколико је потребно извршити гранање на основу неких конкретних
вредности можемо искористити наредбу switch-case
која има
наредни облик:
switch (izraz) {
case vrednost_1:
;
naredbe_1break;
case vrednost_2:
;
naredbe_2break;
...
case vrednost_k;
;
naredbe_kbreak;
default:
;
naredbe_d}
Приликом извршавања ове наредбе, редом се проверава да ли је вредност
израза izraz
једнакa некој од наведених вредности. Уколико
израз има неку од наведених вредности, извршава се наредба (или блок
наредби) наведен након те вредности и након тога се излази из наредбе
switch-case
. Ако бисмо заборавили да наведемо ставку
break
онда би се извршиле све наредбе које одговарају
случају за дату вредност израза и након тога све наредне наредбе (за
вредности наведене након те у наредби switch-case
).
Последња ставка default
је опциона и означава случај када
израз није једнак ниједној од наведених вредности.
Ако је блок наредби које треба извршити исти за неке различите
вредности које су наведене унутар наредбе switch-case
, онда
се оне могу груписати на следећи начин:
switch (izraz) {
case vrednost_1: vrednost_2: vrednost_3:
;
naredbe_1break;
case vrednost_4: vrednost_5:
;
naredbe_2break;
default:
;
naredbe_d}
Израз чија се вредност тестира може бити целобројног типа, али и типа
bool
, типа string
и набројивог типа
enum
(о тим типовима биће више речи касније).
Угнежђено гранање
У задацима који следе користи се угнежђено гранање (наредбе гранања су наведене унутар тела ширих наредби гранања).
Елементи програмског језика
Уколико је потребно извршити гранање на основу неколико међусобно
искључујућих услова, то можемо да урадимо коришћењем
конструкције else-if
, која има следећи општи
облик:
if (uslov1)
naredba1else if (uslov2)
naredba2else if (uslov3)
naredba3...
else
naredbak
Приликом извршавања ове наредбе проверавају се редом услови
uslov1
, uslov2
итд. све док се не наиђе на
неки услов који је испуњен и чији се блок наредби извршава. Последња
else
ставка се извршава ако ниједан од услова није испуњен.
Тај део је опцион и не мора се навести.
Напоменимо да би на основу уобичајеног назубљивања наредби
if-else
кôд требало да буде назубљен на следећи начин:
if uslov1
naredba1else
if uslov2
naredba2else
if ...
...
else
naredbak
зато што је доња наредба if-else
угнежђена у горњу
if-else
наредбу и део је њене else
гране.
Ипак, else-if
конструкција се користи прилично често и
назубљује на горе приказани начин да би се нагласило да су све три гране
у њој равноправне.
Поменимо једну важну појаву познату као висеће else (енг. dangling else). Уколико имамо угнежђено гранање облика:
if (uslov1)
if (uslov2)
naredba1else
naredba2
поставља се питање за коју if
наредбу се везује
else
ставка: за прву или другу? С обзиром да преводилац не
може да погоди шта је програмер имао на уму, ово питање се регулише
правилом које гласи: еlse
ставка се везује за последњу
(дакле најближу) if
наредбу, те би у претходном случају
исправно форматирање било:
if (uslov1)
if (uslov2)
naredba1else
naredba2
Уколико желимо да постигнемо да се else
веже за прву
if
наредбу, то можемо постићи увођењем витичастих заграда и
одговарајућим груписањем:
if (uslov1) {
if (uslov2)
naredba1}
else
naredba2
Уколико је потребно извршити гранање на основу неких конкретних
вредности можемо искористити наредбу switch-case
која има
наредни облик:
switch (izraz) {
case vrednost_1:
;
naredbe_1break;
case vrednost_2:
;
naredbe_2break;
...
case vrednost_k;
;
naredbe_kbreak;
default:
;
naredbe_d}
Приликом извршавања ове наредбе, редом се проверава да ли је вредност
израза izraz
једнакa некој од наведених вредности. Уколико
израз има неку од наведених вредности, извршава се наредба (или блок
наредби) наведен након те вредности и након тога се излази из наредбе
switch-case
. Ако бисмо заборавили да наведемо ставку
break
онда би се извршиле све наредбе које одговарају
случају за дату вредност израза и након тога све наредне наредбе (за
вредности наведене након те у наредби switch-case
).
Последња ставка default
је опциона и означава случај када
израз није једнак ниједној од наведених вредности.
Ако је блок наредби које треба извршити исти за неке различите
вредности које су наведене унутар наредбе switch-case
, онда
се оне могу груписати на следећи начин:
switch (izraz) {
case vrednost_1: vrednost_2: vrednost_3:
;
naredbe_1break;
case vrednost_4: vrednost_5:
;
naredbe_2break;
default:
;
naredbe_d}
Израз чија се вредност тестира може бити целобројног типа, али и типа
bool
, типа string
и набројивог типа
enum
(о тим типовима биће више речи касније).