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