Quick-Basic Kursu
Bölüm 7: Goto, Gosub, Sub, Function
Programlarımızdaki kodlar arttıkça veya programın işlevleri arttıkça bazı tekrar eden işlemler gerekli olabilir. Ya da içinde birkaç şey değiştirerek aynı işlemler yapmak gerekir. Bunun için alt programlar kullanılır. Ayrıca Fonksiyonlar ve Alt programlar kullanmak programınızın okunurluğunu kolaylaştıracaktır.
GOTO
Goto komutunu daha önce döngü oluştururken de görmüştük. Aslında Goto ve gosub komutlarına çok az ihtiyaç duyacaksınız. Sadece diğer basic dillerine uyumlu olsun diye konulmuş. Program kodunun herhangi bir yerinde işleyişini bırakıp başka bir noktadan çalışması için kullanılır. Goto ve ardında bir etiket yada satır numarası yazılmalıdır.
PRINT "MERHABA DÜNYA" GOTO 10 PRINT "BU SATIRI GÖREBİLECEK MİSİNİZ?" 10 PRINT "PROGRAM SONA ERDİ" END
GOSUB
Gosub ile alt programlar oluşturabiliriz. Gosub ‘u da kullanmanıza gerek yoktur. Onun yerine SUB kullanmak daha iyi olacaktır. Gosub da goto gibi programın işleyişi bırakıp başka bir noktadan başlaması sağlanır. Fakat farklı olarak RETURN komutunu görünce kaldığı yere geri dönerek çalışmasına devam eder. Alt programa, istediğimiz yerden istediğimiz kadar atlayabiliriz. GOSUB ve ardından bir etiket ya da satır numarası yazılmalı. Gosub ile atladığımız yerde RETURN bulunmazsa geri dönüş olmaz.
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
'2. program 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
GwBasic gibi diğer dillerde Sub veya Function özellikleri yoktur. O yüzden program kodları büyüdükçe okumak ve kontrol etmek epey zor olacaktır. İlk başta Sub ve Functionların faydalarını anlamak zor olabilir. Alıştığınızda bir defa yapacağınız işlemler için bile bunları kullanacaksınız belki de.
Sub yapısı: [ ile ] arası şart değil gerekirse kullanılır
SUB altprogram_ismi (varsa parametreleri) [STATIC] .. .. [EXIT SUB] ' alt programdan çıkılmak istenirse .. .. END SUB ' alt program sonu
Bir sub veya function eklemek için EDIT menüsündeki New Sub… ya da New Function dan faydalanabilirsiniz ya da direkt yazabilirsiniz. Alt programı eklediğinizde bunlar ayrı bir sayfa olarak görünür. Sub veya Function listesini görmek ve istediğinizi incelemek için F2 tuşuna basın.
Uygulama:
Menüden File / New Program ile yeni bir projeye başlayın. SUB yaziyaz yazıp ENTER’ e bastığımızda hemen iki alt satıra END SUB yazıldığını göreceksiniz. Kodlarımızı SUB ile END sub satırları arasında olmalı. Arasına şunları ekleyin
PRINT "=================" PRINT "== MERHABA ==" PRINT "================="
F2 tuşuna basın Altprogramları listeleyen ekran gelecek Untitled kaydedilmemiş basic dosyamız oluyor ve alt programların anası oluyor kaydettiğimizde bu isim değişir. yaziyaz ise alt program ismi. Alt tarafta seçili olan ile ilgili işlemler var.
Edit in Active: Düzenlemek için aç
Edit in Split: Düzenleme ekranına ayrı bir bölme olarak aç
Delete : Modülü yani alt programı sil
Move : Modülü açık olan başka bir basic dosyaya taşı. Qbasic de aynı anda çok sayıda dosya açılabilir.
Siyah şerit Untitled üzerindeyken ENTER’e basın.
Şimdi oluşturduğumuz altprogramı ç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ımızı çalıştırdığımızda çalıştığını göreceksiniz.
Kodları şu hale getirip çalıştırın. Buradaki kodlama kolaylığını öğrenmeye çalışın
CLS yaziyaz yaziyaz
Parametre kullanımı:
Alt programımız çalışırken ona bazı değerler gönderip farklı şekillerde çalışmasını sağlayabiliriz. Az önceki SUB da parametre yoktu. Parametre veri değişken tipinin ne olacağını belirtmekte fayda var. Belirtilmezse SINGLE olarak kabul edilir. Bazı örnekler:
SUB ekranayaz (satir AS INTEGER, sutun AS INTEGER)
aynı satırı şöyle de yazabiliriz
SUB ekranayaz (satir%, sutun%)
'Örnek program: CLS cizgi$ = STRING$(60, "-") yaziortala 1, cizgi$ yaziortala 2, "Merhaba" yaziortala 3, "Bugün Qbasic de Goto, GoSub, Sub ve Function'u öğrendim" 'farklı bir kullanım: CALL ile alt programı çağırma CALL yaziortala(5, "Qbasic Öğrenmek çok zevkli") 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ı yardırmayı deneyin
yazisagayasla 4 , “Merhaba”
gibi
FUNCTION
Functionların yapısı SUB lar gibidir. Yukarda açıklananlar bunda da geçerli. Function’un farkı verilen değerler üzerinde işlem yapıp bir sonuç ile geri döndürmesi. Qbasic 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 biz kendimiz bir fonksiyon oluşturalım
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 FUNCTION
Function 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 END FUNCTION
'2. örnek:
CLS PRINT enbuyuksayi(15, 25)
FUNCTION enbuyuksayi (sayi1, sayi2) IF sayi1 > sayi2 THEN enbuyuksayi = sayi1 ELSE enbuyuksayi = sayi2 END IF END FUNCTION
'3. örnek
DIM sayi(5) CLS sayi(0) = 20 sayi(1) = 30 sayi(2) = 66 sayi(3) = 88 sayi(4) = 36 sayi(5) = 23 x = ortalama(sayi()) PRINT x
FUNCTION ortalama (sayilar()) FOR n = LBOUND(sayilar) TO UBOUND(sayilar) t = t + sayilar(n) NEXT ortalama = t / n END FUNCTION
STATIC, SHARED, COMMON
STATIC:
Bazen tanımladığımız değişkenin değerini kaybetmeden SUB ve FUNCTION içinde de kullanmak gerekli olabilir. Alt program içinde değişkeni STATIC ile tanımlarsak değişken değerini kaybetmez aklında tutar. Yoksa her fonksiyon ve sub başlangıcında tanımlanan değişkenlerin değerleri sıfırlanır. Örnek:
CLS yaziortala "merhaba" yaziortala "Qbasicde 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 SUB
Burada 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.
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 (genel, her yerde geçerli) tanımlama diyoruz. Alt program içinde yapılan değişken tanımlamaları Local tanımlama(yerel, sadece alt program içinde geçerli)diyoruz. Global tanımlamayı Ana program içinde yapmalıyız
DIM SHARED satir AS INTEGER CLS satir = 2 LOCATE satir: PRINT "Merhaba" yaziortala "Qbasic öğ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
'basit bir örnek daha DIM SHARED a CLS a = 5 PRINT a CALL karesi PRINT a PRINT ussu(3) PRINT a PRINT ussu(4)
SUB karesi a = a * a END SUB
FUNCTION ussu (kuvvet%) a = a ^ kuvvet% ussu = a END FUNCTION
COMMON:
Common, shared gibidir ama daha genel bir tanımlama yapılır. Qbasic 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.