Oluşum (Composition) ve Struct (yapılar)
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
#include
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;
}
}
« referans ile çağırma (call by reference) | İşlemler arası iletişim (Inter process communication (IPC)) »
Yorumlar
Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Oluşum (Composition) ve Struct (yapılar)' isimli yazı 08 Nov 2007 tarihinde, saat: 03:45 'de �adi Evren �EKER tarafından gönderilmiş, toplam 1088 defa okunmuştur.
Benzer yazıları C/C++, Nesne Yönelimli Programlama, Programlama Dilleri, veri yapıları kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Sıralama işleminiz poligonu...
- Şadi Evren ŞEKER: bahsettiğiniz sıralama algoritması...
- Abdurrahman ulusoy: merhaba hocam. gelişigüzel...
- Oguz Okutan: Merhaba hocam.. Fonksiyonlarda degere göre...
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
Yakın Yazılar
Paralel Diziler (Parallel Arrays)
Oluşum (Composition) ve Struct (yapılar)
Birliktelik, Münasebet ve Oluşum (Association, Aggregation and Composition)
Seçerek Sıralama (Selection Sort)
Yığınlama Sıralaması (Heap Sort)
Birleştirme Sıralaması (Merge Sort)
Öğrencinin GPA’ini hesaplayan kod
Binary Search Tree’yi Inorder olarak dolaşan Kod
Anlamsal Ağlar (Semantic Network)
Abstract Data Type (ADT - Soyut Veri Tipleri)
Bağlantılar
[...] dilinde bir ikili ağacı ifade edecek struct aşağıdaki şekilde [...]
hocam ben structures ile ilgili bir sorum olucak.
struct ogrenci {
char *isim;
char *soyisim;
int numara;
};
int main() {
struct ogrenci lokal;
lokal.isim = “fatih”;
lokal.soyisim = “kabakci”;
lokal.numara =80502031;
printf(”Adi:%s\n”,lokal.isim);
printf(”Soyadi:%s\n”,lokal.soyisim);
printf(”%d”,lokal.numara);
getch();
}
ben bu kodda typedef i kullanmadim ve bu sekildede yapilar konusundaki yaptigim alistirmalarda bu sekildeki varyasyonlarla yaziyorum. ‘typedef’ in kullanmakla kullanmamak arasinda bir fark varmidir?
typedef komutu, bir yapıdan yeni bir tip tanımlamaya yarar. Örneğin sizin verdiğiniz kodda ogrenci yapısında tanım yapmak için her seferinde “struct ogrenci” yazmak gerekir. Nitekim kodunuzda bir değişken tanımlarken
struct ogrenci lokal;
şeklinde yazmışsınız. Oysaki typedef komutu ile bu tanımlama tek kelimeye indirilebilir.
Bir kereye mahsus
typedef ogrenci ogr;
yazılması yeterlidiri. Artık bu satırdan sonra her tanımlamada sadece ogr tipi kullanılabilir ve
ogr lokal;
şeklinde tanım yapmak mümkündür.
Kısacası typedef size yeni bir tip tanımlamaktan fazla birşey sunmaz. Kodlamada kolaylık sağlar ve istenirse kullanılmayabilir.
başarılar