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.004307 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.000473 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