C ile oluþum (composition)

Yazan: Þadi Evren ÞEKER

Oluþum Composition, bir þeyin ufak parçalarýn bir araya getirilmesi ile oluþturulmasý anlamýna gelmektedir. Buna göre örneðin bir araba, motor, koltuklar, tekerlekler vs. gibi parçalardan oluþmaktadýr.

Programlama dillerinde modellenmek istenen varlýk alt varlýklara bölünebiliyorsa, composition kullanýlarak modellenebilir. Bu yaklaþým nesne yönelimli programlama dillerinin temelini oluþturmaktadýr. Ancak nesne yönelimli olmayan C gibi dillerde de sýnýrlý da olsa destek bulunmaktadýr.

Örneðin öðrenci veritabaný üzerinde çalýþan bir C programý yazýlmak istensin. Öðrenci tanýmý muhtemelen insan (isim, soyisim, yaþ vs.)  ve ders (kredisi, dersin adý, bölümü  vs) bilgilerini içeren bir taným olacak. Bu durumda öðrenci ders ve insan bilgilerinden oluþacaktýr.

 

C dilinde ilkel veri yapýlarýnýn (primitive data structures) üzerine kurulan ve kullanýcý tarafýndan tanýmlanabilen yapýlar için struct kelimesi kullanýlýr. Programcý tanýmladýðý yapýlarý (struct) daha ileride yeni yapýlar (struct) içerisinde de ilkel veri yapýsý gibi kullanabilir.

 

Aþaðýda örnek yapý (struct) kullanýmý verilmiþtir:

typedef struct {
  int yas;
  char *isim;
  enum { bay, bayan } cinsiyet;
} Insan;

 

Yukarýdaki örnekte bir insan tipi tanýmlanmýþ ve bu tipin özellikleri olarak , yaþ, isim ve cinsiyet belirtilmiþtir. Artýk insan yapýsýnda olan deðiþkenlerin bu bilgilerine eriþilip istenilen veriler atanabilir.

Örnek:

 

Insan ali;
ali.yas=18;
ali.isim=”Ali Yildiz”;
ali.cinsiyet=bay;

 

Yukarýda tanýmlanan yapý için ayný zamanda pointer (gösterici) kullanmak da mümkündür. Bu durumda:

 

Insan *ali;
ali->yas=18;
ali->isim=”Ali Yildiz”;
ali->cinsiyet=bay;

 

þeklinde pointer eriþimi yapmak gerekir. Bir yapý, fonksiyonlara parametre olarak geçirilirken de bu özelliðinden faydalanýlýr.

 

void yaslandir(Insan *yaslanacakInsan)
{
        yaslanacakInsan->yas++;
}

 

Yukarýda referans ile çaðýrma (call by reference) kulanýldýðý için ayrýca yapýnýn dönmesi gerekememiþtir.

 

Bir yapýnýn içerisinde farklý yapýlar da kullanýlabilir. Örneðin yazýnýn baþlarýnda geçen öðrencinin insan ve ders bilgileri olmasý durumunu ele alalým ve eksik olan ders yapýsýný tanýmlayalým:

 

typedef struct {
  int kredi;
  char *isim;
} Ders;

 

Þimdi yukarýdaki insan ve ders yapýlarýný birleþtirerek öðrenci tanýmlayabiliriz:

 

typedef struct {
  Ders *alinanDers;
  Insan *kisiselBilgi;
  Char *bolumu;
} Ogrenci;

 

Yukarýdaki yapýda öðrenci tanýmlanmýþ ve bir öðrencinin ders tipinden alinanders’i insan tipinden kisiselbilgileri ve ilkel tipten (char) bolumu tanýmlanmýþtýr. Artýk aþaðýdaki eriþimler mümkündür:

 

Ogrenci ali;
ali.alinanDers->kredi=3;
ali.alinanDers->isim=”C ile programlama”;
ali.kisiselBilgi->yas=18;
ali.bolumu=”Bilgisayar Muhendisligi”;

 

Yukarýdaki örnekte olduðu üzere bir yapýdan baþka yapýlarýn kullanýlmasýna nesne yönelimli programlamada bütünleþtirme (aggregation) adý da verilmektedir.

 

Örnek bir linked list yapýsý:

 

typedef struct{

            int value;

            node *next;

}node;

 

Örnek bir aðaç yapýsý:

teypedef struct{

            int value;

            node *left;

            node *right;

}node;

 

 

Bir linked list elemanlarýna veri koyan ve verileri ekrana basan kod örneði:

 

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

struct lnode{

            int value;

            lnode *next;

};

 

typedef lnode node;

 

int main(){

            node root;

            node *a;

            a=&root;

            for(int i = 0;i<10 ; i++){

                        a->value=i;

                        a->next= (node* ) malloc(sizeof(node));

                        a=a->next;

            }

 

            // ekrana basan kod:

            a=&root;

            for(int i = 0 ;i<10;i++){

                        printf("%d\n",a->value);

                        a=a->next;

            }

            getch();

}