gotoxy etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
gotoxy etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Gotoxy Komutu

Simdiye kadar yaptigimiz programlarda hep ekranin sol üst kösesinden baslayarak bilgileri yazdirdik. Ancak sizin de akliniza "Yahu bu ekranin istedigimiz yerine bir seyler yazdiramaz miyiz?" sorusunuz geldigini tahmin ediyorum. Pascal'da ekranin istenilen yerine gitmek için gotoxy komutu kullanilir. "Gitmek" ten kastim imleci istenilen yere götürmektir. Zaten ekrana write ile bir seyler yazarken imlecin bulundugu yerden itibaren yazildigini söylemistik. Bu komutun kullanimi
gotoxy(X,Y);
seklindedir. Burada X yerine kaçinci kolona gidilmesi isteniyorsa o kolonun numarasi, Y yerine ise kaçinci satira gidilmesi isteniyorsa o satirin numarasi yazilir. Normal bir ekranda 80 kolon ve 24 satir (25'e çikartilabilir) vardir. Gotoxy komutunu kullanirken buna dikkat etmelisiniz. Yani gotoxy(83,12); komutunu yazarsaniz büyük olasilikla istediginiz görüntüyü elde edemezsiniz! Bu komut genelde write ifadesinden önce kullanilir. Zaten amaci da ekranin istenilen yerine yazi yazdirmak degil mi? Bir örnek yapalim:
Program git_bakalim;
uses crt;
begin clrscr;
gotoxy(30,13);write('www.programlamadili.blogcu.com');
readln;
end.

gotoxy(X,Y); komutunda X ve Y yerine degisken de koyabiliriz. Tabii ki bir tam sayi tipli degisken (byte, integer, longint.. gibi). Bu durumda degiskenin degeri neyse ona göre islem yapilir. Mesela küçük bir program yapalim:
Program citir;
uses crt;
var
x,y:byte;
ad:string;
begin clrscr;
write('Adiniz: ');readln(ad);
write('X kordinati: ');readln(x);
write('Y kordinati: ');readln(y);
clrscr;
gotoxy(10,23);
write('Bu program Yarasa tarafindan yapildi!');
gotoxy(x,y);
write(ad);
readln;
end. 

Gotoxy komutunu programlarimizin içinde sikça kullanacagiz.

If ...Then ... Koşul Yapısı

Programlamanin en zevkli yani bir seyleri karsilastirip sonucuna göre bir islem yapmak ya da yapmamaktir diyebilirim. Aslinda programlama da zaten budur. Programlamaya ilk baslarken algoritmalar konusunda bir örnek vermistik. Orada "Eger hava yagmurluysa semsiyeni al" demistik. Bu islemi simdiye kadar ögrendigimiz komutlarla yaptirmamiz olanaksizdir.
Karsilastirma ve karar verme islemleri olmasa program ilk satirindan itibaren satir satir çalisir ve en sonunda "End." komutuyla biter. Yani program içerisinde belirli sartlarda programin akisi degistirilemez. Pascal'da (ve neredeyse bütün programlama dillerinde ve ******lerinde) kontrol deyimi if..then..else seklindedir. Ayrica Pascal'da baska kontrol deyimleri de vardir. If...then...else deyiminin genel kullanimi:
if (sart ya da sartlar) then
sart dogruysa yapilacak islem
else
sart yanlissa yapilacak islem

gibidir. Tabii ki hepsi bir satirda da kullanilabilir. Ayrica sartin dogru olmasi (ya da yanlis olmasi) durumunda birden çok islem yaptirilmak isteniyorsa bu islemlerin hepsi begin ile end arasina su sekilde yazilir:
if (sart ya da sartlar) then begin
sart dogruysa yapilacak islemler
end else
sart yanlissa yapilacak islemler
end;

begin ve end;'i birazdan anlatacagim. Simdi çok basit bir örnek yapalim:
Program Deneme;
Uses Crt;
Var
notu:integer;
Begin Clrscr;
write('Matematik Dersinden Aldiginiz Notu Giriniz: ');Readln(notu);
clrscr;
if notu>69 then write('Aferin Geçtiniz!') else write('Malesef Kaldiniz!');
write(readkey);
end.

Bu program sinavdan aldiginiz notu belirli bir islemden geçiriyor ve sonucuna göre bir seyler yazdiriyor. Simdi biraz daha ayrintili görelim. if komutuna kadar olan her seyi daha önce gördük. Readln komutuyla sayisal bir bilgi olan sinav sonucu notu degiskenine aktariliyor. Ondan sonra ekran siliniyor. Sonra su komut var:
if notu>69 then write('Aferin Geçtiniz!') else write('Malesef Kaldiniz!');
Ilk önce bu komutla ne yapilmak istendigine bakalim. Amaç eger notu degiskeninin degeri 69'dan büyükse ekrana 'Aferin Geçtiniz!', eger degilse (yani notu degiskeninin degeri 69'a esit ya da daha küçükse) ekrana 'Maalesef Kaldiniz' yazdirmaktan ibarettir. Yani bu komutun Türkçe meali:
Eger notu degiskeninin degeri 69'dan büyük ise Aferin Geçtiniz! yaz, 
degilse Malesef Kaldiniz! yaz.

