değişkenler etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
değişkenler etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Degişkenler

Her programlama dilinde degiskenler vardir. Degiskenler programlamada hayati önem tasir. Degiskeni program içinde bir degeri ya da bilgiyi tutan bir birim olarak ifade edebiliriz. Bu bölümde degiskenleri tüm tipleriyle çok ayrintili ve bol örnekli anlatacagim. Ayrica sabitler, tipler ve labelleri de ögrenecegiz. Adindan da anlasilabilecegi gibi degiskenlerin degeri program içinde istenildigi kadar degistirilebilir. Bir degiskenin bir adi, tipi ve degeri vardir. Degisken adi olarak istediginiz ismi verebilirsiniz. Degiskenin tipini ise programinizin basinda var deyimi ile tanimlamak zorundasiniz.
Var Deyimi:
Programda kullanacagimiz bütün degiskenleri programin basinda tanimlamak ve cinsini (sayi mi, yazi mi.. gibi) belirtmek zorundayiz. Her programlama dilinde buna gerek olmayabilir ama Pascal'da bu is mecburidir. Degiskenlerimizi Var deyiminde sonra tanimlamamiz gerekir. Var deyimi bir komut olmadigindan sonuna noktali virgül konulmaz. Genel kullanim sekli:
Var
degisken: degisken_tipi;

seklindedir ve Pascal'da program yapisi dersinde gördügümüz yerde kullanilir. Degisken tiplerini görürken bu deyimin kullanilisini görecegiz. Merak edenler için söyleyim: Var kelimesi Ingilizce Variable kelimesinin kisaltilmisidir ve degisken ya da kisaltma anlamindadir.
Değişken Tipleri
Pascal'da her degiskenin bir tipi olmak zorundadir. Bir degisken programin basinda hangi tipte tanimlandiysa programin sonuna kadar o tipte bilgi saklayabilir ve o degiskene o tipten baska bir tipte veri atanamaz, eklenemez. Yani mesela sayi tipinde bir degiskene "kalkan" degeri atanamaz. Bu durumda program hiç çalismaz ve Pascal editörü hata verip o yanlisligin yapildigi degiskene imleci getirip hata uyarisi yapar. Simdi Pascal'da kullanabilecegimiz degisken tiplerine bakalim.
Sayisal Degiskenler:
Adindan da anlasilacagi gibi degeri bir sayi olabilen degiskenlerdir. Bu degiskenler bir sayiyi tutarlar. Ayrica matematiksel islemlerde de kullanilabilirler. Birkaç çesidi vardir. Öncelikle sayisa degiskenleri ikiye ayirmak gerekir. Birncisi tasayilar ve ikincisi gerçek (ondalikli) sayilar. Tam sayilarin ve ve gerçek sayilarin da kendi aralarinda siniflari vardir. Ilk önce tamsayi tiplerinden baslayalim. Tamsayi tiplerini hemen bir tabloda verelim:

Tip adiSinirlari
Kapladigi alan
Shortint-128..127
1 byte
Byte0..255
1 byte
Integer-32768..32767
2 byte
Word0..65535
2 byte
Longint-2147483648..2147483647
4 byte

