Repeat....Until

Repeat Türkçe olarak "Tekrar" (burada "Tekrar et" amacindadir), Until ise "-e kadar" demektir (bir sey oluncaya kadar.. gibi). Repeat Until döngüsü de tahmin ettiginiz gibi sizin belirteceginiz bir sert dogru oluncaya kadar Repeat ile Until arasina yazacaginiz bütün komutlari tekrar tekrar basa giderek çalistirir. Ta ki until ile belirttiginiz sart dogru oluncaya kadar. Genel kullanimi:
Repeat
Islem 1
Islem 2
Islem 3
...
...
Until (sart);

sart olarak yine sonucu true ya da false olabilen her seyi verebilirsiniz. Mesela "Until 1=2" derseniz 1 hiçbir zaman 2'ye esit olmayacagina göre (ve dolayisiyla da sart yanlis olacagina göre) döngü sonsuza kadar gider. Simdi basit bir örnek program yapalim:
Program Repeat_dongusu;
Uses crt;
var
a:=longint;
begin clrscr;
a:=0;
repeat
a:=a+1;
writeln(a);
until a=100;
readln;
end. 

Gördügünüz gibi programimiz (goto ile yaptigimiza göre) birhayli kisaldi ve kolaylasti. Repeat..Until döngüsünü bir (ya da birkaç) sart gerkeçlesinceye kadar olan bir döngü kurmak için kullanacagimizi söylemistik. Mesela bir program yapalim. Bu program girilen sayinin karesini ekrana yazsin. Ta ki sayi yerine 1 girilene kadar. Yani 1 yazarsaniz program biter. Iste kodlari:
Program Filiz;
uses crt;
var
sayi:longint;
begin clrscr;
repeat
write('Bir Sayi Giriniz: ');Readln(sayi);
writeln('Karesi: ', sayi*sayi);
until sayi=1;
end. 

Yavas yavas döngülerin avantajlarini görüyoruz. Döngüsüz bu basit programi yapmak imkansizdir. Çok daha iyi örnekler verecegim ama bilmedigimiz komutlari kullanmak istemiyorum. En iyisi ögrendigimiz zaman kullanalim. Peki bir de 1 ile 10 arasindaki sayilarin karesini yazalim:
Program KARAKARTAL;
uses crt;
var
sayi:longint;
begin clrscr;
sayi:=1;
repeat
writeln('Sayi: ',sayi,' Karesi: ', sayi*sayi);
sayi := sayi + 1 ;
until sayi > 10;
end. 

Ayrica iç içe yine istediginiz kadar döngü kurabilirsiniz. Zaten Pascal'da (ve diger bütün programlama dillerinde) bu tip iç içe istediginiz her seyi yapabilirsiniz. Mesela iç içe 2 repeat until döngüsü kurarak 1 ile 10 arasindaki sayilarin birbirleri ile çarpimini yazdiralim. Yani ekrana çarpim tablosunu yazdiralim. Tabii alt alta yazinca ekrana sigmayacagindan her 10 sayida bir enter'a basilmasi gerekiyor:
Program canavar;
uses crt;
var
a,b:byte;
begin clrscr;
a:=0;
repeat
a:=a+1;
b:=0;
repeat
b:=b+1;
writeln(a:2,' x ',b:2,' = ',(a*b):3);
until b=10;
readln;
clrscr;
until a=10;
end. 