notu>69 ifadesini parantez içerisine de yazabilirsiniz. Zaten birden fazla sart varsa parantez kullanmak mecburidir. Dikkat edin write('Aferin Geçtiniz!') ifadesinde noktali virgül yok. Neden? Çünkü komut daha bitmedi. Derslerin basinda "Pascal'da her komutun sonuna noktali virgül konulur" demistim.
Programlamada notu>69 ifadesinin degeri ya TRUE (dogru) olur ya da FALSE (yanlis). Burada notu'nun degeri 69'dan büyükse bu sart TRUE, degilse FALSE olur. Eger Sart true ise THEN ifadesinden sonraki islemler, eger sartin sonucu false ise ELSE ifadesinden sonraki islemler yapilir. Biraz düsünürseniz burada aslinda else deyimi kullanilmadan da program yapilabilir. Nasil mi? Iste böyle:
Program Deneme;
Uses Crt;
Var
notu:integer;
Begin Clrscr;
write('Matematik Dersinden Aldiginiz Notu Giriniz: ');Readln(notu);
clrscr;
if notu>=70 then write('Aferin Geçtiniz!');
if notu<70 then write('Malesef Kaldiniz!');
write(readkey);
end.

Burada sarti 69 yerine 70 yaptik. Bir sey fark etmez. Maksat degisiklik olsun. Bu arada eger write(readkey); de ne diyorsaniz bir önceki konuya göz atin. Gördügünüz gibi
if (notu>=70) then write('Aferin Geçtiniz!');
if (notu<70) then write('Malesef Kaldiniz!');

ile
if (notu>=70) then write('Aferin Geçtiniz!') else write('Malesef Kaldiniz!');
ifadeleri ayni isi yapiyorlar. Tabii ki else kullanmak daha mantikli. if deyimine genel olarak anladiysak (ve kendimiz de biraz örnek yaptiysak) simdi karsilastirma islemlerine bir göz atalim:
IslemAnlami
=Esit. Sagindaki ve solundaki degerler birbirine esit ise sonuç dogru, degilse yanlis olur.
<>Esit degil. Sagindaki ve solundaki degerler esit degilse sonuç dogru, esitse sonuç yanlis olur. Bu islem sayisal olmayan (yani alfasayisla olan) ifadelerde de kullanilabilir.
>Büyüktür. Solundaki deger Sagindaki degerden büyükse sonuç dogru, degilse yanlis olur.
<Küçüktür. Solundaki deger Sagindaki degerden küçükse sonuç dogru, degilse yanlis olur.
>=Büyük esit. Solundaki deger sagindaki degerden büyükse ya da esit ise dogru, degilse yanlis olur.
<=Küçük esit. Solundaki deger sagindaki degerden küçük ya da esit ise dogru, degilse yanlis olur.
inIçerisinde. Solundaki deger sagindaki kümenin içerisinde mevcut ise degeri dogru, degilse yanlis olur.
Buradaki dogru (True) ya da yanlis (False) kavramlarini belirtmistim. Program akisi bunlara göre belirlenir. Simdiye kadar ögrendiklerimizle bir ögrencinin Matematik dersinden 100 üzerinden aldigi sinav notunu 5'lik sisteme çeviren programi yapalim. Beslik sistemin ne oldugunu biliyorsunuzdur:
0-44 arasi 1 45-54 arasi 2 55-69 arasi 3 70-84 arasi 4 85-100 arasi 5
seklindedir. Buradan ögrencilerin 5 alamamasina kizan velilere duyurulur. Simdi programimizi yazalim:
Program Denemedir;
Uses Crt;
Var
yuzluk, beslik:byte;
Begin Clrscr;
write('Matematik sinavinin sonucu (0 ile 100 arasi)..: ');readln(yuzluk);
if yuzluk<=44 then beslik:=1;
if (yuzluk>=45) and (yuzluk<=54) then beslik:=2;
if (yuzluk>=55) and (yuzluk<=69) then beslik:=3;
if (yuzluk>=70) and (yuzluk<=84) then beslik:=4;
if yuzluk>=85 then beslik:=5;
clrscr;
writeln('Yüz üzerinden.....: ',yuzluk);
writeln('Bes üzerinden.....: ',beslik);
readln;
end.

