sendetiklat Sahip | Gönderilme Tarihi: 23 Kasım 2009 19:23:57
YAPILAR
Tanım
C Dilinde birden çok verinin (değişkenin) bir araya getirilmesiyle oluşturulan yeni birime (veri türüne) yapı (structure) adı verilir.
Yapı tanımlama işlemi aşağıdaki deyimler (komutlar) vasıtasıyla yapılır.
Struct
Enum
Typedef
Union
Struct deyimi
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, kullanıcı kendi tipini oluşturmuş olur.
Genel yapı bildirimi:
struct yapı_adı{
tip yapı_değişken_ismi;
tip yapı_değişken_ismi; ...
}; _
Bu tipte bir değişken tanımlama:
struct yapı_adı değişken1,değişken2,değişken n;
Örnek Tanımlama
Bir stok işleminde aşağıdaki bilgilere ihtiyaç duyulmaktadır.
Malın kod numarası
Malın adı
Malın mevcudu (kaç tane olduğu)
Malın alış fiyatı
Bu ilgilere göre yapı şu şekilde tanımlanabilir.
1. Tanımlama
struct {
int kodno;
char malin_adi[30];
int mal_mevcudu;
float alis_fiyati;
} mal1,mal2;_
Yapıya başlangıç değeri verme
C dilinde temel yapı türlerini temsil eden değişkenlere ve dizilere başlangıç değeri verilebileceği gibi yapı elemanlarına da başlangıç değeri verilebilir.
Aşağıdaki örnekte mal2 adlı değişkene başlangıç değeri verilmektedir.
struct {
int kodno;
char malin_adi[30];
int mal_mevcudu;
float alis_fiyati;
} mal1, mal2 = {251, "Buzdolabı", 12, 1500000};_
Bu bildirim, mal1 adlı değişkene başlangıç değeri vermezken, mal2 adlı değişkenin temsil ettiği nesnenin kodnosunun 251, adının buzdolabı, stoktaki mevcudunun 12, alış fiyatının 1500000 olduğu belirlenmiş olur.
Yapı elemanlarına erişim
Bir yapıyı temsil eden değişkenlere, başlangıçta değer vermek yerine program çalışırken değer vermek yada verilen değerleri değiştirmek gerekebilir. Bu nedenle, yapıyı temsil eden değişkenlerin elemanlarına istediğimiz her an erişebilmemiz gerekir. Bunun için bileşenleri birer değişken olarak kullanabilmemiz gerekir. Bunu sağlamak için, yapıyı temsil eden değişken adı yazılır, araya nokta (.) konulur, sonra bileşen adı yazılır. Örneğin, önceki slaytlarda tanımlanan yapıyı temsil eden mal1 değişkenine değer vermek için aşağıdaki kodlar kullanılır.
mal1.kodno = 555;
mal1.malin_adi = "Sandalye";
mal1.mal_mevcudu = 126;
mal1.alis_fiyati = 215;_
Yapı elemanlarına erişim-2
Önceki slayttaki bilgiler göz önünde bulundurularak
int n;
n=mal1.mal_mevcudu;
N değişkeninin değeri 256 olur.
mal2.malin_adi = mal1.malin_adi;
mal2.malin_adi değeri Sandalye olacaktır
Yapıya pointer değişken ile ulaşma
struct katalog {
int kodno;
char malin_adi[30];
int mal_mevcudu;
float alis_fiyati;
} ;
main(){
struct katalog mal1, mal2,*p; //p değişkeni pointer tipinde bir yapı değişkeni olmuştur.
*p=mal1; //p pointeri mal1 adlı struct tipinde bir değişkeni işaret etmektedir.
p->kodno=555; //p pointerinin işaret ettiği yapının kodno elemanına 555 değeri aktarılıyor.
printf("malın kodu:%d",p->kodno); //p pointerinin işaret ettiği yapının kodno elemanının
// değeri ekrana yazdırılıyor.
}_
Bir yapı içinden başka bir yapı çağırma
#include <stdio.h>
#include <conio.h>
main(){
struct pers{
char soyad[20];
char ad[20];
int sicilno;
int derece;
};
struct maas{
struct pers personel;
double maas;
};
struct maas pers_maas;
strcpy(pers_maas.personel.ad,"Ali");
strcpy(pers_maas.personel.soyad,"Ak");
pers_maas.personel.sicilno=101;
pers_maas.personel.derece=9;
pers_maas.maas=1500;
printf("Personel Adı:%s\n",pers_maas.personel.ad);
printf("Personel Adı:%s\n",pers_maas.personel.soyad);
printf("Personel SicilNo:%d\n",pers_maas.personel.sicilno);
printf("Personel Derece:%d\n",pers_maas.personel.sicilno);
printf("Personel Maaşı:%3.0f\n",pers_maas.maas);
getchar();
}_
Yapıların Dizi şeklinde tanımlanması
#include <stdio.h>
#include <conio.h>
main(){
struct pers {
char soyad[20];
char ad[20];
int sicilno;
int derece;
double maas;
};
struct pers pers_maas[3];
strcpy(pers_maas[0].ad,"Ali");
strcpy(pers_maas[0].soyad,"Ak");
pers_maas[0].sicilno=101;
pers_maas[0].derece=9;
pers_maas[0].maas=1500;
printf("Personel Adı:%s\n",pers_maas[0].ad);
printf("Personel Adı:%s\n",pers_maas[0].soyad);
printf("Personel SicilNo:%d\n",pers_maas[0].sicilno);
printf("Personel Derece:%d\n",pers_maas[0].sicilno);
printf("Personel Maaşı:%3.0f\n",pers_maas[0].maas);
getchar();
}_
Örnek
3 kişilik bir sınıfta öğrencilerin numara, ad, soyad, vize,final ve ortalama bilgiler bir yapı değişkeninde tutuluyor. Bu öğrencilerin ortalamalarını fonksiyon yardımıyla hesaplayıp sonuçları ile beraber ekrana yazan program.
Enum deyimi
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 şu şekildedir:
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 sıfır(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};
Örnek:
#include <stdio.h>
enum bolumler{
programcilik = 1, /* 1 */
donanim, /* 2 */
muhasebe, /* 3 */
motor, /* 4 */
buro /* 5 */
} bolum;
main()
{
bolum = donanim;
printf("bolum : %i\n",bolum);
bolum += 2; /* bolum = motor */
printf("Yeni bolum : %i\n",bolum);
system("pause");
}_
Örnek:Klavyeden girilen sayının tek mi çift mi olduğunu bulan program
#include <stdio.h>
enum BOOLEAN{ FALSE, TRUE }; /* 0, 1 */
int tek(int n){
return (n % 2);
}
main()
{
enum BOOLEAN sonuc;
int x;
printf("Bir sayi girin: ");
scanf("%d",&x);
sonuc = tek(x); /* tek mi? */
if( sonuc == TRUE ) // if( sonuc == 1 )
puts("Girilen sayi tek ");
else
puts("Girilen sayi cift");
system("pause");
}_
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.
#include <stdio.h>
typedef struct kayit{
char ad[10];
int no;
short sinif;
} ogr1,ogr2;
main(){
ogr1 ogr;
ogr.no = 101;
printf("Öğreni No:%i",ogr.no);
system("pause");
}_
Union deyimi
Kullanımı struct komutuna benzeyen union deyiminde tanımlanan değişkenler için ortak bir yer ayrılır. Değişkenlerden hangisinin boyutu büyükse o kadar yer ayırır.
Örnek:
#include <stdio.h>
union paylas{
char kr;
int x;
double y;
}z;
main()
{
z.kr='A';
z.x=12;
z.y=15000;
printf("z-->kr:%c\n",z.kr);
printf("z-->x:%d\n",z.x);
printf("z-->y:%.0lf\n",z.y);
system("pause");
}_
|