Yapılar( Structures)
Yapılar
Yapılar, birbirleriyle ilişkili değişkenlerin bir isim altında toplanmasıdır. Diziler aynı veri tipinde elemanlar içerebilirken yapılar değişik veri tiplerinde elemanlar içerebilir.
Yapı Tanımlama
Yapılar, diğer tipte nesneler kullanılarak oluşturulan, türetilmiş veri tipleridir.
struct kisi{ char *isim; char *soyisim; };
kisi tanıtıcı ismidir. struct anahtar kelimesiyle yapı tipindeki değişkenler bildirimi yapılır. Yukarıdaki tanımlamada yapı tanımında parantezler içinde bildirilen değişkenler yapı elemanlarıdır. Aynı yapının elemanları kendilerine özel isimlere sahip olmalıdır, farklı iki yapı aynı isimde elemanlar içerebilir. kisi yapısının char* tipinde iki eleman içermektedir.
struct personel { char ad[15]; char soyad[15]; int yas; char cins; double ucret; };
Şeklinde diğer değişken türleride kullanılabilir. Fakat yapı içerisinde yapı olmaz.
struct isci { char ad[20]; char soyad[20]; int yas; struct isci kisi; // hatalı tanımlama struct isci *aPtr; // gösterici };
tanımlamasında,yapının içindeki struct isci kendi kendisinin bir örneğini kisi içermektedir ve bu bir hatadır. ePtr ise struct isci2 tipini gösteren bir göstericidir tanımlama içinde kullanılabilir.
struct kart a, deste[30], *cPtr;
şeklinde de bildirilir. struct kart tipinde bir a değişkeni, struct kart tipinde 30 elemana sahip bir deste dizisi ve struct kart’ı gösteren bir gösterici değişkeni bildirir.
iki struct birleşimi yapı tanımının sonundaki parantez ile yapı tanımlamasını sonlandıran noktalı virgül arasına, virgüllerle ayrılmış bir biçimde yazılarak bildirilebilir.
struct kart{ char *sınıf; char * takim; }a,deste[40],*cPtr;
Yapı etiket ismi içermeyen bir yapı tanımlamasında, yapı tipindeki değişkenler yalnızca yapı tanımlaması içinde bildirile bilirler.
Yapılara Değer Atama
Yapılara, dizilerde olduğu gibi atama listeleri ile atama yapılır.
struct kart{ char *taraf; char *takim; } a; struct genel z={“kart”,”sayi”};
şeklindeki bildirimi daha önce tanımlanmış struct genel tipinde bir z değişkeni oluşturur. Değişkenin taraf elemanına kart ve takim elemanına sayi değerini atar. Atama listesinde yapı elemanlarından az sayıda eleman varsa, kalan elemanlar 0 (null) atanır. Yapı değişkenleri fonksiyon tanımı dışında bildirilirse, bu elemanlara değer atanmazsa, ilk değer olarak 0 (null) atanır.
Yapıdaki Elemanlara Ulaşmak
Yapı içerisindeki elemanlara ulaşmanın iki yolu vardır.
- Yapı elemanı operatörü (.)
- Yapı gösterici operatörü ( ->)
struct kart{ char *taraf; char *takim; } a; struct genel z={“kart”,”sayi”};
z yapısının kart elemanını yazdırmak için:
printf(“%s“,z.takim);
struct kart yapısını göstermek için bir aPtr göstericisinin bildirildiğini ve a yapısının adresinin aPtr’ye atandığını düşünelim. a yapısının takim elemanını yazdırmak için:
printf(“%s”,aptr->takim);
aPtr-> takim deyimi, (*aPtr).takim ile eşdeğerdir.
#include <stdio.h> struct kart{ char *taraf; char *takim; }; int main( ) { struct kart a; struct kart *aPtr; a.taraf = "As"; a.takim = "Maca"; aPtr = &a; printf( "%s %s%s\n%s %s%s\n%s %s%s\n",a.takim, a.taraf, "i", aPtr->takim, aPtr->taraf, "i",( *aPtr ).takim, ( *aPtr ).taraf, "i" ); return 0; }
Yapılar ve Fonksiyonlar
Yapılar fonksiyonlara şu şekillerde geçirilir:
- Tüm yapının geçirilmesiyle.
- Yapıyı gösteren bir göstericinin geçirilmesiyle.
- Değere göre çağırmayla geçilir.
typedef
Kelimesi önceden tanımlanmış veri tipleri için takma isimler yaradan koddur. Yapı isimleri typedef ile kısa tip isimler oluşturur.
typedef struct kart Kart; ifadesi struct { char *taraf; char *takim; } Kart;
kod satırı, Kart tipini ayrı bir typedef ifadesi kullanmaya kalmadan oluştur.
Kart, struct kart tipinde değişkenler tanımana bilir.
Kart demet [52];
52 Kart yapısından struct kart tipinde değişkenlerden oluşan bir dizi bildirir. typedef ile yeni bir isim yaratmak yeni bir tip yaratmaz; typedef daha önceden var olan bir tip ismi için, eş anlamlı olarak kullanılabilecek yeni tip isimleri oluşturur.
Yapıların kullanılmasıyla kart karma ve dağıtma
#include <stdio.h> #include <stdlib.h> #include <time.h> struct kart { const char *taraf; const char *takim; }; typedef struct kart Kart; void desteDoldur( Kart * const, const char *[ ],const char *[ ] ); void desteyiKar ( Kart * const ); void dagit ( const Kart * const ); int main( ) { Kart deste[ 52 ]; const char *taraf [ ] = { "As", "iki", "uc","Dort", "Bes","Alti", "Yedi", "Sekiz","Dokuz", "On","Vale", "Kiz", "Papaz"}; const char *takim [ ] = { "Kupa", "Karo"," Sinek", "Maca"}; srand( time( NULL ) ); desteDoldur( deste, taraf, takim ); desteyiKar( deste ); dagit( deste ); return 0; } void desteDoldur( Kart * const wDeste, const char * wTaraf[ ],const char * wTakim[ ] ) { int i; for ( i = 0; i <= 51; i++ ) { wDeste[ i ].taraf = wTaraf[ i % 13 ]; wDeste[ i ].takim = wTakim[ i / 13 ]; } } void desteyiKar( Kart * const wDeste ) { int i, j; Kart gecici; for ( i = 0; i <= 51; i++ ) { j = rand( ) % 52; gecici = wDeste[ i ]; wDeste[ i ] = wDeste[ j ]; wDeste[ j ] = gecici; } } void dagit( const Kart * const wDeste ) { int i; for ( i = 0; i <= 51; i++ ) printf( "%5s %-8s%c", wDeste[ i ].takim,wDeste[ i ].taraf,( i + 1 ) % 2 ? '\t' : '\n' ); }
Birlikler
Birlikler (yapılar gibi), türetilmiş veri tipleridir. Birlik elemanları aynı depolama alanını kullanırlar. Bu sebepten, bir birlik kullanılmayan değişkenler için hafızayı boş yere işgal etmek yerine ayrılan alanı kullanır.
Bir birlik union anahtar kelimesiyle, yapılarla aynı biçimde bildirilir.
union sayi{ int x; double y; };
birlik bildirimi sayi’nin birlik tipinde olduğunu ve int x ile double y elemanlarına sahip olduğunu belirtir.Birlik tanımlamaları bir programda main’den önce yer alır. Böylece tanımlama, programdaki tüm fonksiyonlarda değişken bildirmek için kullanılabilir.
Birliklerde yapılabilen işlemler şunlardır: bir birliği aynı tipte başka bir birliğe atamak, birliğin adresini almak (&) ve birlik elemanlarına yapı elemanı operatörü ve yapı gösterici operatörü kullanarak erişmek. Birlikler, yapılarda anlattığımız sebeplerden dolayı, == ve != operatörüyle karşılaştırılamazlar.
#include <stdio.h> union sayi { int x; double y; }; int main( ) { union sayi deger; deger.x = 100; printf( "%s\n%s\n%s%d\n%s%f\n\n","Tamsayi uyesine bir sayi koyun", "ve butun uyeleri yazdirin.", "int: ", deger.x, "double:", deger.y ); deger.y = 100.0; printf( "%s\n%s\n%s%d\n%s%f\n","Ondalikli sayi uyesine bir sayi koyun", "ve butun uyeleri yazdirin.", "int: ", deger.x, "double:", deger.y ); return 0; }