Pascal
Geçen sayımızda bahsettiğimiz, bir sakıncası bulunuyor. Eğer modülle ana programı arasında veri alışverişini PARA-
METRE değişkenleri sağlarsa bir bakışta hangi değişkenlerin veri taşıdığını hangi değişkenlerin etkilendiğini görebiliriz. Ancak işin içinde genel değişkenler kullanırsak bir süre sonra programımıza baktığımızda hangi değişkenlerin modüllerle veri irtibatı sağladığını anlamakta güçlük çekeriz. Eğer PARAMETRE değişkenlerini veri alışverişinde ön-kapı olarak düşünürsek GENEL değişkenlere de veri alışverişinin arka-kapısı diyebiliriz. Genel değişkenleri modülle ana program arasında veri alışverişinde kullanmak düzensiz bir program hazırlamamıza neden olur. Bu yüzden veri alışverişlerinde PARAMETRE değişkenlerini kullanmamız iyi bir program hazırlamamız açısından doğru olacaktır. Buna rağmen karşılaşabileceğimiz iki durumda GENEL değişkenleri veri alışverişinde kullanmak daha faydalı olur: (1) Eğer bir modülü çağırdıktan sonra modüldeki bazı değerleri korumak istiyorsak, bölgesel değişkenlerle amacımıza ulaşamayız. Modüller her çağrıldıklarında bölgesel değişkenler için özel bir hafıza alanı ayrılır. Modülden çıkıldığında modüle ait bölgesel değişkenlere yüklenmiş değerler de kaybedilir. Bu modül tekrar çağrıldığında yeni bir hafıza alanı ayrılır. Kalıcı olmasını istediğimiz bir değer varsa GENEL değişken kullanmamız gerekir. (2) Bazen birçok modül aynı veri yapısı üstünde çalışır. Mesela büyük bir tablo üstünde. Böyle bir durumda birçok modül tarafından kullanılan değişkeni GENEL değişken olarak tanımlamak daha uygun olacak- Bu yazımızda anlattıklarımızı pratik olarak da uygulayabilmek için PROGRAM Döküm Eki'ndeki iki programı inceleyebilirsiniz. Genel değişkenleri kullanmamız için iki duru-
BURAK KİPER mun mevcut olduğunu söylemiştik. İlk programımız böyle bir duruma örnek olabilir. Bu programımızda rastgele sayılar üreten bir fonksiyon tanımlanıyor. Bu fonksiyon kullanılarak bilgisayar 0 ile 100 arasında değişen sayılar tutarak bu sayıyı bulmanızı istiyor. Rastgele sayı üreten fonksiyonumuz pek profesyonel bir fonksiyon değil ama birçok oyun tipi uygulamada işinizi görür. Fonksiyonumuza çekirdek bir rakam gerekiyor. Fonksiyonumuz aldığı çekirdek sayıyı kullanarak yeni bir çekirdek sayı üretiyor. Yani üretilen çekirdek sayı bir sonraki hesaplamada kullanılıyor. Çekirdek sayıyı taşıyan değer GENEL değişken olarak tanımlandığından fonksiyon her çağrıldığında çekirdek sayının bir evvelki değeri kaybolmuyor. 1 ile 100 arasında bir sayı elde etmek istediğimiz için çekirdek sayımızı 100 ile çarpıp elde edilen sonucun tam sayı kısmına 1 eklemek yeterli oluyor.
İkinci programımız ise bir hesap makinesini taklit ediyor. Hesaplatmak istediğiniz işlemi belirli bir yapıya göre girmeniz gerekiyor. Aksi takdirde hata mesajı ile karşılaşabilirsiniz. Geçen sayılarda basit veri tiplerini incelemiştik. Bu yazımızda basit veri tiplerinde kullanacağımız standart fonksiyonlarla devam edeceğiz. İNTEGER, BOOLEAN ve CHAR veri tipleri basit veri tiplerindendir. Standart olan bu üç veri tipinin de, bizim tanımlayabildiğimiz basit veri tiplerinin de her değerinin bir evvel gelen ve bir sonra gelen değerleri vardır. Sadece ilk değerin kendinden evvel, son değerin de kendinden sonra bir değeri bulunmaz. Basit veri tipinde yer alan değerlerin sıraları tanımlanmıştır. Mesela İNTEGER veri tipinde 1'den sonra 2 gelir. Boolean veri tipinde FALSE değerinden sonra TRUE değeri gelir.
PRED, SUCC ve ORD fonksiyonları tüm basit veri tipleri için kullanılabilirler. ORD (parametre): ORD fonksiyonu herhangi bir basit veri tipinin sırasını verir. Parametre basit veri tipinde olmak zorundadır. PRED (parametre): PRED fonksiyonu sonuç olarak parametrede yer alan basit veri tipinin bir önceki değerini verir. Eğer parametrede yer alan basit veri tipi ilk değerse fonksiyonun sonucu tanımsız olur. SUCC (parametre): SUCC fonksiyonu sonuç olarak parametrede yer alan basit veri tipinin bir sonraki değerini verir. Eğer parametrede yer alan basit veri tipi son değerse fonksiyonun sonucu tanımsız olur. Basit veri tipleri ile kullanabildiğimiz üç fonksiyonu örneklerle görelim. Örneğimiz için kendimize bir basit veri tipi tanımlayalım
TYPE
dil (basic, pascal, logo, fortran). Parametre ORD 0 pascal BELİRSİZ pascal 1 logo basic logo 2 fortran pascal 4 BELİRSİZ. fortran 0 BELİRSİZ BELİRSİZ tabe 0 0 1 1 10 10 nn
Sadece CHAR veri tipi için geçerli olan CHR fonksiyonumuz bulunuyor. CHR (sıranumarası) CHR fonksiyonu sıra numarası verilen karakteri verir. CHR fonksiyonunda parametre olarak İNTEGER veri tipinde bir sayı veya ifade kullanabilirsiniz. Eğer yazdığınız sıra numarasına karşılık gelen herhangi bir karakter yoksa fonksiyonun değeri belirsiz olur. CHR fonksiyonu özellikle ekrana basılamayan karakterlerin ekrana basılmasında çok yararlıdır. Mesela,
PROCEDURE ALARM;
CONST
ZIİL- 7;
VAR
BEGİN
FOR I:—- TO 10 DO
WRITELN(CRRIZIL));
END;
Bu ufak alt program çalıştığında bilgisayar ses çıkaracaktır. CHR fonksiyonu sadece CHAR basit veri tipi için geçerlidir. Fakat kolaylıkla kendi tanımladığımız basit veri tipleri için de CHR benzeri bir fonksiyon yazabiliriz.
Herhangi bir basit veri tipinde tanımlanmış değişkeni FOR komutuyla kontrol etmemiz mümkündür.
Mesela, TYPE SIRA = 0..4; şeklinde bir tanımlama yapalım.
CEVİR(N:SIRA):DIL;
CASE N OF
0:CEVİR
CEVİR:
EVİR
BASIC;
ASCAL;
LOGO;
END
END;
SIRA ve DİL veri tiplerinin ana programda tanımlandığını kabul ediyoruz. Aslında veri tipleri daha çok genel olarak tanımlanır. Böylece diğer tüm alt programlar yeni tanımlanan veri tiplerini kullanabilir. Herhangi bir basit veri tipinde tanımlanmış değişkeni FOR komutunda kontrol değişkeni olarak kullanabilirsiniz. Mesela,
VAR
D:DIL;
BEGĞİN
FOR D:- BASIC TO LISP DO
WRIİTELN(ORD(D):5)
END.
Kendi tanımladığımız veri tiplerinin bir dezavantajı bulunuyor. Kendi tanımladığımız veri tiplerindeki değişkenlere READ, READLN komutu ile yeni değer yüklemek ve WRITE, WRİTELN komutları ile de değişkenin değerini yazdırmak mümkün değildir. Eğer yukarıdaki örnekte komutunu yazacak olursanız bir hata mesajı ile karşılaşırsınız.
Yapısal veri tipi: Diziler
Elimizdeki verileri düzenlemenin bir yolu da verileri listeler veya tablolar halinde düzenlemektir. Verileri bu şekilde düzenlemede kullanılan yapısal veri tipi ARRAY (dizi) olarak biliniyor. ARRAY veri yapısında yer alan veri birimlerinin hepsi aynı veri tipindedir. Bir ARRAY kullanarak bir dizi veriyi aynı değişken isim altında saklayabiliriz. Böylece o değişkende yer alan tüm verilere kolaylıkla ulaşabiliriz. ARRAY veri yapısına bir örnek verelim;
TYPE
LISTE - OF REAL;
VAR
X:LISTE;
Artık X değişkeninde beş ayrı veri bulundurabiliriz. Pascal X değişkeni için beş hafıza birimi ayırır. X değişkenindeki her veri REAL veri tipinde bir değer taşır.
Bir dizide yer alan verileri işlemek için her veriye tek tek ulaşabilmemiz gerekir. Dizide yer alan verilere indeksleri aracılığı ile erişebiliriz. Mesela X değişkeninde yer alan ikinci elemana bir değer yükleyelim,
XI): - 4.4;
Değişken isminden hemen sonra gelen köşeli parantezler içinde yer alan sayı dizideki belirli bir elemanın yerini belirtir. Örneğimizde X değişkeninin sadece beş elemanı olabilir. X değişkenini kullanarak bazı işlemler yapalım:
WRITELN (X(1))
XI2)
XI) 4 2.1
XİS) 4 XI2)
59
ARRAY yapısal veri tanımlamasında köşeli parantezler arasında indeks tipini, OF'dan sonra ise bu dizideki verilerin tipini tanımlarız. İndeks basit veri tipinde olmak zorundadır. İndeks için INTEGER, CHAR veya sizin tanımladığınız bir basit veri tipini kullanabilirsiniz. Ancak,
CONST
A-1.5;
B-9.9;
TYPE
OF INTEGER;
şeklinde bir tanımlama yapmanız yanlış olur. Çünkü köşeli parantezler arasında yer alan indeks için REAL veri tipini kullandık. OF'dan sonra gelen veri tipi için istediğiniz veri tipini kullanabilirsiniz. X değişkenimiz aşağıdaki verilere sahip olsun:
XI)
XBI
XI
Dizi değişkenlerine indeksli değişken adı verilir. İndeksli değişkenleri normal değişkenleri kullandığımız şekillerde kullanabilirsiniz. İndeksli değişkenlere READ ve READLN komutları ile değer yükleyip, WRITE ve WRITELN komutları ile değerlerini yazdırabiliriz. Kendi tanımladığımız veri tiplerini array'lerin indekslerini tanımlamada kullanabileceğimizi söylemiştik:
TYPE |
SATRANÇ - (PİYON, AT;
FİL, KALE, VEZİR, ŞAH);
VAR
DEĞER:ARRAY
İSATRANÇI OF INTEGER;
bu şekilde bir tanımlama yaparsak,
VALUEJPİYON)
VALUBİATI: -3;
VALUEİKALE):
VALUE|VEZİR)
VALUBİŞAH)
000;
bu komutları kullanabiliriz.
Tek Boyutlu Diziler
Diziler ve FOR komutu birlikte çok uyumlu bir şekilde çalışabilirler. İndeks değişkenini her seferinde bir arttırarak sıra ile dizideki tüm elemanlara ulaşabiliriz. Sıra ile dizideki tüm elemanlara ulaşabildiğimiz için aynı işlemleri dizideki tüm değişkenlere uygulayabiliriz. Mesela bir dizinin tüm elemanlarının değerlerini toplayalım:
TOPLAM
FOR 1:—1 TO 5 DO
TOPLAM: - TOPLAM * Bil)
I değişkeninin değeri her seferinde bir artacağından sıra ile B değişkeninde bulunan tüm elemanların değerleri TOPLAM değişkeninde toplandı.
Dizideki indeks sabit bir sayı olmak zorunda değil, örneğimizde olduğu gibi bir ifade olabilir. Bu şekilde programımız indeks değerini kendisi hesaplayabilir.
Program Döküm Eki'ndeki PROGRAM1 her saat için sıcaklığı alıp günün en sıcak, en soğuk ve ortalama sıcaklığını hesaplıyor. ISI dizi değişkenine yirmidört saatin verileri okunuyor. Mesela, ISI(1) değişkeninde günün birinci saatinin, ISI(15) değişkeninde günün onbeşinci saatinin ısısı saklanıyor.
Program Döküm Eki'ndeki PROGRAM3, ufak bir bütçe programı. On başlık altında aylık harcamaları hesaplayacak bir program. Programımız başlık numarasını ve yapılan harcamayı veri olarak alıyor.
Genelde, dizilerin elemanları ile tek tek uğraşabiliriz. Mesela iki diziyi tek bir komutla toplayamayız. Ancak iki dizi aynı veri tipine sahipseler tek komutla birbirine eşitleyebilirsiniz:
CONST
TYPE
INDEKS-1.MAX;
ARR-
OF REAL;
VAR
X, Y, Z : ARR;
BEGI
X:-Y
END.
Bu program;
yerini tutuyor. PACKED Array
Bir dizi tanımlarken ARRAY'in başına PACKED getirebiliriz. Mesela, Z:PACKED ARRAY[1..5] OF BOOLEAN; PACKED kelimesi sayesinde Z dizisindeki değerler bilgisayar hafızasına mümkün olduğu kadar sıkıştırılarak yazılır. Bu sayede hafızadan kazanırız, ancak sıkıştırılmış dizinin elemanlarına ulaşma hızımız biraz azalır. Genellikle BOOLEAN veya CHAR veri tipindeki dizileri sıkıştırmak yararlı olur.
Sıkıştırılmış bir dizinin elemanlarına da normal bir dizideki gibi ulaşabiliriz. Mesela:
VAR
PC:PACKED ARRAYII...5)
OF CHAR;
BEGİN
Sıkıştırılmış dizileri kullanmada karşılaştığımız bir sorun var. READ şeklinde bir komut yanlışı olur. Bunun yerine,
READ (C)
komutları aynı işi görür.
Program Döküm Eki'nde PROGRAM4 ve 5 programları da dizilerle ilgili. PROGRAM4 veri olarak girdiğiniz bir satırlık yazıda her harfin ne kadar kullanıldığını bulur. PROGRAM5, her harfin yerine geçecek başka bir harf alıp yazmış olduğunuz satırı şifreler.
Karakter Dizileri
Değerleri karakter dizisi olan değişkenleri tanımlamak için PACKED ARRAY tanımını kullanacağız:
PACKED ARRAY
OF CHAR;
VAR
BEGİN
END.
“Commodore;
Yapısal veri tiplerine gelecek yazımızda devam edeceğiz. Şimdilik hoş-