| POČETNA STRANICA | SURADNICI | PROJEKTI | NASTAVA |
 
Vježba 6: 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:

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



Objašnjenje: Funkcija subplot(m,n,p) služi nam za «dijeljenje» ekrana na mxn dijelova, s tim da parametar «p» naznačava trenutno aktivni dio u kojem se crta naznačeni graf. Zadatak se može riješiti i korištenjem funkcije «hold on», tako da dobijemo 8 grafova na jednom koordinatnom sustavu preko čitavog ekrana

>> x=-1:0.05:1
>>for n=1:8
plot(x, sin(n*pi*x)), hold on
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

Fibonaccijev niz započinje brojevima 0 i 1, a svaki slijedeći dobiva se zbrajanjem prethodna dva člana niza. Pokažite grafički da navedeni niz teži prema (sqrt(5)+1)/2.=1.618. Najbolje bi bilo snimiti M-file sa naredbama:


hold off
F(1)=0; F(2)=1;
for i=3:20
F(i)=F(i-1)+F(i-2);
end
plot(1:18, F(3:20)./F(2:19),'o')
hold on
plot(1:18, F(3:20)./F(2:19),'r-')
plot([0 20], (sqrt(5)+1)/2*[1,1],'--')

Kao rezultat dobije se:



Primjer 4:

Za zadatak iz primjera 2 nacrtajte samo pozitivni dio krivulje:

for x=-1:0.01:1
i=round(101+x*100); if sin(pi*x)>0
y(i)=sin(pi*x);
else
y(i)=0;
end
end
plot(1:201,y(1:201),'r--')





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. Nacrtajte graf funkcija cos(n*pi*x) na intervalu –1<=x<=1 (korak=0.05) za n=1 do 8. Svi grafovi moraju biti na jednom ekranu u zasebnim prozorima!

3. Napišite program koji grafički predstavlja vrijednosti pogreške koju definiramo kao razliku između odgovarajućih kvocijenata uzastopnih članova u Fibonacci-jevom nizu i vrijednosti prema kojoj ti kvocijenti teže (sqrt(5)+1)/2.=1.618!