A while ciklus

A múlt órán tanultuk a for ciklust ami egy olyan ciklus ami előre meghatározott alkalommal fut le (pl végiglépked egy vektor elemein). Most a while ciklussal ismerkedünk meg. A while ciklus formája:

while feltétel ciklusmag end

A ciklusmagot addig fogja végrehajati amíg a feltétel igaz. Sokszor kellhet használni olyan ciklusokat, amikről előre (a program megírásának pillanatában) nem tudjuk, hogy meddig fog futni. Ilyen például ha keresünk valamit.

Contents

Közösen megnézett példa

Írjunk olyan függvényt ami bemenetként kap egy vektort, végiglépked az elemein, megkeresi az első negatív számot és kiadja annak pozícióját.

function pozicio=negativKereso(bv)
    megvan=false;
    i=1;
    while ~(megvan)
       if bv(i)<0
           megvan=true;
       else
           i=i+1;
       end
    end
    pozicio=i;
end

Teszteljük a függvényünket!

v=[1,2,-1,4,5,7]
v =

     1     2    -1     4     5     7

negativKeresoPre(v)
ans =

     3

Látjuk, hogy tényleg megtalálta az első helyet. De mi van ha nincs benne negatív szám?

v(3)=0
v =

     1     2     0     4     5     7

negativKeresoPre(v)
Index exceeds the number of array elements (6).

Error in negativKeresoPre (line 5)
       if bv(i)<0

Sajos hibával áll le. Nyliván nem jó ha egy függvény hibával áll le, orvosoljuk:

function pozicio=negativKereso(bv)
    megvan=false;
    i=1;
    while ~(megvan)&(i<=length(bv)) 
       if bv(i)<0
           megvan=true;
       else
           i=i+1;
       end
    end
    pozicio=i;
 end
negativKereso(v)
ans =

     7

Most már lefut, de olyan indexet ad vissza ami egyel több mint a vektor hossza. Módosítduk, úgy hogy legyen a visszatérő érték negatív ha nincs benne negatív szám

function pozicio=negativKereso(bv)
    megvan=false;
    i=1;
    while ~(megvan)&(i<=length(bv)) 
       if bv(i)<0
           megvan=true;
       else
           i=i+1;
       end
    end
    if megvan
    pozicio=i;
    else
        pozicio=-1;
        disp("Nem volt benne negativ szam")
    end
end

Így már jól fut le

Első Feladat

Írjunk függvényt ami kiírja, hogy "Nyomj Y-t, hogy leálljak" majd az "input()" paranccsal bekér egy értéket. Ha Y-t kap leáll, ha nem újraindul.

type('beker.m')
function beker
    folytatja=true
    while folytatja
        x=input("Nyomj Y-t, hogy lealljak: ",'s')
        if x=='Y'
            folytatja=false
        end
    end
end

Második feladat (for ciklus ismétlése)

Írjunk olyan függvényt ami bemenetként kap egy mátrixot, végiglépked az elemein, és ha az aktuális eleme kisebb mint indexei négyzetösszege akkor azt a poziciot kiírja (vagy listát készít róla).

type('kisebbMintNegyzetOsszeg.m')
function lista=kisebbMintNegyzetOsszeg(M)
    [sor,oszlop]=size(M)
    lista=[]
    for i=1:sor
        for j=1:oszlop
            if M(i,j)<i^2+j^2
                lista=[lista;i,j]
            end
        end
    end
end

Házi feladat

Írjunk olyan függvényt ami bemenetként kap egy vektort. Végiglépked az elemein és ha vektoroban negatív számot talál akkor kinullázza a vektort a következő negtív elemig (amit szintén kinulláz).

Első megoldás:

function v=kinullaz(v)
    i=1;
    h=length(v);
    while i<=h
        if v(i)<0
            v(i)=0;
            i=i+1;
            while (i<=h)&&(v(i)>=0)
                v(i)=0;
                i=i+1;
            end
            if i<=h
                v(i)=0;
            end
        else
            i=i+1;
        end
    end
end

Második megoldás:

function v=kinullaz(v)
    nullamod=false;
    for i=1:length(v)
        if v(i)<0
            v(i)=0;
            nullamod=~nullamod;
        end
        if nullamod
            v(i)=0;
        end
    end
end

Harmadik megoldás

function v=kinullaz(v)
    for i=1:length(v)
        if v(i)<0
            v(i)=0;
            step=1;
            while (i+step)<=length(v)&&v(i+step)>=0
                v(i+step)=0;
                step=step+1;
            end
            if (i+step)<length(v)
                v(i+step)=0;
            end
        end
    end
end

Bónusz Házi feladat

Írjunk függvényt ami kiírja, hogy "Válassz I/N:" majd az "input()" paranccsal bekér egy értéket. Ha 'I'-t kap igaz legyen e függvény kimenete, ha 'N'-t akkor hamis, ha egyik sem akkor újraindul(megint kiír, megint bekér).