6 Şubat 2022 Pazar

QuickBasic - 6: Diziler

Yayınlama: 2000
Güncelleme: 06 Şubat 2022

Diziler

Dizi(array) bir veri yapısıdır ve bellekte aynı tipte veri saklamayı sağlar.
Bir değişken tanımlandığında, tanımlanan değişken bellekte tek bir değer tutabilir.
Diziler(arrays) ise bir değişken adıyla bellekte birden fazla değer saklayabilir.
Tanımlanan dizi elemanlarına ulaşmak istersek dizi indeksi ile ulaşabiliriz.

Dizilere neden ihtiyaç duyulur?

Çünkü çok sayıda değişkeni tanımlamak uzun sürer ve kullanışlı olmaz.

Örneğin:
12 ay için ayrı ayrı değişken tanımlama
DIM AY1 AS STRING
DIM AY2 AS STRING
DIM AY3 AS STRING
..
..
Gördüğünüz gibi bu uzayıp gidecek.
Bunun yerine bir boyutlu 13 elemanlı bir adet dizi değişken tanımlamak yeterlidir.
DIM AY(12) AS STRING
gibi.
AY(12) dizi değişkeni 13 elemanlıdır çünkü ilk eleman numarası(indeks) 0'dır.

Kullanımı:
DIM DeğişkenAdı(elemansayısı) [AS ...]
Örnek 1:
DIM AYLAR(12) AS STRING
'Tanımlanan 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%)
Örnek 2:
DIM Aylar(1 TO 12) AS STRING
FOR n% = 1 TO 12
    READ Aylar(n%)
NEXT
buay% = VAL(DATE$)
PRINT "Bu ay: "; Aylar(buay%)

DATA OCAK,ŞUBAT,MART,NİSAN,MAYIS,HAZİRAN
DATA TEMMUZ,AĞUSTOS,EYLÜL,EKİM,KASIM,ARALIK

OPTION BASE

Normalde, yani belirtmezse, dizi değişkeni tanımlandığında; varsayılan ilk indeks no 0 (Sıfır) olur.
DIM A(10) yazdığımızda 10 değil 11 elemanlı dizi değişkeni tanımlamış oluruz.
Ama istersek varsayılan ilk indeks numarasını kendimiz 0 ya da 1 olarak belirleyebiliriz.
OPTION BASE 1
yazdığımızda tanımlanacak boyutlu değişkenlerin ilk indeks 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 indeks numaralarını belirleyerek dizi değişken tanımlaması da yapılabilir.

Örnek 1:
DIM AYLAR(1 TO 12)
DIM A(10 TO 20)
'A nın ilk indeks numarası 10, son indeks 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)
Bu şekilde kullanımda OPTION BASE'in etkisi yoktur.

Çok boyutlu değişken tanımlama

Şimdiye kadar tek boyutlu değişkenler tanımladık.
DIM A(5, 3) AS INTEGER
yazarak iki boyutlu bir dizi değişkeni oluşturulur.
Buna göre bellekte 6 * 4 = 24 adet INTEGER veri için yer açıldı.
Bir başka kullanım:
'üç boyutlu dizi
DIM A(3, 6, 5)
DIM B(5, 3 TO 12, 5 TO 15)
gibi bir tanımlama da yapabiliriz.

Örnek 1:

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)

LBOUND, UBOUND

Tanımlanmış bir dizinin ilk indeks numarasını öğrenmek için LBOUND,
son indeks numarasını öğrenmek için UBOUND kullanılır.

Örnek 1:
OPTION BASE 1
DIM A(10) AS INTEGER
PRINT "İlk indeks no: " ; LBOUND(A) '1
PRINT "Son indeks no: " ; UBOUND(A) '10
Örnek 2:
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

SWAP

Verilen iki değişkenin değerleri, birbiriyle değiştirilir.

Örnek 1:
a = 10
b = 20
SWAP a, b
PRINT "a="; a, "b="; b ' a=20 b=10
Başlangıçta a=10 ve b=20 iken SWAP a, b 'den sonra değişken değerleri yer değiştirdi. a=20 ve b=10 oldu.

Örnek 2: Alfabetik sıralama
'Kabuk sıralaması(Shell Sort)
DEFINT A-Z
DIM sehir(6) AS STRING
CLS
sehir(1) = "Yozgat"
sehir(2) = "Bursa"
sehir(3) = "Zonguldak"
sehir(4) = "Manisa"
sehir(5) = "Adana"
sehir(6) = "Rize"
sayi = UBOUND(sehir)

b = sayi \ 2
DO WHILE b > 0
    FOR i = b TO sayi - 1
        FOR j = (i - b + 1) TO 1 STEP -b
            IF sehir(j) <= sehir(j + b) THEN EXIT FOR
            SWAP sehir(j), sehir(j + b)
         NEXT
    NEXT
    b = b \ 2
LOOP
FOR i = 1 TO sayi
    PRINT sehir(i)
NEXT
Sonuç:
Adana
Bursa
Manisa
Rize
Yozgat
Zonguldak

SIRALAMA ALGORİTMALARI

$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.

Örnek 1:
'$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ırılan alanı genişletmek veya daraltmak için kullanılır

Örnek 1:
'$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.
Dizi yeniden boyutlandırıldığında dizi içeriği kaybolur.

Örnek 2:
'$DYNAMIC
DIM a(5)
a(2) = 126
PRINT a(2) '126
REDIM a(10) 'dizi yeniden boyutlandı. İçerikler sıfırlandı
PRINT a(5) '0

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.

Örnek:
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.

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:
' $DYNAMIC
CLEAR
CLS
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


Önceki Bölüm: 5: Döngüler Sonraki Bölüm: 7: Altprogram ve Fonksiyon

Hiç yorum yok:

Yorum Gönder