Gördügünüz gibi artik ögrenciler her sinavdan sonra aldiklari notun 5'lik sistemde kaça denk geldigini kara kara düsünmeyecekler. Açacaklar programi yazacaklar notlarini, bilgisayar hesaplayacak :) Bu arada bu and kelimesinin nereden ve neden geldigini anlatacagim, simdiden panige kapilmayin. Bu arada simdiye kadar yaptigimiz programlarimizi EXE yaptiniz mi bilmiyorum. Eger hala denemediyseniz bunu yapin mesela. Açin programinizi ve ilk derslerde anlattigi gibi exe yapin. Muhtelemen exe dosyaniz pascal'in bulundugu dizinde olusacaktir. Ordan bulabilirsiniz. Exe dosyaniz olustugu halde bulamiyorsaniz Baslat menüsünden Bul/Dosya ve Klasörler seçeneginden dosya adini yazarak arayabilirsiniz. Dosyanizi nasil exe yapacaginizi unuttuysaniz "Pascal editörü'nün kullanimi" adli derse bakin. Programi exe yapmayi basardiysaniz Windows'ta çift tiklayarak çalistirabilirsiniz artik. If then else kalibina genel bir giris yaptik. Sidmi devam edelim..
if then else kalibinin genel olarak "if (sart ya da sartlar) then begin islemler.. end else begin islemler.. end;" seklinde oldugunu söyledik. Yani if ile birden çok sarti da sinayabiliriz. Aslinda basta if kalibinin mantiksal karsilastirma oldugunu söylemek gerekirdi ama zaten sizin anladiginizi saniyorum. Yani siz bu if kalibini kullaninca bilgisayara bir mantiksal karsilastirma yaptiriyorsunuz. Bir önceki örnegimizde if ile birlikte iki sart kullandik. Sartimiz söyle idi:
if (notu>=55) and (notu<=69) then beslik:=3;
Burada and kelimesiyle (Türkçe'si "ve" demektir) yanlizca iki sartin da dogru oldugu durumlarda bu islemi yapmasini söylüyoruz. (Bu arada tahmin ettiginiz gibi else'in kullanimi zorunlu degil.) Yukardaki sartin Türkçesi söyledir:
Eger notu degiskeninin degeri 55'ten büyük ya da 55'e esit VE notu degiskeninin 
degeri 69'dan küçük ya da 69'a esit ise beslik degiskeninin degerini 3 yap.

