12 Ekim 2020 Pazartesi

QuickBasic - 26: Olay ile Dallanma

Yayınlama: 12 Ekim 2020
Normalde program kodları ilk satırdan başlayarak son satıra kadar adım adım ilerleyerek komutları yürütür ve son satırdan sonra program sonlanır. Ancak bu şekildeki bir yürütme ile işe yarar büyük programlar yapmak çok zordur ve çok sayıda kod yazmak gerekebilir. Ayrıca tekrar eden işlemler için tekrar kod yazmak da programlama mantığına uygun değildir.

Program kodlarında eğer tekrara düşüyorsanız bilin ki bilgisayarın yapması gereken işin bir kısmını siz yapmış oluyorsunuz demektir. Ayrıca kod tekrarı, program kodlarının büyümesine gereksiz bellek kullanımına, program kodlarının yavaş çalışmasına ve program kodlarının okunurluğunun zorlaşmasına neden olur. Kodların okunmasının zorlaşması kodlarda düzenleme ve geliştirmeyi zorlaştırır.

Dallanma diye adlandıracağımız durum program kodlarının yürütülürken gerekli durum ve şartlarda alt programa atlayarak alt programı çalıştırması ve alt programın yürütülmesi tamamlandığında kaldığı kod satırına geri dönmesidir. Dallanma sayesinde kod tekrarını önlemiş oluruz ayrıca kodların modüler bir yapı oluşması sağlanır.

Kodlarda dallanma oluşturmak için birkaç yöntem var. Bunlardan bazılarını 4: Kontrol blokları ve 7: Alt program sayfasında açıklanmıştı. Bu bölümde bunlar tekrar edilmeyecek. Bunların dışında kalan ve ON ile başlayan dallanmalar açıklanacak.

ON ... GOTO

Belirtilen ifadenin değerine göre belirtilen satırlardan birine dallanmayı sağlar.

Kullanımı:
ON n GOTO satır numaraları listesi | satır etiketi listesi
n integer sayısının aldığı değere göre satır numarası listesindeki satıra dallanma(atlama) yapar. Liste elemanları arasında virgül kullanılır. Satır numarası ve satır etiketi karışık liste oluşturabilir. n değeri 1 veya 1 den büyük olmalıdır.

Örnek:
DEFINT A-Z
basla: CLS
menu: PRINT "MENÜ"
PRINT "1-Yeni"
PRINT "2-Aç"
PRINT "3-Kaydet"
PRINT "4-Yazdır"
PRINT "5-Çıkış"
INPUT n
IF n < 1 OR n > 5 THEN GOTO basla
ON n GOTO 10, 20, kaydet, 410, 550
10 PRINT "yeni ...": GOTO menu
20 PRINT "aç ...": GOTO menu
kaydet: PRINT "kaydet ...": GOTO menu
410 PRINT "yazdır ...": GOTO menu
550 PRINT "çıkış ..."
END

ON ... GOSUB

ON ... GOTO gibidir. ON ... GOSUB'un farkı bir alt rutine gönderme yapmasıdır.

Örnek:

DEFINT A-Z
basla: CLS
menu: PRINT "MENÜ"
PRINT "1-Yeni"
PRINT "2-Aç"
PRINT "3-Kaydet"
PRINT "4-Yazdır"
PRINT "5-Çıkış"
INPUT n
IF n < 1 OR n > 5 THEN GOTO basla
ON n GOSUB 10, 20, kaydet, yazdir, son
GOTO menu
10 PRINT "yeni ...": RETURN
20 PRINT "aç ...": RETURN
kaydet: PRINT "kaydet ...": RETURN
yazdir: PRINT "yazdır ...": RETURN
son: PRINT "çıkış ..."
END

ON ... GOTO veya ON ... GOSUB önceki BASIC dillerine uyum için konulmuştur. Bunun yerine aynı işi yapan ama daha kullanışlı olan SELECT CASE kullanılması tavsiye olunur.
Ayrıntı ve örnek için 4: Kontrol blokları sayfasına bakınız.

Bir önceki örnekte verilen kodları SELECT CASE kullanarak değiştirelim.

DEFINT A-Z
CLS
DO
    PRINT "MENÜ"
    PRINT "1-Yeni"
    PRINT "2-Aç"
    PRINT "3-Kaydet"
    PRINT "4-Yazdır"
    PRINT "5-Çıkış"
    INPUT n
    SELECT CASE n
        CASE 1: PRINT "yeni ..."
        CASE 2: PRINT "aç ..."
        CASE 3: PRINT "kaydet ..."
        CASE 4: PRINT "yazdır ..."
        CASE 5: PRINT "çıkış ...": END
        CASE ELSE: CLS
    END SELECT
