meraklısına diziler hakkında küçük bir not

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
mucon
Üye
Mesajlar: 17
Kayıt: 05 Oca 2004 06:52
Konum: Ankara

meraklısına diziler hakkında küçük bir not

Mesaj gönderen mucon »

Diziler

Object pascal her tür değişkenden dizi oluşturulmasına olanak sağlar. Örneğin, integer türden 5 elemanlı bir dizi değişkeni şu şekilde bildirilir;

Kod: Tümünü seç

var
A: Array[0..4] of Integer;
Object Pascal diğer dillerden farklı olarak özel bir property'e sahiptir; Diziler belirli bir sayıdan başlamak zorunda değildir. Bu nedenle 3 elemana sahip 14 den başlayan bir diziyi aşağıdaki şekilde bildirebiliriz;

Kod: Tümünü seç

A: Array[14..16] of Integer;
Object Pascal dizileri sıfır yada birden itibaren başlamaz ise, bir for döngüsüyle dizi elemanları içinde ilerlerken özel bir özen gösterilmesi gerekmektedir. Delphi derleyicisi High() ve Low() isimli yerleşik fonksiyonlar sunmaktadır. Bunlar sırasıyla dönüş değeri olarak bir dizi değişkeninin alt ve üst sınırlarını döndürür. Bu nedenle aşağıdaki gibi yazdığımız kod sayesinde for döngüsü içinde bu fonksiyonların kullanımı daha az hataya eğimli olup, yönetilmesi daha kolaydır.

Kod: Tümünü seç

var
A: array[14..16] of Integer;
i: Integer;
begin
for i := Low(A) to High(A) do 
A[i] := i;
end;
Karakter dizilerine daima 0 ile başlayın, sıfır tabanlı karakter dizileri PChar tipinden değişkenler içeren fonksiyonlara geçirilebilirler.

Birden fazla boyut belirtmek için, boyut listesi aşağıdaki gibi virgülle ayrılır.

Kod: Tümünü seç

var
A: array[1..2, 1..2] of Integer;
Çok boyutlu dizilere erişmek için, küme parantezleri içinde her bir boyutu ayırmak için virgül kullanılır.

Kod: Tümünü seç

I := A[1, 2];
Dinamik Diziler

Dinamik diziler boyutları derleme aşamasında bilinmeyen dinamik olarak ayrılmış dizilerdir. Dinamik bir diziyi bildirmek için; boyut belirtmeksizin diziyi tanımlayın.

Kod: Tümünü seç

var
// string tipli dinamik dizi:
Din_Dizi: array of string;
Dinamik dizi kullanılmadan önce, hafızada yer ayırmak için SetLength() yordamı kullanılmalıdır.

Kod: Tümünü seç

SetLength(Din_Dizi, 15);
Hafızada yer ayrıldıktan sonra, normal dizi gibi dinamik dizinin elemanlarına erişilebilir.

Kod: Tümünü seç

Din_Dizi[0] := 'İyi Günler';
strTemp := Din_Dizi[0];
Dinamik diziler sıfır-tabanlıdır. Dinamik dizilerin ömürleri kısadır, bu nedenle onları kullanırken serbest bırakılmasına gerek yoktur çünkü kapsam dışına çıktıklarında kendiliğinden serbest bırakılırlar. Bununla beraber bir dinamik dizi kapsam dışına çıkmadan önce serbest bırakılmak istenirse (örneğin aşırı miktarda hafıza kullanıyorsa) nil değeri atanır.

Kod: Tümünü seç

Din_Dizi := nil; // Din_Dizi yi serbest bırakır
Dinamik diziler AnsiString'e benzer şekilde başvuru sözdizimi kullanılarak yönetilirler. Aşağıdaki kod parçasının sonunda A1[0] ın değerini hızlıca test etmek istersek;

Kod: Tümünü seç

var
A1, A2: array of Integer;
begin
SetLength(A1, 4);
A2 := A1;
A1[0] := 1;
A2[0] := 63;
Doğru cevap 63 olur, çünkü A2:=A1 ifadesi yeni bir dizi oluşturmaz fakat bunun yerine A2, A1 ile aynı başvuruyu kullanır. Bu nedenle, A2 ye yapılan her hangibir değişiklik A1 de etkileyecektir.

