Etiketler

30 Mayıs 2020 Cumartesi

QuickBasic Kursu: Bölüm 6: Diziler

Önceki Bölüm: Quick-Basic Kursu: Bölüm 5: Döngüler
Yayınlama: Eylül 2007
Güncelleme: 30 Mayıs 2020
Dizilere neden ihtiyaç duyulur?
Çünkü binlerce değişkeni tanımlamak uzun sürer ve kullanışlı olmaz.
Örneğin: 12 ay için ayrı ayrı değişken tanımlamak
DIM AY1 AS STRING
DIM AY2 AS STRING
DIM AY3 AS STRING
..
..
Gördüğünüz gibi bu uzayıp gidecek.
Bunun yerine yalnız bir boyutlu 13 elemanlı bir dizi değişkeni tanımlamak yeterlidir.
DIM AY(12) AS STRING
gibi.

Dizi değişkenini kullanma

DeğikenAdi(boyutnumarası) şeklinde kullanılır.
DIM AYLAR(12) AS STRING
'Bu tanımladığımız dizi değişkeninin kullanımı:
AYLAR(1) = "OCAK" : AYLAR(2) = "ŞUBAT"
AYLAR(3) = "MART" : AYLAR(4) = "NİSAN"
AYLAR(5) = "MAYIS" : AYLAR(6) = "HAZİRAN"
AYLAR(7) = "TEMMUZ" : AYLAR(8) = "AĞUSTOS"
AYLAR(9) = "EYLÜL" : AYLAR(10) = "EKİM"
AYLAR(11) = "KASIM" : AYLAR(12) = "ARALIK"
buay% = VAL(DATE$)
PRINT AYLAR(buay%)

OPTION BASE

Normalde, yani belirtmezseniz, boyutlu değişken tanımladığınızda; ilk boyut no 0 (Sıfır) olur.
DIM A(10) dediğimizde 10 değil 11 elemanlı değişken tanımlamış oluruz.

Ama istersek ilk boyut numarasını kendimiz belirleyebiliriz.(Tabii 1 yada 0 olarak)
OPTION BASE 1
yazdığımızda bundan sonra tanımlanacak boyutlu değişkenlerin ilk boyut numarası 1 olur.

Bu durumda DIM A(10) yazarsak 10 elemanlı bir dizi değişken tanımlamış oluruz.

Ayrıca istersek ilk ve son boyut numaralarını belirleyerek dizi değişken tanımlaması da yapılabilir.
Örnek:
DIM AYLAR(1 TO 12)
DIM A(10 TO 20)
'A nın ilk boyut numarası 10, son boyut numarası 20 olacaktır.
Bu durumda;
A(5) = 40 ya da
A(22) = 65 yazacak olursanız hata oluşacaktır.
Çünkü değişken dizi sınırları dışında. (Subscript out of range)

LBOUND, UBOUND

Tanımlanmış bir dizinin ilk boyut numarasını öğrenmek için LBOUND,
son boyut numarasını öğrenmek için UBOUND kullanılır.
OPTION BASE 1
DIM A(10) AS INTEGER
PRINT "İlk boyut no: " ; LBOUND(A)
PRINT "Son boyut no: " ; UBOUND(A)
Örnek:
CLS
DIM A(10 TO 18) AS INTEGER
FOR N = 10 TO 18
 A(N) = N * 10
NEXT
FOR N=LBOUND(A) TO UBOUND(A)
 PRINT A(N),
NEXT

Çok boyutlu değişken tanımlama

Şimdiye kadar tek boyutlu değişkenler tanımladık.
DIM A(5, 6, 10)
yazarak üç boyutlu bir dizi değişkeni oluşturabiliriz.
Buna göre bellekte 6 * 7 * 11 = 462 adet değişken için yer açıldı.

Yine bir başka kullanım olarak:
DIM A(5, 3 TO 12, 5 TO 15)
gibi bir tanımlama da yapabiliriz.

Uygulama:
OPTION BASE 1
CLS
DIM SAYI(10,10) AS INTEGER
FOR N = 1 TO 10
 FOR M = 1 TO 10
  SAYI(N,M)=N * M
 NEXT
NEXT
'Çarpım tablosu bellekte oluştu
INPUT "1. sayıyı girin " ; A
INPUT "2. sayıyı girin " ; B
'Çarpım tablosundan sonucu alıyoruz
'Dikkat edin verilen sayıları çarpmıyoruz
PRINT SAYI(A,B)

$DYNAMIC

'$DYNAMIC
Bu satır bir yorum satırıdır ancak diğer yorum satırları gibi değildir. Bu bir metacommand'dır.
Bu satır ile bir ayarlama yapılmıştır.
'$DYNAMIC satırı ile dizi değişkenlerinin boyutunun değiştirilebileceğini belirtmiş oluruz.
REM $DYNAMIC
olarak da yazılabilir.

