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).