PROGRAMIN EVRELERİ

Bir bilgisayar programının çalışır duruma gelebilmesi için şu evrelerden geçmesi gereklidir:

  1. Kaynak Programın Yazılması: Bilgisayara yaptırılacak işleri ifade eden komutlar, herhangi bir programlama dilinde metin (text) olarak yazılır. Buna kaynak program denir. Pascal dilinde yazılmış kaynak programların adına .PAS uzantısı eklenir.
  2. Kaynak Programın Derlenmesi: Kaynak programın makina diline çevrilmesidir. Bu işi derleyici yapar. Derlenen kaynak programın adına .OBJ uzantısı eklenir.
  3. Programların Birleştirilmesi (Link): Bazan bir program, daha önce derlenmiş başka programlarla birleştirilir. Bu işi birleştirici (linker) yapar. Linker, istenen birleştirme işini yapar ve program adına .EXE uzantısını ekler. .EXE uzantılı dosyalar, makina diline çevrilmiş, gerekli birleştirme işlemleri yapılmış ve çalışabilir duruma gelmiş dosyalardır. Bu dosyaları çalıştırmak için, adlarını yazmak yeterlidir.

Farklı bilgisayarların Pascal derleyicileri birbirlerinden farklı olduğu gibi, aynı marka ve modelde çalışan farklı Pascal derleyicileri de vardır. Standart Pascal'da, kaynak programda kullanılan deyimler, her derleyici için aynıdır. Donanımın gelişmesine paralel olarak, yazılım şirketleri birbirlerinden farklı Pascal derleyicileri hazırladılar. Bu derleyiciler, genel olarak standart Pascal'ın sözdizimi yapısını esas alırlar, ama aralarında bazı farklar olur. Dolayısıyla, hangi Pascal derleyicisi kullanılacaksa, kaynak programın ona göre yazılması gerekir.

Derleyiciler, piyasadan satın alınabilir. Ayrıca, İnternet'ten indirilebilecek bazı ücretsiz derleyiciler de vardır. Bu kitaptaki örnekler, Borland'ın Turbo Pascal For Windows (TPW) derleyicisine uyacak biçimde yazılmıştır. Başka bir derleyici kullanıyorsanız, derleyicinizin kılavuzuna bakarak, programda muhtemelen gerekebilecek ufak değişiklikleri yapabilirsiniz.

TP Kullanıyorsanız Yapacağınız İşler

Borland yazılım şirketinin hazırlamış olduğu Turbo Pascal adlı bütünleşik yazılımların farklı sürümleri (version) vardır. Bu sürümlerin hemen hepsi kaynak programı yazmaya yarayan bir editör (kelime işlemci), bir derleyici(compiler), bir düzeltici (debugger) ve bir birleştirici (linker) yazılımını içeren bütünleşik birer yazılımdır.

Ayrıca, bir ana menü yardımıyla program kaydetme, program arayıp açma, program adını değiştirme, program koşturma gibi işletim sistemiyle ilgili birçok işlevi de yaparlar. Daha sonra, başka yazılım şirketleri de benzer işleri yapan bütünleşik yazılımları piyasaya çıkarmışlardır.

Kaynak programların adında .PAS uzantısı olur. TPW editörü de dahil olmak üzere, bütünleşik derleyicilerin çoğu, kaynak program kaydedilirken, programın adına .PAS uzantısını kendiliğinden ekler. Başka bir editör kullanıyorsanız, kaynak programı kaydederken, adının sonuna .PAS uzantısını yazmalısınız. Bu uzantı, kaydedilen dosyanın bir Pascal kaynak programı olduğunu belirtir. Kaynak program derlenince, makina diline çevrilen programın adı, .OBJ uzantısını alır. Bu işi Pascal derleyicisi yapar.

Linker, object programı yürütülebilir program haline getirir. İsteniyorsa, daha önce derlenmiş başka programlarla birleştirir. Yürütülebilir (executable) programın adı .EXE uzantısını alır. Bu işi linker yapar. Turbo Pascal'ın yaptığı bu işler, başka şirketlerin hazırladığı bütünleşik derleyiciler tarafından da yapılır. Dolayısıyla, elinizde bir Pascal derleyicisi varsa, program yazımında yapacağınız basit değişikliklerle, onu kullanabilirsiniz.

Bütünleşik Bir Yazılım Kullanmıyorsanız Yapacağınız İşler
  1. Bir EDITOR (kelime işlemci) yükle.
  2. EDITOR ile kaynak programı yaz.
  3. Yazdığın kaynak programı kaydet (flopy disket, sabit disk, teyp v.b.).
  4. Kaynak programı yazdığın dile uygun DERLEYİCİ (Compiler)'yi yükle. Gelen iletilere uyarak, derleyeceğin pascal programını ve onun bulunduğu yeri, derleyiciye bildir.
  5. Geçiş evreleri tamamlanınca, derleyici kaynak programı makina diline çevirmiş olur. Çevrilen biçim kendiliğinden kaydedilir. Değişik makinalarda ve değişik derleyicilerde bunlara değişik adlar verilir. Genelde, derleyicinin yarattığı bu kodlara OBJECT kütük denilir.
  6. LINKER'i yükle. OBJECT kütüğü bulacağı adresi yaz. LINKER object kütüğünde olmayan gerekli fonksiyonlar için LIBRARY'ye bakar; bulunca onları birleştirir. Birleşik biçim için makina kodunu yaratır ve kaydeder
  7. .
  8. LINKER birbirlerinden ayrı olarak yazılmış kaynak programlardan yaratılan OBJECT kütükleri de birleştirerek tek bir program haline getirebilir.
  9. Bu birleşme işinin nasıl yapılacağı makinaya, derleyiciye ve linkere bağlı olarak farklılıklar gösterir. Kullanıcı bu süreçler için ilgili kılavuzlara bakmalıdır.
  10. DOS işletim sistemi altında çalışan derleyici ve linkerler ile yaratılan makina kodları EXE uzantısını alırlar (DOS İşletim Sistemi, EXE uzantılı dosyaları COM uzantılı dosyalara dönüştürebilir. Ama bu şimdiki konumuzun dışındadır).
  11. Linker'in yarattığı bu son birleşik kodlar yürütülebilir biçime getirilmiş programlardır. Bu programları işletmek için adlarını yazıp ENTER tuşuna basmak yeterlidir.
  12. DEBUGGER: Derleyicinin kaynak programda gördüğü yanlışları düzeltmeye yarayan programdır.

Son yıllarda yazılan bazı bütünleşik (entegre) programlarda yukarıda sıralanan evreler kısmen ya da tamamen kendiliğinden yapılmaktadır. Birçoğunda kendi EDİTÖR'ü vardır. Ana menüden kullanıcının istediği seçenekler yapılır. Örneğin TURBO PASCAL, TURBO C, Zortech C++ gibi entegre programlar bunlara örnektir. Bu derslerde, bunlardan birisi olan TPW (Turbo Pascal for Windows adlı bütünleşik yazılımı kullanacağız.

Pascal ile Programlamaya Giriş

PASCAL Programlama Dili, 17.yüzyılda yaşamış olan ünlü matematikçi Blaise Pascal'a adanmıştır.

Pascal Derleyicisi, 1971 yılında, Zürih Üniversitesi matematik profesörlerinden Niklaus Wirth tarafından yazılmıştır. Öz olarak, ALGOL (Algoritmic Language) dilinin niteliklerini taşır. Başlangıçta, Bilgisayar Programlama işini kolay öğretme amacını güden eğitim amaçlı bir dil olarak ortaya çıkmıştır. Ama, daha sonraları, hızla yayılmış ve geniş uygulama alanları bulan genel amaçlı bir programlama dili olmuştur.

Pascal Dili, yapısaldır. Bu derslerde bu yapıyı öğreneceğiz. Şimdilik, kısa bir açıklama ile yetinelim. Her programın bir başlığı, bir yürütme bölümü vardır. Gerekiyorsa, programın kullanacağı başka programları çağıran çağrı bölümü ve kullanacağı nesnelerin tanıtıldığı bir bildirge bölümü eklenir. Dersin ilerleyen bölümlerinde açıklanacak olan bu yapısallık niteliği, 1960'lı yıllarda bilgisayara egemen olan FORTRAN ve COBOL dillerine göre üstün bir nitelik getirmiştir. Bu nitelik, PASCAL ile program yazmayı çok kolaylaştırmıştır.

