Bölüm 4 - DELPHI'NIN TEMELLERİ (Dizi Değişkenler)
Tüm dillerde olduğu gibi, Delphi de dizi mantığına çok önem vermektedir. Değişkenlerin dizi olarak tanımlanabilmesi (Her zaman mümkün olmayabilir.) programı hızlandıracağı gibi, kod satırlarının da kısalmasını sağlayacaktır (Yirmi tane öğrencinin notunu dizi değişken kullanmadan InputBox penceresiyle istettiğinizi düşünsenize). Sabit ve değişken uzunluklu olmak üzere iki çeşit dizi mevcuttur. Şimdi bu dizi çeşitlerini detaylıca inceleyelim.
• Sabit Uzunluklu Dizi Değişken Tanımlamak
Sabit uzunluklu dizi değişken, tanımlandığı anda boyutunun belirlenmesi şeklinde tanımlanabilir. Belirtilen bu boyut programın içerisinden kesinlikle değiştirilemez. Aşağıdaki şekillerde sabit uzunluklu dizi değişken tanımlayabilirsiniz.
var
dizi:Array[0..10] of Integer; // 11 elemanlı dizi değişken tanımlandı
veya
type diziler = array[1..10] of Real;
var
dizi:diziler; // Bu şekildede dizi değişken tanımlanabilir.
Burada tanımlanan dizi değişkenlerde alt ve üst sınır dahil olacaktır (Yukarıdaki satırda 11 eleman tanımlanmıştır). Yani dizi[0] ile dizi[10] arasındaki tüm elemanlar Delphi tarafından bellekte oluşturulacaktır.
• Sabit Uzunluklu Dizi Değişken Tanımlamak
Sabit uzunluklu dizi değişken, tanımlandığı anda boyutunun belirlenmesi şeklinde tanımlanabilir. Belirtilen bu boyut programın içerisinden kesinlikle değiştirilemez. Aşağıdaki şekillerde sabit uzunluklu dizi değişken tanımlayabilirsiniz.
var
dizi:Array[0..10] of Integer; // 11 elemanlı dizi değişken tanımlandı
veya
type diziler = array[1..10] of Real;
var
dizi:diziler; // Bu şekildede dizi değişken tanımlanabilir.
Burada tanımlanan dizi değişkenlerde alt ve üst sınır dahil olacaktır (Yukarıdaki satırda 11 eleman tanımlanmıştır). Yani dizi[0] ile dizi[10] arasındaki tüm elemanlar Delphi tarafından bellekte oluşturulacaktır.
Tanımladığınız dizi değişkenin boyutunu programın içerisinde değiştirme şansınızın bulunmadığını, böyle bir teşebbüste bulunursanız Delphi’nin size hata mesajını ileteceğini hatırlatmak isterim. Sabit uzunluklu dizi değişkenlere tanımlandıkları yerde ilk değerlerini aşağıdaki
şekilde atayabilirsiniz.
Const //Var la ilk değer ataması yapamazsınız
dizin:Array[0..2] of AnsiString=('Mavi','Yeşil','Sari');
veya
const //Var la ilk değer ataması yapamazsınız.
dizin:Array[0..2] of Integer=(10,20,30);
Aşağıdaki şekilde de sabit uzunluklu dizi tanımlayıp ona ilk değerini atayabilirsiniz.
type diziler = array[0..2] of Real; //Reel tip tanımlanıyor
....
Const
dizi:diziler=(10,20,30); //3 elemanlı reel değişken tanımlandı
Şimdi de basit bir örnek yapalım.
şekilde atayabilirsiniz.
Const //Var la ilk değer ataması yapamazsınız
dizin:Array[0..2] of AnsiString=('Mavi','Yeşil','Sari');
veya
const //Var la ilk değer ataması yapamazsınız.
dizin:Array[0..2] of Integer=(10,20,30);
Aşağıdaki şekilde de sabit uzunluklu dizi tanımlayıp ona ilk değerini atayabilirsiniz.
type diziler = array[0..2] of Real; //Reel tip tanımlanıyor
....
Const
dizi:diziler=(10,20,30); //3 elemanlı reel değişken tanımlandı
Şimdi de basit bir örnek yapalım.
Aşağıdaki kod satırlarını projenizin gerekli olan yerlerine ekleyiniz.
Dizi değişkenlere tanımlandıkları anda değer atanabilmesi için, mutlak “const” bildirisiyle tanımlanmış olmalıdırlar. Aksi takdirde Delphi sizlere hata mesajı iletecektir.
Dizi değişkenleri const ile tanımlarsanız, procedure içerisinde değerini değiştirmek için aşağıdaki ek kod satırını ilave etmelisiniz.
Dizi değişkenleri const ile tanımlarsanız, procedure içerisinde değerini değiştirmek için aşağıdaki ek kod satırını ilave etmelisiniz.
Artık procedure içerisinde dizi değişkeninizin istediğiniz elemanına değer ataması yapabilirsiniz. Burada yapılan işlemin local static dizi değişken
tanımlamaktan hiç de farklı bir şey olmadığını sanıyorum fark etmişsinizdir. Yapacağınız yeni atamaların procedure ün bir sonraki işletilmesi sırasında kullanılabileceği meydandadır.
Şimdide aşağıdaki örneği incelemenizi istiyorum. Henüz for döngüsünü anlatmadık ama sanıyorum bir çoğunuzun bu hususta bir fikri olacaktır. Kodun ne kadar anlaşılır ve teknik olduğu hemen dikkatinizi çekecektir.
tanımlamaktan hiç de farklı bir şey olmadığını sanıyorum fark etmişsinizdir. Yapacağınız yeni atamaların procedure ün bir sonraki işletilmesi sırasında kullanılabileceği meydandadır.
Şimdide aşağıdaki örneği incelemenizi istiyorum. Henüz for döngüsünü anlatmadık ama sanıyorum bir çoğunuzun bu hususta bir fikri olacaktır. Kodun ne kadar anlaşılır ve teknik olduğu hemen dikkatinizi çekecektir.
Yeni tip tanımlamanın kodun anlaşılabilirliğini ne kadar artırdığını sanıyorum fark ettiniz. Size de bu tür yapı tanımlarını kullanmanızı önemle tavsiye
ediyoruz.
ediyoruz.
Sabit Uzunluklu İki Boyutlu Dizi Tanımlamak
Özellikle matris işlemleri ve tablo oluşturmak için en çok bilinmesi gereken yapıdır. Tablolar, satır ve sütun numaraları kullanılarak kesişimleri bir hücre değerini gösterecek şekilde tasarlanmışlardır. Bu yüzden bir çok veri tabanı işlemi iki boyutlu dizi mantığı kullanılarak kolayca çözülebilmektedir (Tablonuzun tüm hücre değerlerine ulaşabilmek için yapmanız gereken işlem, iki adet for döngüsü içerisinde iki boyutlu tanımlamış olduğunuz dizi değişkenin satır ve sütun numaralarıyla oynamaktan ibarettir. Bu hususa veri tabanı kısmında detaylı, hem de çok detaylı olarak değinilecektir).
Aşağıda iki boyutlu bir dizinin nasıl tanımlanabileceği gösterilmektedir.
var
ikib_dizi:Array[0..2] of Array[0..1] of Integer; //iki boyutlu dizi tanımlandı
Yukarıdaki satırda gerçekleşen işlem aşağıda şematize edilmeye çalışılmıştır. Tanımlamaya dikkat edecek olursanız ilk boyut için [0..2] (3 eleman), ikinci boyut içinde [0..1] (2 eleman) belirtilmiştir. Şu halde bellekte aşağıdaki gibi 6 eleman otomatik olarak oluşacaktır.
ikib_dizi[0,0] ikib_dizi[0,1]
ikib_dizi[1,0] ikib_dizi[1,1]
ikib_dizi[2,0] ikib_dizi[2,1]
Bu elemanlardan istediğinize değer ataması yapabilirsiniz.
Aşağıda iki boyutlu bir dizinin nasıl tanımlanabileceği gösterilmektedir.
var
ikib_dizi:Array[0..2] of Array[0..1] of Integer; //iki boyutlu dizi tanımlandı
Yukarıdaki satırda gerçekleşen işlem aşağıda şematize edilmeye çalışılmıştır. Tanımlamaya dikkat edecek olursanız ilk boyut için [0..2] (3 eleman), ikinci boyut içinde [0..1] (2 eleman) belirtilmiştir. Şu halde bellekte aşağıdaki gibi 6 eleman otomatik olarak oluşacaktır.
ikib_dizi[0,0] ikib_dizi[0,1]
ikib_dizi[1,0] ikib_dizi[1,1]
ikib_dizi[2,0] ikib_dizi[2,1]
Bu elemanlardan istediğinize değer ataması yapabilirsiniz.
Bu diziyi aşağıdaki şekilde de tanımlayabilirdiniz.
type
i_dizi=Array[0..2] of Array[0..1] of Integer; //Yeni tip tanımlandı
.......
var
cok_dizi:i_dizi; // 6 elemanlı dizi değişken tanımlandı
Yapılan işlemi açıklayacak olursak, ilk olarak “i_dizi” isminde altı (6) elemandan oluşan dizi değişkene sahip bir tip tanımlandı. Daha sonra bu yeni tipten “cok_dizi” isminde çok boyutlu bir dizi değişken türetildi. Artık procedure içerisinde istediğiniz bölümde bu dizi değişkenin elemanlarına değer atayabilirsiniz.
Aşağıda bu husus örneklendirilmiştir.
type
i_dizi=Array[0..2] of Array[0..1] of Integer; //Yeni tip tanımlandı
.......
var
cok_dizi:i_dizi; // 6 elemanlı dizi değişken tanımlandı
Yapılan işlemi açıklayacak olursak, ilk olarak “i_dizi” isminde altı (6) elemandan oluşan dizi değişkene sahip bir tip tanımlandı. Daha sonra bu yeni tipten “cok_dizi” isminde çok boyutlu bir dizi değişken türetildi. Artık procedure içerisinde istediğiniz bölümde bu dizi değişkenin elemanlarına değer atayabilirsiniz.
Aşağıda bu husus örneklendirilmiştir.
Sabit uzunluklu 2 boyutlu dizi tanımlama
Bir çok uygulamada karşılaşacağınız en büyük dizi boyutu iki (2) olacaktır, ama biz yine de daha yüksek boyutta dizi değişkenleri nasıl tanımlayabileceğinizigösterelim. Aşağıdaki şekilde kolayca üç boyutlu dizi değişken tanımlayabilirsiniz.
var
u_dizi:Array[0..2] of Array[0..2] of Array[0..1] of Integer;
Yukarıdaki kod satırıyla 3 boyutlu, 18 elemanlı bir dizi değişken tanımlanmıştır. Bu elemanlardan dilediğinize aşağıdaki şekilde değer ataması yapabilirsiniz.
u_dizi[0,0,0] u_dizi[0,0,1] u_dizi[0,1,0]
u_dizi[0,2,0] u_dizi[0,2,1] u_dizi[1,0,0]
u_dizi[0,1,1] u_dizi[1,0,1] u_dizi[1,1,0]
u_dizi[1,1,1] u_dizi[1,2,0] u_dizi[1,2,1]
u_dizi[2,0,0] u_dizi[2,0,1] u_dizi[2,1,0]
u_dizi[2,1,1] u_dizi[2,2,0] u_dizi[2,2,1]
Tanımlamayı aşağıdaki şekilde de yapabilirsiniz.
type
boyutdizi=Array[0..2] of Array[0..2] of Array[0..1] of Integer;
.....
var
dizi:boyutdizi; //Dizi değişken tanımlandı
var
u_dizi:Array[0..2] of Array[0..2] of Array[0..1] of Integer;
Yukarıdaki kod satırıyla 3 boyutlu, 18 elemanlı bir dizi değişken tanımlanmıştır. Bu elemanlardan dilediğinize aşağıdaki şekilde değer ataması yapabilirsiniz.
u_dizi[0,0,0] u_dizi[0,0,1] u_dizi[0,1,0]
u_dizi[0,2,0] u_dizi[0,2,1] u_dizi[1,0,0]
u_dizi[0,1,1] u_dizi[1,0,1] u_dizi[1,1,0]
u_dizi[1,1,1] u_dizi[1,2,0] u_dizi[1,2,1]
u_dizi[2,0,0] u_dizi[2,0,1] u_dizi[2,1,0]
u_dizi[2,1,1] u_dizi[2,2,0] u_dizi[2,2,1]
Tanımlamayı aşağıdaki şekilde de yapabilirsiniz.
type
boyutdizi=Array[0..2] of Array[0..2] of Array[0..1] of Integer;
.....
var
dizi:boyutdizi; //Dizi değişken tanımlandı
Çok boyutlu dizi değişken tanımlarken yukarıdaki yöntemlerden dilediğinizi seçebilirsiniz. Herhalikarda sonuçlar aynı olacaktır. Benim size tavsiyem her zaman tip tanımlaması yaparak kullanmanız (ikinci kez tanımlamanız gerekirse daha kolay olacaktır).
Değişken Uzunluklu (Dinamik) Dizi Değişken Tanımlamak
Okulunuza bir program yazdığınızı düşünün. Öğrencilerin notlarıyla (ve diğer konularla da) ilgili işlemleri yapabilecek, karnelerini basabilecek bir program olsun. Uygulamanızda şöyle bir problemle karşılaşırsınız; bütün sınıfların mevcutları aynı olmadığı için sınıf mevcutlarını belirlerken oluşturacağınız dizinin eleman sayısı sizin için sıkıntı yaratacaktır. Düşünülebilecek en güzel çözüm en fazla öğrencisi olan sınıfa göre eleman tanımlamak olacaktır. Bu durumda da belleği boş yere işgal eden kullanılamaz değişkenleriniz oluşması kaçınılmazdır (Tabii uygulamanızda çıkabilecek diğer problemlerden bahsetmiyorum). İşte bu tür sorunları halledebilmeniz için Delphi sizlere değişkenlerinizin boyutlarını programın içerisinde değiştirebilme imkanı sunmaktadır. Bu işleme, Dinamik dizi değişken tanımlama adını veriyoruz.
Aşağıda dinamik dizileri nasıl tanımlayabileceğiniz ve programın içerisinden onların boyutunu nasıl belirleyebileceğinizi göstereceğim.
var
dinamikdizi:Array of Integer; //Dizi değişken tanımlandı
Dikkat ettiyseniz sabit uzunluklu dizi değişkenden tek farkı dizinin eleman sayısının belirtilmemesidir. Bu şekilde tanımlanan bir dizi değişken Delphi tarafından Dinamik dizi olarak kullanılacaktır. Programın içerisinden dizi değişkenin boyutunu aşağıdaki şekilde belirleyebilirsiniz.
SetLength(dinamikdizi,10); // 0-9 on elemanlı dizi değişken
SetLength komutunu kullanarak dizinize boyut değerini verebilirsiniz.
Aşağıdaki basit örneği inceleyiniz.
Aşağıda dinamik dizileri nasıl tanımlayabileceğiniz ve programın içerisinden onların boyutunu nasıl belirleyebileceğinizi göstereceğim.
var
dinamikdizi:Array of Integer; //Dizi değişken tanımlandı
Dikkat ettiyseniz sabit uzunluklu dizi değişkenden tek farkı dizinin eleman sayısının belirtilmemesidir. Bu şekilde tanımlanan bir dizi değişken Delphi tarafından Dinamik dizi olarak kullanılacaktır. Programın içerisinden dizi değişkenin boyutunu aşağıdaki şekilde belirleyebilirsiniz.
SetLength(dinamikdizi,10); // 0-9 on elemanlı dizi değişken
SetLength komutunu kullanarak dizinize boyut değerini verebilirsiniz.
Aşağıdaki basit örneği inceleyiniz.
Dilerseniz dinamik dizinizi aşağıdaki şekilde de tanımlayabilirsiniz.
type
din_dizi=Array of Integer; //Dinamik dizi içeren tip tanımlaması yapıldı
Program içerisinde aşağıdaki şekilde bir kullanım mümkün olacaktır.
var
yeni_dizi:din_dizi; //Tanımlana tipten dinamik dizi değişkeni türetildi.
....
SetLength(yeni_dizi,10);// 10 elemanlı olarak dinamik dizi boyutlandırıldı.
Aşağıdaki örneği dikkatlice inceleyiniz.
type
din_dizi=Array of Integer; //Dinamik dizi içeren tip tanımlaması yapıldı
Program içerisinde aşağıdaki şekilde bir kullanım mümkün olacaktır.
var
yeni_dizi:din_dizi; //Tanımlana tipten dinamik dizi değişkeni türetildi.
....
SetLength(yeni_dizi,10);// 10 elemanlı olarak dinamik dizi boyutlandırıldı.
Aşağıdaki örneği dikkatlice inceleyiniz.
İzleyeceğiniz yol tamamen size kalmıştır.
Çok Boyutlu Dinamik Dizi Tanımlamak
Yukarıda tanımlanan dinamik diziler tek boyutlu olarak belirlenmiştir. Şimdi sizlere iki ve daha fazla boyutlu dinamik dizileri nasıl tanımlayıp
kullanabileceğinizi göstereceğim. Aşağıdaki şekilde iki boyutlu dinamik bir dizi değişken tanımlayabilirsiniz.
var
dizi:Array of Array of Integer; //İki boyutlu dizi değişken tanımlandı
Tanımlamış olduğunuz iki boyutlu dinamik dizi değişkenini yine aynı SetLength komutuyla boyutlandırabilirsiniz.
SetLength(dizi,5,3); // 15 elemanlı oldu
Burada dikkat edeceğiniz husus ilk elemanın dizi[0,0] son elemanında dizi[4,2] olduğudur (Burada üst sınırlar kullanılamamaktadır. Çalışma anında hata mesajıyla karşılaşırsınız). Yukarıdaki kod satırı sayesinde Delphi dizi değişkeniniz için 15 elemanlık boş bellek yeri ayıracaktır (Dizi değişkenler bellekte arka arkaya bulunurlar. Hızlı işlem yapmalarının bir sebebi de budur). Artık istediğiniz elemana değer atayabilirsiniz.
Aşağıdaki örneği dikkatlice inceleyiniz.
kullanabileceğinizi göstereceğim. Aşağıdaki şekilde iki boyutlu dinamik bir dizi değişken tanımlayabilirsiniz.
var
dizi:Array of Array of Integer; //İki boyutlu dizi değişken tanımlandı
Tanımlamış olduğunuz iki boyutlu dinamik dizi değişkenini yine aynı SetLength komutuyla boyutlandırabilirsiniz.
SetLength(dizi,5,3); // 15 elemanlı oldu
Burada dikkat edeceğiniz husus ilk elemanın dizi[0,0] son elemanında dizi[4,2] olduğudur (Burada üst sınırlar kullanılamamaktadır. Çalışma anında hata mesajıyla karşılaşırsınız). Yukarıdaki kod satırı sayesinde Delphi dizi değişkeniniz için 15 elemanlık boş bellek yeri ayıracaktır (Dizi değişkenler bellekte arka arkaya bulunurlar. Hızlı işlem yapmalarının bir sebebi de budur). Artık istediğiniz elemana değer atayabilirsiniz.
Aşağıdaki örneği dikkatlice inceleyiniz.
Aynı işlemi aşağıdaki şekilde de yaptırabilirsiniz. İzleyeceğiniz yol tamamen size kalmıştır.
Bu kod penceresinde kullanılan SetLength(dizi,5,3); satırı sayesinde dizi[0,0] dan dizi[4,2] ye kadar 15 eleman için bellekte boş yer ayrılacaktır.
Bu tip dinamik diziler (Tam sayı tiptekiler) oluşturuldukları anda ilk değer olarak “0” alırlar.
Yukarıdaki uygulama için
Form3.Caption:=IntToStr(dizi[3,0]);// 0 yazacaktır.
Bu tip dinamik diziler (Tam sayı tiptekiler) oluşturuldukları anda ilk değer olarak “0” alırlar.
Yukarıdaki uygulama için
Form3.Caption:=IntToStr(dizi[3,0]);// 0 yazacaktır.