C Programlama Dili'ne Giriş

  Dersler
* Önsöz

* Giriş
* Veri Tipleri, Değişkenler
* Operatörler
* Temel G/Ç Fonksiyonları
* Temel Kütüphane Fonksiyonları
* Karşılaştırma Deyimleri
* Döngüler
* Fonksiyonlar I
* Fonksiyonlar II
* Diziler
* Gösterici (Pointer) Kavramı
* Katarlar (Stringler)
* Dinamik Bellek Yönetimi
* Gösterici Uygulamaları
* Yapılar ve Birlikler
* Dosya Yönetimi
* Bit Düzeyinde Çalışmak
* Port Denetimi
* Grafik Kullanımı
* C Makroları

* Kısaca C++
* Derleme Seçenekleri
* Tarih-Saat Fonksiyonları
* Monte-Carlo Yöntemleri
* Fortran ve C

* Yararlanılan Kaynaklar

  C/C++ Derleyicileri
* Dev-C++
* Salford (silversoft FTN95)
* GCC
* Turbo C
* Eclipse IDE
* NetBeans IDE

  Dış Bağlantılar
* programlama.com
* C Programcıları Derneği

* C (wikipedia)
* C++ (wikipedia)
* cplusplus.com
* koders.com
* Hot scripts

 

Ders 15: Yapılar ve Birlikler

###################- (%95)

En son güncelleme: Wed, 30 Nov 2011 13:22:02 +0200

Giriş

C, kullanıcının kendi veri tipini tanımlamasına müsaade eder. Bu kısımda böyle veritiplerinin nasıl oluşturulacağı anlatılacaktır.


15.1   enum Deyimi (Enumeration Constants)

Bu tip, değişkenin alabileceği değerlerin belli (sabit) olduğu durumlarda programı daha okunabilir hale getirmek için kullanılır. Genel yazım biçimi:

       enum tip_adı{değer_1, değer_2, ..., değer_n} değişken_adı;

tip_adı programcı tarafından verilen tip ismidir. değişken_adı ise program içinde kullanılacak olan değişkenin adıdır. Eğer kullanılmazsa program içinde daha sonra enum ile birlikte kullanılır. Örneğin:

       enum bolumler{programcilik, donanim, muhasebe, motor};

tanımı ile derleyici programcilik için 0, donanim için 1, muhasebe için 2 ve motor için 3 değerini kabul ederek atamaları buna göre yapar. Değişken adı bildirilirse daha sonra enum kullanmaya gerek kalmaz. Örneğin:

       enum renkler {kirmizi, mavi, sari} renk;
       enum gunler  {pazartesi, sali, carsamba, persembe, cuma, cumartesi, pazar};

gibi yapılan sabit tanımlamaları program içinde kullanılabilir:

       enum bolumler bolum;
       enum gunler gun;

       ...

       bolum = muhasebe; /* bolum = 2 anlamında */
       gun   = cuma;     /* gun   = 4 anlamında */
       renk  = kirmizi;  /* renk  = 0 anlamında */

Program 15.1 enum anahtar kelimesinin basit kullanımları gösterilmiştir.

Program 15.1: enum kullanımı
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
/* 15prg01.c: Klavyeden girilen bir sayının tek olup olmadığını sınar */

#include <stdio.h>

enum BOOLEAN{ FALSE, TRUE };  /* 0, 1 */

int tek(int n){ return (n % 2);  }

int main()
{
    enum BOOLEAN sonuc;
    int x;

    printf("Bir sayi girin: ");
    scanf("%d",&x);

    sonuc = tek(x);   /* tek mi? */

    if( sonuc == TRUE )
         puts("Girilen sayi tek ");
    else
         puts("Girilen sayi cift");

  return 0;
}

ÇIKTI

Bir sayi girin: 5
Girilen sayi tek

enum bloğu içinde tanımlanmış değişkenlerin sahip sabit olacağı değerler Program 15.2 olduğu gibi programcı tarafından belirlenebilir.

Program 15.2: enum kullanımı
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
/* 15prg02.c: Beş sabit bölüm için enum kullanımı */

enum bolumler{
   programcilik = 1,  /* 1 */
   donanim,           /* 2 */ 
   muhasebe,          /* 3 */
   motor,             /* 4 */
   buro               /* 5 */
} bolum;

int main()
{
    bolum = donanim;

    printf("bolum : %d\n",bolum);

    bolum += 2;  /* bolum = motor */

    printf("Yeni bolum : %d\n",bolum);

 return 0;
}

ÇIKTI

bolum : 2
Yeni bolum : 4


15.2   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. Bir yapı içerisindeki elemanlara üye (member) denir. Üyelerin herbiri farklı veri tipine sahip olabilir. 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 aşağıdaki gibi toplanabilir:

       /* kayit veri tipi! */
       struct kayit{
          /* üyeler */
          char  ad[10];
          long  no;
          short sinif;
       };

Bu tipte bir değişken tanımlama:

       struct kayit ogr1, ogr2;

şeklinde olabilir. 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 15.3, ve 15.4'de gösterilmiştir. Inceleyiniz.