Her dilde olduğu gibi, kendisine özgü bir yapısı yanında, PASCAL deyimlerinin özel bir sözdizimi vardır. İngilizce sözcüklerden oluşan sözdizimi, konuşma dilinden alındığı için öğrenilmesi kolaydır. Bu derste, Pascal'ın yapısını, deyimlerini ve deyimlerin sözdizimini çok basitten başlayarak adım adım öğreneceğiz.

Kaynak Program

Bir kaynak program, bilgisayara istenen işleri yaptırmak için, bir programlama dilinde yazılmış sıralı komutların bütünüdür. Buna neden kaynak program dediğimiz, biraz sonra daha iyi anlaşılacaktır. Ancak, bir karışıklık olmayacağı zaman, kaynak program demek yerine, kısaca, program diyeceğiz.


Bir Pascal Programının Yapısı
Başlık Program Belirtke(Çağrılı dosyaların listesi);
Birim Çağırma uses Çağrılı_birimin_adı;
Bildirge Bölümü
label
Akışın sapacağı satırların listesi
const
Sabitlerin Listesi
type
Veri Türü Tanımları
var
Değişkenlerin Listesi
procedure
Procedure'lerin Tanımı
function
Fonksiyonların Tanımı
Yürütme Bölümü
BEGIN
Deyimler;
END.


Program İçinde Açıklamalar

PASCAL programında derleyicinin işlemeyeceği ama programcının görmesinde yarar görülen açıklama ya da uyarılar { } parantezleri arasına yazılır. Bu parantezler klavyede yoksa, onların yerine (/* */) simgeleri kullanılabilir.

Belirtke (Identifier)

PASCAL'da kullanıcının tanımladığı her nesnenin (sabit, değişken, fonksiyon, procedure, unit ve program) bir adı bir kimliği vardır. Bu adlar programda kullanılan nesnelerin birbirlerinden ayrılmalarını sağlar.

Her nesneye bir ad verilir. Bu ada belirtke (identifier) denilir. Belirtke bir karakter dizisidir.

Adlandırma, genellikle, kullanılan işletim sistemine bağlıdır. DOS İşletim Sisteminde, PASCAL'ın belirtkeleri, İngiliz alfabesindeki bir harfle başlar, sonrakiler harf veya rakam olabilir. Ç,ç,z,ğ,İ,ı,Ö,ö,œ,ş,Ü,ü harfleri kullanılamaz. Belirtke tek bir sözcükten oluşur, sözcük yazılırken karakterler arasında boşluk bırakılamaz. Büyük harf-küçük harf ayrımı yoktur.

Unix, NT vb. işletim sistemlerinde belirtke uzunluğu 32 karaktere ulaşabilir. DOS'ta ise 8 karakterle sınırlıdır.

Örnekler
Belirtke Geçerliliği Geçersizlik Nedeni
Vergi Geçerli
AS94 Geçerli
KuVVet Geçerli
Çarpım Geçersiz Ç ve ı kullanılamaz
Gelir Gider Geçersiz Boşluk kullanılamaz
Hey! Geçersiz ! harf değil
99Muhasebe Geçersiz Rakamla başlayamaz

Program başlığı

Bir Pascal kaynak Programı Program anahtar sözcüğü ile başlar. Yürütme bölümündeki END 'in sonuna konulan (.) nokta ile biter.

Program başlığı, derleyiciye, programın başladığı yeri, yürütme bölümünün sonundaki END 'in sonuna konulan (.) nokta ise, programın bittiği yeri bildirir.

Dolayısıyla, her Pascal Kaynak Programına bir başlık koyarız. Sözdizimi şöyledir:
	Program Belirtke(Input, Output);
Burada Program anahtar bir sözcüktür. Belirtke ise, programa verilen bir ad bir kimlik'tir. (Input, Output) ise, Pascal'ın ilk sürümlerinde Giriş/Çıkış işlemlerini yapan iki yazılımdır. Örneğin,
	Program Merhaba(Input, Output);
Ancak, çağdaş derleyicilerde, Giriş/Çıkış işlemleri çok çeşitlenmiştir ve artık belli bir kanaldan (channel) veri alma ya da belli bir kanala veri gönderme işlemi olarak yorumlanmalıdır. Dolayısıyla, ilk sürümlerde Giriş/Çıkış işlemlerini yapan (Input, Output) yazılımları yerine, bir çok yeni derleyicide, başka yazılımlar konulmuştur. Örneğin, TPW derleyicisinde bu işi yapan wincrt adlı bir birim (unit) dir. Kaynak programa bu birimin çağrılması gerekir. Bunun söz dizimi şöyledir:
	Program Merhaba;
	uses wincrt;

DOS işletim sisteminde Pascal Kaynak Programlarının adlandırılması şöyledir:

 
	| | | | | | | | | .pas 
Buradan anlaşıldığı gibi, en çok 8 karakter uzunluğunda ad, onu izleyen bir (.) nokta ve onu izleyen PAS uzantısı olmalıdır. Tabii, DOS işletiminde .PAS uzantısı zorunlu değildir; ama derleyicinin Pascal Kaynak Programlarını tanıyıp diğerlerinden ayırt edebilmesi için yararlıdır:


Bildirge

Bildirim Zorunludur

Bir Pascal Kaynak Programı, şu nesneleri kullanabilir:

Label (etiket), const (sabit), type (tip, veri-türü), var (değişken), procedure (yordam) ve function (fonksiyon).

Pascal nesnelerinin ( label, const, type, var, procedure ve function) hepsi bir programda yer almayabilir. Ancak programda kullanılacak her nesnenin bildirge bölümünde tanımlanması gerekir.

PASCAL Kaynak Programı'nda tanımlanmayan bir etiket, sabit, tip, değişken, prosedür veya fonksiyonu derleyici tanımaz.

Bildirge bölümünde yer alan procedure ve fonksiyonlar diğer dillerdeki alt programlar 'ın işlevini görür. Unit, procedure ve fonksiyonların yapıları da bir PASCAL programının yapısına benzer. Herbirisinin bir başlığı, varsa çağrılı dosyalar, bildirge bölümü ve yürütme bölümü vardır. PASCAL da bu yapı benzerliği, program yazmayı çok kolaylaştırır.

Bildirimin Geçerlilik Alanı

Bildirge bölümünde tanımlanan nesnelerin (label, const, type, var, procedure, fınction) her birisine ana bellekte birer yer ayrılır. Bu yerlere o nesnelerin adresi denilir. Ayrılan yer, o nesnenin sığacağı büyüklüktedir.

Bir nesneye ayrılan yer, o nesnenin tanımlandığı blok (program, procedure, function) içinde geçerlidir. İç-içe bloklar tanımlandığında, içteki blok dış bloktaki nesneleri tanır; ama dıştaki blok iç bloklarda tanımlanan nesneleri göremez. Bunun ne anlama geldiğini ileride örneklerle açıklayacağız.

Burada label, const, var bildirimlerinin nasıl yapıldığını örneklerle göstereceğiz. Type, procedure, function bildirimlerini ise, dersin ilerleyen bölümlerinde ele alacağız.

Label Bildirimi

Label (etiket), kaynak programda referans edilmesi istenen satırlara numara veya ad verme olayıdır.

GOTO deyimi, BASIC COBOL, FORTRAN vb. dillerde, program akışının sapacağı satırları belirlemek için, kaçınılmaz olarak kullanılır. Program akışının sapacağı satırları belirtmek için o satırlara birer numara veya ad verilir. Bunlara label (etiket) diyoruz. GOTO deyimi PASCAL'da da kullanılabilir. Ancak, PASCAL gibi yapısal dillerde GOTO deyiminin kullanılması arzu edilmez ve gerekli de değildir. Örnek olarak, ileride label'in ve GOTO deyiminin kullanıldığı programlar yazacağız.

Yürütme Bölümü

Bildirge Bölümünden sonra gelen

	BEGIN
		Deyimler;
	END.
	
bölümü, programın yürütme bölümüdür. Programı koşturan deyimlerin hepsi burada yer alır.