Bunun yerine A1 in tam bir kopyasını A2 ye atamak istiyorsanız, Copy() standart yordamını kullanın.

Kod: Tümünü seç

A2 := Copy(A1);
Önceki kod çalıştırıldığında, A2 ve A1 başlangıçta aynı veriyi içeren iki farklı dizi olacaktır. Birinde yapılan değişiklik diğerini etkilemeyecektir. İsteğe bağlı olarak, başlangıç elemanı ve kopyalanacak eleman sayısı Copy() yordamının parametresi olarak aşağıda gösterildiği gibi belirtilebilir.

Kod: Tümünü seç

A2 := Copy(A1, 1, 2);
Dinamik diziler aynı zamandan çok boyutlu da olabilirler. Birden fazla boyutu belirtmek için, ek olarak herbir boyutu belirtmek için array of ifadesi eklenir.

Kod: Tümünü seç

Bird_Cok_Dizi: array of array of Integer;
Çok boyutlu dinamik dizi için hafızada yer ayırmak için; SetLength() yordamına boyutun büyüklüğünü parametre olarak geçirin.

Kod: Tümünü seç

SetLength(Bird_Cok_Dizi, 5, 5);
Çok boyutlu dinamik dizilere erişmek , normal çok boyutlu dizilere erişmekte olduğu gibi aynı yolla yapılır, köşeli parantez içinde herbir eleman virgülle ayrı olarak gösterilir.

Kod: Tümünü seç

Bird_Cok_Dizi[0,3] := 43;
:roll: :roll: :roll:
Unutma Bilgi Güçtür
Öğrendiğin Kadar Bilirsin
İşte Bu Yüzden Paylaşmayı da Öğren!!!!
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Bu güzel konuya bir ekleme de ben yapayım istedim. Bir dizinin nereden başlayıp nerede bittiğini bilmiyorsak bunu High ve Low fonksiyonlarıyla elde edebiliriz.

Kod: Tümünü seç

function Ortalama(const Dizi:array of Integer):Extended;
var i,n:Integer;
begin
  n:=0;Result:=0;
  for i:=Low(Dizi) to High(Dizi) do begin
    Result:=Result+Dizi[i];
    n:=n+1;
  end;
  if n>0 then Result:=Result/n;
end;

var
  Dizi1:array[-2..12] of Integer;
  Dizi2:array of Integer;

.
.
islem:=(Ortalama(Dizi1)+Ortalama(Dizi2))/2;
şeklinde kullanılabilir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

Madem başlık açılmış bir katkı da benden olsun(bu metni bu aralar yazdığım Turbo Delphi kitabımdan aldım)

Delphi projelerinde hazırlanan çok boyutlu dizi değişkenlerde her satırda aynı sayıda eleman yoksa bu tip dizi değişkenlere düzensiz (jagged) diziler adı verilmektedir. Şimdi bu Word tablosu ile aynı sayıda satır, sütun ve elemana sahip düzensiz bir dizi tanımlayacağım. Bu tabloda 4 satır olduğu için ilk olarak aşağıda işaret edilen satır ile 4 elemanlı bir dizi değişken tanımladım.

Kod: Tümünü seç

Var
  Tablo : Array of Array of String;
begin
   SetLength(Tablo, 4);
end;
Bu kod ile 2 boyutlu dizi değişken tanımlanıyor ama sütunları henüz tanımlı değildir. Şimdi 2 boyutlu bu dizi değişkenin sütunlarını tanımlayacağım. Sütunların eleman sayısı birbirinden farklı olduğu için her sütunu ayrı tanımlamak gerekir.

Kod: Tümünü seç

Var
  Tablo : Array of Array of String;
begin
   SetLength(Tablo, 4);
   SetLength(Tablo[0], 3);
   SetLength(Tablo[1], 2);
   SetLength(Tablo[2], 3);
   SetLength(Tablo[3], 1);
end;
Bu satırlar sayesinde tanımlanan düzensiz dizi değişkenin ilk satırında 3, 2. satırında 2 elaman bulunmaktadır. Anlatılan şekilde tanımlanan dizi değişkenin elemanlarına istediğiniz gibi bilgi aktarabilirsiniz.