LOOP

Verilen örneklerdeki kodlar karşılaştırıp incelendiğinde hangisinin daha okunur ve düzenli olduğu fark edilecektir.

Bundan sonraki ON komutları bir olay gerçekleştiğinde(tetiklendiğinde) belirtilen alt programı çağırır.

ON PLAY(n)

ON PLAY(n) komutu, arka plan tampon belleğindeki komut sayısı n'nin bir altına düştüğünde, komut yürütme adımını belirtilen alt rutine gönderen bir olay yakalama durumunu oluşturur.

Bölüm 24: Ses, Müzik sayfasına bakınız

ON KEY(n)

Adından da anlaşılacağı gibi ON KEY, n ile belirtilen tuşa basıldığında belirtilen alt rutin çalıştırılır.

Bölüm 25: Klavye kullanımı sayfasına bakınız

ON TIMER(n)

Her n saniye süre geçtikten sonra belirtilen satır numarası veya satır etiketindeki alt program çağrılır.

Kullanımı:

ON TIMER(n) GOSUB {satır numarası | satır etiketi}

Çağrı işleminin gerçekleşmesi için TIMER ON

İptal edilmesi için TIMER OFF kullanılır.

Örnek 1:

' Ekran koruyucu
' ©2020 Mesut Akcan
' mesutakcan.blogspot.com
CLS
ON TIMER(1) GOSUB saat 'Her 1 saniyede saat alt rutinini çalıştır
TIMER ON
DO
    COLOR INT(RND * 15 + 1), 0
    LOCATE RND * 24 + 1, RND * 79 + 1
    IF CSRLIN <> 1 OR POS(0) < 68 THEN
        PRINT CHR$(RND * 223 + 32);
    END IF
LOOP UNTIL INKEY$ <> ""
END

saat:
COLOR 15, 4
LOCATE 1, 68: PRINT "Saat:"; TIME$;
RETURN

Örnek 2: Sayı tahmin oyunu 2

' **** SAYI TAHMİN OYUNU 2 ****
' ©2020 Mesut Akcan
' mesutakcan.blogspot.com
DEFINT A-Z
CONST true = 1, false = 0
CONST sure = 15 'tahmin süresi
CONST ebs = 15 'en büyük sayı
ON TIMER(1) GOSUB sureGoster
RANDOMIZE TIMER
SCREEN 12

basla:
TIMER ON
bilindi = false
bitti = false
x = 0
renk = 2 'yeşil dolgu
tahmin$ = ""
sayi = INT(RND * ebs) + 1 'tahmin edilecek sayı
CLS
COLOR 14: PRINT "SAYI TAHMİN OYUNU"
COLOR 15: PRINT "Bilgisayar 1 -"; ebs; " arası bir sayı tuttu."
PRINT "Bu sayıyı (" + LTRIM$(STR$(sure)) + ") saniye içinde tahmin edin"
COLOR 10: PRINT "Tahmininiz:"
COLOR 14 'sarı
PRINT " 1-";
ts = 1 'tahmin sayısı
DO
    k$ = INKEY$
    SELECT CASE k$
        CASE "0" TO "9"
            COLOR 10: PRINT k$;
            tahmin$ = tahmin$ + k$
        CASE CHR$(13)
            IF tahmin$ <> "" THEN
                ts = ts + 1 'tahmin sayısı
                COLOR 14
                PRINT : PRINT STR$(ts) + "-";
                IF sayi = VAL(tahmin$) THEN
                    bilindi = true
                    PLAY "mbo3l16cecedeg4"
                    EXIT DO
                END IF
                tahmin$ = ""
            ELSE
                SOUND 2000, 2
            END IF
        CASE CHR$(27): END 'esc tuşu çıkış
        CASE ELSE 'rakam ve esc harici tuşlar
            IF LEN(k$) THEN SOUND 100, 1
    END SELECT
    IF bitti THEN 'süre bitti
        PRINT : PRINT "Süre bitti !"
        PLAY "mbo1l16 gfedc4"
        EXIT DO
    END IF