Kaynak Programın yürütme bölümündeki END 'den sonra konulan (.) noktanın, programın sona erdiğini bildirdiğini söylemiştik. Procedure ve function 'un Yürütme Bölümlerinin sonundaki END de procedure veya function'un sona erdiğini bildirir; ama nokta (.) yerine noktalı virgül (;) konulur.

Girdi/Çıktı (Input/Output)

Bir bilgisayar programına bir iş yaptırmak için gerekli bilgilerin (veri) girilmesi ve bilgisayarda işlenen verilerin geri alınması gerekir. Bu iki işleme, sırasıyla, Girdi/Çıktı (Input/Output) işlemleri denilir.

Bilgisayar programı için gerekli olan veriler, istenirse kaynak programın içine konulabilir. Ama, çok sayıda veri kullanılacaksa, bu yöntem hiç uygun değildir. Çünkü kaynak programı gereksiz yere çok büyütür. Dahası, verilerdeki her değişim kaynak programın değiştirilmesini gerektirir.

Bu nedenlerle, programın kullanacağı verileri, program koşarken gerektiği yerde bilgisayara girmek en uygun ve en kolay yoldur.

Pascal, işleyeceği verileri, herhangi bir giriş biriminden alabilir. Genellikle, giriş işlemi için veriler ya klavyeden girilir ya da daha önce kaydedilmiş bir dosyadan okunur. Eğer, bilgisayarınız bir ağa bağlı ise, ağ üstündeki başka bir bilgisayardan da veri alabilir.

Bilgisayarda işlenen verilerin istenildiği biçim ve sırada geri dönmesi gerekir. Aksi halde, programın ne yaptığını bilemeyiz.

Pascal, işlediği verileri, herhangi bir çıkış birimine gönderebilir. Çıkış birimi ekran, yazıcı, dosya, ses aygıtı, ağ ile bağlı başka bir bilgisayar vb olabilir.

Pascal'a veri giriş ve çıkışını yapan iki fonksiyon vardır:
Read( )
Giriş işlemlerini yapar.
Write( )
Çıkış işlemlerini yapar.

Bu fonksiyonlar, Pascal'da çok hünerli iki fonksiyondur. Her türlü giriş çıkış işlemlerini istenilen biçim ve sırada yapabilirler. Bu hünerlerini nasıl kullanacağımızı adım adım öğreneceğiz.

Aksi söylenmediği sürece, girişler standart giriş biriminden olur. Bizim kullanacağımız sistemde standart giriş birimi klavyedir.

	read(x);
	readln(x);

deyimlerinin her ikisi de, standart giriş biriminden x değerini okur ve ana bellekte x için ayrılan adrese yerleştirir. Aralarındaki tek fark, ikinci deyimin x değerini okuduktan sonra yeni satıra geçmesidir. Böylece, üst satırda okunmamış veri kalsa bile, bundan sonraki okumalar yeni satırdan yapılır. Veri girişi klavye yerine dosyadan yapıldığında bu ayrım çok önemli olur.

Bazan birden çok değişkene bir tek read ya da readln fonksiyonu ile değer verebiliriz.

Write( ) Fonksiyonu

Write( ) ve WriteLn( ) fonksiyonları, Pascal'da bütün çıkış işlemlerini yaparlar. Bunlar ekrana, yazıcıya, dosyaya, ses aygıtlarına, başka bilgisayar vb çıkış birimlerine yapılacak çıkışlardır.

Aksi söylenmediği sürece, çıkışlar standart çıkış birimi 'ne gider. Bizim kullanacağımız sistemde standart çıkış birimi ekrandır.

Ayrıca, çıkışın biçimlenmesi de Write( ) fonksiyonunun görevidir.

Metin (Text) Çıkışı

Pascal'da bir karakteri (harf, rakam, simge) ya da bir metni (text), kesme işaretleri (' ') arasına alırız. Örneğin,

	
	WriteLn('A');
deyiminin çıktısı
	
	A
	
dır.
	
	WriteLn('Ankara başkenttir.');
deyiminin çıktısı ise şöyledir:
	
		Ankara başkenttir.
	
Write( ) ve WriteLn( ) fonksiyonları arasındaki tek fark, birincisi çıktıyı yapınca, imleç, çıktının bittiği yerde durur; yeni satıra geçmez. Oysa, ikincisi, çıktıyı yapınca, imleç, yeni satıra geçer. Böylece, üst satırda boşluk kalsa bile, bundan sonraki veriler yeni satıra yazılır. Veri çıkışı ekran yerine yazıcıya ya da bir dosyaya yapıldığında bu ayrım gene geçerlidir.

Şimdi bunların nasıl olduğunu örnekler üzerinde göstereceğiz. Örneğin,
	Write('İstanbul büyük bir kenttir.');
	Write('Ankara başkenttir.');
deyimlerinin çıktısı
	İstanbul büyük bir kenttir.Ankara başkenttir.

biçiminde aynı satıra yerleşir. Çünkü, ilk Write( ) fonksiyonu işlevini tamamlayınca, imleç satırbaşı yapmaz, çıktının bittiği yerde durur. İkinci Write( ) fonksiyonunun çıktısı, imlecin bulunduğu bu yerden başlar.

Öte yandan,
	WriteLn('İstanbul büyük bir kenttir.');
	WriteLn('Ankara başkenttir.');
deyimlerinin çıktısı
	İstanbul büyük bir kenttir.
	Ankara başkenttir.

biçiminde ardışık iki satıra yerleşir. Çünkü, ilk WriteLn( ) fonksiyonu işlevini tamamlayınca, imleç çıktının bittiği yerde durmaz, satırbaşı yapar. Dolayısıyla, ikinci WriteLn( ) fonksiyonunun çıktısı, imlecin bulunduğu yeni satırdan başlar.

Sayısal Veri Çıkışları

x sayısal bir değişken ya da bir sayı ise

TPW derleyicisi, özel bir biçim istenmezse, integer sayıları olduğu gibi yazar.Örneğin, x integer türünden bir değişken olarak tanımlanmış ve 5643 değeri atanmış olsun. Bu durumda,

	Write(5643);
	Write(x);

deyimleri aynı işi yaparlar ve ekranda imlecin bulunduğu yere 5643 sayısını yazarlar. Çıktılar arasında kendiliğinden boşluk oluşmayacağı için, bu iki deyimin çıktıları ekranda ardışık olarak yazılacak, dolayısıyla

	56435643

biçiminde görünecektir. Burada, program istenen işi doğru yapmıştır; ama çıktılar gözümüzün algılayabileceği biçime sokulmadığı için yanıltıcıdır. Bu tür göz aldanmalarından sakınmak için, çıktıları ekranda ya da kağıtta istediğimiz yere istediğimiz biçimde yazdırabiliriz. Örneğin, yukarıdaki iki çıktıyı birbirinden ayırmak için, birincisini 6 haneye sağa yanaşık olarak, ikincisini 10 haneye sağa yanaşık olarak yazdırmak isteyelim. Şu deyimleri kullanırız:

	Write(5643:6);
	Write(x:10);

Bu deyimlerin çıktısı şöyle olacaktır:

	| | |5|6|4|3| | | | | | |5|6|4|3|   

Buradan anlaşıldığı gibi, sabit ya da değişken bir x değerini, imlecin bulunduğu yerden başlayarak n hanelik (kolon) bir yere sağa yanaşık olarak yazdırmak için,

	Write(x:n);
deyimini kullanıyoruz. Sabit ya da değişken_değeri olan verimiz harf, metin, integer ya da real olabilir.

Bazan birden çok değişkeni bir tek Write ya da WriteLn fonksiyonu ile yazabiliriz. Örneğin, yukarıdaki iki deyimin yaptığı işi tek bir deyimle de yapabiliriz:

	Write(5643:6 , x:10);

Görüldüğü gibi, birden çok veriyi (sabit ya da değişken_değeri) yazdırmak için veriler arasına (,) virgül koymak yetecektir. Tabii, istersek, gene her bir veriye istediğimiz kadar hane (kolon) ayırabiliriz.

Aksi istenmezse, Pascal real türden verileri 16 haneye bilimsel biçimle yazar. Örneğin,

	Write(23.4768);
