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 $[x_{\min}, x_{\max}]\times [y_{\min}, y_{\max}]$.
Područje ćemo prekriti mrežom vertikalnih i horizontalnih pravaca. Vertikalni pravci (pravci usporedni s osi $y$) međusobno su udaljeni za $h_x$, a horizontalni pravci (usporedni s osi $x$) za $h_y$, pri čemu su
$h_x \,=\, \dfrac{x_{\max} - x_{\min}}{n - 1}$ i $h_y \,=\, \dfrac{y_{\max} - y_{\min}}{m - 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 $h_x$; na početku svakoga retka jednaka je $x_{\min}$. U prvom/nultom retku koordinata $y$ jednaka je $y_{\min}$, a pri prijelazu u svaki sljedeći redak povećava se za $h_y$.
|
|
![]() |
|
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 $h_y$. U prvom/nultom stupcu koordinata $x$ bit će jednaka $x_{\min}$, a pri prijelazu u svaki sljedeći redak povećavat će se za $h_x$. Na početku svakoga stupca koordinata $y$ bit će jednaka $y_{\min}$.
|
|
![]() |
|
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 $\mathbf{A}$ kao rezultat dati matricu $\mathbf{B}$ istih dimenzija, pri čemu je $b_{i,j} = 1$ ako je $a_{i,j} \ne 0$ i $b_{i,j} = 0$ ako je $a_{i,j} = 0$.
Matricu $\mathbf{B}$ ćemo konstruirati funkcijom zero_matrix() pa će ona na početku biti nul–matrica, dakle, matrica popunjena nulama. Matricom $\mathbf{A}$ prolazit ćemo po recima. Ako je $a_{i,j} \ne 0$, pripadnoj komponenti matrice $\mathbf{B}$ pridružit ćemo vrijednost $1$; zapisano pomalo nalik na naredbu if:
ako je $a_{i,j} \ne 0$, onda :
$b_{i,j} \leftarrow 1$
Ako je pak $a_{i,j} = 0$, $b_{i,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 $\tau$.
I obratno, „realni” se broj smatra različitim od nule ako je po apsolutnoj vrijednosti veći od odabrane vrijednosti $\tau$:
|
![]() |
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 $\mathbf{B}$ istih dimenzija kao zadana matrica $\mathbf{A}$, a komponente su joj:
Dakle:
ako je $a_{i,j} \ge 0$, onda :
$b_{i,j} \leftarrow 1$
a inače :
$b_{i,j} \leftarrow -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 $\mathbf{B}$ mogu biti i
Ili, bliže zapisu naredbe if:
ako je $a_{i,j} > 0$, onda :
$b_{i,j} \leftarrow 1$
inače, ako je $a_{i,j} = 0$, onda :
$b_{i,j} \leftarrow 0$
a inače :
$b_{i,j} \leftarrow -1$
Ili, promjenom redoslijeda uvjetâ:
ako je $a_{i,j} > 0$, onda :
$b_{i,j} \leftarrow 1$
inače, ako je $a_{i,j} < 0$, onda :
$b_{i,j} \leftarrow -1$
a inače :
$b_{i,j} \leftarrow 0$
|
![]() |
Kako je matrica $\mathbf{B}$ na početku popunjena nulama, pridruživanje $b_{i,j} = 0$ ako je $a_{i,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):
|
![]() |
|