Burada >= ve <= kullandigimizdan cümle biraz karisik oldu. Baska bir örnegi Türkçe'ye çevirelim. Örnegin;
if (notu>54) and (notu<70) then beslik:=3;
Kalibinin Türkçe'si daha sade olur ve yukardaki örnekle aslinda ayni isi yapar (Sayilara dikkat ederseniz bunu görürsünüz):
Eger notu 54'den büyük VE 70'den küçük ise beslik degiskeninin degerini 3 yap.
Yani burada aslinda bilgisayara notu degiskeninin degerinin 55 ile 69 arasinda oldugu durumlardan bahsediyoruz. Zaten notu degiskeninin degeri 54'den büyükse ve 70'den küçükse bunlardan baska bir sayi olamaz. Peki ilk derslerimizde ögrendigimiz Set (yeni Küme) tipinde bir veri kullanarak bunu daha kisa ve anlasilir olarak yapamaz miyiz. Mesela bilgisayara direk olarak "Eger notu 55 ile 69 arasindaysa beslik degiskeninin degerini 3 yap" diyemez miyiz? Deminki örnekte And kullanmistik, burdada Türkçesi içerisinde, içinde anlaminda olan in kelimesini kullanacagiz. Yani notu degiskeninin degerinin "55 ile 69 arasindaki tüm sayilari kapsayan bir küme" içerisinde olup olmadigini kontrol edecegiz. Nasil mi? Iste böyle:
if notu in [55..69] then beslik:=3;
Gördünüz mü ne kadar kisa ve anlasilir oldu! Burada kümemiz [55..69] 'dur. Bunu daha önce anlatmistik. Ama birazdan in ifadesiyle kullanimini özel olarak ele alacagiz. Simdi and ve in gibi diger ifadelerin hepsine bir göz atalim:
IfadeAnlami
ANDVe demektir. Arasina konuldugu iki (ya da daha fazla) sartin hepsinin dogru oldugu durumlarda sonuç dogru, aksi halde yanlis olur.
ORVeya anlamindadir. Arasina konuldugu iki (ya da daha fazla) sartin en az birisinin dogru oldugu durumlarda sonuç dogru, aksi halde, yani hepsi yanlis ise sonuç yanlis olur.
NOTDegil manasindadir. Bir ya da daha fazla sartin soluna konuldugunda sartlarin sonucunun tersini yapar. Yani sonuç true ise false, false ise true olur.
In ifadesi bunlarin içerisine girmiyor. Zaten onu bir önceki sayfadaki tabloda vermistik. Ayrica bir de az kullanilan xor var ama ben simdiye kadar onu hiç kullanmadim. Gerekirse ilerde anlatiriz. Anlami "veya degil"dir.

If Örnekleri

Simdi and, or ve not ifadelerini tek tek ve birlikte kullanan örnekler yapalim. Ilk önce and ile ilgili basit bir örnek yapalim. Bu programi and'in kullanimina örnek olmasi için yapiyoruz. Yoksa program pek bir ise yaramaz:
Program and_ornegi;
Uses Crt;
Var
sayi1, sayi2 : integer;
Begin Clrscr;
writeln('Asagiya 1 ile 10 arasi 2 sayi giriniz');
write('Birinci Sayi:');Readln(sayi1);
write('Ikinci Sayi:');Readln(sayi2);
clrscr;
if (sayi1 in[1..10]) and (sayi2 in[1..10]) then writeln('Sayilari dogru girdiniz')
else writeln('Sayilari Yanlis Girdiniz...');
readln;
end. 

Programi TP'da yazip çalistirin ve birkaç sayi girin. Gördügünüz gibi ancak sayilarin ikisi de 1 ile 10 arasindaysa sonuç dogru oluyor, aksi halde (sayilarin birisi bile 1 ile 10'un disinda olsa) sonuç yanlis oluyor. Çünkü VE (and) kullandik. Peki bunun yerine sayilardan en az birisinin 1 ile 10 arasinda olmasini istesek ne yapariz. O zaman or (veya) kullaniriz:
Program and_ornegi;
Uses Crt;
Var
sayi1, sayi2 : integer;
Begin Clrscr;
writeln('Asagiya 1 ile 10 arasi 2 sayi giriniz');
write('Birinci Sayi:');Readln(sayi1);
write('Ikinci Sayi:');Readln(sayi2);
clrscr;
if (sayi1 in[1..10]) or (sayi2 in[1..10]) then writeln('Sayilari dogru girdiniz')
else writeln('Sayilari Yanlis Girdiniz...');
readln;
end. 

Bu programi çalistirdiginizda iki sayidan birisini 1 ile 10 arasinda girerseniz, digerini ne girerseniz girin sonuç dogru olur. Eger ikisi birden 1 ile 10 arasinda degilse sonuç yanlis olur. Peki simdi de and ile or'u birlikte kullanarak kullanicidan 1,2,3,4,5,11 sayilarindan birisini yazmasini isteyelim. Eger bu yazilan iki sayi da bu sayilarin içindeyse sonuçta dogru yazsin, birisi bile bu sayilarin disindaysa sonuçta yanlis yazsin:
Program and_ornegi;
Uses Crt;
Var
sayi1, sayi2 : integer;
Begin Clrscr;
writeln('Asagiya 1,2,3,4,5,11 sayilarindan birisi olmak sartiyla 2 sayi giriniz');
write('Birinci Sayi:');Readln(sayi1);
write('Ikinci Sayi:');Readln(sayi2);
clrscr;
if ((sayi1 in[1..5]) or (sayi1=11)) and ((sayi2 in[1..10]) or (sayi2=11)) then writeln('Sayilari dogru girdiniz')
else writeln('Sayilari Yanlis Girdiniz...');
readln;
end.

