Veri Yapıları - Struct Tanımlama ve Kullanımı

By Burak TUNGUT - 24.11.2012 - Kategori C / C++

2. Sınıf derslerimden olan Data Structures & Algorithm (Veri Yapıları ve Algoritmalar) dersinde öğrendiğim herşeyi bir yazı dizisi halinde getirmeye an itibari ile karar verdim. Tabi ki her ders için birer yazı yazmaktansa, öğrendiğim her bir kavramı kullanabileceğimiz diğer kavramlar ile birleştirerek sizlere sunacağım.

İlk derslerde öğrendiğim kavramları günümüz yüksek seviyeli dilleri (Java ve C#) ile karşılaştırınca aslında amaçsız bir iş içinde olduğumuzu düşünmüştüm. Çünkü bu dillerde rahat bir şekilde istediğimiz classları, içlerinde propertyler ve methodlar olacak şekilde rahatça yazabiliyor ve hata alsak bile kolayca düzeltebiliyoruz. Gel gelelim benzer yapıyı C++ da struct'lar ile yapmaya çalışıyor ve ne kadarda ilkel olduğunu görüyoruz. Aslında bu noktada düşündüğüm tek şey şöyle oldu ;

 

Yüksek seviyeli dillerde kolayca yazmamızı sağlayan mimarinin altında yatan gerçekler ve zoru gördükten sonra kolay herşeyin daha anlamlı gelmesi

Belki olaya olması gerektiğinden fazlaca iyi yönden baktık, ama en azından artık yapacağımız işi biraz tanıdık.

Lafı fazla uzattık gibi, artık konumuza ve hazırladığım ufak senaryoya başlayabiliriz.

C++ sonrasını tamamiyle unutalım

Evet tıpkı yukarıda dediğim gibi artık C# ve Java elimizde yok ve C++ da kullandığımız temel veri tipleri yani int, float, string vs.'den başka elimizde bir tip yok ancak bizim yazacağımız öğrenci programı içinse öğrenciler için kullanabileceğimiz bir veri tipine ihtiyacımız var bu arada farkındamısınız senaryomuzunda öğrenci programı olduğunu söylemiş bulundum :)

Temel olarakda bir öğrencinin numarasını ve aldığı puanı içinde tutacak bir yapıya ihtiyacımız var. Tıpkı yüksek seviye dillerde bir class yazarmış gibi aşağıdaki kodu aynen C++ da yazıyor ve uygulama içersinde kullanacağımız structımızı tanımlamış oluyoruz.

struct Ogrenci{
	int No;
	int Puan;
};

Burda dikkat etmemiz gereken en önemli şey ise structın tanımlanmasında bizden istenen syntax kuralına dikkat etmemiz olacaktır.

Birde main methodumuzu yazalım ve içersinde 2 tane öğrenci tanımlayalım, hemen ardından numaralarını ve puanlarını girelim. Yalnız bundan önce uygulayacağımız senaryo gereği öyle bir methodumuz olsunki biz parametre olarak ona Ogrenci yollayalım o da bilgileri ekrana yazsın.

void ParametreIleYazdir(Ogrenci o)
{
	printf("\n%d. nolu ogrencinin puani : %d\n",o.No,o.Puan);
}

Neden pointer kullanmalıyız ?

Yukarıda parametre olarak aldığı öğrencinin bilgilerini ekrana yazdıran bir method yazdık fakat bu method bizim için performanslı olmayacaktır. Çünkü biz bu methodu çağırırken elimizde varolan bir öğrenciyi parametre olarak yollamış olsakda, içersindeki bilgilerin aynı olduğu bir öğrenci daha memory de yaratılacak yani bit by bit olarak tekrar oluşturulup methoda bu öğrenci verilecek. Bunun anlamını method içersinde gelen öğrencinin herhangi bir değerini değiştirmenize rağmen yolladığımız öğrencide aynı değişikliliğin yansımamış olduğunu inceleyerek öğrenebilirsiniz.

Başlığı yazdık fakat henüz ne yapcağımızdan bahsetmedik. Aslında amacımız yukarıda yazdığımız şeyi engellemek. Yani methodu çağırırken söz konusu öğrencinin kopyalanması yerine, direk bu öğrenciye ulaşmak olacaktır. Bunun içinde method parametre olarak bir öğrenci değil, öğrenciye ait bir adres alması olacaktır.

Diğer bir değişle parametre olarak elimizdeki öğrencinin adresini yollayıp, method içersinde adresi verilen öğrenciye ulaşıp bilgileri yazdırmak olacaktır. Tıpkı aşağıdaki kod gibi ;

void PointerIleYazdir(Ogrenci* o)
{
	printf("\n%d. nolu ogrencinin puani : %d\n",o->No,o->Puan);
} 

Bahsettiğim senaryoyu yukarıdaki method tam istediğimiz gibi karşılayacaktır. Parametre olarak aldığı ogrencinin adresinden, öğrenciye ulaşıp içersindeki No ve Puan bilgilerini ekrana yazdıracaktır. Böylece methoda bir öğrenci yollamamış olacağız ki bu da uygulamamızdaki performansı düşürmeyecektir.

İlkel bir eşitlik bulduk sanırım :)

Pointer = Performans

Main methodumuzu yazalım

Elimizde 1 struct ve bunun üzerinde her ne kadar aynı işlemi gerçekleştirsede birinin daha performanslı olacağı 2 adet method var. Şimdi main methodumuzu yazalım ve elimizdeki yapıları kullanalım.

int main()
{
	Ogrenci o1;
	o1.No=10020;
	o1.Puan=40;

	Ogrenci o2;
	o2.No=10030;
	o2.Puan=55;

	ParametreIleYazdir(o1);
	PointerIleYazdir(&o2);
	system("PAUSE");
}

Uygulamamızı çağırdığımızda aşağıdaki gibi bir ekran ile karşılacağız.

C++ Struct

Bu örnek ile C++ da struct'ın ne olduğunu, nasıl tanımlanacağını ve nasıl örnekleneceğini ve pointerlar ile çalışmanın daha performanslı olduğunu öğrendik. Bu yazı dizisine sonraki makalemde stack (yığın) yapısı ile devam edip list yapısını inceliyor olacağız.

Bir sonraki makalemde görüşmek üzere, esen kalınız :)
H. Burak TUNGUT

Yorum Bırak

Facebook
Son Yorumlar