Vježba 5: Algoritmi. Petlje. Uvjetne naredbe.




Algoritmi. Petlje. Uvjetne naredbe.

Za potrebe riješavanja različitih zadataka najprije moramo definirati algoritam kao skup nedvosmislenih, izvedivih koraka koji zatim interpretiramo koristeći se nekim programskim jezikom. Bez obzira koji programski jezik koristimo, analizom različitih algoritama došlo se do zaključka da za predstavljanje algoritma moramo koristiti slijedeće semantičke strukture:

- za odabir jedog od dva (ili više) mogućih odgovora
o if (uvjet)
    then (aktivnost1)
    else (aktivnost2)

- za ponavljanje iste vrste aktivnosti dok se ne postigne zadani uvjet
o while (uvjet)
    do (aktivnost)

- što je ponekad zgodnije izraziti tzv. for petljom ako je unaprijed poznat broj iteracija
o for (pocetak-kraj)
    do (aktivnost)

Sve navedene semantičke strukture moguće je koristiti i u MATLABU na način opisan kroz slijedeće primjere:

for petlje

for petlje omogućavaju da se grupa naredbi ponavlja unaprijed određeni broj puta. Opći oblik for petlje je

for x = array
   naredbe...
end

naredbe između for i end izvršavaju se jednom za svaki stupac u array. Na primjer

Primjer 1.: Nacrtajte graf funkcija sin(n*pi*x) na intervalu –1<=x<=1 (korak=0.05) za n=1 do 8. Svi grafovi moraju biti na jednom ekranu.

>> x=-1:0.05:1
>>for n=1:8
subplot (4,2,n), plot(x, sin(n*pi*x))
end




Osim automatski generiranog polja 1:10 može se primjeniti bilo koje polje, npr.

>> data=[3 9 45 6; 7 16 -1 5];
>> for n=data
   y=n(1)-n(2)
end

y =
   -4
y =
   -7
y =
   46
y =
   1

Pored ovih mogučnosti, for petlja može biti ugnjezđena jedna u drugoj.

while petlja

Kod while petlje naredbe između while i end izvršavaju se sve dok su svi elementi izraz-a istiniti:
>> while izraz
   naredbe...
end


Primjer 2: Pronađite najveći n za koji je vrijednost sume

12+22+32+....+n2 <100


>>S=1; n=1;
>>while S+(n+1)^2<100
   n=n+1; S=S+n^2;
  end;
>>[n, S]

ans =
6 91

if-else-end struktura


Često želimo izvrštiti neke operacije pod uvjetom da su zadovoljeni određeni uvjeti. To nam omogućava if-else-end struktura. Forma ove strukture u općem slučaju je

if izraz1
   naredbe1 ... izvršene ako je izraz1 istinit
elseif izraz2
   naredbe2 ... izvršene ako je izraz2 istinit
elseif izraz3
   naredbe3 ... izvršene ako je izraz3 istinit
elseif ...
   naredbe4 ... izvršene ako je izraz4 istinit
...
else
   naredbe ...izvršenee ako nijedan izraz nije istinit
end

Pri izvršavanju ove strukture provjerava se izraz1, pa izraz2, ... ukoliko je neki od tih izraza istinit izvršavaju se pripadajuće naredbe - narebe1, naredbe2, naredbe3, ... . Ako nijedan od izraza nije istinit izvršavaju se naredbe iza else. Završni dio strukture else ne mora se uvjek primjeniti.

switch-case struktura

Ova je struktura pogodna u slučaju kada je potrebno više puta ispitivati istinitost izraza a na osnovu jednog argumenta. Forma ove strukture je

switch izraz
   case test_izraz1
      naredbe1...
   case test_izraz2
      naredbe2...
   otherwise
      naredbe3
end

Ovdje izraz mora biti skalar ili znakovna varijabla. Ukoliko je test_izraz1 isinit izvršavaju se naredbe1, a ukoliko taj izraz nije istinit prelazi se na testiranje izraza test_izraz2 i ako je on isinit izvršavaju se naredbe2, a ako ne (dakle nije istinit ni test_izraz1 ni test_izraz2) izvršavaju se naredbe3. Pokažimo to na jednostavnom primjeru

% primjer za 'switch-end' strukturu
x=2.7; % velicinu u cm
units='m' % zelim pretvoriti u 'units'
switch units
   case {'inch','in'}
      y=x*2.54;
   case {'feet','ft'}
      y=x*2.54*12;
   case {'meter','m'}
      y=x/100;
   case {'milimeter','mm'}
      y=x*10;
   case {'centimeter','cm'}
      y=x;
   otherwise
      disp(['Nepoznata jedinica:', units])
   y=nan;
  end
Izvršavanjem ovog primjera dobijamo konačnu vrijednost
y=0.027.


    Zadaci na vježbi
  1. Napišite program koji pronalazi najveći zajednički djelitelj dvaju pozitivnih cijelih brojeva!

    Eulerov algoritam:
    x=veći ulaz
    y=manji ulaz
    while( y nije 0) do
    (ostatak = ono sto ostane pri cjelobrojnom dijelenju x i y
    x=y
    y=ostatak
    )
    Rezultat =x
  2. Kreirajte m file koji generira slučajan vektor od 10 elemenata u intervalu od [0,100], te kao rezultat ispisuje novi vektor sastavljen od članova slučajnog vektora ispisanih po veličini.


  3. (Uputa: slučajan stupčasti vektor sa elementima u intervalu [0,1] generira se naredbom rand(m,1) gdje je m broj članova vektora)

  4. Napišite funkiciju koja prima matricu i znak (+ ili -) te ako je znak '+' vraća elemente matrice uvećane za 1, a ako je znak '-' vraća elemente matrice umanjene za 1.
    Napomena: koristiti switch-case strukturu.