Program 15.3: struct deyiminin kullanımı
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
/* 15prg03.c 
   Bir öğrenciye ait bilgilerin struct deyimi ile bir çatı altında toplanması  */

#include <stdio.h>

/* kayit yapısı */
struct kayit{
    char ad[10];
    long no;
    int  sinif;
};

int main()
{
   struct kayit ogr;   /* ogr değişkeni kayit tipinde */

   printf("Ogrenci Nosu  : "); scanf("%ld",&ogr.no);
   printf("Ogrenci Adi   : "); scanf("%s" , ogr.ad);
   printf("Ogrenci Sinifi: "); scanf("%d" ,&ogr.sinif);

   printf("\n*** Girilen bilgiler ***");
   printf("\nNo    : %ld",ogr.no);
   printf("\nAdi   : %s ",ogr.ad);
   printf("\nSinifi: %d ",ogr.sinif);

 return 0;
}

ÇIKTI

Ogrenci Nosu  : 948589
Ogrenci Adi   : Ahmet
Ogrenci Sinifi: 2

*** Girilen bilgiler ***
No    : 948589
Adi   : Ahmet
Sinifi: 2

Yapılar, diğer değişkenler gibi, fonksiyonlara parametre olarak geçirelilebilir.

Program 15.4: struct deyiminin kullanımı
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
/* 15prg04.c
   Yapıların bir fonksiyona parametere olarak aktarılabilmesi */

#include <stdio.h>

struct TARIH{
    int gun,ay,yil;
};

void goster(struct TARIH x){
    printf("Tarih: %02d-%02d-%4d\n", x.gun, x.ay, x.yil);
}

int main()
{
   struct TARIH n;  /* n değişkeni TARIH tipinde */

   n.gun = 1;
   n.ay  = 8;
   n.yil = 2003;

   goster(n);

 return 0;
}

ÇIKTI

Tarih: 01-08-2003

Yapılarla da, gösterici tanımlamaları yapılabilir. Ancak, bir yapı gösteren göstericinin, gösterdiği yere yönlendirme operatörü, ->, ile erişilir.

Program 15.5: struct deyiminin kullanımı
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
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: 
/* 15prg05.c: Bir yapı gösteren gösterici */

#include <stdio.h>
#include <stdlib.h>

struct Meyve{
    float agirlik;
    float fiyat;
};

int main()
{
   struct Meyve *muz, elma;
   float muzTutar, elmaTutar;

   /* muz Meyve tipinde bir gösterici */
   muz = (struct Meyve*) malloc( sizeof(struct Meyve) );
   muz->agirlik = 2.50;
   muz->fiyat   = 3.50;
   muzTutar = muz->fiyat * muz->agirlik;

   /* elma Meyve tipinde bir değisken */
   elma.agirlik = 2.00;
   elma.fiyat   = 1.75;
   elmaTutar = elma.fiyat * elma.agirlik;

   printf("Meyve    Agırlık  Birim Fiyatı     TUTAR (TL)\n");
   printf("-----    -------  ------------    -----------\n");

   printf("Muz      %7.2f       %7.2f        %7.2f\n",
           muz->agirlik, muz->fiyat, muzTutar);

   printf("Elma     %7.2f       %7.2f        %7.2f\n",
           elma.agirlik, elma.fiyat, elmaTutar);

 return 0;
}

ÇIKTI

Meyve    Agırlık  Birim Fiyatı     TUTAR (TL)
-----    -------  ------------    -----------
Muz         2.50          3.50           8.75
Elma        2.00          1.75           3.50


15.3   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 15.4 küçük bir değişiklike Program 15.6'de yeniden yazılmıştır. Inceleyiniz.

Program 15.6: typedef - struct deyiminin kullanımı
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
/* 15prg06.c
   Yapıların bir fonksiyona parametere olarak aktarılabilmesi.
   typedef deyimi kullanıldığında struct deyimine gerek yoktur */

#include <stdio.h>

typedef struct{
    int gun,ay,yil;
}TARIH;

void goster(TARIH x){
    printf("Tarih: %02d-%02d-%4d\n", x.gun, x.ay, x.yil);
}

int main(void)
{
   TARIH n;

   n.gun = 1;
   n.ay  = 8;
   n.yil = 2003;

   goster(n);

 return 0;
}

Ç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 */

15.1   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 15.7: typedef - deyiminin kullanımı
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
/* 15prg07.c
   union x ve y nin aynı bellek alanını işgal ettiğinin kanıtı */

#include <stdio.h>

union paylas{
   int x;
   int y;
}z;

int main()
{
   int *xAdres,*yAdres;

   z.x    = 11;
   xAdres = &z.x;
   printf("x = %d   y = %d\n",z.x, z.y);

   z.y    = 22;
   yAdres = &z.y;
   printf("y = %d   y = %d\n",z.x, z.y);

   printf("xAdres = %p   yAdres = %p\n",xAdres, yAdres);

 return 0;
}

ÇIKTI

x = 11   y = 11
y = 22   y = 22
xAdres = 0x804974c   yAdres = 0x804974c



Powered by PHP