Yapı, struct Deyimi (Structures) Aralarında mantıksal bir ilişki bulunan farklı türden bilgiler "yapılar (structures)" içerisinde mantıksal bir bütün olarak ifade edilebilir. Yapılar diziler gibi bellekte sürekli kalır. Programcı yapı bildirimini tanıttktan sonra, o yapı türünden bir değişken tanımlayabilir. Bu sayede kendi tipinizi üretebilirsiniz. Genel yapı bildirimi:
struct
yapı_adı{
tip yapı_değişken_ismi;
tip yapı_değişken_ismi;
...
};
NOT
enum ile sabit bildirimi yapılırken struct ile değişken bildirimi yapılır.
Bir öğrenciye ait bilgileri bir çatı altında toplamak için:
struct kayit{
char ad[10];
long no;
short sinif;
};
Bu tipte bir değişken tanımlama:
struct kayit ogr1,ogr2;
şeklinde olmalıdır. ogr1 değişkeni ile tanımlanan 1. öğrencinin numarasına bir değer atama işlemi:
ogr1.no = 2012597;
şeklinde yapılır. Bu deyimin kullanımı Program 14.5,6,ve 7'de gösterilmiştir. Inceleyiniz.
Program 14.5: struct deyiminin kullanımı
[color=gray] 1: /* 14prg05.c:
2: Bir öğrenciye ait bilgilerin struct deyimi ile bir çatı altında toplanması */ 3: 4: #include <stdio>
5: 6: struct kayit{
/* kayit yapısı */ 7: char ad[10];
8: long no;
9: int sinif;
10: };
11: 12: void main(void)
13: {
14: struct kayit ogr;
/* ogr değişkeni kayit tipinde */15: 16: printf("Ogrenci Nosu : "); scanf("%ld",&ogr.no);
17: printf("Ogrenci Adi : "); scanf("%s" , ogr.ad);
18: printf("Ogrenci Sinifi: "); scanf("%d" ,&ogr.sinif);
19: 20: printf("\n*** Girilen bilgiler ***");
21: printf("\nNo : %ld",ogr.no);
22: printf("\nAdi : %s ",ogr.ad);
23: printf("\nSinifi: %d ",ogr.sinif);
[color:f6b3=gray:f6b3]24: }
DERLEME ve ÇALIŞTIRMA Turbo C (MS DOS)
GCC (Linux)
C:\TC> tcc 14prg05.c
C:\TC> 14prg05
$ gcc 14prg05.c -o 14prg05
$ ./14prg05
ÇIKTI
Ogrenci Nosu : 948589
Ogrenci Adi : Ahmet
Ogrenci Sinifi: 2
*** Girilen bilgiler ***
No : 948589
Adi : Ahmet
Sinifi: 2
Program 14.6: struct deyiminin kullanımı
[color=gray] 1: /* 14prg06.c:
2: Yapıların bir fonksiyona parametere olarak aktarılabilmesi */ 3: 4: #include <stdio>
5: 6: struct TARIH{
7: int gun,ay,yil;
8: };
9: 10: void goster(struct TARIH x){
11: printf("Tarih: %02d-%02d-%4d\n",x.gun,x.ay,x.yil);
12: }
13: 14: void main(void)
15: {
16: struct TARIH n;
/* n değişkeni TARIH tipinde */17: 18: n.gun = 1;
19: n.ay = 8;
20: n.yil = 2003;
21: 22: goster(n);
[color:f6b3=gray:f6b3]23: }
DERLEME ve ÇALIŞTIRMA Turbo C (MS DOS)
GCC (Linux)
C:\TC> tcc 14prg06.c
C:\TC> 14prg06
$ gcc 14prg06.c -o 14prg06
$ ./14prg06
ÇIKTI
Tarih: 01-08-2003
Program 14.7: struct deyiminin kullanımı
[color=gray] 1: /* 14prg07.c:
[color=gray] 2: İlk hızı ve atis acisi verilen bir topun eğik atış
[color:f6b3=gray:f6b3] 3: hareketi simulasyonu. */
4: 5: #include <stdio>
6: #include <math>
7: 8: #define PI 3.141593
/* pi sayısı */ 9: #define g 9.81
/* yerçekim ivmesi */10: 11: struct NOKTA{
12: float x,y;
13: } top;
14: 15: void main(void)
16: {
17: float v0,aci,t;
18: 19: printf("Ilk hiz (m/s): "); scanf("%f",&v0);
20: printf("Aci (derece): "); scanf("%f",&aci);
21: 22: t = 0.0;
23: aci *= PI/180.0;
/* radyana çevir */24: 25: do{
26: top.x = v0*cos(aci)*t;
/* hareket denklemleri */27: top.y = v0*sin(aci)*t-0.5*g*t*t;
28: 29: printf("%5.1f %7.3f %7.3f\n",t,top.x,top.y);
30: 31: t += 0.1;
/* zamanı 0.1 saniye arttır */32: 33: }while(top.y>=0.0);
/* top havada kaldığı sürece! */34: [color:f6b3=gray:f6b3]35: }
DERLEME ve ÇALIŞTIRMA Turbo C (MS DOS)
GCC (Linux)
C:\TC> tcc 14prg07.c
C:\TC> 14prg07
$ gcc 14prg07.c -o 14prg07
$ ./14prg07
ÇIKTI
Ilk hiz (m/s): 8
Aci (derece): 60
0.0 0.000 0.000
0.1 0.400 0.644
0.2 0.800 1.189
0.3 1.200 1.637
0.4 1.600 1.986
0.5 2.000 2.238
0.6 2.400 2.391
0.7 2.800 2.446
0.8 3.200 2.403
0.9 3.600 2.262
1.0 4.000 2.023
1.1 4.400 1.686
1.2 4.800 1.251
1.3 5.200 0.717
1.4 5.600 0.086
1.5 6.000 -0.644
typedef Deyimi struct ile oluşturulan yapıda typedef deyimi kullanılırsa, bu yapıdan değişken tanımlamak için tekrar struct deyiminin kullanılmasına gerek kalmaz.
typedef struct kayit{
char ad[10];
long no;
short sinif;
} ogr1,ogr2;
Program 14.6 küçük bir değişiklike Program 14.8'de yeniden yazılmıştır. Inceleyiniz.
Program 14.8: typedef - struct deyiminin kullanımı
[color=gray] 1: /* 14prg08.c:
[color=gray] 2: Yapıların bir fonksiyona parametere olarak aktarılabilmesi
[color:f6b3=gray:f6b3] 3: typedef deyimi kullanıldığında struct deyimine gerek yoktur */
4: 5: #include <stdio>
6: 7: typedef struct{
8: int gun,ay,yil;
9: }TARIH;
10: 11: void goster(TARIH x){
12: printf("Tarih: %02d-%02d-%4d\n",x.gun,x.ay,x.yil);
13: }
14: 15: void main(void)
16: {
17: TARIH n;
18: 19: n.gun = 1;
20: n.ay = 8;
21: n.yil = 2003;
22: 23: goster(n);
[color:f6b3=gray:f6b3]24: }
DERLEME ve ÇALIŞTIRMA Turbo C (MS DOS)
GCC (Linux)
C:\TC> tcc 14prg08.c
C:\TC> 14prg08
$ gcc 14prg08.c -o 14prg08
$ ./14prg08
ÇIKTI
Tarih: 01-08-2003
typedef başka kullanımı da vardır. C dilinde program kodları bu deyimle tamamen türkçeleştirilebilir. Örneğin bu deyim:
typedef int tamsayi;
şeklinde kullanılırsa programda daha sonra int tipinde bir değişken tanımlarken şu biçimde kullanılmasına izin verilir.
tamsayi x,y; /* int x,y anlaminda */
Birlik, union Deyimi Birlikler de yapılar gibi sürekli belleğe yerleşen nesnelerdir. Birlikler yapılara göre seyrek kullanılır. Bir programda veya fonksiyonda değişkenlerin aynı bellek alanını paylaşması için ortaklık bildirimi union deyimi ile yapılır. Bu da belleğin daha verimli kullanılmasına imkan verir. Bu tipte bildirim yapılırken struct yerine union yazılır. Genel yazım biçimi:
union
birlik_adı{
tip birlik_değişken_ismi;
tip birlik_değişken_ismi;
...
};
union paylas{
float f;
int i;
char kr;
};
Yukarıdaki bildirim yapıldığında, değişkenler için bellekte bir yer ayrılmaz. Değişken bildirimi:
union paylas bir,iki;
şeklinde yapılır. Üyelere erişmek aşağıdaki gibi olur: bir.kr= 'A';
iki.f = 3.14;
bir.i = 2000;
Program 14.9: union deyiminin kullanımı
[color=gray] 1: /* 14prg09.c: union x ve y nin aynı bellek alanını işgal ettiğinin kanıtı */ 2: 3: #include <stdio>
4: 5: union paylas{
6: int x;
7: int y;
8: }z;
9: 10: void main(void)
11: {
12: int *X,*Y;
13: 14: z.x = 10;
15: X = &z.x;
16: printf("\nTamsayi(x) = %d - bellek adresi %X",z.x,X);
17: 18: z.y = 20;
19: Y = &z.y;
20: printf("\nTamsayi(y) = %d - bellek adresi %X",z.y,Y);
[color:f6b3=gray:f6b3]21: }
DERLEME ve ÇALIŞTIRMA Turbo C (MS DOS)
GCC (Linux)
C:\TC> tcc 14prg09.c
C:\TC> 14prg09
$ gcc 14prg09.c -o 14prg09
$ ./14prg09
ÇIKTI
Tamsayi(x) = 10 - bellek adresi DF23
Tamsayi(y) = 20 - bellek adresi DF23