Bu sayfadaki yazılar
Sayfanın metni
Sayfa 19
1500. satırda en çok problemi yaratan program var: negatifini alma. İlk olarak, RAKAM = 0 ise, yani sayı girilmediyse ekrandaki sayıyı alıyoruz. Eğer bu sayı da sıfırsa beklemeye dönüyoruz. Değilse EK(X)'i eksi EK(X) yapıyoruz. Sayı almanın başındaki sıralama bu rutinin başındaki EKRAN$'ın alınmasından dolayı ortaya çıkıyor. Eğer bu sıralamayı yapmazsak sonradan basılan sayılar bu sayıya eklenmeye başlıyor. Son olarak, 1600. satırda da sadece şu anda alınmakta olan değerlerin hepsi sıfırlanıp ekrana yazılıyor. 1900. satırdaysa ekran (tabii ki hesap makinesinin ekranı) temizleniyor, ekrana yazılıyor, EKRAN$'a da bu değer atanıyor. EK(X)'e göre eksi işareti de basıldıktan sonra tuş beklemeye geri dönülüyor. Programın en zor kısmını bitirmiş olduk böylece, Artık diğer kısımlarla devam ederiz. İkinci alt programımız 2000. satırda başlıyor. Burada ilk olarak A1'e AR$(1)'in, A2'ye de AR$(2)'nin eksi veya artılısı yerleştiriliyor. Daha sonra IS$(1)'in değerine göre +, -, * veya / işlemlerinden biri yapılıyor. Bölme işlemini yapmadan önce A2'nin değerine bakıyoruz. Eğer bu değer 0 ise 9030'a gidip ekrana “OE” yazdırıyoruz ve AC anlamındaki “A”'ya basılmasını bekliyoruz. A'ya basılınca da her şeyi sıfırlayıp başa dönüyoruz. Eğer her şey yolundaysa sonucun mutlak değerini (ABS(A1)) diziye çevirip (STR$(sayı)) AR$(1)'e koyuyoruz.
EK(1)'i hesaplamak ise daha kolay. A1'in işaretini (SGN(A1)) Yalnız SGN(0) fonksiyonu 0 sayısını verdiği için sonuç sıfırsa EK(1)'e 1 vermeliyiz. AR$(2)'yi de gereksiz yere sıraladıktan sonra geri dönüyoruz.
3000. satırdan başlayan üçüncü alt program dergimizde yayınlanmış olan EKRAN Yapıcı programın bir çıktısı ve sadece ekrana bir hesap makinesi çizmekle yükümlü, Bu arada belirtmeden geçmeyeyim, ekran düzeni tamamen EMRE'ye ait (sanırım memnun ol artık).
7000. satırda bulunan kısacık rutin ise bu programı yazmamızın asıl sebebi olan ok kullanarak ekrandan bir şeyler okutma programı. Buraya ilk sıçranıldığında hemen ateş tuşu kontrolü yapılıyor. Eğer ateşe basılmıyorsa zaten yapılacak bir şey olmadığından hemen geri dönüyoruz. Ateşe basılıysa da, bu sefer ateş tuşu bırakılana kadar bekliyoruz (7020. satır). Bunun sebebi, ateşe basıldığında bir tuşu iki kere okumayı engellemek. Bu gibi ufak rutinler programları daha kolay kullanılır hale getirirler. Daha sonra ekrandaki tuş matrisine göre, ok hangi satırdayken ateşe basıldığını kontrol ediyoruz. Eğer 5, 7, 9 veya 11. satırdaysa “Tuşlardan biri olabilir.” diyerek satır alt rutinlerine sıçrıyoruz. Satır tutmuyorsa Z$'a dokunmadan geri dönüyoruz. Eğer 5. satırda ateşe basıldıysa kolonlara bakıyoruz (7100'deki alt program): 14. kolonsa Z$'a bir “7” 16. ise “8” 18. ise “9” koyuyoruz. İki karelik tuşları kontrol etmek için OR işlemiyle: “20. VEYA 21. kolonlarsa Z$'ı “C” yap.” diyoruz. Aynı şekilde AC'yi VEYA 24. kolonlardaysa Z$'a “A” yaz.” şeklinde ayarlıyoruz (7130. ve 7140. satırlar). Eğer bu kolonlardan hiçbiri değilse Z$'a dokunmadan geri dönüyoruz. Ok 7. satırdaysa hemen 7200'e sıçrıyoruz ve kolona göre değerler veriyoruz:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 18
si PEEK(49586)*256 + PEEK(49585) 49587: Ateşe son basıldığında okun bulunduğu Y koordinatını tutar. 0 ile 199 arası değerler alabilir. 49588: Ateşe son basıldığı anda okun bulunduğu X karesini tutar. 0 ile 39 arası değerler alabilir. 49589: Ateş tuşuna son basıldığında okun bulunduğu Y karesini aklında tutar. 0 ile 24 arası değerler alabilir. İsterseniz bunları bir de tablo haline getirelim:
EXE BASİC Kullarıtabikeri
Oh! Programın bu kadar çok bilgi verdiğini bilmiyordum doğrusu. Bazılarınız karakter pozisyonunu da benim vermemin saçma olduğunu, bu pozisyonun kolayca X koordinatını 8'e bölerek hesaplanabileceğini söyleyecektir eminim. Ama, her şeyi hazır bulmak daha kolay değil mi? Neyse, gelelim hesap makinemize... İlk olarak bir hesap makinesinin çalışma prensibini oluşturmalıyız. Eminim bu konuda daha önce hiç kafa patlatmamışsınızdır. Ama kalemi elinize alıp kağıdın başına geçtiğinizde, bir hesap makinesi yaratmanın hayatta yapılabilecek en kolay iş olmadığını farkediyorsunuz. Hesap makineleri sonsuz miktarda toplama yapabildiğine göre (şu işlemi yapabilme ve bir işlem yapmak için en az iki argüman gerektiğine göre) bizden iki değer (argüman) alması gerek. Bu değerlerin alınmasının bittiğini bir işlem veya eşittir belirtir. Şimdi nasıl bir algoritma kurarak sonsuz işlemi iki adet sayı alarak gerçekleştirebileceğimizi düşünelim. Benim aklıma şöyle bir yöntem geldi: İlk olarak A sayısı alınır, daha sonra B sayısı alınır. A'ya A (işlemA) B değeri atanır. (Buradaki işlem A, A sayısının alınmasının bittiğini gösteren işlemdir. Birazdan gelecek işlemB de B sayısının alınmasının bittiğini gösteren işlem olacaktır haliyle.) Eğer işlemB “=” değilse işlemA'yı işlem B'ye eşitleriz. A zaten son işlemin sonucunu tutuyor olur. Böylece sadece yeni bir B sayısı (ve işlemi) alarak yeni bir işlem yapabiliriz. Ta ki bir “=” ile işlemler dizisi son bulana kadar... Eğer işlemB olarak eşittir girildiyse sonuç ekrana yazılır ve yeniden A sayısı (ve işlemi) alınmaya dönülür. Tabii ki burada karşılaşılacak problemleri (ve çözümlerini) programın açıklamasını yaparken yazmayı düşünüyorum. Genel olarak A ve B sayılarını almak için aynı kuralları kullanacağımıza göre, tek bir alt-program yazarak her iki sayının da alınmasını sağlayabiliriz. Bu alt rutini çağırırken seçeneğimiz bir değişkene 1 verirsek A sayısı, 2 verirsek B sayısı alınır. Bu değişkende bulunan değer sayesinde alt programımız da A'nın mı B'nin mi olduğunu farkedebilir. Bu sayede “-” gibi işlemlerde alınmakta olan argümana göre farklı işler yapabilir. Bir de her hesap makinesinde bulunan AC ve CE tuşları ve programımıza eklememiz gereken, Öncelikle bu tuşların tam olarak ne yaptıklarını öğrenmeliyiz: AC'ye basıldığında nerede olursak olalım, tüm değişkenler ve işlemler sıfırlanır, A sayısının alınmasına dönülür. CE'ye basıldığında ise yalnızca alınmakta olan sayı sıfırlanır, bir önceki sayı ve işleme dokunulmaz. Tabii ki hesap makinesi programı her zaman çalışacağı için programı sonsuz döngüye sokmalıyız,
Şekil-i: mükimsı programının akiş Şeması,
İşte şimdiye kadar çıkarttığımız algoritmanın akış şeması:
Programı tasarlarken sadece klavyeden sayı aldırma rutinlerini yazmak, program çalışır hale geldikten sonra okla sayı alma rutinlerini eklemek daha akılcı. Bu sayede ilk olarak ana programdaki hataları ayıklayabiliriz. Program tamamen çalışabilir hale gelince de ok yardımıyla sayı okuma programını yazarız. Böylece tek seferde daha az hata kaynağı olabilecek programla uğraşırız. Artık yazdığımız programı inceleme vakti geldi sanırım. Bu yüzden en iyisi döküm ekini açın ve programı oradan takip edin. Programın ilk satırında MOUSE.EXE programını yüklüyoruz. Biliyorsunuz BASIC program içinde bir program çalıştırınca iki satıra sıçranır. Bu yüzden A değişkeniyle sonsuz yükleme çevrimine girmekten kurtuluyoruz. 110. satıra kadar olan bölgede ekranı çiziyoruz, oku çalıştırıyoruz ve gerekli değişkenleri ayarlıyoruz. Programın ana değişkenleri AR$, yani argümanlar, IS$, yani işlemler ve EK, yani eksi. Sayılarla olan problemi yüzünden argümanları sayı yerine karakter olarak tutup, zamanı gelince VAL(AR$(X)) ile değerini hesaplattırmayı uygun bulduk. Eksi işareti hesap makinesinin en soluna yazılacağı için, bir de eksi değişkeni tutup, bu değişkenin durumuna göre eksi işareti koymak da kolayımıza geldi. Gelelim 110. satıra: Aslında GOTO yerine GOSUB kullanıp RETURN'le geri dönseydik daha temiz bir çalışma olurdu, ama AC tuşunun her şeyi sıfırlayıp en başa dönmesi çok zor oluyordu ve program çok karışık görünüyordu. Bu sebeple ile alt programa sıçrıyoruz ve geri döneceğimiz zaman da X'in değerine göre 120. ya da 130. satıra sıçrıyoruz (RETURN'ün yapması gereken işlemi takip ediyoruz açıkçası), X değişkeni 1000. satıra sıçrarsak A sayısı ve IS$(1) alınır. X'e 2 verdiğimizdeyse B sayısı alınır.
120. satırda B sayısını aldıktan sonra 2000. satırdaki alt programa sıçrayıp yapılan işlemin sonucunu A'ya alıyoruz. 9000. satırda işlemin sonucunu ekrana yazıyoruz. Tüm bu işler bitince B sayısının işleminin ne olduğunu kontrol ediyoruz. Eğer “=” ise tekrar A sayısını alma rutinine sıçrıyoruz (110. satır). Değilse işlemA'yı işlem B'ye eşitliyoruz ve yeni bir B sayısı almak için 120. satıra gidiyoruz. 999. satırdaki END hiçbir zaman kullanılmıyor, ama alt programcıklardan hemen önce bir END koymak, programı geliştirme aşamasında iyi bir yardımcı olur. Bu sayede programın işlemesi bitince bir alt programlar işlemeye başlamaz. Artık alt programları inceleme vaktidir, İlk olarak en karışık olanından, yani sayı alma alt programından başlayalım: Bu alt program, kaç tane sayı girildiğini anlamak için RAKAM (bilgisayar için RA) adlı bir değişken kullanıyoruz. En başta bu sayıyı ve argümanı sınırlıyoruz ve bir tuş veya ok girdisi bekliyoruz. Bunu yapmak için ilk olarak klavyeden bir girdi var mı diye bakıyoruz (GET Z$) daha sonra ateşe basılmadıysa Z$'ın değeriyle oynamayan bir alt programa (ok okuma) gidiyoruz. Eğer Z$ boşsa bu işlemleri tekrarlıyoruz. 1030. satırda sadece 9 rakam alınmasını sağlıyoruz. Yani 9. rakamdan sonra nokta ya da sayı giremiyorsunuz. Yalnızca: 1050: AC KONTROLÜ. 1060: İŞLEM. 1070: EŞİTTİR. 1080: SAYININ NEGATİFİ. 1090: CE KONTROLÜ. Yapılıyor. 1100. satırda bir rakam girilmesi durumunda yapılacak işler duruyor. Eğer henüz sayı girilmediyse ve sıfıra basıldıysa bu sıfırı dikkate almıyoruz. Her ihtimale karşı, henüz rakam girilmediyse AR$(X)'i bir daha sıfırlıyoruz (negatifini alma rutinine gelince neden bunu eklediğimizi anlayacaksınız). Daha sonra RAKAM'ı bir artırıp, girilen rakamı argümanımıza ekliyoruz. Son olarak da ekrana yazma rutini olan 1900'e atlıyoruz, 1200. satırda AC durumunda ne yapılacağını görebilirsiniz; İlk olarak 9800'e sıçranıp tüm değişkenler sıfırlanıyor ve X'e 1 veriliyor, daha sonra da 1900'e gidilerek son durum ekrana yansıtılıyor. 1300. satırda bir işlem girildiğinde yapılacak işleri bulabilirsiniz: Eğer AR$'a daha sayı girilmediyse AR$(X)'e EKRAN$ (bilgisayar için EK$)'da bulunan değeri, yani ekrandaki değeri atıyoruz. Bu sayede sonra sonuca bir sayı daha ekleme şansınız olur, Yani “2 + 2” sonucu olan 4'ü gördükten sonra yeniden “+ 2” yazarsanız 2 değil 6 sonucunu alırsınız. Daha sonra IS$(X)'i girilen işleme eşitleyip, X'in değerine göre 120. ya da 130. satıra gidilir (sayı alınmıştır artır...). 1400. satır eşittir girilmesi durumunda neler yapılacağını gösterir. Eğer X = 1 ise, yani A alınıyorsa eşittir yalnızca sayıyı ekranda gösterir ve yeni sayı alınması için başa döner. Eğer X'e 2 varsa, eşittir bir işlem gibi davranmalıdır. Yani IS$(2) = “=” olur ve 130. satıra uçulur.