deyiminin çıktısı
	2.3476800000E+01

biçimindedir. Bu sayı 2.34768 x 1001 ye eşittir. Dolayısıyla, E+01 gösterimi 1001 anlamındadır.

Real verilerin kaç haneye yazılacağını ve kesirli kısmının kaç hane olacağını belirleyebiliriz. Örneğin, 23.4768 real sayısını 18 haneye iki ondalık kesirli ve sağa yanaşık olarak yazdırmak istersek,

	WriteLn(23.4768:18:2);

deyimini yazarız. Bunun çıktısı şöyle olur:

	| | | | | | | | | | | | | |23.48

Buradan görüldüğü gibi, real sayı iki ondalık basamaklı olarak görüntülenirken 23.4768 sayısı 23.48 sayısına yuvarlamıştır. Atılan ondalık kesrin ilk rakamı 5 ya da 5 den büyükse bir üst rakama yuvarlanır. 5 den küçükse bir küçük rakama yuvarlanır.

Ancak, bu yuvarlama yalnızca çıktıda oluşur. Ana bellekte sözkonusu değişkene ayrılan adreste real sayı 4 byte olarak korunur. Dolayısıyla, başka işlemlere girdiğinde, real sayı duyarlığını kaybetmez.

Write fonksiyonu, bir işlemin sonucunu da yazabilir. Örneğin, (25.75 / 5) * 3 işleminin sonucunu 8 haneye 2 ondalık basamaklı olarak çıktıya göndermek istersek,
	WriteLn( (25.75 / 5) * 3 : 8 : 2 );
deyimini yazmak yetecektir. Bu deyimin çıktısı,
	| | | |15.45 
	
olacaktır.

Özet

Write( ) fonksiyonu karakter, metin, integer, real, boolean türden verilerin ya da verilerle yapılabilen işlemlerin çıktısını tek tek yapabileceği gibi bunların istenen sıra ve biçimdeki bir dizisini de ekrana, yazıcıya ya da dosyaya yazabilir. Veriler sabit değerler olabileceği gibi, bir değişken değeri de olabilir. Değişken olduğunda, değişkenin adını yazmak yeterlidir. Karakter ya da metin sabitler (' ') kesmesi içine alınmalıdır.

Sözdizimi şöyledir:

	Write(parametre [:n[:m]], parametre [:n[:m]],...);

Burada [] içindekiler çıktıyı biçimlendirmek içindir; istenirse kullanılır.

Örnekler


Aşağıdaki program üç satırlık bir metin yazar.

Program Biçem_01
Program Format_01;
uses wincrt;

BEGIN
	WriteLn('İyi biçim programın anlaşılmasını kolaylaştırır.');
	WriteLn('Kötü biçim programın anlaşılmasını zorlaştırır.');
	WriteLn('Kaynak programınız anlaşılır biçimde olsun.')
END.


Aşağıdaki programı yazıp koşturunuz. İkinci satırdaki verinin metin olduğuna dikkat ediniz.

Program Biçem_02
Program Format_02;
uses wincrt;

BEGIN
	WriteLn('TAMSAYI ÇIKTILARININ BİÇİMLENMESİ');
	WriteLn('123456789012345678901234567890');
	WriteLn(123);
	WriteLn(12345);
	WriteLn(1234567);
	WriteLn(123:8);
	WriteLn(123:6);
	WriteLn(123:1);
	WriteLn(-123);
	WriteLn(-123:2);
	WriteLn(0);
	WriteLn(67, 84, 35, 98,86);
	WriteLn(123:-5)
END.


Aşağıdaki program, 123 ve 456 sayılarını birinci satırda integer olarak, ikinci satırda real olarak algılayacaktır. Programı yazıp koşturunuz ve çıktılar arasındaki farkı görünüz.

Program Biçem_03
Program Format_03;
uses wincrt;

BEGIN
	WriteLn(123,456);
	WriteLn(123.0,456.0)
END.


Aşağıdaki program, bilimsel biçimiyle girilen real sayıları istenen biçimde çıkarmaktadır. Son satırdaki Maxint, derleyicinin kabul ettiği en büyük tamsayıyı verecektir. Bu tamsayı sisteme bağlı olarak değişebilir. PC lerde 65532 olan bu sayı, büyük sistemlerde çok daha büyük değerdedir. Programı yazıp koşturunuz ve çıktılar arasındaki farkı görünüz.

Program Biçem_04
Program Format_04;
uses wincrt;

BEGIN
	WriteLn(11.234E2:10:2);
	WriteLn(-456.4E-3:10:5);
	WriteLn(-456.4E-3:10:3);
	WriteLn(6.345E2:10:2, 2.3145E2:10:2);
	WriteLn('Maxint = ', maxint);
END.


Aşağıdaki program, bir işlemin sonucunun çıktıya gönderilebileceğini göstermektedir. Programı yazıp koşturunuz ve çıktılar arasındaki farkı görünüz.

Program Biçem_05
Program Format_05;
uses wincrt;

var
   a,b :real ;
    
BEGIN
	WriteLn('Lütfen iki gerçel sayı giriniz.  > ');
	Readln(a,b);
	writeln(a:3 ,'*',b:3, '  = ',  a*b:15:3 );
	writeln(a:3 ,'+',b:3, '  = ',  a+b:15:3);
	writeln('Aritmetik ortalama = ', ((a+b)/2):  15:3);
	writeLn('ABCDEF':36);
END.


Aşağıdaki program, sabitler ve değişkenlerle yapılan işlemlerin sonucunun çıktıya gönderilebileceğini göstermektedir. Programı yazıp koşturunuz ve çıktılar arasındaki farkı görünüz.

Program Biçem_06
Program Format_06;
uses wincrt;
const
	a	= 3;
	b	= -5;
var
	x,y	: integer;
	r,s	: real;
	c		: char;

BEGIN
	x := 9*a;
	y := 2*b;
	r := x/y;
	s := (x+y)/3;
	c := 'T';
	writeln(a,b:8);
	writeln(a,b:8,x:8,y:8,s:6,'   ',c);
	writeln(15+5,' = ',20,'  is  ', 15+5=20);
	writeln('17 < 4  is  ', 17<4);
END.


Standart Pascal'da basit bir kaynak program şöyledir:

Program 01.01
	Program Merhaba(input,output);
	BEGIN
		WriteLn('Merhaba Pascal.');
	END.

Bu kaynak programda yalnızca başlık ve yürütme bölümü vardır. Kaynak program derlenip yürütülürse, ekrana

	Merhaba Pascal.
metni (text) ni yazar. Bu metin programın çıktısıdır. Bu çıktıyı yapan WriteLn fonksiyonudur.

Buradan görüldüğü gibi, bir Pascal Kaynak Programında başlık,

	Program 
	

sözcüğü ile başlar; program_adı onu izler. Örnekte Merhaba programın adıdır. Standart Pascal'da program adından sonra ( ) parantezi içine, programın çağırdığı dosyaların adları yazılır.

Yukarıdaki örnekte yazılı olan (input, output) Standart Pascal'da Giriş/Çıkış işlemlerini yapan fonksiyonlardır.

Programın yürütme bölümü

	BEGIN
		WriteLn('Merhaba Pascal.');
	END.

bölümüdür. Programın bitiş yeri, yürütme bölümünün sonudur. Programın bitiş yeri END' in sonuna konulan (.) nokta ile belirlenir. Bu noktayı koymak zorunludur. Çünkü, Pascal, programın bittiğini bu noktayı görünce anlayacaktır.

Taşınabilirlik

Bir programın taşınabilir olması demek, kaynak programın her donanım ve her derleyicide çalışabilir olması demektir.

Bu nedenle, program yazarken programın taşınabilir olması istenir. Bunun olabilmesi için, her derleyicinin aynı deyimlere sahip olması gerekir.

Ne varki, her programlama dili, donanımın gelişimine paralel olarak gelişir; yeni deyimler, yeni fonksiyonlar ve prosedürler eklenir. Bütün bunlar, program yazmayı kolaylaştırıcı araçlardır.

Ancak, farklı şirketlerin farklı donanımlar için geliştirdikleri yeni deyimler, kaçınılmaz olarak birbirlerinden farklı olur; dolayısıyla bir dilde genelliği ve standardı bozar.

