Bu yazımda aynı anda pek çok farklı veriyi tek bir isim altında tanımlamayı sağlayan diziler konusundan bahsedeceğim. Ayrıca anlatımı kuvvetlendirmek için pek çok kod örneği de yazı içerisinde mevcuttur.

Diziler

Dizi kullanımının temel amacı programlamada kullanılan pek çok yöntem gibi veriyi iyi bir şekilde yönetebilmektir. Diziler sayesinde programlama süreçlerindeki pek çok zahmetli değişken oluşturma ve bu değişkenleri yönetme işlemini kolaylaştırabiliriz. Projenizde kullanacağınız aynı guruba dahil pek çok değişkeni ortak bir dizi altında tanımlayabilirsiniz. Mesela bir sınıftaki öğrencilerin boylarını veri olarak tutacaksınız, bunu öğrenci1, öğrenci2, öğrenci3 … şeklinde ayrı değişkenlerde değil sadece bir öğrenci_boy dizisi içerisinde de saklayabilirsiniz. Aşağıda temel bir dizi yapısının oluşturulma şekli verilmiştir.

Değişken türü değişken adı [ dizinin eleman sayısı ] { sıfır indisli veri, bir indisli veri, iki indisli veri … }

Bir dizinin herhangi bir elemanını indis numarası vasıtası ile kullanabiliriz. Örneğin boy dizisinin ikinci sıradaki elemanına ulaşmak istiyorsak, ikinci elemanın indis numarası olan olan biri kullanarak bu veriye ulaşabiliriz. Eğer bir diziyi oluştururken ilgili dizinin eleman değerlerini başlangıçta girmek istemiyorsak, float boy [7] {} şeklinde bir ifade kullanarak dizinin bütün elemanlarının başlangıçta varsayılan olarak sıfır olacak şekilde atanmasını sağlayıp, gelecekte yaşanması muhtemel problemlerin önüne geçebiliriz. Eğer içerisine değerlerini yerleştirdiğiniz bir diziniz mevcut ise ilgili dizinin eleman sayısını diziyi tanımlarken yazmasanız da derleyici dizinin eleman sayısı kısmını otomatik olarak dolduracaktır.

Aşağıda dizi kullanımı için temel bir örnek verilmiştir, sıfır numaralı indise sahip birinci veri 1.8 , üç numaralı indise sahip dördüncü veri 1.87 ve beş numaralı indise sahip altıncı veri 1.83 ekrana sırasıyla yazdırılacaktır.

#include <iostream>

void main()
{
	float öğrenci_boy[7]{ 1.80, 1.60, 1.65, 1.87, 1.90, 1.83, 2.20 };
	std::cout << öğrenci_boy[0] << öğrenci_boy[3] << öğrenci_boy[5];
}

Aşağıdaki kodu kullanarak ögrenci_puan dizisine, sırasıyla sıfırıncı indisdeki 4 byte’lık alandan başlayarak, ilgili dizinin içerebileceği beş değer atanıp ekrana sırasıyla yazdırılabilmektedir. Bu örnekte olduğu gibi, for döngüsü vasıtası ile sırasıyla dizinin bütün elemanlarını ritmik bir şekilde rahatlıkla gezebilirsiniz.

#include <iostream>

void main()
{
	int ögrenci_puan[5]{};
	for (int i = 0; i < 5; i++) {
		int a = i + 1;
		std::cout << a << ". ogrencinin sinav notunu giriniz:" << std::endl;
		std::cin >> ögrenci_puan[i];
	}
	for (int i = 0; i < 5; i++) {
		int a = i + 1;
		std::cout << a << ". ogrencinin sinav notu:" << ögrenci_puan[i] << std::endl;
	}
}

Yukarıdaki kodun örnek bir kullanımı aşağıda verilmiştir. 1.ogrencinin sinav notunu giriniz:
65 2.ogrencinin sinav notunu giriniz:
32 3.ogrencinin sinav notunu giriniz:
86 4.ogrencinin sinav notunu giriniz:
85 5.ogrencinin sinav notunu giriniz:
69 1. ogrencinin sinav notu:65 2. ogrencinin sinav notu:32 3. ogrencinin sinav notu:86 4. ogrencinin sinav notu:85 5. ogrencinin sinav notu:69

Aşağıda işaretçiler ve dizilerin birlikte kullanımı ile ilgili bir örnek verilmiştir. Eğer bir diziyi herhangi bir işaretçiye direk eşitlerseniz, ilgili işaretçiye dizinin sıfır indeksli değerinin yani birinci değerinin adresi atanacaktır. Aynı şekilde eğer dizi isminin yanına +1 yazarsanız bu seferde dizinin bir indisli elemanın yani ikinci elemanın adresini ilgili işaretçiye yazdırmış olursunuz. Aşağıdaki kod ile ekrana sırasıyla alt alta 25 ve 24 yazdırılacaktır.

#include <iostream>

void main() {
	int yaş[4]{ 24, 18, 19, 25 };
	int* ptr_yaş1 = yaş;
	int* ptr_yaş4 = yaş + 3;
	std::cout << *ptr_yaş4 << std::endl << *ptr_yaş1;
}

İç İçe Çok Boyutlu Diziler

