PASCAL:AlGORİTMA
Bir programi programlama dillerinde yazdigimizi ögrendik. Programlama dilinin ne oldugunu daha sonra anlatacagim. Programlama dillerinde bir program yazarken yapilan her isleme komut ve bu komutlarin bütününe de programin kodu denilir. Yani biz bir programi kodlariz. Ancak bu kodlari belirli sirada ve düzende vermek zorundayiz. Yoksa pek de akilli olmayan bilgisayarimiz bunlari kendine göre siraya koyamaz. Biz ona hangi islemi ne zaman yapacagini söyleriz. Gerekirse bazi komutlari hiç isleme sokmamasini, bir komutu birden çok defa icra etmesini ya da belirli sartlarda ne yapmasi gerektigini bilgisayara anlatmak için bir düzen içinde kodlarimizi yazmaliyiz. Iste bu düzene programin akisi ve bu akisin tamamina da programin algoritmasi denilir.
Çok akilli bir robot düsünelim. Bu robot sesle çalissin. O zaman her sözümüz robot için bir komuttur. Robota egil dersek egilir. Bu onun için bir komuttur. Ancak robottan yerdeki kalemi size vermesini isteyecekseniz belki birden fazla komut kullanmak zorundasiniz. Mesela bu örnek için robota 4 tane komutu söyle verebilirsiniz:
1 ) Egil.
2 ) Kalemi al.
3 ) Ayaga kalk.
4 ) Kalemi bana ver.
Bu seklide verdiginiz 4 komutun tümüne birden program diyebiliriz. Mesela bu robotun programlanabilir özelligi de olsun. Siz bu robota bu 4 komutu birden ögretip de bundan sonra her "kalemi ver" dediginizde bu isi yapmasini saglayabilirsiniz. Bundan robot, sonra siz "kalemi ver" komutunu söyleyince hemen daha önceki programi çalistirir ve bu 4 islemi yaparak sonuçta kalemi size verir. Peki programdaki 3. satirla 2. satiri yer degistirirseniz robot ne yapar. Egilir kalkar ve kalemi almaya çalisir ama kalem yerde oldugundan alamaz ve komutunuz dogru çalismaz. Dogru çalismasi için yukardaki sirada verilmelidir. Iste bu robotunuzun kalem verme algoritmasidir.
Daha anlasilir ve günlük hayatta çok kullandigimiz bir örnek verelim. Mesela kis ayindayiz ve evden disari çikacagiz. Pencereden bakiyoruz. Hava yagmurluysa semsiyemizi alalim, degilse almayalim ve disari çikalim. Bu isin algoritmasini örnegin 2 yolla kurabiliriz. 1.'si:
1 ) Pencereden disari bak.
2 ) Eger hava yagmurluysa semsiyeni al.
3 ) Disari çik.
Bir kisiye bu üç komutu verirseniz hemen pencereden disari bakar ve eger hava yagmurluysa semsiyesini alir ve sonra disari çikar. Dikkat ettiyseniz "Eger hava yagmurlu degilse" gibi bir sart yok. Zaten 2. sart yanlissa 3. adima geçeceginden semsiyesiz olarak disari çikmis olur. Bu olayi birde su algoritma ile yapalim:
1 ) Pencereden disari bak.
2 ) Eger hava yagmurlu degilse 4. adima geç.
3 ) Semsiyeni al.
4 ) Disari çik.
Gördügünüz gibi ayni isi 2 farkli algoritma ile yaptik. Dikkat ederseniz iki islemin de ayni sonucu verecegini görürsünüz. Bu sefer tersten yaptik isi. 2. adim bir karar verme adimidir ve eger hava yagmurlu degilse 4. adima geçmeye karar veriyor, 3. adim yapilmamis (atlanmis ) oluyor ve semsiye alinmadan disari çikiliyor. Eger 2. adimdaki sart yanlissa, yani hava yagmurluysa 4. adima geçmiyor ve 3. adimdan devam ediyor islemlere. Bu durumda semsiye de alinmis oluyor.
Buraya kadar okuduklarimiza göre programciyi "Problemi analiz eden ve onu bir programlama dili ile bilgisayara anlatan, yazan, programlayan kisi" olarak tanimlayabiliriz. Algoritma ise "Programcinin Problemi analiz ettikten sonra onu en kisa ve en hizli çözmek için gelistirdigi yoldur".
Artik genel olarak algoritmayi anlamis olduk. Pascal'da Programlamayi anlatirken de yeri geldikçe algoritmalardan yararlanacagiz. Sunu unutmayalim ki iyi bir program önceden tasarlanmis ve bütün kullanim amaçlari belirlenmis programdir. Aksi takdirde isimiz hizlanacagina yavaslayabilir de..
PASCAL:İ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.
PASCAL:İLK ÖRNEK
Genelde bir programlama dili ögrenilirken ilk yazilan aktif program ekrana "Merhaba Dünya" yazdiran programdir.Bu o kadar klasiklesmistir ki neredeyse bir standart haline gelmistir.Bende bu kurali bozmak istemiyorum.Iste "Merhaba Dünya" programinin kodlari...
Program merhaba;
begin
write ('Merhaba Dunya' );
readln;
end.
Derleyip çalistirin sonucu göreceksiniz.Burada write komutu parantez ve tirnak isaretleri arasindaki stringi(sayi olmayan-alfanümerik ) yazdirmaya yarar.Bu da ayni sonucu veren fakat kodu farkli olan bir program.
begin
write ('Merhaba ' );
write ('Dunya' );
end.
Gördügünüz gibi tirnak isaretleri içindeki boslukta programa yansiyor.Isterseniz o boslugu kaldirip programi derlemeyi deneyin.Merhaba ve Dunya kelimelerinin bitisik yazildigini göreceksiniz."write" komutu tek satira yazi yazmak için kullanilir."writeln" komutu ise stringi yazip imleci bir alt satira atlatir.Asagidaki örnegi inceleyin.
Program merhaba3;
begin
writeln('Merhaba Dunya' );
writeln('Merhaba Mars' );
writeln('Merhaba Saturn' );
end.
"readln" komutu kullanicinin programa girdi girmesine izin verir.Girdi girisi Enter tusuyla sonlandirilir.Bu girdi bir degiskene atanabilir yada hiçbirsey yapmadan kullanicinin Enter tusuna basmasi beklenebilir.Asagidaki örnegi incleyin.
Program readln1;
begin
writeln('Programi sonlandirmak icin Enter tusuna basiniz.' );
readln;
end.
PASCALEĞİŞ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.
Degisken 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 adi
Sinirlari
Kapladigi alan
Shortint
-128..127
1 byte
Byte
0..255
1 byte
Integer
-32768..32767
2 byte
Word
0..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. Hemen bunlarla ilgili birkaç örnek program yapalim.
Ö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.
Program Toplama_Denemesi;
Uses Crt;
Var
sayi1,sayi2: integer;
toplam: integer;
Begin clrscr;
sayi119;
sayi281;
toplamsayi1+sayi2;
write('Bu sayilarin toplami=',toplam );
readln;
end.
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 );
ca*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! ).
Char Degisken Tipi:
String degiskenler 255 karakterlik veri alabiliyordu. Char ise tahmin edeceginiz gibi daha fazla karakter almiyor! Char tipinde bir degisken yanlizca bir adet karakter alabilir ve bir byte yer kaplar hafizada. Yine string tipindeki gibi deger atamasinda iki apostrof isareti arasina en fazla 1 karakter olabilecek sekilde yazilir. Örnek bir program yapalim daha iyi anlariz.
Program Char_Tipinde_alistirma;
Uses crt;
var
c: char;
isim: string;
a: byte;
begin
clrscr;
write('Yine adinizi girin bakalim....: ' );readln(isim );
write('Simdi en fazla ',length(isim ),' olacak sekilde sifindan büyük bir sayi giriniz: ' ); readln(a );
cisim[a>;
writeln('Sizin isminizin ',a,'. harfi "',c,'"' );readln;
end.
Bu örnek simdiye kadar yaptiklarimizin en karisigi gibi gözükebilir ama biraz dikkat ederseniz anlayacaginiz kesin. clrscr; komutuna kadar olan yeri biliyorsunuz. Ondan sonra isim adli degiskene ekrandan (daha sonra ayrintili olarak anlatacagimiz sekilde ) bilgi girilmesi isteniyor. Ondan sonra yazilan write ifadesinde bilmedigimiz birsey var. Length fonksyonu bir string tipli ifadenin kaç karakter uzunlugunda oldugunu verir. Bunu da daha sonra anlatacagiz. Ondan sonra cisim[a>; ifadesinde c adli char degiskene isim degikeninin a. karakterini atiyoruz. Mesela isminiz "Osman" ise ve a degerine de 3 girdiyseniz c ifadesinin karsisindaki deger 'm' olur. Yani c degiskeninin degerine 'm' harfini (karakterini ) atamis oluruz. Programi birkaç defa çalistirarak daha iyi anlayabilirsiniz.
Tabii bu sekilde bizim pek isimize yaramayabilir ama özellikle bir char tipindeki degiskeni readkey komutuyla kullanilarak faydalanabiliriz. Bunlara ilerde deginecegiz.
Bunlarin disinda su anda hemen kullanamayacak olsak da diger tiplere de kisaca deginelim.
Boolean Tipli degiskenler:
Degeri ya TRUE (dogru ) ya da FALSE (yanlis ) olabilen degiskenlerdir. Mantiksal karsilastirmalarda kullanilabilir. Hafizada 1 byte alan kaplar.
Bundan sonraki tipdeki olan dizi ve record tipleri için sonraki derslerde özel bir bölüm açip anlatacagi çünkü kullanim alanlari çok genis.
Dizi (Array ) tipli degiskenler:
Dizi degisken genelde benzer bilgileri bulunduran degiskenlerdir. Örnek verirsek daha iyi anlasilir. Önceki programlarimizin birisinde hatirlarsaniz bir ögrencinin üç notunun ortalamasini bulmustuk. Peki 1 degil de 100 ögrenci varsa ne olacak. Her birisi için üç not ve bir ortalama olmak üzere 4 degisken tanimlarsak toplam 400 degisken tanimlamamiz lazim. Bu hem çok uzun zaman alir, hem de degisken isimlerini birbirine karistirmamiz olasidir. Bunun yerine 100 ögrencinin 3'er notunu ve ortalamasini sadece 2 degisken kullanarak kolayca tutabiliriz. Bunun için degisken tanimlarimiz
Var
notlar: Array[1..100,1..3> of byte;
ortalama: Array[1..100> of real;
seklinde olmalidir. Simdilik bunlari nasil kullanacagimiz fazla deginmeden geçelim çünkü diziler diye ayri bir bölümde hepsini anlatacagim.
Kayit (Record ) tipli degiskenler:
Simdiye kadar bir ögrencinin adi, notlari ve ortalamasi için ayri degiskenler kullandik. Peki bunlarin hepsini bir ana degiskenin alt degiskenleri olarak tutsak daha kolay ve anlasilir olmaz mi? Özellikle bu tip degiskenler dosyalama konusunda çok isimize yarayacak. Genel olarak tanimlamasi su sekildedir:
Type
kayit_tipi=Record
degiskenler...
end;
Var
kayit_adi = kayit_tipi;
Gördügünüz gibi bu tip bir degiskeni tanimlamak için type etiketini kullaniyoruz ve yeni bir tip olusturuyoruz ilk önce. Sonra bir degiskeni tipi bu olacak sekilde tanimliyoruz. Hemen örnek bir program yazalim. Bunu kendi ellerinizle yazmalisiniz (ben de hep öyle yapiyorum ):
Program Filiz;
uses crt;
type
ogrenci_tipi=Record
isim: string[40>;
not1: byte;
not2: byte;
not3: byte;
orta: real;
end;
Var
ogrenci: ogrenci_tipi;
Begin clrscr;
write('Isminiz:' );readln(ogrenci.isim );
write('1. Sinavin sonucu:' );readln(ogrenci.not1 );
write('2. Sinavin sonucu:' );readln(ogrenci.not2 );
write('3. Sinavin sonucu:' );readln(ogrenci.not3 );
ogrenci.orta(ogrenci.not1+ogrenci.not2+ogrenci.not3 )/3;
write('Ortalamaniz: ' );write(ogrenci.orta );
readln;
end.
Gördügünüz gibi kayit tipindeki bir degiskenin alt degiskenini nokta ile ayirarak kayit_degiskeni.alt_degisken seklinde yaziyoruz. Isterseniz with deyimini kullanarak alt degisken isimlerini direk de kullanabilirsiniz:
yastik;
uses crt;
type
ogrenci_tipi=Record
isim: string[40>;
not1: byte;
not2: byte;
not3: byte;
orta: real;
end;
Var
ogrenci: ogrenci_tipi;
Begin clrscr;
with ogrenci do begin
write('Isminiz:' );readln(isim );
write('1. Sinavin sonucu:' );readln(not1 );
write('2. Sinavin sonucu:' );readln(not2 );
write('3. Sinavin sonucu:' );readln(not3 );
orta(not1+not2+not3 )/3;
write('Ortalamaniz: ' );write(orta:5:2 );
end;
readln;
end.
PASCAL:IF .. THEN
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 scriptlerinde ) 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:
Islem Anlami
= 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.
in Iç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 beslik1;
if (yuzluk>=45 ) and (yuzluk<=54 ) then beslik2;
if (yuzluk>=55 ) and (yuzluk<=69 ) then beslik3;
if (yuzluk>=70 ) and (yuzluk<=84 ) then beslik4;
if yuzluk>=85 then beslik5;
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 beslik3;
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 beslik3;
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 beslik3;
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:
Ifade Anlami
AND Ve demektir. Arasina konuldugu iki (ya da daha fazla ) sartin hepsinin dogru oldugu durumlarda sonuç dogru, aksi halde yanlis olur.
OR Veya 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.
NOT Degil 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.
Bir programi programlama dillerinde yazdigimizi ögrendik. Programlama dilinin ne oldugunu daha sonra anlatacagim. Programlama dillerinde bir program yazarken yapilan her isleme komut ve bu komutlarin bütününe de programin kodu denilir. Yani biz bir programi kodlariz. Ancak bu kodlari belirli sirada ve düzende vermek zorundayiz. Yoksa pek de akilli olmayan bilgisayarimiz bunlari kendine göre siraya koyamaz. Biz ona hangi islemi ne zaman yapacagini söyleriz. Gerekirse bazi komutlari hiç isleme sokmamasini, bir komutu birden çok defa icra etmesini ya da belirli sartlarda ne yapmasi gerektigini bilgisayara anlatmak için bir düzen içinde kodlarimizi yazmaliyiz. Iste bu düzene programin akisi ve bu akisin tamamina da programin algoritmasi denilir.
Çok akilli bir robot düsünelim. Bu robot sesle çalissin. O zaman her sözümüz robot için bir komuttur. Robota egil dersek egilir. Bu onun için bir komuttur. Ancak robottan yerdeki kalemi size vermesini isteyecekseniz belki birden fazla komut kullanmak zorundasiniz. Mesela bu örnek için robota 4 tane komutu söyle verebilirsiniz:
1 ) Egil.
2 ) Kalemi al.
3 ) Ayaga kalk.
4 ) Kalemi bana ver.
Bu seklide verdiginiz 4 komutun tümüne birden program diyebiliriz. Mesela bu robotun programlanabilir özelligi de olsun. Siz bu robota bu 4 komutu birden ögretip de bundan sonra her "kalemi ver" dediginizde bu isi yapmasini saglayabilirsiniz. Bundan robot, sonra siz "kalemi ver" komutunu söyleyince hemen daha önceki programi çalistirir ve bu 4 islemi yaparak sonuçta kalemi size verir. Peki programdaki 3. satirla 2. satiri yer degistirirseniz robot ne yapar. Egilir kalkar ve kalemi almaya çalisir ama kalem yerde oldugundan alamaz ve komutunuz dogru çalismaz. Dogru çalismasi için yukardaki sirada verilmelidir. Iste bu robotunuzun kalem verme algoritmasidir.
Daha anlasilir ve günlük hayatta çok kullandigimiz bir örnek verelim. Mesela kis ayindayiz ve evden disari çikacagiz. Pencereden bakiyoruz. Hava yagmurluysa semsiyemizi alalim, degilse almayalim ve disari çikalim. Bu isin algoritmasini örnegin 2 yolla kurabiliriz. 1.'si:
1 ) Pencereden disari bak.
2 ) Eger hava yagmurluysa semsiyeni al.
3 ) Disari çik.
Bir kisiye bu üç komutu verirseniz hemen pencereden disari bakar ve eger hava yagmurluysa semsiyesini alir ve sonra disari çikar. Dikkat ettiyseniz "Eger hava yagmurlu degilse" gibi bir sart yok. Zaten 2. sart yanlissa 3. adima geçeceginden semsiyesiz olarak disari çikmis olur. Bu olayi birde su algoritma ile yapalim:
1 ) Pencereden disari bak.
2 ) Eger hava yagmurlu degilse 4. adima geç.
3 ) Semsiyeni al.
4 ) Disari çik.
Gördügünüz gibi ayni isi 2 farkli algoritma ile yaptik. Dikkat ederseniz iki islemin de ayni sonucu verecegini görürsünüz. Bu sefer tersten yaptik isi. 2. adim bir karar verme adimidir ve eger hava yagmurlu degilse 4. adima geçmeye karar veriyor, 3. adim yapilmamis (atlanmis ) oluyor ve semsiye alinmadan disari çikiliyor. Eger 2. adimdaki sart yanlissa, yani hava yagmurluysa 4. adima geçmiyor ve 3. adimdan devam ediyor islemlere. Bu durumda semsiye de alinmis oluyor.
Buraya kadar okuduklarimiza göre programciyi "Problemi analiz eden ve onu bir programlama dili ile bilgisayara anlatan, yazan, programlayan kisi" olarak tanimlayabiliriz. Algoritma ise "Programcinin Problemi analiz ettikten sonra onu en kisa ve en hizli çözmek için gelistirdigi yoldur".
Artik genel olarak algoritmayi anlamis olduk. Pascal'da Programlamayi anlatirken de yeri geldikçe algoritmalardan yararlanacagiz. Sunu unutmayalim ki iyi bir program önceden tasarlanmis ve bütün kullanim amaçlari belirlenmis programdir. Aksi takdirde isimiz hizlanacagina yavaslayabilir de..
PASCAL:İ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.
PASCAL:İLK ÖRNEK
Genelde bir programlama dili ögrenilirken ilk yazilan aktif program ekrana "Merhaba Dünya" yazdiran programdir.Bu o kadar klasiklesmistir ki neredeyse bir standart haline gelmistir.Bende bu kurali bozmak istemiyorum.Iste "Merhaba Dünya" programinin kodlari...
Program merhaba;
begin
write ('Merhaba Dunya' );
readln;
end.
Derleyip çalistirin sonucu göreceksiniz.Burada write komutu parantez ve tirnak isaretleri arasindaki stringi(sayi olmayan-alfanümerik ) yazdirmaya yarar.Bu da ayni sonucu veren fakat kodu farkli olan bir program.
begin
write ('Merhaba ' );
write ('Dunya' );
end.
Gördügünüz gibi tirnak isaretleri içindeki boslukta programa yansiyor.Isterseniz o boslugu kaldirip programi derlemeyi deneyin.Merhaba ve Dunya kelimelerinin bitisik yazildigini göreceksiniz."write" komutu tek satira yazi yazmak için kullanilir."writeln" komutu ise stringi yazip imleci bir alt satira atlatir.Asagidaki örnegi inceleyin.
Program merhaba3;
begin
writeln('Merhaba Dunya' );
writeln('Merhaba Mars' );
writeln('Merhaba Saturn' );
end.
"readln" komutu kullanicinin programa girdi girmesine izin verir.Girdi girisi Enter tusuyla sonlandirilir.Bu girdi bir degiskene atanabilir yada hiçbirsey yapmadan kullanicinin Enter tusuna basmasi beklenebilir.Asagidaki örnegi incleyin.
Program readln1;
begin
writeln('Programi sonlandirmak icin Enter tusuna basiniz.' );
readln;
end.
PASCALEĞİŞ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.
Degisken 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 adi
Sinirlari
Kapladigi alan
Shortint
-128..127
1 byte
Byte
0..255
1 byte
Integer
-32768..32767
2 byte
Word
0..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. Hemen bunlarla ilgili birkaç örnek program yapalim.
Ö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.
Program Toplama_Denemesi;
Uses Crt;
Var
sayi1,sayi2: integer;
toplam: integer;
Begin clrscr;
sayi119;
sayi281;
toplamsayi1+sayi2;
write('Bu sayilarin toplami=',toplam );
readln;
end.
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 );
ca*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! ).
Char Degisken Tipi:
String degiskenler 255 karakterlik veri alabiliyordu. Char ise tahmin edeceginiz gibi daha fazla karakter almiyor! Char tipinde bir degisken yanlizca bir adet karakter alabilir ve bir byte yer kaplar hafizada. Yine string tipindeki gibi deger atamasinda iki apostrof isareti arasina en fazla 1 karakter olabilecek sekilde yazilir. Örnek bir program yapalim daha iyi anlariz.
Program Char_Tipinde_alistirma;
Uses crt;
var
c: char;
isim: string;
a: byte;
begin
clrscr;
write('Yine adinizi girin bakalim....: ' );readln(isim );
write('Simdi en fazla ',length(isim ),' olacak sekilde sifindan büyük bir sayi giriniz: ' ); readln(a );
cisim[a>;
writeln('Sizin isminizin ',a,'. harfi "',c,'"' );readln;
end.
Bu örnek simdiye kadar yaptiklarimizin en karisigi gibi gözükebilir ama biraz dikkat ederseniz anlayacaginiz kesin. clrscr; komutuna kadar olan yeri biliyorsunuz. Ondan sonra isim adli degiskene ekrandan (daha sonra ayrintili olarak anlatacagimiz sekilde ) bilgi girilmesi isteniyor. Ondan sonra yazilan write ifadesinde bilmedigimiz birsey var. Length fonksyonu bir string tipli ifadenin kaç karakter uzunlugunda oldugunu verir. Bunu da daha sonra anlatacagiz. Ondan sonra cisim[a>; ifadesinde c adli char degiskene isim degikeninin a. karakterini atiyoruz. Mesela isminiz "Osman" ise ve a degerine de 3 girdiyseniz c ifadesinin karsisindaki deger 'm' olur. Yani c degiskeninin degerine 'm' harfini (karakterini ) atamis oluruz. Programi birkaç defa çalistirarak daha iyi anlayabilirsiniz.
Tabii bu sekilde bizim pek isimize yaramayabilir ama özellikle bir char tipindeki degiskeni readkey komutuyla kullanilarak faydalanabiliriz. Bunlara ilerde deginecegiz.
Bunlarin disinda su anda hemen kullanamayacak olsak da diger tiplere de kisaca deginelim.
Boolean Tipli degiskenler:
Degeri ya TRUE (dogru ) ya da FALSE (yanlis ) olabilen degiskenlerdir. Mantiksal karsilastirmalarda kullanilabilir. Hafizada 1 byte alan kaplar.
Bundan sonraki tipdeki olan dizi ve record tipleri için sonraki derslerde özel bir bölüm açip anlatacagi çünkü kullanim alanlari çok genis.
Dizi (Array ) tipli degiskenler:
Dizi degisken genelde benzer bilgileri bulunduran degiskenlerdir. Örnek verirsek daha iyi anlasilir. Önceki programlarimizin birisinde hatirlarsaniz bir ögrencinin üç notunun ortalamasini bulmustuk. Peki 1 degil de 100 ögrenci varsa ne olacak. Her birisi için üç not ve bir ortalama olmak üzere 4 degisken tanimlarsak toplam 400 degisken tanimlamamiz lazim. Bu hem çok uzun zaman alir, hem de degisken isimlerini birbirine karistirmamiz olasidir. Bunun yerine 100 ögrencinin 3'er notunu ve ortalamasini sadece 2 degisken kullanarak kolayca tutabiliriz. Bunun için degisken tanimlarimiz
Var
notlar: Array[1..100,1..3> of byte;
ortalama: Array[1..100> of real;
seklinde olmalidir. Simdilik bunlari nasil kullanacagimiz fazla deginmeden geçelim çünkü diziler diye ayri bir bölümde hepsini anlatacagim.
Kayit (Record ) tipli degiskenler:
Simdiye kadar bir ögrencinin adi, notlari ve ortalamasi için ayri degiskenler kullandik. Peki bunlarin hepsini bir ana degiskenin alt degiskenleri olarak tutsak daha kolay ve anlasilir olmaz mi? Özellikle bu tip degiskenler dosyalama konusunda çok isimize yarayacak. Genel olarak tanimlamasi su sekildedir:
Type
kayit_tipi=Record
degiskenler...
end;
Var
kayit_adi = kayit_tipi;
Gördügünüz gibi bu tip bir degiskeni tanimlamak için type etiketini kullaniyoruz ve yeni bir tip olusturuyoruz ilk önce. Sonra bir degiskeni tipi bu olacak sekilde tanimliyoruz. Hemen örnek bir program yazalim. Bunu kendi ellerinizle yazmalisiniz (ben de hep öyle yapiyorum ):
Program Filiz;
uses crt;
type
ogrenci_tipi=Record
isim: string[40>;
not1: byte;
not2: byte;
not3: byte;
orta: real;
end;
Var
ogrenci: ogrenci_tipi;
Begin clrscr;
write('Isminiz:' );readln(ogrenci.isim );
write('1. Sinavin sonucu:' );readln(ogrenci.not1 );
write('2. Sinavin sonucu:' );readln(ogrenci.not2 );
write('3. Sinavin sonucu:' );readln(ogrenci.not3 );
ogrenci.orta(ogrenci.not1+ogrenci.not2+ogrenci.not3 )/3;
write('Ortalamaniz: ' );write(ogrenci.orta );
readln;
end.
Gördügünüz gibi kayit tipindeki bir degiskenin alt degiskenini nokta ile ayirarak kayit_degiskeni.alt_degisken seklinde yaziyoruz. Isterseniz with deyimini kullanarak alt degisken isimlerini direk de kullanabilirsiniz:
yastik;
uses crt;
type
ogrenci_tipi=Record
isim: string[40>;
not1: byte;
not2: byte;
not3: byte;
orta: real;
end;
Var
ogrenci: ogrenci_tipi;
Begin clrscr;
with ogrenci do begin
write('Isminiz:' );readln(isim );
write('1. Sinavin sonucu:' );readln(not1 );
write('2. Sinavin sonucu:' );readln(not2 );
write('3. Sinavin sonucu:' );readln(not3 );
orta(not1+not2+not3 )/3;
write('Ortalamaniz: ' );write(orta:5:2 );
end;
readln;
end.
PASCAL:IF .. THEN
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 scriptlerinde ) 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:
Islem Anlami
= 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.
in Iç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 beslik1;
if (yuzluk>=45 ) and (yuzluk<=54 ) then beslik2;
if (yuzluk>=55 ) and (yuzluk<=69 ) then beslik3;
if (yuzluk>=70 ) and (yuzluk<=84 ) then beslik4;
if yuzluk>=85 then beslik5;
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 beslik3;
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 beslik3;
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 beslik3;
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:
Ifade Anlami
AND Ve demektir. Arasina konuldugu iki (ya da daha fazla ) sartin hepsinin dogru oldugu durumlarda sonuç dogru, aksi halde yanlis olur.
OR Veya 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.
NOT Degil 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.

