Bu sayfadaki yazılar
Sayfanın metni
Sayfa 19
PRINT HEX$(60037) komutu, EA85 sonucunu verir.
IF..GOTO IF..THEN..ELSE IF..THEN..ELSE Blok
KOMUTLARI
Kullanım Şekli: 1. IF ifade GOTO satır [ELSE yönerge] 2. IF ifade THEN satır [ELSE yönerge] 3. IF ifade THEN yönerge [ELSE yönerge] 4. IF ifade THEN yönerge blok'u......
ELSE yönerge blok'u......
ELSEIF ifade THEN yönerge blok'u......
ENDIF
IF..THEN yönergesi, belli koşulları kontrol ederek sonuca göre ya programın takip eden satırlarını çalıştırır ya da programın belirtilen bir başka bölüme dallanmasını sağlar. Kullanım şekillerinde gördüğünüz gibi birçok farklı kullanımı vardır. En basit kullanım 1., 2. ve 3. formlardır. Bir örnek ile açıklayalım: IF a<10 THEN PRINT "a, 10'dan küçüktür"
ifade, genellikle fiziksel bir koşulun karşılaştırmasıdır. Belirtilen koşul karşılaştırıldığında sonuç doğruysa, Amiga Basic -1 (doğru) değerini; yanlışsa, 0 (yanlış) değerini alır ve eğer sonuç -1 ise (doğruysa) ekrana "a, 10'dan küçüktür" yazılır. Sonuç yanlışsa, program bir alt satırdan itibaren çalışmasını sürdürür. Komut, ELSE ile genişletilebilir:
IF a<10 THEN PRINT "a, 10'dan küçüktür"
ELSE PRINT "a, 10'dan küçük değildir"
Bu ilave ile program koşulun yanlış olduğu durumda ELSE ile verilen işlemi yapar ve ekrana "a, 10'dan küçük değildir" yazar. Komutta THEN ve takip eden komutun yerine bir GOTO ve satır numarası ya da etiket konulabilir. Yani:
IF a<10 GOTO koşul 1 ELSE GOTO 250
IF/ELSE IF/ELSE/END IF yapısı kullanılarak birden fazla koşul karşılaştırması yapılabilir. Biraz önceki formatta THEN'den sonra başka bir karşılaştırma imkanı olmadığını düşünürseniz, bu yeni kullanım çok işe yarayacaktır. Birinci koşulun doğru olmadığı durumlarda ELSE IF....THEN satırı ile ikinci koşul karşılaştırması yapmak mümkündür. IF ELSE IF/ELSE yapısı, END IF komutu ile sona erer. Bu yapıyı birbiri içine geçmiş olarak vermek mümkündür. İsterseniz sadece bu komutu kullanarak 3 sayıyı karşılaştırıp en büyüğünü bulan basit bir program yazalım::
a=4:b=6:c=11 IF a<b THEN
IF a<c THEN
IF b<c THEN PRINT "en büyük c" ELSE PRINT "en büyük b" ENDIF ELSE PRINT "en büyük b" ENDIF ELSEIF a<c THEN PRINT "en büyük c" ELSEIF a>b THEN PRINT "en büyük a" ENDIF
Programda verdiğiniz a, b ve c değerlerini değiştirerek denemeler yapabilir, hatta yeni bir mantık kurup kendi programınızı oluşturabilirsiniz. Deneyin.
Örneklerle açıklamaya çalıştığımız kullanım şekillerinin bağlı olduğu kuralları maddeler halinde aşağıdaki listede bulabilirsiniz:
1., 2. ve 3. format için: . ifade sonucu doğru ise, program ya satır ile belirtilen satıra dallanır ya da THEN'den sonraki yönerge'yi yerine getirir.
. ifade sonucu yanlış ise, GOTO ve THEN ile verilen işlem yapılmaz; eğer varsa, ELSE'ten sonraki yönerge uygulanır.
. THEN ve ELSE'ten sonraki yönergeler iç içe geçebilir, bu birçok Amiga Basic yönerge ve fonksiyonunu içeren komut girebilmenizi sağlar. Ancak 1., 2. ve 3. formlar bir satırı aşamazlar.
. THEN'den sonra, bir Amiga Basic yönergesi ya da satır numarası veya etiket belirtilebilir.
. GOTO her zaman satır numarası ya da etiketi ile verilir.
. Yönergede THEN ve ELSE aynı sayıda değilse, her ELSE en yakın THEN ile uyumlaştırılır.
. Bir IF..THEN yönergesi bir satır numarası ya da etiketine atlama yapıyorsa ve bir Amiga Basic "Undefined line number" hata mesajı verirse, gönderilen satır bulunamamış demektir.
4. Kullanım şeklinde bunlardan farklı kurallar da şunlardır: Yönerge bloğu iç içe geçmiş IF-THEN-ELSE bloklarından oluşabilir. Amiga Basic iç içe geçmiş yönergeler için tek satır sınırı koymaz; yönerge bloğu bir ya da daha çok satırdan oluşabilir.
. Bir ifade doğruysa, karşılık gelen THEN yönerge blok'u çalıştırılır ve program END IF yönergesini takip eden ilk yönergeye giderek çalışmasını sürdürür.
. Hiçbir ifade doğru değilse; ya program END IF'ten sonraki ilk yönergeden devam eder ya da varsa ELSE yönerge blok'u devreye sokulur ve program yine END IF'ten sonraki ilk yönergeden çalışmasını sürdürür.
. ELSE-IF blok'u opsiyoneldir. Amiga Basic bu konuda herhangi bir limit koymaz.
. ELSE blok'u da seçimliktir. . Satırda THEN yönergesinden sonra herhangi bir şey yazılmışsa, Amiga Basic bunun tek satırlık bir IF-THEN-ELSE yönergesi olduğunu düşünür.
INKEY$ KOMUTU:
Kullanım Şekli: INKEY$
Bu komut klavye buffer'ından bir karakter okur ve onu tek karakterlik bir yazısal dizi olarak geçirir. Herhangi bir karakter girişi yapılmazsa, buffer boş kalır ve INKEY$ boş bir karakter geçirir. Burada programı durduran Amiga+nokta tuş kombinasyonu haricinde tüm tuşlar kullanılabilir.
INKEY$ komutu ekrana herhangi bir karakter yazmaz, sadece karakteri geçirir.
Tus: a$=INKEY$ INPUT "Devam edecek misiniz (E/H)? ",a$ a$=UCASE$(a$) IF a$<>"" THEN IF a$="E" GOTO Yaz IF a$= "H" THEN END BEEP ENDIF GOTO Tus yaz: PRINT Merhaba" GOTO Tus
Örnek programımız, ekrana "Devam edecek misiniz (E/H)? " yazarak sizden cevap bekliyor. Cevap olarak tek karakterlik bir harf giriyorsunuz. Harf girmezseniz, aynı soruyu yineliyor, E veya H dışında bir harf girip Return'e basarsanız, bip sesi çıkarıp tekrar soruya dönüyor. UCASE$ fonksiyonu, girişi küçük harf yapsanız bile büyük harfe çeviriyor. "E" cevabı verirseniz, ekrana "Merhaba" yazıp soruya dönen program, "H" cevabı ile sona eriyor.
INPUT KOMUTU:
Kullanım Şekli: INPUT[;] ["uyarı mesajı";] değişken-listesi
INPUT komutu, programın çalışması esnasında kullanıcının klavyeden değerleri girebilmesini sağlar. Girilen değerler daha sonra program tarafından ilgili değişkenlere atanırlar. Program çalışırken bir INPUT yönergesi ile karşılaştığında durur ve uyarı mesajı yazılmamışsa bir soru işareti görüntüleyerek girişi bekler, uyarı mesajı'nı yazmak, özellikle uzun programlarda kullanıcının hangi bilgiyi gireceğini göstermesi bakımından çok yararlıdır. Mesajı takip eden “;” yazıdan sonra soru işareti koyar. Noktalı virgül yerine virgül koyulursa, soru işareti yazılmayacaktır.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 18
Merhaba... Hatırlarsanız geçen ay BASIC dersimizi GET komutu ile bitirmiştik. Bu ay BASIC'in yeni bir dallanma komutu ile devam ediyoruz.
GOSUB..... RETURN KOMUTU:
GOSUB satır
RETURN [satır]
Program içindeki bir alt rutine atlamak ve geri dönmek için kullanılan komuttur. Bir alt rutin GOSUB ile çağrıldığında, Amiga Basic GOSUB satırının bulunduğu yeri not eder ve sonra belirtilen satıra dallanır. Bu alt rutinde bir RETURN komutu bulursa ve RETURN komutunda herhangi bir satır belirtilmemişse, GOSUB komutunun bulunduğu satırı takip eden satırdan itibaren çalışmasını sürdürür. RETURN komutunda satır belirtilmişse, Amiga Basic buradan belirtilen satıra atlar.
GOSUB ve RETURN yönergelerinde verilen satır, programın dallanacağı alt rutinin ilk satırının satır numarası ya da etiketidir.
Bir alt rutin program içinden birkaç kez çağırılabileceği gibi, bir başka alt rutin içinden de çağrılabilir. Bu tür iç içe geçmiş alt rutinler sadece bellek miktarı ile sınırlıdır.
RETURN komutundaki satır seçeneği, geri dönüşün GOSUB komutunu takip eden satırdan değil de başka herhangi bir satırdan devam etmesi istendiğinde kullanılır. Komutun bu formatı dikkatli kullanılmalıdır. Zira bir diğer GOSUB, WHILE ya da FOR yönergesi aktif iken aynı anda sizin GOSUB'ınız da aktif olur. Bunun sonucunda da döngüler ya da diğer alt rutinler yanlış yerlerde sonlanabilir ve Amiga Basic'in "FOR WITHOUT NEXT" (NEXT'siz FOR) ya da "WHILE WITHOUT WEND" gibi hata mesajları vermesine sebep olur.
Alt rutinler, programın herhangi bir yerine yerleştirilebilir. Ancak ana programdan ayırt edilebilir bir şekilde yerleştirilmesi daha uygundur. Alt rutine istenmeyen girişleri önlemek için, alt rutinin başlangıcından önce STOP, END ya da GOTO yönergeleri ile program akışı kontrol edilmelidir.
Programda kullanılan GOSUB yönergesi sayısı ile RETURN sayısı aynı olmalıdır. Yani her GOSUB için ona ait bir RETURN yönergesi bulunmalıdır. Aksi takdirde programınız hata mesajı verecektir.
Komutların çalışmasını aşağıdaki örnek programda inceleyin:
'Yazı stili DEFLNG a-Z LIBRARY "graphics.library" DECLARE FUNCTION AskSoftStyleO LIB- RARY 'Geçerli stil seti Allowed%=AskSoftStyle(WINDOW(8)) 'Görüntüle GOSUB StilYap LIBRARY CLOSE END StilYap: FOR i=0 TO 7 CALL SetSoftStyle (WINDOW (8), i, Allo-
wed%)
'Bitleri kontrol et IF i=0 THEN CALL PrintMsgfplain ") IF (i AND 1) THEN CALL PrintMsgfboldface ") IF (i AND 4) THEN CALL PrintMsgfitalic ") PRINT NEXT 'Normale dön CALLSetSoftStyle(WINDOW(8),0,255) RETURN SUB PrintMsg(msg$) STATIC CALL Text (WINDOW(8) ,SADD (msg$), LEN (msg$)) END SUB
Program, yazı stilini değiştirmek için yazılmış. Stil değiştirmek için kullanılan alt rutin ve programların çoğu library rutinlerinden çağrılıyor. GOSUB ile gönderilen StilYap rutini değişik stilleri gösteren yazıları görüntüleyerek RETURN komutuyla GOSUB satırının altındaki komuttan itibaren çalışmasına devam etmektedir.
GOTO KOMUTU:
Kullanım Şekli:
Bu komut, programın belli bir satıra dallanarak çalışmasına oradan devam etmesini sağlar.
satır, satır numarası ya da etiket olabilir. Program komutu takip eden satır belirtecinde istenen satıra atlayarak çalışmasına oradan devam eder. Satırda çalıştırılabilir bir yönerge varsa o işlemi yapar; DATA ya da REM gibi işlevi olmayan bir satırsa, buradan sonraki çalıştırılabilir ilk satırdan itibaren çalışmasını sürdürür.
Genellikle dallanma işleminde GOTO yerine ON..GOTO, IF..THEN..ELSE gibi yapısal kontrollerin kullanılması tavsiye edilir; çünkü programda çok sayıda GOTO olması, programın incelenmesini ve hata ayıklanmasını zorlaştırır.
Diyelim ki kullanıcıdan Evet ya da Hayır şeklinde cevap isteyen ve bu cevaba göre çalışmasına devam eden bir programda GOTO kullanalım: 100 IF A$="E" THEN PRINT "EVET.":GOTO 120 110 PRINT "EVET DEĞİL." 120 REM PROGRAM BURADAN DEVAM EDİYOR.... Aynı işlemi IF..THEN..ELSE ile yaparsak problemi tek satırda halledebiliyoruz: 100 IF A$="E" THEN PRINT "EVET." ELSE PRINT "EVET DEĞİL."
Programda bunun gibi pek çok dallanma olduğunu düşünürseniz, programın ne kadar uzayacağını kestirmek fazla zor değil. Tabii ki programlarınızın içinde bu komutu yine de oldukça sık kullanmanız gerekecek.
HEX$ KOMUTU: Kullanım Şekli: HEX$(değer) Bu fonksiyon, ondalık bir sayının onaltılık
AMIGA BASIC
Kullanım Şekli:
GOTO satır karşılığını verir, değer, -32768 ile 65535 arasında bir sayı olabilir ve HEX$(değer) işleminden önce yuvarlanır. Örneğin;