Gördügünüz gibi tam 100 tane çarpma ve sonucunu yazdirma islemini bu kadar kisa bir programla yapabiliyoruz. For döngüsünü anlatinca bundan daha da kisa olacak. Burada a'nin ve b'nin ilk degerleri 0 oluyor ve her döngüde bir artiriliyor. Ama 0 iken birsey yazilmiyor dikkat ederseniz. Ayrica a'nin degerinin her 1 artiriminda b'ninki 10 defa artirilip yaziliyor. a da 10 defa artirildigina göre toplam 100 islem yapiliyor. until b=10; komutundan sonraki readln; ve clrscr; ise a'nin her deger degistirmesinde enter'a basilmasini bekliyor ve ekrani temizliyor. Program ekrana çarpma islemlerini yazarken dikkat edin her ekranda a sabit, be degisiyor. Ama her ekran degistirilmesinde bu sefer a degisiyor ve b yine 1'den 10'a kadar degerler aliyor. Bu programin görsel olarak pek iyi olmadigini düsünüyorsaniz ve ilkokuldaki defterlerinizin arkasindaki çarpim tablolari gibi sütun sütun ve bütün çarpmalarin ayni ekranda olmasini istiyorsaniz biraz daha ugrasmaniz gerekecek. Bunun için (yani ekranda istedigimiz yere yazdirmak için) gotoxy komutunu kullanacagiz. Bu arada 10 sütunun da ekrana sigmayacagini göz önünde tutarsak bir de if kullanabiliriz. Neyse, iste program, yazin ve çalistirin:
Program Carpim_Tablosu;
uses crt;
var
a,b:byte;
begin clrscr;
gotoxy(27,1);write('Ç A R P I M T A B L O S U');
a:=0;
repeat
a:=a+1;
b:=0;
repeat
b:=b+1;
if a<=5 then gotoxy(a*16-15,b+2) else gotoxy((a-5)*16-15,b+13);
write(a:2,' x ',b:2,' = ',(a*b):3);
until b=10;
until a=10;
readln;
end.

Programimiz bir öncekine göre uzunluk olarak degismedi. Eminim siz çok daha uzun bir program bekliyordunuz. 2 komut çikardi, 1 komut ekledik. Ekledigimiz komut olan
if a<=5 then gotoxy(a*16-15,b+2) else gotoxy((a-5)*16-15,b+13);
komutuna bakalim. Eger diyor a 6'dan küçükse (yani 5'e esit veya 5'ten küçükse) a*16-15 numarali kolona, ve b+2 numarali satira, degilse (yani 5'den büyükse) (a-5)*16-15 numarali kolon ve b+13 numarali satira git. Bundan sonra da write ile oraya gerekli islemi yaziyoruz. Peki bu sayilari nasil belirledim? Ekranin 80 kolon ve 24 satir oldugunu söylemistik. Buna göre hesapladim. Birinci islem için kolon 1 olacak sekilde her islemde kolon numarasi 16 artsin dedim. Zaten a'nin 1 oldugu durumda a*16-15 sonucu 1, 2 oldugu durumda 17, 3 oldugu durumda 33... oluyor. a'nin ve b'nin bütün degerleri için yerine koyunca da ortaya düzgün bir tablo çikiyor. Eger tam olarak anlamadiysaniz elinize bir kagit ve kalem alin ve kendinizi bilgisayar, kagidi da ekran yerine koyun ve programin dedigi her seyi tek tek yapin. Çizdiginiz tablo ekrandaki ile ayni olacaktir.
Repeat döngüsüne son olarak digerlerinden daha basit bir örnek verelim ve diger döngülere geçelim:
Program dongumuz;
uses crt;
var
basilan_tus: char;
begin
clrscr;
repeat
writeln('Merhaba!!!! Çikmak için Escape tusuna basin...');
basilan_tus:=readkey;
until basilan_tus=#27;
end. 

Burada program çalisinca Esc hariç bir tusa basarsaniz ekrana sürekli ayni mesaj çikar. Esc'ye basinca da program sona erer. #27, ESC demektir. Klavyedeki her tusun (alt, ctrl ve shift hariç) bir kodu vardir. Mesela A'nin kodu #65, C'nin kodu #67, Enter tusunun kodu #13'tür. Bir programda writeln(#65); yazarsaniz ekrana A yazar. Yani basilan_tus:='A'; ile basilan_tus:=#65; aynidir. Bu repeat until döngüsünde de until'e sart olarak tusun escape'e (yani #27'ye) esit olup olmadigi kontrol ediliyor. Diger özel tuslarin (ok tuslari, delete, backspace, home.. vb) kodlarini toplu olarak verecegiz.

Hiç yorum yok:

Yorum Gönder