|
C Dilindeki Veri Yapılarına Giriş (STRUCT, UNION, ENUM) |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bu makalede C dilinde, structure, union, enum,
coercion vs. gibi veri yapıları kavramlarının nasıl yaratıldığını ve kullanıldığını sizlere anlatacağım.
Yapılar(Structures)
Yapılar Pascaldaki recordlara benzer.
Örneğin;
struct kitap
{
char ad[50];
int sayfa;
int basimsayi;
};
struct kitap ornek1;
|
Kod parçası kitap adlı bir yapı yaratır ve bu yapının ornek1 adında bir orneğini oluşturur.
Burada ornek1, } ile ; arasına yazılarak da tanımlanabilirdi:
Struct kitap
{
char ad[50];
int sayfa;
int basimsayi;
} ornek1;
|
Yapılara tanımlanırken de değer atanabilir.
Örneğin :
struct kitap ornek1={"C Programlama",300,7};
Bu satır ornek1in C Programlama adında, 300 sayfalık ve 7. Basımını yapmış bir kitabı temsil ettiğini gösterir.
Yapının bir elemanına ulaşmak istendiğinde "." kullanılır. Örneğin ornek1in basım sayısının değerini atamak için;
gibi bir erişim kullanabilirsiniz.
Yeni Veri Tipleri Yaratmak
Typedef komutu da yapılarla birlikte kullanılabilir.
Örneğin;
typedef struct kitap
{
char ad[50];
int sayfa;
int basimsayi;
} ornek1;
kitap ornek1={"C Programlama",300,7};
|
kodu, kitap adında yeni bir yapı oluşturup ornek1 adında bir örneğini yaratır.
Typedef kullanılmasının structdan farkı, tanımlama esnasında
structda "struct kitap ornek1;" diye yazarken typedef ile tanımlandığında
"kitap ornek1;" şeklinde bir tanımlama
yapabilimeye olanak vermesidir. Bunun sebebi de typedef kullanıldığında, yeni bir yapı değil, yeni bir veri tipi yaratmış olmamızdır.
Bu
yüzden
nasıl bir tamsayı tanımlıyorsanız, benzer şekilde bir kitap tipinde değişken tanımlayabilmekteyiz.
C de ayrıca vektörlü(dizi) yapılara da izin verilir:
typedef struct kitap
{
char ad[50];
int sayfa;
int basimsayi;
} ornek1;
kitap ornek1[100]; |
Bu şekilde ornek1, 100 tane kitap değişkenini tutabilir. Bu
yapı dizisi şu şekilde kullanılabilir:
Bu kod
ornek1 vektörünün 3 nolu kitap elemanının sayfasının 100 olduğunu belirtir.
Ayrıca:
3 nolu kitabın sayfa sayısının syf adlı değişkene atanmasını sağlar.
Union Kavramı
Union, yapı (struct) kullanıma benzemekle birlikte, aralarında çok büyük bir fark vardır. O da union ile sadece bir değişken yaratılabilmesidir. Yani union ile yaratılan
bir değşken program boyunca tektir.
Örneğin:
union sayi
{
short ksayi;
long usayi;
double vsayi;
} ornek1;
|
kodu sayi adlı bir union oluşturur ve ornek1 adlı bir değişken de sayi tipindedir. ornek1in elemanlarına yapılardaki gibi erişilir:
C derleyicisi union yapılar için bellekte yer ayıracağı zaman, her zaman en geniş elemanın saklanabileceği kadar yer ayırır(yukarıdaki örnekte double için 8 byte)
Unionların kullanımını en güzel aşağıdaki örnek açıklamaktadır:
typedef struct
{
int maxyolcu;
} jet;
typedef struct
{
int kapasite;
} helikopter;
typedef struct
{
int maxyuk;
} kargoucagi;
typedef union
{
jet jetu;
helikopter helikopteru;
kargoucagi kargoucagiu;
} hava;
typedef struct
{
aractipi tip;
int hiz;
hava aciklama;
} arac;
|
Bu örnekte de görüldüğü gibi, bir aracin sadece bir aractipi olabilir: jet, helikopter, kargoucagi. Buna benzer durumlarda, kullanılması gereken en iyi taktik unionlardır.
Tip Dönüşümleri (Coercion, Type-Casting)
C tip döünüşülerine izin veren birkaç
programlama dilinden biridir.
Tip dönüşümü, bir değişkenin tipinin başka bir değişken tipine dönüştürmedir. Bu işlem ( )
operatörü ile yapılır.
Örneğin:
int tamsayi;
float ondalikli=9.87;
tamsayi=(int)ondalikli; |
kodu tamsayi değişkenine 9 (virgülden önceki kısım) değerini atar.
Ayrıca:
int tamsayi =10;
float ondalikli;
ondalikli =(float) tamsayi;
|
Ondalıklı değişkenine 10.0 değerini atar.
Tip dönüşümü tüm basit veri tipleri için (char dahil) kullanılabilir.
int tamsayi;
char harf=A;
tamsayi =(int)harf;
|
kodu tamsayi değişkenine 65 (A harfinin ASCII değeri) değerini atar.
Not: Bazı tip dönüşümleri otomatik olarak yapılır.
Başka bir kullanımı ise, istenilen sonucun tipinin zorunluluk taşımasıdır. Örneğin 2 tamsayıyı bölüp bir ondalıklı sayı elde etmek istiyorsanız aşağıdaki kod bunu sağlayacaktır:
Ondalikli = (float) tamsayi1 / (float) tamsayi2; |
Statik Değişkenler
Bir statik değişken belirli bir fonkiyona yereldir, bir kez tanımlanır
(fonksiyonu ilk çağrıldığı zaman)
Değişkenin değeri fonksiyon sonlandırıldığında sıfırlanmaz. Fonksiyon tekrar çağrıldığında değişken aynı değeri taşımaya devam eder.
Bir değişkeni statik olarak tanımlayabilmek için başına static kelimesi
eklememiz gerekir.
#include <stdio.h>
void basla();
void main()
{ int i;
for (i=0;i<5;++i)
basla();
}
void basla()
{
int degisken = 0;
static int st_degisken = 0;
printf( "degisken = %d, st_degisken = %d", degisken, st_degisken);
++degisken;
++st_degisken;
}
|
Yukarıdaki programın çıktısı aşağıdaki
gibi olacaktır :
Degisken = 0, st_degisken= 0
Degisken = 0, st_degisken = 1
Degisken = 0, st_degisken = 2
Degisken = 0, st_degisken = 3
Degisken = 0, st_degisken = 4 |
Buradan da anlaşılacağı gibi "degisken" her seferinde tekrar yaratıldığı için hep sıfır değerinndedir. "st_degisken" sadece bir kez yaratıldığından değeri artarak devam eder.
Enumeration(Numaralandırmalar)
Bu kavramın türkçeleştirilmesi anlam karışıklığına yol açtığı için
genellikle "enum sabiti" şekilde kullanılmaktadır.
Bu tipte, değerleri çeşitli sembollerle belirtebiliriz:
Örneğin haftanın günlerini sembolize etmek için aşağıdaki gibi bir yapı
kullanılabilir.
Enum gunler {pzt, sl, crs, prs, cm, cts, pzr} hafta;
Enum gunler hafta1, haft2;
|
Başka bir örnek:
Enum ornek { bir = a, iki= b, uc = t, dort = n };
|
Makale:
C Dilindeki Veri Yapılarına Giriş (STRUCT, UNION, ENUM) C ve Sistem Programlama Tanıl Ergin
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|