Commodore sayı 76, sayfa 21

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 21

Y-6Xx40.5xx13-0.11xx17

Bu polinomda ilk olarak x 5'li terimin eksik olduğunu farketmenizi bekliyorum. Bu katsayı yerine sıfır koyarsak polinomumuz şu şekle girecektir:

7 bu polinomu hesaplayan rutini yazmak çocuk oyuncağı. Tablo 1'e bakın.

*-828 POLY2-$E043

LDA #<KATSAYI LDY #>KATSAYI JMP POLY2

*BYT 3 derecesi *FLP -.11 ;son katsayı *FLP O *FLP 0.5 .FLP 6

KATSAYI

katsayı

Tablo-1: Örnek polinomun değerini hesaplattıran program.

Geçen sayıda sizin assembler'ınızın .FLP gibi bir işlemi olmayabileceğini söylemiştim. Eğer bu işlem assembler'ınızda yer almıyorsa sayıların değerini şu yöntemle bulabilirsiniz: 1. BASIC'de hiç değişken yokken “A” komutunu girerek A değişkenine ikilik gösterimini bulmak istediğiniz sayıyı yerleştirin.

2. Bir monitör programına girin. Kartuşunuzun böyle bir programı varsa onu kullanın, yoksa 1. basamağı yapmadan önce monitör programını belleğe yükleyin ve BASIC'de kalın. 3. $2D-$2E adreslerinden yararlanarak ilk değişkenin yerini öğrenin. 4. Bu değişkenin harflerinden sonra gelen (hatırlarsanız ilk iki bayt değişkenin harflerini tutuyordu) beş baytın değerini bir yere not edin. Tablo 1'de de görebileceğiniz gibi polinom derecesi olarak 7 değil de 3 kullandık. Bunun sebebi, polinomu başta gösterdiğim gibi ayırdığınızda x 7'li terimin (X 12) 1 3 olarak görünmesidir. : Birkaç değer için fonksiyonumuzu denersek şu sonuçları elde ederiz: USR(0) =0 USR(1) =6.39 USR(2) = 1.92 USR(.75) =4.69625427 Daha kullanışlı konular da var... Kayan noktalı gösterimle ilgili konumuzu kapatırken çoğu zaman karşınıza çıkan bir problemin çözümünde makine dilinin ne kadar faydalı olacağını göreceğiz: Sayılarla dolu bir diziyi sıralamak. Makine dili programımız Tablo 2'deki rutinin yaptığı işi gerçekleştirmeye çalışacak.

100 FOR I-1 TO N : FL-0 110 FOR J-N TO I STEP -1

120 IF A(J-1)>A(J) THEN H-A(J)

130 NEXT J 140 IF THEN RETURN 150 NEXT I : RETURN

göre, bu sayıyla bir karşılaştırma daha yapmak pek de akıllıca olmayacaktır. Bu yüzden iç döngünün değeri son sayıdan ilk döngünün değerine kadar değişiyor yalnızca. Bu sayede karşılaştırma sayısını azaltarak hızı artırıyoruz. Bu işlemi yapılan bir ek daha var. Her “en küçük bulma” işlemi başında bir flag'i sıfırlıyoruz. Eğer yer değiştirme olursa bu flag'in değerini 1 yapıyoruz. Eğer “en küçüğü bulma” işlemi bittiği halde bu flag sıfırsa, bu taramada hiç yer değiştirilme yapılmamış olduğunu ve dolayısıyla dizinin sıralanmış olduğunu anlıyoruz. Bu karşılaştırma, özellikle yarı sıralı dizilerde dikkate değer bir hız artışı sağlıyor. İlk taramamız N'inci elemandan 0'ıncı elemana kadar tarıyor. İkinci turda ise N.'den 1.'ye kadar taranıyor ve bu işlem bu şekilde sürüyor. İsterseniz ilk olarak bazı koşullar koyarak bu sıralama rutinini olabildiğince basitleştirelim: 1. Dizimiz, dizi listesindeki ilk eleman olmalı.

2. Dizimiz tek boyutlu olmalı. 3. Dizimiz noktalı sayılardan oluşmalı (Tam sayı veya string'ler bu kuralları ihlal eder). Eğer dizilerin bellekte nasıl saklandığını hatırlarsanız (ya da geçen sayıyı bir daha

A(I)SA(J-1) : A(J-1)-H

Tablo-2: A(N) dizisini sıraya sokacak BASIC alt programı.

Bu program A(N) dizisinde yer alan sayıları küçükten büyüğe doğru sıralayacaktır. Çalıştırmak için ise sadece GOSUB 100 demeniz gereklidir. Rutin, en basit algoritma olan kabarcık sıralama (namı diğer BUBBLE SORT) tekniğini kullanıyor. Algoritmanın mantığı içerir. Eğer ardışık iki sayıdan ilki daha büyükse, onların yerleri değiştirilir. Tüm sayılar bu şekilde yukarıdan aşağı doğru tarandığı zaman en alttaki sayı en büyük sayı olur. Eğer tarama aşağıdan yukarı doğru yapılırsa (ki Tablo 2'de bu sistem kullanılmış) en üstteki sayı en küçük sayı olur. Tüm diziyi sıralamak istediğimize göre, bu işlemi tüm sayılar için tek tek yapmalıyız. Ama en üstteki sayının en küçük sayı olduğunu bildiğimize okursanız) bu kuralların sebebini daha kolay anlayacaksınız. Dizinin ilk eleman olması, diziler arasında doğru olanını bulmaya çalışmak gibi zahmetli(!) bir işten kurtaracaktır bizi. Tek boyutlu bir dizi kullandığımızda, elemanların yerini bulmaya çalışmak gibi işlerle uğraşmayız, çünkü ardışık iki eleman arasında beş bayt bulunduğunu biliriz. Son şık basit bir kontrolü daha yapmaktan kurtarıyor bizi. Eğer sıralanacak dizi tam sayı ya da string'lerden oluşuyorsa değişik yapıları test etmemiz gerekecekti, ki bu da daha uzun bir program oluşturacaktı. Tabii ki daha kapsamlı bir program daha çok işinize yarayacaktır. Fakat bu yazıya ayrılan sayfaların sayısı bu kadar detaylı bir çalışmaya izin vermiyor.

Klavyeyle gezinmek için ← ve → tuşları.