Standardı korumak için ulusal ya da uluslararası bazı kuruluşların ciddi çabaları olmakla beraber, gelişimin doğal sonucu olarak, derleyiciler arasında farklılıklar oluşmaktadır.

Bu nedenle, program yazarken iki şeye dikkat edilmelidir.

  1. Kullanılacak derleyiciye uyum sağlamak,
  2. Mümkün olduğu kadar standart deyimleri kullanmak.

Girdi/Çıktı işlemleri için Standart Pascal'ın getirdiği yöntemler genelliği koruyamamıştır. Donanımın gelişimine paralel olarak, farklı şirketler farklı yöntemler geliştirmişlerdir.

Yeni derleyicilerin çoğunda, Girdi/Çıktı işlemleri başka programlara devredilmiştir. Örneğin, bu derste kullanılan, TURBO PASCAL FOR WINDOWS (TPW) derleyicisinde, ekrana yapılacak çıktılar wincrt adlı birim (unit) tarafından yapılmaktadır. Dolayısıyla, TPW derleyicisi için, yukarıdaki programı şöyle yazmak gerekir:

Program 01.02
	Program Merhaba;
	uses wincrt;
	BEGIN
		Writeln('Merhaba Pascal.');
	END.

TPW derleyicisinin ekrana çıktı gönderebilmesi için, mutlaka

	
	uses wincrt;
	

deyiminin kaynak programa konulması gerekir. Başka derleyicilerde, Giriş/Çıkış işlemlerini yapan programlar farklı olabilir. İkinci satır, kullanılan derleyiciye göre düzenlenmelidir. Her derleyicinin kılavuzu'na ya da Yardım Sayfası'na bakılmalıdır. Örneğin, DOS altında çalışan Turbo Pascal'da ekrana yapılan çıktılar crt programı (unit) tarafından yapılır. Dolayısıyla o derleyici için

	uses  crt; 

yazılmalıdır..

Hemen hemen her PASCAL derleyicisinde kendiliğinden açılan üç dosya vardır:

Input
Giriş işlemlerini yapar.
Output
Çıkış işlemlerini yapar.
Error
Derleme ya da koşturma sırasında oluşan hataları bildirir.

Bu üç program derleyici tarafından kendiliğinden açıldığı için, programcı kaynak programda bunlarla ilgili bir iş yapmak zorunda değildir.

Şimdi yukarıdaki programı biraz etkileşimli biçime dönüştürelim.

Program 01.03
	Program Merhaba(input,output);
	uses wincrt;
	Var
		kim	: string;
	BEGIN
		WriteLn('Adınız nedir ? ');
		ReadLn(kim);
		WriteLn('Merhaba', kim , ' !' )
	END.

Bu programın bildirge bölümünde, Var anahtar sözcüğü altında kim adlı bir değişken tanımlanmaktadır. Yürütme bölümü, BEGIN ... END. arasındaki deyimlerden oluşmaktadır. Yürütme bölümünde, birinci WriteLn fonksiyonu ekrana Adınız nedir ? mesajını yazar. Kullanıcının bu mesaja yanıt olarak klavyeden gireceği adı (metin), ReadLn fonksiyonu okur ve o yanıtı kim adlı değişkene atar. Üçüncü ve sonuncu satırdakki WriteLn deyimi, adı girilen kişiye Merhaba demektedir.

Deyim

Programa dikkatle bakarsak, her satırda bilgisayara bir iş yaptırıldığı ve bu işleri yaptıran ifadelerin sonunda (;) noktalı virgül olduğunu görürüz. Bilgisayara bir iş yaptıran ifadelere deyim diyeceğiz. Dilbilgisindeki anlamından farklı olarak, burada "deyim", komut yerine geçmektedir. Çoğunlukla, bilgisayara bir emir veren ifadeler tek bir sözcük değil, sözcüklerden ve başka simgelerden oluşan bir ifadedir. Bu nedenle, komut yerine deyim sözcüğünü kullanacağız. Örneğin,

	kim	: string;

bir deyimdir ve kim adlı string türünden bir değişken tanımlar. Benzer olarak, yürütme bölümündeki

	ReadLn(kim);

ifadesi de bir deyimdir. Bu deyim, kullanıcının klavyeden gireceği metni kim adlı değişkene atar ve bunu programın işlemesi süresince ana bellekte tutar.

Yukarıdaki programlarda, her deyim ayrı bir satıra yazılmıştır. Böyle olması, yalnızca kaynak programı okuyup algılamayı, gerektiğinde üstünde değişiklik yapmayı kolaylaştırmak içindir. Çünkü, Pascal'da deyimler biribirlerinden (;) ile ayırt edilir. Farklı satırlar deyimleri ayırmaz.

Ayrıca, Pascal'da büyük-küçük harf ayrımı yoktur. Programdaki bütün ifadeleri isterseniz büyük harflerle, isterseniz küçük harflerle, isterseniz karma biçimde yazabilirsiniz. Ancak, derleyici açısından farketmeyen bu durum, programı okuyanlar için fark edecektir. Programınızın kolay okunup anlaşılması ve gerektiğinde üstünde düzeltmelerin zahmetsizce yapılabilmesi için, alışılmış görsel kalıplara uymanız tavsiye edilir. Bu kalıpları, ders boyunca yazılan programlarda göreceksiniz.

Özetlersek, PASCAL programında belli bir işlevi olan her ifade bir deyimdir. Başlık bir deyimdir, bir label'in, bir sabitin,bir değişkenin bildirimi bir deyimdir. Bir işlem yaptıran her komut bir deyimdir. PASCAL'da deyimler noktalı virgül ile birbirlerinden ayrılır. Satırların veya boşlukların ayırıcı niteliği yoktur. Deyimlerin nasıl yazıldığını örneklerde göreceksiniz.

Uyarı:
Bazı programlama dilleri küçük-büyük harf ayrımı yapar. Örneğin C, Unix, PHP, Java,.. vb diller büyük-küçük harf ayrımına duyarlıdır.

Sabitler ve Değişkenler

Genel amaçlı programlama dillerinin hemen hepsi, verileri işlemek için, matematikte olduğu gibi sabit ve değişken kavramlarını kullanır.

Sabitler ve değişkenler kaynak programın bildirge bölümünde tanımlanır. Herbirine ayrı bir ad verilir. Program derlenip yürütülmeye başlanınca, tanımlanan bu adlara, ana bellekte birer yer ayrılır. Sabitlere ve değişkenlere atanan değerler bu adreslerde kullanılmaya hazır tutulur.

Bir program işlediği sürece değişmeyen verilerin tutulduğu öğelere sabit, program işlerken değeri değişebilen verilerin tutulduğu öğelere de değişken diyeceğiz.

Sabit Bildirimi
	Const
		Pi = 3.14159;

deyimi Pi adında değeri 3.14159 olan bir sabit tanımlar, 3.14159 sabitine ana bellekte bir yer (adres) ayrılır ve program boyunca bu adreste 3.14159 sayısı yer alır. Program içinde 3.14159 sabitinin, kullanıldığı her yerde 3.14159 sayısı kullanılmış olur.

Değişken Bildirimi

Programda kullanılacak her değişkenin önceden derleyiciye tanıtılması gerekir. Bu iş bildirge bölümünde var başlığı altında yapılır. Sözdizimi şöyledir:

	var 
		değişken- adı : veri-türü;
Örneğin,
	var
		Yaricap 	: real;
		Cevre    	: real;
bildirimi real türden Yaricap ve Cevre adlarıyla iki değişken tanımlar. Bu bildirim ana bellekte 4 byte uzunluğunda bir yer (adres) ayırır. Bu yer program boyunca korunur. Değişkene yapılan bir atama, onun adresine yazılır.

Değişkenlere nasıl değer atandığını biraz sonra göreceğiz. Ancak, onları daha iyi kavrayabilmek için, Pascal'ın kullandığı veri türlerini incelememiz yararlı olacaktır.

Veri Türleri

