C++ Dizilere(Array) Giriş

2 ay önce , Okuma süresi 3 dakika.

Bir bilgisayar programı yaptığınızı düşünün. Kullanıcının 100 değer girmesi isteniyor. Girilen bütün bu sayıların farklı aşamalardan geçeceğini ve bu yüzden hepsini ayrı bir değişkende tutmamız gerektiğini varsayalım.

Bu durumda ne yapardınız? a0, a1, a2, ..., a99 şeklinde 100 tane değişken tanımlamak elbette mümkün; ama oldukça zahmetli olurdu. Sırf değişkenleri tanımlarken kaybedeceğiniz zamanı düşünürseniz ne demek istediğimi anlarsınız. Bunun için alternatif bir çözümün gerektiği mutlak!

Çok sayıda değişkenin gerektiği durumlarda, diziler imdadımıza yetişir. (Dizi, İngilizce kaynaklarda array olarak geçer.) 100 değişken tanımlamamızın gerektiği yukardaki örneğe dönelim. Tek tek a0, ..., a100 yaparak bunu nasıl yazacağınızı zaten biliyorsunuz. Şimdi tek satırda dizi tanımlayarak, bunu nasıl yapacağımızı görelim:

int a[100];

Yukardaki tek satır, bellek bloğunda 100 adet int değişken yeri ayırır. Tek satır kod elbette açıklayıcı değil, o yüzden bunu aşağıdaki şekilde açıklayalım:

Her şeyin başında dizideki elemanların değişken tipini yazıyoruz; buradaki örneğimizde    tam sayı gerektiği için 'int' yazdık. Daha sonra diziye 'a' yazarak bir isim veriyoruz.Değişkenleri nasıl isimlendiriyorsak, aynı kurallar diziler için de           geçerli... Son aşamada bu dizinin kaç eleman içereceğini belirtiyoruz. Köşeli parantezler ( [  ] ) içinde yazdığımız 100 sayısı, 100 adet int tipinde değişkenin oluşturulmasını sağlıyor.

Bir değişkene ulaşırken, onun adını yazarız. Dizilerde de aşağı yukarı böyle sayılır. Fakat ufak farklar vardır. Bir dizi, birden çok elemandan oluşur. Bu yüzden sadece dizi adını yazmaz, ulaşmak istediğimiz elemanı da yer numarasını yazarak belirtiriz. Örneğin a dizisinin, 25.elemanı gerekiyorsa, a[24] ile çağrılır. Sanırım 25 yerine 24 yazıldığını fark etmişsinizdir. C programlama dilinde, dizilerin ilk elemanı 0'dır. Diziler 0'dan başladığı için, ulaşmak istenilen dizi elemanı hangisiyse bir eksiğini yazarız. Yani a dizisinin 25.elemanı, a[24]; 100.elemanı a[99] ile çağırırız.

TEK BOYUTLU DİZİLER

int sayilar[6]; /* 6 elemanlı, her elemanı int olan dizi*/

char kodlar[15]; /*15 elemanlı, her elemanı char olan dizi*/

float boylar[5]; /*5 elemanlı, her elemanı float olan dizi*/

double notlar[7]; /*7 elemanlı, her elemanı double olan dizi*/

Derleyici ilk örnekteki gibi bir komutla karşılaştığında 6 adet sayının saklanacağı bellek alanı ayırır. Bir tam sayı 2 byte (DOS’ta) uzunluğunda olduğuna göre dizinin bellekte kaplayacağı alan 2*6=12 byte olacaktır. Bu alanın başlangıç adresini, dizi adına aktarır.

TEK BOYUTLU DİZİLERE DEĞER ATAMASI

Dizinin elemanlarına ulaşmak için dizinin ismi ve köşeli parantez içerisinde indis numarası yazmak yeterlidir. Aşağıdaki örnekleri inceleyelim;

