Amiga Dünyası sayı 23, sayfa 83

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 83

BASIC'çiler sıkı durun başlıyoruz. Bu ayki konumuz dosyalamalar. Geçen aydan takip edenler hatırlayacaklar, dosyalamalarda karşılaşılan bazı sorunlara değinmiştik. Çözüm yollarını aramak ise bu aya kalmıştı. Kısaca tekrar edelim:

Amiga Basic ile kullanılabilen iki tür dosyalama var. Bunlardan birincisi ile dosyayı nasıl kaydetmişsek aynı şekil ve sırada geri alabiliyorduk. Sıralı veya Sequential adı verilen bu tür dosyalamanın hiç sorun çıkarmadan kullanılabildiğini anlatmış ve örnek vermiştik. İkinci tür dosyalama ise, bize bazı imkanlar sunuyordu. Random Access, rasgele erişim adı verilen bu dosyalama tekniği ile diskete belirli bir düzene (formata) uyan bilgi paketleri yerleştirebiliyor ve büyük bir dosya içerisinden istediğimiz pakete kolayca (o kadar kolay mı değil mi göreceğiz daha!) erişebiliyorduk. Bilgisayarınız ile basit programlar yapmak istiyorsanız, er veya geç bu tür dosyalama ile halledilebilecek programlar yazmak isteyeceksiniz. Bu tür ihtiyaçların en klasikleri: İsim listeleri, telefon defterleri veya stok defterleri tutmaktır.

Kağan iyi güzel de, geçen yazıda bize bir sürü sorun anlatmıştın diyeceksiniz. Doğru, ama sorunlarla karşılaşabilmek için ilk önce programımızın çatısını oluşturalım. Her zaman yaptığım gibi uzun dökümler vermekten kaçınmak istiyorum. Bu yüzden programı bölüm bölüm oluşturacağız. Tüm işlemleri GOSUB ile çağrılan ve RETURN ile biten bir altprogram şeklinde yazacağım.

Programımızla bir telefon defteri yapmak isteyelim. Basit olması açısından defterde sadece telefon sahibinin ismi, soyismi ve telefon numarası bulunsun. İlk belirlememiz gereken, dosyamıza ait bir bilginin ne şekilde ve ne büyüklükte temsil edileceği. Dosyamızda üç adet büyüklük var. Bunlara karar verdik. İsim ve soyisim mecburen alfanümerik olmak zorundalar. İşte ilk sorun, acaba bunlara ne büyüklük verelim. Yani isim ve soyisim kaçar harften oluşsun? Burada sorun bir şekil sorunu değil, bir yer sorunu. Örneğin isim 20, soyisim 40 karakterden oluşsun derseniz, toplam olarak bir dosyanızın bir elemanı 60 byte edecektir (numara işin içinde değil). Aynı eleman isim 8, soyisim 12 karakter alınırsa, 20 byte'lık yer kaplayacaktır. Burada 40 byte'ın ne önemi var diyeceksiniz. Unutmayın defterlerinizde 1'den çok fazla isim olmalı (yoksa niye defter tutuyorsunuz?). İlk bilgisayarım 1 Kb'lıktı (1024 byte), dolayısı ile tasarruflu olan isim 8 ve soyisim 12 karakter büyüklüğünü kullanacağım. Numara ikinci konumuz. Telefon numarasını bir sayı olarak alabilir veya isimler gibi karakter olarak tanımlayabiliriz, İstanbul'u düşünerek 338 08 95 olan numaramızı,

a$ = "3380895"

olarak 7 byte, veya

a =3380895

LSET a$ = MKL$(a) olarak 4 byte yer kaplayacak şekilde saklayabiliriz. İkinci örnekte gördüğünüz yöntemi, tüm sayıları saklamak için kullanmamız gerekiyor. Yani rasgele erişimli dosyalara sayılar yazamıyor, onları MKL$, MKI$, MKS$, MKD$ ile alfanümerik değişkenlere dönüştürüyor ve LSET veya RSET emirleri ile sola veya sağa bitiştiriyoruz. Bu tür bir sayıyı okumak için ise,

a = CVL (a$)

örneğinde olduğu gibi CVL, CVI, CVS ve CVD emirlerini kullanacağız. Ben tasarrufa devam ediyorum. Artık dosyamızı tanımlayabiliriz.

Dosya_ac:

OPEN D_ismi AS 1 LEN=24 FIELD #1,8 AS isim$, 12 AS soyisim$, 4 AS tno$

RETURN

Dosyamızın ismi D_ismi olarak tanımlandı. Bunu ister INPUT yolu ile kullanıcıdan sorar, ister bir sabit olarak kullanırsınız, size kalmış. Artık birim uzunluğu 24 olan ve bu 24 byte'ın 8'ini isim, 12'sini soyisim, 4'ünü ise telefon numarası için harcayan bir dosyaya sahibiz. Bu dosyalama türü ile kaç dosya mı açabiliriz? 1024 isim olsa, 24 kilobyte edecek. Bu kadar ufak bir dosya, 512 KB aletlerde bile kolayca RAM: diske sığabilir. Dikkat edin, birim uzunluk 200 byte olsa, bu dosya 200 KB tutacaktı!!!

Artık bir dosyamız var. Amacımız bu dosyaya veriler yazmak. Bu dosyanın özelliği, tüm dosyayı okumadan doğrudan istenen yere ulaşabilmek idi. Bu amaçla rasgele erişim dosyalarında bir numaralama kullanılır. İlk kayıta 1 numarası verilir ve her bir kayıt kendi numarası ile erişilir bir hale gelir. Burada önemli bir durumla karşı karşıyayız. KAYIT NUMARASINI BİLMEK ZORUNDAYIZ!!! Yani en azından son yazılan kayıtın numarasını bilmemiz lazım ki, yeni bir şey ekleyebilelim. Program ilk çalıştığında bu kolay. Dosya yeni olduğundan, doğrudan ilk dosyayı yazacağız. On gün sonra bir arkadaşınız daha olur ve numarasını eklemek istersek, en son nerede kaldığımızı bilmek zorundayız. İki yol önerebilirim: ilki her kaydın başında dosya numarasını sormak, son yapılan kaydı ise bir kenara not etmek. İkinci çözüm ise not etme işlemini bir sıralı dosya yardımı ile diskete yapmak ve gerektiğinde oradan okumak. İşte kayıt ekleme kısmımız:

Yeniisim: OPEN Sonjsmi FOR INPUT AS 2 INPUT #2,numara CLOSE #2 numara = numara +1 isimsor: Print:Print Print "Kayıt no : ", numara Print Print "Telefon Sahibinin " Input "İsmi : ";iisim$ Input "Soyismi : ";isoyisim$ Input "Numarası : ";itno Lset isimŞ = iisim$ Lset soyisim$ = isoyisim$ Lset tno$ = MkI$ (itno) print print "Bu bilgiler yanlışsa q tuşuna basın " a$="1" while a$= "" :a$=inkey$: wend if UCASE$ (a$) = "Q" then goto isim_sor put #1,numara print input " Yeni kayıt (evet/hayır)";a$ if Ucase$(Left$(a$,1)) <> "H" then numara=numara+1 goto isimsor

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