Processing math: 100%

MPZI_predavanje_12

1313 days ago by fresl

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=xmaxxminn1   i   hy=ymaxyminm1.

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.

Logički operatori imaju niži prioritet od relacijskih. Između njih pak not ima najviši prioritet, a or najniži.
       
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:

  • izraz  not ex  je istinit ako i samo ako podizraz ex nije istinit:
  ex     not ex  
T F
F T
  • izraz  ex1 and ex2  je istinit ako i samo ako su istinita oba podizraza ex1 i ex2:
  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
  • izraz  ex1 == ex2  je istinit ako i samo ako oba podizraza imaju istu istinosnu vrijednost:
  ex1     ex2     ex1 == ex2  
T T T
T F F
F T F
F F T
  •  izraz  ex1 != ex2  je istinit ako i samo ako je istinit jedan i samo jedan od podizraza ex1 i ex2:
  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:

  • uvjetno izvođenje,
  • grananje (u užem smislu) i
  • višestruko grananje. 

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,j0  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,j0,  pripadnoj komponenti matrice B pridružit ćemo vrijednost 1;  zapisano pomalo nalik na naredbu if:

       ako je  ai,j0,  onda :

                bi,j1

Ako je pak  ai,j=0bi,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,
And sorry I could not travel both
And be one traveler, long I stood
And looked down one as far as I could
To where it bent in the undergrowth;

Then took the other...

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:

  • bi,j=1  ako je  ai,j0  i
  • bi,j=1  ako je  ai,j<0.

Dakle:

       ako je  ai,j0,  onda :

               bi,j1

       a inače :

               bi,j1               

       
       

 

 

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

  • bi,j=1  ako je  ai,j>0,
  • bi,j=0  ako je  ai,j=0  i
  • bi,j=1  ako je  ai,j<0.

Ili, bliže zapisu naredbe if:

       ako je  ai,j>0,  onda :

               bi,j1

       inače, ako je  ai,j=0 onda :

               bi,j0

        a inače :

               bi,j1               

Ili, promjenom redoslijeda uvjetâ:

       ako je  ai,j>0,  onda :

               bi,j1

       inače, ako je  ai,j<0 onda :

               bi,j1

        a inače :

               bi,j0               

       
       

 

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):