Quick Basic – Bölüm 7

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:

  1. Yukarıdaki programı alt program kullanmadan yapmaya çalışın.
  2. 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.

Yorum Bırak

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir