Negyedik labor
Contents
Ciklusszervezés
for ciklus
for futó index= vektor parancsblokk end
Felhasználhatjuk például a for ciklust a legnagyobb elem kiválasztására:
v=linspace(1,6); maximum=v(1); for i=2:100 if maximum<v(i) maximum=v(i); end end maximum
maximum = 6
Viszont vektorok létrehozására kifejezetten lassú
tic %stopert indít for i=1:100000 nemtuljo(i)=i; end toc %megmondja mennyi ideig futott
Elapsed time is 0.004559 seconds.
ezért használjuk a múlt órán megismert : operátort amikor csak lehet
tic jobb=1:100000; toc
Elapsed time is 0.000306 seconds.
Valójában a for ciklus változója sem kötelezõ, hogy számok számtani sorozata legyen, lehet bármilyen elõre definiált vektor.
v=[ 1 6 2 9 4 6]; for i=v i end
i = 1 i = 6 i = 2 i = 9 i = 4 i = 6
while ciklus
while feltétel igaz parancsblokk end
i=0;% nincs saját futó indexe, ha szükség van rá nekünk kell lérehozni while i<10 i=i+1; end % CTRL+C hatására megszakítja a számítást
Például ennek segítségével megkereshetjük az elsõ 0 elem pozicióját egy vektorban
v=[1 3 2 5 8 0 5 2 7]; i=1; while v(i)~=0 i=i+1; end fprintf('Az elsõ 0 poziciója: %d \n', i)
Az elsõ 0 poziciója: 6
Sajnos ebbõl végtelen ciklus lesz, ha nincs benne 0. Egy lehetséges javítás
v=[1 4 2 8 5 79 8]; i=1; while i<=length(v) && v(i)~=0 i=i+1; end fprintf('Az elsõ 0 poziciója: %d \n', i)
Az elsõ 0 poziciója: 8
Bár nem kerül végtelen ciklusba, de rossz eredmény ad. Ez egy szemantikai hiba. Ezt a problémát is megoldva:
v=[1 4 2 8 5 79 8]; i=1; while i<=length(v) && v(i)~=0 i=i+1; end if i<=length(v) fprintf('Az elsõ 0 poziciója: %d \n', i) else fprintf('Nincs a vektorban 0 elem\n') end
Nincs a vektorban 0 elem
Break, return és continue használata
a break hatására megszakítja a ciklust, így az elõbbi programunk:
v=[1 3 2 5 8 0 5 2 7]; i=1; while v(i)~=0 if i>=length(v) break end i=i+1; end if i<=length(v) fprintf('Az elsõ 0 poziciója: %d \n', i) else fprintf('Nincs a vektorban 0 elem\n') end
Az elsõ 0 poziciója: 6
A continue hatására átugorja a hátralévõ parancsokat, és a következõ iterációval folytatja. Mind a break, mind a continue csak a belsõ ciklusból ugrik ki egymásba ágyazott ciklusok esetén.
A return parancsot nem csak ciklus belsejében adhatjuk ki,hanem egy függvényen belül bárhol. Hatására a Matlab megszakítja a függvény futását és kilép.
Órai feladatok
1. feladat: Írjunk olyan függvényt, amelynek bemenete egy A mátrix, és kimenetként listázza azon elemek pozícióját amely nagyobbak, mint a két indexük összege.
function ki=nagyElem(bematrix) ki=[]; for i=1:size(bematrix,1) for j=1:size(bematrix,2) if bematrix(i,j)>i+j ki=[ki; i,j]; end end end
3. feladat: Írjunk egy olyan függvényt, melynek bemenete egy v vektor. A kimenet legyen egy olyan vektor, melyben v elemei helyett 0-k szerepelnek addig, amíg el nem érünk az első 100-nál nagyobb elemhez v-ben. Onnan pedig v elemei legyen benne változtatás nélkül.
function ki=nullaz(v) ki=v; k=1; while k<=length(v) if v(k)>100 break end ki(k)=0; k=k+1; end
Házi feladatok
2.feladat: Írjunk olyan függvényt, amely egy bemenetként kapott v vektor első 6-nál nagyobb elemének pozicióját adja kimenetként. Ha nincs ilyen elem, akkor a kimenet értéke legyen -1.
function ki=nagye(v) ki=-1; i=1; while i<=length(v) if v(i)>6 ki=i; return end i=i+1; end
4. feladat: Írjunk olyan reciprokOsszeg(n) nevű függvényt, amelynek kimenete a legkisebb olyan k pozitív egész, melyre az 1 + 1/2 + 1/3 + · · · + 1/k összeg nagyobb, mint a bemenetként kapott pozitív n szám. Ha 10^5 -nél is több tag kellene, akkor a kimenet legyen −1.
function ki=reciprokOsszeg(n) ki=-1; osszeg=0; for i=1:10^5 osszeg=osszeg+1/i; if osszeg>n && ki==-1, ki=i; end end