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 jefor 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
-
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 - 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.
- 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.
(Uputa: slučajan stupčasti vektor sa elementima u intervalu [0,1] generira se naredbom rand(m,1) gdje je m broj članova vektora)
