Pascal
Geçen bölümde kontrol komutlarını incelemeye başladık ve IF komutunun çeşitli şekillerini gördük. Şimdi, kontrol komutlarından biri olan CASE komutunu inceleyeceğiz.
Bazen programlarımızın akışını bir değişkenin belirlemesi gerekir. Bu değişkenin değerine göre kontrol komutları ile programın akış yönü değişir. Değişkenimizin alabileceği değer sayısı çok ise IF komutu kullanmak yerine CASE komutunu kullanmak daha akıllıca olacağı gibi aynı zamanda hem programımız daha hızlı çalışır hem de daha az yer harcamış oluruz.
İlk olarak yeni kontrol komutumuz CASE'in yapısını inceleyip örnekler verelim.
CASE I OF
1:
2: k2;
3: k3;
4: k4â;
END
Burada I, INTEGER veri tipinde bir değişkeni, k1...k4 ise herhangi bir komutu temsil ediyor. Dikkatinizi çekti ise CASE...END bloğu arasında BEGIN...END bloğu kullanmıyoruz. Eğer I değişkeni “1” değerini alırsa k1 komutu, “2” değeri alırsa k2 komutu işlenecektir. Eğer I değişkeninin değeri CASE komutu ile bildirilen sınır içerisinde değilse - mesela I değişkenin değeri 5 ise- o zaman bazı PASCAL versiyonları bir hata mesajı verirken bazıları da kontrolü bir sonraki komuta aktaracaklardır. Komutların sol taraflarındaki değerlere LABEL adını veriyoruz. LABEL'lar birden fazla olabilir, aşağıda buna bir örnek bulabilirsiniz.
CASE K-4 OF
1,2,3: kl;
4,5,6: k2:
7,8,9,10: k3; 11: k4 END Eğer K-4 işleminin sonucu 1,2 veya 3 değerlerinden herhangi biri ise k1 komutu işlenir; sonuç 4,5 veya 6 ise k2 komutu işlenir; sonuç 7,8,9 veya 10 ise k3 komutu işlenir; sonuç 11 ise k4 komutu işlenir; çıkan sonuç bunlardan hiçbiri değilse, kontrol kullandığınız sisteme bağlı olarak ya bir sonraki komuta geçer ya da bir hata mesajı alırsınız.
LABEL'dan sonra gelen komut yerine BEGIN...END blokları arasında komut grupları da olabilir.
CASE AY OF
1,3,5,6,8,10,12: GUN: - 31;
4,6,9,1 :GUN: — 30;
2 : BEĞİN
I FRAC (Y/4)-0
THEN GUN:-29
ELSE 28;
END:
Üstteki programımızda AY, GÜN ve Y değişkenlerinin INTEGER veri tipinde daha evvel tanımlandığını kabul ediyoruz. FRAC fonksiyonu yapılan bölmenin kalanını hesaplıyor.
Hangi komutun işleneceğini saptayan değeri üreten ifadeye “seçici” denir. Seçici'nin değeri INTEGER olarak sınırlandırılmamıştır; REAL veri tipi hariç şimdiye kadar öğrenmiş olduğumuz tüm veri tiplerini kullanabiliriz. Aşağıdaki ufak programı inceleyin.
PROGRAM örnek;
VAR
NOT: CHAR;
BEGIN
READLN (NOT);
CASE OF
“A': WRİTELN ("Cok
“B': WRİTELN ('İyi');
*“C': WRİTELN
'D': WRİTELN
'E': WRİTELN (“Zayıf”);
END;
END;
CASE komutunda kullanılan LABEL'ların veri tipi seçici değişken veya ifadenin veri tipi ile aynı olmak zorundadır.
Son olarak program döküm ekinde bulacağınız programın genel açıklamasını görelim:
Programımız bir işyerinde çalışan komisyoncuların çalışma şekillerine göre alacakları ücreti saptıyor. Çalışanlar üç grupta hesaplanıyor; geçici, düzenli, kıdemli. Programımız satıcının ne kadarlık satış yaptığını sorduktan sonra hangi türde olduğunu (G)eçici, (D)üzenli, (K)ıdemli sorusunu yönelterek öğreniyor. Yapılan seçim TİP değişkenine yükleniyor. WHILE döngüsü ile G, D, veya K harflerinden sadece birinin seçilmesi sağlanıyor. CASE komutu ile yapılan seçime göre program akışı sağlanıyor.
CASE TİP OF
*G': “Geçici satıcı için komisyon
hesapla””
“D”; “Düzenli satışı için komisyon
“K': “Kıdemli satıcı için komisyon
hesapla”
END
ALT PROGRAMLAR
Şimdiye kadar herhangi bir programlama dilinde görülebilecek komutları öğrendik. Yazımızın başında
PASCAL'ın modüler programlama için çok uygun bir dil olduğunu söylemiştik. PASCAL'ı böylesine güçlü bir dil yapan nedir? Büyük boyutta bir program yapacağımız zaman, programımızı her biri kendi başına bir program sayılabilecek modüller halinde hazırlarız. Bu modüllerin birleşmesi ile programımız oluşur. Modüler bir program yazmak bize ne gibi faydalar sağlar? İlk olarak yapacağımız işleri ufak parçalara ayırıp, bu parçalarla tek tek uğraşabiliriz. Hazırladığımız modüllerin sağlıklı bir şekilde çalıştıklarını anlamamız, boyutları ve yaptıkları işler ufak olduğundan çok daha kolay olur. Programda her hangi bir mantık hatası çıktığında, hatanın nerede olduğunu aramak için uzun araştırmalara girmemiz gerekmez; soruna sebep olan modülün elden geçirilmesi hatanın giderilmesi için yeterli olur. Nasıl bir araba başlıca dört teker, dört kapı, bagaj kapakları, kaporta ve iç aksamdan oluşursa, biz de programımızı böyle küçük parçalara, yani alt programlara ayırarak hazırlarız. Modüler bir programlama yapmanın başlıca üç yararını sayabiliriz:
(1) Programımız için bir modül hazırlarken dikkatimizi sadece bu bölüme yöneltebiliriz, böylece programı kolaylıkla baş edilebilecek parçalara ayırmış oluruz.
(2) Çok büyük programlarda aynı anda farklı kişiler programın farklı modüllerini hazırlayabilirler.
(3) Eğer bir modülün programda birden fazla yerlerde kullanılması gerekiyorsa modül bir kere yazıldıktan sonra ihtiyaç duyuldukça kullanılabilir. Başka programlama dillerinde de alt programlar bulunuyor, ancak PASCAL'da alt programlar çok daha önemli bir yer tutuyor. BASIC'te bir alt programı ancak satır numarası vererek çağırabiliyorsunuz ancak PASCAL'da alt programınızın, daha doğrusu modülünüzün adını vermeniz yeterli oluyor.
Öncelikle alt programların yapılarını inceledikten sonra programlarımızı modüler bir yapı kullanarak nasıl hazırlayacağımızı göreceğiz.
FUNCTIONS (fonksiyonlar)
SQR, SQRT, TRUNC, ROUND önceden tanımlanmış olan fonksiyonlardan bazılarıdır. Ancak önceden tanımlanmış olan fonksiyonlardan hiçbirisi ihtiyacımızı karşılayamazsa ne yapabiliriz? FUNCTION bildirimi ile istediğimiz bir fonksiyonu tanımlayabiliriz. Verilen bir sayının isteğimiz üstünü bulabilen fonksiyonu aşağıda inceleyebilirsiniz.
FUNCTİON USALMA (X:RE-
AL;N:İINTEGER4):REAL;
VAR
SONUÇ : REAL;
I:İNTEGER;
BEGIN
SONUÇ: — 1.0;
FOR 1:—1 TO ABS(N) DO
SONUÇ: — sonuç*X;
IFN -0 THEN
USALMA: - SONUÇ
ELSE
USALMA: - 1.0/SONUÇ
END;
Kendi yazdığımız fonksiyonda daha önceden tanımlı olan ABS() fonksiyonunu kullandık. ABS() fonksiyonu sayesinde N değişkeninin değeri negatif de olsa gerekli sayıda çarpma işleminin yapılması sağlanmış oldu. Fonksiyonumuzun ilk satırını oluşturan:
USALMA(X:
REAL;N:İNTERGER):REAL;
fonksiyonun ismini ve parametrelerini belirliyor. Fonksiyonumuzun nasıl çalıştığını anlatmadan evvel kullanıcı tarafından tanımlanan fonksiyonların yapısını görelim: FUNCTION fonksiyon-ismi (Parametreler): Sonucunun veri tipi; Bölgesel-bildirim-bölümü
BEGIN
Fonksiyonu oluşturan komut satırları
END;
FUNCTION'dan sonra fonksiyonun ismini yazıyoruz, daha sonra parantez içinde fonksiyonun parametreleri bildiriliyor, son olarak bu satırda parantez kapatıldıktan sonra iki nokta üst üste koyularak (':') fonksiyonun sonucunda elde edilecek neticenin veri tipi bildiriliyor. Bölgesel-bildirim-bölümü'nde bildirilen tüm değişkenler sadece bu fonksiyon çağrıldığında tanımlı hale geliyorlar. BEGIN...END arasında fonksiyonu oluşturan komut satırları yer alıyor. Komut satırlarının en az birinde komutun sol tarafında olmak üzere fonksiyonun adının bulunması gerekiyor. Üstteki örneğimizde USALMA := SONUÇ; şeklinde bir ifade kullanmıştık. Bu şekilde kullanılan bir ifade sonucunda fonksiyon çalışmasını bitirdiği zaman bulduğu değeri ismine yükler. Üstteki örnekte dikkatinizi ilk olarak fonksiyonun sonu olan END satırından sonra noktalı virgül “;” geldiği çekmiştir. Gerçek fonksiyon yapısı bakımından program yapısına benziyor, ama END komutundan sonra nokta “.” yerine noktalı virgül “;” geliyor. Fonksiyon tanımlarken dikkat etmemiz gereken iki nokta bulunuyor.
(1) Sonucun veri tipi standart veri tiplerinden (BOOLEAN, INTEGER, REAL, CHAR) biri olmak zorundadır.
Eğer fonksiyonumuzda parametre bulunmayacaksa parametreler bölümünü ve parantezleri kullanmayız.
Örneğimizde tanımladığımız fonksiyonu nasıl kullanacağız? Programımızın herhangi bir satırında fonksiyonun adını ve gerekli parametreleri vererek istediğimiz sonucu elde edebiliriz. ÇARPIM değişkeninin programımızda REAL veri tipi ile tanımlandığını kabul edelim. Programımızda şöyle bir satır kullanabiliriz:
ÇARPIM: - USALMA (5.0,4);
Fonksiyonumuzda beş sayısının dördüncü üssünü bulmasını istiyoruz, bu komut işlendiğinde ÇARPIM değişkeninin içeriği 625 olur. Şimdi satır satır fonksiyonumuzun nasıl çalıştığını görelim:
Ayrılmış kelimelerden (RESERVED WORDS) olan FUNCTION ile bir fonksiyonun yazılımına başlıyoruz, daha sonra fonksiyonun ismi hemen sonrasında da parantez içinde parametreler geliyor. Fonksiyon program içinden çağrıldığında programın içinde adını ve parantez içinde parametrelerini vermemiz gerekiyor. Parametreleri de fonksiyon yazılırken kullanılan sıraya göre vermemiz gerekir:
Programda ÇARPIM:
— USALMA (5.0,4);
demiştik. Parametrelerin birbirlerinden virgül (',') ile ayrıldıklarına dikkat edin. 5.0 değeri X parametresine, 4 değeri N parametresine karşı gelmektedir. Eğer parametreleri karşılıklı gelecek şekilde vermezseniz hiç ummadığınız neticeler elde edebileceğiniz gibi hata mesajları ile de karşılaşabilirsiniz. Eğer fonksiyonumuzun hiç bir parametresi yoksa parantezleri kaldırmamız gerekir. Fonksiyonumuzu tanımlarken parantez içine yazmış olduğumuz ne anlama geliyor? Fonksiyonumuzun iki parametresi var. İlk parametre olan X değişken REAL veri tipinde, ikinci parametre olan N değişkeni ise INTEGER veri tipinde olmalı anlamına gelir. USALMA(5.0,4) ile fonksiyonumuzu çağırdığımızda X değişkeni 5.0 değerini alırken N değişkeni 4 değerini alıyor. Parantezden sonra gelen :REAL ise fonksiyonumuzun neticede REAL veri tipinde bir sonuç göndereceğini anlatıyor. Fonksiyonumuzu yazarken en az bir ifadenin solunda fonksiyonun isminin bulunması gerektiğini söylemiştik. Bu sırada fonksiyonun ismi normal bir değişkenmiş gibi davranır ve fonksiyonun başlığında yer alan parantezlerden sonra belirttiğimiz veri tipine sahip olur. Bir fonksiyon hiç bir parametre almayacağı gibi örneğimizde gördüğümüz gibi birden çok parametre de alabilir. Program çalışması sırasında fonksiyonun adı ile karşılaştığında özel bir hafıza bölgesi hazırlar. Bu bölgede fonksiyonda tanımlanan değişkenler yer alır. Örneğimizde USALMA, SONUÇ, I, X, N değişkenleri için yer ayrılır. Fonksiyon yazarken yapabileceğiniz hatalardan birisi de, fonksiyonu yazarken fonksiyonun ismini bir ifadenin sağında kullanmanız olabilir. Çünkü fonksiyonun ismi sadece bir ifadenin solunda kullanıldığında değişken vazifesi görür. Program Döküm Eki'nde bir fonksiyonun nasıl programda kullanıldığına dair bir örnek program bulabilirsiniz.