Case ... Of

Eger simdiye kadar anlamadiginiz birsey yoksa ve kendiniz de biraz örnek yaptiysaniz artik baya bir Pascal biliyorsunuz demektir. Simdiye kadar iyi bir program yapamamamizin sebebi daha döngülere girmememizden kaynaklaniyor. if kalibini anlattik ama Pascal'da sadece karar verme komutu if degildir. Bir de Case-of deyimi var ki bazi durumlarda if'e göre çok daha kisa kod ile ayni isi yapmanizi saglar. Ayrica kullanimi da çok basittir. Mesela bir degiskenimiz var ve bu degiskenin aldigi 10 tane degisik deger için 10 ayri islem yaptirmak istiyoruz. Bunu if ile yapmak hem çok uzun olur hem de hata yapma sansimiz yüksek olur. Ama Case of kullanirsak çok daha anlasilir ve kisa yapabiliriz. Case'in genel kullanimi söyledir:
Case degisken of
deger 1 : islem 1;
deger 2 : islem 2;
deger 3 : islem 3;
...
...
End;

Tabii yine if'de (ve Pascal'in heryerinde) oldugu gibi birden çok islem yaptiracaksak begin ile and arasina aliriz. Sunun gibi:
Case degisken of
deger 1 : begin
islemler...
end;
deger 2 : begin
islemler...
end;
...
...
end;

Ayrica birden çok deger için bir islem yapilacaksa söyle kullanilir:
Case degisken of
deger 1, deger 2, deger 3 : islem 1;
deger 4 : islem 2;
deger 5, deger 6 : islem 3;
...
...
End;

Simdi güzel bir program yapalim. Kullanicidan bir sayi istesin ve ekranda bir menü olsun. Seçime göre belirli islemler yapilsin. Programi yazmaya baslayalim:
Program SF;
Uses Crt;
Label
en_bas;
var
sayi:longint;
secim:char;
cikis:boolean;
begin clrscr;
cikis:=false;
write('1 ile 1000 arasi bir sayi giriniz: ');readln(sayi);
en_bas:
clrscr;
gotoxy(30,8);write('::: Menü :::');
gotoxy(30,10);write('[1] Sayinin Karesini yaz');
gotoxy(30,11);write('[2] Sayinin Karekökünü yaz');
gotoxy(30,12);write('[3] Sayinin Kübünü yaz');
gotoxy(30,13);write('[4] Programdan çik');
gotoxy(20,18);write('Seçiminizin önündeki sayiya basiniz');
gotoxy(30,15);write('Seçiminiz: ');
secim:=readkey;
case secim of
'1': begin
clrscr;
gotoxy(30,10);
write(sayi,'''nin Karesi= ',sayi*sayi);
secim:=readkey;
end;
'2': begin
clrscr;
gotoxy(30,10);
write(sayi,'''nin Karekökü= ',sqrt(sayi):10:4);
secim:=readkey;
end;
'3': begin
clrscr;
gotoxy(30,10);
write(sayi,'''nin Kübü= ',sayi*sayi*sayi);
secim:=readkey;
end;
'4': cikis:=true;
end; {Case'in sonu}
if (not cikis) then goto en_bas;
clrscr;
writeln('Güle Güle... ');
end. 

Gördügünüz gibi secim:=readkey; komutuyla bir tusa basilmasini bekliyor ve case secim of ile de bu tusun '1', '2', '3' veya '4' olmasi durumunda yapilacak islemler belirtiliyor. '4' olmasi durumunda cikis:=true ile cikis isimli boolean degiseknin degeri true oluyor. if (not cikis) then goto en_bas; ile de eger cikis'in degeri false ise (ki '4'e basilmadikça hep false olur, çünkü programin basinda false yaptik) en_nas; labelinin oldugu yere gidiyor. Dolayisiyla da true olunca programdan çikilmis oluyor. Artik programlarimizda menü yapmaya da bir örnek vermis olduk. Tabii hareketli menü yapmayi da anlatacagiz ama o daha çok ilerde.. Bu örnek karisik geldiyse konunun daha iyi anlasilmasi için basit bir örnek daha yapalim:
Program FS;
Uses Crt;
var
sayi:longint;
begin clrscr;
write('Bir Sayi Giriniz: ');readln(sayi);
case sayi of
0..9: writeln('Bu sayi 1 basamaklidir');
10..99: writeln('Bu sayi 2 basamaklidir');
100..999: writeln('Bu sayi 3 basamaklidir');
else writeln('Bu sayi 3''den çok basamaklidir');
end;{Case'in sonu}
end. 

Burda case ile birlikte else'in de kullanimini gördük. Eger case ile belirttigimiz hiçbir sart dogru degilse bir islem yapmasini isteyebiliriz. Bu durumda bütün sartlarin sonuna else.. koyariz. Yine case kullanirken iki nokta üst üste (:) isaretinin soluna araya virgül koyarak birden çok sart da koyabilirsiniz.
case sayi of
13, 17, 4, 10, 9: writeln('Bu sayi benim sevdigim sayilardan birisidir!');
else writeln('Bu sayilari hiç sevmem :(');
end;

gibi.. Case komutunu genelde bir degiskenin birden çok sonucuna göre farkli islemler yaptirmak istediginizde kullanabilirsiniz. Dikkat etmeniz gereken case degisken of kalibinda belirttiginiz degisken ile alabilecegi degerlerin ayni tipte olmasidir. Yani degisken sayi tipindeyse herhalde degeri 'D' olamaz! Ya da char tipindeyse degeri 5 olamaz, '5' olabilir. Ikisinin arasindaki farki anlatmistim. Önceki sayi, sonraki karakterdir.
Pascal'da (ve diger bütün programlama dillerinde) iç içe istediginiz kadar if kullanabilirsiniz. Mesela:
if a>b then begin
if a=0 then writeln('B 0''dan küçük');
if b=0 then writeln('A 0''dan büyük');
end;

gibi olabilir. Ya da asagidaki 3 if deyimi ayni isi yapar:
1)if a>1 then begin
if a<7 then writeln('A degiskeninin degeri 1 ile 7 arasindadir.');
end;

2)
if a>1 then if a<7 then writeln('A degiskeninin degeri 1 ile 7 arasindadir.');
3)
if (a>1) and (a<7) then writeln('A degiskeninin degeri 1 ile 7 arasindadir.');
Programci siz oldugunuza göre (ve amaç problemi en basit ve kisa yoldan çözmek olduguna göre) hangisini kullanacaginiza karar vermek size kalmis. 2. örnekte if a>1 then ifadesinden sonraki mavi yazili yerin tamami bir komuttur. Bunu daha önceden söylemistik. Öyleyse then'den sonraki komut bu olabilir. Burada iç içe iki if kullanilmistir.

Hiç yorum yok:

Yorum Gönder