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.