Gönderen Konu: BIR STRUCTURE DIZISI  (Okunma sayısı 14704 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Morphosis

  • Üye
  • **
  • İleti: 74
BIR STRUCTURE DIZISI
« : 06 Haziran 2008, 12:39:54 ös »
STRUCT2.C:
===============================================
main()
{
struct {
char bas_harf;
int yas;
int not;
} cocuklar[12];

int indeks;

for (indeks = 0;indeks < 12;indeks++) {
cocuklar[indeks].bas_harf = 'A' + indeks;
cocuklar[indeks].yas = 16;
cocuklar[indeks].not = 84;
}

cocuklar[3].yas = cocuklar[5].yas = 17;
cocuklar[2].not = cocuklar[6].not = 92;
cocuklar[4].not = 57;

for (indeks = 0;indeks < 12;indeks++)
printf("%c , %d yasindadir ve notu %d dur.n",
cocuklar[indeks].bas_harf, cocuklar[indeks].yas,
cocuklar[indeks].not);
}
==============================================

Bu programda, bir oncekinin ayni structure tanimini kullaniyor. Fakat
tanimladigi, 12 tane "cocuklar" isimli degisken oluyor. Yani bu program
12 * 3 = 36 tane basit degiskenden olusuyor. Bunlarin herbiri, kendi
tiplerinde veri tasiyabilirler. Ayrica for dongulerinde kullanmak icin
"indeks" isimli bir basit degisken de tanimliyoruz.

Her sahaya bir deger atamak icin, bir for dongusu kullaniyoruz, ve
donguden her gecis, bu 3 sahaya deger atanmasini sagliyor. Gercek hayatta
bu metod, veri atanmasi icin pek uygun olmayacaktir. Ornegin veriler
kutukten okunup, degerlerine atanabilir. Bunu basit bir veri tabani
uygulamasi olarak gorebilirsiniz, gercekten de oyledir.

Bundan sonra, birkac elemana, nasil atanacagini gostermek amaci ile,
degerler atiyoruz.

PASCAL PROGRAMCILARINA NOT:

Pascal dilinde bir butun RECORD'un tek bir komut ile kopyalayabilirsiniz.
Bu, C de mumkun degildir. Structure'un her elemanini tek tek kopyalamaniz
lazimdir. Lisan gelismelere ugradikca, bu da degisecek bir noktadir.
Hatta, bazi yeni derleyiciler, structure'un atanmasini yapabiliyor.
Derleyicinizin kilavuzuna bir bakin..


SONUNDA BUTUN NETICELERI GOSTERIYORUZ

Son birkac satirda da, formatlanmis bir sekilde verilerin yazilmasini
goruyorsunuz.

POINTER'LAR VE STRUCTURE'LARI BIR ARADA KULLANMAK

STRUCT3.C:
================================================
main()
{
struct {
char bas_harf;
int yas;
int not;
} cocuklar[12],*point;

int index;

for (index = 0;index < 12;index++) {
point = cocuklar + index;
point->bas_harf = 'A' + index;
point->yas = 16;
point->not = 84;
}

cocuklar[3].yas = cocuklar[5].yas = 17;
cocuklar[2].not = cocuklar[6].not = 92;
cocuklar[4].not = 57;

for (index = 0;index < 12;index++) {
point = cocuklar + index;
printf("%c , %d yasindadir ve notu %d dur.n",
(*point).bas_harf, cocuklar[index].yas,
point->not);
}
}
===============================================

Bu program, bir once gordugumuz programin neredeyse aynisi, fakat bu, bazi
islemler icin pointer'lardan yararlaniyor.

Ilk fark, structure'un tanimlanmasindan sonraki degisken tanimlarinda goze
carpiyor. Burada, "point" isimli bir pointer tanimliyoruz, ve tipine de,
bu pointer'in tipi olarak veriyoruz. Bu pointer'in herhangi baska bir cins
degisken tipini 'gostermesine' calismak, yalnis olur. C dilinde bu
kisitlama icin cok yerinde bir neden vardir, ve bunu gelecek paragraflarda
gorecegiz.

Daha sonraki degisiklik ise, veri sahalarina erismek icin pointer
kullandigimiz dongude ortaya cikiyor. "cocuklar" kendi basina bir pointer
gorevi yaptigindan, "point" i "kids" in adresine atayabiliriz.

POINTER ARITMETIGI

"point" e bir ekledigimiz zaman, "cocuklar" dizisindeki ikinci elemanini
gosteriyoruz. Sistem, bu structure'un 3 tane degiskenden olustugunu ve
butun structure'u hafizada tutmak icin ne kadar yer gerektigini bilir. Bu
sayede, "point"e bir ekle dedigimizde, dizideki bir sonraki elemana varmak
icin kac hafiza elemani a$ilmasi gerekiyorsa, o kadar ekler. Ornegin,
"point" e 4 ekleseydik, sistem, "point" e 4 kere structure'un boyu kadar
yer adres atlatirdi. Bu sebeple, pointerlar, tanimlandiklari tipten baska
bir tip icin kullanilamazlar.

Simdi programimiza geri donelim. Bir onceki paragraftan da
anlayabileceginiz gibi, dongunun icinde ilerledikce, pointer'in degeri
artarak her dizi elemaninin baslangicini teker teker gosterecektir. Bu
sayede, pointer ile bu structure'un degisik elemanlarina erisebiliriz. C
dilinde bir structure'un elemanlarina pointer ile erismek o kadar cok
kullanilir ki, bunu gostermek icin ozel bir metod gelistirilmistir.
"point->bas_harf" metodunu kullanmak, "(*point).bas_harf" metodunu
kullanmak ile ayni manadadir. "->" sembolu, bir eksi isareti ve bir
buyuktur isareti ile elde edilir.

Pointer, bir structure'u gosterdigine gore, kullanirken, o structure'un
hangi degiskenine erismek istedigimizi belirtmemiz gereklidir. Gordugunuz
gibi, bir structure'un elemanlarina erismek icin degisik yollar vardir, ve
programin sonunda, ciktiyi saglayan "for" dongusunde, 3 degisik metod
goruyorsunuz. Bu kotu bir programlama teknigi olarak kabul edilirdi, fakat
burada size her ucunun de ayni neticeyi verdigini gostermek amaci ile
yapilmistir. Bu program, tam olarak kavrayabilmeniz icin, herhalde bir
sure incelemenizi gerektirecektir.

IC ICE VE ISIMLI STRUCTURE'LAR

ICICE.C:
===============================================
main()
{
struct insan {
char isim[25];
int yas;
char durum; /* E = Evli , B = Bekar */
} ;

struct tumveri {
int not;
struct insan ozellikler;
char yemek[25];
} ogrenci[53];

struct tumveri hoca,asistan;

hoca.not = 94;
hoca.ozellikler.yas = 34;
hoca.ozellikler.durum = 'E';
strcpy(hoca.ozellikler.isim,"Mary Smith");
strcpy(hoca.yemek,"Salamli sandvic");

asistan.ozellikler.yas = 87;
asistan.ozellikler.durum = 'E';
strcpy(asistan.ozellikler.isim,"Old Lady Brown");
asistan.not = 73;
strcpy(asistan.yemek,"Yogurt ve ekmek");

ogrenci[1].ozellikler.yas = 15;
ogrenci[1].ozellikler.durum = 'B';
strcpy(ogrenci[1].ozellikler.isim,"Billy Boston");
strcpy(ogrenci[1].yemek,"Findik ezmesi");
ogrenci[1].not = 77;

ogrenci[7].ozellikler.yas = 14;
ogrenci[12].not = 87;

}
=================================================

Simdiye kadar gordugumuz structure'lar basit fakat kullanisli idi.
Yuzlerce yada binlerce elemandan olusan structure'lar tanimlamak
mumkundur, fakat butun hepsini siradan tanimlamak yerine hierarsik bir
duzen kullanmak, programcinin lehine olur.

Ilk structure'da 3 eleman vardir, fakat arkasindan bir degisken ismi
gelmemektedir. Yani, biz sadece bir structure tanimladik, ve hicbir
degisken tanimlamadik. Basina "insan" ismini koydugumuzdan, bu
structure'un ismi de "insan" dir. Bu isim, bu structure duzenini kullanmak
istedigimizde kullanilir, fakat bu structure degiskenlerinden biri, bu
isimle kullanilamaz. Dolayisi ile, yeni bir tip tanimlamis olduk - ayni
"char" yada "int" gibi, ve neredeyse ayni sekilde, bu yeni tipi
kullanabiliriz.

Bundan sonraki structure tanimlamasi, 3 sahadan olusuyor. Ikinci sahasi,
daha once tanimladigimiz "insan" structure'unu kullaniyor. "insan" tipi
degiskenin ismine "ozellikler" ismini veriyoruz. Yeni structure, iki tane
basit degisken de kullaniyor, "not" isimli tamsayi degiskeni,
"yemek[25]" isimli bir karakter dizisi, ve "ozellikler" isimli bir
structure. "ozellikler" in icinde 3 degisken oldugu icin, bu structure 5
degisken tanimlamis oluyor. Bu structure'a da, "tumveri" ismini veriyoruz,
ki bu da bir baska tip tanimlanmasidir. Sonunda, 53 degiskenlik, ve
"tumveri" tipinde bir dizi tanimliyoruz, ve buna "ogrenci" ismini
veriyoruz. Sayet bunlar sizin icin anlasilir idi ise, her birine deger
atanabilen toplam olarak 53 kere 5 degisken tanimladigimizi gorursunuz.

IKI DEGISKEN DAHA

Bir degisken tipi tanimimiz olduguna gore, onu iki degisken daha
tanimlamada kullanabiliriz. "hoca" ve "assistan" isimli degiskenler de
"tumveri" tipindedir, her birinin icine bilgi konulabilecegimiz , 5 er
sahadan olusurlar.

Çevrimdışı 2kral

  • Üye
  • **
  • İleti: 76
Ynt: BIR STRUCTURE DIZISI
« Yanıtla #1 : 15 Aralık 2012, 04:59:37 ös »
çalışmıyor bu kodlar çok fena kafam karıştı ???