Bir diziyi istediğiniz miktarda katmanlı bir yapıda tanımlayabilirsiniz. Mesela bir diziyi içendeki her eleman içerisinde beşer tane daha eleman olacak ve bu dizilerin her birinin içerisinde de üçer eleman olacak vs. şekilde tanımlayabilirsiniz.

Aşağıdaki örnekte üç elemanlı bir dizinin her elemanına dörder elaman yerleştirilmiş ve dizinin ikinci elemanının birinci değeri olan 1 ekrana yazdırılmıştır.

#include <iostream>

void main() {
	float katmanlı_dizi[3][4]{
		{ {0.0}, {0.1}, {0.2}, {0.3} },
		{ {1.0}, {1.1}, {1.2}, {1.3} },
		{ {2.0}, {2.1}, {2.2}, {2.3} }
	};
	std::cout << katmanlı_dizi[1][0];
}

Aşağıda iç içe for döngüleri ile diziye değerler atanmış, dizinin birinci elemanının eleman sayısı std kütüphanesi vasıtası ile ekrana yazdırılmış ve ardından dizinin tutmuş olduğu veriler ekrana yazdırılmıştır.

#include <iostream>

void main() {
	float katmanlı_dizi[2][2]{};
	for ( int i = 0; i <= 1; i++ ) {
		for (int j = 0; j <= 1; j++) {
			int a = i + 1;
			int b = j + 1;
			std::cout << "dizinin " << a << "." << b << " sirali elemaninin degerini giriniz:" << std::endl;
			std::cin >> katmanlı_dizi[i][j];
		}
	}

	std::cout << "dizi'nin birinci elemanin eleman sayisi:";
	std::cout << std::size(katmanlı_dizi[0]);
	std::cout << std::endl;

	for (int i = 0; i <= 1; i++) {
		for (int j = 0; j <= 1; j++) {
			int a = i + 1;
			int b = j + 1;
			std::cout << "dizinin " << a << "." << b << " sirali elemaninin degeri:";
			std::cout <<  katmanlı_dizi[i][j] << std::endl;
		}
	}
}

Yukarıdaki kodun örnek bir kullanımı aşağıda verilmiştir. dizinin 1.1 sirali elemaninin degerini giriniz:
1
dizinin 1.2 sirali elemaninin degerini giriniz:
2
dizinin 2.1 sirali elemaninin degerini giriniz:
3
dizinin 2.2 sirali elemaninin degerini giriniz:
4
dizi’nin birinci elemanin eleman sayisi:2
dizinin 1.1 sirali elemaninin degeri:1
dizinin 1.2 sirali elemaninin degeri:2
dizinin 2.1 sirali elemaninin degeri:3
dizinin 2.2 sirali elemaninin degeri:4

Diziyi Fonksiyona Eleman Olarak Çağırmak

Çoğu programlama dilinde fonksiyonlar dizileri çağırırken, dizinin elemanlarını tek tek almak yerine hız ve bellek kullanımı açışından dizinin bellek adresini alır. Java, Python gibi programlama dilleri bu işlemi daha kendi içinde çözerken, C++ programlama dilinde bu çalışma yapısı daha dikkat etmemiz gereken bir konudur.

Mesela int fonksiyon1 ( int dizi1[] ) ve int fonksiyon1 ( int* dizi1 ) fonksiyon gösterimleri derleyici açısından aynı şeyi ifade etmektedir çünkü fonksiyona gönderilen veri zaten ilgili dizinin bellek adresidir. Eğer fonksiyon içerisinde düz bir şekilde std::cout << dizi1 gibi bir ifade kullanırsanız, ekrana ilgili dizinin bellek adresini yazdırmış olursunuz. Ama bir for döngüsü vasıtası ile dizinin elemanlarını tararsanız ilgili hücrelere ulaşmanız mümkün olacaktır. Ayrıca işaretçi kullanımı ile de dizi elemanlarına ulaşabilirsiniz. Dizi çağırılan fonksiyona dizi boyutuyla alakalı ekstra bir değişken göndermek de kullanışlı olabilir.

Aşağıdaki örnek ile önce tek boyutlu bu dizinin eleman sayısı main fonksiyon içerisinde ekrana yazdırılmış, daha sonra işe fonksiyon aracılığı ile dizinin ilk elemanın bellek adresi, dizinin elemanları ve işaretçi kullanımı ile dizinin birinci, üçüncü ve beşinci elemanlarının ekrana yazdırılma işlemi gerçekleştirilmiştir.

#include <iostream>

void fonksiyon( int dizi[5]) {
	std::cout << "dizinin ilk elemaninin bellek adresi: ";
	std::cout << dizi;
	std::cout << std::endl;

	for (int i = 0; i < 5; i++) {
		std::cout << dizi[i];
	}
	std::cout << std::endl;

	std::cout << *dizi;
	std::cout << *dizi + 2;
	std::cout << *dizi + 4;
}
void main() {
	int dizi1[5]{ 1,2,3,4,5 };
	std::cout << "dizinin eleman sayisi: ";
	std::cout << std::size(dizi1);
	std::cout << std::endl;
	fonksiyon(dizi1);
}

Yukarıdaki kodun ekran çıktısı aşağıda verilmiştir. dizinin eleman sayisi: 5
dizinin ilk elemaninin bellek adresi: 000000D7A90FF6D8
12345
135

Bir sonraki dersimizde görüşmek üzere…

CEVAP VER

Please enter your comment!
Please enter your name here