$STATIC

'$STATIC
Bu satır da bir yorum satırıdır ancak diğer yorum satırları gibi değildir.
Bu satırdan sonra DIM ile dizi değişkeni tanımlandığında dizi değişkenin STATIC yani kalıcı olduğunu belirtir. ERASE ile dizi silinmeye çalışıldığında dizi silinmez. Dizi içeriği sıfırlanır. Sayısal değişken ise değerleri 0'a eşitlenir. String değişken ise ="" olur.
REM $STATIC
olarak da yazılabilir. aynı ifadedir.
'$STATIC
' Dizi değişkenleri STATIC (kalıcı) olacak
DIM A(10)
A(5) = 126
PRINT A(5) ' 126
ERASE A 'Dizi silinmez, içeriği sıfırlanır
PRINT UBOUND(A) '10
PRINT A(5) '0

REDIM

Diziler için bellekte ayırdığımız alanı genişletmek veya daraltmak için kullanırız.
'$DYNAMIC
DIM a(10)
a(8) = 22
REDIM a(3)
Hata oluşturmadığına dikkat ediniz. Artık a(8) değişkeni kaybolmuştur.
PRINT a(8)
yazdığınızda dizi sınırları dışına çıkıldı hatası alınır.

ERASE

Diziler için bellekte ayrılan alanı boşaltmak ve alanı genişletmek için kullanılır. Dizinin dinamik ya da static durumuna göre farklılık gösterir.
CLS
REM $DYNAMIC
' üst satır, dizi değişkenlerin dinamik olacağını belirtir.
DIM A(15)
PRINT UBOUND(A)
REDIM A(30) ' Yeniden boyutlandı
PRINT UBOUND(A)
ERASE A ' Bellekte kapladığı alanı boşalt, sil
PRINT UBOUND(A) ' HATA. Çünkü dizi bellekten atıldı

CLEAR

Tüm değişken içeriklerini sıfırlar.
OPEN ile açılan tüm dosyaları kapatır.
COMMON değişkenleri temizler.
STACK bellek alanı yeniden oluşturur veya boyutunu belirler.

Örnek 1:
x = 5
y = 15
ad$ = "Mesut"
PRINT x, y, ad$ '5  15  Mesut 
CLEAR
PRINT x, y, ad$ '0  0  
Örnek 2:
PRINT faktoriyel#(100)
FUNCTION faktoriyel# (sayi AS INTEGER)
  IF sayi = 1 THEN
    faktoriyel# = 1
  ELSE
    faktoriyel# = sayi * faktoriyel#(sayi - 1)
  END IF
END FUNCTION
Üstteki kodları çalıştırdığınızda STACK bellek alanı dolacak ve yeterli olmayacak ve sonuçta Out of stack space hatası ile karşılaşacağız. Bunu önlemek için STACK alanını genişletmek gereklidir.
Bunun için kodların başına aşağıdaki satırı ekleyin.
CLEAR , , 4000
'Tüm değişkenleri sıfırlar ve bellekte 4000 byte'lık stack(yığın veri) alanı ayarlar

FRE

Erişilebilir(boş) bellek miktarını verir. Kullanımı:
FRE(parametre)
Parametre -1 olduğunda. String olmayan en büyük dizinin bayt cinsinden boyutu.
Parametre -2 olduğunda. Programın kullanabileceği stack bellek alanının kullanılmayan kısmını bayt cinsinden verir. Yalnızca bir program yürütülürken anlamlı değerler döndürür.

Parametre farklı bir sayı ise. Dize sayısal değer depolamasının bir sonraki boş bloğunun boyutu.

Parametre string olduğunda. Boş dize depolama alanının bayt cinsinden boyutunu döndürür.
Örnek:
DECLARE SUB bellek (m$)
CLS : CLEAR
' $DYNAMIC
bellek ("öncesi ")
DIM BI%(100, 100)
DIM bs$(2500)
bellek ("sonrası")
DIM BD#(5, 50, 10)
FOR n = 1 TO 2500
    bs$(n) = "Test 1234567"
NEXT
bellek ("sonrası")
REDIM BI%(150, 200)
bellek ("sonrası")

REM $STATIC
SUB bellek (m$)
PRINT "Dizi "; m$; ":"; FRE(""), FRE(0), FRE(-1), FRE(-2)
END SUB

Sonraki Bölüm: QuickBasic Kursu: Bölüm 7: Goto, Gosub, Sub, Function

QuickBasic Ana Sayfa

Hiç yorum yok:

Yorum Gönderme