Programlama Dilleri 1 Ders 13: Struct (Yapılar)
Genel Bakış Giriş Veri Yapısı Türleri Struct Struct Bellek Tahsisi Typedef Struct Dinamik Bellek Tahsisi Struct Örnekler Programlama Dilleri 1 2
Giriş Bir konuyla ilgili, mantıksal ilişki içindeki verilerin bellekte saklanmasına yönelik düzenlemelere veri yapısı denir. Veri yapıları bellekte belirli bir düzen içinde tutulmuş verilere erişilmesine, bu veriler üzerinde bazı işlemlerin etkin bir biçimde yapılmasına olanak sağlar. Programlama Dilleri 1 3
Veri Yapısı Türleri Diziler, aynı türden bellekte bitişik olarak yer alan bir veri yapısı türüdür. Struct veri yapısı ise farklı türlerden nesneleri/verileri tutabilen ve C tarafından doğrudan desteklenen bir veri yapısı türüdür. Örneğin bir iş yerinde çalışan kişinin isim, yaş, cinsiyet, bölüm, ücret, öğrenim durumu gibi bilgileri farklı türden nesneler içinde saklanabilir. Programlama Dilleri 1 4
Yapı (Struct) Bildirimi Bir dizi tek tip elemanlardan oluşmaktadır. Struct veri yapısı, farklı tipte birbirleriyle ilişkili değişkenleri gruplamak için kullanılır. struct isim { //struct öğeleri yer alacak }; Programlama Dilleri 1 5
Yapı (Struct) Bildirimi struct malstok{ int kodno; char malın_adı[30]; int mal_mevcudu; float alış_fiyatı; }; struct malstok mal1,mal2; Yapıyı temsil eden mal1 ve mal2 değişkenleri tanımlanmıştır. Programlama Dilleri 1 6
Yapı (Struct) Bildirimi (2. yol) struct malstok{ int kodno; char malın_adı[30]; int mal_mevcudu; float alış_fiyatı; } mal1,mal2; Yapıyı temsil eden mal1 ve mal2 değişkenleri tanımlanmıştır. Programlama Dilleri 1 7
Örnek Uçuş planı yapmak için kullanılabilecek bir yapı aşağıdaki gibi tanımlanabilir. struct UcusTipi{ char ucusno[7]; int yukseklik; int ustseviye; int altseviye; int pozisyon; double hiz; }; Programlama Dilleri 1 8
Örnek Bu veri yapısında derleyici yapının ne kadar büyük olduğunu ve farklı tip değişkenlerin bellekte nasıl yerleştiğini gösterir. Sıradan bir bellek tahsisi yapılmaz. Programlama Dilleri 1 9
Struct Tanımlama ve Kullanma Bir struct veri yapısına bellek tahsis etmek için, yeni veri tipini kullanarak değişken tanımlamalıyız. struct UcusTipi ucak; Bellek tahsis edilir ve bu değişkenin bireysel üyelerine erişim sağlanabilir: ucak.hiz = 800.0; // erişim. ile yapılır. ucak.yukseklik = 10000; Programlama Dilleri 1 10
Bellek Tahsisi struct UcusTipi{ char ucusno[7]; int yukseklik; int ustseviye; int altseviye; int pozisyon; double hiz; }ucak; ucak.hiz = 800; ucak.yukseklik = 10000; ucak.ucusno[0] ucak.ucusno [6] ucak.yukseklik ucak.ustseviye ucak.altseviye ucak.pozisyon ucak.hiz Programlama Dilleri 1 11
Bellek Tahsisi Bir struct veri yapısının üyeleri tanım gereği belirtilen sırayla belleğe yerleştirilir. ucak yapısında; ucusno[ ] yukseklik ustseviye altseviye pozisyon hiz şeklinde sırayla bellekte yerleştirilir. Programlama Dilleri 1 12
Struct Tanımlama ve Kullanma Bir struct veri yapısında hem tanımlama hem de bildirme aynı anda yapılabilir. struct UcusTipi{ Tanımlama char ucusno[7]; int yukseklik; int ustseviye; int altseviye; int pozisyon; double hiz; Bildirme }abc, def; Programlama Dilleri 1 13
Struct Tanımlama ve Kullanma Başka bir yapı oluşturmak için UcusTipi adı kullanılabilir. struct UcusTipi abc,def; Bu şekilde bir bildirim ile önceki bildirim arasında bir fark yoktur. Programlama Dilleri 1 14
typedef belirleyicisi C önceden tanımlanmış bir tipe yeni bir ad vererek veri türü tanımlamak için bir yol sağlar. Kullanımı: typedef <isim1> <isim2>; // isim1 yerine isim2 kullanılabilir Programlama Dilleri 1 15
typedef belirleyicisi Örnek kullanımlar: typedef unsigned short int usi; typedef struct UcusTipi UcusTip; typedef struct ab_type{ int a; double b; }ABCGrup; Programlama Dilleri 1 16
typedef belirleyicisi Bu belirleyici, isimlere uygulamaya özgü farklı isimler vererek kodu daha okunaklı hale getirmek için bir yol sağlar. typedef unsigned short int usi; usi pixels; /*pixels değişkeni unsigned short int tipinde olur*/ typedef struct UcusTipi UcusTip; UcusTip plane1, plane2; ABCGrup abc1, abc2, abc3; Yukarıdaki ifadelerde unsigned short int kısaltılarak usi şeklinde tanımlanabilir hale gelmiştir. UcusTip ise struct tipinde bir yapıdır. typedef sayesinde başına struct yazmadan tanımlama yapılabilir. Programlama Dilleri 1 17
typedef belirleyicisi Programlama Dilleri 1 18
typedef belirleyicisi Programlama Dilleri 1 19
Struct Dizileri Bir struct dizisi aşağıdaki gibi tanımlanabilir: struct UcusTipi ucaklar[100]; Burada her bir dizi elemanı bir struct veri yapısıdır. Belli bir elemanın üyesine erişmek için: ucaklar[34].yukseklik = 10000; Burada [ ] ve. operatörleri aynı önceliğe sahiptir. Programlama Dilleri 1 20
Struct Gösterici Bildirimi yapılan struct veri yapısı için gösterici de tanımlanabilir. Örneğin, UcusTipi *ucakptr; ucakptr = &ucaklar[34]; Adresteki veriye erişmek için; (*ucaklar).yukseklik = 10000;. operatörü * operatöründen yüksek önceliğe sahiptir. Yukarıdaki kullanım ile aşağıdaki kullanım birbirinden farklıdır. *ucaklar.yukseklik = 10000; //??? Programlama Dilleri 1 21
Struct Gösterici C bir struct veri elemanına gösterici ile erişmek için özel bir sözdizimi sağlar. ucakptr->ucusno[3] = a ; ucakptr->yukseklik = 10000; ucakptr->pozisyon = 2500; ucakptr->hiz = 757.50; Programlama Dilleri 1 22
Fonksiyon Parametresi struct int Carpisma(Ucak *planea, Ucak *planeb) { if (planea->yukseklik == planeb->yukseklik) { /****/ return ; } else return 0; } Programlama Dilleri 1 23
Dinamik Bellek Tahsisi UcusTipi programımızda uçakları kullanıcının istediği sayıda işlemek istediğimizi varsayalım. Gerekli uçak sayısını bilmediğimizden bu durumda bir dizi tahsis etmemiz doğru olmaz. Maksimum uçak sayısını bilsek bile, dizi tahsis ettiğimizde fazla bellek alanı kullanmış oluruz. Programlama Dilleri 1 24
Dinamik Bellek Tahsisi (malloc) Struct veri yapısı için bellek tahsisi, değişkenler için bellek tahsisi ile aynıdır. ucaklar = malloc(n*sizeof(ucustipi)); Ayrıca dönüş değerinin türünün, uygun gösterici için değiştirilmesi gerekir. ucaklar = (UcusTipi*)malloc(n*sizeof(UcusTipi)); Programlama Dilleri 1 25
Dinamik Bellek Tahsisi (malloc) int havadakiucaklar; UcusTipi *ucaklar; printf( Kaç uçak şu an havada? ); scanf( %d, &havadakiucaklar); ucaklar = (UcusTipi*)malloc(sizeof(UcusTipi) * havadakiucaklar); if (ucaklar == NULL) { printf( Error in allocating the data array.\n );... } ucaklar[0].yukseklik = 500; Eğer bellek tahsisi başarısız olursa, malloc geriye NULL döndürür. Pointer tanımlandıktan sonra, dizi notasyonu veya pointer notasyonu kullanılabilir. Programlama Dilleri 1 26
Örnek 13.1 struct database { int id_number; int age; float salary; }; int main( ) { struct database employee; employee.age = 22; employee.id_number = 1; employee.salary = 12000.21; } Programlama Dilleri 1 27
Örnek 13.2 #include <stdio.h> struct example { int x; }; int main( ) { struct example abc; struct example *ptr; abc.x = 12; ptr = &abc; printf( "%d\n", ptr->x ); } Output: 12 Programlama Dilleri 1 28
Örnek 13.3 #include <stdio.h> #include <string.h> struct student { int id; char name[20]; float percentage; }; Output: Id is: 1 Name is: Recep Percentage is: 86.50 int main( ) { struct student record = {0}; record.id=1; strcpy(record.name, Recep"); record.percentage = 86.5; printf(" Id is: %d \n", record.id); printf(" Name is: %s \n", record.name); printf(" Percentage is: %2.2f \n", record.percentage); return 0; } Programlama Dilleri 1 29
Örnek 13.4 struct personel { char soyad[20]; char ad[20]; int sicilno; int derece; }; struct birim { char ad[20]; struct personel sef; }; struct daire { char ad[20]; struct personel baskan; struct birim altbirim[15]; }; struct daire m; main( ) { m.altbirim[7].sef.sicilno = 2547; printf("%d", m.altbirim[7].sef.sicilno); } Programlama Dilleri 1 30
Örnek 13.4 #include <stdio.h> #include <string.h> struct student { int id; char name[30]; float percentage; }; Programlama Dilleri 1 31
Örnek 13.4 int main() { int i; struct student record[3]; record[0].id=1; strcpy(record[0].name, "Raju"); record[0].percentage = 86.5; record[1].id=2; strcpy(record[1].name, "Surendren"); record[1].percentage = 90.5; record[2].id=3; strcpy(record[2].name, "Thiyagu"); record[2].percentage = 81.5; for(i=0; i<3; i++) { printf(" Records of STUDENT : %d \n", i+1); printf(" Id is: %d \n", record[i].id); Output: Records of STUDENT : 1 Id is: 1 Name is: Raju Percentage is: 86.500000 Records of STUDENT : 2 Id is: 2 Name is: Surendren Percentage is: 90.500000 Records of STUDENT : 3 Id is: 3 Name is: Thiyagu Percentage is: 81.500000 printf(" Name is: %s \n", record[i].name); printf(" Percentage is: %f\n\n",record[i].percentage); } return 0; } Programlama Dilleri 1 32
Örnek 13.5 Fonksiyonlarda parametre olarak struct kullanımı Programlama Dilleri 1 33