Sabit ya da değişken olarak bilgisayara girilen verilerin işlenebilmesi için, ana bellekte kendilerine ayrılan yerlerde program ( ya da alt program) boyunca tutulmaları gerekir. Sabitler ve değişkenler, harf, metin, tamsayı, kesirli sayı ve benzeri nesnelerdir. Bunların ikili sayıtlama sistemindeki ifadeleri farklı uzunlukta olacaklardır. Dolayısıyla, ana bellekte bunların kapsayacağı yerler (adresler) farklı büyüklükte olacaktır.

Her veri türüne tam ona yetecek kadar yer ayırabilmek için, bilgisayar programlama dilleri verileri türlerine ayırır. Değişken tanımlanırken türü belirtilir; böylece, ana bellekte ona yetecek kadar yer ayrılır.

Bir değişkenin ya da fonksiyonun alabileceği değerler kümesine veri türü denilir.

Yüksek düzeyli programlama dillerinin hemen hepsi, verileri belirli sınıflara ayırır. Başka bir deyişle, bir verinin bilgisayara girilebilmesi ve işlenebilmesi için belli bir sınıfa ait olması gerekir. Veri türlerinin sınıflandırılmasında, yazık ki, henüz evrensel bir uzlaşma yoktur. Farklı diller farklı sınıflandırmalar yaptığı gibi, aynı dilin farklı firmalar tarafından yaratılan derleyicileri de veri türlerini farklı sınıflara ayırmaktadır. Hatta, bir firmanın bir dile ait derleyicisinin farklı sürümleri bile farklı sınıflandırmalar yapmaktadır.

Veri türleri belirlenirken şu ilkelere uyulur:

Standart PASCAL dilinde veriler, scalar veri türleri ve yapısal veri türleri olmak üzere ikiye ayrılır. Bunların alt sınıfları için evrensel uzlaşma yoktur. Okura bir görüş vermek için, Turbo Pascal derleyicisinin yaptığı sınıflandırma örnek alınacaktır.

Scalar Veri Türleri

PASCAL dilinde scalar veri türleri ilkel (primitive) veriler, numaralanmış (sıralanmış, enumerated) veriler ve alt bölgeler (subrange) olmak üzere üçe ayrılır.

İlkel (Standart) Veriler

Dört tane ilkel veri türü vardır : integer, real, char, boolean.

Çağdaş PASCAL derleyicileri bu ilkel veri türlerini kendi içlerinde alt sınıflara ayırarak programcının gerekseyebileceği veri türlerini kullanıma sunmuşlardır.

Ordinal Veri Türleri

Integer, char, boolean, enumerated, subrange türleridir.

Bu kümeler matemetiksel anlamda iyi sıralıdır. Dolayısıyla, kümeye ait her öğenin bir sıra numarası vardır. Dolayısıyla herhangi iki öğe mukayese edilebilir. Kümenin bir ilki ve bir sonuncu öğesi vardır. Öteki öğelerin herbirisinin önündeki öğe (öncülü) ve sonundaki öğe (ardılı) belirlenebilir. Her ordinal küme üzerinde bu işleri yapan üç fonksiyon vardır:

Ord( )
x öğesi ordinal bir kümeye ait ise Ord(x) fonksiyonu x 'in sıra sayısını, yani küme içindeki sıralamaya göre kaçıncı öğe olduğunu verir.
Pred( )
x öğesi ordinal bir kümeye ait ise Pred(x) fonksiyonu, küme içindeki sıralamaya göre, x öğesinden önce gelen öğeyi (öncülü) verir.
Succ( )
x öğesi ordinal bir kümeye ait ise Succ(x) fonksiyonu, küme içindeki sıralamaya göre, x öğesinden sonra gelen öğeyi (ardılı) verir.

Ordinal veri kümeleri üzerinde aşağıdaki bağıntılar tanımlıdır:

Bağıntının Adı Simgesi Açıklama
Eşit x=y x öğesi y öğesine eşittir
Eşit değil (Farklı) x <> y x öğesi y ye eşit değildir (farklıdır)
Önce (küçük) x < y x öğesi y den öncedir (küçüktür)
Sonra (büyük) x > y x öğesi y den sonradır (büyüktür)
Küçük ya da eşit x <= y x öğesi y den öncedir ya da y ye eşittir
Büyük ya da eşit x >= y x öğesi y den sonradır ya da y ye e

Integer (tamsayı) Veri Türü

Tamsayıların alttan ve üstten sınırlanmış bir alt kümesidir. Sınırlar makinaya ve derleyiciye bağlı olarak değişir. PC ler için, genellikle, 2 byte uzunlukta bir adrese sığan tamsayılardır. Dolayısıyla -32768 ile +32767 arasındaki tamsayılardır. Örneğin 47, -326 sayıları integer türündendir. Öntanımlı (predefined) maxint fonksiyonu bir sisteme girilebilecek en büyük tamsayıyı belirtir.

Integer kümesi üzerinde +, -, *, div, mod ve / (toplama, çıkarma, çarpma, tamsayı bölme, modulo ve kesirli bölme) işlemleri tanımlıdır. Bunlardan ilk beş işlemin sonucu integer türden; sonuncu / işleminin sonucu ise real türden olur. Aritmetik işlemler ve bunlar arasındaki öncelik sırası ileride görülecektir.

Ordinal bir küme olduğundan, Integer veri kümesi üzerinde, yukarıda açıklanan


	= , <> , < , > , <= , >=
	
bağıntıları tanımlıdır.

Derleyiciler, makinaya da bağlı olarak integer türünü kendi içinde alt sınıflara ayırırlar. Örneğin, Turbo Pascal 5.0 derleyicisi integer türünü şu sınıflara ayırır:

Tür Değerler Biçem
shortint -128 ... 127 işaretli 8 bit
integer -32768 ... +32767 işaretli 16 bit
longint -2147483648 ... 2 147 483 647 işaretli 32 bit
byte 0 ... 255 işaretsiz 8 bit
word 0 ... 65535 işaretsiz 16 bit

Ord, pred ve succ fonksiyonları integer üzerinde aşağıdaki örneklerde gösterildiği gibi değer alırlar:

ord(0) = 0 ord(1) = 1 ord(567) = 567
Pred(1) = 0 pred(768) = 767
Succ(0) = 1 succ(45) = 46

Aşağıdaki boolean ifadeler doğrudur:

0 < 1 5 < 67 5 > -453
23 <> 52 78 <= 81 12 = 12

Char Veri Türü

Büyük ve küçük harfler, noktalama simgeleri, rakamlar ve diğer simgeler char türüne girer. Char türünün tam listesi için Ek 1 'e bakınız.

Ordinal bir küme olduğundan, Char veri kümesi üzerinde, yukarıda açıklanan


	= , <> , < , > , <= , >=
	
bağıntıları tanımlıdır.

Ord, pred ve succ fonksiyonları char kümesi üzerinde aşağıdaki örneklerde gösterildiği gibi değer alırlar:

ord('A') = 65 ord('B') = 66 ord('a') = 97
Pred('B') = 'A' pred('Z') = 'Y' pred('t') = 's'
Succ('A') = 'B' succ('M') = 'N' succ('x') = 'y'

Aşağıdaki boolean ifadeler doğrudur:

'A' < 'B' 'E' < 'K' 'r' > 'd'
'E' <> 'e' 'L' <= 'R' 'M' = 'M'

Boolean (mantıksal) Veri türü

True (Doğru) ve False (Yanlış) değerlerinden oluşan kümedir. Boolean veriler diğer veriler gibi girilemez (input işlemi yapılamaz), ama çıktısı olur (output işlemi yapılabilir). Not (Değil), Or (veya), And (ve) operatörleri ile kurulan mantıksal deyimler boolean değerler (true, false) alırlar.

Aşağıdaki özelikler vardır:

false < true
ord(false) = 0 ord(true) = 1
succ(false) = true pred(true) = false

Buna göre,

 	= , <> , < , > , <= , >=
	
bağıntılarıyla oluşturulan mantıksal deyimler de Boolean değerler (true, false) alırlar.


Enumerated Veri Türü

(Programcının Tanımladığı Sıralanmış Kümeler)

Programcı dilediği öğeleri içeren bir kümeyi sıralanmış (numaralanmış, enumerated, ordinal) veri türü olarak belirleyebilir. Bunun için parantez içine öğelerin adlarını sırayla yazar; birbirlerinden virgülle ayırır. Örneğin,

	type
 		gunler = (PT, SA, CA, PE, CU, CT, PA) ;

