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.ON n GOTO satır numaraları listesi | satır etiketi listesi
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.
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)
ON TIMER(n)
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)
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.
| Ö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