Burada ilk önce sayi1'in 1 ile 5 arasinda olup olmadigina bakilir. Eger dogruysa zaten and kelimesinin solundaki iki sarti kapsayan sart dogru olur. Yani sayi ya 1 ile 5 arasindadir, ya da 11'dir. Eger sayi1 1 ile 5 arasinda degilse sart yanlis olur ama bir de or'un sagindakine bakilir. Eger sayi 11'e esitse bu sart dogru (true) olacagindan yine genel sart dogru olur. Bu durumda and kelimesinin solundaki sart dogru olmus olur. Eger and'in solundaki iki sart da yanlis ise sonuç otomatik olarak yanlis olur. Sag taraf için de (sayi2 için) ayni islemler yapildiktan sonra eger genel sart dogruysa sonuç dogru olur. Kendiniz birkaç örnek yaparak bunlari görebilirsiniz.
Simdi basit bir örnek daha yapalim. Bu program kullaniciya bir toplama islemi sorsun. Eger kullanici sonucu dogru girerse "Tebrikler, bildiniz" yazsin, aksi halde dogru sonucu ekrana yazsin. Yani ilk defa ciddi bir program yapiyoruz :)
Program Toplama_Programi;
Uses Crt;
var
s1,s2:integer;
toplam:integer;
Begin Clrscr;
{Rastgele iki sayi seciliyor...}
randomize;
s1:=random(100);
s2:=random(100);
{...0 ile 99 arasinda rastgele 2 sayi secildi}
writeln('Asagidaki toplama isleminin sonucunu yaziniz...');
writeln;
write(s1,' + ',s2,' = ');readln(toplam);
if (toplam=s1+s2) then writeln('Tebrikler, bildiniz...')
else writeln('Yanlis Sonuc! Cevap ',s1+s2,' olmaliydi.');
readln;
end.

Gördügünüz gibi if deyiminde sart olarak iki sayinin toplamini da verebiliriz. Hatta baska islemler bile yapabiliriz. Mesela sart olarak (toplam=(s1*21)/(s2+4)*11+9-s2*s1) gibi uzun bir aritmetik islem birle yazabiliriz. Ayrica esittir isaretinin sag ile solu yer degistirebilir. ((s1*21)/(s2+4)*11+9-s2*s1=toplam) gibi. Buralarda parantezlere dikkat etmelisiniz. Simdilik rastgele sayinin nasil bulundugunu ögrenmedik. Onun için o kisimlari kafaniza takmayin. Yukaridaki örnekte and ya da or kullanmadik ama faydali bir program oldugunu düsünüyorum. Not operatörü ise sonuç dogru ise yanlis, yanlis ise dogru yapar. Bununla ilgili bir program yapmistik ama daha iyi anlasilmasi için basit bir örnek daha yapalim. Bu program da 1 ile 5 arasinda bir sayi yazilmasini istesin. Eger sayi 1 ile 5 arasinda ise dogru, degilse yanlis yazsin:
Program deneme;
uses crt;
var
sayi:integer;
begin clrscr;
write('1 ile 5 arasi bir sayi giriniz: ');readln(sayi);
if not (sayi in [1..5]) then writeln('Yanlis!') else writeln('Dogru.');
readln;
end. 