LOOP
TIMER OFF
COLOR 12: PRINT
IF bilindi THEN PRINT "Tebrikler bildiniz !"
PRINT "Bilgisayarın tuttuğu sayı:";
COLOR 14: PRINT sayi
10
COLOR 10: INPUT "Tekrar oynamak ister misiniz(E/H)"; c$
SELECT CASE UCASE$(c$)
    CASE "E": GOTO basla
    CASE "H": CLS : END
    CASE ELSE: BEEP: GOTO 10
END SELECT
END

sureGoster:
LINE (119, 449)-(521, 461), 15, B
x = x + 1
IF x / sure > .7 THEN
    renk = 4
    SOUND 4500, 1
END IF
LINE (120, 450)-(120 + x * (400 / sure), 460), renk, BF
lr = CSRLIN: lc = POS(0) 'imlec konumu
LOCATE 29, 12: PRINT USING "###"; sure - x;
LOCATE lr, lc
IF x = sure THEN bitti = true
RETURN

ON STRIG(n)

Joystick(oyun çubuğu) butonuna göre dallama yapar.

Kullanımı:

ON STRIG(n) GOSUB {satır numarası | satır etiketi}

n: Buton numarası.
0: Joystick A alt buton
2: Joystick B alt buton
4: Joystick A üst buton
6: Joystick B üst buton

n ile belirtilen joystick butonu basıldığında belirtilen satır numarası veya satır etiketindeki alt program çağırılır.

Örnek:

ON STRIG(0) GOSUB kontrol
STRIG(0) ON
PRINT "Çıkış için ESC"
DO: LOOP UNTIL INKEY$ = CHR$(27)
END

kontrol:
PRINT "Joystick butonu basıldı."
RETURN

Ayrıca QuickBasic yardımda STICK(n), STRIG(n), STRIG(n) ON, STRIG(n) OFF, STRIG(n) STOP komutlarına bakınız.

ON PEN

Kullanımı:

ON PEN GOSUB {satır numarası | satır etiketi}

Işıklı kalem aktif olduğunda belirtilen satır numarası veya satır etiketindeki alt program çağrılır.

Örnek:

ON PEN GOSUB kalemKontrol
PEN ON
PRINT "Çıkış için ESC"
PRINT "Işıklı Kalem Konumu:"
DO: LOOP UNTIL INKEY$ = CHR$(27)
END

kalemKontrol:
PRINT "Satır:"; PEN(6), "Sütun:"; PEN(7)
RETURN

Ayrıca QuickBasic yardımda PEN, PEN ON, PEN OFF, PEN STOP komutlarına bakınız.

ON COM

Kullanımı:

ON COM(n) GOSUB {satır numarası | satır etiketi}

İletişim bağlantı noktasında bir karakter alındığında belirtilen satır numarası veya satır etiketindeki alt program çağrılır.

n: Seri bağlantı noktası 1 veya 2 değeri.

Örnek:

OPEN "COM1:9600, O, 7" FOR RANDOM AS #1
ON COM(1) GOSUB karakteroku
COM(1) ON

'Klavyeden girilen karakterleri g”nder
DO
    A$ = INKEY$
    IF A$ <> "" THEN PRINT #1, A$;
LOOP

karakteroku:
'okunan karakterleri listele
A1 = LOC(1)
IF A1 > 1 THEN
    B$ = INPUT$(A1, #1)
    PRINT B$;
END IF
RETURN

Ayrıca QuickBasic yardımda COM(n) ON, COM(n) OFF, COM(n) STOP komutlarına bakınız.

ON UEVENT

Kullanımı:

ON UEVENT GOSUB {satır numarası | satır etiketi}

Kullanıcı tanımlı olay meydana geldiğinde belirtilen satır numarası veya satır etiketindeki alt program çağrılır.

Örnek:

' QB editörünü komut satırında
' QB.EXE /L
' ile çalıştırın. Bu işlem QB.QLB yi yükler
ON UEVENT GOSUB Olay1
UEVENT ON
INPUT "Bir sayı girin:"; a
IF a = 5 THEN CALL SetUEvent
'SetUEvent alt rutini QB.QLB ile belleğe yüklendi
END

Olay1:
PRINT "Olay gerçekleşti"
RETURN

ON ERROR

Kullanımı:

ON ERROR GOTO {satır numarası | satır etiketi}

Program çalışması sırasında bir hata meydana geldiğinde belirtilen satır numarası veya satır etiketinden devam eder.

Hata yakalama sayfasına bakınız.



Önceki Bölüm: 25: Klavye kullanımı Sonraki Bölüm: 27: Program Çalışma Süresini Hesaplama

Hiç yorum yok:

Yorum Gönder