bildirimi günler adıyla sıralanmış bir veri türü tanımlar. Parantez içindeki adlar veri kümesinin öğeleridir. Öğelerin yazılış sırası küme üzerindeki sıralamayı belirler. Bu küme üzerinde Ord, pred ve succ fonksiyonları şu değerleri alır:

ord(PT) = 0ord(SA) = 1ord(CA) = 2ord(PE) = 3
ord(CU) = 4ord(CT) = 5ord(PA) = 6


pred(PT) = false succ(PT) = SA
pred(SA) = PT succ(SA) = CA
pred(CA) = SA succ(CA) = PE
pred(PE) = CA succ(PE) = CU
pred(CU) = PE succ(CU) = CT
pred(CT) = CU succ(CT) = PA
pred(PA) = CT succ(PA) = false

Programcının tanımladığı enumerated veri türleri de ordinal türdür. Dolayısıyla, yukarıda açıkladığımız sıralama bağıntıları enumerated veri türü üzerinde de tanımlıdır; Bu bağıntılarla kurulan deyimlerin sonucu boolean değerler olacaktır. Örneğin,

PT = SA boolean bir bağıntıdır ve değeri False olur.
PT < SA boolean bir bağıntıdır ve değeri True olur.
CA < CT boolean bir bağıntıdır ve değeri True olur.
CU < SA boolean bir bağıntıdır ve değeri False olur.
PT <> SA boolean bir bağıntıdır ve değeri True olur.
PE <= SA boolean bir bağıntıdır ve değeri False olur.

Subrange (alt bölge) Veri Türü

Standart olarak varolan veya programcının daha önce tanımladığı sıralanmış bir veri kümesinin bir alt aralığı veri türü olarak seçilebilir.

Örnekler
subrange İçeriği
var
Sırano : 1..9; 1,2,3,4,5,6,7,8,9
Notlar :'A'..'F';'A','B','C','D','E','F'
Mesai : PT..CUPT,SA,CA,PE,CU


Real Veri Türü

Rasyonel sayıların bir alt kümesidir. "Real" sözcüğünün matematiksel anlamının aksine, kesirli sayıların sınırlanmış bir alt kümesidir.

Sınırlar makinaya ve derleyiciye bağlı olarak değişir. PC ler için, genellikle, 4 byte uzunlukta bir adrese sığan kesirli sayılardır. Dolayısıyla -1.5x10-45 ile +3.4x1038 arasındaki kesirli sayılardır. Örneğin 32.8, -0.7943, 967.352 sayıları real türündendir. Sayının tam kısmı ile ondalık kısmı (.) ile birbirinden ayrılır. Ondalık noktasının solunda ve sağında enaz birer hane yer almalıdır. Kesirli sayılar ondalık gösterim yanında üstel biçimleriyle de yazılabilir. Örneğin, 25e2 simgesi 25 x 102 = 2500 yerine geçer.

PASCAL derleyicileri real türü farklı alt sınıflara ayırabilirler. Örneğin Turbo Pascal 5.0 aşağıdaki türleri tanımlamaktadır:


Tür Değerler Byte Geçerli Hane
real 2.9x10-39 ... 1.7x1038 6 11-12
single 1.5xx10-45 ... 3.4x1038 4 7-8
double 5.0x10-324 ... 1.7x10308 8 15-16
extended 3.4x10-4932 ... 1.1x104932 10 19-20
comp -263+1 ... 263-1 8 19-20

Uyarı

Comp türü belirtilen aralıktaki tam sayı değerlerini alır. Bu değerler -9.2x1018 ... 9.2x1018 arasında değişir.

Real veri türü üzerinde +, -, *, / işlemleri tanımlıdır. Ama div ve mod işlemleri tanımsızdır.

Ayrıca, matematiksel işlemlerin yapılabilmesi için, real veri türü üzerinde

	=,<>, <, >, <= , >= 
	
sıralama bağıntıları da tanımlıdır.

Ancak, ordinal bir veri kümesi olmadığından, ord, pred ve succ fonksiyonları real veri kümesi üzerinde tanımlı değildir.

Yapısal Veri Türleri

Yapısal veri türleri, programcının tanımladığı veri türleridir. PASCAL dilinde beş tane yapısal veri türü vardır: array, record, set, file, pointer. Bunları ileride ayrıntılı olarak ele alacağız.

Aritmetik Deyimler

Sayı kümeleri üzerinde tanımlı olan ve sonucu bir sayı olan Pascal deyimlerine Aritmetik Deyimler denilir.

Aritmetik deyimler +, -, *, /, div ve mod işlemleri (operatörleri) ve ileride göreceğimiz matematiksel fonksiyonlar ile kurulur. Integer ve real veri kümeleri üzerinde tanımlı bu işlemlerin özelikleri aşağıdaki tablolarda özetlenmiştir.

Integer kümesi Üzerinde Aritmetik İşlemler
İşlem Tanım Kümesi Değer Kümesi Açıklama
m + n integer integer Toplama
m - n integer integer Çıkarma
m * n integer integer Çarpma
m div n integer integer Tamsayı Bölme
m mod n integer integer Modulus
m / n integer real Kesirli Bölme


Real Kümesi Üzerinde Aritmetik İşlemler
İşlem Tanım Kümesi Değer Kümesi Açıklama
x + y real real Toplama
x - y real real Çıkarma
x * y real real Çarpma
x / y real real Kesirli Bölme

Tablolardan görüldüğü gibi, integer (tamsayılar) veri kümesi üzerinde

 	+, - , * , div , mod , /  
 	

işlemleri tanımlıdır. İlk beş işlemin sonucu integer, altıncı / (kesirli bölme) işleminin sonucu ise real türdendir. Çünkü bir tamsayının başka bir tamsayıya bölümü tamsayı olmayabilir. Bu nedenle, derleyici, kesirli bölme işleminde integer sayıları da real (kesirli) sayı olarak alır (ondalık kısmı 0 sayar).

Bölme işleminin sonucunun tamsayı olması isteniyorsa, / işlemi yerine div işlemi kullanılmalıdır. div işlemi, bölümün ondalık kısmını atarak tamsayıya yuvarlar, bölümün tam kısmını verir. Dolayısıyla, yaklaşık bir değerdir.

Örnekler:

Kesirli ve tamsayı bölme işlemleri, aynı işlemler için aşağıda gösterilen farklı sonuçları verir:

24 div 3 = 8 27 div 4 = 6
24/3 = 8.0 27 / 4 =6.75

Benzer olarak, real (kesirli sayılar) veri kümesi üzerinde +, - , * , / işlemleri tanımlıdır; ama div ve mod işlemlerinin real veri kümesi üzerinde tanımsız olduğunu biliyoruz.

Örnekler:
24 div 3 = 8 Geçerli İşlem 24.0 div 3 Geçersiz İşlem
24 div 3.0 Geçersiz İşlem
24.0 div 3.0 Geçersiz İşlem
24.3 div 3 Geçersiz İşlem
27/3 = 9.0 Geçerli İşlem 27.3 mod 3 Geçersiz İşlem
27.0 / 3 = 9.0 Geçerli İşlem 27.0 mod 3 Geçersiz İşlem
27.3 /3 = 9.1 Geçerli İşlem 27.3 mod 3 Geçersiz İşlem

Örnekler

Aşağıdaki program +, -, *, /, div ve mod işlemlerinin yapılışını göstermektedir. Programı satır satır inceleyiniz. Her satırdaki deyimin yaptığı işi açıklayınız.

Aşağıdaki program, önce kullanıcıdan iki tamsayı istemekte ve sonra bu sayılarla aritmetik işlemleri yapmaktadır. Her seferinde farklı tamsayılar girerek, çıktıların + , - , * , div , mod işlemleri için integer (tamsayı) olduğunu, / işlemi için ise real (kesirli) olduğunu görünüz.


Program Aritmetik_01;
uses wincrt;

var
   m,n 	:	integer;