Tanımlayıp değer aktardığınız jagged dizi değişkenin kaç satıra sahip olduğunu öğrenmek istiyorsanız Low() ve High() fonksiyonlarını kullanabilirsiniz. aşağıda verilen satırlar sayesinde 2 boyutlu dizi değişkenin ilk satırındaki hücre veya eleman sayısı öğrenilmektedir.

Kod: Tümünü seç

Var
  Tablo : Array of Array of String;
  ilk, Son : Integer;
begin
   SetLength(Tablo, 4);
   SetLength(Tablo[0], 3);
   SetLength(Tablo[1], 2);
   SetLength(Tablo[2], 3);
   SetLength(Tablo[3], 1);
   ilk := Low(Tablo[0]);
   Son := High(Tablo[0]);
end;
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Bu dinamik dizi hakkında başka bir forumda gelen güzel bir soru vardı. 2 boyutlu dizide bir sıra olduğu gibi yer değiştirebilir mi? Yani 2 boyutlu dizinin 1. sırası ile 2. sıra olacak, 2. sıra ise 1. sıra. Bunu en iyisi örnekle açıklamak.

Kod: Tümünü seç

var Liste:array of array of Integer;
  i,j:Integer; S:String;
begin
  Randomize;
  SetLength(Liste,2);
  SetLength(Liste[0],6);
  SetLength(Liste[1],3);
  Memo1.Lines.Clear;
  for i:=Low(Liste) to High(Liste) do begin
    S:='';
    for j:=Low(Liste[i]) to High(Liste[i]) do begin
      Liste[i][j]:=Random(10);
      S:=Format('%s,(%d,%d)',[S,i,Lİste[i,j]]);
    end;
    Delete(S,1,1);
    Memo1.Lines.Add(S);
  end;
end;
şeklinde 6 elemana sahip ilk (0.) sıra ile 3 elemena sahip ikinci (1.) sıra yer değişsin istenirse Lİste[0]:=Lİste[1] gibi bir kod malesef hata veriyor. Bunun yerine şekildeki gibi bazı tanımlar değişecek ve tip dönüşümü yapılacak.

Kod: Tümünü seç

type TIntArray=array of Integer;
...
var Liste:array of TIntArray; tmp:TIntArray;
....
begin
Randomize;
.......
  tmp:=TIntArray(Liste[0]);
  Liste[0]:=TIntArray(Liste[1]);
  Liste[1]:=TIntArray(tmp);
......
end;
kodları ile sadece adres değerleri üzerinden iki sıra kendi arasında yer değiştirir. Böylece koca dizi değerleri sırayla taşımaya gerek kalmadan otomatikman yer değişirler. Bunu en iyi aşağıdaki örneği uygulayarak görebilirsiniz.

Kod: Tümünü seç

type TIntArray=array of Integer;

procedure TForm1.Button1Click(Sender:TObject);
var Liste:array of TIntArray; tmp:TIntArray;
  i,j:Integer; S:String;
begin
  Randomize;
  SetLength(Liste,2);
  SetLength(Liste[0],6);
  SetLength(Liste[1],3);
  Memo1.Lines.Clear;
  for i:=Low(Liste) to High(Liste) do begin
    S:='';
    for j:=Low(Liste[i]) to High(Liste[i]) do begin
      Liste[i][j]:=Random(10);
      S:=Format('%s,(%d,%d)',[S,i,Lİste[i,j]]);
    end;
    Delete(S,1,1);
    Memo1.Lines.Add(S);
  end;
  Memo1.Lines.Add('-------------------------------------------------');
  tmp:=TIntArray(Liste[0]);
  Liste[0]:=TIntArray(Liste[1]);
  Liste[1]:=TIntArray(tmp);
  for i:=Low(Liste) to High(Liste) do begin
    S:='';
    for j:=Low(Liste[i]) to High(Liste[i]) do begin
      Liste[i][j]:=Random(10);
      S:=Format('%s,(%d,%d)',[S,i,Lİste[i,j]]);
    end;
    Delete(S,1,1);
    Memo1.Lines.Add(S);
  end;
end;
Kodu ile 6 elemanlı sıra ile 3 elemanlı sıra Liste'de yer değiştireceklerdir. İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Sepulchure
Üye
Mesajlar: 3
Kayıt: 29 Nis 2014 08:50

Re: meraklısına diziler hakkında küçük bir not

Mesaj gönderen Sepulchure »

teşekkürler :bravo:
Cevapla