-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDers 20 - enum struct union.c
More file actions
152 lines (133 loc) · 5.58 KB
/
Copy pathDers 20 - enum struct union.c
File metadata and controls
152 lines (133 loc) · 5.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <stdio.h>
#include <stdlib.h>
/* "enum: enumerations , numaralandırmalar"
numaralandırmalar kod karmaşasını önlemek ve kod okunurluğunu artırmak için bir sürü int değişkeninin bir araya gelmesiyle oluşturulmuş bir yapıdır
şu ana kadarki diğer fonksiyon ve yapıların aksine enum yapısı "int main() { }" kalıbının dışına yazılır
genel syntax'ı enum enum_adı aç süslü parantez değerler kapa süslü parantez ==> enum enum_adi { degiskenadi1,degiskenadi2,degiskenadi3 }; (if,else,while,for,switch case,... aksine sonuna ";" konmalı)
enum içerisine yazılan değerler default olarak int değişkeni kabul edilir
enum içerisindeki değişkenlere değer verilmezse, değerler default olarak 0'dan başlar ve bir bir artar (nasıl "int a"da a'ya değer atamazsan, bilgisayar onu default olarak 0 alır)
enum sehirler
{
hatali,Adana,Adiyaman,Afyon,Agri,Aksaray,Amasya,Ankara,Antalya,Ardahan,Artvin,Aydin,Balikesir,Bartin,Batman
};
int main() {
enum sehirler il1,il2,il3;
il1=Ankara;
il2=Ardahan;
il3=Batman;
printf("Ankara alfabetik siralamada %d. il\n",il1);
printf("Ardahan alfabetik siralamada %d. il\n",il2);
printf("Batman alfabetik siralamada %d. il\n",il3);
}
"struct: structure , yapı"
tıpkı enum gibi birden çok değişkenin bir araya getirilmesiyle oluşturulan yeni birime "structure" (yapı) adı verilir
yapılar aynı enum gibi "int main() { }" kalıbının dışına yazılır ve genel syntax'ı ise aşağıdaki gibidir:
struct struct_adi {
degiskenturu1 degiskenadi1;
degiskenturu2 degiskenadi2;
degiskenturu3 degiskenadi3;
}; enum'un aksine değişkenler int olmak zorunda değildir, bütün değişken türleri struct'ın içine yazılabilir
struct kitapbilgi
{
char kitapad[20],yazar[20];
int fiyat;
float puan;
};
int main() {
struct kitapbilgi kb={"Seker Portakali","Vasconcelos",10,7.25}; //kitapbilgi adlı struct'a ait kb adlı bir nesne oluşturdum
printf("Kitap Adi: %s\n",kb.kitapad);
printf("Yazar: %s\n",kb.yazar);
printf("Fiyat: %d TL\n",kb.fiyat);
printf("Puan: %.2f/10",kb.puan);
}
struct kayit {
char ad[50];
int no,sinif;
float ort;
};
int main() {
struct kayit ogr;
printf("Ad Soyad: ");
gets(ogr.ad);
printf("Ogrenci No: ");
scanf("%d",&ogr.no);
printf("Sinifi: ");
scanf("%d",&ogr.sinif);
printf("Donem Sonu Ortalamasi: ");
scanf("%f",&ogr.ort);
printf("\n\n%s\n%d\n%d\n%.4f",ogr.ad,ogr.no,ogr.sinif,ogr.ort);
return 0;
}
nested structure'ları (iç içe yapı) da bir inceleyelim
nasıl çok boyutlu dizilerde bir boyut içeri girmek için yeni süslü parantez açılıyorsa iç içe yapılarda da bir içerideki yapıya erişmek için yeni süslü parantez açılır
struct Adres {
char sehir[20];
char semt[20];
int kapiNo;
};
struct Employee {
int id;
int maas;
char isim[30];
char departman[30];
struct Adres adresim;
};
void showInfo(struct Employee emp) {
printf("***** %s *****\nID: %d\nMaas: %d TL\nDepartman: %s\nSehir: %s\nSemt: %s\nKapi No: %d\n\n", emp.isim, emp.id, emp.maas, emp.departman, emp.adresim.sehir, emp.adresim.semt, emp.adresim.kapiNo);
}
int main() {
struct Employee Ertugrul={3169,2500,"Ertugrul Tatli","temizlik isleri",{"Istanbul","Bebek",16}};
struct Employee Aras={1337,100000,"Prof. Dr. Aras Gungore","CEO",{"Los Angeles","Hollywood",2}};
showInfo(Ertugrul);
showInfo(Aras);
}
"union: bileşim"
union'lar, struct ve enum'dan farksız olarak main fonksiyonunun dışında tanımlanırlar ve genel syntax'ları struct'ınki ile aynıdır:
union union_adi {
degiskenturu1 degiskenadi1;
degiskenturu2 degiskenadi2;
degiskenturu3 degiskenadi3;
};
union'lar aynı işlem satırlarında bahsi geçen değişkenler dışında kalan değerleri istendiği şekilde ekrana yazmaz
çünkü aynı bileşim içinde yer alan değişkenlerden aynı anda sadece bir tanesi ayrılan bellek bölgesini kullanabilir
union yunyon1 {
int id1;
double dd1;
char cd1;
} ud1; //yunyon1 adlı union'a ait ud1 diye bir nesne oluşturdum
int main() {
ud1.id1=21;
ud1.cd1='A';
printf("%d %c\n", ud1.id1, ud1.cd1); //sadece 'A' karakterini iki belirteçte de göstermeye çalışır, "65 A"
ud1.id1=120;
printf("%d %c\n", ud1.id1, ud1.cd1); //sadece 120 değerini iki belirteçte de göstermeye çalışır, "120 x"
ud1.dd1=34.75;
printf("%d %.2f", ud1.id1, ud1.dd1); //sadece 34.75 değerini iki belirteçte de göstermeye çalışır, "0 34.75"
}
"data alignment: verileri sıralamak" "padding: doldurma"
yapı içinde yer alan her bir eleman yapı boyutuna kendi boyutu kadar (veya daha fazla) ekleme yaparken bileşim içindeki elemanlar bileşim boyutuna ekleme yapmaz
bileşimin boyutu, bileşim içinde yer alan en büyük boyuta sahip elemanın boyutuna eşittir
ilaveten, yapımız farklı veri türlerinden oluşuyorsa yapımızın boyutu genellikle verilerin boyutları toplamından daha fazladır
çünkü compiler yapıdaki verileri belleğe kaydederken bu verileri sıralamak (data alignment) için bellek adresleri arasına boş gözler (byte) koyar, bu olaya padding (doldurma) adı verilir */
struct yap1 {
int id1;
int id2;
int id3; //sizeof(int)=4 id1,id2: xxxx,xxxx,
double dd1; //sizeof(double)=8 id3: xxxx,0000, 4 byte doldurma
char cd1; //sizeof(char)=1 dd1: xxxxxxxx,
char cd2; // cd1,cd2,cd3: x,x,x,00000 5 byte doldurma
char cd3;
} yd1; //Yapı boyutu=8+8+8+8="32"
union bir1 {
int id1;
int id2;
int id3;
double dd1;
char cd1;
char cd2;
char cd3;
} bd1; //Bileşim boyutu: sizeof(double)="8"
int main() {
printf("Yapi boyutu: %d\nBilesim boyutu: %d",sizeof(yd1),sizeof(bd1));
return 0; //sizeof(struct yap1) ve sizeof(union bir1) de yazılabilirdi
}