Az IF ... THEN parancs, feltételes utasítás-végrehajtás
Gyakran elõfordul, hogy programunkban valamilyen feltételtõl függõen szeretnénk utasítást végrehajtani. Ha a feltétel teljesül, akkor végrehajtjuk az utasítást, ha nem akkor annak végrehajtása nélkül folytatjuk a program végrehajtását. Megyek haza, kulcsra zárva az ajtó, kikulcsolom és nyitom, megyek be, mint ahogy terveztem. A feltételes utasítás végrehajtás egy kitérõ a programban, de persze nagyon fontos kitérõ is lehet, mely nélkül nem megy tovább a program.
Tehát az utasítás végrehajtást egy feltételes mondathoz hasonlóan szervezzük meg. Ha a levegõ hõmérséklete kisebb mint 0, akkor írd ki hogy fagyott! Ha Péter elõbb született mint Pál, akkor legyen Péter a szóvivõ, mert õ az idõsebb. Egy programbéli példával élve, akkor szeretnénk végrehajtani valamilyen utasítást, ha az i változó értéke nagyobb mint 5. (Vegyük észre, hogy a mondatainknak nincs különben ága.) A feltételes utasítás végrehajtás általános formája mondatszerû leírással:
Ha feltétel akkor
Utasítás
Elágazás vége
A Pascal nyelvben pedig:
if fetétel then parancs;
A mi példánkban (ha i nagyobb mint 5) ez így nézne ki:
if i>5 then parancs;
A feltételben bármilyen két azonos típusú kifejezést összehasonlíthatunk (pl. az i+1-et a j+5-tel). A kifejezések összehasonlítására használhatjuk a <, >, =, <=, >=, <> (nem egyenlõ) jeleket, melyek igaz/hamis (true/false) logikai értékeket adnak vissza. Ha ez a logikai érték igaz (true), akkor a parancs végrehajtódik.
A logikai értékeket összekapcsolhatjuk az AND (és), OR (vagy), NOT (nem), XOR (kizáró vagy) mûveletekkel. Így egyszerre több feltételt is vizsgálhatunk. Ilyenkor a feltételeket, amelyeket összekapcsoljuk, zárójelbe tesszük.(nálam kötelezõ zárójelbe rakni a teljes feltételt is KIL) Pl. ha azt szeretnénk, hogy a parancsunk csak akkor hajtódjon végre, ha az i változó értéke nagyobb mint 5 és egyidejûleg a k változó értéke egyenlõ 7-tel:
if ( (i>5) and (k=7) ) then parancs;
Természetesen itt is, egyszerre több parancsot is végrehajthatunk a feltételen belül. Ekkor a parancsokat a begin ... end; közé rakjuk. (mindig így begin end-el kell használnod KIL)
if feltétel then
begin
parancs1;
parancs2;
parancsN;
end;
A teljes If utasítást egy sorba csak kellõ gyakorlottság után írd, és még nagyobb gyakorlottság esetén hagyhatod el a begin end párt egy utasítás alkalmazása esetén az igaz ágon. (De ne hibázz!)
Az elágazás, vagy más néven szelekció egy másik alkalmazási példájaként vegyük a következõ feladatot! Döntsük egy számról, kisebb-e mint 100? Íme a kód:
Program Elagazas; { Programunk neve. }
Uses crt; { Crt unit csatolása. }
var szam : Integer; { Változó deklarálása (létrehozása). }
BEGIN { Fõprogram kezdete. }
ClrScr;
Write('Add meg a számot: ');
ReadLn(szam); { Bekérjük a számot. }
if (szam<100) then { Ha kisebb 100-nál akkor }
begin
Write('Ez a szám kisebb mint 100.');
end
ReadKey;
END. { Fõprogram vége. }
(Az elágazást nálam soha nem írhatod meg begin end alkalmazása nélkül! KIL)
Példaprogram az elágazásra. Ez a program az egyágú kiválasztást mutatja be. A feladat egy számról eldönteni, hogy páros vagy páratlan. A feladatot a szám 2-vel történõ maradékos osztásával oldjuk meg.
program ifthen;
var Deklarációk
szam:byte;
begin FÕPROGRAM
Write(’Add meg a számot’);
ReadLn(szam); Értékadás a szám változónak
if szam mod 2=0 then Ha a szám 2-vel osztva maradéka 0 akkor
begin Blokk kezdete
write('A szam paros'); Írd ki ....
end; Blokk vége
if szam mod 2=1 then Ha a szám és 2 maradéka 1 akkor
begin Blokk kezdete
write('A szam paratlan'); Írd ki .....
end; Blokk vége
ReadLn; Enter leütésére vár
end. FÕPROGRAM VÉGE
Feladat: Készítsünk programot, amely bekér három pozitív egész számot, és kiírja õket nagyság szerint növekvõ sorrendben!
Megoldás: A programban a három szám tárolására 3 numerikus változót fogunk használni (a, b, c). Ezeket cserélgetéssel sorba fogjuk rakni úgy, hogy az a változóban legyen a legkisebb szám, a b-ben a középsõ és a c-ben a legnagyobb szám. A cserékhez egy x segédváltozót használunk. Tehát a kívánt sorrend a<b<c. A cserét akkor kell két szám között elvégezni ha rossz sorrendben vannak. Tehát pl. a és b cseréjére akkor kerül sor, ha a>b, mert a jó sorrend az elõírás szerint a<b kell legyen.
program Pelda19;
var a,b,c,x:integer;
begin
write('Kerem az elso szamot: ');
ReadLn(a);
write('Kerem a masodik szamot: ');
ReadLn(b);
write('Kerem a harmadik szamot: ');
ReadLn(c);
if (a>b) then begin
x:=a;
a:=b;
b:=x;
end;
if (a>c) then begin
x:=a;
a:=c;
c:=x;
end;
if (b>c) then begin
x:=b;
b:=c;
c:=x;
end;
write('A harom szam novekvo sorrendben: ');
WriteLn(a,' < ',b,' < ',c);
end.
A késõbbiekre való tekintettel az IF utáni feltételeket igyekezzünk zárójelbe tenni.
Feladat: Készítsünk programot, amely bekér egy mondatot, majd kiírja, hogy hány nagybetû van benne.
Megoldás: Egy karakterrõl úgy is el tudjuk dönteni, hogy nagybetû-e, hogy megnézzük nagyobb vagy egyenlõ-e mint 'A' és egyben kisebb vagy egyenlõ-e mint 'Z'. Ha ez igaz, akkor a karakter A-tól Z-ig van, tehát egy nagybetû. Fogunk használni még egy nagydb nevû változót, amely a nagybetûk számát fogja számolni. A megszámlálás tételével késõbb fogunk részletesen foglalkozni.
program Pelda20;
var s:string;
i,nagydb:integer;
begin
write('Irj be egy mondatot: ');
ReadLn(s);
nagydb:=0;
for i:=1 to length(s) do
begin
if (s[i]>='A') and (s[i]<='Z') then
begin
inc(nagy);
end;;
end;
WriteLn('A mondatban ',nagy,' darab nagy betu van.');
end.
A programunkban használtunk egy új eljárást, az inc() eljárást (increase). Ez az eljárás növeli a változó értékét 1-gyel, tehát az inc(nagy) helyett írhattuk volna ezt is: nagy:=nagy+1.
Hasonlóan létezik egy eljárás, amely csökkenti a változó értékét eggyel, ez a dec() vagyis decrease.