YAPILAR (STRUCTURES) Yapılar, dizilere benzeyen ancak farklı tipten verileri bir arada tutan bütün olarak tanımlanabilir. Yapıların kullanılmasının esas sebebi de budur. Yapı tipi aslında yeni bir tip değildir, varolan tiplerden meydana gelir. Yapılar bilgiyi daha düzenli tutmak adına önemlidir. Örnek verecek olursak bir öğrencinin bilgilerini tutmak istediğimizde: isim, soyisim, yaş, numara, gibi bilgileri mantıksal bir bütünlük saüğlayacak şekilde yapı icerisinde tutabiliriz. Bunu şu şekilde gösteririz: Örnek: struct OgrenciYapi{ ; struct OgrenciYapi ogrenci1; struct OgrenciYapi ogrenci2; //Birinci değişkenimiz //İkinci değişkenimiz Artık OgrenciYapi adında bir veri tipi vardır ve bu tip toplamda 4 üyeden oluşur(isim, soyisim,yaş ve numara). Nasıl ki int sayi1; deyip sayi1 adında tamsayı tipinde bir değişken tanımlayabiliyorsak artık OgrenciYapi ogrenci1; ile de OgrenciYapi tipinde ve ogrenci1 adında değişkenimizi yaratmış oluruz. İstersek ikinci bir değişkeni de benzer şekilde yaratabiliriz. Tanımlama genel olarak şu şekilde yapılır: struct YapıAdı { Uye1; Uye2; Uye3;... Uye_n; ;
Bu tipte bir değişken ise struct YapıAdı DeğişkenAdı; şeklinde yapılır. Yukarıdaki bildirimi aynı sonucu verecek şekilde şöyle de yapabilirdik(yapı bildirimi ile o tipte bir değişken yaratma aynı anda yapılıyor ): struct OgrenciYapi{ ogrenci1; Eğer birden fazla değişken tanımlamak istiyor isek şöyle de yapabiliriz: struct OgrenciYapi{ ogrenci1,ogrenci2,ogrenci3,ogrenci4; Yapıların bildirim yerinden de bahsedecek olursak; yapılar tüm bildirimlerde olduğu gibi global ya da yerel düzeyde yapılabilir. Yapıların Kapladığı Bellek Alanı Yaratılan bir yapı değişkeni için, yapı bildiriminde belirtilen elemanların tek tek toplam büyüklüğü kadar yer ayrılır. Bu alan byte olarak hesaplanır ve istenirse aşağıdaki gibi yazdırılabilir:
struct ORNEK_ITU { //Yapımız global olarak tanımlandı int itu_ogr_sayisi; double kisi_basi_alan_m2; char Giris_Kapisi; ; int main() { struct ORNEK_ITU x; return 0; printf("int buyuklugu=%d\n",sizeof(int)); printf("double buyuklugu=%d\n",sizeof(double)); printf("char buyuklugu=%d\n",sizeof(char)); printf("x'in Toplam Buyuklugu: %d byte\n", sizeof(x)); sizeof(x) == sizeof(int) + sizeof(double) + sizeof(char) Yapı Üyelerine Erişim Yapı üyelerine dizilerde olduğundan farklı bir şekilde erişilir: Yapı elemanlarına erişim için köşeli parantez değil de nokta işleci kullanılır (. ). Noktanın sol tarafındaki terim, bizim belirlediğimiz tipte olan yapı değişkeninin adı, sağ tarafında ise o yapıya ait üyenin adı yer almalıdır. Kendi örneğimizden yola çıkacak olursak: ogrenci1.yas=15; ile ogrenci1 adlı değişkenimizin yas uyesine 15 degerini atıyoruz. Veri Tiplerine Yeni İsim Verme
C dilinde var olan veri tiplerine daha anlaşlır ve kolay kod yazımı için yeni bir isim vermek mümkündür. Tanımlama biçimi: typedef TanımlıTip istenilen_isim; typedef int tamsayi; Bu işlemden sonra tamsayı isminde bir veri tipi vardır ve int yerine kullanılabilir. Değişken tanımlamada kullanılabilir. tamsayi i, j; Yapılar ile kullanımı struct OgrenciYapi { ; typedef struct OgrenciYapi OGRENCI; OGRENCI ogrenci1; veya typedef struct OgrenciYapi { OGRENCI; Dikkat!!!!Burada OGRENCI değişkeni yaratmıyoruz.typedef kullanıldığında, parantez kapandıktan sonra kullanılan OGRENCI terimi artık struct OgrenciYapi yerine kullanılabilir. Örneğin: OGRENCI ogrenci1; ile struct OgrenciYapi ogrenci1; aynı şeydir.
Yapıların Kullanımına Örnek Bir Program Yapıları kullanarak basit anlamda sınıftaki ogrencilerin bilgilerini tutan program yapmak mumkundur. Bu programda yukarıdaki örneklerle paralellik teşkil etmesi açısından tüm yazı boyunca kullandığımız OgrenciYapi ornegi kullanılmıştır. Ayrıca bu örnekte yapıların da dizi elemanı olarak kullanılabileceğini göreceksiniz: struct OgrenciYapi{ //Yapı bildirimi global olarak yapıldı. ; int main(){ int i=0,j; int secim=0; struct OgrenciYapi ogrenci[40]; //elemanları yapı olan dizi yaratıldı. printf(" _\\ /_ Sinif Kayit Programi _\\ /_ \n\n\n"); printf("ogrenci eklemek [1]\n"); printf("eklenen ogrencileri gormek icin [2]\n"); printf("cikis icin [3] giriniz:"); while(secim>3 secim<1){ printf("hatali giris! [1],[2]veya [3] giriniz:\n"); while(1){ switch(secim){ case 1: printf("\n%d. kaydedilen ogrencinin adini giriniz:",i+1); scanf("%s",&ogrenci[i].isim);
printf("\n%d. kaydedilen ogrencinin soyadini giriniz:",i+1); scanf("%s",&ogrenci[i].soyisim); printf("\n%d. kaydedilen ogrencinin yasini giriniz:",i+1); scanf("%d", &ogrenci[i].yas); printf("\n%d. kaydedilen ogrencinin numarasini giriniz:",i+1); scanf("%d", &ogrenci[i].numara); i++; printf("\n\n[1]ekleme,[2] listeleme,[3]cikis? :"); while(secim>3 secim<1){ printf("hatali giris! [1],[2]veya [3] giriniz:\n"); break; case 2: for (j=0;j<i;j++) { printf("\n%d.ogrenci",j+1); printf("\n Ad, Soyad : %s %s", ogrenci[j].isim,ogrenci[j].soyisim); printf("\n Yas : %d\n No : %d\n",ogrenci[j].yas,ogrenci[j].numara); printf("\n\n[1]ekleme,[2] listeleme,[3]cikis? :"); while(secim>3 secim<1){ printf("hatali giris! [1],[2]veya [3] giriniz:\n"); break; case 3: return 0;
Örnek Program Çıktıları: **1 ögrenci eklenmis ve listele denmistir: **3 Öğrenci eklenmis ve ardından listele denmistir:
Engin Yıldırım einginy@gmail.com.com İTÜ IEEE Bilişim Komitesi