Yayınlama: 2000
Güncelleme: 06 Şubat 2022
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 STRINGgibi.
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 1yazdığı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:
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)
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 INTEGERyazarak 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:
Örnek 1:
son indeks numarasını öğrenmek için UBOUND kullanılır.
'üç 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=10Baş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
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.
$DYNAMIC
'$DYNAMICBu 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 $DYNAMIColarak 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 $STATIColarak 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:
PRINT a(8)
yazdığınızda dizi sınırları dışına çıkıldı hatası alınır.
'$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:
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:
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.
Örnek:
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