Yayınlama: 2000
Güncelleme: 11 Eylül 2020
Programlarımızdaki kodlar arttıkça veya programın işlevleri arttıkça bazı tekrar
eden kod grupları olabilir.Güncelleme: 11 Eylül 2020
Ya da içinde birkaç değer değiştirerek aynı işlemleri yapmak gerekir. Bunun için alt programlar(alt rutin, subroutine) kullanılır.
Ayrıca fonksiyonlar ve alt programlar kullanmak, program kodlarınızın düzenlenebilirliğini ve okunurluğunu kolaylaştıracaktır.
GOTO
GOTO komutunu daha önce döngü oluştururken de görmüştük. GOTO ile alt program oluşturmak hiç kullanışlı değildir.Aslında GOTO ve GOSUB komutlarına çok az ihtiyaç duyacaksınız.
Sadece önceki basic dillerine uyumlu olsun diye konulmuş.
GOTO ile program akışı belirtilen satıra atlar ve çalışmaya oradan devam eder.
Örnek:
PRINT "MERHABA DÜNYA" GOTO 10 PRINT "BU SATIRI GÖREBİLECEK MİSİNİZ?" 10 PRINT "PROGRAM SONA ERDİ" END
GOSUB ... RETURN
Kullanımı:GOSUB satır_no | satır_etiketi
GOSUB ile alt programlar oluşturulur. GOSUB da GOTO gibi program akışı belirtilen satıra atlaması sağlanır. Fakat GOTO'dan farklı olarak RETURN komutunun olduğu satırdan kaldığı satıra geri dönerek çalışmasına devam eder.
Alt programı, istediğimiz satırdan istediğimiz kadar çağırabiliriz.
Gosub ile atladığımız satırdan sonra RETURN bulunmazsa geri dönüş olmaz.
GOSUB yerine SUB kullanmak daha kullanışlı ve modüler yapı olacaktır.
Örnek 1:
O yüzden program kodları büyüdükçe okumak ve kontrol etmek zorlaşır. QuickBasic'te modüler programlama için Sub ve Function komutları geliştirilmiştir.
Oluşturduğunuz modülleri diğer QuickBasic dosyalarına kolaylıkla ekleyebilir, taşıyabilirsiniz. Sizin ya da başkalarının yazdığı alt rutinleri kütüphane(library) dosyasından kullandığınız dosyaya referans ile çağırıp(INCLUDE) Sub ya da fonksiyonları kullanabilirsiniz. Böylece; tekrar kod yazma ve kod karmaşasından kurtulmuş olursunuz.
Başlangıçta SUB ve FUNCTION'ların faydalarını anlamak zor olabilir.
Alıştığınızda bir defa yapacağınız işlemler için bile alt programlamayı kullanacaksınız belki de.
SUB yapısı:
CLS GOSUB CIZGICIZ PRINT "MERHABA DÜNYA" GOSUB CIZGICIZ PRINT "QUICK BASIC" GOSUB CIZGICIZ PRINT "PROGRAMLAMA DİLİ" GOSUB CIZGICIZ END ' programı burada sonlandırmazsak ' alt program da çalışır ve hata oluşur CIZGICIZ: PRINT "----------------" RETURNÖrnek 2:
CLS PRINT "çift sayılar(1-100)" DO A = A + 1 IF (A MOD 2) = 0 THEN GOSUB CIFTSAYI LOOP UNTIL A = 100 END CIFTSAYI: PRINT A; RETURN
SUB ... END SUB
GW-Basic gibi diğer eski BASIC dillerinde SUB veya FUNCTION özellikleri yoktur.O yüzden program kodları büyüdükçe okumak ve kontrol etmek zorlaşır. QuickBasic'te modüler programlama için Sub ve Function komutları geliştirilmiştir.
Oluşturduğunuz modülleri diğer QuickBasic dosyalarına kolaylıkla ekleyebilir, taşıyabilirsiniz. Sizin ya da başkalarının yazdığı alt rutinleri kütüphane(library) dosyasından kullandığınız dosyaya referans ile çağırıp(INCLUDE) Sub ya da fonksiyonları kullanabilirsiniz. Böylece; tekrar kod yazma ve kod karmaşasından kurtulmuş olursunuz.
Başlangıçta SUB ve FUNCTION'ların faydalarını anlamak zor olabilir.
Alıştığınızda bir defa yapacağınız işlemler için bile alt programlamayı kullanacaksınız belki de.
SUB yapısı:
SUB altprogramadi (varsa parametreleri) [STATIC] .. .. [EXIT SUB] ' alt programdan çıkılmak istenirse .. .. END SUB ' alt program sonu[ ile ] arası şart değil gerekirse kullanılır.
altprogramadi: değişken adı tanımlaması gibidir. Alt rutin bu isimle
çağrılır.
Alt rutin iki şekilde çağrılır. İşlev bakımından ikisi arasında fark yoktur
1) CALL altprogramadi(parametre1, parametre2, ...)
2) altprogramadi parametre1, parametre2, ...
Parametre yoksa sadece altprogramadi yazılır.
STATIC:
Belirtilmediğinde, alt program sonlandığında alt program içinde kullanılan
değişken değerleri sıfırlanır. Tekrar alt program çağrıldığında değişken
değeri 0 olur. Değişken string ise değeri boştur ("")
Belirtilirse, alt program içindeki değişken değerleri STATIC olarak
tanımlanmış olur. Yani alt program sonlandığında değerleri bellekte
saklanır. Tekrar alt program çağrıldığında önceki değerleri ile devam eder.
EXIT SUB: Yazılan satırdan sonrası çalıştırılmadan alt programı
sonlandırır. Genelde alt programı test etmek için ya da bir şarta bağlı
olarak çıkış sağlamak için kullanılır.
Örneğin: IF A>40 THEN EXIT SUB
Bir SUB veya FUNCTION eklemek için EDIT menüsündeki New Sub... ya da New Function dan faydalanabilirsiniz ya da doğrudan boş satırda SUB veya FUNCTION ile başlayıp yazabilirsiniz.
Eklenen alt program ayrı bir sayfa olarak görünür.
SUB, FUNCTION listesini görmek ve istediğinizi düzenlemek için menüden View / SUBs... veya klavyeden F2 tuşuna basın.
Örnek:
CLS yaziyaz "Merhaba", 3 CALL yaziyaz("Dünya", 7) CALL yaziyaz("QuickBasic", 12) yaziyaz "v4.5", 15 SUB yaziyaz (yazi$, satir AS INTEGER) STATIC r% = r% + 1 LOCATE satir COLOR r% + 10 PRINT r%, yazi$ PRINT STRING$(30, "-") END SUB
Menüden File / New Program ile yeni bir program yazmaya başlayın.
SUB yaziyaz yazıpENTER ' e bastığımızda hemen iki alt satıra
END SUB yazıldığını göreceksiniz.
Aşağıdaki kodları SUB ile END sub satırları arasına ekleyin.
Untitled kaydedilmemiş QuickBasic dosyamız oluyor ve alt programların anası(MAIN)dır.
Dosyayı kaydettiğimizde bu isim değişir.
yaziyaz ise alt program ismi.
Alt tarafta seçili olanlar:
Edit in Active: Seçili alt programı düzenlemek için aç
Edit in Split: Seçili alt programı ayrı bölme olarak aç
Delete: Modülü yani alt programı sil
Move: Modülü açık olan başka bir QuickBasic dosyaya taşı.
Siyah şerit Untitled üzerindeyken ENTER'e basın.
Şimdi oluşturduğumuz alt programı çağıracağız.
Çağırmak için yalnızca yaziyaz yazabiliriz.
Ama programın okunurluğu açısından CALL yaziyaz ile çağırmak en doğrusu olacaktır.
F5 ile programı çalıştırın.
Sonra kodları aşağıdaki gibi düzenleyip çalıştırın.
Önceki örnekteki SUB'da parametre yoktu.
Parametrelerde kullanılan değişkenlerin veri tipleri belirtilmezse SINGLE olarak kabul edilir.
SUB yaziyaz yazıp
Aşağıdaki kodları SUB ile END sub satırları arasına ekleyin.
PRINT "=================" PRINT "== MERHABA ==" PRINT "================="F2 tuşuna basın Alt programları listeleyen ekran gelecek.
Untitled kaydedilmemiş QuickBasic dosyamız oluyor ve alt programların anası(MAIN)dır.
Dosyayı kaydettiğimizde bu isim değişir.
yaziyaz ise alt program ismi.
Alt tarafta seçili olanlar:
Edit in Active: Seçili alt programı düzenlemek için aç
Edit in Split: Seçili alt programı ayrı bölme olarak aç
Delete: Modülü yani alt programı sil
Move: Modülü açık olan başka bir QuickBasic dosyaya taşı.
Siyah şerit Untitled üzerindeyken ENTER'e basın.
Şimdi oluşturduğumuz alt programı çağıracağız.
Çağırmak için yalnızca yaziyaz yazabiliriz.
Ama programın okunurluğu açısından CALL yaziyaz ile çağırmak en doğrusu olacaktır.
F5 ile programı çalıştırın.
Sonra kodları aşağıdaki gibi düzenleyip çalıştırın.
CLS yaziyaz yaziyaz
Buradaki kodlama kolaylığını anlamaya çalışın.
QuickBasic'te aynı anda çok sayıda dosya açılabilir.
Açık dosyayı kapatmadan başka bir dosya açmak(eklemek) için: Menüden
File / Load File... kullanın.
Eğer menüde Load File... görünmüyorsa menüden OPTIONS/Full Menus'ü seçili yapın.
Örnek:Eğer menüde Load File... görünmüyorsa menüden OPTIONS/Full Menus'ü seçili yapın.
DECLARE SUB saydir () CLS FOR n = 1 TO 5 CALL saydir NEXT SUB saydir STATIC a = a + 1 b = b + 5 c = c + 10 PRINT "a="; a, "b="; b, "c="; c END SUBÇıktı:
a=1 b=5 c=10 a=2 b=10 c=20 a=3 b=15 c=30 a=4 b=20 c=40 a=5 b=25 c=50Üstteki örnekteki STATIC ekini silip farkı görün.
DECLARE
Alt program adı ve parametreleri program satırları başına DECLARE ile ilave
edilir.
Kaydedilmemiş bir dosyayı kaydettiğinizde; Untitled yazısı
kaydettiğiniz isimle değişir. Ayrıca ana program kodlarının en başınaDECLARE SUB altprogramadi ()satırını otomatik ekler. Normalde alt programın ana programa dahil edilmesi için bu satırın yazılması gereklidir. Ancak QuickBasic editörü bunu otomatik olarak yapıyor.
Parametre kullanımı:
Alt programa bazı değerler gönderip, gönderilen değerlere göre farklı sonuçlar üretmesini sağlayabiliriz.Önceki örnekteki SUB'da parametre yoktu.
Parametrelerde kullanılan değişkenlerin veri tipleri belirtilmezse SINGLE olarak kabul edilir.
Örnekler:
SUB yaziortala (satir AS INTEGER, yazi AS STRING)aynı satırı aşağıdaki gibi yazabiliriz. Bir fark oluşturmayacaktır.
SUB yaziortala (satir%, yazi$)
Örnek:
CLS DECLARE SUB yaziortala (satir AS INTEGER, yazi AS STRING) cizgi$ = STRING$(60, "-") yaziortala 1, cizgi$ yaziortala 2, "Merhaba" yaziortala 3, "Bugün QuickBasicte Goto, GoSub, Sub ve Function u öğrendim" 'farklı bir kullanım: CALL ile alt programı çağırma CALL yaziortala(5, "QuickBasic Öğrenmek çok kolay") yaziortala 6, cizgi$ SUB yaziortala (satir AS INTEGER, yazi AS STRING) uzunluk% = LEN(yazi) LOCATE satir, (80 - uzunluk%) / 2 PRINT yazi END SUB
PROBLEM:
- Yukarıdaki programı alt program kullanmadan yapmaya çalışın.
-
Alt program kullanarak sağa yaslı yazı yazdırmayı deneyin
yazisagayasla 4 , "Merhaba"
gibi.
DEF FN
Verileri işleyip işlenen veriden sonuç üreten yönteme fonksiyon denir.QuickBasic'te çok sayıda dahili fonksiyon bulunur.
Örnek: ASC, ATN, CDBL, COS, CSNG, CSRLIN, CHR$, CVD ... Diğerleri için QuickBasic'te menüden Help / Index'e bakınız.
Ancak bu dahili fonksiyonlar tüm ihtiyacı karşılamaz. QuickBasic ve birçok programlama dilinde kullanıcının kendi fonksiyonu yazması için özellik bulunur.
QuickBasic'te bu özellik DEF FN veya FUNCTION ile yapılır.
DEF FN eski BASIC dilleri ile uyum için konulmuştur.
Kendini çağırma(recursive) özelliği yoktur. Bunun yerine modüler yapıya sahip kendini çağırabilen FUNCTION tavsiye edilir.
DEF FN Kullanımı:
1) Tek satır ile:
Kullanılırsa Function not defined (Fonsiyon tanımlanmamış) hatası verir.
Function'un farkı verilen değerler üzerinde işlem yapıp bir sonuç ile geri döndürmesidir.
Kendini çağırma(recursive) özelliği yoktur. Bunun yerine modüler yapıya sahip kendini çağırabilen FUNCTION tavsiye edilir.
DEF FN Kullanımı:
1) Tek satır ile:
DEF FNfonksiyonadı [parametre listesi] = fonksiyonkoduÖrnek:
DEF FNortalama (sinav1, sinav2, sinav3) = (sinav1 + sinav2 + sinav3) / 3 ort = FNortalama(62, 70, 87) PRINT ort '732) Blok olarak:
DEF FNfonksiyonadı [parametre listesi] ... FNfonksiyonadı = fonksiyonkodu ... END DEFÖrnek:
DEF FNdereceRadyana# (derece AS DOUBLE) radyan# = derece * (4 * ATN(1) / 180#) FNdereceRadyana# = radyan# END DEF PRINT FNdereceRadyana#(90) x = FNdereceRadyana#(30) PRINT SIN(x) '.5DEF FN ile tanımlanan fonksiyon, tanımlama satırından önce kullanılamaz.
Kullanılırsa Function not defined (Fonsiyon tanımlanmamış) hatası verir.
FUNCTION ... END FUNCTION
Function'ların yapısı SUB'lar gibidir. SUB'da açıklananlar bunda da geçerlidir.Function'un farkı verilen değerler üzerinde işlem yapıp bir sonuç ile geri döndürmesidir.
QuickBasic'in kendi yapısındaki birçok komutun Function özelliği
vardır. Örneğin: X = SQRT(81) yazdığımızda verilen 81 sayısı
SQRT(karekök alma) fonksiyonu tarafından işlenir ve sonuç olarak 9
döner. Bu sonuç X değişkenine atanır.
Şimdi kendi fonksiyonumuzu oluşturalım.
Örnek 1:
X = karesi(15) PRINT X PRINT "20 nin karesi = "; karesi(20) PRINT "1.4 ün karesi = "; karesi(1.4) FUNCTION karesi (sayi AS DOUBLE) DIM sonuc AS DOUBLE sonuc = sayi * sayi karesi = sonuc END FUNCTIONFunction da tek satır ile sonucu alabilirdik. Anlaşılır olması bakımından uzun yazıldı.
Kısa olarak:
FUNCTION karesi (sayi AS DOUBLE) karesi = sayi * sayi ' alternatif: karesi = sayi ^ 2 END FUNCTIONÖrnek 2:
CLS PRINT buyuksayi(15, 25) FUNCTION buyuksayi (sayi1, sayi2) IF sayi1 > sayi2 THEN buyuksayi = sayi1 ELSE buyuksayi = sayi2 END IF END FUNCTIONÖrnek 3:
DIM sayi(10) CLS FOR n = 0 TO 10 READ sayi(n) NEXT x = ortalama(sayi()) PRINT "Sayıların ortalaması:"; x DATA 25,61,5,84,92,46,74,8,63,15,37 FUNCTION ortalama (sayilar()) FOR n = LBOUND(sayilar) TO UBOUND(sayilar) t = t + sayilar(n) NEXT ortalama = t / n END FUNCTIONÖrnek 4:
CLS derece = 30 radyan = DegToRad(derece) PRINT "Derce :"; derece PRINT "Radyan :"; radyan PRINT "Sinüs :"; SIN(radyan) PRINT "Kosinüs:"; COS(radyan) FUNCTION DegToRad (deg) Pi = 4 * ATN(1) 'Pİ sayısı DegToRad = deg * (Pi / 180) END FUNCTION
DEGİŞKEN KAPSAMI
Varsayılan olarak tanımlanan değişken tanımlandığı modül içinde değerini
korur. Diğer modüllerde geçerliliği olmaz. Diğer modüllerde aynı adla bir
değişken varsa bu değişken o modül kapsamındadır. Diğerini etkilemez.
Örnek 1:
CLS DIM a a = 5 CALL modul1 PRINT "Ana programda A Değeri:"; a SUB modul1 PRINT "Alt programda A değeri:"; a END SUBÇıktı:
Alt programda A değeri: 0 Ana programda A değeri: 5Örnek: 2
CLS DIM A A = 100 CALL modul1 PRINT "Ana programda A Değeri:"; A SUB modul1 A = 125 PRINT "Alt programda A değeri:"; A END SUBÇıktı:
Alt programda A değeri: 125 Ana programda A değeri: 100
SHARED
Bazen de bir değişkenin değerini kaybetmeden tüm SUB ve FUNCTION içinde geçerli olması istenebilir. Buna değişkeni global tanımlama(genel, ana ve alt programlarda geçerli) diyoruz.
Alt program içinde DIM ile yapılan değişken tanımlamaları yerel tanımlamadır
(lokal, sadece alt program içinde geçerlidir)
QuickBasic ile CHAIN komutuyla başka bir bas dosyaya bağlantı kurabiliriz.
Değişken COMMON ile tanımlama yapılırsa değeri bağlantı kurulan bas dosyada da geçerli olur.
Zaten başlangıçta tek bas dosya üzerinde çalışacağınızdan bu gerekli olmayacak.
Ana programda paylaşımlı değişken tanımlamak için DIM SHARED kullanılır.
STATIC i DIM ile değiştirin farkı göreceksiniz.
Alt programda tanımlanan değişkenin ana modülde de geçerli olması için
SHARED ile tanımlanması gerekir. Alt programda SHARED ile tanımlanan
değişken tanımlanan modülde ve ana modülde geçerli olur. Diğer modüllerde
geçerli olmaz.
Aşağıdaki örneklerdeki DIM SHARED satırını iptal edip sonucu gözlemleyin.
Örnek 1:
DIM SHARED satir AS INTEGER CLS satir = 2 LOCATE satir: PRINT "Merhaba" yaziortala "QuickBasic öğreniyorum" satir = satir + 1 LOCATE satir: PRINT "Çalışan başarır" yaziortala "İstiyorsan başarırsın" SUB yaziortala (yazi AS STRING) satir = satir + 1 LOCATE satir, (80 - LEN(yazi)) / 2 PRINT yazi END SUBÖrnek 2:
DIM SHARED a CLS a = 2 PRINT a '2 CALL karesi PRINT a ' 4 CALL kupu PRINT a ' 64 CALL kupu PRINT a ' 262144 SUB karesi a = a * a END SUB SUB kupu a = a ^ 3 END SUBÖrnek 3:
CLS a = 50 PRINT "Ana Modül, A="; a '50 CALL modul1 PRINT "Ana Modül, A="; a '150 CALL modul2 PRINT "Ana Modül, A="; a '150 CALL modul3 PRINT "Ana Modül, A="; a '150 SUB modul1 SHARED a PRINT "Modül 1, A="; a '50 a = a + 100 PRINT "Modül 1, A="; a '150 END SUB SUB modul2 PRINT "Modül 2, A="; a '0 a = 2020 PRINT "Modül 2, A="; a '2020 END SUB SUB modul3 PRINT "Modül 3, A="; a '0 a = 1000 PRINT "Modül 3, A="; a '1000 END SUBÖrnek 3'de A değişkeni sadece Ana ve modul1 de paylaşımlıdır. Diğer modüllerdeki A değişkeni farklı bir değişken olarak değerlendirilir ve sadece kendi modülü içinde değerini korur. SHARED satırını silip tekrar çalıştırın ve sonucu gözlemleyin.
STATIC
Alt program içinde tanımlanan değişkenin değeri alt programdan çıkıldığında değeri sıfırlanır.
Alt program tekrar çağrıldığında eski değerin tutulması için değişken
STATIC ile tanımlanır.
Örnek 1:
CLS a = 100 FOR n = 1 TO 10 CALL topla NEXT PRINT a SUB topla STATIC a a = a + 20 PRINT a END SUBÖrnek 2:
CLS yaziortala "Merhaba !" yaziortala "QuickBasicte Function ve Sub Kullanmak kodlamayı kolaylaştırıyor" yaziortala "Öğrenmem gereken daha çok şey var sanırım." SUB yaziortala (yazi AS STRING) STATIC satir AS INTEGER satir = satir + 1 LOCATE satir, (80 - LEN(yazi)) / 2 PRINT yazi END SUBBurada dikkat ederseniz SUB a satır numarasını göndermedik 0 dan başladı her SUB başlamasında 1 arttı ve yazılar alt alta ortalı olarak yazıldı.
STATIC i DIM ile değiştirin farkı göreceksiniz.
Alt programdaki tüm değişkenlerin STATIC olması için SUB veya FUNCTION
tanımlama satırı sonuna STATIC eklenir.
Örneğin: FUNCTION test (p1, p2) STATIC
COMMON
COMMON, SHARED gibidir ama daha genel bir tanımlama yapılır.QuickBasic ile CHAIN komutuyla başka bir bas dosyaya bağlantı kurabiliriz.
Değişken COMMON ile tanımlama yapılırsa değeri bağlantı kurulan bas dosyada da geçerli olur.
Zaten başlangıçta tek bas dosya üzerinde çalışacağınızdan bu gerekli olmayacak.
Önceki Bölüm: 6: Diziler | Sonraki Bölüm: 8: Karakterler ve metinlerle ilgili işlemler |
Hiç yorum yok:
Yorum Gönder