Petlje (2) i grananja
Ugniježđene ili višestruke petlje
Popunjavanje matrice vrijednostima funkcije dviju varijabli
Napisat ćemo programsku funkciju koja će konstruirati matricu koja ima m redaka i n stupaca te je popuniti vrijednostima funkcije f varijabli x i y na pravokutnomu (ili kvadratnom) području [xmin,xmax]×[ymin,ymax].
Područje ćemo prekriti mrežom vertikalnih i horizontalnih pravaca. Vertikalni pravci (pravci usporedni s osi y) međusobno su udaljeni za hx, a horizontalni pravci (usporedni s osi x) za hy, pri čemu su
hx=xmax−xminn−1 i hy=ymax−yminm−1.
Broj je horizontalnih pravaca m, a broj vertikalnih n, pa je broj sjecišta pravaca mreže jednak broju komponenata matrice. Vrijednosti funkcije f u sjecištima jednoga horizontalnog pravca sa svim vertikalnim pravcima bit će komponente jednoga retka matrice.
Matricu ćemo popunjavati po recima, pa će „vanjska” petlja ići „po recima”, a „unutarnja” po komponentama pojedinih redaka, odnosno po sjecištima pojedinih redaka sa stupcima (tako da se obično kaže da unutarnja petlja ide „po stupcima”):
U svakom je retku koordinata y konstantna, dok se koordinata x povećava za hx; na početku svakoga retka jednaka je xmin. U prvom/nultom retku koordinata y jednaka je ymin, a pri prijelazu u svaki sljedeći redak povećava se za hy.
|
|
![]() |
![]() ![]() |
Matricu možemo popunjaviti i po stupcima:
Vanjska je petlja pritom po „stupcima”, a unutarnja „po recima”. Tada će pri popunjavanju vrijednostima funkcije f u svakom stupcu koordinata x biti konstantna, dok će se koordinata y povećavati za hy. U prvom/nultom stupcu koordinata x bit će jednaka xmin, a pri prijelazu u svaki sljedeći redak povećavat će se za hx. Na početku svakoga stupca koordinata y bit će jednaka ymin.
|
|
![]() |
![]() ![]() |
Relacijske i logičke operacije
Relacijski se izrazi primjenjuju za usporedbe dviju vrijednosti ili za ispitivanje pripadnosti „skupu”. Svi su relacijski operatori, naravno, binarni.
Operatori usporedbe su == (jednako), != (nije jednako), < (manje), > (veće), <= (manje ili jednako) i >= (veće ili jednako). Naglašavamo da je operator ispitivanja jednakosti ==, a ne =. Operandi izraza usporedbe su aritmetički izrazi.
Operatori pripadanja su in (u) i not in (nije u). Operand s lijeve strane operatora pripadanja je aritmetički izraz, dok je operand zdesna „skup”.
Vrijednosti su relacijskih izraza logičke vrijednosti True i False.
Relacijski operatori imaju niži prioritet od aritmetičkih.
True True |
True True |
True True |
True True |
False False |
False False |
True True |
Logički izrazi nastaju primjenom unarnoga logičkog operatora not (negacija) i binarnih operatora and (i) i or ((uključivi) ili) na relacijske ili na (jednostavnije) logičke izraze. Vrijednosti su logičkih izraza logičke, True i False.
Izraz not ex je istinit ako i samo ako podizraz ex nije istinit.
Izraz ex1 and ex2 je istinit ako i samo ako su istinita oba podizraza ex1 i ex2.
Izraz ex1 or ex2 je istinit ako i samo ako je istinit barem jedan od podizraza ex1 i ex2.
False False |
True True |
True True |
False False |
False False |
Pseudologički izrazi nastaju primjenom relacijskih operatora na relacijske izraze. Drugim riječima, relacijski operatori preuzimaju ulogu logičkih operatora: == (ako i samo ako) i != (isključivi ili, ili–ili, kao u aut Caesar aut nihil). Pseudologički izrazi poprimaju, naravno, logičke vrijednosti.
Izraz ex1 == ex2 je istinit ako i samo ako oba podizraza imaju istu istinosnu vrijednost.
Izraz ex1 != ex2 je istinit ako i samo ako je istinit jedan i samo jedan od podizraza ex1 i ex2.
True True |
False False |
True True |
Vrijednosti logičkih i pseudologičkih operacija često se prikazuju tablicama istinitosti:
ex | not ex |
T | F |
F | T |
ex1 | ex2 | ex1 and ex2 |
T | T | T |
T | F | F |
F | T | F |
F | F | F |
izraz ex1 or ex2 je istinit ako i samo ako je istinit barem jedan od podizraza ex1 i ex2:
ex1 | ex2 | ex1 or ex2 |
T | T | T |
T | F | T |
F | T | T |
F | F | F |
ex1 | ex2 | ex1 == ex2 |
T | T | T |
T | F | F |
F | T | F |
F | F | T |
ex1 | ex2 | ex1 != ex2 |
T | T | F |
T | F | T |
F | T | T |
F | F | F |
False False |
True True |
False False |
True True |
Grananja if
Grananja su upravljačke strukture koja omogućavaju odabir naredbe ili niza naredaba koji će biti—ili neće biti—izvedeni. Mogu se razlikovati:
Grananja se u programima najčešće ostvaruju naredbom if.
Uvjetno izvođenje
U uvjetnomu će izvođenju naredba ili niz naredaba biti izvedeni ako i samo ako je ispunjen zadani uvjet; u protivnom će biti „preskočeni”.
Opći je oblik naredbe if za uvjetno izvođenje:
if uvjet :
niz naredaba
|
ispred if-a u if-u iza if-a ispred if-a u if-u iza if-a |
ispred if-a iza if-a ispred if-a iza if-a |
Od nule različite komponente matrice
Kao primjer, napisat ćemo programsku funkciju koja će za zadanu matricu A kao rezultat dati matricu B istih dimenzija, pri čemu je bi,j=1 ako je ai,j≠0 i bi,j=0 ako je ai,j=0.
Matricu B ćemo konstruirati funkcijom zero_matrix() pa će ona na početku biti nul–matrica, dakle, matrica popunjena nulama. Matricom A prolazit ćemo po recima. Ako je ai,j≠0, pripadnoj komponenti matrice B pridružit ćemo vrijednost 1; zapisano pomalo nalik na naredbu if:
ako je ai,j≠0, onda :
bi,j←1
Ako je pak ai,j=0, bi,j može zadržati vrijednost 0, što znači da ne treba ništa učiniti.
|
|
![]() |
|
Nekoliko smo već puta naglasili da, zbog pogrešaka zaokruživanja u aritmetičkim operacijama, ispitivanje jednakosti „realnih” brojeva operatorom == nije uvijek smislen način njihova uspoređivanja:
|
![]() |
![]() |
|
Umjesto ispitivanja je li broj jednak nuli, treba ispitati je li po apsolutnoj vrijednosti dovoljno malen da se može zanemariti, pri čemu se „dovoljno malen” definira s pomoću odabrane točnosti τ.
I obratno, „realni” se broj smatra različitim od nule ako je po apsolutnoj vrijednosti veći od odabrane vrijednosti τ:
|
![]() |
Grananje u užem smislu
Two roads diverged in a yellow wood, R. Frost |
Grananje u užem smislu odabir je jedne od dviju mogućih „grana” daljnjega izvođenja programa: bit će izvedena jedna od dvije naredbe ili jedan od dva niza naredaba, ovisno o tome je li zadani uvjet ispunjen ili ne.
Oblik je naredbe if za grananje u užem smislu:
if uvjet :
niz naredaba ‚onda’
else :
niz naredaba ‚inače’
Ako je uvjet ispunjen, onda će se izvesti niz naredaba nazvan „onda”, a inače—dakle, ako uvjet nije ispunjen—bit će izveden niz naredaba nazvan „inače”.
|
ispred if-a u if-u, uvjet zadovoljen iza if-a ispred if-a u if-u, uvjet zadovoljen iza if-a |
ispred if-a u if-u, uvjet nije zadovoljen iza if-a ispred if-a u if-u, uvjet nije zadovoljen iza if-a |
Predznaci komponenata matrice (1)
Rezultat je funkcije koja slijedi matrica B istih dimenzija kao zadana matrica A, a komponente su joj:
Dakle:
ako je ai,j≥0, onda :
bi,j←1
a inače :
bi,j←−1
|
![]() |
Višestruko grananje
Pri višestrukom se grananju izvodi jedna od nekoliko mogućih naredaba ili jedan od nekoliko mogućih nizova naredaba.
Primjenom naredbe if višestruko se grananje ostvaruje kao niz uzastopnih grananja:
if prvi uvjet :
prvi niz naredaba
elif drugi uvjet :
drugi niz naredaba
...
else :
n-ti niz naredaba
Pritom grana else nije obvezna.
|
ispred if-a u if-u, -1 iza if-a ispred if-a u if-u, -1 iza if-a |
ispred if-a u if-u, 2 iza if-a ispred if-a u if-u, 2 iza if-a |
ispred if-a u if-u, sve ostalo iza if-a ispred if-a u if-u, sve ostalo iza if-a |
|
ispred if-a u if-u, -1 iza if-a ispred if-a u if-u, -1 iza if-a |
ispred if-a u if-u, 2 iza if-a ispred if-a u if-u, 2 iza if-a |
ispred if-a iza if-a ispred if-a iza if-a |
Predznaci komponenata matrice (2)
Budući da nula nije ni pozitivna ni negativna, komponente matrice B mogu biti i
Ili, bliže zapisu naredbe if:
ako je ai,j>0, onda :
bi,j←1
inače, ako je ai,j=0, onda :
bi,j←0
a inače :
bi,j←−1
Ili, promjenom redoslijeda uvjetâ:
ako je ai,j>0, onda :
bi,j←1
inače, ako je ai,j<0, onda :
bi,j←−1
a inače :
bi,j←0
|
![]() |
Kako je matrica B na početku popunjena nulama, pridruživanje bi,j=0 ako je ai,j=0 nije potrebno, ali grananje ipak nije grananje u užem smislu (if ... else ...). Potrebno je višestruko grananje, ali s jednom „praznom” granom (odnosno, bez grane else):
|
![]() |
|