Bu sayfadaki yazılar
Sayfanın metni
Sayfa 59
GOTO'suz
Programlama
BASIC 7.0, GOTO'lara gerek duymaksızın yapılandırılmış programlama sağlayan bir dizi döngü ve yapı komutlarına sahiptir. Bunlardan biri, ELSE koşulu için IF...THEN sorusunun geliştirilmişi. Şimdiye kadar alternatifli tercihler şu örnekteki gibi programlanabiliyordu:
40 A$—”N” THEN PRİNT “HAYIR”:GOTO 30 20 PRİNT “EVET” 30 REM BOYLECE DEVAM
BASIC 7.0'da aynı işi yapmak için çok daha kolay anlaşılabilen tek bir satır yeterli:
40 1F AS—“N” THEN PRİNT PRİNT “EVET” AS, “N”e eşitse “HAYIR”, değilse “EVET” basılacaktır.
Yazık ki, ELSE komutu bu şekliyle tek bir satırla sınırlanmıştır. Burada gerekli çareyi BEGIN...BEND ile parantezleme sağlar. BEGIN ve BEND arasında yer alan tüm BASIC satırları, BASIC çeviricisi tarafından tek bir BASIC satırı gibi algılanan bir öbek oluşturur. Bu nedenle BEGIN...BEND, özellikle IF sorularında çok yarar sağlar:
40 INPUT “SENİN BİLGİSAYARIN COMMODORE MU BASKA MI?:C$ 20 IF C$-“COMMODORE” THEN BEGİN SATIN ALINIZ!” 40:BEND:ELSE BEGİN SO:PRİNT“HAİN!” 60 BEND
60
Burada dikkat edilmesi gereken, IF komutunun 20. satırından 60. satırına kadar yayılmakta olmasıdır. Bu örnekte, eğer bilgisayar Commodore ise, bir C-128 satın alınması öneriliyor. Eğer bilgisayar Schneider veya başka bir markaysa hemen “hain” damgası vuruluyor. Tabii ki, bu tür IF...THEN...ELSE soruları, BEGIN...BEND ile birbirine geçirilebilir, yani hem THEN bölümüne hem de ELSE bölümüne ek IF soruları eklenebilir. Böylece daha büyük program öbekleri de GOTO kullanılmaksızın programlanabilir. GOTO'nun dışlanması, programa bir toplu bakışı kolaylaştırdığı gibi, hızını da oldukça artırır. BASIC çevirici her GOTO komutunda öncelikle programın içinde ondalık olarak bulunan satır numarasını ikili yazı düzenine dönüştürmek ve verilen satırı aramak zorundadır. Bir diğer avantaj: Program komutlarının kendilerine artık daha başka satır numaralarına gerek kalmıyor. Örnek program hiçbir değişiklik gerektirmeksizin olası tüm satır alanlarında kullanılabilir. Böylesine kolay programlanan yalnızca dallanmalar değildir. Özellikle döngülerde, yani belirli program parçalarının tekrarlanmasında, BASIC 7.0'ın üstünlüğü kendini açıkça göstermektedir. C-64'ten de bildiğimiz gibi, bir FOR...NEXT döngüsü, aynı döngünün IF ve GOTO ile programlanmış halinden bir miktar daha hızlıdır. FOR...NEXT döngüsünün dezavantajı ise, döngünün kaç kere tekrarlanması gerektiğinin girişte verilmesi zorunluluğudur. Bu dezavantaj, yeni ve hızlı bir DO...LOOP döngü yapısı ile ortadan kaldırılabilmektedir. FOR...NEXT gibi DO...LOOP da istenen uzunlukta bir program bölümünü çevreleyebilir. DO komutu, yalnızca BASIC çeviricisinin döngünün başlangıcını fark etmesini sağlar. Buna ilişkin LOOP'a erişildiğinde, herhangi bir arama süresi gerektirmeksizin son derece hızlı bir biçimde DO'ya geri atlanacaktır. Yani sonuçta ortaya çıkan, DO ile LOOP arasında bir “sonsuz döngü”dür. Bu döngüyü terk edebilmek için, EXIT komutu öngörülmüştür. EXIT'in görevi, LOOP'un arkasından programın akışının normal bir biçimde sürdürülmesidir. Bu nedenle EXIT komutu, çoğunlukla bir koşula bağlanır. Örnek:
10 20 DO 30:X — x*2:PRİNT X A0:İF X THEN EXİT 50 LOOP
x değeri, 1500 değerini aşılana kadar ikiye katlanır ve görüntülenir. Bu koşulsuz DO...LOOP döngüsünün yanısıra, koşullara bağımlı iki tür de öngörülmüş durumda:
DO WHILE...LOOP, WHILE'den sonra yer alan koşul geçerli olana kadar sürer:
40DO WHİLE A$ A$:LOOP
Hiçbir tuşa basılmamış olduğu durumda, WHILE koşulunu yerine getiren A$ daima boştur. Döngünün terk edilmesi ancak bir tuşa basılmasıyla gerçekleşir. DO UNTIL döngüsü ise bunun aksine, koşul doğru olduğu sürece yerine getirilmez, ancak UNTIL'in arkasında verilen koşulun doğrulanmasına kadar yürütülür. Tabii ki, DO WHILE veya DO UNTIL'de, bu komutların verimini yükseltecek şekilde istendiği kadar EXIT döngüye eklenebilir.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 58
Program Kesilmeden
Hata Bulma ve Düzeltme
C-64 her ortaya çıkan hatada karşılık gelen bir mesajla programı keserken, C-128 bu konuda belli bir esnekliğe sahip. TRAP komutu sayesinde hatalar programın işlemesi sırasında yakalanabiliyor. Örneğin, “TRAP 500“ komutunun verilmesinden sonra, bir hatanın ortaya çıkması durumunda programın çalışması kesilmiyor, aksine bir hata düzeltme rutini (örneğimizde 500 satırından sonra) dallanıyor. Hataya ilişkin tüm önemli veriler, sistem değişkenlerinde saklanıyor ve (programcı tarafından yazılacak olan) Basic rutini tarafından 500. satırından itibaren değerlendiriliyor: EL, hatanın ortaya çıktığı satır numarasını, ER hata numarasını içeriyor; ERR$ ise yazıdaki hata mesajını veriyor. Hata düzeltme rutini, gerekli önlemi almak için, bu değişkenleri değerlendirebilmekte. Tabii bundan sonra programın devam edebilmesi gerekiyor. Bunu sağlayan ise RESUME komutu. Bu komut bir hata düzeltme işlemini sona erdiriyor (alt programlardaki RETURN ile karşılaştırılabilir). RESUME üç farklı biçimde kullanılabiliyor. Herhangi başka bir parametresi olmayan RESUME, hatayı doğuran komuta geri dönüyor ve programı oradan devam ettiriyor. Bu durumda tabii ki hata düzeltme rutini tarafından hata nedeninin ortadan kaldırılmış olması gerekiyor. Aksi takdirde hata aynen yinelenecektir. Bunu açıklamak için en iyi örnek, bilgisayarın açık olup olmadığını denemek:
40 TRAP 90: OPEN 1,4 20 PRİNT# 4, “BILGİYAZAR OK” 30 END 90 IF ER—5 AND EL— PRİNT “LUTFEN BİLGİYAZARI ACINIZ VE TUSA BASINIZ”: GETKEY A$ 95 RESUME
Bu küçük demo programı, bağlı bir bilgisayar hakkında “BİLGİ-YAZAR OK” ifadesini verecektir. Bilgisayarın açık olmaması durumunda, 10 satırındaki OPEN komutu normal olarak “Device not present” hata mesajına yol açacaktı. Bu mesaj her halükârda TRAP komutu tarafından yakalanır ve bunun yerine hata numarasının ve satırının denetlenmesinden sonra kullanıcının kibarca bilgisayarı açması için uyarıldığı 90. satırına dallanır. GETKEY komutu, programın RESUME komutuyla yeniden OPEN komutuna dönmesini sağlayacak bir tuş girişini bekler. Hataya neden olan komutun bir daha yerine getirilmemesi gerekiyorsa, hata düzeltme rutini RESUME NEXT ile kapatılır; böylece hata nedeninden bir sonraki komutla devam edilmesi sağlanır. Özel bazı durumlarda, bir hatadan sonra programın tamamen farklı bir yerinden devam etmek gerekebilir. Böyle bir durumda RESUME'nin ardından, programın devam etmesi gerektiği yerin satır numarası verilir. Programın kendi içinde gerçekleşen bu hata düzeltme olanağı, kullanıcıya büyük avantajlar sağlamaktadır. Programın geliştirilme aşamasında bir hata ortaya çıktığında, hatalı satırın dökümünü almak için HELP tuşuna basmak yeterlidir. Satırda hataya neden olan kısım bu sırada ters (reverse) olarak görüntülenir. Tabii ki, disket ünitesinden bildirilen hata da aynı biçimde araştırılacaktır.
1 OPEN PRİNT 1:END
gibi kapsamlı bir satırı girmek (ve bu arada muhtemelen kendi programının üzerine yazmak) yerine, BASIC 7.0'da yalnızca “?DS$” girilir ve aynı mesaj alınır. DS$ sistem değişkeni, disket ünitesinin hata durumunu, DS sistem değişkeni ile karşılık gelen hata kodunu açık metin olarak içerir. Esas olarak C-128'de tüm disket komutları, Basic komutları olarak kullanılabilir durumdadır. Örneğin SCRATCH, disketten bir kütüğü siler; DIRECTORY veya CATALOG programın kaybolmasına neden olmadan disketin içerik listesini verir; DLOAD, DSAVE ve DVERIFY sayesinde sıkıcı kurtulmak mümkün olur. BLOAD ve BSAVE ise herhangi bir bellek içeriğini programları, (veriler vb.) yüklemeye ve bellekte saklamaya yararlar. Sıralı ve rastgele kütüklerin daha kolay kullanılmasına yarayan bir dizi komut daha vardır. Örneğin RECORD ile bir rastgele kütüğün herhangi bir veri kaydına doğrudan erişilebilir; APPEND ise sıralı kütüklere ek veri kayıtlarının sorulmasına yarar.