sayilar[0] = -12;  /* 0 numaralı elemanına -12 değerini ata */
sayilar[2] = sayilar[4] + 3; /*dizinin 2 numaralı elemanına 4 numaralı elemanının 3 fazlasını ata */
for( i=0 ;  i<6 ; i++)   /*0’dan 6’ya kadar. 6 Dahil değil */
{
sayilar[i] = 0; /* dizinin elemanlarına 0 değerini ata */
}

Yukarıda döngü değişkeni ile dizi elemanlarına erişim yöntemi gösterilmiştir. Bu örnekten sonra aşağıdaki ifadelerin birbirlerinden farkını vurgulamak yerinde olacaktır.

sayilar[i] + 1 ve sayilar[i+1]

İlk gösterim dizinin i numaralı indisindeki elemanın bir fazlası anlamına gelir. İkinci gösterim ise dizinin i’nin bir fazlası indisindeki elemanı anlamına gelir. Dolayısıyla;

sayilar[i] + 1 =/= sayilar[i +1] (Eşit değildir)

TEK BOYUTLU DİZİLERE İLK DEĞER ATANMASI

Bir önceki konuda dizinin elemanlarına nasıl değer atandığı belirtilmiştir. Tanımlandıkları anda ilk değer ataması ise aşağıdaki şekilde yapılır;

int puanlar[5] = {4, 6, 3, 1, 8};

İlk değer atama işleminde küme parantezi (brace) kullanılır. Küme işaretinden sonra (;) kullanılmasına dikkat ediniz. Böyle bir ilk değer atamasından sonra dizinin elemanları şöyle yerleşir;

puanlar[0] = 4 
puanlar[1] = 5
puanlar[2] = 3
puanlar[3] = 1 
puanlar[4] = 8

Küme işaretleri içerisine dizinin eleman sayısından daha fazla eleman yazıldığında, bir yazım hatası ortaya çıkar. Eleman sayısından daha az eleman yazıldığında ise, diğer elemanlar otomatik olarak sıfır değerini alırlar.

İlk değer ataması yapılmayan dizilerin elemanları bellekteki rastgele değerlerden oluşur. Ancak dizi static yada global tanımlanmış ise ilk değer ataması yapılmasa dahi elemanlarının değerleri sıfır ya da boştur.

Ayrıca ilk değer ataması yapıldığında eleman sayısını yazma zorunluluğu yoktur. Ne kadar eleman yazılmışsa eleman sayısı o olur.

Dizi Öğelerine Erişim:

Dizi öğelerine bir tamsayı dizini kullanılarak erişilir. Dizi dizini 0 ile başlar ve dizinin 1 eksi boyutuna kadar gider.

Şimdi basit bir örnek yapalım.

#include <stdio.h> 

int main() 
{ 
	int arr[5]; 
	arr[0] = 5; 
	arr[2] = -10; 
	arr[3 / 2] = 2; // bu dizi ile aynı [1] = 2
	arr[3] = arr[0]; 

	printf("%d %d %d %d", arr[0], arr[1], arr[2], arr[3]); 

	return 0; 
}

Program Derlendiğinde Sonuç Aşağıdaki Gibi Olacaktır.

Bir Örnek Daha Yapalım:

/*Klavyeden girilen 5 adet sayısı tersinden yazar*/

#include <stdio.h>
int main()
{
      int sayilar[5]; /* Beş elemanlı tamsayı dizi*/
      int indis;
      printf("5 adet sayi giriniz: nn");
      for( indis = 0 ; indis < 5 ; indis++ )
        {
			printf("%d.nci sayi: ",indis+1);
			scanf("%d", &sayilar[indis] );
		}
	  printf("nGirilen sayilar(sondan basa) : nn");
      for( indis = 4 ; indis >= 0 ; indis-- )
          printf("%dn", sayilar[indis]);
			
      return 0;
}

Program Derlendiğinde Sonuç Aşağıdaki Gibi Olacaktır.

 

#c++