BEGIN
WriteLn('Lütfen iki tamsayı giriniz :  > ' );
ReadLn(m,n);
WriteLn('m= ',m, 'n = ',n,);
WriteLn('m+n =', m+n);
WriteLn('m-n =', m-n);
WriteLn('m*n =', m*n);
WriteLn('m div n =', m div n);
WriteLn('m mod n =', m mod n);
WriteLn('m/n =', m/n);
END.

Programın bildirge bölümünde tanımlanan integer türünden m, n değişkenleri yerine real (kesirli) sayılar girmeyi deneyiniz. Derleyicinin tepkisini görünüz.

Aşağıdaki program, real veri türü üzerindeki aritmetik işlemleri göstermektedir.

Program, önce kullanıcıdan iki real sayı istemekte ve sonra bu sayılarla aritmetik işlemler yapmaktadır.

Her seferinde farklı kesirli sayılar girerek, çıktıların + , - , * ve / işlemleri için real (kesirli sayı) olduğunu görünüz.


Program Aritmetik_02;
uses wincrt;

var
   x,y 	:	real;

BEGIN
WriteLn('Lütfen iki real sayı giriniz :  > ' );
ReadLn(x,y);
WriteLn('x= ',x, 'y = ',y,);
WriteLn('x+y =', x+y);
WriteLn('x-y =', x-y);
WriteLn('x*y =', x*y);
WriteLn('x/y =', x/y);
END.

Programın bildirge bölümünde tanımlanan real türden x , y değişkenleri yerine tamsayılar girmeyi deneyiniz. Derleyicinin tepkisini gördünüz mü? Derleyici, girdiğiniz tamsayıları real sayı olarak kabul edecektir. Örneğin x yerine 5 girdiyseniz, derleyici bunu x= 5.0 real sayısı olarak kabul edecektir.

Yanlış veri girildiğinde, derleyicinin bu iki programda farklı davranmasını açıklayabilir misiniz?

İnteger Türün Real Türe Dönüşmesi

Pascal, bir aritmetik işlemde integer ve real türlerin karışımı varsa, bütün sayıları real türe dönüştürür ve sonucu real olarak verir. Gerekli olduğu zaman, bu işlem doğrudan derleyici tarafından yapılır; programcının bir işlem yapması gerekmez.

Örneğin, x , y real, n integer olmak üzere

	
(x+y) * (7 div n)

aritmetik deyimini düşünelim. x+y toplamı real türdendir. 7 div n işlemi ise integer sonuç verir.

PASCAL derleyicisi, parantezlerin değerlerini çarpmadan önce onları aynı türe dönüştürür. Çarpanlardan birisi real ise, çarpımdan önce, işleme giren çarpanların hepsini real türe dönüşür, sonra çarpma işlemini yapar. Sonuç real türdendir...

Bu durumda, integer türlerin real türe dönüşümü otomatiktir. Yani +, -, *, / operatörleri biri integer, biri real sayı olan iki sayıya uygulanıyorsa, hepsi real türe otomatik olarak dönüşür.

Real türden integer türe dönüşüm

Bazen kesirli sayılar yerine tamsayıların kullanılması gerekebilir. Bu durumlarda, derleyici real türden integer türüne dönüşümü otomatik olarak yapmaz. Programda istenen dönüşümün belirtilmesi gerekir. Bu iş, aşağıdaki yöntemlerden biriyle yapılabilir.

Kesir Kısmını Atma
Trunc( ) fonksiyonu bir real sayının kesir kısmını atar, kalan tamsayı değeri verir. Örneğin,
	trunc(54.345) = 54
	
olur. Trunc fonksiyonu integer değer verdiği için,
	trunc(54.345) div 5 = 10
	
ifadesi geçerli bir Pascal deyimidir ve ifade doğrudur.
Kesirli Sayıyı Tamsayıya Yuvarlama

Round( ) fonksiyonu bir real sayıyı en yakın integer türe dönüştürür. Örneğin,

Round(23.47) = 23, Round(23.52) = 24

olur. Kesirli sayılar yuvarlanırken ondalık kısmı yarımdan küçükse atılır, kesirli sayının tam kısmı alınır. Ondalık kısım yarım ya da yarımdan büyükse, kesirli sayı bir sonraki tamsayıya yükseltilir. Div işlemi ve Round( ) fonksiyonu integer değer verdiklerinden, aşağıdaki aritmetik deyimler geçerlidir.

x ile y real ve p ile q integer olsunlar :

	
	round(x/y) div 7 
	round(x*y) div trunc(p/q)	
	

ifadeleri geçerlidir.

Değişkene Değer Atama

Bir değişkene değer verme işlemine atama diyeceğiz.

Var başlığı altında bildirimi yapılan bir değişkene bildirim sırasında ilk değer verilebileceği gibi, yürütme bölümünde de istenen değer(ler) atanabilir. Değer atanmamış değişken kullanılamaz. Atama için söz dizimi aşağıdakilerden birisi gibi olabilir:

  1. 	Değişken_adı : = değer;
    

    Burada, sağ yandaki ifade, değişkenin ait olduğu veri türünden bir öğe olmalıdır. Örneğin, x integer türden bir değişken ise,

    	x := 527;
    	
    deyimi x değişkenine 527 değerini atar.

  2. 	Değişken_adı : = deyim;
    

    Burada da, sağ yandaki deyim, sonucu, değişkenin ait olduğu veri türünden bir öğe olan bir deyimdir. Örneğin, Yaricap real türden bir değişken ise,

    	Yaricap := 3.2;
    	Yaricap := 6.4 / 2; 
    	Yaricap := Cevre / (2 * Pi);
    

    atamaları geçerlidir ve her üçü de aynı işi yapar. Tabii, sonuncu atamanın geçerli olabilmesi için, Cevre ve Pi değişkenlerine (sökonusu çember için) önceden değer atanmış olmalıdır.

Bildirge bölümünde bildirimi yapılan bir değişkene ana bellekte bir yer ayrılır. Buna değişkenin adresi denilir. Bilgisayarın denetim birimi ve derleyici, her değişkenin adresini bilir.

Atama işlemi, değişkenin adresine bir değerin yazılması işlemidir.

Bir değişkene ayrılan yer, tam o değişkene yetecek büyüklüktedir. Örneğin, char türü bir değişkene 1 byte, integer türü bir değişkene 2 byte, real tür bir değişkene ise 4 byte uzunlukta bir yer ayrılır.

Yürütme bölümünde bir değişkenin değeri her an değiştirilebilir. Örneğin,

	Yaricap : = 5.3;

ataması yapılınca, yarıçap'a ayrılan adrese önceden yazılmış olan 3.2 değeri silinir, onun yerine 5.3 girer. Silinen değer bir daha elde edilemez.

Genel olarak,

	değişken_adı := atanan_değer;
	

atama deyiminde, := simgesinin sağındaki değer, soldaki değişkenin değeri olur.

Özet: Değişkene Değer Atama Yöntemleri
  1. 	x := 527; 
    
    atamasında olduğu gibi, sağ yana değişkenin türünden sabit bir değer yazılabilir.
  2. x ile y aynı türden iki değişken olmak ve y ye daha önce bir değer atanmış olmak koşuluyla,
    	x := y;
    	
    ataması yapılabilir. Bu atamada x değişkeninin değeri y nin değerine eşit olur.
  3. Sağ yan hesaplanabilir bir deyim olabilir:
    	x := (12 * 5) div 4;
    	
Uyarı:

Genel olarak,

	x := y;
	
atama deyiminde, atanan y değerinin türü x değişkeninin türüyle aynı olmalıdır. Bunun bir istisnası şudur: Eğer x değişkeni real türden, y değeri integer türden ise, PASCAL derleyicisi y değerini otomatik olarak real türe dönüştürür.

Bunun tersi geçersizdir. Eğer x değişkeni integer türünden, y değeri real türden olursa, derleyici hata mesajı verecektir.

Böyle bir atama yapmak gerekiyorsa yukarıda söylenen yöntemlerden birisiyle y değeri integer türe dönüştürülmelidir.

Örnekler

x real değişken, y ile z real sayılar; n integer değişken, m integer sayı olsun.

Atama Deyimi Geçerli mi?
x := y + z; Geçerli
x := m div 5; Geçerli
n := Trunc(x*y); Geçerli
n := Round(x/y); Geçerli
n := x + y; Geçersiz
n := m/3; Geçersiz