Tabloda tip adi dedigimiz sey var deyimiyle kullanacagimiz ad, sinirlari o sayisal degikenin alabilecegi degerlerin siniridir. Yani byte tipinde bir degiskenin degeri 256 olamaz. Buna göre bizim isimize hangisi yariyorsa onu kullanabiliriz. Kapladigi alan ise bu degisken için hafizada kullanilan alanin byte cinsinden degeridir. Programlarimizin hafizada (hard-disk'te degil) az yer kaplamasi daha iyidir. Bunun için gereksiz yere longint degiskenini kullanmamamiz iyi olur. Çünkü pascalda en fazla 64 kilobyte'lik (yaklasik 64000 byte) degisken kullanabiliriz.

Sayisal Degişken Örnekleri

Örnek 1: Bu program 2 sayiyi toplar ve sonucu ekrana yazar. Simdilik ekrana nasil yazdigimizin üzerinde durmayalim ama zaten sizin de anlayacaginizi düsünüyorum.
Toplama_Denemesi;
Uses Crt;

sayi1,sayi2: integer;
toplam: integer;
clrscr;
sayi1:=19;
sayi2:=81;
toplam:=sayi1+sayi2;
write('Bu sayilarin toplami=',toplam);
readln;

Bu program ekrana 100 yazar. Çünkü toplam isimli degiskenimizin son degeri 100'dür. Burada readln komutu enter'a basilmasini bekler. Bunu daha sonra görecegiz. Write ise ekrana birseyler yazar. Bunu da ayrintili olarak inceleyecegiz. Clrscr ise ekrani temizler. Simdilik görmemiz gereken atama islemleri, yani bir degiskenin degerini degistirme ve degiskenleri tanimlama. Gördügünüz gibi 3 tane degiskenimiz var ve bunlari iki satirda tanimliyoruz. Hepsinin tipi de ayni oldugu için üç degiskenimizi birden
Var
sayi1, sayi2, toplam: integer;

seklinde topluca ya da üçünü de ayri ayri tanimlayabiliriz. Bu sizin keyfinize kalmis.
Örnek 2:Bu program da kullanicidan (yani sizden) aldigi iki sayiyi çarpip ekrana yazar:Program Carpma_Denemesi;
Uses Crt;
Var
a, b, c: integer;
Begin clrscr;
write('Birinci sayiyi giriniz:');
readln(a);
write('Ikinci sayiyi giriniz:');readln(b);
c:=a*b;
writeln('Sonuç=',c);
readln;
End.

Gördügünüz gibi ilk önce a ve b degiskenlerinin degeri kullanicidan aliniyor, sonra c degiskeninin degeri a ile b'nin çarpimi olacak sekilde hesaplanip ekrana yazdiriliyor. Burada readln(degisken_adi); komutunu daha sonra anlatacagiz. Simdilik kullanicidan bir bilgi almak amaciyla kullanildigini bilseniz yeter. Pascal'da ayni satira birden çok komut yazilabilecegini ve büyük-küçük harf ayrimi olmadigini tekrar hatirlatiyim.
Örnek 3:Son olarak sizin kaç yasinda oldugunuzu bulan basit bir program yapalim:

Program Yas_Bul;
Uses Crt;
Var
simdiki_yil, dogum_yili: integer;
yas: byte;
Begin clrscr;
write('Kaç yilinda dogdunuz: ');readln(dogum_yili);
write('Simdi hangi yildayiz: ');readln(simdiki_yil);
yas := simdiki_yil - dogum_yili;
writeln('Siz su anda ',yas,' yasindasiniz!');
Readln;
End.

Gördügünüz gibi simdiki_yil ve dogum_yili degiskenlerini integer yaparken yas degiskenini byte yaptik. Çünkü 255 yasindan daha büyük insan olamaz. Bu durumda bosyere onu da integer yapip hafizada yer isgal etmeyelim. Iyi bir programci olmak için bunlara dikkat etmeliyiz. Yine iyi bir programci olarak degiken isimlerimizi anlamli ve mümkün oldugunca kisa ve o degiskenin içerigi ile alakali yapalim. Program içinde hata yapmamak için bunlar gerekli. Çünkü degiskenlerimize d1, d2, d3, d4... gibi isimler verirsek sonra hangisinin içerigi ne onu karistirabiliriz. Degisken isimlerinin uzunlugu yanilmiyorsam 50 karekter kadar olabilir ve bosluk içeremez, sayi ile baslayamaz. Bu arada crt uniti ise clrscr komutunu kullanmak için gereklidir ve Pascal'in hazir unit'lerindendir (Unit'in ne oldugunu simdilik bosverin!).

Gerçek Sayı Tipleri

Tabii bunlara gerçek diyorsak digerleri sahte degil. Gerçekten kastimiz virgüllü ya da ondalikli ya da kesirli demektir. Bu tip sayilarin da tipki tamsayilarda oldugu gibi çesitleri var. Bu çesitliligin temel sebebi gereksiz hafiza kullanmaya engel olmaktir. Gerçek sayi tipleri sunlardir:

Tip adiSinirlariKapladigi alan
Real2.9 x 10^-39..1.7 x 10^386 byte
Single1.5 x 10^-45..3.4 x 10^384 byte
Double5.0 x 10^-324..1.7 x 10^3088 byte
Extended3.4 x 10^-4932..1.1 x 10^493210 byte
Comp-2^63+1..2^63-18 byte

Burada Real'den baska tiplerin de oldugunu bilmeniz için hepsini gösterdim ama gerçekte sadece Real tipini kullanmaniz yeterlidir. Html'de bir sayinin üstünü göstermek olmadigindan tablo biraz kötü gözüktü. Ben birisini yazi ile yazarsam siz digerlerini anlarsiniz. Real'in sinirlari "2.9 çarpi 10 üzeri -39'dan 1.7 çarpi 10 üzeri 38'e kadardir". Real tipinin disindaki tipleri kullanabilmeniz için prograinizin en basina {$N+} yazmaniz gerekebilir. Bunu bilmeniz gerekmiyor, real size yeter. 

Örnek 1:Bu program girilen sayinin karekökünü bulur. sqrt(); komutunu sonra anlatiriz. Simdilik bu komutun bir sayinin karekökünü bulmaya yaradigini bilmeniz yeter.
Program Karekok;
Uses Crt;
Var
sayi:integer;
karekoku:real;
Begin clrscr;
write('Bir tamsayi giriniz: ');readln(sayi);
karekoku:=sqrt(sayi);
write('Bu sayinin karekökü: ',karekoku:16:5);
readln;
end.

Burda kullanilan write komutunun özel bir sekli. Sayiyi düzgün yazdirmayi sagliyor. Daha sonra ayrintili görecegiz. Bunlari kaldirip direk olarak
write('bu sayinin karekökü:',karekoku);
seklinde yazip deneyin. Sayiyi bilimsel olarak sonuna E falan koyarak yazar.

Örnek 2:Bu program kullanicidan 3 dersinin notunu ister ve ortalamasini bulup ekrana yazar. Program ortalama_bul;
Uses crt;
Var
not1, not2, not3: integer;
ort: real;
Begin Clrscr;
Write('Matematik Notunuz (0..100 arasi): ');readln(not1);
Write('Fizik Notunuz (0..100 arasi): ');readln(not2);
Write('Kimya Notunuz (0..100 arasi): ');readln(not3);
ort:=(not1 + not2 + not3)/3;
write('Ortalamaniz: ',ort:5:2);
Readln;
End.

Burada dikkat etmeniz gereken birsey daha var. ortalamayi hesaplarken yaptigimiz isleme dikkat edin. Tipki matematik dersinde gördügümüz gibi parantezlerin islem önceligi var. Sayilarla yapabileceginiz aritmetik islemleri ilerde görecegiz.
Buraya kadar yapilan ve bundan sonra yapilacak bütün örnekleri kendi elinizle Pascal editöründe yazmanizi tavsiye ederim. Yoksa ögrenemezsiniz. Ama eger kodlari direk olarak Pascal editörüne aktarmak istiyorsaniz kodu isaretleyip sag tiklayin ve kopyala yapin. Daha sonra Not defterini (notepad) açip oraya yapistirin kodlari ve kaydedin. ama kaydederken dosya isminin sonuna .pas yazin. Mesela deneme.pas gibi. Kaydettikten sonra daha önce anlattigimiz sekilde üstüne çift tiklayarak açabilirsiniz. Sonra istediginiz gibi düzeltebilir veya çalistirabilirsini

Set (Küme) Tipi:

Ayni tipte ve birbiriyle ilgili bilgilerin, verilerin olusturdugu topluluga küme denir. Mesela 0 ile 9 sayilarindan bir küme olusturabiliriz. Ama bu kümenin içinde "A" harfi geçemez. Çünkü "A" sayi degildir. Kümenin elemanlari birbirinden virgül yardimiyla ayrilir. Mesela birkaç küme örnegi verelim:
['Ali', 'Ahmet', 'Süleyman', 'Halil Ibrahim']
[0,1,2,3,4,5,6,7,8,9]
['E', 'e', 'H', 'h', #27]

gibi kümeler olabilir. Eger kümenin elemanlari birbirini takip eden cinsten ise aralarina virgül koymak yerine ilkini yazip ardindan .. koyup sonuncusunu yazabiliriz. Mesela
[0..9]
['A'..'Z', 'a'..'z']

gibi. Ilki olan [0..9] ile bir önceki örneklerde olan ve 0'dan 9'a kadar olan bütün tamsayilarin yazildigi örnegin hiçbir farki yoktur. Kümeler böyle ama bunlari Type blogunda söyle tanimlariz:
Type
harfler = Set of ['A'..'Z', 'a'..'z'];
rakamlar = Set of [0..9];
cevaplar = Set of ['EVET', 'HAYIR']

Bu sekilde tanimlanan kümelerin nasil kullanilacagini sonraki konularda örneklerin içerisinde görecegiz. Ayrica kümeler üzerinde kesisim (*), Birlesim (+), Fark (-) ve iliski (=, <>, <=, >=, in) islemleri yapilabiir. Özellikle 'in' isleminden çok faydalanacagiz. Kümelerin içerisinde ayni eleman yanlizca bir kez kullanilabilir ve öncelik sirasi yoktur. Simdi küme ile ilgili bir program yapalim. Simdilik bunda anlamayacaginiz yerler olabilir:
Program Kume_Denemesi;
Uses Crt;
Label
en_bas;
var
tus:char;
Begin
en_bas:
tus:=readkey;
Clrscr;
if tus in ['0'..'9'] then begin
writeln('Bastiginiz Rakam: ',tus);
goto en_bas;
end else begin
clrscr;
writeln(tus,' bir rakam degil!');
end;
readln;
End.

Bu programi TP'da yazip çalistirdigin ve klavyenizde rakamlara basin. Bastiginiza rakam ekranda gözükecektir. Çikmak için rakam hariç bir tusa (herhangi bir harfe) basmalisiniz. Programda daha ögrenmedigimiz komutlar var. Ama kalin yazili olan yere dikkat ederseniz küme'nin en sik kullanildigi yer göreceksiniz. Burada basilan tusun 0 ile 9 arasinda bir rakam olup olmadigi, baska bir degisle basilan tusun 0'dan baslayip 9'da biten elemanlardan olusan bir kümenin içinde olup olmadigi kontrol ediliyor. Eger dogru ise ekrana bu rakam yaziliyor degilse (yani bu sart yanlis ise) basilan tusun bir rakam olmadigi yaziliyor ve enter'a basilmasi bekleniyor.

Pascal da İlk Adımlar

Artik bilgisayarimizda Turbo Pascal Derleyicisi ve bizde programlama mantigi olduguna göre yavas yavas örneklerle Turbo Pascal'i ve Pascal dilini ögrenmege baslayabiliriz. Kodumuzu iki türlü yazabiliriz.Birinci yöntem kodu Not Defteri gibi bir programda yazip kaydettikten sonra derleyici ile derlemek.Ikinci yöntem ise Turbo Pascal'in editörünü kullanarak kodu yazip derlemek.Eger elinizde bu derslerin yazili dökümü varsa ikinci yöntemi kullanabilirsiniz.Eger derslerin yazili dökümü yoksa,onlari bilgisayar ortaminda okuyup farkli bir Windows programiyla yazmaniz daha kolay olacaktir.Çünkü Turbo Pascal'in orijinal editörü Dos ortaminda çalisiyor ve buda size çok vakit kaybettirebilir.Yinede her sartta birinci yöntemi öneririm.Böylece ikide bir Windows'tan çikmaniza gerek kalmaz.

Pascal Kaynak Kodlarinin(Derlenmemis) uzantisi ".pas"dir.Turbo Pascal degisik uzantili dosyalari derleyebilir(Pascal kodu içermek sartiyla),fakat ".pas" uzantisi yayginlik kazanmis ve benimsenmistir.Bu yüzden Windows'a .pas uzantisini tanitmamiz gerekebilir.Notepad ile bir seyler yazip 1.txt ismi ile kaydedin.Daha sonra bunu Yeniden Adlandirarak(Rename) .txt yerine .pas yazin.Dosya türünü degistirmek istiyor musunuz diyaloguna Evet cevabini verdikten sonra dosyayi çift tiklayin "Birlikte Aç" penceresi açilacaktir.Dosya tanimina Pascal Kaynak Kodu yazin.Program listesinden de Notepad'i bulup seçin."Bu dosyayi açmak için her zaman bu programi kullan" kutusunun seçili olduguna dikkat ederek "Tamam" butonuna basin.Böylece bilgisayariniz .pas uzantili dosyalara ne isim verecegini ögrenmis olur.

Baslat(Start)-->Çalistir(Run) ile çikan kutucuga notepad yazin.Böylece Windows'un klasik Not Defteri programi çalisacaktir.Asagidaki kodu yazin.

Program ilk;
begin
end.
Bu kodu ilk.pas olarak Masaüstü(Desktop)'ne kaydedin.Daha sonra tüm klasör pencerelerini kapatip.Masaüstünde iken Baslat-->Çalistir deyip kutucuga tpc ilk.pas yazin.

Turbo Pascal Version 7.0 Copyright (c) 1983,92 Borland International
ILK.PAS(3)
3 lines, 1472 bytes code, 668 bytes data.
yazisini görürseniz programiniz derlenmis demektir.Masaüstünde ilk programiniz olan Ilk.exe bulunuyorsa basardiniz demektir.Eger bu asamaya gelemediyseniz korkarim daha önceden bir hata yapmissiniz.Kurulum yazisini tekrar inceleyin. Ilk.exe'yi hevesle çalistirdiniz ama bir sey olmadi degil mi?Olmamasi çok dogal çünkü programin sadece ismi,basi ve sonu var.Ama hiçbir islem yok.Bu arada yapilacak islemler begin ile end komutlari arasina yazilir.End komutunun sonundaki nokta(.) ise programin bittigini gösterir.Unutmayin bir programda birden fazla begin ve end bulunabilir.Programi bitiren end nokta ile program içerisindeki endler ise noktali virgül(;) ile sonlandirilmalidir. Genelde pascal kod satiri noktali virgül(;) ile sonlandirilir.Fakat bazi istisnai kodlarda noktali virgül kullanilmaz.Bunlar begin,repeat gibi degisik sekilde sonlandirilan komutlardir.Endise etmenize gerek yok zamani gelince her seyi daha net anlayacaksiniz.

Yukaridaki kodu yorumlamak gerekirse "Program ilk;" satiri programin isminin ilk oldugunu bildirir."begin" komutu programin baslangicini "end" komutu ise programin sonunu belirtir.

Pascal ile yazilabilecek en basit program budur.Bir sonraki derste daha kullanisli programlar yazmaya baslayacagiz.

Read/Readln Komutu

Ekrana yazi yazdirmayi gördük. Simdi de ekrandan (daha dogrusu ekran vasitasiyla kullanicidan) bir veri (isim, yas, telefon numarasi gibi..) almaya bakalim. Bu islem için Read ya da Readln (genellikle readln) komutu kullanilir. Read komutunu kullanirsaniz kullanici çok hata yapar. En iyisi readln kullanmak. Ben bunu anlatayim. Kullanim sekli Readln(degisken); seklindedir ve kullanildigindan kullanicidan bir seyler yazip enter'a basmasini bekler. Enter'a basilinca kullanicinin yazdigi verileri parantez içerisine yazilan degiskene aktarir ve artik bu degiskenin degeri bu olur. Yani üstüne falan eklenmez. Eski degeri silinir ve yeni degeri kullanici ne girdiyse o olur. Genellikle write komutuyla yan yana (daha dogrusu ar arda) kullanilir. Çünkü kullanicinin ne girmesi gerektigini ona söylememiz lazim. Örnek için basit program:
Program Oku_bakiim;
uses crt;
var
a:integer;
isim:string[40];
begin clrscr;
write('Bu program verilen bir sayinin karesini ve kupunu bulur');
writeln;
write('Bir Sayi Giriniz: ');readln(a);
write(a,' sayisinin karesi ',a*a,' ve kubu ',a*a*a,' olur.');
writeln;
write('Adinizi giriniz: ');
readln(isim);
clrscr;
Writeln('Gule gule ',isim);
Writeln('Programi bitirmek icin Entera basiniz...');
readln;
end. 

Programi TP'da yazip çalistirin ve sonucuna bakin. Bu program write/writeln ve readln komutlarinin anlasilmasina yeterlidir. Zaten ilerde bu iki komutu çok kullanacagiz. Belki fark etmissinizdir bu readln komutunun bazi yetersizlikleri var. Mesela kullanicidan bir sayi girmesini istiyoruz. Ama kullanici sayi olmayan buraya bir seyler de yazabilir ve biz bunu engelleyemeyiz. Bu durumda program hata verir. Bunu önlemek için kendi readln komutumuzu kendimiz olusturmaliyiz. Bunu ilerde görecegiz.

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.