Buraya kadar genelde sayilarla ilgili islemler yaptik ama bunun mecbur olmadigini söylemistim zaten...
Programlamada karsilastirma ve (sonucuna göre) karar verme islemleri çok önemli ve genis kullanimlidir. Diger kullanim alanlarini görmeye devam edecegiz. Ama önce simdiye kadar pascal hakkinda ögrendiklerimizin hepsini birden kullanan ve nihayet bir ise yarayan bir oyun yapalim. Bu oyunda bilgisayar 1 ile 1000 arasinda rastgele bir sayi tutsun. Biz bir tahmin yapalim. Eger tahminimiz bilgisayarin tuttugu sayidan küçükse ekrana ÇIK, küçükse IN yazilsin ve bu islemler biz sayiyi dogru tahmin edene kadar sürsün. Hani bir oyun yapiyoruz ya -hiç gerek yok ama- bir de algoritmasini yapalim ki belki daha iyi anlasilir. Algoritmamiz söyle olabilir:
1) Rastgele (1 ile 1000 arasi) bir sayi tut. 2) Kullaniciya bir sayi sor. 3) Eger kullanicinin cevabi senin tuttugun sayidan büyükse ekrana "in" yaz. 4) Eger kullanicinin cevabi senin tuttugun sayidan küçükse ekrana "çik" yaz. 5) Eger kullanicinin cevabi senin tuttugun sayiya esitse ekrana "Aferin Bildin!" yaz. 6) Eger kullanicinin cevabi senin tuttugun sayiya esit degilse 2. adima git. 7) Programi bitir.
Bu algoritmayi kendinize göre yapabilirsiniz tabii. Zaten programciligin en zevkli yanlarindan birisi de ayni programi yapmak için çok fazla seçeneginiz ve çözüm yolunuz olmasidir. Simdi de programi yazalim. Programimiz söyle olabilir:
Program Tahmin_et_bakalim;
uses crt;
label en_bas;
var
sayi, tahmin, ts : integer;
begin clrscr;
ts:=0;
randomize;
sayi:=random(1000)+1;
gotoxy(1,1);write('1 ile 1000 arasi bir sayi giriniz...');
gotoxy(1,5);write('Islem: ');
en_bas:
gotoxy(13,3);write(' '); {Eski tahmini ekrandan siliyoruz}
gotoxy(1,3);write('Tahmininiz: ');readln(tahmin); {bir tahmin isteniyor}
ts:=ts+1; {Tahmin sayisi artiriliyor}

gotoxy(8,5);
if tahmin
if sayi
if sayi=tahmin then begin
writeln('Aferin Bildin!');
writeln('Tahmin Sayisi: ',ts);
end else goto en_bas; {tahmin yanlissa basa gidiliyor}

readln;
end. 

Programi TP'da yazip çalistirin. Iste size güzel bir oyun! Programda asil dikkat etmemiz gereken yerleri kalin yaptim. Isterseniz size bu oyunu gelistirelim ve bu sefer biz içimizden bir sayi tutalim, bilgisayar bulsun! O zaman asagidaki programi pascal'da yazip çalistirin ve sonra da satir satir inceleyin. Ama programi çalistirdiginizda hile yapmayin. Yani aklinizdan tuttugunuz sayi 430 ise ve program 420'yi tahmin ederse in demek yok! Ona göre. Bu programi Pascal'da elinizle yazin. Yani kopyala/yapistir yapmayin. O zaman daha kolay ögrenirsiniz. Program söyle:
Program Tahmin_et_bakalim;
uses crt;
label en_bas;
var
tahmin, ts : integer;
alt,ust:integer;
tus:char;
begin clrscr;
writeln('Simdi aklinizdan bir sayi tutun ve eger benim söyledigim sayi');
writeln('sizin tuttugunuz sayidan küçükse çik anlaminda "ç" harfine, büyükse');
writeln('in anlamindaki "i" harfine bir defa basin.');
writeln;
writeln('Not: Sayi 1 ile 100 arasinda olmali!');
writeln;
writeln('Hazirsaniz Enter''a basin..');
readln;
clrscr;
alt:=1;
ust:=1000;
ts:=0;
gotoxy(1,1);write('Benim Tahminim...: ');
gotoxy(1,3);write('Ne yapiyim (i/ç).: ');
tahmin:=500;
en_bas:
gotoxy(20,1);write(tahmin);
gotoxy(20,3);
repeat
tus:=readkey;
until tus in['i','I','ç','Ç','D','d'];
if tus in['i','I'] then begin
ust:=tahmin;
tahmin:=(alt+ust) div 2;
end;
if tus in['ç','Ç'] then begin
alt:=tahmin;
tahmin:=(alt+ust) div 2;
end;
ts:=ts+1;
if tus in['d','D'] then begin
gotoxy(1,5);write('Aferin Bana!');
gotoxy(1,6);write('Tahmin Sayim: ',ts);
end else goto en_bas;
readln;
end. 

Burada bilmedigimiz iki sey var. Birincisi repeat...until döngüsü. Ikincisi div islemi. Div (Ingilizcesi division) bölmek manasindadir ve solundaki sayiyi sagindaki sayiya bölüm küsurati atar. Yani mesela 6 div 3 = 2'dir ve 15 div 4 = 3'dür. Döngüler konusunu anlatacagiz. Programin çalisma mantigi gayet basit. Ama yeni programlamaya baslayan birisine karisik gelebilir. Program siz in dediginizde kendi kendine "Demek ki sayi bundan küçük, o zaman bundan sonra en fazla söyleyecegim sayi bu olsun, yani üst limit bu olsun" diyor ve ust:=tahmin ifadesi ile de bunu yapiyor. alt'in da mantigi ayni. Tahminini yaparken de alt ve ust degiskenlerini topluyor ve ikiye bölüyor. Programi çalistirdiginizda fark etmissinizdir zaten. Ilk tahmin hep 500 oluyor. Ondan sonra in derseniz 250, çik derseniz 750 oluyor... Tahmin sayisinin nasil hesaplandigi da gayet basit. Her sayi tahmininde tahmin sayisi bir artiriliyor

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.

Pascalda Yapılmış Bir Oyun

Evet, simdi, simdiye kadar yaptigimiz en iyi programi yapacagiz. Bir oyun yapacagiz. Bu oyunda bilgisayar ekranin rastgele biryerine * isareti koyacak. Biz de kolon numarasini ve satir numarasini (yani *'in kordinatlarini) tahmin etmeye çalisacagiz. Dogru kordinati bulana kadar oyun devam edecek. Bulunca da kaç tahminde buldugumuzu ekrana yazacak. Size bir ipucu: Kolon numarasi 2 ile 79 arasi, Satir numarasi 2 ile 20 arasi bir deger. Asagidaki programi yazip çalistirin. Iyi eglenceler:
Program Hedefi_bul;
Uses crt;
Label
tekrar_gir;
var
x,y:byte;
satir,sutun:byte;
a,ts:byte;
begin
{ekranda rastgele bir kordinat seçiliyor...}
randomize;
x:=random(78)+2;
y:=random(19)+2;
{..rastgele korditanlar Seçildi}
ts:=0; {Tahmin Sayisi}
tekrar_gir:
clrscr;
{Çerçeve çizlmeye basliyor...}
for a:=1 to 80 do begin
gotoxy(a,1);write('.');
gotoxy(a,21);write('.');
end;
for a:=1 to 21 do begin
gotoxy(1,a);write('.');
gotoxy(80,a);write('.');
end;
{...Çerçeve çizildi}
gotoxy(1,23);write('Tahmininizi Giriniz->');
gotoxy(30,23);write('Sutun No...:');
gotoxy(50,23);write('Satir No...:');
gotoxy(x,y);write('*');
gotoxy(43,23);readln(sutun);
gotoxy(63,23);readln(satir);
if (not (satir in [2..20])) or (not (sutun in [2..79])) then goto tekrar_gir;
ts:=ts+1; {Tahmin sayisi artiriliyor}
if (satir=y) and (sutun=x) then begin
gotoxy(30,12);write('Aferin Bildiniz!');
gotoxy(30,13);write('Tahmin Sayisi: ',ts);
end else begin
gotoxy(sutun,satir);write('X');
delay(1000);
gotoxy(sutun,satir);write(' ');
goto tekrar_gir;
end;
readln;
end. 

Programi çalistirdiginizda yanlis tahmin yapinca ekrana bir X koyar, biraz bekler ve geri sile bu X harfini. Eger bunu göremiyorsaniz ya da çok kisa süreli görebiliyorsaniz delay(1000); degerini artirin. Programda kullandigim ve simdiye kadar ögrenmedigimiz ikinci komut da randomize ve random. Diger bütün komutlari ve deyimleri biliyorsunuz. Bu programi iyi inceleyin. Çünkü benim Pascal ögrenmek istememdeki ilk vesile bu program olmustu. Döngülerle ilgili olarak da ekrana nasil noktalar ile çerçeve çizdigimize bakin. Programi belki daha güzel yapabilirdik ama elimden geldigince bilmedigimiz komutlari kullanmamaya çalistim.