You are on page 1of 235

STANDART

C
PROGRAMLAMA DL
Fedon Kadifeli
A. C. Cem Say
M. Ufuk alayan
zgn metin 1990, 1988 M. U. alayan, F. Kadifeli ve A. C. C. Say.
Geniletilmi Trke bask 2000, 1993 F. Kadifeli, A. C. C. Say ve M. U. alayan.
Her hakk mahfuzdur. Bu yaynn hibir blm, yazarlarn izni olmadan
fotokopi, teksir veya baka bir yolla oaltlamaz, saklanamaz veya
yaynlanamaz.
Kitabn ngilizcesi ilk defa Trkiyede 1990 Austosunda yaynlanmtr.
Trkeye uyarlayan ve gncelleyen Fedon Kadifeli.
Apple, Macintosh, MacWrite, MacDraw ve MacPaint, Apple Computer, Inc.n
onayl markalardr.
Courier, Smith-Corona Corporationn onayl bir markasdr.
IBM, International Business Machines Corp.n onayl bir markasdr.
Microsoft, MS, MS-DOS, CodeView,
QuickC ve Word, Microsoft Corp.n onayl markalardr.
OS/2, Microsofta lisansl onayl bir markadr.
PDP, Digital Equipment Corp.n ticari bir markasdr.
Times ve Times Roman, Linotype AG ve/veya ubelerinin onayl markalardr.
UNIX, AT&T Bell Laboratoriesin onayl bir markasdr.
Windows, Microsoft QuickBasic ve Visual C++, Microsoft Corp.n ticari
markalardr.
Ailelerimize
vii
NSZ
C programlama dili, gnmzde en yaygn kullanlan dillerden biridir. C dili, COBOL,
FORTRAN, PL/I gibi eski programlama dilleri grubuna dahil edilemeyecei gibi, Ada,
Modula-2 gibi yeni saylabilecek dil grubuna da girmez.
C dili, klasik programlama dilleri kavramlarnn, yeni, basit ve kolay kullanlr bir
ekilde saland pratik bir dildir. Cnin poplaritesi daha ok UNIXinki ile ilikilidir,
nk C, ilk olarak, UNIX dnyasnn programlama dili olarak ortaya kmtr. Bu
poplarite, kiisel bilgisayarlarn oalmas ve bunlar zerindeki gl derleyici ile
programlama ortamlarnn kullanlabilir hale gelmesinden sonra daha ok artmtr.
Bu ders kitab, programlama dilleri zerine Trkiyede hazrlanan ders kitaplar
an kapatma amacn gtmektedir. Bilgisayar sistemlerine giri, sistem programlama,
sistem yazlm ve iletim sistemleri gibi, C dilinin programlama projeleri
gelitirilmesinde retildii ve kullanld dersler iin tasarlanmtr.
Kitap, niversite birinci ve ikinci snfnda okuyan renciler iin hedeflenmitir,
ancak daha yksek dzeyde de bir bavuru kitab olarak kullanlabilir. Bu kitab
okuyacaklarn, en az bir yapsal programlama dilinirnein Pascal, QuickBasic veya
COBOLbilmeleri ve veri yaplar konusunda temel bilgilere sahip olmalar
beklenmektedir. Bu kitap, zellikle yazlm gelitirme projelerinde C dilini kullanmay
dndkleri iin, programlama dili bilgilerini geniletmek isteyen bilgi ilem uzmanlar
gibi kiilerin kendi balarna okuyabilecekleri ekilde de hazrlanmtr.
Bu ders kitab, C programlama dilinin btn ynlerini kapsamas asndan tamdr.
nemli miktarda rnek program ve altrmalar verilmitir. Okuyucularn, en azndan bir
IBM kiisel bilgisayarn veya uyumlusunu ve Microsoft C Derleyicisi Uyarlama 5.00
veya daha yukarsn kullanabilecekleri beklenmektedir. Ancak, ekler dnda, kitapta
verilen bilgiler deiik C programlama ortamlar iin de geerlidir.
Bu kitabn Boazii niversitesi Yaynlar arasnda ngilizce olarak yaplan ilk
basm halen Boazii niversitesi Bilgisayar Mhendislii Blmnde letim
Sistemleri dersinde yardmc ders kitab olarak kullanlmaktadr. Kitap u anda tamamen
viii NSZ
gncelletirilmitir ve ANSI Standardnn tm zelliklerini kapsamaya almaktadr. Bu
kitap sayesinde, yeni C derleyicileri tarafndan desteklenen, Standart Cnin hem yeni hem
de eski C programclar tarafndan kullanlmaya balanacan umuyoruz.
Bu kitabn hazrlanmas ve yaynlanmasnda deerli nerileri, dzeltmeleri, destekleri
ve katklar olan Rasim Mahmutoullar, Sema Akgn, Ouz Sinanolu, lk Karada,
Ahmet Demirhan, Mustafa Elbir, Hasan Gltekin, Nezihe Bahar ve adn
sayamayacamz daha birok kiiye teekkrlerimizi bor biliriz.
Yk. Mh. F. Kadifeli
Y. Do. Dr. A. C. C. Say
Do. Dr. M. U. alayan
stanbul
Ekim 1993
ix
NDEKLER
NSZ............................................................................................................................vii
NDEKLER................................................................................................................ ix
EKLLER VE ZELGELER LSTES .................................................................... xv
BLM 0: GR ............................................................................................................ 1
0.1. C Dilinin Ksa Bir Tarihi ...................................................................................... 1
0.2. C Dilinin stnlkleri .......................................................................................... 2
0.3. Kullanlan Sistem.................................................................................................. 3
0.4. Kitabn Yaps Ve Kullanlan Kurallar ................................................................. 4
Problemler ................................................................................................................... 4
BLM 1: TEMEL KAVRAMLAR VE GENEL BR BAKI................................... 5
1.1. Aklamalar, Tantc Szckler Ve Anahtar Szckler ....................................... 5
1.2. Deimezler .......................................................................................................... 7
1.3. Temel Veri Tipleri Ve Tanmlar........................................................................... 9
1.4. #define Ve #include nilemci Emirleri ............................................................ 12
1.5. leler, fadeler Ve Atama Deyimleri ................................................................ 13
1.6. Tip Dnm Ve Kalplar ................................................................................ 16
x NDEKLER
1.7. Basit Girdi/kt ................................................................................................. 17
1.8. C Deyimleri Ve Program Gvdesi ...................................................................... 21
1.9. Bir C Program Nasl letilir.............................................................................. 22
1.10. rnek Programlar ............................................................................................. 24
Problemler ................................................................................................................. 26
BLM 2: DEYMLER VE KONTROL AKII........................................................ 29
2.1. C Dilinin Deyimleri ............................................................................................ 29
2.2. Bantsal Ve Mantksal leler......................................................................... 30
2.3. Doruluk-Deerli fadeler .................................................................................. 32
2.4. if Deyimi Ve Koullu le ................................................................................. 33
2.5. while Deyimi ...................................................................................................... 35
2.6. do Deyimi ........................................................................................................... 36
2.7. for Deyimi Ve Virgl leci ................................................................................ 37
2.8. continue Deyimi.................................................................................................. 38
2.9. break Deyimi ...................................................................................................... 39
2.10. goto Deyimi Ve Etiketler.................................................................................. 39
2.11. switch Deyimi ................................................................................................... 40
2.12. Bir rnekSay Sralama................................................................................ 42
Problemler ................................................................................................................. 43
BLM 3: GSTERGELER VE BT LEME......................................................... 45
3.1. Gsterge Deikenleri Ve lemleri.................................................................... 45
3.1.1. & Ve * leleri ............................................................................................... 46
3.1.2. Gsterge Deikenleri Bildirimleri.................................................................. 47
3.1.3. Gsterge Aritmetii ......................................................................................... 47
3.2. Gstergeler Ve Diziler........................................................................................ 49
3.3. Karakter Dizileri ................................................................................................. 51
3.4. Bitsel leler ...................................................................................................... 53
3.5. le ncelii Ve Birleme................................................................................. 57
Problemler ................................................................................................................. 58
NDEKLER xi
BLM 4: FONKSYONLAR VE PROGRAM YAPISI .......................................... 59
4.1. Fonksiyon Tanmlama ........................................................................................ 60
4.2. Fonksiyon arlar ............................................................................................ 62
4.2.1. Deer le ar ................................................................................................ 64
4.2.2. Referans le ar ............................................................................................ 65
4.2.3. main Fonksiyonunun Parametreleri ................................................................. 67
4.3. Bellek Snflar.................................................................................................... 69
4.3.1. auto Deikenler .............................................................................................. 70
4.3.2. register Deikenler ......................................................................................... 70
4.3.3. static Deikenler Ve Fonksiyonlar ................................................................. 71
4.3.4. Fonksiyonlar Ve extern Deikenler................................................................ 72
4.3.5. lkleme............................................................................................................. 73
4.4. zar ............................................................................................................... 75
4.5. Fonksiyonlara Gstergeler.................................................................................. 78
4.6. Bir rnek8 Vezir Problemi............................................................................. 80
Problemler ................................................................................................................. 84
BLM 5: TRETLM TPLER VE VER YAPILARI....................................... 87
5.1. Saym Tipleri ...................................................................................................... 87
5.2. Yaplar ................................................................................................................ 89
5.3. Yeni Tip Tanmlama........................................................................................... 92
5.4. sizeof leci......................................................................................................... 94
5.5. Birlikler .............................................................................................................. 95
5.6. Alanlar ................................................................................................................ 96
5.7. Bellek Ayrma..................................................................................................... 98
5.8. Karmak Tipler.................................................................................................. 98
5.8.1. Dizi Dizileri ..................................................................................................... 99
5.8.2. Dizilere Gstergeler....................................................................................... 100
5.8.3. Gsterge Dizileri ........................................................................................... 101
5.8.4. Gstergelere Gstergeler ............................................................................... 102
5.9. Bir rnekDosya Sralama............................................................................. 103
xii NDEKLER
Problemler ............................................................................................................... 107
BLM 6: NLEMC ............................................................................................ 109
6.1. #define Ve #undef Emirleri .............................................................................. 110
6.2. #include Emri ................................................................................................... 112
6.3. Koullu Derleme............................................................................................... 113
6.4. Dier Emirler.................................................................................................... 115
6.5. nceden Tanmlanm simler .......................................................................... 115
6.6. Bir rnekctype.h Balk Dosyas.................................................................. 116
Problemler ............................................................................................................... 117
BLM 7: DOSYALAR VE GRD/IKTI ............................................................. 119
7.1. Dosya Esaslar .................................................................................................. 119
7.2. Dosya EriimiBaka Yntemler.................................................................... 121
7.3. Rastgele Eriim................................................................................................. 123
7.4. Dosyalarla lgili Baka Bilgiler ........................................................................ 124
7.5. Sistem le lgili Fonksiyonlar............................................................................ 125
7.6. Dosya Tanmlayclar Ve lgili Fonksiyonlar .................................................. 126
7.7. Bir rnekrenci Veritaban ....................................................................... 128
Problemler ............................................................................................................... 132
EK A: KARAKTER KODLARI ZELGES........................................................... 135
EK B: MICROSOFT C DERLEYCS HAKKINDA TEMEL BLGLER.......... 145
B.1. Bellek Modelleri .............................................................................................. 145
B.1. QC Ktphanesi............................................................................................... 146
B.3. CL Eniyiletirici Derleyicisi............................................................................. 147
EK C: MICROSOFT CODEVIEW HATA DZELTCSNE GENEL BR
BAKI .................................................................................................................... 151
EK D: MICROSOFT LIB VE NMAKE YARDIMCI PROGRAMLARINA
GENEL BR BAKI.............................................................................................. 155
NDEKLER xiii
D.1. LIB Yardmc Program ................................................................................... 155
D.2. NMAKE Yardmc Program ........................................................................... 156
EK E: DLLERARASI ARILAR .......................................................................... 159
E.1. Birletirici le Balaycnn Kullanlmas ......................................................... 159
E.2. Satrii Birletiricisinin Kullanlmas ............................................................... 162
E.3. Bir rnekDisket Saklama............................................................................. 163
EK F: STANDART C PROGRAMLAMA DLNN DER
ZELLKLER ..................................................................................................... 169
F.1. C Dnyann Her YerindeYreler.................................................................. 169
F.2. Geni Karakterler Ve okbaytl Karakterler .................................................... 170
F.3. l Karakterler ............................................................................................... 170
F.4. Zaman Fonksiyonlar ........................................................................................ 171
F.5. Standart Balk Dosyalar ................................................................................. 173
F.6. evirme Snrlar .............................................................................................. 181
EK G: SELM PROBLEMLERE YANITLAR................................................... 183
EK H: TRKE-NGLZCE VE NGLZCE-TRKE TERMLER
SZL.............................................................................................................. 187
H.1. Trke-ngilizce Szlk................................................................................... 187
H.2. ngilizce-Trke Szlk................................................................................... 198
BBLYOGRAFYA...................................................................................................... 209
DZN............................................................................................................................. 213
xv
EKLLER VE ZELGELER
LSTES
ZELGE 2.1 C dilinin deyimleri.....................................................................................30
ZELGE 2.2 C ile ncelii ve birleme.......................................................................32
EKL 2.1 while ve do deyimleri iin ak izenekleri..................................................... 36
ZELGE 3.1 C ile ncelii ve birleme.......................................................................57
EKL 4.1 main fonksiyonuna geirilen komut satr argmanlar ................................... 69
EKL 5.1 Bir rnek ikili aa ....................................................................................... 104
1
BLM 0: GR
/* Ilk program */
#include <stdio.h>
void main (void)
{
int kar;
if ((kar=getchar())!='\n')
main();
putchar(kar);
}
Eer bir C programnn nasl grndn merak ettiyseniz, yukarda, yararl ve
anlaml bir i yapan tam bir C programnn durduunu renmek sizi artabilir. Bir C
derleyiciniz varsa ve nasl kullanacanz biliyorsanz, bu program yazn, derleyin ve
altrn. Fakat nce, programn ne yapabilecei konusunda lgn tahminlerde
bulunmaktan da ekinmeyin.
...
Eer tahmininiz doru kmadysa, zlmeyin. Bu, sadece C hakknda ilginizi
ekmek iindi ve umarz yle oldu! Bu basit gibi grnen, ancak Cnin birtakm ileri
zelliklerini kullanan program, kitabn yarsn bitirinceye kadar anlamanz
beklemiyoruz ve bu kitab bitirdiinizde ok daha karmak programlar bile
anlayabileceinizi ve yazabileceinizi bekliyoruz.
0.1. C Dilinin Ksa Bir Tarihi
UNIX iletim sistemi ile C programlama dili birbirleriyle yakndan ilikilidir. Tarihleri
70lerin banda balar. lgin olan ey de, AT&T Bell Laboratuvarlarndan Ken
Thompson tarafndan yazlan bir bilgisayar oyun programndan kaynaklanmalardr.
2 GR BLM 0
Thompson, programn bir PDP-7 bilgisayarna uyarlamak istediinde, bu kk makina
hakknda ok ey rendi, ancak iletim sistemini pek beenmedi. Bunun zerine, o
zamanlar daha byk bir makinada kullanlan MULTICS iletim sisteminin
basitletirilmi ve deitirilmi bir uyarlamasn yazmaya karar verdi. Daha sonra, Dennis
M. Ritchie de ona katld ve Brian W. Kernighan tarafndan UNICS (Uniplexed
Information and Computing ServiceBirletirilmi Bilgi ve Hesaplama Hizmeti) ad
verilen iletim sisteminin ilk uyarlamas dodu. Bu kii C ve UNIXin tarihinde en
nemli rol oynadlar. Balangta, Thompson, daha nceleri 1967 civarnda gelitirilen
BCPL adl tipsiz dilden de byk lde etkilenerek B dilini tasarmlad. Bundan sonra,
Ritchie UNIXi daha kolay bir ekilde yazma amacyla C adnda yeni bir dil tasarmlad.
1973 ylnda ise Ritchie ve Thompson Cyi kullanarak UNIXi yeni batan yazdlar. Sonu
o kadar iyiydi ki, 1983te ACMin Turing dln almaya hak kazandlar.
O zamandan beri, C ok deimedi. Dilde yaplan baz kk geniletmeler, Dennis
M. Ritchie tarafndan hazrlanan The C Programming LanguageReference Manual (C
Programlama DiliBavuru Elkitab) adl, 1983 basml, Bell Laboratuvarlar yaynnda
anlatlmaktadr. ANSInin (American National Standards InstituteAmerikan Ulusal
Standartlar Enstits) X3J11 komitesi tarafndan 1988 Ekiminde sunulan, C Standardnn
son tasla bu deiiklikleri resmiletirmekte ve kendi bana yenilerini eklemektedir.
Yaplan dzenlemelerle, birtakm programc hatalarn azaltmak iin derleyici kontrolleri
artrlm ve dile yararl birka zellik daha katlmtr. Ancak, tasarmclarnn felsefesine
aykr olduu iin dilin daha fazla geniletilmesi beklenmemelidir. Bunun yerine, bu
dilden yeni diller ortaya kmaktadr. Bir rnek, C++dr. Bu dil, nesneye ynelik
programlama ve veri soyutlama teknikleri salarken, Standart C ile uyumlu kalmaya aba
gstermektedir. Bu zellikleri, dili daha kapsaml bir uygulama programlama dili
yapmaktadr. Yakn zamanda ise C++nn Cnin yerini almas beklenmektedir, ancak yine
de C++ renecek birisinin nce Standart Cyi bilmesi gerekmektedir.
0.2. C Dilinin stnlkleri
nceki ksmdan, Cnin pratik gereksinmelerden ortaya kt sonucuna varabiliriz; yani
belirli bir sistem iin yapay hazrlanm bir dil deildir. C, birletirici dilinin sorunlarn
ksmen zmek iin, dk dzeyli programlamay destekleyici kolaylklar olan yksek
dzeyli bir dil olarak tasarmlanmtr. rnein, dilde girdi/kt deyimleri yoktur.
Kullanc, girdi/kt yapmak iin getchar ve putchar gibi baz fonksiyonlar
arr. Derleyici bu fonksiyonlarn anlam hakknda hibir ey bilmez. Sadece, C
ktphanesinde tanml olan bu fonksiyonlara arlar retir. Bu da, iyi bir ktphanenin
Cye ok ey kazandraca anlamna gelir.
Cnin dier dillere gre baz avantajlar vardr. Bunlar aada zetlenmektedir:
C, ksa, zl, verimli, esnek ve ifadeli bir dildir. Az sayda anahtar szce sahiptir,
fakat doru kontrol yaplar, gl ileleri (dier adyla, ilem operatrleri) ve kolayca
birletirilen veri tipleri vardr. Bu da, dili renmenin ve bir C derleyicisinin yazlmasnn
kolay olduu ve bu dilde yazlan programlarn ksa, fakat bazen izlemesi zor olduu
BLM 0 GR 3
anlamna gelir. Baz ileler dier dillerde yoktur, fakat bunlar kolayca makine diline
evrilebilirler, bu da C dilinde yazlan programlarn dier dillerde yazlanlara gre daha
verimli almalarnn nedenini aklar. Bundan dolay, baz sistemlerde C, birletirici
dilinin yerini almtr.
C, popler bir iletim sistemi olan UNIXin temel dilidir. Bu da, en azndan bu iletim
sisteminde, bu dili vazgeilmez klmaktadr. Buna ramen, C baka sistemlerde de
kullanlmaya balanmtr ve, tanabilme zelliinden dolay, bir sistem iin yazlm
programlar kolayca baka sistemlere de aktarlabilmekte ve orada baz ufak tefek
deiikliklerden sonra derlenip doru bir ekilde altrlabilmektedir. Bu durum dilin
amalarndan biridir: programcnn makine bamllklarn bir tarafta ayrmas ve
gereksinim duyduunda program yeni ortamlara kolayca uyarlayabilmesi. C nilemcisi
bu konuda nemli bir rol stlenmektedir.
C modler programlamay tevik etmektedir. Dier ada programlama dilleri kadar
yaygn olmamasna ramen, programcnn bunu salamas iin baz seimler sunar. eitli
bellek snflar eitli dzeylerde gizlilik ve modlarite salar. Dildeki tek modl yaps
olan fonksiyon tanm iin C tek bir dzeye izin verir; btn fonksiyonlar dsaldr.
Programc, kolayca, kullanc tarafndan tanmlanm kaynak veya ama ktphaneleri
yaratabilir ve bu yolla ok byk programlar hazrlayabilir.
Cnin dezavantajlar da vardr. C dilinde yazlan programlarn izlenmesi bir miktar
zor olabilir, nk zengin ile kmesi program okunaklln azaltr. C kat-tiplenmi bir
dil deildir; bir dizinin snrlar dnda indisleme yapmaya almak gibi, baz programc
hatalar iin yrtme zaman destei salamaz; baz durumlarda, derleyici, ifadeler
iindeki alt-ifadelerin veya argman listeleri iindeki ifadelerin hesaplanma sralarn
deitirebilir; ayn simgelerin birden fazla amaca hizmet etmesi baz programlama
hatalarna yol aabilireitlik testi ve atama ilelerinin kartrlmas gibi; baz yaplar
rnein switch deyimidaha iyi tasarlanabilirdi. Bu sorunlarn bazlar, Cnin ANSI
Standardn izleyen baz yeni derleyicilerde iyiletirilmitir. Ayrca, Cye dayanarak
gelitirilen C++ dili, baz sorunlar zm ve birok yeni zellikler katmtr. Gerek bir
C programcsnn, Cnin dezavantajlar ile birlikte yaamay renmesi gerektiine
inanyoruz.
0.3. Kullanlan Sistem
C tanabilir bir dil olmasna ramenki, bu da, belirli bir sistem iin yazlm olan bir
C programnn baka bir sisteme aktarldnda orada baarl bir ekilde derlenip
yrtlebilecei anlamna gelirsistemler arasnda baz farkllklar olabilmektedir. Bu
kitapta verilen program veya program paralar Microsoft QuickC Uyarlama 1.01 (1988),
Microsoft C Derleyicisi Uyarlama 5.00 (1987) ve Microsoft C/C++ Eniyiletirici
Derleyicisi Uyarlama 8.00 (1993) kullanlarak denenmitir. Kullandmz iletim sistemi
IBM uyumlu bir PCde alan MS-DOS Uyarlama 5.00 (1991) veya daha yukarsdr. Bir
sonraki blmde bu ortamlarn nasl kullanlabilecei konusunda daha detayl baz bilgiler
verilmitir. Ayrca Ek Bye baknz.
4 GR BLM 0
0.4. Kitabn Yaps Ve Kullanlan Kurallar
Bu kitabn ngilizce olan ilk uyarlamas bir Apple Macintosh Plusta Word ve MacDraw
isimli yazlmlar kullanlarak hazrlanmtr. Kitap en son olarak, IBM uyumlu bir PCde
alan Windows iin Word Uyarlama 2.0c kullanlarak gncelletirilmi ve Trke
baskya hazr hale getirilmitir. Temel yaz tipi Times Romandr. Szdizimsel
gsterimde, szdizimsel snflar italik yaz stili ile gsterilmitir. stee bal blmler,
arkalarnda satr altna yazlan
opt
simgesiyle gsterilmitir. Program blmleri, ekran
veya yazc ktsna benzetilmek iin, Courier yaz tipiyle yazlmtr. C anahtar
szckleri koyu, program aklamalar ise italik ile yazlmtr. Bilgisayar
girdi/kts da Courier yaz tipiyle gsterilmitir; kt, girdiden ayrt edilmesi iin,
alt izgili yazlmtr.
Kitabn geri kalan ksmnda 7 blm, 8 ek ve C programlama diliyle ilgili baz
kaynaklarn liste halinde verildii bir bibliyografya vardr. Blm 1de dile bir giri
yaplmakta ve ok basit programlar yazmak iin gerekli olan genel bilgiler verilmektedir.
Blm 2, C dilindeki kontrol deyimlerini ve doruluk-deerli, yani mantksal, ifadeleri
anlatmaktadr. Blm 3 gstergeler ve bit ilemleri hakkndadr. Blm 4te fonksiyonlar
ve deikenlerle fonksiyonlara uygulanabilecek eitli bellek snflar anlatlmaktadr.
Blm 5, karmak veri yaplar tanmlamada anahtar olan, btn tretilmi veri tiplerini
kapsamaktadr. Blm 6, C nilemcisine ayrlmtr ve btn nilemci emirlerini
anlatmaktadr. Blm 7de, dier baz fonksiyonlarla beraber, Standart C
ktphanelerinde tipik olarak rastlanan girdi/kt ilemleri anlatlmaktadr. Ekler ise
Microsoft C Derleyicisi ve evresinin baz zelliklerini anlatmakta, baz problemlerin
yantlarn vermekte ve kitapta kullanlan terimlerin ngilizce karlklarn bulmak iin bir
Trke-ngilizce ve ngilizce-Trke terimler szl iermektedir. Kitapta, olanaklar
dahilinde, yaygn olarak kullanlan Trke terimler tercih edildii iin, ngilizce
bilgisayar terimleri hakknda bilgi sahibi olan okuyucu, bu kitapta kullanlan Trke
terimleri anlamak iin sk sk Ek Hde verilen bu szlklere bavuracaktr.
Problemler
1. Bu blmn banda verilen program sisteminizde altrn. Eer herhangi bir
zorlukla karlarsanz sisteminizin yardm zellikleri, elkitaplar veya deneyimli
programclara bavurun. Bu program altrmak iin ka komuta gereksiniminiz
var?
2. Bir nceki altrmadaki program tekrar yazn (veya deitirin), fakat bu kez, iki
satr, tek satrda, arada bir boluk karakteri brakarak yazn. # ile balayan satrn
arkasna bir ey yazmamaya dikkat edin. Derleyicinin ayn ekilde kabul etmesi
gerekir. imdi, program iinde, rastgele yerlere boluklar, satr balar veya duraklar
(tab) ekleyin. Derlerken ortaya kacak hata mesajlar varsa, bunlar anlamaya ve
dzeltmeye aln.
5
BLM 1: TEMEL KAVRAMLAR
VE GENEL BR BAKI
imdi, C dilinin temel yap talarn anlatp, birtakm temel programlama kavramlarnn C
dilinde nasl gerekletirildiini gstereceiz. Bu blmn amac, mmkn olduu kadar
abuk, basit C programlar yazmak ve altrmak iin gerekli olan bilginin okuyucuya
kazandrlmasdr. Okuyucunun zaten en az bir programlama dilini bildii farz edildii
iin, burada bahsedilecek olan temel programlama kavramlar detayl olarak
aklanmayacaktr. Bir sonraki blmden balayarak, bu kavramlar C dilinin genel
erevesi iinde ele alnarak derinlemesine aklamalar verilecektir.
1.1. Aklamalar, Tantc Szckler Ve Anahtar
Szckler
Aklamalar
Bl-yldz (/*) ile ondan sonraki ilk yldz-bl (*/) arasnda bulunan herhangi bir
karakter dizisi bir program aklamasdr ve derleyici asndan bir bolua edeer
olarak kabul edilir. Bir aklama grubunun yle yazlmas nerilmektedir:
/* * * * * * * * * * * * * * * * * * * * * * * * * * *\
* *
* Buyuk bir aciklama obegi... *
* *
\* * * * * * * * * * * * * * * * * * * * * * * * * * */
veya
/* Daha kucuk bir aciklama obegi...
*/
6 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
Program aklamalar bu kitapta italik olarak yazlm ve sistemler arasndaki
uyumsuzluklardan kanmak iin Trke karakterler kullanlmamtr.
Tantc Szckler
Deikenler, deyim etiketleri, tip isimleri, fonksiyon isimleri gibi, programc tarafndan
oluturulan btn nesneleri isimlendirmek iin tantc szckler, bir dier adyla,
program isimleri kullanlr. Tantc szckler iin u kurallar geerlidir:
1. Herhangi bir sayda karakterlerden oluur, ancak ilk 31 karakter dikkate alnr.
2. lk karakter bir harf veya altizgi (_) olmaldr.
3. Geri kalan btn karakterler bir harf, rakam veya altizgi olabilir.
rnek olarak, A12, a12, sayfa_basi deiken ismi olarak kullanlabilir. Kk
ve byk harflerin farkl olduuna dikkat ediniz, yani A12 ile a12 farkl tantc
szcklerdir. Ancak, baz ortamlarda kk byk harf ayrm yaplmayabilir. Bundan
dolay, ayn program iinde, harf ayrm dnda, birbirine benzeyen iki farkl isim
kullanmaktan kann. Ayrca, bir tantc szckte, ilk karakter olarak altizgiden
kanlmas nerilir, nk bu tip isimler derleyiciye zg baz anahtar szckler veya
dier isimler iin kullanlmaktadr.
Anahtar Szckler
C dilinde 32 adet anahtar szck vardr; hepsi kk harfle yazlr. Anahtar szckler
tantc szck olarak kullanlamazlar; kendilerine zg kullanm alanlar vardr. C
dilindeki btn anahtar szcklerin snflandrlm bir listesi aada verilmitir. Program
iinde kullanacanz isimlerin aadaki listede olmamasna dikkat edin.
veri tipi bellek snf deyim ile
char auto break sizeof
const extern case
double register continue
enum static default
float typedef do
int else
long for
short goto
signed if
struct return
union switch
unsigned while
void
volatile
Kullanlan makine ve derleyiciye bal olarak, C dilinin zel durumundan dolay
baka anahtar szckler de olabilir. Bunlar genelde altizgi karakteriyle balarlar.
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 7
1.2. Deimezler
C dilinde, tamsay, kayan noktal, yani gerek say, karakter ve karakter dizisi
deimezleri bulunur.
Tamsay Deimezleri
Tamsay deimezleri, program iinde, ondalk, sekizli veya onaltl saylar eklinde
belirtilebilirler ve derleyicinin tipine gre, 16 bit veya 32 bit eklinde saklanrlar.
Aadaki rneklerde baz tamsay deimezleri grlmektedir:
123 ondalk 123
0123 sekizli 123 = ondalk 83
083 geersiz bir say
0x123 onaltl 123 = ondalk 291
0XFF onaltl FF = ondalk 255
Saynn nndeki bir sfr rakamnn, geri kalan rakamlarn sekizli (yani, 0-7) ve say
nndeki bir sfrla onun arkasndan gelen kk veya byk x harfinin, geri kalan
rakamlarn onaltl (yani, 0-9, A-F veya a-f) olmas gerektiini gsterdiine dikkat edin.
Saynn program iindeki gsterimi ne olursa olsun, makine iinde her zaman bitler
halinde ikili sistemde saklanr; ancak bu durum genelde programcy ilgilendirmez.
Bir tamsay deimezi, eer deeri 16 bite syorsa, ksa formda (16 bit) saklanr,
aksi takdirde uzun formda (32 bit) saklanr. Tamsay bir deimezin uzun formda
saklanmasn zorlamak iin deimezin arkasna l veya L harfi eklenmelidir. 1 says ile
kartrlmamas iin, kk l yerine byk L harfinin kullanlmas nerilir.
123 16 bitte saklanr
123l 32 bitte saklanr
123L 32 bitte saklanr
077 000077 eklinde, 16 bitte saklanr
077L 0...077 eklinde, 32 bitte saklanr
0xFFFF 16 bitte saklanr
0xFFFFL 0000FFFF eklinde, 32 bitte saklanr
0xFFFFF 000FFFFF eklinde, 32 bitte saklanr
Bir sekizli veya onaltl tamsay deimezi, daha byk bir bellek alanna
yerletirildii zaman, soluna sfr konur. Yani byle deimezlerin iaretsiz olduu
varsaylr. Ondalkl bir tamsay deimezinin iaretsiz olarak ilem grmesini salamak
iin arkasna u veya U eki konulmaldr, rnein 65000U.
Kayan Noktal Say Deimezleri
Kayan noktal say deimezleri ya tamsay ile kesir ksm arasna nokta konarak yada
bilimsel gsterimde belirtilirler. kinci yntem, genelde, ok byk veya ok kk
saylar iin kullanlr. Aada baz rnekler vardr:
8 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
1.123
1.23E20 = 1.2310
20
1.23e20 = 1.2310
20
(byk veya kk harf olabilir)
123E18 = 1.2310
20
1.23E-20 = 1.2310
-20
Deimezin iinde herhangi bir boluun olmamas gerektiine dikkat edin.
Normalde, kayan noktal deimezler 8 baytta, yani double (ift) duyarlkta, saklanr.
Eer kayan noktal deimezde f veya F eki bulunuyorsa, o zaman 4 baytta, yani tek
duyarlkta; eer l veya L eki kulanlrsa, o zaman long double (uzun ift veya drtl)
duyarlkta saklanr.
Karakter Deimezleri
Bir karakter deimezi, 'A', 'a', '%' gibi trnak iaretleri arasna konulan tek bir
karakter veya tek bir karaktere edeer olan bir ka srasdr. Bir ka sras bir ters
bl iareti ile bir harf veya rakamlardan oluur. C dilinde sadece u ka sralar
kullanlr:
\n yeni satr
\b geri alma
\r satrba
\t durak (tab)
\f sayfa ilerletme
\v dikey durak
\a zil
\' tek trnak
\" ift trnak
\? soru iareti
\\ ters bl
\ddd sekizli kodu ddd olan karakter
\xhhh onaltl kodu hhh olan karakter (Ek Aya baknz)
Ek olarak, aada baz karakter deimezleri rnekleri vardr:
'\0' bo karakter
'\'' bir karakter deimezi olarak tek trnak
'\"' bir karakter deimezi olarak ift trnak
'\\' bir karakter deimezi olarak ters bl
'\101' sekizli kodu 101 olan karakter (ASCII sisteminde 'A' harfi)
'\x041' onaltl kodu 41 olan karakter (ASCII sisteminde 'A' harfi)
Bir karakter deimezinin tipi inttir. Karakterler ise tipik olarak bir baytta (8 bit)
saklanr ve tamsay gibi ilem grrler. Ancak signed (iaretli) veya unsigned
(iaretsiz) olduklar veya kullanlan kodlama sistemi C Standardnda belirtilmemitir.
Bizim sistemimizde, ASCII kodlama sistemi kullanlr (Ek Aya baknz). Normal
karakterlerin (rnein, sistemimizdeki 7 bitlik ASCII karakterlerinin) iaretsiz olduklar
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 9
garanti edilmitir. Gerektiinde, bir karakter deikeninin iaretli olup olmad
programc tarafndan aka belirtilmelidir.
Karakter Dizisi Deimezleri
Bir karakter dizisi deimezi ift trnaklar arasnda yazlm herhangi bir sayda karakter
veya yukarda listesi verilmi ka srasndan oluur. te baz rnekler. Son rnekteki,
yeni satr (\n) ve tek trnak (\') ka sralarna dikkat edin.
"" bo karakter dizisi
"Merhaba" 7 karakterlik bir karakter dizisi
"Isminizi girin,\nveya ENTER\'a basin"
iki satrdan oluan bir karakter dizisi
Bir karakter dizisi deimezi bellekte sakland zaman, dizinin sonuna otomatik
olarak bo karakter (\0) eklenir; bundan dolay diziyi saklamak iin kullanlan bayt says
dizinin uzunluundan bir fazladr. Bir program iinde, aralarna hibir iaret koymadan
pepee yazlan karakter dizisi deimezleri birletirilir ve tek bir dizi deimezi olarak
alnrlar. Diziler, baz sistemlerde, salt-okunur bellee yerletirilebilirler, bu da onlar
deitirilemez klabilir. Ayrca, birbirine tpatp benzeyen iki veya daha fazla karakter
dizisi ayn bellek blgesinde saklanabilir.
Sistemler arasndaki uyumsuzluklardan kanmak iin, bu kitaptaki karakter dizisi
deimez rneklerinde Trke karakterler kullanlmamtr.
Bir Sonraki Satra Devam Etme
Bir deyim veya karakter dizisi deimezi programn tek bir satrna smyorsa ve bir
sonraki satra devam etmek gerekiyorsa, satrn sonuna ters bl (\) iareti konup bir
sonraki satra devam edilebilir. Ayrca, uzun bir karakter dizisi deimezi iki satrda iki
ayr karakter dizisi eklinde de yazlabilir.
1.3. Temel Veri Tipleri Ve Tanmlar
Bir deiken ismi, deikenin alaca deerlerin tr ve ilevini yanstacak ekilde
dikkatlice seilen bir tantc szcktr. Genelde, kalan_gunler veya kalanGunler
eklinde bir deiken ismi x132 gibi bir isme tercih edilmelidir. Deiken isimlerinde
byk harfler yerine kk harflerin kullanlmas allagelmitir.
Bir C programnda, kullanlmadan nce, tm deiken ve fonksiyonlarn tanm veya
bildirimi yaplmaldr. Temel veri tiplerinin, yani tamsay, kayan noktal saylar ve
karakterlerin bildiriminde kullanlan anahtar szckler unlardr:
10 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
int tamsay
signed, unsigned iaretli veya iaretsiz tamsaylar
short, long ksa veya uzun tamsaylar
float, double tek veya ift duyarlkl kayan noktal saylar
char karakter
Bir tanm, bir tip ismi ile tanmlanmakta olan nesnelerin virglle ayrlm listesinden
oluur ve bir noktal virgl ile sona erer. Aada birka rnek tanm gsterilmitir:
int x;
int x1, y1, z1;
long d, d1;
char c;
char c1, c2, c3;
float a;
float a1, a2, a3;
int u[3];
float k[10*20];
Son iki tanmda, tek boyutlu ve elemanl bir tamsay dizisi ile tek boyutlu ve 200
elemanl kayan noktal saylardan oluan bir dizi tanmlanmtr. Dizinin boyunun derleme
esnasnda hesaplanabilen deimez bir ifade olduuna dikkat edin.
Aada grld gibi, deikenler tanmlandklar zaman ilk deerleri de
verilebilir:
int x = 0;
int x1 = 10, x2 = 20, x3 = 30,
x4 = 60 * 60; /* ilk deger degismez bir ifadedir */
char c1 = 'a', c2 = 'z';
Buna ilkleme diyoruz. lk deer olarak bir ifadenin de yazlabileceine dikkat edin.
Tanmlanan deikenlerin ilklenmesi iyi bir alkanlktr.
simlendirilmi deimezler, yani deerleri deitirilemeyecek olan deikenler,
const tip niteleyicisi kullanlarak tanmlanrlar:
int const x = 100;
char const ys = '\n';
float const a = 123.45;
Bu tip deimez deikenlerin const ile tanmlanmasnn en azndan iki avantaj
vardr:
1. Programc yanllkla bu tip bir deikene atama yapmaya kalkar veya deerini
deitirebilecek bir ekilde kullanmaya kalkarsa, derleyici onu uyaracaktr.
2. ok kullancl sistemlerde bu tip deikenlerin ortak ve deitirilemez bir bellek
kesimine yklenmesi salanabilir.
Ayn anda baka bir sre (program) tarafndan kullanlan veya deitirilebilen
deikenlerin, derleyicinin olas bir eniyileme yapmasn engellemek iin, volatile tip
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 11
niteleyicisi kullanlarak tanmlanmas gerekmektedir. rnein, ok kullancl ortamlarda
iki deiik sre tarafndan ortak kullanlan bir deikenin volatile tanmlanmas
gerekir.
Tanmlanm bir deiken, bir deyim iinde ismi verilerek anlr. Dizi elemanlarna
ulamak iin eitli yollar olmasna ramen, ou zaman dizi isminin arkasna keli
parantezler iinde indis belirtilerek kullanlrlar. Eleman says BOY olan bir dizi iin
indisin alabilecei deerler 0dan BOY-1e kadar deiir. Yani, yukarda tanmlanm
olan u tamsay dizisinin elemanlar u[0], u[1] veya u[2] eklinde kullanlabilir.
ndisin her zaman deimez bir tamsay olmasna gerek yoktur; genelde bir ifade olur.
Yani, u[x+5] geerli bir kullanmdr. Doal olarak, eer x+5 ifadesinin deeri 0, 1
veya 2 deilse, beklenmeyen sonular elde edilebilir. Bu tip kullanmlar kontrol altnda
tutmak tamamen programcnn sorumluluundadr.
Deiik tiplerde tanmlanm deikenler iin, mevcut derleyiciler tarafndan ayrlan
bellek miktar ile alt ve st limit deerleri yledir:
tip anlam bayt says limitler
char ? 1 ?
-- signed char 1 -127..127
-- unsigned char 1 0..255
short signed short int 2 (1)
int signed int 2 veya 4 (1) veya (2)
long signed long int 4 (2)
signed short signed short int 2 (1)
signed signed int 2 veya 4 (1) veya (2)
signed long signed long int 4 (2)
unsigned short unsigned short int 2 (3)
unsigned unsigned int 2 veya 4 (3) veya (4)
unsigned long unsigned long int 4 (4)
float -- 4 (5)
double -- 8 (6)
long double -- 8 veya 10 (6) veya (7)
(1) -2
15
.. 2
15
-1 = -32 768 .. 32 767. (16 bitlik bilgisayarlar iin)
(2) -2
31
.. 2
31
-1 = -2 147 483 648 .. 2 147 483 647. (32 bitlik bilgisayarlar iin)
(3) 0 .. 2
16
-1 = 0 .. 65 535. (16 bitlik bilgisayarlar iin)
(4) 0 .. 2
32
-1 = 0 .. 4 294 967 295. (32 bitlik bilgisayarlar iin)
(5) -10
38
.. -10
-38
, 0, 10
-38
.. 10
38
.
(6) -10
308
.. -10
-308
, 0, 10
-308
.. 10
308
.
(7) -10
4932
.. -10
-4932
, 0, 10
-4932
.. 10
4932
.
Not: 16 bitlik bilgisayarlarda veya derleyicilerde (signed veya unsigned) int 16
bittir; 32 bitliklerde ise 32 bittir.
12 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
Tam saylar ve kayan noktal saylar iin her bilgisayarda farkl olabilecek bu
zellikler, tam olarak limits.h ve float.h adl balk dosyalarnda tanmlanmtr.
Birtakm varsaymlar yapmak yerine, bu balk dosyalarnda tanmlanm bulunan
deimezlerin kullanlmas zellikle nerilir. (Balk dosyalar iin bir sonraki ksma ve
ayrca Ksm F.5e baknz.)
1.4. #define Ve #include nilemci Emirleri
Hemen btn C derleyicileri, zel nilemci emirlerini tanyan bir nilemciyi yaplarnda
bulundururlar. nilemci emirleri, bir bakma, C derleyicisinin girdisini, yani kaynak
kodu, kontrol etmede kullanlr. Bir nilemci emrinin ilk karakteri her zaman numara
iaretidir (#) ve kaynak programda satrn ilk karakteri olmaldr. Normalde, nilemci
emirlerinin ou, kaynak programn bana, bildirimlerden nce yazlr.
C programlarnda oka kullanldklar iin, bu blmde sadece #define ve
#include nilemci emirleri anlatlmaktadr. Dier nilemci emirlerinin daha detayl
bir anlatm Blm 6da verilmektedir.
#define emri u ekildedir:
#define tantc_szck karakter_dizisi
Bu tr bir #define emri, emirden sonra gelen program deyimlerinde tantc_szck
bulunan her yerde, onun yerine karakter_dizisinin konulacan gsterir. rnein,
#define XYZ 100
emri, daha sonra, XYZnin her rastland yerde 100 konulmasn salar. Program iinde
kullanlacak deimezleri tanmlamann yaygn bir yolu da budur. #define emirleriyle
tanmlanan tantc szcklerin byk harfle yazlmas allagelmitir.
#include emri ya
#include "dosya_ad"
yada
#include <dosya_ad>
eklinde olur ve nilemciye #include satrnn yerini, belirtilen dosyann alacan
gsterir. Eer dosya_ad ift trnak iine alnmsa, o zaman nilemci, dosyay kaynak
program dosyasnn sakland altdizinde arar. Eer dosya_ad al parantezler iinde ise,
o zaman dosya, byle #include emirleri iin aramalarn yapld standart
altdizin(ler)de aranr. Normalde, bu \include altdizini olur.
#include emri, daha nceden hazrlanan, standart veya kullanc tarafndan
tanmlanan dosyalarda saklanan, sk kullanlan veri ve fonksiyon bildirimlerini programa
dahil etmede kullanlr. Byle dosyalara balk dosyalar ad verilir ve isimleri
dosyaadi.h eklinde olur.
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 13
1.5. leler, fadeler Ve Atama Deyimleri
C dili, salad ileler (ilem operatrleri) asndan ok zengindir. letilebilir C
deyimlerinin ou bir ifade eklinde yazlr. Bu ifade belirli kurallara uygun olarak
oluturulmu bir ilenenler ve ileler karmdr. Dier programlama dillerine karlk, C
dilinde bir atama bile zel bir eit ifadedir.
Bir ifade iinde, bir ilenen ya bir deimez, ya bir deikenin kullanlmas, ya bir
fonksiyon ars yada baka bir (alt)ifade eklinde karmza kar. leler (ilem
operatrleri), aritmetik ilemler, atama, bantsal ve mantksal karlatrmalar, bit
ilemleri, adreslerle ilgili ilemler ve baka ilerde kullanlrlar. Cde kullanlan aritmetik
ileler ve anlamlar liste eklinde aada verilmitir:
+ toplama veya tekli art
- karma veya olumsuzlama
* arpma
/ blme
% kalan (5%2 ifadesinin deeri, 5/2den arta kalan, yani 1dir. lenenler
olumlu tamsaylar olmaldr.)
++ anlam, ilecin, ilenenin nnde veya arkasnda olmasna bal olarak
deiir; ancak sonuta ilenenin deeri bir artrlr
-- anlam, ilecin, ilenenin nnde veya arkasnda olmasna bal olarak
deiir; ancak sonuta ilenenin deeri bir azaltlr
Basit bir atama deyimi u ekildedir:
deiken = ifade;
ve ifadenin deerinin hesaplandktan sonra, deikenin deerinin buna eitlenecei
anlamna gelir. fadeden sonraki noktal virgle dikkat edin. Bu noktal virgl deyimi
sonulandrr.
te baz rnekler. Son iki rnein, ayn anlam tadna dikkat edin.
a = b + 10;
c = d + c * e - f / g + h % j;
x = y * sin(z - 3.14);
z = u[2] * u[0];
u[1] = -123.45;
x = 10;
(x) = 10;
C dilinde, dier programlama dillerine karlk, atamann kendisi de bir ifadedir,
bundan dolay bir deere sahiptir. Bir atama ifadesinin deeri, deeri hesaplanarak sol
taraftaki deikene atanan ifadenin deeridir. Atama ifadesinin tipi ise soldaki ilenenin
tipiyle ayndr. Bu olgu, C dilinde ok kullanlr. rnein, bir ifadenin deeri ayn anda
birden fazla deikene, u ekilde, atanabilir:
a = b = c = 0;
14 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
c deikeni 0n deerini, b cnin deerini ve a bnin deerini alr; bylece btn
deikenler 0a eitlenir.
Aada ++ ve -- ilelerini aklamak iin baz rnekler verilmitir:
x = y++; ynin deeri nce xe atanr, sonra da bir artrlr. Bu una
edeerdir: x = y; y = y+1;
x = ++y; ynin deeri nce bir artrlr, sonra da xe atanr. Bu una
edeerdir: y = y+1; x = y;
x = y--; ynin deeri nce xe atanr, sonra da bir azaltlr. Bu una
edeerdir: x = y; y = y-1;
x = --y; ynin deeri nce bir azaltlr, sonra da xe atanr. Bu una
edeerdir: y = y-1; x = y;
++ ve -- ileleri yan etkisi olan ilelerdir, nk tek bir atama deyimi ile birden
fazla deikenin deeri deitirilebilir. Programclarn bu ileleri karmak ifadeler
iinde kullanmalar uygun deildir, nk byle bir kullanm nispeten daha zor
anlalabilir ve hatalarn daha zor dzeltildii programlarn ortaya kmasna neden olur.
Basit atama ileci (=) dnda, atamay aritmetik ilemlerle birletiren atama ileleri
de vardr. Bunlar +=, -=, *=, /= ve %=dr. te baz rnekler:
x += y; xe y eklenir, bu da x = x + (y); anlamna gelir.
x -= y; xten y karlr, bu da x = x - (y); anlamna gelir.
x *= y; x y ile arplr, bu da x = x * (y); anlamna gelir.
x /= y; x yye blnr, bu da x = x / (y); anlamna gelir.
x %= y; xe xin ye blmnden arta kalan atanr, bu da x = x %
(y); anlamna gelir.
Tabii ki, yukardaki deyimlerin herhangi birinde y deikeninin yerine genel bir ifade
konulabilir. Sol taraftaki x deikeni yerine de bellekteki belli bir konuma karlk gelen
daha karmak bir ifade konulabilir; rnein u[a+b]. Bu durumda bu ifade bir kez
hesaplanr. Dier baz ilemlerle atamay birletiren atama ileleri daha sonraki
blmlerde tartlacaktr.
ncelik Ve Birleme Kurallar
Bir ifade iinde, ilelerin ilenenleri ya
1. C dili tarafndan belirlenmi bulunan ilelerin ncelik ve birleme zelliklerine,
yada
2. ilenen ifadelerini parantez iine alarak
belirlenir.
Parantezler, bir ilecin ilenenlerini, o ilecin nceliine bal olmadan belirtmek
veya ilelerin ilenenlerini daha aklayc olacak ekilde yazmak iin kullanlrlar. kinci
neden kolayca anlalr ifadeler yazmak iin nemlidir, nk C dilinde ncelik ve
birleme zellikleri kolayca anmsanamayacak kadar ok ile bulunmaktadr.
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 15
rnein
a = b + c * d
ifadesinde ileler ve ilenenler yledir:
ile ilenenler
* c ve d
+ b ve (c * d)nin deeri
= a ve (b + (c * d))nin deeri
Eer ifade
a = b + (c * d)
eklinde yazlrsa, ilenenler ayndr, ancak parantezler ilelerin ilenenlerini daha ak
hale getirirler.
Fakat, ifade
a = (b + c) * d
eklinde yazlrsa, ileler ve ilenenler yle olur:
ile ilenenler
+ b ve c
* (b + c)nin deeri ve d
= a ve ((b + c) * d)nin deeri
Yukardaki rneklerden de grlebilecei gibi, bir ilecin ncelik dzeyi ilelere
atanacak olan ilenenlerin srasn belirlemeye yarar. Daha yksek ncelii olan bir ilecin
ilenenleri daha dk olan bir ileten nce atanacaktr. Eer ilelerin ncelik dzeyleri
aynysa, o zaman birleme kural ilenenlerin soldan saa m yoksa sadan sola m
atanacan belirtir. Aadaki izelgede, imdiye kadar anlatlm bulunan ilelerin
ncelik dzeyleri ve birleme zellikleri verilmitir:
ile ncelik birleme
[] indisleme en yksek
+, -, ++, -- tekli :
*, /, % arpma :
+, - toplama :
=, +=, vs atama en dk
Burada, sadan sola ve soldan saa birlemeyi gsterir. rnein
a/b/c ile (a/b)/c ayn anlama gelir
ve
a=b=c ile a=(b=c) ayn anlama gelir
Bir baka rnek olarak
c = d + c * e - f / g + h % j
16 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
ifadesi
c = (((d + (c * e)) - (f / g)) + (h % j))
eklinde, ilelerin ilenenlerini ve ifadenin anlamn deitirmeden, parantezlenebilir.
Dikkat: Bir ilecin ilenenlerinden hangisinin nce hesaplanacann belirtilmemi
olduuna dikkat edin. rnein
a = ++b - b
ifadesinin deeri, derleyiciye bal olarak, ya 0 yada 1 olabilir; bu yzden bu tr, yan
etkisi olan, ifadelerden kanlmas gerekir. Ayrca, + ve * gibi, birleme ve deime
zellii gsteren ilelerde, parantezlerin bulunmasna ramen, birleme kural baz
derleyiciler tarafndan dikkate alnmayabilir.
Deimez fadeler
Baz ilelerrnein, atama ve ++ ile -- ileleri dnda, imdiye kadar renmi
olduumuz ilelerdeimezlere (veya deimez ifadelere) uygulandklarnda deimez
ifadeler olutururlar. Deimez ifadelerin avantaj derleme srasnda
hesaplanabilmeleridir. Derleyici deimez ifadenin deerini hesaplayp yerine deimez
deeri koyar. Deimez ifadeler bir deimezin beklendii yerlerde kullanlabilirler.
rnein, dizi boylar deimez olmaldr, bu durumda
int a[MAXL*5+4];
tanm, eer MAXL nilemci tarafndan (#define ile) tanmlanm bir deimez ise
kabul edilebilecek, fakat eer MAXL bir deiken ise reddedilecektir. Programn
anlalabilirliini gelitirebilecei iin deimez ifadelerin kullanmndan kanmamak
gerekir.
1.6. Tip Dnm Ve Kalplar
Bir ile, ilenen(ler)ine uyguland zaman, belirli bir tipten bir deer oluturur.
Meydana kan deerin tipi, ilecin ilenen(ler)ine, ilecin kendisine ve tip dnm
kurallarna baldr. rnein, x+y ifadesinin deeri hesapland zaman, x ve y tamsay
ise ortaya kan deerin tipi de tamsay olur. C dilinde ilelerin ou, deiik tiplerde
ilenenleri kabul ettikleri iin genel olma zelliini tar. rnein, yukardaki ifadede eer
y double olsayd, ortaya kacak deer de double tipinde olacakt.
Deiik tipte ilenenlerin bulunduu ifadelere kark-tip ifadeler denir. Kark-tip
ifadelerin deerleri hesaplandnda, ara ve/veya sonu deerlerin tipleri, ya dolayl
olarak otomatik tip dnmyle belirlenir yada ak olarak kalp kullanlarak kontrol
edilir.
Deiik tipten iki ilenen varsa, C dili kurallarna gre, otomatik tip dnm
uygulanr. Bu kurallar yledir:
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 17
1. nce, char ve short olan ilenenleri inte veya gerekiyorsa unsigneda
dntr.
2. Sonra, aadaki listeye uygun bir ekilde, dk tipten olan ilenenin tipini daha
yksek tipten olannkine dntr:
tip dzey
long double en yksek
double :
float :
unsigned long :
long : unsignedn tm olas deerlerinin
long tarafndan ierildii varsaylrsa
unsigned :
int en dk
Tip dnm zerine birka rnek. i, jnin int, xin float, dnin double ve
cnin char olduunu kabul edin.
i = j + x + d;
c = c + 'A' - 'a';
lk ifadede, j floata dntrlr, j+xin deeri doublea dntrlr ve
j+x+dnin deeri doubledan inte evrilir. kinci ifadede, cdeki kk harfi bye
evirmek iin tamsay aritmetii kullanlr.
Otomatik tip dnm, programlarda nemli bir hata kayna olduu iin, tip
dnmnn, aka kalplar kullanlarak, kontrol edilmesi nerilir. Bir kalp, basite,
ifadenin nne konulan parantez iine alnm bir tiptir; yani,
(tip) ifade
ifadenin tipinin parantez iine alnm olan tipe dntrleceini gsterir. Gerekte,
parantez iine alnm olan tip, ifadenin deerini amalanan tipe dntren zel bir
iletir. Bu ilecin ncelii dier tekli ilelerin ncelii ile ayndr. te baz rnekler. x,
y, znin float, i, jnin int olduunu varsayn. y ve znin hesaplanmasndaki farka
dikkat edin.
x = (float) i;
y = (float) (i / j); /* int bolme islemi */
z = (float) i / (float) j; /* float bolme islemi */
i = (int) (x * (float) j);
1.7. Basit Girdi/kt
Girdi ve kt deyimleri gerekte C dilinin bir paras deildir. Yani, dier programlama
dillerinin tersine, C dilinin iine konmu girdi/kt deyimleri yoktur. Girdi/kt ilemleri,
her zaman, fonksiyonlar arlarak yaplr. Tabii ki, girdi/kt yapmak iin kullanlan
18 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
fonksiyonlarn programc tarafndan yazlmasna gerek yoktur. Hemen hemen btn C
ortamlarnda girdi/kt fonksiyonlar ieren standart ktphaneler bulunmaktadr. Bu
ktphanelerde tanmlanm bulunan fonksiyonlar (ile alabilecekleri argmanlar) ve ilgili
birtakm deikenlerin bildirisi ise bir balk dosyasna konur. stdio.h byle bir balk
dosyasdr ve herhangi bir standart girdi/kt fonksiyonu arlmadan veya deikenleri
kullanlmadan nce
#include <stdio.h>
yazlarak kaynak programn iine kopyalanmas gerekir.
Kullancnn girdi/kt yapmas iin, girdi/kt ara dosyasnn tanm nceden
yaplmtr. Bunlar unlardr:
stdin standart girdi
stdout standart kt
stderr standart hata kts
ve normal olarak kullancnn klavye ve ekranna balanmtr.
Programcnn basit girdi/kt ilemleri yapmas iin, sadece gerekli olan printf,
scanf, getchar, putchar, _getch ve _getche fonksiyonlar bu ksmda
anlatlacaktr. Dier girdi/kt fonksiyonlar iin girdi/kt ile ilgili blme baknz.
printf(kontrol_karakter_dizisi, argman_listesi
opt
) Fonksiyonu
Bu fonksiyon stdouta yaplacak biimli kt iindir. Kontrol_karakter_dizisi,
argman_listesindeki argmanlarn deerlerinin ktsn denetleyen sfr veya daha fazla
dnm tanmlamalar salar. Argman_listesi virgllerle ayrlm argmanlardan oluur
ve bulunmas zorunlu deildir.
En basit dnm tanmlamas u ekildedir:
%z
Burada znin yerine aadaki dnm karakterlerinden biri gelmelidir:
dnm karakteri kt
c iaretsiz bir karakter
s karakter dizisi (karakter gstergesi)
d veya i iaretli bir ondalk tamsay
u iaretsiz bir ondalk tamsay
x, X iaretsiz bir onaltl tamsay
o iaretsiz bir sekizli tamsay
f double
e, E e veya E gsteriminde double
g, G e (E) veya fnin en ksas
p bir gstergenin deeri
n imdiye kadar yazlm olan karakterlerin says
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 19
Genelde, bir dnm tanmlamas u ekildedir:
%f0w.plz
Burada f istee bal olarak aadaki bayraklardan biridir:
bayrak anlam
- kt alannda sola yanatr
+ ne bir iaret koy
# kayan noktal saylar iin mutlaka nokta konmasn
sala; sekizli iin ne 0, onaltl iin ne 0x (0X)
koy
boluk karakteri eer iaret yoksa bir boluk koy
stee bal olan 0, saynn solunu sfrla doldurmak iindir. stee bal olan w says,
kt deerini alacak olan kt alannn geniliini belirtir. stee bal olan p says,
kayan noktal bir say iin kesir ksmndaki rakamlarn saysn, bir karakter dizisi iin
yazlacak en fazla karakter saysn veya bir tamsay iin yazlacak en az rakam saysn
gsterir. stee bal olan l ise argmann ksa (h), uzun (l) bir tamsay veya uzun (L) bir
double olduunu gsterir.
float iin bir dnm tanmlamas olmadna dikkat edin; herhangi bir float
ifadeyi bir kalp kullanarak doublea dntrn. w ve pnin yerine konulacak bir *,
geniliin argman_listesindeki bir int argmandan alnacan gsterir. Normalde,
deerler kt alanlarnda saa yanatrlrlar.
te baz rnekler. cnin int, toplamn da double olduunu varsayn. Yeni satr
karakterlerine dikkat edin.
printf("Merhaba\n");
printf("%s\n", "Merhaba"); /* yukaridakiyle ayni cikti */
printf("\nSayi=%d adet", c); /* c'nin degeri gereken */
/* genislikte bir tamsayi olarak yazilir */
printf("\nSayi=%4d adet", c);
/* yukaridakiyle ayni, ancak alan genisligi en az 4 */
printf("\nToplam=%5.2f", toplam);
printf("\nToplam=%*.*f", 5, 2, toplam);
/* toplam'in degeri dd.dd biciminde yazilir */
printf("\nToplam=%5.2f Sayi=%4d", toplam, c);
Eer %den sonraki karakter geerli bir karakter deilse, sonucun ne olaca
belirsizdir; %% tek bir yzde iareti basar. printf fonksiyonu hakknda daha fazla bilgi
iin, ilgili C derleyicisinin girdi/kt ktphane fonksiyonlar el kitabna veya evrimii
yardm kolaylklarna baklmas nerilir.
scanf(kontrol_karakter_dizisi, argman_listesi
opt
) Fonksiyonu
Bu fonksiyon stdinden biimli girdi yapmak iindir. Kontrol_karakter_dizisi,
argman_listesindeki argmanlara verilecek deerleri kontrol eden sfr veya daha fazla
dnm tanmlamalar salar. Kontrol_karakter_dizisindeki dnm karakterleri
20 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
dndaki karakterlerin, girdi akmnda karlk gelen karakterlerle ayn olmas beklenir.
Argman_listesi girdi deerleri iin hedef olan deikenlerin adreslerinin, birbirinden
virglle ayrlarak, yazlmasndan oluur. Yaplm olan baarl dnmlerin says,
fonksiyonun deeri olarak geri dndrlr.
Dnm tanmlamalar u ekildedir:
%*wlz
Burada * deerin argmana atanmasn engeller, w en byk alan geniliini belirtir, l ise
argmann bykln gsterir. de istee baldr. z dnm karakteri genelde
printfteki gibidir. Girdi akmnda, bir alan, beyaz (boluk, tab, yeni satr vs) olmayan
bir karakterle balayp, ilk gelen beyaz karakterle veya belirtilen alan uzunluu sonunda
biter.
te baz rnekler. c1, c2nin char, inin int, ynin float, dnin double ve
snin char dizisi olduunu varsayn. %lf bir saynn okunmasn ve double olarak
depolanmasn salar. long double iin %Lf kullann. & ilecinin, fonksiyona
deikenin deerinin deil de adresinin iletilmesi iin kullanldna dikkat edin. Bu ile
Blm 3te anlatlacaktr.
scanf("%d", &i);
scanf("%4d", &i);
scanf("%c%c%*3s%d%f%lf", &c1, &c2, &i, &y, &d);
scanf("%[^.].", s);
scanf("%[ABC]", s);
Son iki rnein ilki, (beyaz boluk karakterlerinden biriyle deil de) bir nokta ile
sonlandrlm bir karakter dizisinin okunarak noktann atlanmasn salar. Son rnekte,
sadece A, B veya C karakterlerini ieren bir karakter dizisi okunmaktadr. scanf
fonksiyonunun kullanm hakknda daha fazla bilgi iin, derleyicinizin elkitaplarna veya
evrimii yardm kolaylklarna bavurunuz.
getchar() Ve putchar() Fonksiyonlar
Bu fonksiyonlar stdinden veya stdouta bir karakterin girilmesini veya ktsnn
yaplmasn salarlar. Tipik bir kullanm yledir. cnin char veya int olduunu
farzedin.
c = getchar();
putchar(c);
Eer klavyeden girilen bir karakter dizisi arka arkaya getchar fonksiyonunun
arlmasyla okunursa, getchar()n verecei son karakter satr ilerletme karakteri
('\n') olacaktr, nk satrba karakteri ('\r') standart girdi/kt yordamlar
tarafndan elenmektedir. Ayn ekilde, putchar() kullanldnda, satr sonuna '\n'
yazlmas yeterlidir; '\r' karakteri otomatik olarak '\n'nin nne eklenecektir.
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 21
_getch() Ve _getche() Fonksiyonlar
Standart olmayan bu fonksiyonlar, klavyedeki bir tua yaplan tek bir vurutan ortaya
kan karakteri verirler. Yani programn bilgi alabilmesi iin, getchar() gibi, satrn
ENTERla bitirilmesini beklemezler. _getche()de girilen karakter ekrana yanstlr,
_getch()de bu olmaz. Not: Bu fonksiyonlar standart olmadklar iin, isimlerinin
nnde altizgi (_) karakteri bulunmaktadr; ancak baz sistemlerde, rnein Microsoft C
derleyicisinin eski uyarlamalarnda, altizgi karakteri olmadan kullanlmalar gerekebilir.
Verilen rnek programlarda bunu dikkate alarak, kendi sisteminiz iin gerekli
dzenlemeleri yapabilirsiniz.
Girdide Dosya Sonu Kontrol
stdio.h balk dosyasnda #define ile tanmlanm bulunan EOF ismi dosya sonunu
kontrol etmek iin kullanlabilir. Sistemimizde, dosya sonu ASCII ondalk kodu 26 olan
CONTROL+Z (klavyedeki CONTROL tuu basl iken Zye baslarak oluturulur) karakterinin
alnmas eklinde tanmlanmtr. Ancak C ktphanesindeki standart bir fonksiyon
tarafndan dndrlen dosya sonu iareti EOFtur. if deyiminin henz anlatlmamasna
ramen, aadaki rnek stdinden dosya sonunun nasl anlalabileceini gsterir.
Dikkat: cnin tipi en azndan int olmaldr.
c = getchar();
if (c == EOF) { /* eger dosya sonu ise */
...
dosya sonu ilemleri yapan deyimler
...
}
1.8. C Deyimleri Ve Program Gvdesi
C programlar deyimlerden oluur. Yazlabilecek en basit deyim bir ifade deyimidir. Bir
ifade deyimi, arkasna noktal virgl konmu herhangi bir ifadedir. rnein,
a + b * c;
i++;
iki ayr ifade deyimidir; ancak bunlardan ilki pek bir ie yaramaz, oysa ikincisi, yan
etkisinden dolay, bir ie yarar: inin deerinin bir artrlmasna neden olur.
Bileik bir deyim dnda her deyim noktal virglle sona erer.
Bir bileik deyim (ayrca, bildirimler ierdii zaman, blok da denir), aadaki gibi
engelli parantezler arasna alnm bir deyimler srasdr. Bileik deyimden sonra noktal
virgl olmadna dikkat edin.
{ bildirimler
opt
deyim
1opt
deyim
2opt
... deyim
n opt
}
22 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
Szdizimsel adan bir bileik deyim tek bir deyime edeerdir. stee bal olarak,
bir bileik deyimin ilk yrtlebilir deyiminden nce deiken tanmlar ve bildirimleri
bulunabilir. Tanmlarn bir bileik deyim iine konmasnn nemli bir sonucu vardr.
Yrtme esnasnda, bir bileik deyim iinde tanmlanm bulunan deikenler iin bloa
girildiinde bellek ayrlr; bloktan kldnda ise bu bellek blgesi serbest braklr. Eer
bileik deyim dnda ayn isimde deikenler varsa, bloa girildiinde, bunlarn
kimlikleri geici olarak unutulur ve yeni tanmlar etkili olur. Bloktan kldnda eski
tanmlar etkilerini tekrar kazanrlar. Bu durum iie olan bloklar iin meydana gelebilir.
imdilik, bir C programnn genel ekli aadaki gibi zetlenebilir:
/* * * * * * * * * * * * * * * * * * * * * * * * * * *\
* *
* Programin ne yaptigini, kimin tarafindan, ne *
* zaman yazildigini vs belirten aciklamalar. *
* *
\* * * * * * * * * * * * * * * * * * * * * * * * * * */
...
btn nilemci emirleri
...
void main (void)
{
...
veri tanmlar
...
deyimler
...
} /* main */
Program gvdesinin byk bileik bir deyimden olutuuna dikkat ediniz. Daha sonra
anlatlaca gibi, fonksiyon tanmlar da ayn ekilde yazlr, yani ana program da bir
bakma bir fonksiyondur.
1.9. Bir C Program Nasl letilir
Birok bilgisayar ve iletim sistemi iin ok sayda C program gelitirme ortamlar ve
derleyicileri mevcuttur. Bu ksmda, IBM Kiisel Bilgisayarlar veya uyumlularnn MS-
DOS iletim sistemi altnda alan Microsoft QuickC (MS-QC) Uyarlama 1.01in
kullanm ksaca anlatlacaktr. Microsoft komut satr derleyicisi (MS-CL) ise daha
detayl olarak Ek Bde anlatlmaktadr.
MS-QC, kullanm ok kolay olan bir C programlama ortamdr, bundan dolay
onunla balamanz neririz. MS-QC, btnlemi bir kaynak program editr, detayl
saylabilecek yardm kolayl ve yrtme zaman hata dzelticisiyle birlikte gelir. Yeni
bir C programcs, MS-QC ortamndan ayrlmadan bir C program yazabilir, derleyebilir,
altrabilir ve hatalarn dzeltebilir.
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 23
MS-QC, uygun bir ekilde, hard diskinize yerletirilmise veya datm disketi disket
srcnze yerletirilmise, iletim sistemi iletisine QC yazn. sterseniz, C programnz
ieren kaynak dosya adn da belirtebilirsiniz. rnein,
C>QC mprog.c
MS-QC, tepesinde birtakm men maddelerinin bulunduu ve komut satrnda belirtilen
kaynak dosyadan satrlarla doldurulan bir grntleme blgesinden oluan bir ekran
sunacaktr. Eer kaynak dosya belirtilmemise grntleme blgesi bo olacaktr. Hemen
yeni C programnz yazmaya balayabilirsiniz veya aadaki dzenleme tularn
kullanarak eski bir programda deiiklikler yapabilirsiniz:
Yukar, aa, sola, saa oklar,
PAGE UP (sayfa yukar),
PAGE DOWN (sayfa aa) imle hareketi
INSERT araya ekleme/ste yazma
DELETE imlecin arkasndaki karakteri silme
Dier klavye tularnn dzenleme ilevlerini ortaya karmak iin deneme yanlma
yntemini kullann. MS-QC editrnn kullanm temelde MS-DOSdaki EDIT
komutuna benzemektedir.
Bir C program yazldktan sonra, bir men maddesi seilerek derlenebilir,
altrlabilir, hatalar dzeltilebilir veya bir dosyada saklanabilir. Eer fareniz varsa,
seime doru srn ve tulayn. Yoksa, men maddesinin ilk harfinin x olduunu
varsayarsak, ALT+xe basn. Ayn ekilde, ALTa basp, ok tularn kullanarak men
maddesini seip ENTERa da basabilirsiniz. MS-QC men maddesinde alt izilmi harfe
basarak ilgili seenek seilebilir. rnein,
ALT+F: Dosya mensn a
X: MS-DOSa k
S: Program sakla
vs.
ALT+R: Gei mensn a
C: Derle
S: Derlenmi program yrtmeye bala
vs.
vs.
ESC: Alt men penceresini kapa
Bir men maddesinin seilmesi, diyalog penceresi denilen, ya ek seimler yada bilgi
veren mesajlar sunan baka bir pencerenin grntlenmesine yol aabilir. Bu tip men
maddelerinin sonunda nokta bulunur.
Szdizimsel ynden hatal bir program derlendiinde, MS-QC btn szdizim
hatalarn bulup ilk hatal deyimi grntleyecektir. mle, hatann zerinde duracak ve
ekrann alt tarafndaki diyalog kutusunda bir hata mesaj grntlenecektir. Bir nceki
24 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
veya sonraki hata blgesi SHIFT+F3 veya SHIFT+F4e baslarak grntlenebilir. Bu
ekilde, tekrar derlemeden nce, btn hatalar bulup dzeltebilirsiniz.
Bir C program ayrca, basite SHIFT+F5e baslarak veya RUN altmensnden
START seilerek derlenip altrlabilir. Szdizimsel hatalar az nceki gibi
bildirilecektir, fakat uyar dnda baka hata yoksa, programn yrtlmesine geilecektir.
Programn kts otomatik olarak kt ekrannda grntlenir. MS-QC grntsne geri
dnmek iin ENTERa basn. kt ekrann tekrar grntlemek iin F4e basn.
imdi de hata bulma konusunda bir iki sz. Aadaki yntemleri kullanmak iin
programnzn DEBUG modunda derlenmesi gerekmektedir. Bunun iin, nce ALT+Rye
sonra Cye basn. Gelen pencerenin sa tarafnda Debug yazsnn nnde X iareti olup
olmadn kontrol edin. Eer yoksa ALT+Dye basn. Daha sonra ENTERa basp program
derleyin.
Programnz altrmaya balamadan nce, deyime bir kesilme noktas (breakpoint)
koyarak, yrtmenin o deyime gelince beklemesini salayabilirsiniz. Sadece imleci
deyimin stne gtrp F9a basmanz yeterlidir. Daha sonra, kesilme noktasn
kaldrmak isterseniz ayn ilemi tekrarlayn.
Programn almas devam ettii esnada bir deikenin ve/veya ifadenin deerini
grntleyebilirsiniz. DEBUG altmensndeki ADD WATCH men maddesini sein ve
srekli grntlemek istediiniz deikeni veya ifadeyi yazn.
altrlmakta olan deyimleri grntlemek iin bir izleme (trace) kolayl da
mevcuttur. Bir fonksiyon ars esnasnda fonksiyon iindeki deyimleri izlemek iin F8e
basn, fonksiyon iindeki deyimlerin izlenmesini atlamak iin F10a basn.
QuickCnin, C programlamasn kolay hale getiren baka birtakm kolaylklar da
vardr. Kullancnn ilgili elkitaplarna bakmas ve/veya men seimlerini deneyerek bu
kolaylklar ortaya karmas nerilir. Microsoft Visual C++ Development System for
Windows paketi iindeki Visual Workbench program kullanm bakmndan MS-QCye
uyumlu, ancak profesyonel kullanclara ynelik ok daha gelimi bir ortam salar. Dier
etkileimli C ortamlarnda da benzer olanaklar sunulmaktadr.
1.10. rnek Programlar
Bu ksmdaki rnek programlar, ne ie yaradklar hakknda kendi kendilerini aklayacak
ekilde yazlmlardr, ancak henz anlatlmamif ve while gibibaz deyimler ve
ileler ierirler. Bunlarn anlamlarn ortaya karmak iin, okuyucu, eski programlama
deneyimlerine dayanarak bir kestirimde bulunabilir.
rnek Program 1
Bu programda kullanlan _getche fonksiyonu, bir standart girdi fonksiyonu olmad
iin, dosya sonu kontrol MS-DOS standardna uygun olarak CONTROL+Z karakteri
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 25
kullanlarak yaplmaktadr. Not: _getche fonksiyonunun kullanmndan dolay, bu
program ANSI Standardna uygun deildir.
1. /* * * * * * * * * * * * * * * * * * * * *\
2. * *
3. * Bu program, CONTROL+Z girilinceye *
4. * kadar, klavyeden girilen her karak- *
5. * terin ASCII kodunu verir. *
6. * *
7. \* * * * * * * * * * * * * * * * * * * * */
8.
9. #include <stdio.h>
10. #include <conio.h>
11. void main (void)
12. {
13. int c;
14. char ctrlz = 26; /* ASCII ond. kodu 26 (CONTROL+Z) */
15.
16. printf("\nBazi kontrol karakterleri disinda,"
17. "\ngirilen karakterin kodu goruntulenecek.");
18. while (1) {
19. /* Ekrana yansitarak bir klavye tusunu oku.
20. * CONTROL+Z'ye basilmissa programi bitir.
21. */
22. printf("\nBir karakter girin: ");
23. if ((c = _getche()) == ctrlz)
24. break;
25. /* Girilen karakterle ayni satirda ondalik, onaltili
26. * ve sekizli olarak ASCII kodunu goruntule.
27. */
28. printf(", ondalik: %d, onaltili: %x, sekizli: %o",c,c,c);
29. } /* while */
30. } /* main */
rnek Program 2
1. /* * * * * * * * * * * * * * * * * * * * * * * * * * *\
2. * *
3. * Bu program, -1 girilinceye kadar, klavyeden *
4. * girilen ondalik sayilari kabul eder, daha sonra, *
5. * girilen sayilarin agirlikli toplamini, ortala- *
6. * masini ve varyansini hesaplayip goruntuler. *
7. * *
8. * Uyari: Cok buyuk sayilarin ve rakam olmayan *
9. * karakterlerin girilmesi sorun yaratabilir. *
10. * *
11. \* * * * * * * * * * * * * * * * * * * * * * * * * * */
12.
13. #include <stdio.h>
14. #define AGIRLIK 1.0
15. /* Eger veri degerleri agirlikli olarak hesaplanacaksa,
16. * agirliga farkli bir deger verin.
17. */
18.
26 TEMEL KAVRAMLAR VE GENEL BR BAKI BLM 1
19. void main (void)
20. {
21. int sayi;
22. int adet = 0;
23. double kn_sayi, toplam=0.0, karelerin_toplami=0.0;
24. double ortalama=0.0, varyans=0.0;
25.
26. printf("\nToplam, ortalama ve varyans hesaplayan program."
27. "\n\nLutfen ilk sayiyi (veya cikmak icin -1) girin: ");
28. scanf("%d", &sayi);
29. /* Girilen sayi olumsuzsa programi bitir. */
30. while (sayi >= 0) {
31. adet++; /* Sayaci artir */
32. /* Sayiyi double'a cevirip AGIRLIK'la carp. */
33. kn_sayi = (double)sayi * AGIRLIK;
34. /* Yeni toplami ve karelerin toplamini hesapla. */
35. toplam += kn_sayi;
36. karelerin_toplami += kn_sayi * kn_sayi;
37. /* Yeni ortalama ve varyansi hesapla. */
38. ortalama = toplam / (double)adet;
39. varyans = ortalama*ortalama-karelerin_toplami/(double)adet;
40. if (varyans < 0.0)
41. varyans = -varyans;
42. /* Hesaplanan degerleri goruntule. */
43. printf("\nAdet = %d", adet);
44. printf(", toplam = %.2f", toplam);
45. printf(", ortalama = %.2f", ortalama);
46. printf(", varyans = %.2f", varyans);
47. /* Bir sonraki sayiyi al. */
48. printf("\nLutfen bir sonraki sayiyi "
49. "(veya cikmak icin -1) girin: ");
50. scanf("%d", &sayi);
51. } /* while */
52.
53. /* En son hesaplanan degerleri bir daha ve degisik
54. * bir bicimde goruntule.
55. */
56. printf("\nVerilerin adedi: %12d", adet);
57. printf("\nToplam : %15.2f", toplam);
58. printf("\nOrtalama : %15.2f", ortalama);
59. printf("\nVaryans : %15.2f", varyans);
60. } /* main */
Problemler
1. Kernighan ve Ritchienin (1978de yaynlanan) The C Programming Language adl
kitaplarnn ilk basksnda entry ad verilen bir anahtar szckten bahsedilmekte
idi. u anki Standartta ve grdmz herhangi bir derleyicide mevcut deildir;
ileride kullanlmak amacyle ayrld sylenmekte idi. Derleyicinizde entrynin bir
anahtar szck olup olmadn belirlemede size yardmc olacak bir program
deneyin.
2. Soyaacnz basan bir program yazn. ( dzey yeterlidir.)
3. Aadaki deyimin sonucunu aklamaya aln:
BLM 1 TEMEL KAVRAMLAR VE GENEL BR BAKI 27
printf("%d", printf("C iyi bir dildir.\n"));
4. Aadaki geerli bir deyim midir?
((x) = (5));
5. Aadaki geerli bir C deyimi midir?
{{{}}}
6. Aadaki programn, girdi olarak verilen bir gerek saynn tamsay ksmn
grntleyeceine inanlmaktadr:
#include <stdio.h>
void main (void)
{
float x;
scanf("%f", x);
printf("%d", x);
}
Fakat alr gibi gzkmemektedir. Dzeltin. pucu: Derleyicinin bulamayaca iki
ayr hata bulunmaktadr.
29
BLM 2: DEYMLER VE
KONTROL AKII
Dnlecei gibi, her deyim, bilgisayara ne yapacan syleyen, temel bir program
admdr. Bu blme, tm C deyimlerinin bir listesini vermekle balayacaz. Ondan
sonra, kontrol ak deyimleri iindeki ifadelerde ska kullanlan ile grubundan
bahsedeceiz. Blmn geri kalannda, C program deyimlerinin yrtlme srasn
kontrol eden deyimler detayl olarak anlatlacaktr.
Bir C program main fonksiyonunun ilk deyiminden almaya balar. Eer kontrol
ak baka yne ynlendirilmezse, deyimler, program iindeki sralarnda ard arda
iletilir ve yrtme mainin son deyiminden sonra durur. Kontrol akn ynlendirmenin
bir yolu da bir fonksiyon ars yapmaktr. Bu blmde ayrntl olarak anlatlacak
deyimler ise kontrol akn kendilerine zg yollarla etkilerler.
Balamadan nce, Pascal-severlere nemli bir uyarmz var: C dilinde, noktal virgl,
deyimleri ayrmak iin deil, baz deyimleri bitirmek iin kullanlr. Yani, noktal virgl
deyimin bir parasdr. Gerek olmadn sandnz baz yerlere noktal virgl koymanz
gerekebilir. rnekleri grdke, kurallarn daha ak olacan umuyoruz.
2.1. C Dilinin Deyimleri
izelge 2.1de btn C deyimleri liste halinde verilmitir. Bu izelgenin ilk iki maddesi
nceki blmde zaten anlatlmt. Geri kalanlar ise temelde kontrol ak deyimleridir ve,
return dnda, hepsi bu blmde anlatlacaktr.
30 DEYMLER VE KONTROL AKII BLM 2
ZELGE 2.1 C dilinin deyimleri
deyim ilev
ifade eitli (atama, fonksiyon arma vs)
bileik birden fazla deyimden tek bir deyim oluturur
if
koullu yrtme
switch
(herhangi bir sayda seeneklerle) koullu yrtme
while
(devam testinin her yinelemeden nce olduu) dng
for
while gibi, fakat bir ilkleme blm var
do
(devam testinin her yinelemeden sonra olduu) dng
break
bulunulan bloktan dar atlanmas
continue
mevcut yinelemenin geri kalannn atlanmas
goto
(bulunulan fonksiyon iinde) herhangi bir blgeye atlanmas
etiketli gotonun hedefi
return
(olas bir deerle) fonksiyondan dn
bo hi (baz szdizimsel kullanmlar vardr)
2.2. Bantsal Ve Mantksal leler
C dilinde dokuz ile, doru veya yanl diye yorumlanabilecek deerler verir. Cnin zel
bir Boolean (yani mantksal) veri tipi yoktur ve bu ilelerle oluturulmu bir ifadenin
deeri, eer ifade doru ise, 1, yanlsa 0dr. Aslnda, sfrdan farkl her say C dilinde
doru anlamn tar. Byle bir sonucun tipi her zaman inttir. Aada, bu ileler,
azalan ncelik sralarna gre anlatlmaktadr. Btn doruluk-deerli ileler, struct
ve trevleri dnda, her tipten ilenen kabul eder. Sadan sola doru birleen ! tekli ileci
dnda, burada anlatlan tm ileler soldan saa birleirler. Bantsal ve mantksal
ileler deimez ifadelerde de kullanlabilirler.
Mantksal Olumsuzlama leci !
! (deil) ileci ilenenin mantksal deerini olumsuzlar; yani eer ilenen 0sa 1 verir,
eer ilenen sfrdan farkl ise 0 verir. rnekler:
/* Bu ve bir sonraki kisimda; a=150, b=45.33, c=-132, d=0 */
!a deeri 0dr
!c deeri 0dr
!d deeri 1dir
!(b+c) deeri 0dr
!!c deeri 1dir
Bantsal leler <, >, <=, Ve >=
Bu ilelerin isimleri yledir:
BLM 2 DEYMLER VE KONTROL AKII 31
ile isim
< kktr
> byktr
<= kk veya eittir
>= byk veya eittir
Bantsal ileler ilenenlerini karlatrr ve duruma gre doru veya yanl bir
deer verirler. rnekler:
a<b deeri 0dr
b>=d deeri 1dir
a>b>c (a>b)>cye edeerdir ve deeri 1dir
a<c<b (a<c)<bye edeerdir ve deeri 1dir
Eitlik leleri == Ve !=
== ileci, eer ilenenleri eitse 1, yoksa 0 verir. != ileci ise tam tersini yapar. Sk
yaplan bir yanl, == ileci yerine atama ilecini (=) kullanmaktr. Buna dikkat edin.
rnekler:
a==b deeri 0dr
a=b deeri bdir ve bir atama ifadesidir
Bizim sistemde,
x = 5.0/3.0; /* x'in tipi float'tir */
deyiminden sonra,
5.0==3.0*x
ifadesi 0 (yani yanl!) verir. Bunun nedeni hibir bilgisayarn, 1.666666 saysndaki
sonsuz sayda 6y saklayamamasdr. Ayn sorun 3.0 yerine 25.0 de kullansanz ortaya
kabilir. Genelde, kayan noktal saylarn kesin olmasn bekleyemezsiniz, bundan dolay
(derleyici tarafndan izin verilmesine ramen) <=, >= ve eitlik ilelerinin ilenenleri
olarak float tipinde ifadeler kullanmak tehlikelidir.
Mantksal VE leci &&
&& ileci ilenenlerinin mantksal VEsini verir, yani eer her iki ilenen doru ise sonu
1 olur, aksi takdirde 0dr. Bu tanmdan, eer ilenenlerden biri 0sa sonucun kesinlikle
sfr olaca ve dier ilenenin deerinin hesaplanmasna gerek olmad aktr. C, bu
geree dayanarak, dier baz dillerin tersine, ilk ilenenin deeri 0sa ikincisini
hesaplamaz. rnekler:
/* fn()'nin 657 veren bir fonksiyon oldugunu varsayin */
a&&b deeri 1dir
d&&fn() deeri 0dr ve fn() arlmaz
fn()&&d deeri 0dr ve fn() arlr
32 DEYMLER VE KONTROL AKII BLM 2
Mantksal VEYA leci ||
|| ileci ilenenlerinin mantksal VEYAsn verir, yani eer her iki ilenen yanl ise
sonu 0 olur, aksi takdirde 1dir. Grdnz gibi, eer ilenenlerden biri sfrdan farkl
ise, teki ilenenin deeri ne olursa olsun sonu 1dir. Yukarda anlatlan yararl zellik
burada da geerli olur; eer ilk ilenen sfrdan farkl ise, ikinci ilenen hesaplanmaz.
rnekler:
a||d !(!a&&!d)e edeerdir ve deeri 1dir
a||b deeri 1dir
c||d deeri 1dir
d||(!c) deeri 0dr
2.3. Doruluk-Deerli fadeler
Birok yeni ile rendiimize gre, Blm 1de verilmi olan ile ncelii ve birleme
izelgesinin geniletilmi bir uyarlamasn verelim. Bu izelge 2.2de gsterilmektedir.
ZELGE 2.2 C ile ncelii ve birleme
[]

! ++ -- + - (tip)
* / %

+ -

< <= > >=

== !=

&&

||

= *= /= %= += -=

Bir nceki ksmdaki ileler kullanlarak yazlm baz doruluk-deerli ifade
rnekleri yledir:
!(a<=c) a>cye edeerdir ve deeri 1dir
!a>c 0>cye edeerdir ve deeri 1dir
!(a==b) a!=bye edeerdir ve deeri 1dir
a<b==c>d 0==0a edeerdir ve deeri 1dir
!a<=b!=c&&d deeri 0dr ve btn ifadeler hesaplanr
!a||d deeri 0dr
a!=b||fn() deeri 1dir ve fn() arlmaz
BLM 2 DEYMLER VE KONTROL AKII 33
2.4. if Deyimi Ve Koullu le
if deyimi, if anahtar szcnn arkasna parantez iine yazlm bir ifade ve peinden
gelen bir deyimden oluur. Tm bunlarn arkasnda, istee bal olarak, bir else anahtar
szc ve bir deyim bulunabilir. ifin bu iki ekli aadaki gsterimde
zetlenmektedir:
if (ifade)
deyim
ve
if (ifade)
deyim
else
deyim
te elsei olmayan bir if deyimi rnei:
if (yas > 65) {
yasli_kisiler++;
printf("Yasli bir kisisiniz.\n");
}
Eer yas 65ten bykse, blok iindeki deyimler altrlr, aksi takdirde, kontrol
dorudan bir sonraki deyime geer. Bu deyimi, her yatan kiiye hitap edecek ekilde
deitirelim:
if (yas > 65) {
yasli_kisiler++;
printf("Yasli bir kisisiniz.\n");
} else
printf("Henuz yasli bir kisi degilsiniz.\n");
imdi, deyiminiz, eer yas 65in stnde ise, az nceki deyimle ayn ekilde
davranacaktr, aksi takdirde yeni mesaj grntlenecektir. Genelde, parantez iine alnm
ifadenin deeri doru (sfrdan farkl) ise, ifadeden sonra gelen deyim iletilir; ifadenin
deeri yanl (sfr) ise, else anahtar szcnden sonra gelen deyim (varsa) iletilir.
rneklerimizde de grld gibi, bu deyimler bileik deyimler olabilir, bu da bileik
deyimlerin daha nce belirtiimiz iyi zelliidir: Birok deyimden tek bir deyim
olutururlar. Ayrca, bileik deyim balatan { karakterinin ifade ile ayn satrda, onun
karl olan } karakterinin de anahtar szckle ayn stuna yazldna dikkat ediniz.
Bu karakterlerin tam yeriblou doru bir ekilde ayrdklar srecederleyiciyi
ilgilendirmez, ancak bu ekilde yazmann programlar anlamay kolaylatraca
inancndayz ve bunu kitap iinde uygulamaya devam edeceiz.
phesiz, iie if deyimleri yazabilirsiniz. Tipik bir rnek yle olabilir:
34 DEYMLER VE KONTROL AKII BLM 2
if (yas > 65) {
yasli_kisiler++;
printf("Yasli bir kisisiniz.\n");
} else if (yas > 40) {
orta_yastaki_kisiler++;
printf("Orta yastasiniz.\n");
} else if (yas > 17) {
genc_kisiler++;
printf("Gencsiniz.\n");
} else
printf("Cocuksunuz.\n");
Bunun tek bir deyim olduuna dikkat ediniz. imdi unun zerinde dnn:
if (yas < 65)
if (yas > 40) printf("Orta yastasiniz.\n");
else
printf("Cok yaslisiniz.\n");
Eer yas 65ten byk veya eitse ne olacaktr? Dier bir deyile, else hangi
ife aittir? Mesajlar ve ierlek yazma ekli, bu deyimi yazan kiinin ilk ife ait
olduunu dnd izlenimini uyandryor, fakat bu doru deil! Kural yledir: Her
else en yakn elsei olmayan ife aittir. Bundan dolay, yukarda yaplmak istenen ii
doru ekilde yapan if udur:
if (yas >= 65)
printf("Cok yaslisiniz.\n");
else if (yas > 40)
printf("Orta yastasiniz.\n");
veya,
if (yas < 65)
if (yas > 40)
printf("Orta yastasiniz.\n");
else
;
else
printf("Cok yaslisiniz.\n");
elseten sonraki noktal virgl bir bo deyim oluturur. Grdnz gibi,
szdizimin bir deyim gerektirdii, fakat yaplacak bir ey olmad yerde bo deyim
kullanlabilir. Baka bir yol olarak, ikinci ifi bir blok iine alrsak, bo deyimli else
kullanmak zorunda kalmayz.
if (ifade_1)
deiken = ifade_2;
else
deiken = ifade_3;
eklindeki bir if deyimi, koullu ile kullanlarak
BLM 2 DEYMLER VE KONTROL AKII 35
deiken = ifade_1 ? ifade_2 : ifade_3;
eklinde basite yazlabilir. Genelde, C dilindeki tek -ilenenli (l) ile olan ?:
ileci, nce ifade_1i hesaplar ve eer ifade_1 doru ise ifade_2nin deerini, aksi
takdirde ifade_3n deerini verir. Son iki ifadeden sadece biri hesaplanr. Sonucun tipi,
nceki blmde anlatlan dnm kurallarna gre ifade_2 ve ifade_3 birlikte dikkate
alnarak belirlenir. ?: ilecinin sadan sola doru birleme zellii vardr ve ncelii
Ksm 2.2de grlen tm ilelerden dk, atama ilecinden ise yksektir.
?: ilecinin ileri nasl kolaylatrdna bir rnek:
printf(yas>65 ? "Yasli birisiniz.\n"
: "Henuz yasli degilsiniz.\n");
Grdnz gibi, hem ifade_2 hem de ifade_3 karakter dizileri ise, sonu bir karakter
dizisidir. ?: ileci deimez ifadelerde de kullanlabilir.
2.5. while Deyimi
Dier programlama dillerinde olduu gibi, while deyimi dngler oluturmak iin
kullanlr. Szdizimi yledir:
while (ifade)
deyim
nce ifade hesaplanr. Eer doru ise, deyim yrtlr, sonra da ifade tekrar hesaplanr.
fadenin hesaplanmasnda yanl (0) sonucu elde edilinceye kadar bu devam eder; bu
durumda kontrol bir sonraki deyime geer. Eer balangta ifade yanlsa, tekrarlanan
deyim hi altrlmaz. ekil 2.1deki ak izenei while deyiminin yrtlme eklini
gsterir.
te bir while deyimi:
while (yas<35) {
genc_kisiler++;
scanf("%d",&yas);
}
Eer yas, bu deyimden nce, 35 veya daha byk bir say ise blok hi
yrtlmeyecektir. Aksi takdirde, 35ten byk veya eit bir say girilinceye kadar
defalarca yrtlecektir. while kullanarak sonsuz dngler yazmann olas olduuna
dikkat edin: fadenin hibir zaman yanl olmayacan temin etmeniz yeterlidir. rnein,
while (1)
printf("C'yi cok seviyorum!\n");
deyimi ile C hakkndaki duygularnz sonsuza dek yazabilirsiniz.
36 DEYMLER VE KONTROL AKII BLM 2
yanl
doru
ifadeyi
hesapla
deyimi
yrt
yanl
doru
ifadeyi
hesapla
deyimi
yrt
while deyimi do deyimi
EKL 2.1 while ve do deyimleri iin ak izenekleri
2.6. do Deyimi
do deyimi while deyiminin yakn bir akrabasdr; o kadar ki szdiziminde while
anahtar szcn ierir:
do
deyim
while (ifade);
donun whiledan tek fark ifadeyi, tekrarlanan deyimin yrtlmesinden sonra
hesaplamasdr. Bunun anlam, ne olursa olsun, do deyiminde en az bir defa dngye
girildiidir. ekil 2.1de verilen ak izeneklerindeki farkllklara dikkat edin.
Birisinin yan sorup, olumlu bir say girilinceye kadar sormaya devam eden, rnek
bir do deyimi yledir:
do {
printf("Lutfen yasinizi giriniz.\n");
scanf("%d", &yas);
} while (yas<=0);
Normal olarak, her do deyiminde, burada da olduu gibi, bir blok eklinde yazlan
iteki deyim en az bir defa yrtlr.
BLM 2 DEYMLER VE KONTROL AKII 37
2.7. for Deyimi Ve Virgl leci
for deyimi, for anahtar szc, arkasnda parantez iinde iki noktal virglle ayrlm
ifade ve ondan sonra gelen bir deyimden oluur. fadelerden herhangi biri var
olmayabilir, ancak noktal virgller bulunmaldr. for deyiminin nasl ilediini
anlatmann en iyi yolu, edeer bir while deyimi ile onu ifade etmektir. imdi, eer
for (ifade_1
opt
; ifade_2
opt
; ifade_3
opt
)
deyim
eklinde bir deyimimiz varsa,
ifade_1;
while (ifade_2) {
deyim
ifade_3;
}
deyimi, for deyimi ile ayn ii yapacaktr. Eer for deyimindeki ifade_2 bosa, srekli
olarak doru olduu eklinde yorumlanacak ve sonsuz bir dngnz olacaktr. fade_1in
dngy kontrol eden deikenleri ilklemek iin; ifade_2nin dngy durdurmak iin
gereken koullar belirlemede; ifade_3n de dng iindeki baz deikenlerin
deerlerini deitirmede kullanlacana dikkat edin. rnek:
for (i=0; i<n; i++) {
dizi[i] = 0;
printf("Dizinin %d nolu elemanina 0 atanmistir.\n", i);
}
Bu, basite, dizi dizisinin ilk n elemanna sfr atar ve n sayda satr grntler. for
deyimine bir baka rnek ise yledir:
for (bosluklar=0; getchar()==' '; bosluklar++)
;
Bu deyim girdi akndaki boluklar sayar. Bu durumda, parantez iine alnm olan
ifadelerin gereken her eyi yaptna ve tekrarlanan deyimin bo deyim olduuna dikkat
ediniz. forun deyiminin bo olduunu vurgulamak iin, noktal virgl ikinci satra
yazlmtr. Sk yaplan hatalardan bir tanesi de for deyiminin sa parantezinin hemen
arkasna noktal virgl koymak, bylece deyimi tek bir seferde yrtlecek normal bir
deyim haline getirmektir.
Bazen, for deyiminde ifade_1 ve ifade_3 adn verdiimiz yerlerde birden fazla
ifadenin bulunmas daha uygun olabilir. rnein, iki tane sayacmzn bulunduunu ve
dngden herhangi birisinin sfr olduu zaman kmamzn gerektii bir durumu
dnn. Bunu yapmann baka yntemleri de vardr, ama aadaki deyim en
iyilerindendir:
38 DEYMLER VE KONTROL AKII BLM 2
for ( ; sayac_1 && sayac_2; sayac_1--, sayac_2--) {
...
}
Bu, virgl ilecinin en ok kullanld yerlerden biridir. Grdnz gibi, virgl
ileci iki ifadeden tek bir ifade oluturmaya yarar. Her zaman ikinci ilenenden nce ilk
ileneni hesaplar ve soldan saa birleir. Sonucu ise sadece ikinci ifadenin deeridir.
Sonucun tipi de ikinci ifadenin tipiyle ayndr. Virgl ileci, Cnin ileleri arasnda en
dk ncelie sahiptir.
Virgl karakterinin, C dilinde baka amalar iin de kullanldna dikkat ediniz.
Bildirimlerde deiken isimlerini ayrmak buna bir rnektir. Bu durumlarda, sz konusu
olann bir ayrc deil de, bir ile olduunu belirtmek iin virgl ifadesi parantezler iine
alnmaldr.
2.8. continue Deyimi
continue deyimi sadece bir dngnn gvdesi iinde, yani while, do veya forun
tekrarlanan deyiminde, geerlidir. Bu deyim yrtldnde, dng gvdesinin iindeki
geri kalan deyimler atlanr ve hemen dngnn devamllk testine geilir. rnein,
for (a=10; a>0; a--) {
b = -a;
if (b==-5)
continue;
printf("%d sayisinin olumsuzu %d sayisidir.\n", a, b);
}
deyiminde (5 hari) 10dan 1e kadar btn tamsaylar, olumsuzlar ile birlikte,
yazlrlar. Dier bir rnek olarak,
a = 0;
while (a<100) {
a++;
if (a%4)
continue;
printf("%d\n", a);
}
deyimi 100e kadar 4n katlarn grntler.
continue, kontrol her zaman iinde kald en kk dngnn sonuna aktarr.
Yukardaki gibi birok durumda, ifteki test koulunu ters evirerek ve continue
yerine dngde geri kalan deyimleri bir blok iine koyarak continuedan kurtulabiliriz.
nceki ksmda, for deyiminin while deyimi eklindeki yazmn anmsayn. Bu
kural, forun tekrarlanan deyiminde bir continue olduu zaman geerli olmaz, nk
BLM 2 DEYMLER VE KONTROL AKII 39
ifade_3 her yinelemenin sonunda batan hesaplanr. Bylece, bu ksmda verilen for
deyiminin whilela yazlm edeeri yledir:
a=10;
while (a>0) {
b=-a;
if (b==-5) {
a--;
continue;
}
printf("%d sayisinin olumsuzu %d sayisidir.\n", a, b);
a--;
}
2.9. break Deyimi
break deyimi continue ile yakndan ilintilidir. continue deyimi yeni bir
yinelemenin balamas amacyla dngnn sonuna atlarken, break, iinde kald en
kk dngnn dna atlar ve dng deyiminin tamamen sona ermesine yol aar. Baka
durumlar dnda, break sonsuz dnglerden k iin kullanlr. rnein:
while (1) {
scanf("%d", &yas);
if (yas<=0)
break;
printf("Bir sonraki kisi %d yasindadir.\n", yas);
}
Burada, olumlu olmayan bir say girildiinde, break deyimi kontrol whiledan
sonraki deyime aktarr. inde break bulunan bir program paras break olmadan da
yazlabileceine gre, break kullanmak bir tercih sorunudur.
break sadece switch (Ksm 2.11), do, while ve for deyimlerinden k iin
kullanlabilir. Baka yerlerde kullanlamaz.
2.10. goto Deyimi Ve Etiketler
Her C deyimine, deyimden nce bir tantc szck ve iki nokta st ste koyarak bir etiket
ilitirilebilir. Bir deyimi etiketlemek suretiyle, gerektiinde o deyime ulamak iin
kullanlabilecek bir adres verilir. Bir fonksiyon iinde birden fazla deyime ayn isim,
etiket olarak, verilemez. Bir etiket ve onun arkasna bir deyim yeni bir deyim oluturur.
Bu tr bir deyime etiketli deyim denir:
tantc_szck : deyim
goto deyimi, kontrol dorudan etiketli deyime aktarr. Szdizimi syledir:
40 DEYMLER VE KONTROL AKII BLM 2
goto tantc_szck;
Tantc_szck ayn fonksiyon iinde var olan bir etiket olmaldr. goto kullanarak,
fonksiyon iinde (dnda deil) herhangi bir yere atlanabilir; ileri veya geriye doru,
istenildii kadar iie gemi dng veya bloklarn iine veya dna, istediiniz bir yere
gidebilirsiniz. gotonun sorumsuzca kullanm, anlalmas ve bakm yaplmas
olanaksz programlar yaratabilir. Kuramsal olarak, anlambilimsel hibir yitime
uratlmadan, goto bir programdan karlp yerine dng ve if deyimleri konulabilir.
Buna ramen, hata ileme gibi, baz durumlarda ileri kolaylatrabilir. rnein:
while (bir_kosul) {
...
do {
...
for (...; ...; ...) {
...
if (guuum)
goto felaket;
...
}
} while (baska_kosul);
...
}
...
felaket: hata ilemleri
Bu durumda bile, goto deyimi kaldrlabilir. Hata ilemlerinin, baz temizlik ileri
yapp, olas bir hata kodu ile, aran fonksiyona dn yaptn varsayn. O zaman, niye
bu ileri goto deyiminin bulunduu yerde yapp bir return kullanmayalm? (return
deyimi bir fonksiyondan dnmek iin kullanlr ve Blm 4te ilenmektedir.) break,
continue ve return gibi daha uygun yaplarn bulunduu, C gibi bir dilde,
gotolardan kanlabilir ve kanlmaldr. yi bir programc gotoyu ve hatta
continueyu hemen hi bir zaman kullanmaz. switch dnda da, break deyimini
ok seyrek kullanr. Bu arada, goto kullanmadan bile, kontrol ak anlalmayan
programlar yazmak olasdr. Dikkatli tasarm, ayrntl belgeleme ve makul ierlek yazma
alkanl, bundan kanmann baz yollardr.
2.11. switch Deyimi
switch (ifade)
deyim
switch deyimi birok ktan bir tanesini semede kullanlr. te kullancya
menler sunan bir programda bulunabilecek bir switch:
BLM 2 DEYMLER VE KONTROL AKII 41
switch (_getche()) {
case 'r':
case 'R':
rezervasyon_yapma();
break;
case 'l':
case 'L':
yolcu_listeleme();
break;
case 'i':
case 'I':
rezervasyon_iptali();
break;
case 'c':
case 'C':
cikis();
break;
default:
printf("Yanlis secenek... Tekrar deneyin.\n");
}
Bu rnek switchin tm nemli zelliklerini gstermektedir. Parantez iine
yazlm tamsay tipindekibu rnekte olduu gibi, bir karakter de olabilirsay ifadesi
hesaplanr, nne case anahtar szc getirilmi olan deimez ifadelerden birinin
deeri buna uyuyorsa kontrol bu case etiketli deyime aktarlr ve buradan sral olarak
devam eder. Eer hibir case etiketindeki deer ifadenin deerine uymuyorsa, iki
olaslk vardr: Deyim iinde bir default etiketi varsa, kontrol buraya aktarlr, aksi
takdirde switch deyiminden klr.
Yukardaki deyimde hibir break konulmad takdirde, r veya R girildiinde,
btn fonksiyonlar (rezervasyon_yapma, yolcu_listeleme vs) arlacak ve
hata mesaj da baslacaktr. Bundan dolay hemen hemen btn switch deyimlerinde
breakler bulunur. rnekte olduu gibi, switchteki parantez iindeki ifadeden sonra
gelen deyim genelde bir bloktur.
case ve default etiketleri switch deyimleri dnda kullanlamazlar. Ayrca, bir
switch deyimi iinde birden fazla default etiketi ve ayn switch iinde ayn deere
sahip birden fazla case etiketi olamaz.
switchin yksn baka bir ilgin rnekle bitiriyoruz:
switch (yas)
case 20:
case 40:
case 60:
printf("20, 40 yada 60 yasindasiniz.\n");
42 DEYMLER VE KONTROL AKII BLM 2
2.12. Bir rnekSay Sralama
1. #include <stdio.h>
2. #define GOZCU 0
3. #define LIMIT 25
4.
5. void main (void)
6. {
7. int i, j, k;
8. int sayi, gecici;
9. int sayilar[LIMIT];
10.
11. /* girdi */
12. i=0;
13. while (i<LIMIT) {
14. scanf("%d", &sayi);
15. if (sayi==GOZCU)
16. break; /* girdi sonu */
17. sayilar[i++]=sayi;
18. }
19.
20. /* siralama */
21. i--;
22. for (j=0; j<i; j++)
23. for (k=j+1; k<=i; k++)
24. if (sayilar[j]>sayilar[k]) {
25. gecici=sayilar[k];
26. sayilar[k]=sayilar[j];
27. sayilar[j]=gecici;
28. }
29.
30. /* cikti */
31. k=0;
32. do
33. printf("%d ", sayilar[k++]);
34. while (k<=i);
35. } /* main */
Girilen tamsaylar artan sraya gre sralayan, yukardaki program, if, while, do,
for ve break deyimlerini rneklemek iin verilmitir. En bata tanmlanm olan iki
deimez, srasyla, girdi iin gzc bir deer ve iinde saylarn saklanaca dizinin
boyudur. Gzc, girdi aknda karmza ktnda, daha fazla girdi olmayacan
belirten bir deerdir. rnekteki durumda, sfr rastlandnda program girdi okumay
bitirecektir.
Program, srasyla, girdi, sralama ve kt yapan blmden olumutur. lk blm
(Satr 12-18) klavyeden tamsaylar okur ve bunlar sfrnc elemandan balayarak
sayilar adl diziye yerletirir. while deyimindeki (i<LIMIT) ifadesi en fazla
LIMIT sayda tamsaynn okunup sayilar dizisine konulmasn temin eder. Sralamak
istediimiz sfrdan farkl tamsaylarn says LIMITten azsa, girdi sonunda GOZCU
deerini, yani 0, veririz. while blounun iindeki if deyimi, sayilar dizisine
koymadan nce girilen deeri kontrol eder ve eer sfrla karlarsa, breakle while
dngsnn dna atlar. lk blm, if ve break kullanmadan, bir while ile yazmaya
aln.
BLM 2 DEYMLER VE KONTROL AKII 43
lk blmn sonunda, ide, sayilar dizisinin son dolu elemannn indisinin bir
fazlas bulunur. Bundan dolay, ikinci blm (Satr 21-28) iyi bir azaltarak balar.
Arkadan gelen for deyimi, sralamay salamak iin, i ile beraber j ve k adnda iki
saya kullanr. Dtaki (yukardaki) for, sayilar dizisinin ilk i-1 elemanna bakar.
Dtaki for tarafndan sayilar dizisinin baklan her jinci eleman iin, iteki for,
j+1den iye kadar indislenmi elemanlara bakar. Yani, if deyiminin yrtld her
sefer sayilar dizisinin iki farkl eleman, sayilar[j] ve sayilar[k],
karlatrlr ve j<kdr. imiz bittiinde sayilar dizisinde girilmi saylarn artan
sraya gre sralanmasn istediimize gre, eer sayilar[j]>sayilar[k] ise iki
elemann deerlerini dei toku ederiz. Bu ilemin yapld yer Satr 25-27dir.
nc blm (Satr 31-34), bir do kullanarak, (artk sralanm saylar ieren)
dizideki ilk i+1 eleman basar. Eer, en bata, ilk (ve son) deer olarak sfr girersek, bu
blm gereksiz ve ilgisiz bir say basacaktr. (Bunun nedenini syleyebilmemiz gerekir.)
Bu, en ksa ve basit gibi grnen programlarn bile, en beklenmeyen zamanda kendini
gsteren, hatalar ierebileceini gsterir.
Problemler
1. do deyimini baka kontrol ak deyimleri kullanarak formle edin.
2. Aadaki ifin grevini yapan bir switch yazn.
if (yas == 16)
printf("Onumuzdeki yil "
"surucu belgesi alabilirsiniz!\n");
3. while deyimini baka kontrol ak deyimleri kullanarak yazn.
4. Bir tamsay okuduktan sonra, 1den girilen sayya kadar olan btn tamsaylarn
kareleri ile kart (1/say) deerlerini basan bir program yazn.
5. Sfrla sonlandrlm bir tamsay serisini okuyup sonunda saylarn en kk, en
byk ve ortalamasn veren bir program yazn.
6. Bir karakter srasn okuyup arka arkaya tam 3 defa rastlad karakterleri basan bir
program yazn. rnein
bcdaaaefghijjjjkkkop
girdisi iin, kt
a k
olmaldr.
7. Tedavlde (imdilik) 5, 10, 20, 50, 100, 250, 500 bin ve bir milyonluk banknotlar
bulunmaktadr. Fiyat ve bu cinste gsterilmi para miktarn kabul edip geriye
verilecek bozuk paray (yani fiyat ile verilmi para arasndaki fark) liste eklinde
44 DEYMLER VE KONTROL AKII BLM 2
veren bir program yazn. Bu durumda, programn kabul edebilecei para miktar 5
binin kat olmaldr.
8. Ksm 2.12deki program, her eit bilgi iin doru alacak ekilde dzeltin.
9. Bir x saysnn b tabanna gre logaritmas u ekilde hesaplanabilir:
Saynn 1x<b eklinde olduunu varsayn. (Eer yle deilse, kolayca o hale
getirebilirsiniz.) Bu durumda log
b
x=0.d
1
d
2
d
n
. Burada n sistemdeki kayan noktal
saylar iin anlaml rakam saysdr; yani double saylar iin DBL_DIG. d
i
rakamlar u dng kullanlarak hesaplanabilir:
i 1den nye kadar aadaki dngy yap
x x
10
1
x
b
d
i
< b olacak ekilde d
i
yi hesapla (d
i
0dan 9a kadar deien bir tamsay)
x
x
b
d
i
nce, baz saylarn logaritmalarn elle hesaplayarak algoritmay anlamaya aln.
rnein, log
10
2, log
16
2 vsyi hesaplayn. Daha sonra, 0.01 artmlarla 1.00 ile 10.00
arasndaki x saylarnn b=10 tabanna gre logaritmalarnn izelgesini n=5 ondalk
basamaa kadar basacak bir C program yazn.
10. Aadaki oyunu oynayacak tam bir program yazn: Kullanc 1 ile 1000 arasnda bir
say seer, bilgisayar da sayy tahmin etmeye alr. Her tahminden sonra, eer
tahmin daha bykse kullanc B girer, daha kkse K, doru say ise D girer.
Programn rnek bir kt ve girdisi yle olabilir: (Bu durumda, seilmi olan say
375tir.)
500? B
250? K
375? D
Program aklc kestirimlerde bulunmaldr. Program en fazla ka denemede sayy
bulmaldr?
45
BLM 3: GSTERGELER VE
BT LEME
Bu blmde iki konu anlatlacaktr: gstergeler ve bit ilemleri. Bunlarn ortak bir yn
vardr. Cnin dk dzeyli destek salayan yksek dzeyli bir dil olmasndan dolay,
popler bir sistem programlama dili olduu gereini gsterirler. Gstergeler,
kullancnn bellek adreslerine ulamasna ve bunlarla ilem yapmasna izin verirler; bit
ilemleri ise tipik olarak birletirici dillerde rastlanan dk dzeyli ilemlerdir.
3.1. Gsterge Deikenleri Ve lemleri
Gstergeler ve gsterge ilemleri Cnin ok nemli bir ynn olutururlar. Gstergeler,
baka deikenlerin adreslerini veya daha genel konuursak, bellek konumlarn
depolamaya yarayan deikenlerdir. Gstergeler kullanmak suretiyle daha ksa ve hzl
alan bir kod yazabiliriz, ancak bu kodu anlamak daha zor olabilir, ayrca hata yapma
olasl da artabilir. rnein, bir int dizisini temizlemeye yarayan
int z[N], i;
...
for (i=0; i<N; i++)
z[i] = 0;
eklindeki klasik for deyiminin yerine
int z[N], *g;
...
for (g=&z[0]; g<&z[N]; g++)
*g = 0;
kullanlabilir; bu da daha verimli (hzl) olduu iin baz programclar tarafndan tercih
edilebilir.
46 GSTERGELER VE BT LEME BLM 3
Burada iki yeni ile grmekteyiz: * ve &. Bunlar tekli ilelerdir, ve * ile & ikili
ileleriyle kartrlmamaldr. Bir sonraki altksmda bunlar anlatlmaktadr.
3.1.1. & Ve * leleri
Zaman zaman, bir deikenin depoland bellek blgesinin adresini elde etmek
gerekebilir. Bunu yapmak iin, adres alma (&) ilecini kullanrz. Dier tekli ilelerle
ayn ncelie sahip olan bu tekli ile, bellekte belli bir konumda bulunan ilenenlere
uygulanabilir. rnein, bu ilenen basit bir deiken (&degisken) veya bir dizi eleman
(&dizi[indis]) olabilir. & ileci ilenenin adresini (daha dorusu, ilenen tarafndan
tutulan bellein ilk baytnn adresini) verir.
Bunun ne anlama geldiine bakalm. Her deiken (ana) bellekte bir yerde saklanr.
Bilgisayar bellei snrldr; herbiri bir say verilerek adreslenen belirli sayda hcrelerden
oluur. Her hcre belirli bir miktarda bilgi ierir. En kk bilgi birimi bittir (binary
digitikili rakam) ve 0/1, doru/yanl, ak/kapal gibi, iki olas deerden bir tanesini
saklamaya yarar. Bir bit, rahat olarak ilenmesi iin ok kk bir bilgi birimidir. Bundan
dolay, bitler, genelde 8 bitten oluan bir bayt veya makineden makineye 8 ile 64 bit
arasnda deien sayda bitten oluan bir szck eklinde gruplandrlr.
Bizim sistemde, bir bayt 8, bir szck de 16 bittir (16 bitlik derleyiciler iin);
bilgisayar bellei bayt eklinde adreslenir; arka arkaya gelen baytlar iin arka arkaya
gelen adresler kullanlr; normal boyda bir tamsay deikeni bir szck yani iki bayt
kaplar. Bylece, iki tamsaydan oluan bir dizi (int z[2];) drt bayt kaplar. Eer ilk
elemann adresi, rnein, 140sa, ikinci elemannki 142 olacaktr. Adres alma ileci bu
saylar verecektir. Dier bir deile, &z[0] 140a eitse, &z[1] de 142ye eittir.
Adres elimizde olduu zaman, bu sefer o adreste saklanm olan deeri elde etmek
iin bir ynteme gerek duyarz. Bu, temelde & ilecinin aksi olan, dolaylama (*) ileci ile
yaplr. Bu ile arpm ileci ile kartrlmamaldr, nk bu tekli, oysa arpm ileci
ikili bir iletir. Dolaylama ileci dier tekli ilelerle ayn ncelie sahiptir ve btn tekli
ileler gibi sadan sola birleir. Bu da, eer yan yana iki tekli ile varsa, nce
sadakinin alacan gsterir. rnein, *&x ile *(&x) ayn anlama gelir, ve her ikisi
de, aada aklanaca gibi xe edeerdir.
Dolaylama ileci, ilenen olarak geerli bir adres bekler ve bu adreste saklanm
bulunan deeri verir. Ancak bunu yapmas iin hangi veri tipinde bilgi vermesi gerektiini
bilmek zorundadr; int, double, char yoksa baka bir ey mi? Bu bilgi ileneninde
gizlidir. rnein, &x, x deikeninin tipindeki bir bilgiyi tutan bellek blgesinin adresidir
(teknik terimi ile, bu adrese bir gstergedir). Yani, eer x bir char deikeni ise, &x bir
char gstergesidir, bylece *&x, &x ile gsterilen blgede saklanm bulunan char
deerini verir.
BLM 3 GSTERGELER VE BT LEME 47
3.1.2. Gsterge Deikenleri Bildirimleri
Gsterge bildirimleri basittir.
int i, j;
bildirimi nasl tamsay deikenleri tanmlarsa,
int *ig, *jg;
bildirimi de tamsay tipindeki deikenlere gstergeler tanmlayacaktr. ig ve jg gibi
gsterge deikenleri tamsay deikenlerinin adreslerini ierecektir. rnein:
ig = &i;
jg = &j;
anlaml atamalardr. Ancak
ig = j;
eklindeki atama, j adresini igye koyacaktr ve ancak j deikeni iindeki tamsay
deerinin bir adres olarak kullanlmas gerektii durumlarda ie yarayabilir. C
Standardna uygun derleyiciler byle atamalar olduunda sizi uyaracaktr, nk
deikenlerin tipleri uymamaktadr.
Ayn ekilde,
double *dg;
doublea bir gsterge tanmlar. Hem ig hem de dg adres saklarlar. Fakat neyin adresi?
Derleyicinin bunu bilmesi gerekir. Bundan dolay farkl tanmlar yapmak zorundayz.
rnein,
dg = &i;
derleyici tarafndan kabul edilebilir, ancak anlamszdr, nk dg, bir double yerine bir
tamsayy gsterecektir. Derleyiciler bu tip yanl atamalarda sizi uyaracaktr. Ltfen bu
uyarlar dikkate aln.
3.1.3. Gsterge Aritmetii
imdi, bu ksm banda verilen rnee geri dnelim ve ne olduuna bakalm. Dizi
bildirimi, derleyicinin dizi iin, ana bellekte yer ayrmasn salar. Bir int deikeninin 2
bayt tuttuunu ve Nnin 10 olarak #define ile tanmlandn varsayn. Bu durumda z
dizisi 20 bayt tutacaktr. lk eleman, adresi &z[0] ifadesi ile elde edilen yerde saklanr.
(Tanm gerei &z[0] ile z ayn eydir ve buna dizinin temel adresi denir. Dier bir
deyile, bir ifade iinde indissiz kullanlan dizi isimleri belirli bellek blgelerini
gsterirler, yani gstergedirler.)
Bir dizinin iinci elemann elde etmek iin (rnein z[i] yazldnda), derleyici
unu yapar: Dizinin temel adresini (yani ilk elemannn adresini) alr (rnein 8566),
sonra indisin deerini alr (rnein 3) ve eer dizinin eleman tipi n tane bayt kullanyorsa
48 GSTERGELER VE BT LEME BLM 3
(rnein, bizim sistemde tamsaylar iin bu 2 bayttr) iinci elemann adresini bulmak iin
TemelAdres+ni hesaplar. imdi dizi indislerinin neden sfrdan balad daha iyi
anlalyor; eer i sfra eitse, o zaman ikinci terim yok olur ve, olmas gerektii gibi,
dizinin ilk elemannn adresinin gerekte dizinin temel adresi olduu ortaya kar.
for deyimlerimize geri dnersek, ilkinde bu hesaplamann her yinelemede
tekrarlandn grrz. kinci durumda ise, aka bir gsterge kullanlmtr. Tamamen
for (g=z; g<&z[N]; g++)
*g = 0;
deyimiyle edeer olan bu deyim, nce g int gstergesine z dizisinin temel adresini
koyar (rnein 8566); daha sonra g ile iaretlenmi blgeye sfr koyar. Bu adreste (yani
8566da) saklanacak olan deerin tipinin derleyici tarafndan bilinmesi gerekir, int,
char, double, yoksa baka bir ey mi? Her tipin bellekte farkl sayda bayt kapladn
anmsayn. Bunu gstergenin tipinden belirler. Bu bir tamsay gstergesi olduuna gre,
bu gsterge tarafndan iaret edilen blgede bir tamsay deikeni bulunmaldr. Bundan
dolay 8566 ve 8567 adresli baytlara sfr yerletirir.
Bundan sonra gsterge artrlr. imdi yine bir sorunumuz var demektir, nk
saylar iin artrma (veya azaltma) elimizdeki deere bir says eklenerek (veya
karlarak) yaplr. Ayn ey gstergelere uygulanamaz. gnin gsterdii adresin deerine
bir eklenmesi, gstergenin dizideki bir sonraki elemana (yani 8568 adresine) iaret
etmesini salayamayacaktr; onun yerine, ilk eleman ieren szcn ikinci yarsn
(yani 8567 adresini) gsterecektir. Gsterge ile gsterilen elemann boyuna eit bir say
(yani bizim sistemimizde tamsaylar iin 2) eklemeliyiz. Bu, derleyici tarafndan bizim
iin yaplr. Yani, int gstergesi ++ ileci ile artrldktan sonra 8568 adresini
gstermeye balayacaktr. Deiik tipteki gstergelerin uyumlu olmamalarnn nedenleri
ite bu farkllklardr.
Gsterge aritmetiinin dier ekillerinde de benzer bir sorun ortaya kar. rnein,
eer gde 8566 (&z[0]) adresi varsa, g+3 ifadesi nereyi gstermelidir? 8569 adresini
mi? Hayr! Bu, z[1]i ieren szcn ikinci yarsnn adresi demektir ki fazla anlaml
bir ey deildir. Daha iyisi &z[3] (yani 8572) adresine iaret etmesi olacaktr. Yine,
derleyici bize bunu salar: Bir adrese (gstergeye), z, bir tamsay, i, eklediimizde (veya
kardmzda), derleyici z tarafndan iaret edilen deiken tipinin boyunu i ile arpar
ve sonra toplama (veya karmay) yapar. Bunun nedeni adreslerin her zaman baytlara
iaret etmelerine karlk, gstergelerin deiik byklklere sahip tipte nesneleri
gstermeleridir.
Bu anlatlanlarn anafikri gstergelerin tamsay olmadklar ve baz ilelerin (++, -
-, +, -, +=, -=) gstergeler iin farkl uygulandklardr. *g ile gsterilen deikenin n
bayt kapladn varsayn. O zaman,
g++
g--
g+tamsayi_ifade
g-tamsayi_ifade
BLM 3 GSTERGELER VE BT LEME 49
gsterge ifadeleri srasyla g+n, g-n, g+ntamsay_ifade, g-ntamsay_ifade eklinde
hesaplanr. Ayrca p1 ve p2 ayn tipten gstergelerse, deeri bir tamsay olan
p1-p2
ifadesi
p1-p2
n
eklinde hesaplanr. rnein,
p1 = &z[3];
p2 = &z[0];
printf("%d\n", (int)(p1-p2));
(z dizisinin eleman tipine bal olmakszn) kt olarak 3 verecektir. ki gstergeyi
birbirinden kardmzda, kullanlan sistemdeki bellek boyuna bal olan bir tipte bir
ifade olutuuna dikkat edin. aretli olan bu tip stddef.h adl balk dosyasnda uygun
bir ekilde prtdiff_t adyla tanmlanmtr.
ki uyumlu gsterge (<, >, <=, >=, == ve != kullanarak) karlatrlabilir, ancak
farkl dizilerdeki nesnelere iaret eden iki gstergeyi karlatrmak anlaml (en azndan
tanabilir bir zellik) deildir. Doal olarak, bunun nedeni iki dizinin ana bellekteki
birbirine gre durumlar konusunda emin olamayacanzdr. Bu ksmdaki ikinci forda
kullanlan g<&z[N] testi uygundur, nk g ve &z[N] ayn dizi iindeki (olas
deiik) yerlere iaret ederler. &z[N] adresinin z dizisi iinde olmadn syleyerek,
buna kar kabilirsiniz, zira dizinin son eleman z[N-1]dir. Haklsnz, ancak gnin bu
geersiz adrese iaret ettii zaman *gye birey atamamak iin, <= yerine < kullanacak
kadar dikkatli olduumuzu da gzlemleyin. C Standard ise, bir nesnenin snrlar dnda
adres retmeyio adresteki blge deitirilsin deitirilmesinaka yasaklamaktadr.
Tek istisna olarak, bir nesnenin son baytndan bir sonraki bayt gsteren adresi retmee
izin verir. te bu zellik g<&z[N]de kullanlmtr.
Bir gsterge (== veya != kullanlarak) 0 tamsay deimeziyle karlatrlabilir.
Geleneksel olarak 0 deerinin hi bir eyi gstermedii varsaylmtr. Bu tamsay
deimezi programlarda o kadar ok kullanlmaktadr ki stdio.h balk dosyasnda
#define NULL 0
eklinde bir tanmlama yaplmtr. Bylece, eer 0 yerine NULL kullanlacak olursa
gstergeler tamsay deildir kural bozulmam gibi grnecektir. Bir gstergenin
herhangi bir yeri gstermesini istemiyorsanz
g = NULL;
atama deyimini kullann. NULLun her tip gsterge ile uyumlu olduuna dikkat edin. Bu
zel bir durumdur.
3.2. Gstergeler Ve Diziler
imdi, gelin aadakini inceleyelim
50 GSTERGELER VE BT LEME BLM 3
int z[N], i;
...
for (i=0; i<N; i++)
*(z+i) = 0;
Buradaki atama bir nceki ksmn banda verilenle tamamen ayndr. Neden? z ile
&z[0] ayn ey olduunu zaten biliyorsunuz. Bylece *(z+i) ile *(&z[0]+i) ayn
eydir. Yukarda gsterge toplama ilemleri ile ilgili anlatlanlara gre, ayn zamanda
*(&z[i]) ile edeerdir. imdi, * ile & birbirinin aksi ilemleri olduuna gre,
birbirlerini gtrrler. Bylece ifade z[i] olur. Aslnda, derleyici z[i] eklindeki bir
ifadeyi hemen *(z+i) ekline dntrr, yani ilk ekil programcnn rahatl iin dilde
salanan bir ksaltma gibi dnlebilir. Hatta z[i] yerine, biraz garip olan, i[z]
ifadesini de kullanabilirsiniz.
Dizi isimlerinin gerekte gsterge olduunu bildiinize gre,
float z[N];
ile
float *g;
arasndaki fark nedir, diye sorabilirsiniz.
g = z
atamas bir yapld m,
g, &z[0], ve z,
kendi aralarnda,
g+i, &z[i], ve z+i,
ve
*(g+i), z[i], ve *(z+i)
de, ayn ekilde, kendi aralarnda edeerdir.
Fakat nemli bir fark var:
z = g;
yazamazsnz nk g bir deiken gsterge, oysa z bir deimez gstergedir. imdi
deiken tanmlamalarna geri dnelim.
float z[N];
derleyicinin, ana bellekte N float deiken iin gerekli yer ayrmasna yol aacaktr.
(Bizim sistemimizde 4N bayt.) Bu bellek beinin balang adresi z deimezinin
(gsterge) deeri olur. z bir deiken deildir, nk bu (deimez) adresi saklamak iin
bellekte ayrca yer ayrlmamtr. Dier yandan,
float *g;
BLM 3 GSTERGELER VE BT LEME 51
bir adres tutacak genilikte bir yerin ayrlmasn salar. (Bizim sistemimizde 2 bayt.)
Programn yrtlmesi esnasnda, bu g deikeni deiik zamanlarda deiik deerler
tutabilir. Balangta ise, imdiye kadar grdmz deiken trleri iin, deeri
belirsizdir.
3.3. Karakter Dizileri
C dilinde zel bir karakter dizisi tipi yoktur. Ancak karakter dizisi gerektiren durumlar
iin baz kolaylklar bulunmaktadr. Karakterlerden oluan normal bir dizi veya bir
karakter gstergesi bir karakter dizisi olarak dnlebilir.
#include <stdio.h>
void main (void)
{
char *dd;
dd = "dunya";
printf("Merhaba, %s.\n", dd);
}
Bildiiniz gibi, printfin ilk argman bir karakter gstergesi olmaldr; ikinci argman
da, %s dnm tanmlamasnn gerektirdii ekilde bir karakter gstergesidir.
Yukardaki atama ifadesinde olduu gibi, bir ifade iinde kullanlan bir karakter dizisi
deimezi bir karakter gstergesidir ve dizinin ilk karakterine iaret eder. Karakter dizisi,
derleyici tarafndan, bir tarafta saklanr. Bylece, yukardaki atama deyiminde sadece bir
gsterge atamas yaplmaktadr; bir karakter dizisi aktarmas sz konusu deildir. Eer bir
karakter dizisi aktarmas yapmak istiyorsak bunu kendimiz yapmalyz. rnein,
char d[10];
d = "bir dizi";
geersizdir, nk derleyici gsterge atamas yapmaya alacaktr. Ancak = iaretinin
sol tarafnda bir deimez gsterge bulunduundan, bu olanakszdr. Karakterleri tek tek,
bir dng kullanarak, atamak zorundayz. Byle ilemler ok sk kullanld iin, C
ktphanesi baz karakter dizisi ileme fonksiyonlar salamaktadr. rnein,
strcpy(d, "bir dizi");
bizim iimizi grecektir. Bu fonksiyon, ikinci argman olarak geirilen adresteki btn
karakterleri, en sonda gelen bo karakteri (\0) ile birlikte, d tarafndan gsterilen yere
aktaracaktr. Bu durumda, bu 9 karakterdir. Bu fonksiyon, hedef dizinin bu kadar ok
karakteri alacak genilikte olup olmadn kontrol etmez. (Zaten edemez.)
Benzer bir durum karakter dizileri karlatrmas yaparken ortaya kar.
if (s=="Bu dizi") ...
testi her zaman yanl sonucunu verecektir. Kukusuz bunun nedeni gsterge eitliini test
etmemizdir. s ya bir gsterge yada bir dizi ismi olabilir (her iki durumda da bir gsterge
52 GSTERGELER VE BT LEME BLM 3
ifadesidir); deimez karakter dizisi ise onu saklamak iin kullanlan bellek beinin
bana iaret eden bir gstergedir. Doal olarak, bunlar farkl adreslerdir, bylece bu test
hibir zaman doru sonucunu vermeyecektir. Bunun yerine, s1 ve s2 eklinde verilen
iki karakter dizisini karlatrp, szlk sralamasna gre s1in s2den kk, s2ye
eit veya s2den byk olmasna bal olarak, srasyla olumsuz bir tamsay, sfr veya
olumlu bir tamsay veren strcmp(s1,s2) fonksiyonunu kullanmalyz.
strcat(d,s) fonksiyonu s dizisini dnin arkasna aktarr. Kukusuz d dizisinin
hem eski hem de yeni karakter dizisini kapsayacak kadar geni olmas gerekir.
strlen(s) s karakter dizisinin uzunluunu verir; bunu yaparken en sondaki bo
karakteri saymaz. strchr(s,c) c karakterinin s karakter dizisinin iinde ilk ortaya
kt yerin adresini bir karakter gstergesi olarak dndrr; c dizi iinde yoksa NULL
verir. strrchr(s,c) strchr(s,c) gibidir, sadece tarama ilemini sadan sola
doru yaplr.
Yukardaki fonksiyonlardan bazlar iin ilemi snrlayan baka bir argman, n,
kabul eden baz uyarlamalar bulunmaktadr. strncmp(s1,s2,n) en fazla n karakteri
karlatrr; strncat(s1,s2,n) en fazla n bo olmayan karakter ekler;
strncpy(s1,s2,n) tam olarak n karakter aktarr (eer s2nin uzunluu daha ksa
ise, bo karakterler eklenir).
Yararl bir deer dndrmyor gibi gzken fonksiyonlar aslnda karakter gstergesi
dndrmektedir. Genelde, geri dndrlen gsterge hedef dizisinin bana iaret eder.
Bir sonraki blmde de greceimiz gibi, fonksiyonlar kullanmadan nce
bildirimlerini yapmak zorundayz. Bu ksmda anlatlan fonksiyonlarn bildirimi
string.h balk dosyasnda bulunmaktadr.
Dier birok fonksiyon yannda, C ktphanesinde baz veri dnm fonksiyonlar
da mevcuttur. Bunlardan bazlarnn bildirimi stdlib.h balk dosyasnda
bulunmaktadr ve aada aklanmtr. Ayrca fonksiyon ve argman tipleri de
gsterilmitir.
double atof(char *)
karakter dizisi argmann ift duyarlkl kayan noktal sayya evirir; hata
durumunda 0.0 dndrr.
int atoi(char *)
karakter dizisi argmann tamsayya evirir; hata durumunda 0 dndrr.
long atol(char *)
karakter dizisi argmann uzun tamsayya evirir; hata durumunda 0L dndrr.
char * itoa(int, char *, int)
ilk tamsay argmann karakter dizisine evirir, sonucu ikinci argman olarak verilen
adrese koyar; nc argman taban belirtir.
char * ltoa(long, char *, int)
ilk uzun tamsay argmann karakter dizisine evirir, sonucu ikinci argman olarak
verilen adrese koyar; nc argman taban belirtir.
BLM 3 GSTERGELER VE BT LEME 53
int toupper(int) ve int tolower(int)
srasyla karakter argmannn byk harf ve kk harf karln dndrr.
3.4. Bitsel leler
leler Cnin nemli bir konusudur. Ancak, hepsinin birlikte anlatlacaklar tek bir yer
yoktur. En iyisi gerek duyulduunda onlar anlatmaktr. Bu blmde, gstergelerle
beraber kullanldklar iin, iki tekli ile (& ve *) anlatlmt.
Bitsel ileler baka eylerle pek ilgisi olmayan bir grup oluturduklarndan, hepsini
bu ksmda anlatmaya karar verdik. lelerin azalan nceliklerine gre anlatlmalar
asndan bu ksm Ksm 2.2ye benzemektedir. Bire tmler ve atama ileleri sadan
sola doru, dierleri soldan saa doru birleirler. Bu ksmda anlatlan tm ileler
sadece (eitli boylarda olabilen) tamsay ilenenleri kabul ederler ve ilenenler zerinde
ilem yapmadan nce Ksm 1.6da anlatlan tip dnmlerini gerekletirirler. Atama ile
ilgili olanlar hari, eer ilenenler deimez ifadeler ise, deimez ifadeler olutururlar.
Bu ilelerin isimleri ve kullanlan simgeler yledir:
ile isim
~ bire tmler
<< sola kaydrma
>> saa kaydrma
& bitsel VE
^ bitsel dlayan VEYA
| bitsel VEYA
<<= sola kaydrma ve atama
>>= saa kaydrma ve atama
&= bitsel VE ve atama
^= bitsel dlayan VEYA ve atama
|= bitsel VEYA ve atama
Detaya girmeden nce, bitsel ilelerin mantksal olarak ne yaptn gsteren bir
izelge sunalm. Aada y ve z tek bitlerdir:
y z ~y y&z y^z y|z
0 0 1 0 0 0
0 1 1 0 1 1
1 0 0 0 1 1
1 1 0 1 0 1
Bitsel bir ile ilenen(ler)in her bitine yukarda anlatlan ekilde uygulanr.
54 GSTERGELER VE BT LEME BLM 3
Bire Tmler leci ~
~ ileci ileneninin 1 olan bitlerini 0a, 0 olan bitlerini de 1e evirir. Sonucun tipi
ilenenin tipiyle ayndr.
Kaydrma leleri << Ve >>
Bir kaydrma ifadesi
ifade_1 << ifade_2
veya
ifade_1 >> ifade_2
eklindedir. Normalde ifade_1 bir deiken veya dizi elemandr. << ileci durumunda,
tip dnmlerinden sonra, ifade_2 inte evrilir ve ilk ilenenin bitleri ifade_2nin
deeri kadar sola kaydrlr. lenenin solundan den bitler kaybedilir. Sola kayan
bitlerden arta kalan sadaki bo yerler sfrla doldurulur. Sonucun tipi soldaki ilenenin
tipidir.
>> ileci yukarda anlatlanlarn saa doru olan eklini yerine getirir, tek bir farkla:
Eer soldaki ifade signed (iaretli) ise bo kalan yerler, 0 yerine, iaret bitiyle
doldurulabilir. Buna aritmetik kaydrma denir ve sistemimiz bunu yapar. Eer ilk ifade
unsigned (iaretsiz) ise solda boalan bitlerin sfrla doldurulaca garanti edilir ve bir
mantksal kaydrma sz konusudur.
Bitsel VE leci &
kili & ileci ilenenlerinin bitlerinin VEsini verir. Yani eer her iki ilenenin iinci bitleri
1 ise, sonucun iinci biti de 1 olur. Aksi takdirde 0dr. Tabii ki,
(a & b) & c
ve
a & (b & c)
ayn deerlere sahiptirler (yani & ilecinin birleme zellii vardr). C bu gerei kullanr
ve derleyici, daha verimli olaca gerekesiyle, parantez iine alnm olsa dahi, byle
ifadeleri (yani, * ve + gibi birleme ve deime zellii gsteren ileleri ieren ifadeleri)
istedii ekilde yeniden dzenleyebilir.
Bitsel Dlayan VEYA leci ^
^ ileci ilenenlerinin dlayan VEYAsn verir. Yani eer ilenenlerin iinci bitleri farkl
ise, sonucun iinci biti 1 olur. Aksi takdirde 0dr. ^ birleme zellii gsteren bir iletir
ve bu ileci ieren ifadeler, nceki altksmda anlatld gibi, yeniden dzenlenebilir.
BLM 3 GSTERGELER VE BT LEME 55
Bitsel VEYA leci |
| ileci ilenenlerinin kapsayan VEYAsn verir. Yani eer her iki ilenenin iinci bitleri 0
ise, sonucun iinci biti de 0 olur. Aksi takdirde 1dir. | da birleme zellii gsteren bir
iletir ve yeniden dzenleme sz konusu olabilir.
Atama leleri <<=, >>=, &=, ^= Ve |=
Yukarda anlatlan ileler belirli ifadeler oluturmalarna ramen, ilenenlerinin
deerlerini deitirmezler. imdi anlatacamz atama ileleri ise ilemin sonucunu
soldaki ilenenlerine aktarrlar.
Blm 1deki +=, -=, *= vs ilelerini anmsayn. Her bir ikili bitsel ilecin
karlnda bir atama ileci mevcuttur, << iin <<=, >> iin >>=, & iin &=, ^ iin ^=
ve | iin |=. Bu ilelerin ilevsellii dier atama ilelerine benzer.
Bitsel lelerrnekler
short, long gibi tiplerin uzunluklar derleyiciden derleyiciye deitiine gre,
buradaki rnekler sadece bizim sistemimiz iin geerlidir. Aadaki btn rneklerde
ifadenin deeri sekizli tabanda verilecektir. Sonucun tipi de ayrca belirtilecektir. Btn
deikenlerin ilk deeri 5tir. Tipler ise yledir:
/* signed */ char c; short s; int i; long l;
ifade deer tip
~c 0372 char
~s 0177772 int
~i 0177772 int
~l 037777777772 long
c << 3 050 char
s >> 2 01 int
i << l 0240 int
c & s 05 int
-i & ~l 037777777772 long
c ^ 3 06 int
~s ^ 2 0177770 int
i ^ l & i 0 long
~c | 3 0177773 int
s | s>>1 07 int
i | l 05 long
c <<= s 0240 char
l >>= i 0 long
s &= -i 01 short
i ^= l+1 03 int
c |= 16 025 char
56 GSTERGELER VE BT LEME BLM 3
Bir rnekSay Paketleme
Bitsel ilelerin kullanmn gstermek iin, sayy bir tamsayya paketleyen, daha
sonra ise aan aadaki program inceleyelim.
1. #include <stdio.h>
2. #define GUN_UZ 5
3. #define AY_UZ 4
4. #define TABAN_YIL 1900
5. #define TAVAN_YIL (TABAN_YIL+(1<<16-GUN_UZ-AY_UZ)-1)
6. void main (void)
7. {
8. unsigned const ay_ortu = ~(~0<<AY_UZ);
9. unsigned const gun_ortu = ~(~0<<GUN_UZ);
10. unsigned yil, ay, gun, tarih;
11.
12. do {
13. scanf("%u%u%u", &yil, &ay, &gun);
14. } while (yil<TABAN_YIL || yil>TAVAN_YIL ||
15. ay<1 || ay>12 || gun<1 || gun>31);
16. yil -= TABAN_YIL;
17. tarih = (yil<<AY_UZ|ay)<<GUN_UZ | gun;
18. printf("Paketleme tamamlandi.\n");
19.
20. yil = ay = gun = 0; /* degiskenleri "temizle" */
21. gun = tarih & gun_ortu;
22. ay = (tarih>>GUN_UZ) & ay_ortu;
23. yil = tarih>>(GUN_UZ+AY_UZ);
24. printf("Acma tamamlandi.\nTarih: %u %u %u",
25. yil+TABAN_YIL, ay, gun);
26. } /* main */
Program baladnda 1900 ile 2027 yllar arasnda bir tarih kabul eder. (Satr 12-
15.) Sadece baz basit kontroller yaplmtr; 13nc ayn 54nc gn giremezsiniz,
ancak ubatn 31ini girebilirsiniz. Sadece 1900 ylndan beri geen yllar sakladmz
iin, Satr 16daki -= ilemi yaplr. Paketleme Satr 17de yaplr: yil iindeki geen
yllar AY_UZ (yani 4) bit sola kaydrlr, ay yeni boalan yere VEYAlanr, sonra bunun
tamam GUN_UZ (5) bit sola kaydrlr ve gun ieriye VEYAlanr. Paketleme sonunda,
tarihin en solundaki 7 bitinde geen yllar, en sadaki 5 bitte gn ve geri kalannda ay
bulunur. Bizim sistemimizde short bir tamsay 16 bit kapladna gre, tarihteki
btn bitler kullanlm olur. do deyimindeki erim (yaylma aral) kontrolleri, bu
saylarn hibirinin kendileri iin ayrlan miktardan daha fazla bir yer isteinde
bulunmayacaklarn salamak iindir.
Satr 20 ama ileminin gerekten alp almad kukusunu bertaraf etmek
iindir ve programn davrannda herhangi bir deiiklie yol amadan karlabilir.
Satr 21 tarihin gn bitlerini 1le, geri kalann da 0la VEleyerek gn alr. Buna,
belli nedenden dolay, rtme denir. Satr 10da ilklenen, gun_ortu deikeni gerekli
bit kalbn ierir. (~0n btn bitleri 1dir.) Satr 22, nce ayn en sadaki 4 bite
gelecei ekilde tarihi kaydrr, sonra da ay dndaki bitleri rterek ay elde eder.
Satr 23te, tarih, sonuta geen yllarn elde edilecei ekilde, saa kaydrlr. tarih
unsigned olduuna gre en solda hep 0 vardr. Program yeni alan tarihi yazarak sona
erer.
BLM 3 GSTERGELER VE BT LEME 57
Bu arada, daha ileriki bir blmde ayn paketlemeyi yapacak baka bir yntem
greceiz.
3.5. le ncelii Ve Birleme
le ncelii ve birleme izelgesinin en son durumu izelge 3.1de gsterilmitir. Bu
izelge yeni tantlan ilelerle daha ileriki blmlerde tantlacak olan ilelerin tamamn
ierir.
ZELGE 3.1 C ile ncelii ve birleme
() [] -> .

~ ! ++ -- sizeof (tip)
+(tekli) -(tekli)
*(dolaylama) &(adres alma)

* / %

+ -

<< >>

< <= > >=

== !=

&

^

|

&&

||

? :

= *= /= %= += -=
<<= >>= &= ^= |=

,

imdi bu izelgenin ne anlama geldiini bir daha gzden geirelim. Bu izelge, C
dilindeki btn ileleri, azalan ncelik sralarna gre liste halinde vermektedir. Ayn
satrda verilmi olan ileler ayn ncelie sahiptirler. Eer ayn ncelie sahip iki
ilecimiz varsa, o zaman izelgenin sa stununda gsterilen birlemeyi kullanrz. Saa
doru ok () soldan saa birlemeyi ifade eder, rnein x/y/z ile (x/y)/z ayn
anlam tarlar. Sola doru ok () sadan sola birlemeyi belirtir, rnein x=y=z ile
x=(y=z) edeer ifadelerdir. Tm tekli ileler, l (koullu) ile ve tm atama
ileleri sadan sola doru gruplanrlar; geri kalanlarn soldan saa doru birleme
zellii vardr. Bu izelgede gsterilen baz ileler henz anlatlmamtr. Bunlar: (), .,
-> ve sizeoftur.
58 GSTERGELER VE BT LEME BLM 3
Problemler
1. Bizim sistemimizde
#include <stdio.h>
void main (void)
{
int x;
printf("%d %d %d\n",(int)&x,(int)(&x+1),(int)&x+1);
}
program
8580 8582 8581
sonucunu grntler. Tahmin edebileceiniz gibi bunlar bellek adresleridir. Neden
ilk durumda fark 2, ikinci durumda ise 1dir?
2. Eer makinenizde (iaretli) bir tamsay zerinde yaplan bir saa kaydrma (>>)
ilemi esnasnda boalan yerler iaret bitiyle dolduruluyorsa isaret-doldurma,
aksi takdirde sifir-doldurma mesajn verecek bir program yaznz. Sisteminiz
hakknda (szck uzunluu gibi) herhangi bir varsaym yapmayn.
3. Girilen bir tamsayda 1 olan bitleri sayan bir program yaznz.
4. Aadaki deyimler ne yapar?
a ^= b;
b ^= a;
a ^= b;
Aklaynz. pucu: Balangta ann 0077, bnin de 0707 ierdiini varsayn. Son
deerleri ne olacaktr?
5. Zaman da bir szck iine aadaki gibi paketlenebilir: 5 bit saat, 6 bit dakika, 5 bit
saniye. Saniyeleri 5 bite sdrmak iin deeri 2 ile bln, yani saniyenin en
sandaki biti atn. Bunu yerine getirecek bir program yazn.
6. Aadaki kodun ne ie yaradn aklayn:
int i;
for (i=0; i<10; i++)
printf("%d:%c\n",i,"QWERTYUIOP"[i]);
59
BLM 4: FONKSYONLAR VE
PROGRAM YAPISI
Bir program bir grevi yerine getirmek iin yazlr. Eer yaplacak i pek kolay deilse,
program olduka uzun olabilir. Baz programlar onbinlerce satr uzunluunda olabilir.
Byle durumlarda, esas grevi daha kk ve kolay idare edilebilir altgrevlere
ayrmadan yerine getirmek hemen hemen olanakszdr.
C, byle altgrevleri ifade etmek ve birbirinden ayrmak iin bir yntem
ngrmektedir. Bu yntem sayesinde bilgi saklama ilkeleri kullanlabilir. C sadece bir
tek altprogram eidi salamaktadr, bu da fonksiyondur. Matematiksel olarak; bir
fonksiyon, argmanlarn dndrd deere ilikilendiren bir kara kutu gibidir. Ayn
ey C iin de geerlidir, ancak bir fonksiyon birden fazla deer dndrecek, kresel veri
yaplarnda yan etkiler yapacak veya girdi/kt salayacak bir ekilde de tasarmlanabilir.
rnein, printf fonksiyonu, argmanlarnn deerlerinin ktsn yapmak iin
kullanlr. Geri dndrd deer, yazlan karakterlerin saysdr, ancak bu fazla ilgi
ekici deildir.
ok basit bir fonksiyon tanm aada verilmitir:
void f (void)
{ }
Bu fonksiyon hibir ey yapmamasna ramen, program gelitirmesi esnasnda yer tutucu
olarak kullanlabilir. Bu blmde fonksiyon tanm ve kullanm hakknda daha fazla
eyler reneceiz.
Kitabn bandan beri grmekte olduumuz main tantc szc, programn yerine
getirmesi gereken grevi ifade eden fonksiyonun ismidir. Her makul C program iinde
main ad verilen bir fonksiyonun bulunmas gerekir, nk program yrtlmeye
balandnda, program iinde balanm bulunan bir balang yordam almaya balar,
bu da kontrol sonuta main fonksiyonuna geirir. Eer balama esnasnda, balayc
(linker) main ad verilen bir fonksiyon bulamazsa, sizin iin yrtlebilir bir kod
60 FONKSYONLAR VE PROGRAM YAPISI BLM 4
oluturamayacaktr. mainin bir anahtar szck olmadna dikkat edin, yani isterseniz,
main adnda bir deiken de tanmlayabilirsiniz.
Fonksiyonlarn gc, bizim tekrarlanan kod yazmamzdan kanmamz
salamalarnda yatar. Herhangi bir kodu, bir fonksiyon eklinde, bir defa belirtiriz, ona
bir isim veririz ve daha sonra, bu kodu altrma gereksinimi duyduumuzda, bu
fonksiyonu arrz. Bu iyi, fakat yeterli deildir. Birok durumda bu kod o anki
gereksinmelerimize uyarlanmaldr. rnein, bir diziyi sraya sokan bir kodumuz varsa,
bu kodu her ardmzda, deiik sayda elemandan oluan deiik bir dizi belirtecek
ekilde bunu hazrlamamz daha iyi olur. Bu ise, fonksiyon argmanlar kullanlarak
yaplabilir.
Her fonksiyon dierlerinden bamsz olduuna, yani bir fonksiyon iinde
tanmlanm deikenler baka bir fonksiyonda kullanlamadna gre, fonksiyonlarn
birbirleriyle haberlemelerini salayacak yntemler gelitirilmitir. Bir yntem
fonksiyonlara argman geirmektir. Baka bir yntem kresel deikenler kullanmaktr.
imdiye kadar olan rneklerde grdmz btn deikenler fonksiyonlar (main
fonksiyonu) iinde tanmlanmlard. Bu blmde greceimiz gibi; deiken bildirimleri
veya tanmlamalarn fonksiyonlar dnda yapmamz da olasdr. Byle deikenlere
kresel adn veririz, nk fonksiyon iinde tanmlanan yerel deikenlerin aksine,
bunlar, tanmlamadan sonra gelen program metni iindeki btn fonksiyonlar tarafndan
kullanlabilirler.
4.1. Fonksiyon Tanmlama
Aslnda bir fonksiyonu, yani main fonksiyonunu, nasl tanmlayacamz zaten
biliyoruz. imdi, bir fonksiyonun daha genel bir eklini grelim:
dn_tipi
opt
fonksiyon_ismi (parametre_bildirimleri
opt
)
blok
Dn_tipi fonksiyon tarafndan dndrlen deerin tipini belirtir. Bu, int,
double gibi bir aritmetik tip veya gsterge olabilir. Bir dizi, ve baz eski derleyicilerde
bir yap veya birlik olamayabilir, ancak bunlara bir gsterge olabilir. Bir fonksiyon iin
varsaylan dn tipi inttir, bu da geni bir alan kapsar, nk genelde mantksal
deerler (doru/yanl deerleri) ve karakterler iin de int kullanrz.
Dn_tipi olarak void anahtar szc kullanldnda, fonksiyondan hibir deer
dndrlmeyecei belirtilmi olur. void fonksiyonlar FORTRANdaki
SUBROUTINEler veya Pascaldaki procedurelarn karldr.
Fonksiyon_ismi bir tantc szcktr. Eer fonksiyon, ayrca derlenen baka bir
kaynak dosyadan arlacaksa, fonksiyon isminin sadece ilk 8 karakteri anlamldr, bu da
balayc tarafndan konulan snrlamadan dolaydr.
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 61
Parametre_bildirimleri virglle ayrlm ve nne tipleri yazlm biimsel argman
veya parametre isimleri listesidir. Dier bir fonksiyon tarafndan arldnda bu
fonksiyona geirilecek olan argmanlarn saysn, srasn ve tipini belirtir. Ayn
zamanda, parametrelere, sadece fonksiyonun gvdesini oluturan blokun iinde anlaml
olan, isimler verir. Hi parametresi olmayan bir fonksiyon da olabilir. Bu durum,
parantezler iine void yazlarak aka gsterilir. rnein,
rand (void)
{
fonksiyonun gvdesi
}
Blok, her biri istee bal olan, iki ksmdan oluan bileik bir deyimdir: Bir deiken
veya tip tanmlama veya bildirim ksm ile onu izleyen deyimler. Ksm 1.8e baknz.
Bildirim ksm, fonksiyon gvdesi iinde yerel olarak kullanlacak olan nesnelerin
tanmn veya bildirimini ierir. Deyimler, fonksiyon gvdesinin yrtlebilir ksmn
olutururlar.
Bir fonksiyon baka bir fonksiyon iinde tanmlanamaz. Dier bir deile bir
fonksiyon tanm dier bir fonksiyon tanmnn bitmesinden sonra balar. Fonksiyon
tanmlamalarnn sras nemsizdir, ancak bu blmde daha ileride bahsedeceimiz dikkat
edilmesi gereken baz kk noktalar vardr.
imdi, bir rnek. Cnin mutlak deer alma ileci yoktur. Tamsaylar zerinde
alan bir fonksiyon tanmlayalm.
abs (int n)
{
if (n >= 0)
return n;
else
return -n;
}
Burada return adnda yeni bir deyim grmekteyiz. Bu genelde,
return ;
veya
return ifade;
eklinde olur. Kontroln arana geri dnmesini salar. return deyiminden sonra
gelen deyimler yerine getirilmez ve fonksiyon hemen arld yere geri dner. lk
ekilde kontrol geri dner, ancak yararl hi bir deer dndrlmez. Geri dndrlen
deer tanmsz olduu iin, aran fonksiyon bunu kullanmaya almamaldr. kinci
ekilde ifadenin deeri fonksiyonun deeri olarak geri dndrlr. Eer ifadenin
deerinin tipi fonksiyonun dn tipiyle ayn deilse, otomatik tip dnm yaplr.
Dn tipi void olan fonksiyonlar iin ikinci eklin kullanlamayaca aktr.
62 FONKSYONLAR VE PROGRAM YAPISI BLM 4
Sa engelli parantezin nnde bir return olduu varsaylr; bundan dolay belli
bir deer dndrmek istemiyorsanz return yazmayabilirsiniz. Son deyim yerine
getirildikten sonra, yararl bir deer olmadan kontrol aran fonksiyona dndrlecektir.
4.2. Fonksiyon arlar
Bir fonksiyonu armak iin fonksiyon ismini ve virglle ayrlp parantez iine alnm
argmanlarn bir listesini belirtin. Fonksiyonun argmanlar olmasa dahi parantezler
bulunmaldr, bylece derleyici ismin bir deikeni deil de bir fonksiyonu gsterdiini
anlayabilecektir. Fonksiyon tarafndan geri dndrlen deer kullanlabilir veya
kullanlmayabilir. rnein,
abs(-10);
bir fonksiyon arsdr. Bu noktada kontrol, aran fonksiyondan arlan fonksiyona
aktarlr. -10 deeri abs fonksiyonunun n parametresine atanr. arlan fonksiyon, ya
bir return deyiminin yerine getirilmesi yada fonksiyon gvdesinin sa engelli
parantezine ulalmas sonucu bittiinde, kontrol aran fonksiyondaki kald yere geri
dner. Fonksiyon tarafndan bir deer dndrlyorsa, bu deer arnn yerini alr.
rnein,
x = abs(-127);
xin deerini 127 yapacaktr; oysa daha yukarda ayn fonksiyona yaplan ilk arda geri
dndrlen deer (10) kullanlmamt, bu yzden bu deer kaybolmutu. Dn tipi
void olan bir fonksiyonun bir ifade iinde kullanlmamas gerektii aktr.
Bir argman istenildii kadar karmak bir ifade olabilir. Argman deerinin tipi
fonksiyon tanmndaki karlk gelen parametre iin beklenen tipe uymaldr, aksi
takdirde, aada aklanaca gibi, bulunmas zor olan baz hatalar meydana kabilir.
Dikkat: Fonksiyon argmanlarnn hesaplanma sras belirtilmemitir. rnein, iki
int argmannn toplamn veren topla isminde bir fonksiyonumuzun olduunu
varsayalm. Ayrca, deeri 5 olan, i adnda bir deikenimiz olsun.
toplam = topla(i--, i);
yazdmzda toplamn deeri ne olacaktr? 9 mu 10 mu? Bu, argmanlarn
hesaplanma srasna baldr. Deiik derleyiciler deiik ekilde yapabilirler. Bizim
sistemimizde, argmanlar sadan sola hesaplanr, bylece toplamn deeri 10
olacaktr. Bu tr eylerden kanlmas gerektiini sylemeye gerek yok tabii.
Fonksiyonlar kullanlmadan nce bildirilmelidirler. Bu kural baz hatalarn nlenmesi
iin titizlikle uygulanmaldr. C derleyicisi, bildirimi yaplmayan bir fonksiyon kullanm
ile karlatnda dn tipinin int olduunu varsayar. rnein, aadaki gibi dabs
adnda bir fonksiyon tanmladmz
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 63
double dabs (double n)
{
return (n >= 0.0) ? n : -n;
}
ve onu
deneme (void)
{
double d;
...
d = dabs(-3.14159);
...
}
eklinde ardmz dnn. olaslk vardr:
1. dabsn tanm ayn kaynak dosyada denemenin tanmndan nce gelir. Bu
durumda dabsn tanm etkisini denemenin iinde de srdrecei iin hi bir
sorun kmayacaktr. Derleyici, yukardaki ifadede dabs tarafndan beklenen ve geri
dndrlen deerin tipinin double olduunu bilecek ve gerekli tip dnmlerini
yapacaktr.
2. dabsn tanm denemenin tanmndan sonra gelir. Derleyici dabsn bir
fonksiyon ars olduunu tanyacak, ancak, henz dn tipinin ne olduunu
bilemeyecei iin, int dndren bir fonksiyon olduunu varsayacaktr. Daha sonra,
dabsn gerek tanmyla karlatnda, bir sorun ortaya kacaktr, nk double
dndren bir fonksiyon olarak tekrar tanmlamaya alacaktr. Bu durumda bir hata
mesaj verilecektir.
3. En kt durum, dabsn tanm ayr bir kaynak dosyada verildii zaman ortaya
kacaktr. Ayr ayr derlemeden dolay, derleyici uyumazl bulamayacaktr. Hatta
balayc bile birey yapamayacaktr. Programn yrtlmesi esnasnda anlamsz
sonular elde edilecektir. Bunun nedeni, yine, derleyicinin tanm veya bildirimi
yaplmam olan fonksiyonun int dndrdn varsaymas, bylece de dabs
fonksiyonu tarafndan dndrlen double deerin deneme tarafndan int gibi
yorumlanmasdr. Birok derleyici yaplan bu tip varsaymlar, bir uyar mesaj
eklinde kullancya bildirirler. Bu tip uyarlar mutlaka dikkate aln, nk
varsaymlar her zaman sizin dndklerinizle uyumayabilir.
Yukardaki 2 ve 3teki sorunlar zmek iin aadaki ekil nerilmektedir:
deneme (void)
{
double d, dabs(double);
...
d = dabs(-3.14159);
...
}
64 FONKSYONLAR VE PROGRAM YAPISI BLM 4
Yukardaki bildirim (buna ayrca fonksiyon prototipi de denir) deneme fonksiyonun
tanmnn dnda ve nnde de yazlabilir. Byle fonksiyon prototiplerinin tamamn
programn balangcnda veya byle fonksiyonlar kullanan her kaynak dosya tarafndan
#include kullanlarak ierilecek balk dosyalarna yazmak ska kullanlan bir
yntemdir. Standart ktphane fonksiyonlarnn bildirimlerini yapan standart balk
dosyalar buna iyi bir rnek olutururlar. Bunlar, derleyicilerin eitli hatalar
yakalamalarn veya gerektii zaman tip dnmleri yapmalarn salar. rnein,
yukardaki bildirimden sonra, derleyici,
d = dabs(5);
ifadesindeki 5 tamsaysn dabsa geirmeden nce doublea dntrecektir. Ancak
d = dabs("bes");
iin bir hata mesaj verecektir, nk bu durumdaki karakter gstergesi doublea
dntrlemez.
Argmanlar aran fonksiyondan arlan fonksiyona geirildiinde, doal
tiplerine (rnein shorttan inte) dntrrler. Eer fonksiyon ksa bir tip
bekliyorsa, bu argmann ksa tipe dntrlmesi gerekecektir. Bylece, eer zel bir
neden yoksa, fonksiyon parametrelerinin bu doal tiplerden olmas daha iyi olacaktr.
Genelde, dn tipleri iin de ayn ey szkonusudur.
4.2.1. Deer le ar
FORTRANda ve baz dier dillerde argmanlar referansla geirilir. Yani, fonksiyona
argmann deeri yerine adresi verilir. Bu yolla, arlan fonksiyon aran fonksiyon
tarafndan argmann sakland blgeye eriir ve deerini deitirebilir. Bylece, btn
argmanlar hem fonksiyona bilgi iletirler, hem de fonksiyondan bilgi geri getirirler, yani,
istemesek bile, fonksiyona hem girdi hem de kt iin kullanlrlar. Eer gerek argman,
bir deiken deil de bir ifade veya deimez ise ne olur? Bu durumda, aran fonksiyon
ifadeyi hesaplar, deerini bir yerde saklar, sonra da bu adresi geirir. Eer arlan
fonksiyon, mantksal olarak yapmamas gerektii halde, argmannn deerini deitirirse,
baz garip eyler ortaya kabilir. Bir yordamn F FORTRAN fonksiyonunu bir deimez
olan 4 argman ile ardn (yani F(4)), ancak F fonksiyonu iinde argmann
deerinin 5 yapldn varsayn. Bundan sonra, program iindeki 4 deimezinin her
kullanld yerde (rnein PRINT *,4) 4n 5 olduu gerei ortaya
karlacaktr. Dier bir deyile, yukardaki deyimden 5 elde edilecektir!
Yukardaki tartma, argman geirilmesi iin baka bir yntemin gerekli olduunu
ortaya karmaktadr. Bu deer ile ardr ve C tarafndan desteklenmektedir. Bu
durumda, argmann adresi yerine deeri fonksiyona geirilir. Bu deer, zel bir blgede,
tpk normal bir yerel deiken gibi saklanr. Biimsel argmana yaplan her trl
deiiklik yerel kopyasnda yaplacaktr ve aran fonksiyondaki argmanlara herhangi
bir etkisi olmayacaktr.
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 65
Baz diller argman geiinin her iki yntemine de izin verirler. rnein, Pascalda,
nne var anahtar szc yazlarak tanmlanan parametreler iin referansla ar
yaplr, var yoksa deerle ar yaplr. Normalde C deerle ary destekledii halde,
daha ileride greceimiz gibi, mantkl bir adres ve gsterge kaynamas ile referansla
ar yaplabilir. lk nce deerle arya bir rnek verelim:
fakt (int n)
{
int i = n;
while (--n)
i *= n;
return i;
}
Burada, nce iye n atanr, daha sonra n sfr oluncaya kadar aa doru saylr, her
sefer i yeni n ile arplr. Grdnz gibi nnin deeri deiir, ancak aran fonksiyon
tarafndan geirilen gerek argman zerinde bunun bir etkisi yoktur. rnein,
sayi = 4;
printf("%d! = %d\n", sayi, fakt(sayi));
deyimlerinden sonra sayinn deeri (0 deil) 4 olmaya devam edecektir. fakttaki n
parametresinin i gibi yerel bir deiken olduuna dikkat edin.
4.2.2. Referans le ar
ary yapana bilgi dndrmek istediimizde ne yapmamz gerekir? Bir yntem
fonksiyonun dn deerini kullanmaktr. imdiye kadar olan rneklerimizde bu ok sk
kullanlmt. Fakat, birden fazla dndrlecek deer varsa o zaman ne yapacaz? Bu
durumda, referansla argman geirmenin bir yolunu bulmamz gerekecektir. Aslnda bunu
nasl yapacamz da biliyoruz. Daha nceki blmlerde programa deer girmek iin
scanf fonksiyonunu kullanmtk. Bu fonksiyon argmanlarna yeni deerler atar. Bu
fonksiyonu ilgilendirmediine gre, argmanlarn eski deerlerini geirmek yerine,
adreslerini geiririz. Bu amala da, adres alma (&) ilecini kullanrz.
imdi referans ile ar yntemini gstermek iin bir rnek vermenin zamandr. ki
int argmannn deerlerini dei toku eden bir fonksiyon yazmak istediimizi
varsayn.
void degis (int x, int y)
{
int t;
t = x;
x = y;
y = t;
}
fonksiyonu bu ii yapacaktr, ancak sadece yerel olarak! Parametrelerin yeni deerleri
aran fonksiyona geri iletilmeyecektir. Deerleri geirmek yerine, yukarda anlatld
66 FONKSYONLAR VE PROGRAM YAPISI BLM 4
gibi deikenlerin adreslerini geirmemiz gerekir. Bylece, a ve bnin int deiken
olduu
degis(&a, &b)
eklinde bir ar gerekecektir. Ancak degis fonksiyonu da bu gstergeleri kabul
edecek ekilde yeniden dzenlenmelidir. Hereyden nce, parametre bildirimleri
deitirilmelidir; yeni parametre deikenleri deerler yerine adresleri saklamaldr.
Bildirim yledir:
int *xg, *yg;
ve, rnein, xg deikeninin bir int gstergesi olduu anlamna gelir. imdi btn x ve
yleri sra ile *xg ve *yg ile deitirirsek degisin doru tanmn elde ederiz:
void degis (int *xg, int *yg)
{
int t;
t = *xg;
*xg = *yg;
*yg = t;
}
Unutulmamas gereken bir nokta, dizi argmanlarnn her zaman referans ile
geirildiidir. rnein, argman olarak verilen diziyi sraya sokan sirala adnda bir
fonksiyonumuz olduunu varsayalm. Fonsiyonun bildirimi yle bir ey olacaktr:
void sirala (int a[], int n) /* n dizinin uzunlugudur */
{
sralama ilemi
}
Bu durumda,
sirala(dizi, eleman_sayisi);
eklinde bir ar, dizinin taban adresini fonksiyona geirecektir. siraladaki a
geirilen dizinin yerel bir kopyas deildir. a dizisinin uzunluunun belirtilmemesinden,
dizi iin bir yer ayrlmadn anlayabilirsiniz. sirala fonksiyonu iinde aya yaplan
btn referanslar aslnda diziye yaplmaktadr, bundan dolay deiiklikler de orada
yaplmaktadr. Bunun nedeni dizi ile &dizi[0]n tamamen ayn ey olmasdr. Bu iyi
bir zelliktir, nk aksi takdirde btn dizinin yerel bir diziye aktarlmas gerekecekti;
bu da hem bilgisayar zaman hem de bellek harcayacakt.
Aslnda, parametre_bildirimlerinde int a[] ile int *a ayn eydir, yani a
bir gstergedir. rnein, bir dizinin elemanlarn toplayan bir fonksiyonumuz var diyelim.
Bunu u ekilde tanmlayabiliriz:
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 67
topla (int a[], int n)
{
int s = 0;
while (n--)
s += a[n];
return s;
}
ve dizinin bir tamsay dizisi, uzunlukun da toplanacak elemanlarn says olduu
topla(dizi, uzunluk)
eklinde bir ar yapabiliriz. dizi isminin bir gsterge olduu, bundan dolay
toplann ada elde ettii eyin bir gsterge olduuna dikkat edin. ann int *a
eklinde bildirilmesi daha iyi olacakt. Aslnda derleyici de ayn eyi dnmekte ve
fonksiyon parametreleri iin iki bildirimi tamamen edeer kabul etmektedir. Bunu
grmek iin aadakini karlatrn:
topla (int a[], int n)
{
int s = 0;
while (n--)
s += *a++;
return s;
}
Atama deyiminde, *a++, *(a++) anlamna gelir, bu da (*a)++dan tamamen farkldr,
nk bu sonuncusu dizinin ilk elemann srekli olarak artrmaya yarar, yani a[0]++.
toplann bu yeni eklinin ilk verilenle ayn ii yaptn, ancak daha verimli olduunu
gsterin.
Ayrca, toplaya dizinin taban adresi yerine baka bir adresin de verilebileceini
akldan karmayn. rnein
topla(&dizi[2], uzunluk-2)
ve
topla(dizi+2, uzunluk-2)
toplann dizinin nc elemanndan balayarak, yani ilk iki eleman atlayarak, ilemi
yapmasn salayan iki edeer ardr.
Bir fonksiyon parametresinin bildirimi yaplrken const tip niteleyicisi de
kullanlabilir. Bir dizinin fonksiyon gvdesi iinde deitirilmeyeceini gstermesi
asndan, dizi parametrelerinin bildirimlerinde yararlanlabilir.
4.2.3. main Fonksiyonunun Parametreleri
main de bir fonksiyondur, fakat ilk bakta sanki herhangi biri onu aryor gibi
gzkmemektedir. Bu doru deildir, nk birisi onu gerekten armaktadr. letim
68 FONKSYONLAR VE PROGRAM YAPISI BLM 4
sistemi, program altrmak iin onu ykledikten sonra, bir balatma yordam kontrol
eline alr; bu da sonuta main adnda bir fonksiyonu arrbundan dolay bu isimde
bir tane fonksiyon bulunmas gerekirve ona tane argman geirir. En sk
kullanlanlar ilk iki argmandr, bunlar da main fonksiyonunun komut satr
argmanlarna ulamasn salar.
mainin u ekilde tanmlanm olduunu varsayn:
#include <stdio.h>
void main (int argc, char *argv[])
{
int i;
printf("Merhaba, benim ismim %s.\n", argv[0]);
printf("Argumanlarim sunlar");
for (i=1; i<argc; i++)
printf(", %s", argv[i]);
printf(".\n");
}
Program derlenip balandktan sonra iletilebilir bir dosya ortaya km olacaktr.
Bu dosyay, isminin arkasna, istee bal olarak verilen, birka argman yazarak
altrrsnz. Bizim sistemimizde DNM.EXE adl bir dosya olutuunu varsayalm.
Aadaki komut kullanlabilir:
A>DNM BIR IKI UC
kt ise yle olacaktr:
Merhaba, benim ismim A:\DNM.EXE.
Argumanlarim sunlar, BIR, IKI, UC.
mainin ilk parametresi (argc) bir saydr ve program altrmak iin verilen
komut satrndaki toplam isim saysna eittir. Yukardaki denemede 4 idi: Bir tanesi
.EXE dosya ad iin, 3 tanesi de onun argmanlar iin. mainin ikinci parametresi
(argv) chara gstergelerden oluan bir dizidir. Yine, main onun iin yer
ayrmadndan dolay uzunluu belirtilmemitir. char * bir karakter dizisini
tanmlar. Bu tipten olan bir deiken, printfin kontrol karakter dizisindeki %s
dnm tanmlamas kullanlarak baslabilir. argv bir karakter dizileri dizisidir ve
argv[0], argv[1] elemanlar, karakter dizilerini gsterir. Bylece yukardaki
program argvnin elemanlarn karakter dizileri olarak basar.
ekil 4.1deki ema balatma yordamnn main iin hazrlad bellein durumunu
gsterir.
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 69
.. A : \ . E X E \0 \0 \0 \0 ..
..
argc argv argv[0] ... argv[3]
.. . . . . . 4 . ..
D N M B I R I K I U C
..
EKL 4.1 main fonksiyonuna geirilen komut satr argmanlar
mainin nc parametresi (envp) argvye benzer. SET iletim sistemi
komutuyla oluturulan ortam karakter dizilerine gstergeler ieren bir dizidir. Bir
program yazarak, bunlar bastrmaya aln.
4.3. Bellek Snflar
Deiken ve fonksiyonlarn bellek snflar onlarn yaam srelerini, etki alanlarn,
saklandklar blgeleri ve ilklenme yolunu belirler. C dilinde drt tane bellek snf vardr:
Otomatik, yazma, dural ve dsal. Aada bunlarn herbiri detayl olarak
anlatlmaktadr. Bu ksm deiik bellek snfndan deikenlerin ilklenmeleriyle ilgili bir
anlatmla sona ermektedir.
Balamadan nce, kresel deikenden ne kastettiimizi aklayalm:
fonk_1 (...)
{ fonk_1in gvdesi }
double z;
fonk_2 (...)
{ fonk_2nin gvdesi }
main (...)
{ mainin gvdesi }
Yukardaki dosyada, z kresel bir deikendir ve fonk_1 dndaki btn fonksiyonlar
sanki kendi bloklar iinde tanmlanm gibi onu kullanabilirler. (fonk_1 ve baka
dosyalarda tanmlanan fonksiyonlar, bu ksmda daha ileride greceimiz bir yntemle
zye ulaabilirler.) Eer daha ileriki bir blok iinde z ad verilen baka bir deiken
tanmlanrsa, kresel z deikeni, daha nce akland ekilde, geici olarak
unutulacaktr. imdiye kadar grm olduumuz yerel deikenler, tanmlanm
olduklar blok sona erdiinde tamamen yok olurlar. Eer ayn blok daha sonra tekrar
balarsa yerel deikenlerin eski deerlerini almalar beklenemez. te yandan, kresel
deikenler deerlerini, program alt srece, yitirmezler.
70 FONKSYONLAR VE PROGRAM YAPISI BLM 4
4.3.1. auto Deikenler
imdiye kadar karlam olduumuz btn deikenlerin bellek snf otomatiktir.
renmi olduunuz gibi, otomatik deikenler, iinde bulunduklar blok yrtld
srece yaarlar yani bloktan nce veya sonra mevcut olmazlar. Deikenlerin otomatik
bellek snfndan olduunu belirtmek iin tanmlarndan nce auto anahtar szcn
yazabilirsiniz. rnein,
auto int i;
auto char kar, x;
(Genelde, bellek snf belirten btn anahtar szckler bu ekilde kullanlrlar; tanm
veya bildirimin nne yazlrlar.) auto kullanmann aslnda gerek bir anlam yoktur,
nk bloklar iinde tanmlanm deikenler iin bellek snf belirtilmedii zaman,
otomatik olduklar varsaylr. Yani, Cnin bile gereksiz bir anahtar szc vardr.
Doal olarak kresel deikenler iin auto kullanlamaz. Ayrca, fonksiyonlar da
otomatik olamaz. Fonksiyon parametrelerinin de otomatik olduu varsaylr ve deerleri
aran fonksiyon tarafndan ilklenir.
4.3.2. register Deikenler
register bellek snf auto bellek snf ile yakndan ilgilidir. Bu iki snf iin etki
alan ve yaam sresi kurallar ayndr, ve register, tpk auto gibi, fonksiyonlar
dnda anlamszdr. Eer bir deiken register snfndan tanmlanmsa, derleyici
onu makinenin hzl bellek yazmalarna yerletirmeye alr. Bu tr yazmalardan snrl
sayda olduu iin, sadece ilk birka register deikeni gerekten yazmalarda
saklanr, dierleri otomatik deikenler gibi ilem grrler. Yani, bir register
bildirimi derleyiciye sadece bir neri zellii tar. Bylece, eer bir nceki alt ksmda
tanmlanm deikenlere gerekten hzl erimeyi istiyorsak
register int i;
register char kar, x;
yazarz.
Ana bellekte depolanmayabilecekleri iin, register deikenlerine tekli & ileci
uygulanamaz. Ayrca, diziler gibi karmak tipten baz veriler register olamazlar;
ancak bu sistemden sisteme deiebilir.
register bellek snfndan en iyi ekilde yararlanmak iin, sadece birka deikeni
bu tipten tanmlamalsnz. Bunlar en ok kullanlanlar olmaldr. (rnein dng
sayalar.) Mmkn olduu kadar kullanldklar program koduna yakn
tanmlanabilmeleri iin de blok iine aln. Fonksiyon parametreleri de register bellek
snfndan tanmlanabilirler. Bu blmn sonundaki rnee baknz.
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 71
4.3.3. static Deikenler Ve Fonksiyonlar
Kullanld yere bal olarak static anahtar szcnn iki deiik anlam vardr.
Blok iinde, static kalc anlamna gelir. Yani, blok iinde deikenlerin
tanmlarnn nne static anahtar szc kullanlrsa, bu deikenlerin deerleri blok
sona erdiinde yok olmazlar. Blok dna kldnda deikenler eriilmez hale gelir,
fakat blok tekrar iletilirse, blok sona erdii zamanki deerleriyle programn
yrtlmesine katlrlar. Dier bir deyile, bu balamda static autonun tersidir.
Fonksiyon parametreleri olarak kullanlan deikenler static olamaz. rnek:
void fark (void)
{
static int deger;
int yeni_deger;
scanf("%d", &yeni_deger);
printf("Bu deger son seferden %d birim farklidir.\n",
deger - yeni_deger);
deger = yeni_deger;
}
Bu fonksiyon girilen deerle daha nce en son girilen deer arasndaki fark yazar.
lk arda eski deerin sfr olduunu varsayar. (Btn static deikenlerin sfra
ilklendii varsaylr.) deger ad verilen deiken, kontrol baka fonksiyonlara dnp
tekrar buraya geldiinde deerini srdrr.
Bir fonksiyon veya kresel bir deiken tanmnn nne yazld zaman, static
gizli anlamna gelir. Yani, bu fonksiyon veya deiken (ayrca derlenmi yada
derlenecek) baka dosyalara tamamen yabanc olacaktr; dier bir deyile, bu dosyalar
static deiken veya fonksiyona eriemeyeceklerdir. Bu ksmn bandaki rnekte, z
ve fonk_2yi static yapalm:
fonk_1 (...)
{ fonk_1in gvdesi }
static double z;
static fonk_2 (...)
{ fonk_2in gvdesi }
main (...)
{ mainin gvdesi }
imdi, eer isterlerse, bu dosyadaki fonksiyonlar z ve fonk_2ye eriebilirler, ancak
baka kaynak dosyalardaki fonksiyonlar iin bu olanaksz olacaktr.
72 FONKSYONLAR VE PROGRAM YAPISI BLM 4
4.3.4. Fonksiyonlar Ve extern Deikenler
Daha nce de bahsettiimiz gibi, kresel bir deikenin etki alan normalde tanmlanm
olduu kaynak dosyann sonuna kadar olan ksmdr. Ancak, baka dosyalarda veya ayn
dosyada fakat daha ileride tanmlanm bulunan kresel deikenleri kullanmann bir yolu
vardr: Anlaml bir yerde extern anahtar szcn ve arkasna deikenin bildirimini
yazmanz gerekir. Bundan sonra, sanki orada deikeni tanmlamsnz gibi onu
istediiniz gibi kullanabilirsiniz. Ancak, dier dosyalardan deikenlere bu tr bir eriim
salamak iin, deikenin zgn tanmnn static olmamas gerekir.
Yukarda anlatlan yntemin kullanld bir dosya topluluunda static olmayan
her kresel deikenin tam bir tane extern olmayan tanm ve birtakm extern
bildirimleri vardr. extern kullanlmam (zgn) tanm, deiken iin bellekten bir
blgenin ayrld tek yerdir. Dier bildirimler ise, bu deikenin tanmnn baka bir
yerde bulunduunu, tipinin ise belirtildii gibi olduunu derleyiciye anlatmak iindir.
Dier bir deyile, extern bildirimi deiken iin yer ayrlmasna neden olmaz.
Doal olarak, bir deikenin zgn tanmyla extern bildirimlerinde farkl tiplerin
belirtilmesi istenmeyen eylerin olumasna neden olabilir, onun iin dikkatli davranmak
gerekir. Eer hem tanm hem de bildirim ayn dosyada ise derleyici hatay bulabilecektir,
fakat eer farkl dosyalarda ise hata bulunamayacaktr.
Fonksiyonlar kendi dosyalarnda daha yukarda kalan blmler veya (eer static
deillerse) baka dosyalar tarafndan kullanlabilirler. Byle bir durumda, kullanlmadan
nce, kullanld bloun (iinde veya) dnda fonksiyonun bildirimi yaplmaldr. Byle
bir bildirimde, fonksiyonun dn tipi, ad, parantez iine alnarak virglle ayrlm
parametre tipleri ve noktal virgl bulunur. Fonksiyonun blou yazlmaz. rnek:
#include <stdio.h>
double cikar(double,double);
/* Bu fonksiyon daha ileride bir */
/* yerde tanimlanmaktadir. */
void main (void)
{
double a;
a = 3.2;
printf("%f\n", cikar(a,2));
}
double cikar (double x, double y)
{
return x-y;
}
Yukardaki programda yazlan double cikar(double,double); bildirimi,
baka bir dosyada veya bu dosyann daha ileriki blmlerinde iki double argman kabul
eden ve dn tipi double olan cikar isminde bir fonksiyonun bulunduunu ve bu
fonksiyon kullanlrken bu bilginin dikkate alnmas gerektiini derleyiciye anlatr. Eer
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 73
bu satr yazlmam olsayd, derleyici cikarn gerek tanmna ulatnda biri int biri
de double olan iki cikar isminde fonksiyon bulunduunu dnecek, bu da byk bir
hata olacakt. Ayrca, bu bilgiyi kullanarak, derleyici 2 tamsay argmann fonksiyona
geirirken doublea dntrr.
4.3.5. lkleme
Bu altksma balamadan nce, gelin bellek snflarn bir daha gzden geirelim: Otomatik
snfndan olan deikenler ait olduklar blokla beraber ortaya karlar ve sonra yok
olurlar. Yazma snf deikenler otomatikler gibidir, sadece yazmalara
yerletirilebilirler. Dural (static) yerel deikenler deerlerini asla yitirmezler, oysa
ayn snftan olan kresel deikenler ve fonksiyonlar kendi dosyalarnda gizli kalrlar.
static olmayan kresel deikenler ve fonksiyonlar drdnc ve son bellek snfn
olutururlar, bunlara dsal ad verilir ve programn herhangi bir yerinden kullanlabilirler.
Programc tarafndan, aksi belirtilmedii srece dsal ve static bellek snfndan
olan deikenler sfra ilklenir. auto ve register snfndan olan deikenlerin ilk
deerleri belirsizdir.
Bildiiniz gibi, tanm esnasnda bir ilkleme yapmak iin, deikenin arkasna =
iaretini koyup (engelli parantez iine alarak veya almayarak) bir ifade yazarz. Byle
ifadeler iin kurallar bellek snfna bal olarak deiir.
Dsal veya static deikenler durumunda, bu bir deimez ifade olmaldr ve
imdiye kadar grdmz deimez ifadelerden farkl olarak (adreslerini belirtmek iin)
dizi ve fonksiyon isimleri ve dsal ile static deikenler veya dizi elemanlarna
uygulanan tekli & ileciyle oluturulmu ifadeler de ierebilir. Btn bunlarn anlam,
byle bir ifadenin deerinin (a) bir adres art veya eksi bir deimez veya (b) sadece bir
deimez olabileceidir. rnek:
float t = (900.9-888.1)*1.1;
Eer ilklenecek deiken auto veya register ise ilkleme ifadesi daha nce
tanmlanm szckler ierebilen her eit geerli C ifadesi olabilir. rnek:
{
double v = x/a()%77; /* x ve a bu blok */
/* icinde bilinmektedir. */
bloun geri kalan
}
Gelin bu kurallarn arkasndaki nedeni aratralm:
Dsal ve static deikenler derleme srasnda hesaplanabilecek ilkleme ifadeleri
isterler, nk bu esnada ilklenmektedirler. Program almaya balamadan, bu
deikenler ilk deerlerini alm olurlar. Bunun iin, tanmnda bir ilkleyeni olan yerel bir
static deiken bloa her girite deil de sadece bir defa ilklenir (bu da doru bir
eydir, nk static bir deiken byle davranmaldr).
74 FONKSYONLAR VE PROGRAM YAPISI BLM 4
Dier taraftan, derleyici, bir auto veya register deikeni iin bir ilkleyen
grdnde, bunu o bloun tanm listesinden hemen sonra gelen ve ilgili deikenlere
atama yapan bir deyim gibi grr. Bu atamalar, yrtme srasnda, bloun bana
ulald her sefer tekrarlanr. Bundan dolay, auto ve register deikenleri iin
ilkleme ifadeleri, ilgili deiken bir sol ilenen olarak bir atama deyiminde kullanld
zaman sa tarafta gelebilecek her tr geerli ifade olabilir. Bu da, dier dillerde
rastlanmas zor olan, Cnin gzel zelliklerinden biridir.
Artk, static olmayan deikenlerin bir switch blounda ilklenmelerinin neden
anlamsz olduu anlalyor: Her durumda, kontrol bu ilklemelerin stnden geer.
lklenecek deiken bir dizi ise o zaman ne olur? Artan indis srasna gre engelli
parantezler iine ve virglle ayrarak her dizi yesinin deerini belirten ifadeler yazlr.
Bu listede, dizinin boyundan daha fazla sayda ifadenin bulunmas hata olur. Fakat eer
daha az sayda ifade varsa, kalan dizi elemanlar sfra ilklenir. rnein:
int g[5] = { 1, -2, 0, 3 };
dizinin ilk drt elemanna belirtilen deerleri atar, beinciye de sfr yerletirir.
Dizi ilklenmesinde baz kestirmeler sz konusu olabilir. Eer dizinin tanmlanmas
esnasnda boyunu belirtmezseniz, derleyici (mutlaka var olmas gereken) ilkleme listesine
bakar ve listedeki eleman saysna eit boyda bir dizi yaratr. rnein;
float f[] = { 2.2, 0.3, 99.9, 1.1 };
drt elemanl bir dizinin ayrlmasn ve yukardaki deerlerle ilklenmesini salar.
Karakter dizileri liste yerine deimez bir karakter dizisi yazarak da ilklenebilirler:
char gercek[] = "C iyidir.";
ile
char gercek[] = {
'C', ' ', 'i', 'y', 'i', 'd', 'i', 'r', '.', '\0'
};
ayn anlama gelirler. lk durumda belirtilmemi olmasna ramen derleyici tarafndan
otomatik olarak eklenen bo karaktere dikkat edin. Eer byle bir durumda dizinin
uzunluu belirtilmi olsa ve ilkleyen karakter dizisinin uzunluuna (yukardaki rnekte
9a) eit olsayd, bitirici bo karakter diziye dahil edilmeyecekti.
Gstergeleri de ilkleyebilirsiniz. Otomatik veya register gstergeler iin ilkleyen
herhangi bir geerli gsterge ifadesi olabilir. static veya dsal gstergeler iin
deimez bir ifade olmaldr. Aadaki rnekte,
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 75
#define N 10
test (int i)
{
int a[N], *ag = a+i;
static b[N], *bg = &b[N],
*bg1 = &b[0]+i, /* hata */
*bg2 = a; /* hata */
...
}
ag ve bg iin ilklemeler geerlidir. Fakat bg1 iin ilkleme geersizdir, nk i bir
deimez deildir. Ayrca bg2de de bir sorun vardr: a otomatik bir dizidir; temel adresi
yrtme esnasnda belirlenir, oysa (agden farkl olarak) bg2nin ilklemesi derleme
esnasnda yaplr, ancak bu durumda bu olanakszdr.
Dizilerle gstergeler arasnda ilgi ekici bir karlatrma aada grlebilir:
char const msj1[] = "Sonraki lutfen? ";
char const *msj2 = "Sonraki lutfen? ";
Hem msj1 hem de msj2 karakter gstergeleri olarak deerlendirilebilirler ve birok
balamda birbirinin yerine kullanlabilirler. Fakat derleyici asndan bir fark
szkonusudur. lk tanmda, dizi iin 17 bayt kullanlr, bu da msj1 dizisi iin ayrlan
bellek miktardr. kincisinde ise, dizinin derleyici tarafndan, baka bir yerde saklanmas
(yine 17 bayt) ve bunun balang adresinin msj2 iin ayrlan yere (bizim sistemde 2
bayt) depolanmas salanr. Yani ikinci tanm daha fazla yer kaplar. Bu deiken bir
gsterge iin dememiz gereken bedeldir; oysa programn yrtlmesi esnasnda belki de
bu gstergenin deerini deitirmeyeceiz. Bu tr program deimezleri iin ilk seenei
(yani deimez bir gstergeyi) kullanmamz daha akllca olacaktr.
4.4. zar
imdiye kadar baka fonksiyonlar aran fonksiyonlara rnekler vermi bulunuyoruz.
Peki, kendini aran bir fonksiyona ne dersiniz? Daha nce byle bir ey grmeyenler
iin, bu olduka garip gzkebilir. Hereyden nce, bir fonksiyon niye kendisini armak
zorunda kalsn? kinci olarak, sonsuz byle zar sonucu ortaya kacak bir dngden
nasl kanabiliriz? nc olarak da, ayn fonksiyondan birden fazla kopyann ilek
durumda olaca iin, fonksiyonun yerel deikenlerine ne olur?
Kendini aran fonksiyonlara zarl ad verilir. zarl bir fonksiyonun kendini
dolayl veya dolaysz olarak arabileceine dikkat edin. kinci durumda, rnein, f
adnda bir fonksiyonun g adnda baka bir fonksiyonu armas, onun da fyi tekrar
armas sz konusudur. Her durumda, bir fonksiyonun bir nceki etkinletirmesi sona
ermeden ayn fonksiyonun tekrar arlmas szkonusudur. Bundan dolay, zarl
fonksiyonlar zel ilem gerektirirler. zarl fonksiyonlar desteklemek iin
derleyicinin zel bir bellek dzeni kullanmas; zarl fonksiyonlar yazmak iin ise
programcnn biraz farkl bir dnme tarzna sahip olmas gerekir.
76 FONKSYONLAR VE PROGRAM YAPISI BLM 4
Yine de, zarl fonksiyonlar o kadar garip deildir; ve baz durumlarda, edeer
zarl olmayan fonksiyon yerine zarl olan kodlamak daha kolaydr. te basit ve
klasik bir rnek:
Matematikte, faktriyelin (!) tanm yledir:
n! = n (n-1) 2 1.
Bu tanm, faktriyel fonksiyonunun algoritmasn aka gsterir:
fakt (int n)
{
int i = 1;
while (n)
i *= n--;
return i;
}
Faktriyelin baka bir edeer tanm da yledir:
0! = 1
n! = n (n-1)!
Bu bir zarl tanmdr. zarl bir fonksiyonun tanmnn temel unsurlar unlardr:
1. Fonksiyonun, baz argmanlar iin, deerini veren bir temel (veya aksiyomlar veya
snr koullar). Yukardaki tanmda ilk deyim buna bir rnektir.
2. Bilinen deerlerden fonksiyonun baka deerlerinin nasl elde edileceini gsteren
zarl yap kural. Bu da yukardaki rnein ikinci deyiminde gsterilmektedir.
zarl tanmn, zarl yap kuralnn temel fonksiyon deerleri zerinde snrl
sayda uygulama sonucu sona eren bir yntem tarif ettiine dikkat etmemiz gerekir. Her
n0 iin yukardaki tanmn doru olduu gsterilebilir. rnein,
3! = 3 2! = 3 (2 1!) = 3 (2 (1 0!)) = 3 (2 (1 1)) = 6
Bu kadar matematik yeter. imdi de bilgisayarl gerek yaama dnelim. Faktriyel
fonksiyonunun zarl uyarlamas yledir:
fakt (int n)
{
return (n==0) ? 1 : n*fakt(n-1);
}
Bu da tamamen matematik dilinden bilgisayar diline bir eviridir. Koullu ilece dikkat
edin. Argmann, temel deyimin gereine uyup uymad, yani sfr olup olmad, kontrol
edilir. Eer yle ise, temel fonksiyon deeri, yani 1, dndrlr. Aksi takdirde, zarl
yap kural uygulanr. Bu kural (3! rneinde olduu gibi) snrl sayda tekrarlanarak
doru deer hesaplanr. Bylece bu ksmn banda sorulan ikinci soruyu yantlam
bulunuyoruz: Temel deyim sonsuz sayda zarya engel olur.
lk soruya gelince: Bu bir zevk ve verimlilik sorunudur. Baz programclar faktn
ilk tanmn, bazlar ise ikinci tanmn beenebilir. Ancak, verimlilik programclar iin
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 77
nemli (ve nesnel) bir parametredir. Greceimiz gibi, zarl tanmlar zarl
olmayan (yani yinelemeli olan) tanmlardan daha az verimlidir. Buna ramen, gerek
programlarda (rnein bir derleyicinin kendisinde) zarl fonksiyonlar kullanlr,
nk zarl bir tanm bazen daha zariftir ve anlalp izlenmesi daha kolay olur.
Son sorumuz zarl fonksiyonlarn nasl alt ile ilgili idi. Aadaki atama
deyiminin neyle sonulanacan izleyelim.
f2 = fakt(2);
(faktn ikinci uyarlamasn kullanmaktayz.) Aada adm adm ne olduu
verilmektedir:
fakt 2 argmanyla arlr ....................................................................................... 0
n = 2; ............................................................................................................... 1
fakt n-1 (=1) argmanyla arlr ................................................................... 1
n = 1; ........................................................................................................ 2
fakt n-1 (=0) argmanyla arlr ............................................................ 2
n = 0;................................................................................................. 3
return 1;.......................................................................................... 3
return n * 1; (=1 1 = 1) ................................................................... 2
return n * 1; (= 2 1 = 2) ......................................................................... 1
f2 = 2;.................................................................................................................... 0
Sada yazlan saylar fakt fonksiyonunun ka tane ilek kopyasnn bulunduunu
gsterir. nc seferki ileme esnasnda n yerel deikeninin (parametrenin) deeri
0dr, daha sonra ikinci ilemeye dndmzde, nnin deeri fonksiyonun o ileme
balad zamanki deer olur. Bu rnekten, nnin aslnda farkl deiken olduu ortaya
kar.
Bunu salamak iin, derleyici programa bir yt kullandrr. Btn auto ve
register deikenleri ytta yer alr. Yt, bir bayt dizisi eklinde bitiik bir bellek
blm ve bununla birlikte bir yt gstergesi eklinde dnlebilir. Yt gstergesi
balangta ytn bana iaret eder; ytn geri kalan serbest (yani bo) kabul edilir.
zarl olsun olmasn, herhangi bir fonksiyona giri yapldnda, o fonksiyonun
(static ve dsal olanlar hari) yerel deikenlerinin tamamn tutacak miktarda bayt
iin ytta yer ayrlr; yt gstergesi ytn geri kalan boluunun ban gsterecei
ekilde ileriye gtrlr. Fonksiyonun btn (dinamik) yerel deikenlerine yaplan
referanslar ytn ayrlm bu kesimine yaplr. Fonksiyon bitip geri dndnde, yerel
deikenler yok olur, nk yt gstergesi fonksiyon arlmadan nce gsterdii yeri
tekrar gsterecek ekilde geriye kaydrlr. Eer ayn fonksiyondan iki ar yaplrsa,
yerel deikenler iin iki defa yer ayrlr; defa arlrsa, ytta yerel deikenlerin
kopyas yaratlr vs. Ayn fonksiyona birden fazla ar yaplmsa, yerel deikenlerin
sadece son kopyas eriilir olmaktadr. Fonksiyon geri dndnde eski deikenler etkili
olmaya balarlar vs. Bir fonksiyon ars olduu esnada yrtmenin srd yer olan
dn adresi de yta itilir. zarl fonksiyonlar desteklemek iin btn bunlar
gereklidir. FORTRAN gibi, baz diller bunu yapmazlar, bundan dolay bu dillerde
78 FONKSYONLAR VE PROGRAM YAPISI BLM 4
zarl fonksiyonlara izin verilmez. Dier taraftan, C ve Pascal gibi baz diller zary
destekler.
zarl fonksiyonlar yttan ok yer harcarlar. Bir int deikenin iki bayt, dn
adresinin de drt bayt kapladn varsayalm. Bu durumda, fakt(i) eklinde bir
ar ytta 6(i+1) bayt kullanacaktr. rnein, fakt(6) iin 42 bayta
gereksinimimiz olacaktr. Dier taraftan, faktn yinelemeli (yani ilk verilen) uyarlamas
yttan 4 (dn adresi iin) + 2 (n iin) + 2 (i iin) = 8 bayt kullanacaktr. zarl
fonksiyonun bellek zerinde daha fazla talepte bulunduu aktr. Ayrca, yerel
deikenlerin ve dn adresinin yta itilip geri alnmas ilemci zaman da harcar.
Yinelemenin zardan daha verimli olduu sonucunu elde edebiliriz. Verimlilikteki
bu farkn o kadar fazla olmad gerek rnekler de verebiliriz, bundan dolay edeer bir
yinelemeli algoritma bulamadnz zaman zar kullanmaya tereddt etmeyin.
4.5. Fonksiyonlara Gstergeler
C dilinde, tpk bir deikenin adresi gibi, bir fonksiyonun adresini de bir gsterge
deikeninde depolayabilir veya baka bir fonksiyona argman olarak geirebiliriz. Bu
ksmda, dier fonksiyonlara fonksiyon gstergelerini nasl geirebileceimiz konusuyla
ilgileneceiz.
Derleyici tarafndan, bir tantc szcn bir fonksiyonu gsterdii, ya daha nce bir
fonksiyon olarak tanmland veya bildirimi yapld iin, yada tantc szcn
arkasnda sol parantez olduu iin (yani balamdan) derleyici tarafndan yaplan otomatik
bildirim sonucu bilinir. Eer bu tantc szck daha sonra bir parantezle birlikte
kullanlmazsa, derleyici bu fonksiyonu armaya kalkmayacak, onun yerine fonksiyonun
adresini kullanacaktr. (C dilinde sk yaplan bir yanl ta argman olmayan bir
fonksiyonu parantezleri belirtmeden armaya almaktr. Yani
f();
yerine
f;
eklinde bir deyim kullanmaktr. kinci deyim, f yerine fonksiyonun adresini koyma
dnda bir ey yapmayacaktr.)
Baz deerler ile bu deerler zerinde uygulanacak herhangi bir fonksiyondan geri
dndrlen deerlerin bir izelgesini karacak bir fonksiyon yazmak istediimizi
dnn. Bu, rnein, bir sins, karekk veya doal logaritma izelgesi olabilir:
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 79
#include <stdio.h>
#include <float.h>
void cizelge (double al, double ul, double art,
double (*fg)(double), char *fi)
{
double x;
printf("\n x\t%s(x)\n\n", fi);
for (x = al; x <= ul; x += art)
printf("%7.2f\t%7.2f\n", x, (*fg)(x));
}
Buradaki
double (*fg)(double);
tanmna dikkat edin. Bunun ne olduunu anlamak iin ilelerin uygulan srasn gz
nnde tutmamz gerekir. Bu bir double dndrp argman da double olan
fonksiyona bir gstergedir. leride, bir ifade iinde (*fg)(...) yazdmzda byle bir
fonksiyona ar yapm oluyoruz. imdiye kadar incelediimiz dier gsterge
deikenlerinin, rnein int gstergelerinin, hem tanm hem de kullanmndaki
benzerlie dikkat edin. fg fonksiyona bir gstergedir, (*fg) ise fonksiyonun kendisidir.
Gsterge ifadesini evreleyen parantezler gereklidir, nk aksi takdirde
double *fg(double);
ifadesi
double *(fg(double));
anlamna gelecekti, bu da double gsterge dndren bir fonksiyon demektir ki bu
bildirim parametre tanmlarnda kullanlamayacak ok farkl bir eydir. Bunun nedeni
fgden sonra gelen parantezlerin *dan daha yksek ncelie sahip bir ile olmasdr.
Aadaki program cizelge fonksiyonuna geerli arlar yapmaktadr:
#include <math.h>
void main (void)
{
double sin(double), sqrt(double), log(double);
cizelge(0.0, 3.14, 0.1, sin, "sin");
cizelge(1.0, 100.0, 1.0, sqrt, "k.kok");
cizelge(1.0, 2.718, 0.05, log, "log");
}
Drdnc argmann bir deiken deil de bir fonksiyon ismi olduuna dikkat edin.
Fonksiyon tarafmzdan tanmlanm olabilecei gibi bir ktphane fonksiyonu da olabilir.
Bu noktada bu fonksiyona bir ar szkonusu deildir, nk argmanlar verilmemitir,
hatta parantezler bile yoktur. Derleyici, sin, sqrt ve logun fonksiyon olduunu bilir,
nk yukarda bildirimleri yaplmtr; bylece bu fonksiyonlarn balang adreslerini
alp cizelge fonksiyonuna geirir. Dizilerde olduu gibi burada da adres alma (&)
80 FONKSYONLAR VE PROGRAM YAPISI BLM 4
ilecini kullanmamza gerek yoktur. Eer bir dizi isminin arkasnda [] varsa, o zaman
dizinin belirtilen elemannn deeri kullanlr; aksi takdirde dizinin temel adresi kullanlr.
Ayn ekilde, bir fonksiyon isminden sonra eer () varsa (ar sonucu) fonksiyondan
dndrlen deer kullanlr; aksi takdirde ifadenin deeri olarak fonksiyonun balang
adresi kullanlr.
cizelge fonksiyonu, ona geirilen adresi kullanarak asl ary yapar.
cizelgeye geirilen btn fonksiyonlarn benzer olmas gerekir, yani ayn sayda ve
tipte argman kabul edip ayn tipi dndrmelidirler. Parametrenin tanmlanmas esnasnda
btn bunlar belirtilir. main iinde verilen fonksiyon bildirimleri gerekli deildir, nk
#include edilen standart balk dosyas math.hde bu bildirimler zaten mevcuttur.
4.6. Bir rnek8 Vezir Problemi
Bu ksmda, fonksiyonlar, bitsel ileler, kresel deikenler, register bellek snf ve
zar gibi kavramlar kullanan rnek bir program vereceiz.
Bu program bize klasiklemi bir problemin zmlerini bulacaktr: 8 arp 8lik bir
satran tahtasna birbirini almayacak ekilde 8 vezirin yerletirilmesi. ki vezir ayn sra,
stun veya aprazda olduunda birbirini alabilir. Yani bir zmde ayn sra, stun veya
apraz hatta iki vezir bulunmamaldr. rnein,
V
V
V
V
V
V
V
V
bir zmdr. Burada V bir veziri ise bo bir kareyi gsterir.
Bu problemi zmede ilk yaklam sistemli bir ekilde tm yerletirmeleri inceleyip
sadece geerli olanlar listelemektir. Bir bilgisayarmz olduuna gre, bunu abuk bir
ekilde yapabiliriz. Aslnda, o kadar da deil! Olas tm deiik yerletirmelerin says
(8 8)!
(8 8 - 8)! 8!
= 4,426,165,368dir.
Her yerletirme iin bir milisaniye harcasak bile, hepsini teker teker denemek elli
gnden daha uzun bir sre alacaktr. Aratrma blgemizi daraltmamz gerekir. Aadaki
gzlemler yararl olacaktr:
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 81
1. Eer iki veziri yerletirdiimizde bunlarn birbirini aldn grrsek, dierlerini de
dikkate alan btn olas yerletirmeleri denememize gerek yoktur. Bu, btn vezirleri
satran tahtasna yerletirdikten sonra deil, bir vezir yerletirir yerletirmez
uyumazlklar kontrol etmemiz gerektii anlamna gelir.
2. Ayn sraya iki vezir yerletirmeye almamalyz. Her veziri bir sraya atayarak
bunu gerekletirebiliriz. Her vezir sadece kendi srasndaki 8 kareden birisine
yerletirilecektir.
Bu iki gzlem aratrma blgemizi ok daraltacaktr. Algoritma yledir:
En st sradan balayarak, her veziri kendi srasna, en sadaki stundan itibaren,
yerletirin.
Bir vezir yerletirdiinizde, daha nce yerletirilmi vezirlerle bir uyumazln olup
olmadn kontrol edin. Eer varsa, veziri bir sonraki (yani hemen solundaki) kareye
kaydrn; eer yoksa, bir sonraki (yani hemen altndaki) sray deerlendirin. Eer son
vezir de baarl bir ekilde yerletirilirse, bu bir zmdr.
Eer bir vezir, srasndaki sekizinci stunu da geerse, o zaman veziri satran
tahtasndan aln, bir nceki sraya geriye dn yapn ve bu sradaki veziri bir sonraki
(yani hemen solundaki) kareye kaydrn.
lk sradaki vezir son stundaki kareden dar kncaya kadar buna devam edin.
Algoritmay belirledikten sonra, bu sefer ilenecek bilgiyi saklayacak veri yaps iin
karar vermemiz gerekecektir. Verimlilik en nemli tasamz olmaldr. Veri yaps fazla
miktarda bilgisayar bellei harcamamal ve kolay, hzl eriim salamaldr.
Satran tahtasn nasl gstermemiz gerekir? En azndan iki seenek szkonusudur:
1. Her kare bir bitle gsterilebilir. Eer bit 1 ise bu karede bir vezir var, 0 ise, bo
demektir. Bylece, mantksal olarak 8e 8lik bir kare eklinde dzenlenmi 64 bite
gereksinimimiz vardr.
2. Her srada en fazla bir vezir olduuna gre; her elemannda o sradaki vezir
tarafndan igal edilen stun saysnn sakland dorusal bir dizi tutabiliriz.
Bu rnekte ilk seenei kullanacaz. Her sra 8 bite gereksinim duyar. Birok
bilgisayarda, bir int deiken en az 16 bittir. Bylece iki sra tek bir int deikenin
iinde saklanabilir. Ama, her sra iin bir tamsay ayrp sadece sadaki (dk) bitlerin
kullanlmas daha kolay olacaktr. Soldaki bitler ise kullanlmayabilir. Ayrca, program
daha genel bir problem (yani n arp nlik bir satran tahtasna n adet vezirin
yerletirilmesi) iin tasarlarsak, ayn program kullanarak, rnein, 15 vezir problemini de
zebiliriz.
Programda kullanlan veri yaps (aadaki program listesine bakn) yledir:
int tahta[8];
(Bu arada, int unsigned olarak #define edilmitir, bylece saa kaydrma
ilemlerinin aritmetik, yani iaret doldurma, deil de mantksal, yani sfr doldurma,
82 FONKSYONLAR VE PROGRAM YAPISI BLM 4
olmas temin edilmitir.) tahta ve sayi kresel deikenler olarak tanmlanmlardr,
bylece btn fonksiyonlar bunlara eriebilir. tahta[0] satran tahtasnn en stteki
srasn, tahta[7] ise en alttaki sray gsterir. Bir dizi elemannn en dk (yani
sadaki) biti srann en sadaki stununu gsterir. Altnc srann en sandaki stununa
bir vezir koymak istediimizde
tahta[5] = 1;
atama deyimini; bu veziri bir sola kaydrmak istediimizde
tahta[5] <<= 1;
atama deyimini; en soldaki stundan ileriye bir vezir geip gemediini anlamak iin
tahta[sira] >= 1<<8
testini; iki farkl sradaki iki vezirin ayn stunda olup olmadn anlamak iin
tahta[sira2] == tahta[sira1]
testini; ayn apraz hatta olup olmadn anlamak iin
tahta[sira2] == tahta[sira1]<<sira1-sira2 ||
tahta[sira2] == tahta[sira1]>>sira1-sira2
testini kullanabiliriz. Yukardaki testleri kullanarak, tahtaTamam fonksiyonunu
tasarlayabiliriz. Bu fonksiyon, siraya yeni bir vezir yerletirildiinde tahtann tamam
olup olmadn kontrol eder. Bunu yapmak iin 0dan siraya kadar (sira hari) olan
btn sralarla sira arasndaki uyumazlklar kontrol eder. Eer sira 0 ise o zaman
for dngsne hi girilmeyecek tahtaTamam fonksiyonu hemen 1 (doru)
dndrecektir: lk sra iin satran tahtas her zaman tamamdr.
Bir zm bulunduunda cozumyaz fonksiyonu arlr. sayi (zm says)
deikeni bir artrlr ve tahtadaki zm yazlr. D dng sralar, i dng de
stunlar iindir.
Programn kalbi yerlestir fonksiyonudur. Algoritmadan da tahmin
edebileceiniz gibi, bu zarl bir fonksiyon olarak tanmlanabilir. Bu fonksiyon, bata
0 (ilk sra) argmanyla ana programdan arlr. for dngs belirtilen sirann her
stununa veziri yerletirir. Her yerletirmeden sonra tahta kontrol edilir; eer tamamsa,
bu sira iin yerletirme ilemi geici olarak bekletilir ve bir sonraki sira denenir. Bir
sonraki siray kim deneyecektir? Tabii ki, ayn fonksiyon! Sonsuz zarlara engel
olmak iin fonksiyonun banda bir test yaplr. Eer yerlestir 8 argmanyla
arlmsa, bu, satran tahtasna (baarl bir ekilde) 8 vezirin yerletirildii anlamna
gelir. Bu durumda yerlestir fonksiyonu zm yazdrr ve hemen dner.
yerlestir fonksiyonunun her yeni arsnda sira ad verilen yeni bir (yerel)
deiken yaratlr. Bir nceki arya geri dndmzde bir nceki sira deikeni
tekrar geri gelir; deeri ise bir eksii olur.
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 83
1. #include <stdio.h>
2. #define VEZIRLER 8 /* vezir sayisi ve tahta boyu */
3. #define int unsigned /* isaretsiz tamsayi kullan */
4.
5. int sayi = 0; /* cozum sayisi */
6. int tahta [VEZIRLER]; /* her eleman bir sirayi gosterir */
7.
8. int tahtaTamam /* tahtanin gecerliligini kontrol et */
9. (register int sira)
10. {
11. register int r;
12.
13. for (r = 0; r < sira; r++) /* onceki tum siralari kontrol et */
14. if (tahta[sira] == tahta[r] ||
15. tahta[sira] == tahta[r] << sira-r ||
16. tahta[sira] == tahta[r] >> sira-r)
17. return 0; /* uyusmazlik varsa */
18. return 1; /* uyusmazlik yoksa */
19. }
20.
21. void cozumyaz (void) /* cozumu goster; sayiyi artir */
22. {
23. register int t, r;
24.
25. printf("\n\n\tCOZUM %u\n\n", ++sayi);
26. for (r = 0; r < VEZIRLER; r++) { /* sira */
27. for (t = 1<<VEZIRLER-1; t > 0; t >>= 1)
28. printf(" %c", tahta[r] == t ? 'V' : '.');
29. printf("\n");
30. }
31. }
32.
33. void yerlestir (int sira) /* bir sonraki siraya yerlestir */
34. {
35. if (sira == VEZIRLER) /* tum siralar dolu ve kontrol edilmis */
36. cozumyaz();
37. else
38. for (tahta[sira]=1; tahta[sira]<1<<VEZIRLER; tahta[sira]<<=1)
39. if (tahtaTamam(sira))
40. yerlestir(sira+1); /* bir sonraki sirayi dene */
41. }
42.
43. void main (void)
44. {
45. yerlestir(0); /* ilk siradan basla */
46. printf("\n\n%d vezir probleminin %u cozumu vardir.\n",
47. VEZIRLER, sayi);
48. }
Bu rnekte, zar adm yerine bir dng ve sira deikeninin uygun ekilde
artrlp azaltlmas kullanlabilir.
Aada VEZIRLER deimezine deiik deerler verildiinde yukardaki programla
elde edilen sonular gryorsunuz:
84 FONKSYONLAR VE PROGRAM YAPISI BLM 4
VEZIRLER zm says:
1 1
2 0
3 0
4 2
5 10
6 4
7 40
8 92
9 352
10 724
11 2 680
12 14 200
13 73 712
14 365 596
15 2 279 184
Problemler
1. Altksm 4.2.1in sonundaki printf deyiminin kts
4! = 24
eklinde olur. Bir an iin, faktn sayi deikeninin deerini gerekten
deitirdiini varsayn; bu durumda da ktnn ayn olacan syleyebilir miyiz?
2. C dilinde bir fonksiyon ars esnasnda verilen argmanlarn say ve tipinin
bildirimdeki ile ayn olmasna gerek yoktur. Ancak, ok gerekmedike bu zellii
kullanmak iyi deildir. printf ktphane fonksiyonu buna bir rnektir. Burada,
sizden (says belli olmayan) argmanlarn enbyn dndren maks adnda bir
fonksiyon yazmanz istiyoruz. Listenin sonunu belirtmek iin ardaki son argman
her zaman sfr olacaktr. rnekler: maks(15,-62,21,57,43,0)==57;
maks(0)==0; maks(-10,0)==-10. pucu: Microsoft C derleyicisinde (ve
muhtemelen dier birok C derleyicilerinde) argmanlar bellekte arka arkaya olan
yerlerde geirilirler; yani, ikinci argman ilk argmann hemen arkasnda saklanr vs.
Yazacanz fonksiyonun tanmnda tek bir parametre belirtmeniz yeterli olacaktr.
Arkadan gelen argmanlar adres alma ve dolaylama ilelerini kullanarak elde
edebilirsiniz. Bu fonksiyonun tanabilir olmadna dikkat edin.
3. Sistemimizde
BLM 4 FONKSYONLAR VE PROGRAM YAPISI 85
#include <stdio.h>
void main (void)
{
{ int y = 1993; }
{
int i;
printf("%d\n", i);
}
}
program
1993
yazar. Bunu aklayabilir misiniz?
4. Sistemimizde
#include <stdio.h>
void main (void)
{
{ int a1=111, a2=222, a3=333, a4=444; }
{
register r1, r2, r3, r4;
printf("%d %d %d %d\n", r1, r2, r3, r4);
}
}
program
131 3982 333 444
yazar. Bu size register deiken tanm konusunda neyi dndrr? r3
deikeni bir yazmata m saklanmaktadr?
5. Blm 0n banda verilen programn ne yaptn anlatn.
6. Bir nceki blmde anlatlan ve C ktphanesinde bulunan strcpy, strcmp,
strcat ve strlen fonksiyonlarnn ilevsel benzerlerini yazn.
7. 8 vezir programn, yerlestir zarl fonksiyonu iindeki sira deikeninin
kresel bir deiken olaca ekilde tekrar dzenleyin. imdi program daha az yt
yeri kullanacaktr.
8. 8 vezir programn zarl olmayana (yani yinelemeli olana) evirin.
87
BLM 5: TRETLM TPLER
VE VER YAPILARI
C dilinin yaps iinde var olan veri tipleri arasnda int, float, double, char gibi
basit tipler, diziler, gstergeler, saym tipleri, yaplar ve birlikler bulunmaktadr. Veri
tipleri zarl bir ekilde tanmlanabilirler, yani dizilerden oluan diziler, yaplar ieren
yaplar, gstergelere gstergeler vs szkonusu olabilir. Bylece, gerekte,
tanmlanabilecek veri tipleri sonsuz saydadr.
Bu blmde, yeni veri tiplerini ve var olan veri tiplerinden nasl yeni tipler
tanmlayacamz greceiz. imdiye kadar, gstergeler ve dizileri tanm olduk, ancak,
saym tipleri, yaplar ve birlikler nedir? Gelin, bunlar tek tek inceleyelim.
5.1. Saym Tipleri
C dilindeki temel veri tipleri arasnda basamakl say tipleri vardr (iaretli veya iaretsiz
eitli boylarda tamsaylar). Btn basamakl tipler snrl ve dorusal olarak sralanm
bir deerler kmesi olutururlar. C dili tarafndan salananlar dnda, kullancnn kendi
basamakl say tiplerini tanmlama olana vardr, bunlara saym (veya sayl) tipler denir.
Byle bir tipin tanm, srasyla, btn olas deerleri belirtir. Bunlar tantc szcklerle
temsil edilir ve yeni tipin deimezleri olurlar.
Saym tiplerini tanmlamann genel szdizimi aada verilmitir:
enum tantc_szck
opt
{ saym_listesi }
opt
bild_belirteleri
opt
;
Tantc_szcke saym knyesi denir ve tanmlanmakta olan tipe verilen istee bal
bir isimdir. Daha ileride, ayn tipten baka deiken veya fonksiyon tanmlamalar
yapmak gerekirse, bu isim kullanlabilir.
88 TRETLM TPLER VE VER YAPILARI BLM 5
Saym_listesi virglle ayrlm tantc szcklerden oluan bir listedir. Bunlara sayc
ad verilir.
Bild_belirteleri, olas ilkleyenlerle izlenen, deikenlerden oluan bir listedir.
Birka rnek:
enum islecler { arti, eksi, carpi, bolu }
isl1 = arti, isl2 = carpi, islx;
enum gunler { pa, pt, sa, ca, pe, cu, ct };
enum gunler ilk_gun = pa, bir_gun, son_gun = ct;
enum { erkek, kadin }
cinsiyetim = erkek, cinsiyetler[MAKSK];
lk rnekte enum islecler tipini ve bu tipten isl1, isl2, islx
deikenlerini tanmlamaktayz. Bu deikenler herhangi bir zamanda arti, eksi,
carpi ve bolu deerlerinin sadece bir tanesini alabilirler. Ayrca, isl1 ve isl2
deikenleri srasyla arti ve carpi deerleriyle ilklenirler. lkleme ilemi tamsay
deiken ilklemesine ok benzer, kurallar da ayndr. nc deiken, islx,
ilklenmemitir, fakat, tpk dier deikenler gibi yrtme esnasnda buna da
yukardakilerden bir deer atanabilir.
kinci ve nc satrlarda da buna benzer bir tanmlama yaplmakta, ancak bu sefer
iki admda olmaktadr. nce enum gunler tipini tanmlyoruzhenz deiken
tanm yoksonra da ilk_gun gibi deikenleri bu tipten tanmlyoruz.
Drdnc satrda knyeyi atlam bulunuyoruz, bylece bundan sonra bu tipten yeni
deiken veya fonksiyon tanmlamak istesek saym_listesini tekrar belirtmek zorunda
kalacaz. Bu rnekte ayrca saym tipinden elemanlardan olumu bir dizi tanmlamasn
da grmekteyiz.
Bu tanmlardan sonra, deikenleri aadaki gibi deyimlerde kullanabiliriz:
cinsiyetim = kadin;
bir_gun = ca;
islx = isl1;
if (isl1==bolu) ...
while (bir_gun!=ct) ...
printf("%d %d %d\n", cinsiyetim, bolu, son_gun);
cinsiyetim deikeninin kadin, son_gunn de ct olduunu varsayarsak, son
deyim
1 3 6
yazacaktr. Bunun nedeni, saym tipinden olan deikenlerin aslnda tamsay deerleri
sakladklar ve deimezlerin de aslnda tamsay olduklardr. rnein, arti, pa ve
erkekin deerleri 0dr, eksi 1, carpi 2, bolu 3tr. Normalde saym
deimezlerine sfrdan balayarak srayla deerler verilir, ancak C dilinde programcnn
istedii deimez tamsayy bir saycya vermesine izin verilir. Bundan sonra gelen
sayclar da sonraki deerleri alrlar. rnein,
BLM 5 TRETLM TPLER VE VER YAPILARI 89
enum renk {
siyah, mavi, yesil, kirmizi=4, sari=14, beyaz
};
Burada, siyahn deeri 0, mavinin 1, yesilin 2 ve beyazn 15tir. Bir enum
tanmnda, iki sayc ayn deeri alacak ekilde tanmlanabilirler. Bir sayc eksi bir deere
sahip olabilir.
Saym tipinden olan deikenler fonksiyonlara argman olarak geirilebilir ve bir
fonksiyonun dn tipi saym tipinden olabilir. Buna rnek bir fonksiyon aada
verilmitir:
enum gunler gun_ekle (enum gunler g, int n)
{
return (enum gunler) (((int) g + n) % 7);
}
Bu fonksiyon bir gn kabul edip n gn sonraki gn verir.
bir_gun = gun_ekle(pe, 31);
eklindeki bir ar bir_gune pa atayacaktr. Saym tiplerini kalplarda da
kullanabileceimize dikkat ediniz. Bu rnekte iki tane kalp kullanmaktayz: Bir tanesi,
hesap yapmak iin gn tamsayya dntrmede, dieri de sonucu tekrar
enum gunler tipine dntrmede kullanlr.
Sistemimizde, saym tiplerinden olan deikenlerin tamsay olduunu
dnebilirsiniz, rnein enum deerlerinin girdi ve ktsn tamsay biiminde
yapabilirsiniz. Tpk int deikenleri gibi, sayclarn (ve sonuta saym tipinden olan
deikenlerin) alacaklar deerler 16 bit iinde kalmaldr.
5.2. Yaplar
Yaplar ve birlikler C programlar iin karmak veri yaplarnn tanmlanmasnda anahtar
rol oynarlar. Bu ksmda yaplar anlatlmaktadr. Daha sonraki bir ksm ise birlikleri
kapsamaktadr.
Pascalla tankl olan okuyucularmz, herhalde C dilindeki yaplarn Pascaldaki
recordlara karlk olduunu fark edeceklerdir. Ayn tipte belirli saydaki deikenleri
saklamak iin bir dizi kullanlabilir. Dier taraftan, bir yap, genelde deiik tipte olan bir
veya daha fazla deikeni toplamak iin kullanlabilir. Niye, ayr ayr deikenler
kullanmak yerine bunlar bir yap iinde toplamaya gerek duyarz? Temel neden
kolaylktr. rnein, bir fonksiyona ok sayda argman geirmek yerine, bazlarn
yaplar iinde gruplayp yaplar geirebiliriz.
imdi yaplar nasl tanmlayabileceimizi ve kullanacamz grelim. Yap
tanmlamasnn genel ekli yledir:
struct tantc_szck
opt
{ yap_bild_listesi }
opt
bild_belirteleri
opt
;
90 TRETLM TPLER VE VER YAPILARI BLM 5
struct anahtar szc bir yapnn tanmlanmakta olduunu gstermektedir. Her
zaman olduu gibi, tanmlanmakta olan deiken(ler)in bellek snfn gstermek iin bu
anahtar szcn nne uygun herhangi bir bellek snf belirteci (rnein, static,
extern) konulabilir.
stee bal olan tantc_szcke yap knyesi ad verilir. Tanmlanmakta olan yap
tipine isim verir ve daha sonra benzer yap deikenleri tanmlamak iin bir ksaltma
ilevi grr. Eer bu yap tipi btn program iinde bir defa kullanlyorsa, daha sonra
kullanlmayaca iin yap knyesini atlayabiliriz.
Yap_bild_listesi her bildirimin bir noktal virglle bitirildii bir dizi bildirim ierir.
Bu bildirimler (ilkleyen ierememeleri dnda) normal deiken tanmlamalarna benzer;
fakat bu durumda deikenler bildirimi yaplan yap altnda gruplanacaklar ve yapnn
yeleri olacaklardr. Bir yapnn yeleri diziler veya yaplar gibi karmak tipler
olabilecei iin, C dilinde istediimiz kadar karmak veri yaplar tanmlayabiliriz.
Bild_belirteleri belirtilen yap tipinden deikenler tanmlayan istee bal bir
listedir. Bunlar basit (yap) deikenleri, yaplara gstergeler, yaplardan oluan diziler,
yap dndren fonksiyonlar veya bunlarn herhangi bir birleimi olabilir.
Bir rnek:
struct yk { int i; float f; } yd;
Burada, yk yap knyesini ve struct yk tipinden yd deikenini tanmlam
bulunuyoruz. struct yk tipi iki ye ierir, bir tamsay, bir de gerek say. yk yap
knyesi daha sonra ayn tipten baka deikenlerin bildirimini yapmak iin kullanlabilir.
rnein,
struct yk yd1, *yg;
(ydye benzeyen) bir yd1 deikenini ve struct yk tipindeki bir yapnn sakland
bir yere bir gsterge tanmlayacaktr.
Gelin birka rnee daha bakalm. Bu ksmn banda verilen szdizimde tane
istee bal blm grmekteyiz. Herhangi bir zamanda bunlardan en ok bir tanesi
belirtilmeyebilir. Bylece,
struct { int i; float f; } yd2;
tanmlamasnda bir yap deikeni, yd2, tanmlanmakta, fakat yap knyesi
tanmlanmamaktadr;
struct yk { int i; float f; };
tanmlamasnda ise bir yap knyesi, yk, tanmlanmakta, fakat deiken tanmlamalar
bulunmamaktadr; yani sadece bir tip bildirimi vardr. Daha sonra, bu ismi kullanarak,
aada yapld gibi deikenler tanmlayabiliriz:
struct yk ydz[5], yf(float), (*ydgf(int))[8];
Burada yap_bild_listesini tekrar belirtmeye gerek yoktur. ydz byle 5 tane yapdan
oluan bir dizidir; yf bir float argman alan ve byle bir yap dndren bir
BLM 5 TRETLM TPLER VE VER YAPILARI 91
fonksiyondur (baz eski derleyiciler byle bir bildirimi kabul etmeyebilirler, nk, eski
Standarda gre, fonksiyonlar dizi veya yap gibi karmak tipler dndrmezler);
ydgf byle 8 yapdan oluan bir diziye bir gsterge dndren ve bir int argman alan
bir fonksiyondur. Son rnei anlamak iin, ileleri, uygulandklar sray dikkate alarak
(tersten) okuyun: (), *, []; yani yap dizisi gstergesi fonksiyonu.
imdi de daha karmak bir rnek:
struct kisi {
char *isim;
int dogumtarihi;
enum cinsiyet_tipi { erkek, kadin } cinsiyet;
struct kisi *baba, *ana, *es,
*cocuklar[MAKSCCK];
} kisiler[MAKSKS];
Yukardaki tanmda grdnz kadaryla, tpk dier dillerde olduu gibi, C dilinde de
karmak veri yaplar tanmlanabilir. Burada, basit deikenler, gstergeler, saym
tipinden deikenler, yaplara gstergelerden oluan diziler vs olan yeleri ieren bir
yap dizisi grmekteyiz. Yapnn baz yelerini tanmlarken yapnn kendi tanmn da
kullanmakta olduumuza dikkat edin; tanmlamakta olduumuz yeler gsterge olduklar
iin bu herhangi bir problem oluturmaz. Aslnda, gsterge tanmlarken daha ileride
tanmlanm yaplar da kullanabiliriz. Yukarda tanmlanan kisiler deikeni, kolayca
eriilip ilenebilen en fazla MAKSKS kadar kiinin bilgisini saklayabilir.
Bir yapnn yelerine ulamak iin, bir nokta (.) ile gsterilen, yap yesi ilecini
kullanrz. Bu ile, yap deikeni ile yesi arasna konur. rnein,
yd.i = (int) yd.f;
yd yap deikeninin f yesi iindeki tamsayy i yesine atayacaktr. . ileci en
yksek ncelii olan ilelerden biridir, bylece, rnein yd.i genelde sanki tek bir
deikenmi gibi, etrafna parantez koymaya gerek duymadan kullanlabilir.
imdi, bir yap gstergesi deikeninin yesine eriirken karlaabileceimiz kk
bir problemi inceleyelim. rnein, yg bir yapya bir gstergedir; *yg yapya erimek iin
kullanlr, ancak onun yesine erimek iin *yg.i kullanlamaz. Bunun nedeni
nceliklerdir; .nin ncelii *dan yksektir, bylece *yg.i aslnda *(yg.i)
anlamna gelir, bu da ygnin bir yesi olan inin bir gsterge olduunu varsayar. Doru
sonucu elde etmek iin parantez kullanmak zorundayz: (*yg).i. Ancak bu da skntl
olabilir. Bunun stesinden gelmek iin, Cye baka bir ile (->) eklenmitir. yg->i
tamamen (*yg).i ile edeerdir ve daha ksa ve anlamldr.
Drt ile, (), [], . ve ->, ncelik tablosunda en yksek dzeyi olutururlar ve
referans oluturmak iin kullanldklarndan dier ilelerden farkldrlar.
Baz eski C uygulamalarnda, yaplarla yapabileceimiz eyler, & kullanarak bir
yapnn adresini almak ve yelerinden birisine erimekle snrldr. rnein, yaplar
fonksiyonlara geirilip geri dndrlemez;
92 TRETLM TPLER VE VER YAPILARI BLM 5
yapi1 = yapi2;
eklinde her iki tarafnda yap deikeni olan bir atama gerekletirilemez. Bu
snrlamalarn stesinden gelmek iin gstergeler kullanlabilir. Buna ramen, ANSI
Standardn izleyen yeni C derleyicilerinde byle snrlamalar yoktur. rnein, bizim
sistemde aadaki program kabul edilmektedir:
#include <stdio.h>
struct kunye {
int i;
char *c; /* y1 yapi degiskeninin */
} y1 = { 1, "bir" }; /* tanimlanmasi ve ilklenmesi */
struct kunye f /* parametresi ve donus tipi */
(struct kunye y) /* struct kunye olan fonksiyon */
{
struct kunye z;
z.i = y.i * 2; /* uyelere degerler ata */
z.c = "iki kere";
return z; /* bir yapi dondur */
} /* f */
void main (void)
{
struct kunye y2, f(struct kunye);
y2 = f(y1); /* yapiyi baska bir yapiya ata */
printf("%d %s\n", y2.i, y2.c);
} /* main */
ve kt yledir
2 iki kere
Burada yaplarla yaplacak eyi grmekteyiz: Bir yapy bir argman olarak geirmek,
fonksiyondan bir yap dndrmek ve bir yapy baka bir yapya atamak. Yap atamas,
kaynak yapnn her yesinin hedef yapnn ilgili yesine atanmas demektir ve yapnn
boyuna gre bir miktar zaman alabilir.
Yukardaki rnekte, yap deikenlerini ilkleme yntemini de grmekteyiz. Szdizimi
diziler iin kullanlana benzemektedir. lklenecek deiken, = atama simgesinden sonra
virglle ayrlp engelli parantezler iine alnm deimez ifadelerden oluan bir liste ile
izlenir. Her ye ilgili ifadenin deerine ilklenir. Eer ifadelerden daha fazla ye varsa,
geri kalan yeler C dilindeki varsaylan deere, yani sfra ilklenir.
5.3. Yeni Tip Tanmlama
Tretilmi veri tipleri zerindeki tartmamza devam etmeden nce, gelin, dilin iindeki
basit tipler gibi grnen, ancak karmak tip olan yeni, yani kullanc tarafndan
tanmlanm, tiplere ve byle tiplerin tanmlanmas iin kullanlan ynteme bakalm. Bu
BLM 5 TRETLM TPLER VE VER YAPILARI 93
amala, C dilinde, bir tipe bir tantc szck vererek yeni bir tip tanmlamaya yarayan
typedef bildirimi bulunmaktadr. Bildirim, anlambilim asndan olduka farkl
olmasna ramen, szdizimsel olarak bir deiken tanmyla ayndr. Sadece bana
typedef anahtar szc getirilir. typedef anahtar szcnn bir bellek snf
belirteci olduu kabul edilir, ve C dili bir bildirimde en fazla bir tane bellek snf
belirtecine izin verdii iin typedefin arkasna (veya nne) auto, register,
static veya extern konulamaz. Gelin birka rnee bakalm:
typedef unsigned short int kisa;
typedef char *kdizisi, *kdfonk(char *, char *);
typedef struct { float ger, im; } kompleks;
typedef int vektor[6], matriks[8][6];
typedef enum { yanlis, dogru } mantiksal;
(kisa, kdizisi, kdfonk, kompleks, vektor, matriks ve mantiksal gibi)
yeni tanmlanan tantc szcklerin kendileri deiken veya fonksiyon deillerdir (eer
typedef anahtar szckleri olmasayd yle olacaklard), ancak bu tr deiken veya
fonksiyon tanmlamaya yarayacak tiplerdir. Byle tip isimleri kalplarda ve sizeofun
ilenenleri olarak kullanlabilir. (sizeof bir sonraki ksmda anlatlmaktadr.) rnein,
aadakiler birbirlerine edeerdir:
kisa i, j, k; ile unsigned short int i, j, k;
kdizisi s1, s2; ile char *s1, *s2;
kdfonk strcpy; ile char *strcpy(char *, char *);
kompleks z[5]; ile struct {float ger, im;} z[5];
vektor a[8]; veya
matriks a; ile int a[8][6];
mantiksal m1, ile enum { yanlis, dogru } m1,
md=dogru, my=yanlis; md=dogru, my=yanlis;
typedef kullanmann temel nedeni uzun bildirimleri ksaltmasdr. Fakat, mantksal
olarak, programc C dilinin salad tiplerin yanna sanki yeni bir tip ekliyormu gibi
dnebilir. Bu kolaylk programlama abasn azaltr, programn okunaklln gelitirir
ve programlarmz daha yapsal hale getirir. Ayrca, nemli ve karmak tip bildirimleri
programn belirli bir yerinde toplandnda, program belgelemek ve daha sonra onu
anlayp deitirmek daha kolay olacaktr.
typedef bildirimlerinin etki alan deikenlerde olduu gibidir. Bir blok iinde
tanmlanm bir tip d bloklara eriilebilir deildir, fakat bir d blokta tanmlanm bir
tip, tekrar tanmlanmad srece, bir i blokta kullanlabilir. Dsal dzeyde yaplm bir
typedef bildirimi kaynak dosyasnn sonuna kadar etkisini srdrecektir, fakat ayr
derlenen dosyalarda deil. struct, union ve saym tipi bildirimlerinin etki alan da
ayndr.
94 TRETLM TPLER VE VER YAPILARI BLM 5
5.4. sizeof leci
C dilinin bir dier anahtar szc de sizeoftur. sizeof C dilinde bir anahtar szck
ile ifade edilen tek iletir. Bir fonksiyon deildir; dier tekli ileler ile ayn ncelie
sahip olan ve sadan sola birleme zellii gsteren bir tekli iletir. Genelde, ya bir
deikene yada bir tipe uygulanr. Bu ile ilenenin tipinden olan bir deikenin bellekte
tutaca bayt saysn (bir deimez) dndrr. Bir nceki ksmn deiken
tanmlamalarn kullanan rnekler aada verilmitir:
printf("%ld %ld %ld %ld %ld\n", (long)sizeof i,
(long)sizeof a, (long)sizeof s1, (long)sizeof z[3],
(long)sizeof 1.0);
printf("%ld %ld %ld %ld %ld\n", (long)sizeof(int),
(long)sizeof(float), (long)sizeof(double),
(long)sizeof(int *), (long)sizeof(kompleks[3]));
printf("%ld %ld %ld %ld %ld\n", (long)sizeof(vektor),
(long)sizeof(long[4]),
(long)sizeof(struct { char *c; vektor v[5]; }),
(long)sizeof *s1, (long)sizeof(a[1]));
Bu deyimler farkl sistemlerde farkl ktlar grntleyecektir. Sistemimizde kt
yledir:
2 96 2 8 8
2 4 8 2 24
12 16 62 1 12
Bunun anlam, int deikenlerinin 2 bayt, float deikenlerinin 4 bayt, double
deikenlerinin 8 bayt ve gsterge deikenlerinin 2 bayt tuttuudur. Her
gerekletirmede sizeof(char)n 1 olduu tanmlanmtr. Dier saylar kendiniz
dorulamaya aln. Bir long ka bayttr?
sizeofun deerinin derleme zamannda belirlendiine dikkat edin, bylece
sizeof bir deimez ifadenin kullanlmasna izin verilen yerlerde kullanlabilir.
Standarda gre sizeof ilecinin verdii saynn int olmas beklenmemelidir;
gerekletirmeye bal olarak long veya herhangi bir uygun tamsay tipi olabilir. Bu
(unsigned olan) tip standart balk dosyas stddef.hde size_t ismi ile
tanmlanmtr. Bu sayy printfe geirmeden nce bir kalpla longa evirecek ve
long iin olan dnm tanmlamasn kullanacak kadar dikkatli davrandk.
sizeof ile ilgili bir szdizimsel ayrnt da, bir ifade yerine bir tipe uygulandnda
tipin parantezler iine alnmas gerektiidir.
BLM 5 TRETLM TPLER VE VER YAPILARI 95
5.5. Birlikler
Birlikler bir szdizimsel, bir de anlambilimsel fark dnda yaplara ok benzerler. Bir
birliin szdizimi ayndr, sadece struct yerine union anahtar szcn kullanrz.
Yaplarda, yeler bellee birbiri ardnca yerletirilirler (yani bir yenin dierinin stne
sarkmas sz konusu deildir), bylece her yeyi dierlerinden bamsz ileyebiliriz.
Birliklerde yeler ayn bellek blgesini paylarlar. Bylece, herhangi bir zamanda,
yelerden sadece bir tanesi ile ilgilenebiliriz. Derleyici, en byk yeyi iine alabilecek
kadar geni bellek ayrr. rnein,
union cifdg {
char c;
int i;
float f;
double d;
int * g;
} bd = { 'A' };
5 yerpaylaml yeden oluan bd birlik deikenini tanmlar. sizeof bd 8dir, bu da
en byk ye olan double deikeninin boyudur. yelere yaplarda olduu gibi ayn
yolla ulalr (yani . veya -> ilecini kullanarak). rnein,
bd . d = 9.8696044011;
printf("%c\n", bd.c);
Bu ekilde bu iki deyimi arka arkaya kullanmann yanl olduuna dikkat edin, nk bir
taraftan double bir deer koyup, dier taraftan bir char almaya almaktayz. Ayrca,
her ye iin bir ilkleyenin bulunduu yaplara karlk, birliklerde en fazla bir tane
ilkleyenin olabildiine dikkat edin. lkleyen ilk yeye uygulanr. rnein, yukardaki
tanmda bd.cye 'A' atanmaktadr; daha sonra, yukardaki iki deyim yerine getirildikten
sonra, E ktsn elde ederiz, bu da anlamsz bir deerdir, nk bd.dye atanan deer
bd.cdeki deeri bozar.
Herhangi bir zamanda yelerinden en fazla bir tanesinin bir deer tutacan
bildiimiz zamanlarda, bellekten tasarruf etmek amacyla genelde birlikler kullanlr. Bu
zellik, daha nce verilmi olan bir rnein geniletilmi uyarlamas olan, aadaki
rnekte kullanlmtr:
struct kisi {
char *isim;
int dogumtarihi;
enum cinsiyet_tipi { erkek, kadin } cinsiyet;
union {
int ahbtarihi;
char *ksoyadi;
} cbil;
struct kisi *baba, *ana, *es,
*cocuklar[MAKSCCK];
} kisiler[MAKSKS];
96 TRETLM TPLER VE VER YAPILARI BLM 5
Burada kiinin cinsiyetine bal olan iki adet bilgi vardr: Erkekler iin askerlik
hizmetini bitirme, yani terhis tarihi (ahbtarihi), kadnlar iin ise kzlk, yani
evlenmeden nceki soyad (ksoyadi). Ayn zamanda her iki yenin anlaml bir deer
saklamayacaklarn bildiimiz iin, bellekten tasarruf etmek amacyla, bunlar bir birliin
iine alyoruz. Hangi yeyi (kisiler[birisi].cbil.ahbtarihi veya
kisiler[birisi].cbil.ksoyadi) kulanmamz gerektiini belirlemek iin
kisiler[birisi].cinsiyet iindeki bilgiyi kullanabiliriz.
5.6. Alanlar
Baz durumlarda, dar bir yer iine (rnein bir tamsay boyunda bir blgeye) birok bilgi
sdrmamz gerekebilir. Bunun nedeni bellek tasarrufu olabildii gibi, program dndaki
baz durumlardan (rnein donanm aygtlarna olan arabirimlerden) kaynaklanabilir.
Bunu yapmak iin bir yapnn yelerini bit uzunluklarn da vererek tanmlarz. Bu tr
yelere alan ad verilir. Doal olarak, uzunluklar sfrdan kk olmayan deimez
ifadelerdir. Tanm yaplarda olduu gibidir; sadece her yenin arkasna iki nokta ile
uzunluk verilebilir. Eriim de yaplarda olduu gibi . veya -> ileleri ile yaplr. Bir
rnek:
struct tarih {
unsigned yil : 7;
unsigned ay : 4;
unsigned gun : 5;
};
Burada, tarihin iki bayt (sizeof(struct tarih) 2dir) iine sdrlabilecei bir
yap tanmlanmaktadr. yil 7 bit kullanr (iaretsiz olduu iin, deeri 0dan 2
7
-1=127e
kadar deiebilir ve rnein 1900 ile 2027 arasndaki yllar ifade etmek iin
kullanlabilir), ay 4 bit (0dan 2
4
-1=15e kadar deiir), gun ise 5 bittir (0dan
2
5
-1=31e kadar deiir). Eer uzunluklar belirtmemi olsaydk, her ye 2 bayt
kullanacak, bylece tm yap 6 bayt kaplayacakt.
Alanlarla uraan birisinin dikkat etmesi gereken kurallar yle zetlenebilir:
1. Alan tipi unsigned bir tamsay olmaldr. Standart, en azndan unsigned
intin desteklenmesini gerektirir.
2. Bitlerin alanlara atanma tarz (soldan saa veya sadan sola) derleyiciye baldr.
3. Eer bir alan szck snrlarn (sistemimizde, short ve int iin 16, long iin 32
ve char iin 8 bitlik snrlar) kesecek ekilde tanmlanrsa bir sonraki szckten
balatlr; kullanlmakta olan szckteki bitler kullanlmaz. rnein,
BLM 5 TRETLM TPLER VE VER YAPILARI 97
struct dnm {
unsigned a1 : 12;
unsigned a2 : 5;
unsigned a3 : 12;
};
aadaki biimde 6 bayt kaplar:
12 bit a1, 4 bit kullanlmyor (ilk szck, yani iki bayt),
5 bit a2, 11 bit kullanlmyor (ikinci szck),
12 bit a3, 4 bit kullanlmyor (nc szck).
Eer unsigned yerine unsigned long kullanm olsaydk, yap aadaki
biimde 4 bayt kaplayacakt:
12 bit a1, 5 bit a2, 12 bit a3, 3 bit kullanlmyor (bir long szck, yani 4 bayt).
Eer unsigned char kullanm olsaydk, tanm kabul edilmeyecekti, nk alan
a1 12 bit uzunluundadr, oysa bir char en fazla 8 bit tutabilir. Bu, bir alann kendi
tipinden daha geni olamayaca anlamna gelir. Eer bir alan iin bit says
belirtilmemise, o tip iin en byk deer kullanlr.
4. Alanlardan oluan diziler tanmlanamaz.
5. Adres alma ileci (&) alanlara uygulanamaz, bylece alanlar gsterge kullanarak
dorudan doruya adreslenemezler.
6. Alan isimleri istee baldr. Eer bir alan kullanmay dnmyorsanzrnein
yukardaki rnekte a2yitipi ve alan ismini atlayn. rnein,
struct dnm {
unsigned a1 : 12;
: 5;
unsigned a3 : 12;
};
7. Eer bir sonraki szcn bana atlamak istiyorsanz, araya 0 geniliinde bir bo
alan koyun. rnein, sistemimizde
struct dnm {
unsigned a1 : 12;
: 0;
unsigned a3 : 12;
};
ile
struct dnm {
unsigned a1 : 12;
: 4;
unsigned a3 : 12;
};
98 TRETLM TPLER VE VER YAPILARI BLM 5
edeerdir. Neden?
8. Alanlar da tpk yap yeleri gibi ilklenebilirler, fakat alan iin ok byk olan bir
deer vermemeye dikkat etmek gerekir.
5.7. Bellek Ayrma
Baz durumlarda, programc program iin gereken ana bellek miktarn nceden
belirleyemez. rnein, bu, byk oranda program girdisine bal olabilir. Bir dosyay
sraya sokan bir program, btn dosyay alacak kadar ana bellee gereksinim duyabilir.
Bir dosya istenildii kadar uzun olabildiine gre, yrtme esnasnda, sistemin bize
salayabilecei kadar daha fazla bellek elde edebilme yntemine gereksinimimiz vardr.
Standart ktphane, buna izin verecek bir fonksiyon, calloc(n,boy) ierir. ki
argman size_t tipinden tamsaylar olmaldr. boy boyunda n tane deiken
tutabilecek sfra ilklenmi bir bellek blouna bir gsterge dndrr.
Daha basit baka bir fonksiyon malloc(bayts)tr ve bayts kadar bayttan
oluan bir bellek blouna bir gsterge dndrr. Argmann tipi yine size_tdir.
size_t gerekletirmeye bal olan ve en byk bellek boyunu saklayabilecek kadar
byk olan bir tamsaydr.
free(g) fonksiyonu daha nce calloc veya malloc ile ayrlm bulunan ve g
ile gsterilen bellek blounu serbest brakacaktr.
malloc ve callocun dn tipi ve freenin argman tipi genel gsterge tipi
olan void *dr. void * tipi bekleyen bir fonksiyona bir gsterge argman
geirdiinizde, bir kalp kullanarak, bunu void * tipine dntrmeniz gerekir. Ayn
ekilde, bir fonksiyon void * dndryorsa, bunu uygun gsterge tipine
dntrmeniz gerekir. Her tip gsterge, herhangi bir bilgi yitimine uramadan,
void * tipine ve daha sonra eski tipine dntrlebilir. stdlib.h balk dosyas
bu fonksiyonlar iin gerekli bildirimleri ierir ve bu blmn sonunda bu fonksiyonlar
kullanan rnek bir program bulunmaktadr.
5.8. Karmak Tipler
Bu ksmda, dizi dizileri, dizilere gstergeler, gsterge dizileri ve gstergelere gstergeler
gibi daha karmak veri tiplerini inceleyeceiz. Bir tanm istediimiz kadar
karmaklatrabileceimize dikkat edin; rnein, tamsay dizilerine gstergeler ieren
diziye bir gsterge. Biz ise burada yalnzca, yukarda sraladmz gibi, iki-dzeyli
karmak veri tiplerine bakacaz.
BLM 5 TRETLM TPLER VE VER YAPILARI 99
5.8.1. Dizi Dizileri
Bir dizi benzer elemanlardan oluan bir topluluktur. Eleman says derleme srasnda
belirlenir, bylece C dilinde devingen dizilere izin verilmez. Bir dizinin elemanlar (alan
veya fonksiyon dnda) herey olabilir; ayrca dizi de olabilir, bylece ok-boyutlu diziler
tanmlanabilir. Bir dizinin elemanlarna ulamak iin indisler kullanlr. ndisler tamsay
ifadelerdir ve, dizinin n tane eleman varsa, deerleri 0 ile n-1 arasnda deiebilir.
Tek-boyutlu dizileri nasl kullanacamz biliyoruz. imdi ok boyutlu bir dizi
tanmna bakalm:
int a[3][4] = {
{1, 2, 3, 2+2},
{5, 6, 7, 1<<3},
{3*3, 10, 11, 0xF&~03}
};
Burada ok-boyutlu bir dizinin (bir dizi dizisinin) tanmnn btn boyutlarda boylarn
ayr ayr keli parantezler iine alnarak verildii gryoruz. Yukardaki tanmda dizinin,
her biri 4 elemanl 3 vektr eklinde dzenlenmi 12 eleman vardr. Dier bir deyile,
diziler satr eklinde saklanrlar, yani son indis en hzl deiendir. lkleme beklendii gibi
yaplr, dizinin her eleman iin madde bulunmaktadr, bunlar da virglle ayrlm
vektrlerdir. Bu maddelerin her biri birbirinden virglle ayrlp engelli parantezler iine
alnm 4 deimez ifadeden oluurlar. Btn (12) deerleri de belirtmemize gerek yoktur.
rnein,
int b[3][4] = {
{1, 2, 3},
{5, 6}
};
ile
int b[3][4] = {
{1, 2, 3, 0},
{5, 6, 0, 0},
{0, 0, 0, 0}
};
ayndr. Eer btn deerleri belirtirsek iteki engelli parantezlere gerek yoktur:
int a[3][4] =
{ 1, 2, 3, 2+2, 5, 6, 7, 1<<3, 3*3, 10, 11, 0xF&~03 };
Eer derleyici dizinin boyunu ilkleyenden karabilirse, o zaman boyu belirtmeye gerek
yoktur. rnein,
int a[][4] = {
{1, 2, 3, 2+2},
{5, 6, 7, 1<<3},
{3*3, 10, 11, 0xF&~03}
};
100 TRETLM TPLER VE VER YAPILARI BLM 5
a iin ilk verilen tanma edeerdir. Bildirimdeki ilk (yani belirtilmeyebilen) indisin
sadece dizi tarafndan gerek duyulan bellek miktarn belirlemede kullanldna dikkat
edin; indis hesaplamalarnda kullanlmamaktadr.
Bir dizi elemanna ulamak iin [] ilecini kullanrz. Eer n-boyutlu bir dizimiz
varsa, n tane byle ile kullanlmaldr. rnein, a[1][2] deeri 7 olan dizi elemann
gstermektedir. Pascal programlama dilinden farkl olarak a[1,2]veya a[(1,2)]
a[2]ye edeerdir ve bir intin beklendii bir yerde kullanlamaz.
5.8.2. Dizilere Gstergeler
Daha nce de akland gibi, bir fonksiyon parametresi olarak tanmlanm tek boyutlu
bir dizinin boyunun belirtilmesine gerek yoktur, nk bu bir dizi deil, gerekte bir
gstergedir. ok-boyutlu bir dizide ne olur? Kural yledir: lki dnda btn boyutlarn
boyunu belirtmeniz gerekir. rnein,
f (int uc_b[][5][7])
{ ... }
Gelin bunun nedenine bakalm. uc_b[0]n 57 boyunda iki-boyutlu bir dizi olduuna
dikkat edin, uc_b[1] ilkinden 35 int ileride olan bir sonraki iki-boyutlu dizidir. Yani,
uc_b[1] veya *(uc_b+1)bir gsterge ifadesiuc_b[0]n 35 int ilerisini
gstermelidir. Bu, uc_bnin 5 arp 7 (yani 35) elemanlk bir diziye gsterge olduu
anlamna gelir. Yukardaki parametre bildirimi yle de yazlabilirdi:
int (*uc_b)[5][7];
bu da yukardaki ile tamamen ayndr. Parantezlere dikkat edin. Eer yazlmasalard,
int *(uc_b[5][7]);
anlamna gelecek, bu da int gstergelerden oluan iki-boyutlu bir dizi anlamna
gelecekti; bir sonraki altksmn konusu.
Aadaki rnek ok-boyutlu dizilerin kullanmn zetlemeye almaktadr.
Program inceleyip, onu izleyen kty dorulamaya aln.
#include <stdio.h>
int x[3][5][7]; /* uc-boyutlu bir dizi */
void f
(int a[][5][7]) /* iki-boyutlu diziye gsterge */
{
printf("%d\t%d\n", a[0][0][0],
(int)sizeof a[0][0][0]);
printf("%d\t%d\n", a[0][0], (int)sizeof a[0][0]);
printf("%d\t%d\n", a[0], (int)sizeof a[0]);
printf("%d\t%d\n", a, (int)sizeof a);
printf("\n%d\t%d\n", x[0][0][0],
(int)sizeof x[0][0][0]);
BLM 5 TRETLM TPLER VE VER YAPILARI 101
printf("%d\t%d\n", x[0][0], (int)sizeof x[0][0]);
printf("%d\t%d\n", x[0], (int)sizeof x[0]);
printf("%d\t%d\n", x, (int)sizeof x);
printf("\n%d\t%d\t%d", (int)a[0], (int)a[1],
((int)a[1]-(int)a[0]) / (int)sizeof(int));
printf("\n%d\t%d\t%d", (int)x[0], (int)x[1],
((int)x[1]-(int)x[0]) / (int)sizeof(int));
printf("\n%d\t%d\t%d", (int)a[0][0], (int)a[0][1],
((int)a[0][1]-(int)a[0][0]) / (int)sizeof(int));
printf("\n%d\t%d\t%d", (int)x[0][0], (int)x[0][1],
((int)x[0][1]-(int)x[0][0]) / (int)sizeof(int));
}
void main (void)
{ f(x); }
kt yledir:
0 2
3384 14
3384 70
3384 2
0 2
3384 14
3384 70
3384 210
3384 3454 35
3384 3454 35
3384 3398 7
3384 3398 7
5.8.3. Gsterge Dizileri
Daha nceki bir blmde, geleneksel olarak argv ad verilen, mainin ikinci
parametresinin bir karakter gstergeleri dizisi olduunu grmtk. Aslnda bunu
anlamak ta o kadar zor deildir; eer belirli bir sayda gstergemiz varsa, dier tipteki
deikenler iin yaptmz gibi, bunlar da bir dizi iinde saklayabiliriz. Bir rnek
grelim,
char *msj[] = {
"Tamam",
"Disk dolu",
"Sozdizim hatasi",
...
"Dosya bulunamadi"
};
Burada, ilkleyen iinde verilen karakter dizilerinin says kadar boyda bir dizimiz vardr.
Her karakter dizisinin temel adresi msj dizisi iinde arka arkaya gelen gsterge
102 TRETLM TPLER VE VER YAPILARI BLM 5
elemanlar iinde saklanmaktadr. Bu msjyi iki-boyutlu bir karakter dizisi olarak
tanmlamaktan iyidir. Bellek kullanm dikkate alarak bunun nedenini aklamaya aln.
Bu diziyi kullanabilecek bir hata yordam yledir:
void hata (int hk)
{
printf("<%d>: %s.\n", hk, msj[hk]);
exit(hk);
}
Burada exit, program bitiren bir ktphane fonksiyonudur. stdlib.h balk
dosyasnda bildirilmitir. int tipinden olan argman da, aran srecetipik olarak
iletim sisteminedndrlen bir durum kodudur. Geleneksel olarak, 0 normal
sonulanmay, sfrdan farkl bir say da farkl bir durumu gstermek iin kullanlr.
Baka bir rnee bakalm:
int cikis(void), ekleme(void),
silme(void), degistirme(void);
int (*fonkt[])(void) = {
cikis, ekleme, silme, degistirme
};
Bu, fonksiyonlara gstergelerden oluan bir dizidir. Tekrar, ile nceliklerini anmsayn.
lk olarak fonksiyon tiplerini tanmlyoruz. Fonksiyonlarn hepsinin parametresiz ve
dn tiplerinin de hep ayn olduuna dikkat edin. Daha sonra bu fonksiyonlara
gstergelerle diziyi ilkliyoruz. Bildiiniz gibi, eer bir fonksiyon ismi arkasnda parantez
bulunmuyorsa, bu o fonksiyona bir gstergedir. Bu dizideki bir fonksiyonu armak iin,
(*fonkt[secenek])()
kullanrz; secenek burada bir tamsaydr. Eer secenek 0sa cikis, 1 ise ekleme
arlr vs.
5.8.4. Gstergelere Gstergeler
Gstergeler deiken olduklarna gre, onlara da gsterge tanmlanabilir. Pratik bir
durum, bir fonksiyona geirilen bir gsterge dizisidir. mainin ikinci parametresi byle
bir rnektir, argv char gstergelerine bir gsterge olarak dnlebilir. Bylece,
void main (int argc, char *argv[])
ve
void main (int argc, char **argv)
tanmlar edeerdir. Aada, Altksm 4.2.3te verilen programn bir baka ekli
verilmitir:
BLM 5 TRETLM TPLER VE VER YAPILARI 103
#include <stdio.h>
void main (int argc, char *argv[])
{
printf("Merhaba, benim ismim %s.\n", *argv);
printf("Argumanlarim sunlar");
while (*++argv)
printf(", %s", *argv);
printf(".\n");
}
argvnin en sonunda bir NULL gstergenin bulunduuna dikkat edin.
Bir sonraki ksmda bir gstergeye gsterge rnei vardr.
5.9. Bir rnekDosya Sralama
Bu ksmda, malloc ve free ktphane fonksiyonlarn kullanan ve bu blmde
renilmi baz kavramlar gsteren bir rnee bakacaz. Problem bir metin
dosyasndaki satrlar sraya sokmaktr. Sraya sokma dzeni, sistem tarafndan salanan
sraya gre olacaktr. Bu, bizim sistem iin, artan ASCII karakterleri srasdr. (Ek Aya
baknz.) Bu program MS-DOSun SORT komutuna benzemektedir.
Yntemimiz ikili bir aa kullanmak olacaktr. Aacn her dmnde bir bilgi alan
ve iki gsterge vardr: biri sola, biri saa. Algoritma yledir:
Bo bir aala bala.
Bir satr oku; bir dm olutur; bilgi blmn satrla doldurup iki gstergeye BO
(NULL) koy. Bu, kk dm olacaktr.
Bir sonraki satr oku; bu satr iin yukardaki gibi bir dm olutur. imdi bu
dmn aa iine konulacak yeri aratr. Kk dmne olan gstergeden
balayarak ve BO bir gsterge elde edilmedii srece gstergeleri u ekilde izle:
Eer yeni satr, eldeki gsterge tarafndan iaret edilen dmdeki satrdan szlk
sras asndan kkse, gstergeye o dmn sol gstergesini aktar; aksi takdirde
sa gstergeyi aktar; bu ilemi tekrarla. Sonunda BO bir gstergeye ulalacaktr; bu
gstergeyi yeni dm gsterecek ekilde deitir.
Girilen btn satrlar iin nceki adm tekrarla. Sonundaille de dengeli olmasna
gerek olmayanbir ikili aa elde edilecektir.
Saysal deerler kullanlarak elde edilen rnek bir ikili aa ekil 5.1de
gsterilmitir.
104 TRETLM TPLER VE VER YAPILARI BLM 5
15
15, 9, 3, 5, 17, 10, 4, 7, 13
3, 4, 5, 7, 9, 10, 13, 15, 17.
9 17
3 10
5 13
4 7
Saylar u srada girilmitir:
ve k sras yledir:
iareti BO gsterge anlamna gelir.
EKL 5.1 Bir rnek ikili aa
Aac bastrmak iin aadaki zarl algoritmay kullanacaz: Kk dme olan
gstergeden bala. Eer gsterge BO deilse, soldaki altaac bastr; eldeki dmn
bilgisini bastr; sadaki altaac bastr. Altaalarn basm ii ayn tmcede anlatlan
algoritma kullanlarak yaplacaktr. Bu algoritma eninde sonunda bitecektir; nk tmce
banda eer koulu vardr. Dikkat ederseniz, bir aataki gstergelerin yarsndan
fazlas BOtur. Neden?
Bu algoritmay bir program eklinde uygulamaya sokmak iin dm iin ne tr bir
veri yaps kullanacamza karar vermemiz gerekir. Doal olarak, bu, yeden oluan
bir yap (struct) olacaktr: satir, sol ve sag; bu son ikisi de ayn yapya olan
gsterge tipinden olacaktr. Yani, bir z-referansl yapmz olacaktr. lk ye (satir),
belirli bir st limite (rnein 80 karaktere) kadar olabilecek bir satr saklayabilecek
byklkte bir karakter dizisi eklinde tanmlanabilir. Fakat btn satrlar bu kadar uzun
olamayacaklarna gre, dizi iindeki alann byk bir blm kullanlmayabilecektir, yani
bellek israf olacaktr. Bundan dolay satir bir karakter gstergesi eklinde
tanmlanmtr ve satrn boyu kadar, yrtme esnasnda istenen, bellek blgesinin bana
iaret edecektir.
imdi de program:
1. #include <stddef.h>
2. #include <stdio.h>
3. #include <stdlib.h>
4. #include <string.h>
5. #define MAKSSU 80 /* en buyuk satir uzunlugu */
6.
BLM 5 TRETLM TPLER VE VER YAPILARI 105
7. typedef struct dugum { /* struct dugum'un tanimi */
8. char *satir; /* bilgi */
9. struct dugum *sol, *sag;
10. } *dugumg; /* dugumg tipinin tanimi*/
11.
12. void *yeni (size_t d) /* bellek ayirma */
13. {
14. void *g;
15.
16. if ((g=malloc(d))!=NULL)
17. return g; /* tamam */
18. fprintf(stderr, "SIRALA: Yetersiz bellek");
19. exit(1); /* programi kes */
20. } /* yeni */
21.
22. size_t satiroku /* satir uzunlugu dondur; 0 dosya sonu */
23. (char *d, int u)
24. {
25. register char *g = d;
26. register int c;
27.
28. while ((c=getchar())!='\n' && c!=EOF)
29. if (u-->1)
30. *g++ = (char)c; /* daha uzun satirlari kes */
31. if (c==EOF && g==d)
32. return 0; /* bir sey okunamadi */
33. *g++ = '\0';
34. return g-d; /* asil uzunluk arti bir ('\0' icin) */
35. } /* satiroku */
36.
37. void satirlaribas /* agacin ozcagrili taranmasi */
38. (dugumg g)
39. {
40. if (g!=NULL) {
41. satirlaribas(g->sol);
42. printf("%s\n", g->satir);
43. satirlaribas(g->sag);
44. free((void *)g->satir);
45. free((void *)g);
46. }
47. } /* satirlaribas */
48.
49. void main (void)
50. {
51. char satir[MAKSSU+1]; /* MAKSSU arti bir ('\0' icin) */
52. size_t su; /* simdiki satir uzunlugu */
53. dugumg kok = NULL, *g;
54.
55. while ((su=satiroku(satir,(int)sizeof satir)) > 0) {
56. g = &kok;
57. while (*g!=NULL)
58. g = (strcmp(satir,(*g)->satir) < 0)
59. ? &(*g)->sol : &(*g)->sag;
60. *g = (dugumg) yeni(sizeof(struct dugum));
61. strcpy((*g)->satir = (char *)yeni(su), satir);
62. (*g)->sol = (*g)->sag = NULL;
63. }
64. satirlaribas(kok);
65. } /* main */
106 TRETLM TPLER VE VER YAPILARI BLM 5
Programn banda, yap (struct dugum) ve byle bir yapya bir gsterge
(dugumg) iin tipler tanmlam bulunuyoruz. main yordam, her okunan satr iin bir
defa yrtlen byk bir while dngsnden olumaktadr.
satiroku fonksiyonu satir karakter dizisinin iine bir satr okur ve okunan
karakter says art bir (en sona konan '\0' iin) verir. Dosya sonu (EOF) durumunda ise
0 dndrr.
main iinde iki nemli deikenimiz vardr: kok, dme bir gstergedir ve her
zaman kk dmne iaret eder, g ise bir dme olan gstergeye gstergedir; bir
dmn sol yada sag gstergelerine iaret eder. Bir defa bir satr okundu mu, g kk
dm gstergesine iaret edecek ekilde getirilir.
Sonra, g tarafndan iaret edilen yerde NULL (BO) bir gsterge olmad srece,
gnin iaret ettii gsterge tarafndan iaret edilen dmde imdi okunan satrdan szlk
srasna gre daha byk bir satrn olup olmadn kontrol ederiz. Eer yle ise gnin
sol, aksi takdirde sag gstergeye iaret etmesini salarz. while dngs g tarafndan
iaret edilen (sol ve sag) gsterge bir dme iaret ettii (yani NULL olmad) srece
tekrarlanr.
Bir NULL gstergeye ulatmzda, gnin bu gstergeye iaret ettiini bilerek,
dngden karz. imdi yeni bir dm oluturmann zamandr. malloc ktphane
fonksiyonunu kullanan yeni fonksiyonu, bu dm iin yeterli miktarda bellek blm
ayrmak iin arlr. Dndrd gsterge g tarafndan iaret edilen gstergeye aktarlr.
Daha sonra, okunmu olan satr alacak byklkte bir bellek blgesi ayrlr; satr bu
blgeye aktarlr ve bu blgeye olan gsterge, gnin iaret ettii gsterge tarafndan
gsterilen dm, yani yeni dm, iindeki satir gstergesine atanr. Ayrca, bu
dmn sol ve sag gstergelerine de NULL konur.
Yukarda anlatlanlar, ilk bakta, ok karmak gelebilir. Eer aklamay tam olarak
izleyemediyseniz, tamamen haklsnz. Birka tekrar yararl olacaktr.
Yaplacak son ey aac basmaktr. Burada zar bize ok yardmc olacaktr. Ana
program, kok gstergesini vererek satirlaribas adl zarl fonksiyonu arr.
Bu fonksiyon, Eer gsterge NULL deilse, sol altaac bas; imdiki dmn bilgisini
bas; sa altaac bas cmlesinde denileni yapar ve ayrca bu dm tarafndan
kullanlan bellei serbest brak iini de yapar. Bellek serbest brakldktan sonra, tekrar
bellek ayrma sz konusu olmad iin free fonksiyonu arlarnn bu program iin
gereksiz olduuna dikkat edin.
Programmz girdisini standart girdi aygtndan alr ve ktsn da standart kt
aygtna gnderir. Daha sonraki bir blmde greceimiz gibi, programlarmzda
girdi/kt iin dosyalar da kullanabiliriz, ama daha basit bir yol vardr. Birok iletim
sistemi, girdi/ktnn yeniden ynlendirilmesi ad verilen ve tekrar derleme yapmadan,
standart girdi ve kt dosyalar yerine baka dosyalarn kullanlmasna izin veren bir
yntem salarlar. MS-DOSta, bu, u ekilde yaplabilir: Programnzn SIRALA adl
yrtlebilir dosya iinde derlendiini varsayn.
A>SIRALA <SIRASIZ >SIRALI
BLM 5 TRETLM TPLER VE VER YAPILARI 107
komutunu kullanarak programn girdiyi SIRASIZ adl disk dosyasndan almasn ve
kty SIRALI adl dosyaya koymasn salayabilirsiniz. Bu argmanlarn bir tanesini
belirtmediinizde ne olduunu deneyip kendiniz bulmaya aln. Program iin bu
argmanlarn tamamen grnmez olduuna dikkat edin; yani (main fonksiyonunun
ikinci parametresi olan) argv dizisinde gzkmeyeceklerdir; gerekli ilemleri iletim
sistemi yapar.
Baka bir zellik kme komut ilemedir.
A>DIR | SIRALA
eklindeki MS-DOS komutunu deneyip kty aklayn. Daha fazla bilgi iin iletim
sisteminizin elkitabna dann.
Problemler
1. lklenmemi enum gunler tipinden bir deiken (a) eer static veya dsalsa
ve (b) eer auto veya register ise hangi deere sahip olacaktr.
2. Ksm 5.2de sz edilen yaplarla ilgili snrlamalar olan bir derleyiciniz olduunu
varsayn. Argman olarak ayn tipten iki yapnn adreslerini alp ikinci yapy ilk
yapya aktaran yapi_ata adnda bir fonksiyon yazn.
3. Yeni yap tipleri tanmlamann iki yntemi vardr: yap knyesi kullanarak ve
typedef kullanarak. Aadakini typedef kullanan bir bildirime dntrn.
aylar deikeni iin yazlm tanm da uygun ekilde deitirin.
struct ay {
char *ayadi;
int ayuzunlugu;
};
...
struct ay aylar[12];
4. ki yerde (yani kalplarda ve sizeofun ilenenleri olarak), bir veri tipi verilmesi
gerekir. Bu basit bir tip ismi olabilecei gibi daha karmak bir ifade de olabilir.
Byle bir balamda aadakilerin ne anlama geldiini bulmaya aln:
int *
int *[3]
int (*)[3]
int *(float)
int (*)(void)
5. Altksm 5.8.1in banda tanmlanm bulunan a dizisinin iindekileri grntlemek
iin aadakini deneyin:
108 TRETLM TPLER VE VER YAPILARI BLM 5
#include <stdio.h>
void main (void)
{
int i, j;
for (i=0; i<3; i++)
for (j=0; j<4; j++)
printf("%2d%c",a[i,j], j==3 ? '\n' : ' ');
}
Neden doru kty elde edemiyoruz? Grntlenen saylar nelerdir? Beklenen
kty elde edecek ekilde program deitirin.
6. Altksm 5.8.2de verilen rnekte neden sizeof(x) 210dur da sizeof(a)
2dir?
7. Eer MS-DOS kullanmakta iseniz, MS-DOS elkitabnda SORT komutu iin
belirtilenleri okuyup, bu blmn sonunda verilen rnek program, bunlar da
yapacak ekilde gelitirin. rnein, byk-kk harf ayrm yapmadan sralama
yapmay veya sralama yaparken belirli bir kolondan itibaren dikkate almay salayn.
8. Aadaki rneklerde const ve volatile anahtar szcklerinin ne ie yaradn
anlamaya aln:
int const x = 11;
int y = 22;
int * const a = &y;
const volatile * const b = &x;
109
BLM 6: NLEMC
1. #include <conio.h>
2. #define PI 3.14159265358979323846
3. #define DEGIS(x,y,tip) { tip t; t = x; x = y; \
4. y = t; }
5. #ifdef EOF
6. # define SON EOF
7. #else
8. # define SON (-1)
9. #endif
10. #ifndef MAKS
11. # define MAKS(p,q) ((p)>(q) ? (p) : (q))
12. #endif
13. #define OZEL static
...
14. #undef OZEL
15. #if (HDUZ & 0x40) != 0
16. printf("satir = %d\n", __LINE__);
17. #endif
Bu blmde hemen her zaman C derleyicisi ile birlikte kullanlan ayr bir ilemciye
gz atacaz. Bu; derlenmeden nce kaynak dosyalarmz metin ynnden nilemeye
tabi tuttuu iin bu ekilde adlandrlan, C nilemcisidir. nilemciyi, kaynak
dosyalarmz alp, verilen nilemci emirlerine gre yeni bir dosya oluturan bir
dzenleyici eklinde dnebiliriz. Kabaca durum yledir:
stdio.h
benim.h
prog.c
ama kod.
nilemci aslnda derleyici ile btnlemitir, yani genelde ayr bir sistem program
deildir.
Bir nilemci emrini ile sradan bir C deyimini ne ayrr? lk olarak, farkl szdizimi.
kinci olarak ta, satrn bandaki say iareti (#). Genelde, emirler bir satr tutarlar; ancak
bir satr, sonuna bir ters bl iareti (\) konularak, bir sonraki satra devam ettirilebilir.
Ayrca emrin sonunda noktal virgl olmadna dikkat edin.
110 NLEMC BLM 6
Emirler hibir zaman derleyici tarafndan grnmezler. nilemci, emirleri karp
yerlerine istenen ilemleri yapar. rnein, bir #include emri ieren satr yerine emirde
belirtilen dosyann ierii konur. nilemci emirleri herhangi bir satra konabilirler, ancak
nilemci aklamalar atlad iin, aklamalarn iine konulamazlar.
Bu blmn geri kalan ksmlarnda, nilemci emirlerini ayrntl olarak
aklayacaz.
6.1. #define Ve #undef Emirleri
#define emri belirli karakter dizileri iin (makro ad da verilen) takma isimler
tanmlamaya yarar. Szdizimi yledir:
#define tantc_szck deitirme_dizisi
rnein,
#define BLOKBASI {
#define BLOKSONU }
#define YORDAM static void
Tanmlanmakta olan tantc_szckn nnde ve arkasnda en az bir tane boluk
karakteri bulunmaldr. Normal C tantc szcklerinden ayrt etmek iin, bu tr isimlerde
byk harflerin kullanlmas allagelmitir. Bu isimlerin tanm #undef ile iptal
edilmedii srece, kaynak dosyann geri kalan ksmnda, tanmnda ondan sonra gelen
karakter dizisi (yani deitirme_dizisi) ile deitirilirler. Tanmlanm bulunan bir
tantc_szck iin ikinci bir #define ancak deitirme_dizisi ayn ise kabul
edilebilecektir.
rnein,
YORDAM hepsini_goster (...)
BLOKBASI
...
BLOKSONU
program paras, derlenmeden nce, nilemci tarafndan
static void hepsini_goster (...)
{
...
}
eklinde deitirilecektir. Bir istisna: Eer isim trnak iinde yer alyorsa, makro
deiiklii yaplmayacaktr. rnein,
printf("BU YORDAM...");
deyimi deitirilmeden, ayn ekilde kalacaktr.
BLM 6 NLEMC 111
Tipik olarak, #define emri program iin say, karakter dizisi vs deimezleri
tanmlamak iin kullanlr, ancak deitirme_dizisi, daha nce veya sonra tanmlanan
makrolar da dahil, her eyi ierebilir.
Daha nce tanmlanm bir makronun tanmn kaldrmak iin #undef emrini,
arkasna makro ismini belirterek, kullanabilirsiniz. (Bu blmn bandaki ilk rnekte
Satr 13 ve 14e baknz.) Yani
#undef tantc_szck
Makrolara argman da verilebilir. (Blmn banda Satr 3 ve 11e baknz.) Genel
ekil yledir:
#define tantc_szck(tantc_szck
opt
, ...) deitirme_dizisi
Makro ismi ile biimsel argman listesi iindeki ilk parametreden nce gelen sol
parantez arasnda herhangi bir boluk bulunmamaldr. Bir fonksiyona benzemesine
ramen, baz farklar vardr. Makrolar satrii kod olutururlar, yani makronun
kullanld her sefer, biimsel argmanlar yerine gerek argmanlar konularak, ilgili
deitirme_dizisi onun yerini alr. Makro arsndaki argmanlarn says, bildirimde
belirtilmi bulunan biimsel argmanlarn says ile ayn olmal ve virgllerle
ayrlmaldrlar. Trnak iaretleri iinde veya bir ift parantez arasnda bulunan virgller
gerek argman ayrclar olarak saylmazlar.
rnein, Satr 11de tanmlanm makroya bir ar ieren
m = MAKS(x=10, c?y:z) + 5;
ifadesi nilemci tarafndan,
m = ((x=10)>(c?y:z) ? (x=10) : (c?y:z)) + 5;
eklinde alacaktr. imdi makro tanmnda parametreler etrafnda neden parantez
kullanm olduumuzu gryorsunuz. Hepsi gereklidir. Aksi takdirde, istenen sonu elde
edilemeyecektir. Eer inanmyorsanz, bir de parantezler olmadan deneyin. (le
nceliklerini unutmayn!) Byle durumlar iin kural yledir:
lk olarak, deitirme_dizisini sol parantezle balatp sa parantezle bitirin. Az
nceki rnekte olduu gibi, genelde, bir makro, ifadenin bir blmn oluturur. Bu
ayn zamanda Satr 8deki tanmda da gerekli idi. [Neden? if (kar SON)
durumunu inceleyin.]
kinci olarak, deitirme_dizisindeki btn parametreleri parantez iine aln. nk
gerek argmanlarn karmak ifadeler olabileceini unutmayn.
Bir nceki rnekte olduu gibi, dikkat ettiyseniz, makro almndan sonra baz
hesaplamalar birden fazla kez yaplabilir. rnein, x=10 atama deyimi. Bu durum
verimsiz olmas dnda, baz beklenmeyen sonularn kmasna da neden olabilir.
rnein inin deerinin 6 olduunu varsayn. MAKS(6,i++)nin deeri ne olacaktr?
6 m? Bakalm. nilemci ((6)>(i++) ? (6) : (i++)) eklinde aacaktr.
Bylece deeri 7 olacaktr. Ayrca, inin yeni deeri 7 deil de 8 olacaktr.
112 NLEMC BLM 6
Eer deitirme_dizisinde bir parametrenin nne # konursa, makro almndan
sonra ift trnak iine alnacaktr, yani argman bir karakter dizisine dntrlecektir.
Ayrca byle bir argmann iinde bulunan " ve \ karakterlerinin nne \ eklenecektir.
Eer deitirme_dizisi iinde bir ## simgesi varsa, bu ilecin nnde ve arkasnda
bulunan isimlerin birbirine yaptrlaca ekilde, ## ve etrafndaki her trl beyaz
boluk karakteri karlacaktr. rnein
#define cagir(x) yord ## x()
tanmn ele alalm. Bu makroyu
cagir(1);
eklinde kullandmzda
yord1();
eklinde alacaktr.
6.2. #include Emri
#include "dosya_ad"
#include <dosya_ad>
veya
#include karakter_dizisi
eklindeki bir satr, nilemcinin bu satr yerine belirtilen dosyann iindekilerini
koymasn salar. Dosyann iinde uygun C kodunun bulunmas gerektii aktr. lk ekil,
nilemcinin dosya_ad iin nce varsaylan altdizine, yani derlenmekte olan kaynak
dosyann bulunduu altdizine, daha sonra standart yerlere bakmasn salayacaktr.
kinci ekil sadece standart yerlerde aramaya neden olur. Standart yerler derken, bu tr
dosyalarn bulunduu, nilemci tarafndan bilinen, altdizinlerden szetmekteyiz.
Dosya_adna bazen balk dosyas ad da verilir. nc ekilde ise, nilemci tarafndan
#define ile tanmlanm karakter_dizisi aldnda ilk iki ekilden birisinin elde
edilmesi beklenir.
Sistemimizde, standart yerler, INCLUDE adndaki MS-DOS ortam deikeninde
belirtilir. rnein,
SET INCLUDE=a:\ktphnm;a:\include
MS-DOS komutu, nilemcinin dosyay bulmas iin, belirtilen iki altdizine bakmasn
salayacaktr. Eer #includeun ift trnakl olan kullanlrsa, nce varsaylan aldizine
baklacaktr. Ayrca, isterseniz #include emrindeki dosya_adnda dosya isminin nne
altdizin ismini de belirtebilirsiniz.
BLM 6 NLEMC 113
Son bir nokta: #include emirleri (8 dzeye kadar) iie yazlabilir; bu,
#include edilen bir dosyann iinde baka #include emirleri de bulunabilir
anlamna gelir.
6.3. Koullu Derleme
#if, #ifdef, #ifndef, #else, #elif ve #endif emirleri, baz koullara bal
olarak derlemeyi kontrol ermek iin kullanlrlar.
#if deimez_ifade
emri, eer deimez_ifadenin deeri doru (sfrdan farkl) ise bir sonraki #endif veya
#else (veya #elif) emrine kadar olan satrlarn derlemeye dahil edilmesini salar. lk
durumda, derleme #endiften sonra, normal olarak devam eder; ikinci durumda ise,
#elseden sonra ilgili #endife kadar olan satrlar nilemci tarafndan atlanr (yani
derleyiciye gnderilmez). Eer deimez_ifadeni deeri yanl (0L) ise, #if ile #endif
veya #else (hangisi nce geliyorsa) arasndaki metin atlanr. #if emirlerinin iie
yazlabildiine dikkat edin, bunun iin hangi #elsein hangi #ife ait olduunu
bilmemiz gerekir: #else bir #endif ile balants olmayan, yukardaki en yakn #ife
aittir. Deimez_ifade, nilemcinin nilem zamannda hesaplayabilecei herhangi bir
C ifadesidir; sizeof ve kalp ileleriyle saym ve kayan noktal say deimezleri
burada kullanlamazlar. Daha nce nilemciye tanmlanm makrolar ise kullanlabilirler;
ancak, tanmsz isimlerin yerine 0L konur. Deimez_ifade her zaman long duyarlkta
hesaplanr.
Bir emir satrnda
defined tantc_szck
eklindeki bir ifade, eer tantc_szck nilemci tarafndan biliniyorsa 1L ile
deitirilir, aksi takdirde 0L konur.
Bir rnek olarak, iki mteri iin hazrlanm bir program ele alalm. Program iinde
belirli bir mteri iin gerekli blmler olabilir. Derlemeyi kontrol etmek iin, u anki
derlemenin hangi mteri iin yapldn gsteren bir tantc szck tanmlayabiliriz.
rnein,
#define MUSTERI 1 /* diger must. icin baska bir deger */
...
#if MUSTERI == 1
/* ilk musteri icin kod */
...
#else
/* ikinci musteri icin kod */
...
#endif
Bu arada
114 NLEMC BLM 6
#ifdef tantc_szck
ve
#ifndef tantc_szck
emirleri, srasyla, tantc_szckn nilemci tarafndan #define ile tanmlanm olup
olmadn test ederler. Bunlar, srasyla,
#if defined tantc_szck
ve
#if !defined tantc_szck
emirleriyle edeerdirler.
#elif deimez_ifade
emri
#else
#if deimez_ifade
iin bir ksaltma eklinde dnlebilir, ancak #elif kullanldnda yeni bir #endife
gerek kalmaz; nceki #ifin #endifi kullanlr.
Baka bir rnek olarak, hatalarn dzeltilmekte olduu bir program dnn; bylece
bu programda htkntrl adl bir fonksiyona baz yerlerde arlar olmaktadr. (Bu
fonksiyon, rnein, baz deikenlerin o anki deerlerini basyor olabilir.) Ancak,
program gelitirilmesi sonunda program normal bir ekilde derlememiz gerekecektir.
Bunu yapmann kolay bir yolu da yledir:
...
#ifndef HATASIZ
/* hata duzeltme yardimci fonksiyonu */
/* iceren baslik dosyasi */
# include "htkntrl.h"
#else
# define htkntrl()
#endif
...
Eer HATASIZ adl tantc szck #define ile tanmlanmamsa, o zaman
#include emri nilemeye girecek ve htkntrl fonksiyonu da dahil, hata dzeltme
yardmc programlar ieren htkntrl.h dosyasnn iindekileri derlenecektir. Ancak,
eer HATASIZ #define ile tanmlanrsa, o zaman, bo bir deitirme dizisine sahip
olan htkntrl makrosu #define ile tanmlanm olacaktr. Bu durumda, htkntrle
yaplan arlar, nilemci tarafndan, bolukla deitirilecektir. Buna benzer #if
emirleri programn baka blmlerinde de konulabilir. HATASIZ tantc szc
programn banda tanmlanabilecei gibi, UNIX veya sistemimizde olduu gibi C
(nilemcisi ve) derleyicisinin arld komut satrnda belirtilebilir. Ek Bye baknz.
BLM 6 NLEMC 115
6.4. Dier Emirler
Pek kullanlmayan bir emir de aadakidir:
#line deimez "dosya_ad"
opt
Burada deimez, bir deimez ifade deil, 1 ile 32 767 arasnda bir tamsay
deimezidir. Dosya_ad ise bir karakter dizisidir. Bu emir, derleyicinin u anki satr
saysn unutup derlemekte olduu satrn saysnn sanki deimez ile ifade edilen say
imi gibi davranmasn salar. Yani emirden sonraki beinci satrda bir hata olursa
deimez+4 nolu satrda hata var eklinde bir hata mesaj ortaya kacaktr. stee
bal olan ikinci argman ise, derleyicinin u anda derlenmekte olan dosyann adnn
sanki dosya_ad imi gibi bir varsaymda bulunmasna neden olur. Dosya_adnn iinde
altdizin de belirtilmise, bu #include dosyalar iin taranacak olan varsaylan altdizini
de etkileyebilir. (Ksm 6.2deki tartmaya baknz.)
#error karakter_dizisi
eklindeki bir satr, nilemcinin karakter_dizisini de ieren bir mesaj yazmasn
salayacaktr.
#pragma karakter_dizisi
eklindeki bir nilemci emri, nilemci ve/veya derleyicinin karakter_dizisi iinde
belirtilen bir ilem yapmasna neden olacaktr. Karakter_dizisi iin kabul edilebilecek
deerler C Standardnda belirtilmemitir. Onun iin bu tamamen uygulamaya bal bir
zelliktir ve dikkate de alnmayabilir.
En son olarak; grnen tek karakteri # olan bir satr dikkate alnmaz ve atlanr.
6.5. nceden Tanmlanm simler
nilemci, ayrca baz tantc szckleri nceden #define ile tanmlamtr. Bunlarn
tanmnn #undef ile kaldrlmas veya #define ile yeniden tanmlanmalar mmkn
deildir. Bunlar unlardr:
__FILE__ Derlenmekte olan dosyann ad (karakter dizisi),
__LINE__ u anki kaynak satr numaras (ondalk say),
__DATE__ Tarih (Aaa gg yyyy eklinde karakter dizisi),
__TIME__ Saat (ss:dd:ss eklinde karakter dizisi),
__STDC__ Standarda uyan derlemeler iin 1 deimezi.
116 NLEMC BLM 6
6.6. Bir rnekctype.h Balk Dosyas
Aada ctype.h balk dosyasnn basitletirilmi ve Trkeletirilmi bir uyarlamas
verilmektedir:
1. /***
2. *ctype.h - karakter donusum makrolari ve ctype makrolari
3. *
4. * Copyright (c) 1985-1992, Microsoft Corp. Her hakki saklidir.
5. *
6. *Amac:
7. * Karakter siniflandirmasi ve donusumu icin makrolar tanimlar.
8. * [ANSI/Sistem V]
9. *
10. ****/
11.
12. #ifndef _INC_CTYPE
13.
14. /* ... */
15.
16. /* Asagidaki tanim, kullanicinin, ctype.obj'da
17. * tanimlanmis bulunan _ctype adli karakter tipi
18. * dizisine erisimini saglar.
19. */
20.
21. extern unsigned char /* ... */ _ctype[];
22.
23. /* olasi karakter tipleri icin bit ortulerinin tanimlanmasi */
24.
25. #define _UPPER 0x1 /* buyuk harf */
26. #define _LOWER 0x2 /* kucuk harf */
27. #define _DIGIT 0x4 /* rakam[0-9] */
28. #define _SPACE 0x8 /* durak, satir basi, yeni satir, */
29. /* dikey durak veya sayfa ilerletme */
30. #define _PUNCT 0x10 /* noktalama karakteri */
31. #define _CONTROL 0x20 /* kontrol karakteri */
32. #define _BLANK 0x40 /* bosluk karakteri */
33. #define _HEX 0x80 /* onaltili rakam */
34.
35. /* ... */
36.
37. /* karakter siniflandirilmasi ile ilgili makro tanimlari */
38.
39. #define isalpha(_c) ( (_ctype+1)[_c] & (_UPPER|_LOWER) )
40. #define isupper(_c) ( (_ctype+1)[_c] & _UPPER )
41. #define islower(_c) ( (_ctype+1)[_c] & _LOWER )
42. #define isdigit(_c) ( (_ctype+1)[_c] & _DIGIT )
43. #define isxdigit(_c) ( (_ctype+1)[_c] & _HEX )
44. #define isspace(_c) ( (_ctype+1)[_c] & _SPACE )
45. #define ispunct(_c) ( (_ctype+1)[_c] & _PUNCT )
46. #define isalnum(_c) ( (_ctype+1)[_c] & (_UPPER|_LOWER|_DIGIT) )
47. #define isprint(_c) ( (_ctype+1)[_c] & (_BLANK|_PUNCT| \
48. _UPPER|_LOWER|_DIGIT))
49. #define isgraph(_c) ( (_ctype+1)[_c] & (_PUNCT|_UPPER| \
50. _LOWER|_DIGIT) )
51. #define iscntrl(_c) ( (_ctype+1)[_c] & _CONTROL )
52. #ifndef __STDC__
53. #define toupper(_c) ( (islower(_c)) ? _toupper(_c) : (_c) )
BLM 6 NLEMC 117
54. #define tolower(_c) ( (isupper(_c)) ? _tolower(_c) : (_c) )
55. #endif
56. #define _tolower(_c) ( (_c)-'A'+'a' )
57. #define _toupper(_c) ( (_c)-'a'+'A' )
58. #define __isascii(_c) ( (unsigned)(_c) < 0x80 )
59. #define __toascii(_c) ( (_c) & 0x7f )
60.
61. /* genisletilmis ctype makrolari */
62.
63. #define __iscsymf(_c) (isalpha(_c) || ((_c) == '_'))
64. #define __iscsym(_c) (isalnum(_c) || ((_c) == '_'))
65.
66. /* ... */
67.
68. #define _INC_TYPE
69. #endif
Bu dosyann banda (_ctype) extern dizisinin bildirimi yaplmaktadr. Bu 129
elemanlk bir dizidir. lk elemannn deeri 0dr, bylece ikinci elemandan balamamz
gerekir. lk elemann atlamak iin, dizi u ekilde indislenebilir:
(_ctype+1)[indis]
Her eleman, indis olarak kullanlan karaktere karlk gelen bir kod ierir. rnein:
(_ctype+1)[' ']in deeri 0x48dir
(_ctype+1)['A']in deeri 0x81dir
Bu saylar, herbirinin zel bir anlam olan, 8 bitten olumaktadr. Bu bitlerin anlamlar
25ten 33e kadar olan satrlarda verilmitir. rnein, 0x48 _BLANK (boluk) ve
_SPACE (grnmeyen karakter) anlamna gelir, 0x81 _HEX (onaltl rakam) ve _UPPER
(byk harf) demektir. Bu bilgi ile, is... (...dr) makrolarnn nasl altn aklamak
zor olmayacaktr. __isascii (ASCII karakteri) olup olmadn test eder.
Dier makrolarn aklamas kolaydr ve okuyucuya braklmtr.
Problemler
1. Yeni tipler tanmlamak iin en az iki yolunuz vardr. Bir, nilem esnasnda
#define kullanarak; iki, derleme srasnda typedef anahtar szcn
kullanarak. #definen typedef yerine kullanlamayaca bir rnek verin.
2. Makrolar, karakter dizileri, yani ift trnak iinde ise almazlar. Ancak makro
parametreleri, makro tanmnda trnak iinde olsalar bile deitirilebilirler. Standart
aka bunu yasaklamaktadr ve bizim nilemcimiz de bunu yapmamaktadr.
Sizinkinin de ayn eyi yapp yapmadn deneyerek grn ve bu zellii kullanan
yararl bir rnek verin.
3. _ctype dizisini kullanmadan ctype.h dosyasnda tanmlanm bulunan is...
(...dr) makrolarna edeer uyarlamalar tanmlayn. Bir rnek aada verilmitir:
118 NLEMC BLM 6
#define isalpha(_c) (((_c)>='A' && (_c)<='Z') || \
((_c)>='a' && (_c)<='z'))
4. Anahtar szckleri Trke, Almanca, talyanca veya baka bir dilde olan C
programlar yazmanz salayacak #definelar yazn.
119
BLM 7: DOSYALAR VE
GRD/IKTI
Altmz deikenlerden farkl olarak, bir dosya, programn yrtlmesinden nce
ve/veya sonra da var olan bir nesnedir. Kalc olma zellii dosyalar ok yararl klar.
imdiye kadar grdmz programlarda olduu gibi, dosyalar sayesinde, programlar
kullanclaryla veya birbirleriyle haberleebilirler. C dilinde dosyalar, istenildii kadar
uzun olabilen karakter (bayt) sralar eklinde grlrler. Ancak daha karmak bir yap,
kullanc tarafndan, uygulamaya gre, verilebilir. Bu blmn byk bir ksm,
dosyalarla ilgili eitli ilemler ve girdi/kt yapmak iin bize yardmc olacak standart
ktphaneyi anlatacaktr. Bu blmde anlatlan fonksiyonlar, birok C ortamnda
salananlarn sadece kk bir ksmdr. Daha fazla bilgi iin ilgili bavuru elkitaplarna
dann.
Kullanc programlar, iletim sistemi ad verilen, karmak bir sistem programnn
gzetimi altnda altrlrlar. Programlarn iletim sistemine eitli ilemler yaptrmas
iin, C ktphanesi baz yordamlar ierir. C farkl sistemlerde uyguland iin
ktphanenin bu blm pek standart deildir. Bu blmde tartlacak baka bir konu da,
bizim sistemin C ile nasl etkiletiidir.
Ksm 7.1den 7.4e kadar anlatlan fonksiyonlar Standardn bir parasdr ve
stdio.h balk dosyasnda bildirilmitir. Ksm 7.5teki fonksiyonlarn bildirimi
stdlib.h standart balk dosyasnda bulunmaktadr. Ancak Ksm 7.6dakiler
Standardn bir paras deildir, buna ramen birok ortamda desteklenmektedir.
7.1. Dosya Esaslar
Program bir dosya zerinde herhangi bir ilem yapmadan nce, dosyann almas
gerekmektedir. fopen standart fonksiyonu bunu yapar ve iki karakter dizisi argman
alr: alacak olan dosyann ad ve eriim modu. lk argman herhangi geerli bir dosya
120 DOSYALAR VE GRD/IKTI BLM 7
ad ierebilir; dosya adnn nne src ve altdizinler de belirtilebilir. kinci argmann
alabilecei deerler ve anlamlar aadaki izelgede gsterilmitir:
deer eriim modu
"r" okuma
"w" yeniden yazma
"a" sona ekleme
"r+" okuma ve yazma (deitirme)
"w+" okuma ve yeniden yazma (deitirme)
"a+" okuma ve ekleme
Varolmayan bir dosyadan okumaya kalkmak hatadr. Yeni bir dosya yaratmann yolu
varolmayan bir dosya ad verip "a..." veya "w..." belirtmektir. Eer eriim modunun
sonuna b harfi eklenirsernein "rb"ikili (ham) modda girdi/kt yaplacaktr, aksi
takdirde metin girdi/kts yaplr. Eer ama ilemi baarl ise fopen at dosyaya bir
dosya gstergesi dndrr, yoksa, standart ktphanede de bulunan, NULL yani bo
gsterge dndrr.
Dosya gstergeleri u ekilde tanmlanmaldr:
FILE * dosya_gostergesi;
FILE btn dosyalarn tipidir; ktphanede tanm bulunan bir yapdr ve bu tanmn
detaylar normal kullanclar ilgilendirmez. Gelin bir dosya oluturalm:
dosya_gostergesi = fopen("DOSYA.YEN", "w")
Bundan sonra, DOSYA.YEN ile ilgili ilemlerde dosya_gostergesi
kullanlacaktr.
Bir program ekrana bilgi grntledii zaman, aslnda standart kt dosyasna
karakter yazmaktadr. Programnza klavyeden bilgi girdiinizde, aslnda bunlar standart
girdi dosyasna yazmaktasnz ve program bu dosyay okumaktadr. Standart dosyalar
programc tarafndan fopen kullanlarak almazlar, yrtme balamadan nce,
otomatik olarak alp, normalde, kullandnz ekran ve klavyeye atanrlar. Ktphane,
bu iki dosya iin de dosya gstergeleri iermektedir: standart girdi dosyas iin stdin,
standart kt dosyas iin de stdout.
Baz durumlarda, hata mesajlar iin ayr bir kt aknn olmas uygun olabilir. C
bir standart hata dosyas salamaktadr; bu dosyaya olan gstergenin ad stderrdir.
Normalde, stderre giden kt stdoutnkiyle birlikte ayn aygta yaplr, ancak bunu
deitirmenin yollar vardr. stdin, stdout ve stderr deimez gstergelerdir;
onlar kullanrken bunu unutmayn.
imdi, bir dosyay nasl aacamz bildiimize gre, gelin ona nasl yazacamza
bakalm. dosya_gostergesi tarafndan iaret edilen dosyaya kar karakterini
yazmak iin putc fonksiyonunu kullanrz:
putc(kar, dosya_gostergesi)
BLM 7 DOSYALAR VE GRD/IKTI 121
putc aslnda karakterleri bir tampon blgeye koymakta ve bu blge dolduunda
iindekileri dosyaya aktarmaktadr. Eer dosyaya, tamponun boyundan daha az miktarda,
birka karakter yazmak isterseniz ne olacaktr? Tamponu boaltmak iin bir yol
gereklidir. fclose fonksiyonu, dier ilerin yannda bunu yapmaktadr. fcloseun,
dosya gstergesi olan, bir argman vardr.
fclose(dosya_gostergesi)
altrldktan sonra, dosya kapatlr ve dosya_gostergesi artk ona iaret etmez.
fclose fopenin tersidir. fopen ile atnz her dosyay fclose ile kapatmanz
gerekir. Sistemden sisteme fark etmekle beraber, herhangi bir zamanda ak olan dosya
saysnda bir snrlama olduu iin, bu ayrca gerekli de olabilir. Program normal olarak
sona erdiinde, btn ak dosyalar fclose ile kapatlr.
Okuma iin alm ve dosya_gostergesi tarafndan iaret edilen bir dosyadan
bir karakter okumak iin getc kullanlr:
kar = getc(dosya_gostergesi)
Eer okuyaca karakter kalmazsa getc ne yapar? Dosya sonuna ulatn
gstermek iin zel bir deer dndrmesi gerektii aktr. Bu deer bir karakter
olmamaldr, nk aksi takdirde, getcnin dosyadan bir karakter mi okuduunu, yoksa
dosya sonunu mu iaret etmek istediini anlyamayacaz. Byle bir durumda, getc,
EOF deimezini dndrr. Ktphane, genelde EOFu (-1) olarak tanmlar. Bu deeri
de tutmak iin, yukarda kullanlan kar karakterinin bir char deil de, bir int olarak
tanmlanmas gerektiine dikkat edin. Bylece, her seferinde dosyadan bir karakter
okuyup, o karakter iin bir ey yapan ve dosyada karakter kalmad zaman sona eren bir
program paras u ekilde olacaktr:
if ((kar=getc(dosya_gostergesi))!=EOF) {
kara gre ilem yap
} else
program bitir
7.2. Dosya EriimiBaka Yntemler
fopen, fclose, putc ve getc ile ok yararl eyler yaplabilir, fakat C, kolaylk iin,
baka, daha gelimi dosya eriim yntemleri de salar. Zaten bildiiniz, getchar ve
putchar byle iki rnektir. Sistemimizde, stdio.h dosyasnda u ekilde
tanmlanmlardr:
#define getchar() getc(stdin)
#define putchar(c) putc((c),stdout)
Doal olarak, programclar, bir seferde birden fazla karakter yazabilen fonksiyonlara
gereksinim duyarlar. te bunu yapan fputs fonksiyonu:
fputs(kar_dizisi, dosya_gostergesi)
122 DOSYALAR VE GRD/IKTI BLM 7
Bu, kar_dizisi adl karakter dizisinin dosya_gostergesi tarafndan iaret edilen
dosyaya yazlmasn salar. Dizinin sonundaki bo karakter yazlmaz. Bu fonksiyonun da
puts adnda standart dosya uyarlamas bulunmaktadr.
puts(kar_dizisi)
kar_dizisini stdouta yazar ve fputstan farkl olarak yeni satr karakteri yazp
yeni bir satra geer.
Ktphanede, ayrca, bir seferde bir satr okuyan fgets adnda bir fonksiyon
bulunmaktadr.
fgets(kar_dizisi, maks_uzunluk, dosya_gostergesi)
dosya_gostergesi tarafndan iaret edilen dosyann bir sonraki satrndan en fazla
maks_uzunluk-1 sayda karakteri kar_dizisi iine okuyup, eer dosya sonu
deilse, kar_dizisini (bir gsterge), aksi takdirde NULL dndrr. (Bir satr sadece
sonunda yeni satr karakterinin bulunduu bir karakter srasdr.) kar_dizisi iine
aktarlan satrn sonuna bo karakter eklenir.
Standart girdi fonksiyonu gets biraz fgetse benzer.
gets(kar_dizisi)
stdinden bir satr okuyup kar_dizisi ile balayan yere koyar. fgetsten farkl
olarak, gets kar_dizisine yeni satr karakterini koymaz.
Kolaylk isteyen programclar, karakter dizisi-say dnmlerinin fonksiyon
tarafndan yerine getirildii, herhangi bir tipten saylarn dosyaya yazlmasn veya oradan
okunmasn isterler. Bu gereksinimler, fprintf ve fscanf fonksiyonlar tarafndan
yerine getirilirler.
fprintf(dosya_gostergesi, kontrol_karakter_dizisi, argman_listesi)
ars kontrol_karakter_dizisi iindeki sradan karakterlerle, argman_listesinden ald
argmanlar uygun bir ekilde biimlendirerek dosya_gostergesi tarafndan iaret
edilen dosyaya yazar. Kontrol_karakter_dizisi ve argman_listesi iin kurallar
printfteki gibidir.
fscanf(dosya_gostergesi, kontrol_karakter_dizisi, argman_listesi)
ars dosya_gostergesi tarafndan iaret edilen dosyadan bir karakter dizisi okur,
kontrol_karakter_dizisine gre dnmleri yapp, deerleri, argman_listesindeki
argmanlar tarafndan gsterilen yerlere koyar. Kurallar scanfteki gibidir. Argmanlar
iin doru biimleri ve doru sayda argman saysn vermek kullancnn
sorumluluundadr.
printf ve scanf fonksiyonlar fprintf ve fscanfin zel uyarlamalardr. lk
argman olarak dosya gstergesi yoktur; bunlar, srasyla, stdout ve stdini
kullanrlar.
BLM 7 DOSYALAR VE GRD/IKTI 123
Bu fonksiyon ailesinin baka iki yesi de sprintf ve sscanftir. Bunlar dosyaya
erimezler; onun yerine, ilk argman olarak belirtilen bir karakter dizisi stnde alrlar.
sprintf(kar_dizisi, kontrol_karakter_dizisi, argman_listesi)
ars, tpk fprintf gibi, kontrol_karakter_dizisi ve argman_listesi ile normal biim
dnmlerini yapar; sonucu fprintften farkl olarak kar_dizisine koyar. Buna
benzer olarak,
sscanf(kar_dizisi, kontrol_karakter_dizisi, argman_listesi)
ars, scanfin stdini tarad ekilde kar_dizisinin taranp deerlerin,
normalde olduu gibi, argman_listesinin elemanlar tarafndan gsterilen yerlere
konmasn salar. rnein
sprintf(kar_dizisi, "abc%dcba", 100);
deyimi kar_dizisinin iine "abc100cba" koyar; eer ondan sonra
sscanf(kar_dizisi, "abc%d", &int_deg);
deyimi iletilirse, beklendii gibi int_degin iine 100 konur.
7.3. Rastgele Eriim
Normalde, bir dosya aldktan sonra, ilk okuma veya yazma ilemi dosyann hemen
bandan yaplr. Bir sonraki ilem ise, en son ilem tarafndan etkilenen son bayt izleyen
bayttan balayarak yaplr. Bundan dolay, buna sral eriim denir. Bunu yapmadan, yani
nceki baytlar okuyup veya yazmadan, istediimiz bir bayta ulamak (yani rastgele
eriim yapmak) iin fseek kullanrz:
fseek(dosya_gostergesi, uzun_sayi, nereden)
Yukardaki arda ilk iki argmann tipleri isimlerinden anlalabilir. nereden ise
ya SEEK_SET (dosyann bandan), ya SEEK_CUR (u anki konumundan) yada
SEEK_END (dosyann sonundan) olabilir. fseek iletildikten sonra
dosya_gostergesi tarafndan iaret edilen dosya zerindeki okuma veya yazma
nereden ile belirtilmi yerden uzun_sayi mesafedeki bayttan balyacaktr. Eer
herhangi bir hata olursa, fseek sfrdan farkl bir say dndrr, aksi takdirde 0 verir.
Bir metin dosyasnda bir karakterin konumunun hesaplanmasnn anlaml yada en azndan
tanabilir bir zellik olmadna dikkat edin; fseek tamamen ikili (ham) girdi/kt
iindir.
Eer, birtakm ilemlerden sonra, dosyann bandan ka bayt ileride olduunuzu
renmek isterseniz ftell kullann:
uzun_sayi = ftell(dosya_gostergesi)
uzun_sayiya miktar koyacaktr; eer bir hata olursa -1L verecektir.
124 DOSYALAR VE GRD/IKTI BLM 7
Sk sk dosyay geri sarmak, yani bana fseek yapmak isteyebilirsiniz.
rewind(dosya_gostergesi)
bunu yapmann ksa bir yoludur.
7.4. Dosyalarla lgili Baka Bilgiler
Okuma fonksiyonlar veya makrolarnn okuduu ey ungetc tarafndan etkilenebilir.
ungetc(kar, dosya_gostergesi)
ars, dosya_gostergesi ile iaret edilen dosyadan yaplacak bir sonraki okuma
ilemi (getc, fgets, fscanf vs) tarafndan dosyada var olan karakterlerden nce
karda verilen karakterin okunmasn salar. ungetc ile okuma ilemi arasnda fseek
yaplrsa, ungetc ile saklanan karakter unutulacaktr. ungetc isminin aslnda biraz
yanltc olmasna ramen, ungetc genelde okunmamas gerekirken okunmu bir
karakterin sanki okunmam gibi geri alnmasn salar. Her dosya iin, en fazla bir
karakter bu ekilde geri konabilir. ungetc ilemi baarsz olursa EOF dndrlr.
Dosyalar oluturduunuz gibi onlar silebilirsiniz de. Dosyann ismi dosya_adi
ise, o zaman
remove(dosya_adi)
yazn. Dosya bu altdizinden silinmi olacaktr. Eer dosyann ait olduu tek altdizin bu ise
dosya sistemden tamamen silinecektir. (Bir altdizin baka altdizin veya dosya isimleri
ierebilen bir rehber olarak dnlebilir.) Eer ilem baarl ise remove 0
dndrecektir.
Buna benzer olarak bir dosyann adn deitirmek istiyorsanz.
rename(eski_dosya_adi, yeni_dosya_adi)
kullann.
Bilgi bekleri okumak veya yazmak iin iki yararl fonksiyon vardr:
fread(gosterge, boy, sayi, dosya_gostergesi)
ve
fwrite(gosterge, boy, sayi, dosya_gostergesi)
fread, dosya_gostergesi tarafndan iaret edilen dosyadan gosterge ile iaret
edilen diziye boy uzunluunda sayi kadar nesne aktaracaktr. fwrite ise bu ilemi
ters ynde yapacaktr. Bu fonksiyonlar aktarlan nesne saysn dndrrler; eer bir hata
olmusa, bu say sayidan az olacaktr.
ok girdi/kt, rnein bir aktarma ilemi yapan bir program dosyalar iin byk
tampon blgeleri kullanrsa kazanl kacaktr. Tamponlu girdi/kt yapmak iin standart
ktphane iki fonksiyon salamaktadr. Bunlar fopendan hemen sonra arlmaldr.
BLM 7 DOSYALAR VE GRD/IKTI 125
setbuf(dosya_gostergesi, tampon)
fonksiyonu, normalde
char tampon [BUFSIZ];
olarak tanmlanmas gereken tampon dizisini dosya iin tampon blge haline getirir.
BUFSIZ stdio.h dosyasnda tanmlanm olan uygun bir deimezdir. Eer tampon
yerine NULL verirsek, tamponlama ortadan kalkar.
Tampon boyunun kullanc tarafndan belirlendii daha iyi bir fonksiyon ise yledir:
setvbuf(dosya_gostergesi, tampon, mod, tampon_boyu)
Burada, mod ya _IOFBF (tam tamponlama), ya _IOLBF (metin dosyalar iin satr
tamponlama) yada _IONBF (tamponlamann kaldrlmas) olabilir. Eer tampon NULL
ise tampon_boyu boyundan bir tampon blgesi setvbuf tarafndan ayrlacaktr.
lem baarl ise, bu fonksiyon 0 dndrr.
Son olarak,
fflush(dosya_gostergesi)
fonksiyonu, tamponda bilgi varsa, bunun dosyaya aktarlmasn salar. Sadece bir kt
dosyas iin kullanlabilir ve bir hata durumunda EOF, aksi durumda 0 dndrr.
7.5. Sistem le lgili Fonksiyonlar
lgin bir fonksiyon olan system, bir C program iinden, iletim sisteminizin kabul
edebilecei herhangi bir komutu altrmanz salar.
system(kar_dizisi)
ars yapldnda, kar_dizisi iindeki iletim sistemi komutu altrlr; bu komut
tamamlandktan sonra ise program normal bir ekilde devam eder. rnein,
system("DIR C:\\MSVC\\INCLUDE\\*.H")
ifadesi c:\msvc\include altdizini iinde dosya tipi h olan btn dosyalarn ekranda
grntlenmesini salar.
imdiye kadar grm olduumuz programlar (herhangi bir sorun kmazsa), kontrol
main blounun sonuna ulatnda biterler. exit fonksiyonu ise, konulduu yerde
programn sona ermesini salar.
exit(durum)
ars, ak olan tm dosyalar iin fcloseun, daha sonra da _exit ktphane
fonksiyonunun arlmasn salar. _exit baka bir ey yapmadan program bitirir.
(Programlarnzda ktphanede tanmlanm bulunan ve _ ile balayan bir ey
kullanmanz tavsiye edilmez; normal programclar iin bunlar biraz dk dzeyde
kalrlar ve Standarda girmezler.) Bir tamsay olan durumun deeri, bu programn
126 DOSYALAR VE GRD/IKTI BLM 7
almasn salayan srece geirilir ve bu sre tarafndan baz kararlar vermek iin
kullanlabilir. Geleneksel olarak, sfrdan farkl durum deerleri eitli hatal durumlar
gsterirler, 0 ise baarl bir sonulanmay gsterir. stdlib.h balk dosyasnda
tanmlanm EXIT_SUCCESS (baarl sonulanma) ve EXIT_FAILURE (hatal
sonulanma) deerleri bu kodlar standartlatrmaktadrlar.
Birbirleriyle ilikili iki fonksiyon da unlardr:
rand()
ve
srand(tohum)
lki 0 ile RAND_MAX (32767) arasnda bir szde rastgele tamsay verir. kincisi ise,
rand tarafndan retilecek yeni bir szde rastgele say sras iin tohumu (iaretsiz bir
tamsay) belirtmek iin kullanlr. Eer srand arlmazsa, program balarken
tohumun deeri 1dir.
7.6. Dosya Tanmlayclar Ve lgili Fonksiyonlar
Dosya gstergelerine bir alternatif de dosya tanmlayclardr. Her dosya tanmlaycs
(sistemimizde tutamak da denir), programn yrtlmesi esnasnda dosyay gsteren,
sfrdan kk olmayan bir tamsaydr. Ksm 7.1den 7.4e kadar anlatlan dosya eriim
fonksiyonlarnn dosya tanmlayclar iin ayr uyarlamalar bulunmaktadr.
Dikkat: nceki ksmdakilerden farkl olarak, bu ksmda anlatlan fonksiyonlar
standartlam deillerdir; sadece bizim sistem tarafndan bunlarn desteklendiini
syleyebiliriz. Bundan baka, dosya tanmlaycs fonksiyonlar ile dosya gsterge
fonksiyonlar birbirinden tamamen farkl ve uyumsuzdurlar; bir program iinde ikisi
birlikte kullanlmamaldr. Aslnda, bu ksmda anlatlan fonksiyonlar hi kullanmamak
en iyi yoldur! Bu ksmda anlatlanlarla ilgili bilgiler, Standarda dahil olmayan,
fcntl.h, sys\types.h, sys\stat.h ve io.h adl balk dosyalarnda bulunur.
Aada anlatlan isimlerin nnde, standart olmadklarn gstermek iin, altizgi (_)
karakteri bulunmaktadr; birok sistemde bu karakter bulunmayabilir.
Standart girdi, kt ve hata dosyalarnn srasyla 0, 1 ve 2 eklinde dosya
tanmlayclar vardr.
Bir dosya oluturmann yolu
dosya_tanimlayicisi = _creat(kar_dizisi, izin)
yazmaktr. _creat ile ilgili yeni bir ey de her dosya iin bir izin belirtebilmeyi
salamasdr. kar_dizisi adnda bir dosya nceden bulunmuyorsa, _creat byle bir
dosya yaratr ve yazma iin aar. Daha sonra, dosya ilk defa kapatldnda, _creatin
ikinci argman olarak belirtilen izin dosyaya atanr. izin, _S_IWRITE ve _S_IREAD
ktphane deimezlerinin bir tanesine eit olmas gereken bir tamsay ifadesidir.
BLM 7 DOSYALAR VE GRD/IKTI 127
_S_IREAD sadece okumaya izin verilmitir, _S_IWRITE yazlmaya izin verilmitir
anlamna gelir. Hem yazma hem de okumaya izin vermek iin _S_IREAD|_S_IWRITE
kullann.
Eer kar_dizisi adnda bir dosya daha nceden bulunuyorsa, _creat
iindekileri silip, yazma iin amaya alr. Dosyann eski izin durumu etkisini
srdrr.
Normalde, _creat dosya iin bir tanmlayc dndrr. Eer baarszsa, rnein
dosya daha nceden var olan salt okunabilen bir dosya ise veya ok fazla ak dosya
varsa, -1 dndrr.
kar_dizisi adnda bir dosyay amak iin aadaki yazlr:
dosya_tanimlayicisi = _open(kar_dizisi, bayrak, izin)
Eer her ey iyi giderse dosya_tanimlayicisinn iine bir tutamak deeri konur;
aksi takdirde -1 dndrlr. bayrak dosya ile ilgili yaplacak ilemi gsterir; rnein
dosyay okumak iin _O_RDONLY kullann. izin yukardaki gibi _S_IWRITE ve
_S_IREAD ktphane deimezlerinden biri olmaldr ve sadece bayrak iin
_O_CREAT (dosyay yarat) kullanldnda anlam tar.
_close fonksiyonu daha nce ak bulunan bir dosyay kapatmak iin kullanlr ve
_close(dosya_tanimlayicisi)
eklindedir. Dosyay kapatabilirse 0, aksi takdirde -1 dndrr.
Dosya tanmlayclar kullanarak girdi-kt yapmak istiyorsanz, okunacak veya
yazlacak baytlar iin nceden yeterli byklkte bir (tampon) blge tanmlamanz
gerekir. Aada, tamponun yeterince byk bir char dizisi olduunu varsayn.
dosya_tanimlayicisi tarafndan belirtilmi bulunan dosyaya sayi kadar bayt
yazmak isterseniz
s = _write(dosya_tanimlayicisi, tampon, sayi)
kullann. Yazmay dndnz baytlar, tampon ile balayan blgeye daha nceden
yerletirmi olmanz gerekir. sye ya -1 (hatay gstermek iin) veya gerekte yazlm
bulunan bayt says konur. _write ileminden sonra eer s!=sayi ise bir hata olmu
demektir; fonksiyonu kullandktan sonra bu testi yapmay unutmayn.
s = _read(dosya_tanimlayicisi, tampon, sayi)
ifadesi dosya_tanimlayicisi ile belirtilen dosyann okunup tampon ile balayan
blgeye baytlarn konulmasn salar. Dosya sonuna ulaldnda okuma biter. Her
durumda en fazla sayi kadar bayt okunur. s okunmu bulunan bayt saysn veya okuma
yaplamazsa -1 ierecektir.
fseekin dosya tanmlaycs karl _lseektir.
uzun_yeni_yer = _lseek(dosya_tanimlayicisi, uzun_sayi,
nereden)
128 DOSYALAR VE GRD/IKTI BLM 7
arsnda son iki argman fseekte olduu gibi ayn anlam tarlar ve ayn i yaplm
olur. _lseek, dosyann bandan imdiki konuma kadar olan uzakl bayt cinsinden
dndrr.
7.7. Bir rnekrenci Veritaban
renci kaytlarn tutup bunlar zerinde ekleme, silme ve grntleme ilemlerini yapan
bir program yazalm. Program kullancya bir men sunacak ve kullancnn seimine gre
ilgili seenei altracaktr. Cnin bu tr uygulama iin en uygun dil olduunu veya
bunun en iyi ve ksa program olduunu savunmuyoruz; amacmz sadece, bu blmde
anlatlm olan C ile ilgili baz konular gstermektir. Programn listesinden sonra, kodun
detayl bir aklamas verilmektedir. Devam etmeden nce, program bilgisayara girip
altrmanz nerilir.
1. #include <conio.h>
2. #include <stdio.h>
3. #include <stdlib.h>
4. #include <string.h>
5.
6. /* Degismezler */
7. char const DOSYA_ADI[] = "OGRENCI.DAT";
8. char const BOS[] = "\r\r\r\r\r\r\r";
9. #define ANHTR_UZ 7
10. char const AKD[] = "%7s";
11. #define ISIM_UZ 15
12. #define KAYIT_BOYU ((long)(ANHTR_UZ+ISIM_UZ+4))
13. char const KKD[] = "%7s%15s%4d";
14.
15. struct kayit {
16. char anhtr[ANHTR_UZ+1], isim[ISIM_UZ+1];
17. int yil;
18. };
19.
20. /* Her fonksiyonda bastan tanimlamak yerine bu
21. * degiskenler burada tanimlanmislardir.
22. */
23. char satir[128];
24. FILE *dg;
25.
26. void dizioku /* d icine en fazla u karakter oku */
27. (char d[], int u)
28. {
29. gets(satir);
30. strncpy(d, satir, u);
31. d[u] = '\0';
32. } /* dizioku */
33.
34. long bul /* Dosya icindeki ANHTR'in yerini; */
35. (char const anhtr[]) /* aksi takdirde -1L dondur. */
36. {
37. int drm, kar = 1;
38. long dns;
39. char d1[ANHTR_UZ+1], d2[ANHTR_UZ+1];
40.
BLM 7 DOSYALAR VE GRD/IKTI 129
41. sprintf(d2, AKD, anhtr); /* soldan bosluk doldur */
42. dg = fopen(DOSYA_ADI, "rb");
43. if (dg == NULL)
44. return -1L;
45. drm = fseek(dg, -KAYIT_BOYU, SEEK_END);
46. while (drm == 0 && fgets(d1, ANHTR_UZ+1, dg) != NULL &&
47. (kar=strcmp(d2,d1)) != 0)
48. drm = fseek(dg, -KAYIT_BOYU-ANHTR_UZ, SEEK_CUR);
49. if (kar == 0)
50. dns = ftell(dg)-ANHTR_UZ;
51. else
52. dns = -1L;
53. fclose(dg);
54. return dns;
55. } /* bul */
56.
57. void ekleme (void)
58. {
59. long konum;
60. struct kayit k;
61. int scd;
62.
63. puts("Eklenecek ogrenci numarasini girin:");
64. dizioku(k.anhtr, ANHTR_UZ);
65. if (bul(k.anhtr) == -1L) {
66. puts("Ogrenci adini girin:");
67. dizioku(k.isim, ISIM_UZ);
68. do {
69. puts("Kayit yilini girin:");
70. scd = scanf("%d", &k.yil);
71. gets(satir);
72. } while (1!=scd || k.yil<1980 || k.yil>9999);
73. konum = bul(BOS);
74. dg = fopen(DOSYA_ADI, "ab"); /* dosyayi olustur */
75. fclose(dg);
76. dg = fopen(DOSYA_ADI, "r+b");
77. if (konum == -1L)
78. fseek(dg, 0L, SEEK_END); /* dosya sonuna git */
79. else
80. fseek(dg, konum, SEEK_SET); /* bos kayida git */
81. fprintf(dg, KKD, k.anhtr, k.isim, k.yil);
82. fclose(dg);
83. puts("Ekleme islemi tamamlandi.");
84. }
85. else
86. fprintf(stderr, "Cift anahtar!\n\a");
87. } /* ekleme */
88.
89. void silme (void)
90. {
91. long konum;
92. char anhtr[ANHTR_UZ+1];
93.
130 DOSYALAR VE GRD/IKTI BLM 7
94. puts("Silinecek ogrenci numarasini girin:");
95. dizioku(anhtr, ANHTR_UZ);
96. if ((konum = bul(anhtr)) != -1L) {
97. dg = fopen(DOSYA_ADI, "r+b");
98. fseek(dg, konum, SEEK_SET);
99. fprintf(dg, AKD, BOS);
100. fclose(dg);
101. puts("Silme islemi tamamlandi.");
102. }
103. else
104. fprintf(stderr, "Boyle anahtar yok!\n\a");
105. } /* silme */
106.
107. void goruntuleme (void)
108. {
109. long konum;
110. struct kayit k;
111.
112. puts("Goruntulenecek ogrenci numarasini girin:");
113. dizioku(k.anhtr, ANHTR_UZ);
114. if ((konum = bul(k.anhtr)) != -1L) {
115. dg = fopen(DOSYA_ADI, "rb");
116. fseek(dg, konum+ANHTR_UZ, SEEK_SET);
117. printf("Ogrenci adi: %s\n", fgets(k.isim,ISIM_UZ+1,dg));
118. fscanf(dg, "%d", &k.yil);
119. fclose(dg);
120. printf("Kayit yili : %d\n", k.yil);
121. }
122. else
123. fprintf(stderr, "Boyle anahtar yok!\n\a");
124. } /* goruntuleme */
125.
126. int menu (void)
127. {
128. int secenek;
129.
130. do {
131. puts("\n\t1.EKLEME\n\t2.SILME\n\t3.GORUNTULEME\n\t0.CIKIS");
132. printf("Seciminizi yapin:");
133. } while ((secenek=_getche()) < '0' || secenek > '3');
134. putchar('\n');
135. return secenek - '0';
136. } /* menu */
137.
138. void main (void)
139. {
140. static void (*fd[])(void) =
141. { (void (*)(void)) exit, ekleme, silme, goruntuleme };
142.
143. while (1) (*fd[menu()])();
144. } /* main */
Programda, her renci iin bir say, isim ve kayt yl saklanr. Bu bilgiyi
birletirmek iin Satr 15te kayit yaps tanmlanmtr. renci numaras anahtardr,
yani her rencinin ayr numaras vardr ve rencinin bilgisine ulamak iin bu numaray
kullanrz.
menu fonksiyonu (Satr 126-136) kullancya seimleri sunar ve neyi setiini
gsteren bir say (aslnda bir char) girmesini ister. 0dan kk veya 3ten byk
BLM 7 DOSYALAR VE GRD/IKTI 131
seimler kabul edilmez. Geerli bir seenek girildiinde, fonksiyon tarafndan secenek
deikeninin tamsay edeeri dndrlr. Bu fonksiyonda puts kullanmna dikkat
edin. Herhangi bir deikenin deerinin baslmasna gerek olmadndan, printf
kullanmanza gerek yoktur. Programda, byle durumlar iin puts kullandk.
maindeki while deyimi biraz karmak gzkebilir. Satr 140-141de exit,
ekleme, silme ve goruntuleme fonksiyonlarna gstergeler ierecek ekilde
ilklenmi bulunan, fd dizisinin menunc elemann arr. Grdnz gibi,
fonksiyonlara gstergeler iin bir dizi gibi, karmak veri yaplarnn kullanm kk bir
yerde ok ey yapabilecek kod yazmamz salar. Dikkat: stdlib.hde tanmlanm
olan exit fonksiyonu bir int argman beklemektedir; dier fonksiyonlara uymas iin,
bir kalp aracl ile, bu fonksiyonu argmansz hale evirdik.
ekleme, silme ve goruntuleme fonksiyonlar, argman olarak verilmi
anahtar ieren kayd taramak iin bul ad verilen bir fonksiyonu arrlar. bul
(Satr 34-55) kaydn dosyann bana gre konumunu bir long say eklinde verir;
herhangi bir hata olursa -1L dndrr. bulun bandaki sprintf, anhtrn saa
dayanm bir uyarlamasn d2ye koyar. Daha sonra, renci dosyasn okumak iin
dosyay amaya alrz. Eer alamazsa, hata dndrlr. Eer dosya alrsa,
dosyadaki son kaydn bana konumlanrz. Satr 46-48deki while u anda
konumlandrlan kaydn anahtarn d2 ile karlatrr ve eer eitseler veya dosyann
bana ulatysak, sona erer. Satr 48 dosyay bir nceki kaydn bana konumlandrr.
Dosya taramasn geriye doru yapmamzn nedeni, fseek fonksiyonunun, dosyann
sonundan ileri doru gitmeyi bir hata eklinde deerlendirmemesinden kaynaklanr.
Satr 53te dosyay kapattktan sonra, bulun sonunda, (Satr 50de ftell kullanlarak
uygun deer verilen) dns dndrlr.
byk fonksiyon tarafndan oka kullanlan baka bir fonksiyon da
diziokudur. Bu kolaylk fonksiyonu iki argman kabul eder: ine bir ey okunacak
karakter dizisi ile okunacak dizinin uzunluunu gsteren bir tamsay. Bataki gets
girdiden bir satr okur. Geri kalan deyimler, gerekli sayda karakteri dye aktarp sonuna
bir bo karakter koyarlar.
ekleme fonksiyonu dosyaya yeni bir renci kayd yerletirmeye alr. Yeni
rencinin numarasn okur ve bu anahtarla bulu arr. Eer bul -1Lden farkl bir
ey dndrrse, dosya iinde bu numaradan bir renci kayd vardr demektir, onun iin
ekleme uygun bir uyar mesaj ile sona erer. Eer bu numara dosyada yeni ise,
rencinin ismi ve kayt yl sorulur. Yl iin drt rakaml bir say girinceye kadar devam
etmeyi engelleyen do deyimine dikkat ediniz. scanfin gerekletirilen baarl
dnm saysn dndrdn anmsayn.
renci hakknda btn bilgileri elde ettiimize gre, onu dosyaya yazmamz
gerekir. Satr 73te BOS anahtar ieren bir kayt ararz. BOS, bir renci numaras olarak,
kullanc ne kadar alrsa alsn, giremeyecei zel bir karakter dizisidir. (Satr 8deki
BOSun tanmna bakp bunun neden byle olduunu syleyiniz.) BOS anahtar daha nce
eklenmi, fakat sonra silinmi kaytlar gsterir. Satr 74-75, dosya yoksa, yeni bir dosya
aar; aksi takdirde bir deiiklik yapmaz. Satr 76, okuma-yazma eriimi iin dosyay
132 DOSYALAR VE GRD/IKTI BLM 7
aar. Eer BOS bir kayt yoksa, yeni kayt dosyann sonuna eklenir (Satr 78). Aksi
takdirde, adresi konum iinde bulunan BOS kayda yazlr (Satr 80). Asl yazma ilemi
Satr 81de fprintf ile yaplr. Dosyay kapattktan sonra ekleme sona erer.
silme silinecek renci numarasn okuyarak balar. Byle bir rencinin dosya
iinde olup olmadn aratrmak iin bul arlr. Eer kayt varsa, anahtarna BOS
yazlr ve silme biter. Eer yoksa, dnmeden nce, uygun bir hata mesaj baslr. Hata
mesajlarnn stderre gnderildiinde dikkat edin.
goruntuleme, renci numarasn okur ve silmeye benzer bir ekilde kaydn
bulunup bulunmadn kontrol eder. Kayt bulunursa, anahtar dndaki bilgiler
grntlenir.
Problemler
1. stdio.h dosyasnda getc() ve putc()nin tanmlarna bakp ne olduunu
aklamaya aln.
2. Ksm 7.7deki rnek programa degistirme adnda yeni bir seenek ekleyin.
Seildiinde, renci numaras okunur ve rencinin u anki bilgileri grntlenir.
Kullanc, isterse, anahtar dndaki bilgileri deitirebilir ve yeni bilgiler eski
bilgilerin yerini dosyada alr. Varlk testleri ve uygun hata mesajlar bulunmaldr.
3. Szdizimsel adan doru olan bir C programndan btn aklama ve grnmeyen
gereksiz karakterleri karan bir program yazn.
4. Komut satrnda argman olarak verilen dosyalar birletirip stdouta yazan (ve
UNIX komutu cate benzeyen) bir program yazn.
5. Byk bir dosyay birka kk dosyaya ayran bir program yazn. lk argman
dosya adn; ikincisi (eer verilmezse 1000 varsaylacak) para bana satr saysn
gsterir. Paralarn dosya isimleri parca.1, parca.2 vs olacaktr.
6. Argman olarak verilen iki dosyay karlatrp farkl olan baytlar sekizli
gsterimde grntleyecek (ve UNIX komutu cmpe benzeyen) bir program yazn.
7. Bir satr editr yazn. alma dosyasnn ad komut satr argman olarak
verilecektir. Program aadaki komutlarn herhangi birini girdi olarak kabul
edebilecektir:
E numara
Bu komuttan sonra, standart girdiden bir satr okunup numaranc satrdan nce
yerletirilir.
S numara
Numaranc satr silinir.
G numara
BLM 7 DOSYALAR VE GRD/IKTI 133
Numaranc satr grntlenir.
C
Program sona erer.
8. Bir metin dosyasndaki satrlar tersten basacak bir program yazn; yani son satr ilk
olarak baslacak vs. Dosya boyuna herhangi bir snrlama getirmeyin.
9. Ekran temizleyen bir fonksiyon yazn.
10. Szdizimsel adan doru ve tam olan bir C programn ieren bir dosyay alp, ayn
program daha iyi bir biimde baka bir dosyaya yazan bir program hazrlayn. Daha
iyi bir biim derken, unu anlatmak istiyoruz: Btn fonksiyon balklar ayn
stunda balar ve baka deyimlerin paralar olan bloklarn sol ve sa engelli
parantezlerin yeri Blm 2de nerilen ekildedir.
11. Metin okuyup aadaki ekilde biimlendirilmi olarak bir dosyaya koyan bir
program yazn: Solda 7 karakterlik boluk bulunur, dokman her biri 55 satr olan
sayfalardan oluur, her satr en fazla 65 karakterdir, her sayfann son satrnda sayfa
numaras bulunur ve noktadan sonra gelen ilk harf bye dntrlr. Program, tek
bir yeni satr ('\n') karakterini bolua evirecek; arka arkaya iki tane yeni satr
karakteri varsa, bunlar paragraf sonu olarak deerlendirilecek ve aynen braklacaktr.
Gereksinimlerinize gre program gelitirin. (Baz biimleme komutlar ekleyin:
rnein, zel bir karakterle balayan satrlar emir olarak deerlendirilebilir.)
135
EK A: KARAKTER KODLARI
ZELGES
Bizim kullandmz sistemde olduu gibi, birok sistemde karakterleri gstermek iin
ASCII (American Standard Code for Information InterchangeBilgi Deiimi iin
Standart Amerikan Kodu) karakter kodlar kullanlr. ASCII karakter kmesi 128 tane (7
bitlik) koddan oluur ve 33 kontrol karakteri, bir boluk ve 94 grntlenebilen (grafik)
karakteri tanmlar. Bir kontrol karakteri kt aygtnda deiik etkilere neden olabildii
gibi, bazen grafik bir ekil de oluturabilir.
Bir karakterlik bilginin saklanmas iin 8 bitlik baytlarn kullanld makineler
genelde 128 tane daha karakter ieren geniletilmi bir karakter kmesi salarlar. Bu
karakterlerin kodlar 128den 255e kadardr ve aygttan aygta veya sistemden sisteme
deiebilir.
Bundan sonraki drt sayfa, standart ASCII karakter kmesinin bir listesini
vermektedir. Bu listede kontrol karakterleri ^tu eklinde gsterilirler; bu da CONTROL
tuu basl iken tua basarak bu karakterin elde edilebilecei anlamna gelmektedir. IBM
uyumlu kiisel bilgisayarlarda (PClerde) ALT tuu basl iken klavyenin sandaki saysal
tular kullanlarak girilecek olan ASCII ondalk kod araclyla ilgili karakter
oluturulabilir. rnein, A harfini elde etmek iin ALT tuu basl iken, srayla nce 6ya
sonra da 5e basn.
Daha sonraki drt sayfada ise 128den 255e kadar kodlara sahip olan karakterler iin
PClerde kullanlan iki ayr karakter standard gsterilmitir:
ASCII (geniletilmi): Bu, daha ok MS-DOS ortamnda kullanlmaktadr. MS-DOS
ortamnda, bu karakterlerin klavyeden girilmesi iin ALT tuu basl iken klavyenin
sandaki saysal tular kullanlarak, ilgili karakterin ondalk kodu girilmelidir.
rnein, iin ALT+128. Windows ortamnda da kullanlan yntem ayndr, ancak
bu ilemi yaparken NUM LOCK nn yakl olmas gerekmektedir.
136 KARAKTER KODLARI ZELGES EK A
ANSI: Windows ortamnda kullanlmaktadr. Bu karakterlerin klavyeden girilmesi
iin yukardaki yntem kullanlr; sadece girilen kodun ANSI olduunu belirtmek iin
kodun nne 0 eklenir. rnein, iin ALT+0199.
Trke karakterler iin en az ayr standart bulunmaktadr. Herbirinde, belirli
karakter kodlar iin, uluslararas tanmlanm karakterin yerini Trke karakter
almaktadr. Bunlar, listede, yerini aldklar karakterlerin yannda, parantez iinde
verilmitir.
7 bitlik ASCII standard: Bu sadece 128 deiik karakter kodunu destekleyen
aygtlarda kullanlmaktadr. Gnmzde 256 deiik karakter kullanan PClerin
yaygnlamasyla, bu standart daha az kullanlmaya balanmtr.
8 bitlik geniletilmi ASCII standard: Genelde MS-DOS ortamnda kullanlmaktadr.
8 bitlik ANSI standard: Windows gibi grafik ortamlarda kullanlmaktadr.
EK A KARAKTER KODLARI ZELGES 137
Ond. Sekizli Onaltl Karakter Anlam
0 0000 0x00 ^@ NUL Bozaman doldurmak iin kull. tamam sfr karakter
1 0001 0x01 ^A SOH Balk ba
2 0002 0x02 ^B STX Metin ba
3 0003 0x03 ^C ETX Metin sonu
4 0004 0x04 ^D EOT letim sonu
5 0005 0x05 ^E ENQ SorguKimsiniz?
6 0006 0x06 ^F ACK Olumlu yantEvet
7 0007 0x07 ^G BEL Zilnsan dikkati gerekiyor
8 0010 0x08 ^H BS Geriye alma (biim etkileyicisi)
9 0011 0x09 ^I HT Yatay durak (biim etkileyicisi)
10 0012 0x0A ^J LF Satr ilerletme (biim etkileyicisi)
11 0013 0x0B ^K VT Dikey durak (biim etkileyicisi)
12 0014 0x0C ^L FF Sayfa ilerletme (biim etkileyicisi)
13 0015 0x0D ^M CR Satrba (biim etkileyicisi)
14 0016 0x0E ^N SO Dar kaymastandart olmayan kod geliyor
15 0017 0x0F ^O SI eri kaymastandart koda geri dn
16 0020 0x10 ^P DLE Veri bal. kasnrl veri iletiimi kontr. deiiklii
17 0021 0x11 ^Q DC1 Yardmc aygtlar ap kapamak iin aygt kontrol
18 0022 0x12 ^R DC2 Yardmc aygtlar ap kapamak iin aygt kontrol
19 0023 0x13 ^S DC3 Yardmc aygtlar ap kapamak iin aygt kontrol
20 0024 0x14 ^T DC4 Yardmc aygtlar ap kapamak iin aygt kontrol
21 0025 0x15 ^U NAK Olumsuz yantHayr
22 0026 0x16 ^V SYN Ezamanl boa ilemeezamanlama salamak iin
23 0027 0x17 ^W ETB letim bei sonufiziksel iletiim bekleri ile ilintili
24 0030 0x18 ^X CAN nceki bilginin iptali
25 0031 0x19 ^Y EM Ortam sonukullanlan/istenen bilgi blmnn sonu
26 0032 0x1A ^Z SUB Hatal karakterin yerine gelen karakter
27 0033 0x1B ^[ ESC Kakod genilemesi iin
28 0034 0x1C ^\ FS Dosya ayrcs
29 0035 0x1D ^] GS Grup ayrcs
30 0036 0x1E ^^ RS Kayt ayrcs
31 0037 0x1F ^_ US Birim ayrcs
138 KARAKTER KODLARI ZELGES EK A
Ond. Sekizli Onaltl Karakter Anlam
32 0040 0x20 BOSLUK Baslmayan karakterszck ayrcs
33 0041 0x21 ! nlem iareti
34 0042 0x22 " (ift) trnak iareti
35 0043 0x23 #() Say iareti
36 0044 0x24 $ Dolar
37 0045 0x25 % Yzde
38 0046 0x26 & Ve iareti
39 0047 0x27 ' Kesme iareti (tek trnak)
40 0050 0x28 ( Sol parantez
41 0051 0x29 ) Sa parantez
42 0052 0x2A * Yldz
43 0053 0x2B + Art
44 0054 0x2C , Virgl
45 0055 0x2D - izgi iareti
46 0056 0x2E . Nokta
47 0057 0x2F / Bl
48 0060 0x30 0
49 0061 0x31 1
50 0062 0x32 2
51 0063 0x33 3
52 0064 0x34 4
53 0065 0x35 5
54 0066 0x36 6
55 0067 0x37 7
56 0070 0x38 8
57 0071 0x39 9
58 0072 0x3A : ki nokta
59 0073 0x3B ; Noktal virgl
60 0074 0x3C < Kktr
61 0075 0x3D = Eittir
62 0076 0x3E > Byktr
63 0077 0x3F ? Soru iareti
EK A KARAKTER KODLARI ZELGES 139
Ond. Sekizli Onaltl Karakter Anlam
64 0100 0x40 @() -de iareti
65 0101 0x41 A
66 0102 0x42 B
67 0103 0x43 C
68 0104 0x44 D
69 0105 0x45 E
70 0106 0x46 F
71 0107 0x47 G
72 0110 0x48 H
73 0111 0x49 I
74 0112 0x4A J
75 0113 0x4B K
76 0114 0x4C L
77 0115 0x4D M
78 0116 0x4E N
79 0117 0x4F O
80 0120 0x50 P
81 0121 0x51 Q
82 0122 0x52 R
83 0123 0x53 S
84 0124 0x54 T
85 0125 0x55 U
86 0126 0x56 V
87 0127 0x57 W
88 0130 0x58 X
89 0131 0x59 Y
90 0132 0x5A Z
91 0133 0x5B [() Sol keli parantez
92 0134 0x5C \() Ters bl
93 0135 0x5D ]() Sa keli parantez
94 0136 0x5E ^() Uzatma iareti
95 0137 0x5F _ Alt izgi
140 KARAKTER KODLARI ZELGES EK A
Ond. Sekizli Onaltl Karakter Anlam
96 0140 0x60 `() Ar vurgu
97 0141 0x61 a
98 0142 0x62 b
99 0143 0x63 c
100 0144 0x64 d
101 0145 0x65 e
102 0146 0x66 f
103 0147 0x67 g
104 0150 0x68 h
105 0151 0x69 i
106 0152 0x6A j
107 0153 0x6B k
108 0154 0x6C l
109 0155 0x6D m
110 0156 0x6E n
111 0157 0x6F o
112 0160 0x70 p
113 0161 0x71 q()
114 0162 0x72 r
115 0163 0x73 s
116 0164 0x74 t
117 0165 0x75 u
118 0166 0x76 v
119 0167 0x77 w
120 0170 0x78 x
121 0171 0x79 y
122 0172 0x7A z
123 0173 0x7B {() Sol engelli parantez
124 0174 0x7C |() Dikey izgi
125 0175 0x7D }() Sa engelli parantez
126 0176 0x7E ~() nceltme iareti
127 0177 0x7F DEL Ortam doldurma
EK A KARAKTER KODLARI ZELGES 141
Ond. Sekizli Onaltl ASCII karakter ANSI karakter
128 0200 0x80
129 0201 0x81
130 0202 0x82
131 0203 0x83
132 0204 0x84
133 0205 0x85
134 0206 0x86
135 0207 0x87
136 0210 0x88
137 0211 0x89
138 0212 0x8A
139 0213 0x8B
140 0214 0x8C
141 0215 0x8D ()
142 0216 0x8E
143 0217 0x8F
144 0220 0x90
145 0221 0x91
146 0222 0x92
147 0223 0x93
148 0224 0x94
149 0225 0x95
150 0226 0x96
151 0227 0x97
152 0230 0x98 ()
153 0231 0x99
154 0232 0x9A
155 0233 0x9B
156 0234 0x9C
157 0235 0x9D
158 0236 0x9E ()
159 0237 0x9F ()
142 KARAKTER KODLARI ZELGES EK A
Ond. Sekizli Onaltl ASCII karakter ANSI karakter
160 0240 0xA0
161 0241 0xA1
162 0242 0xA2
163 0243 0xA3
164 0244 0xA4
165 0245 0xA5
166 0246 0xA6 ()
167 0247 0xA7 ()
168 0250 0xA8
169 0251 0xA9
170 0252 0xAA
171 0253 0xAB
172 0254 0xAC
173 0255 0xAD -
174 0256 0xAE
175 0257 0xAF
176 0260 0xB0
177 0261 0xB1
178 0262 0xB2
179 0263 0xB3
180 0264 0xB4
181 0265 0xB5
182 0266 0xB6
183 0267 0xB7
184 0270 0xB8
185 0271 0xB9
186 0272 0xBA
187 0273 0xBB
188 0274 0xBC
189 0275 0xBD
190 0276 0xBE
191 0277 0xBF
EK A KARAKTER KODLARI ZELGES 143
Ond. Sekizli Onaltl ASCII karakter ANSI karakter
192 0300 0xC0
193 0301 0xC1
194 0302 0xC2
195 0303 0xC3
196 0304 0xC4
197 0305 0xC5
198 0306 0xC6
199 0307 0xC7
200 0310 0xC8
201 0311 0xC9
202 0312 0xCA
203 0313 0xCB
204 0314 0xCC
205 0315 0xCD
206 0316 0xCE
207 0317 0xCF
208 0320 0xD0 ()
209 0321 0xD1
210 0322 0xD2
211 0323 0xD3
212 0324 0xD4
213 0325 0xD5
214 0326 0xD6
215 0327 0xD7
216 0330 0xD8
217 0331 0xD9
218 0332 0xDA
219 0333 0xDB
220 0334 0xDC
221 0335 0xDD ()
222 0336 0xDE ()
223 0337 0xDF
144 KARAKTER KODLARI ZELGES EK A
Ond. Sekizli Onaltl ASCII karakter ANSI karakter
224 0340 0xE0
225 0341 0xE1
226 0342 0xE2
227 0343 0xE3
228 0344 0xE4
229 0345 0xE5
230 0346 0xE6
231 0347 0xE7
232 0350 0xE8
233 0351 0xE9
234 0352 0xEA
235 0353 0xEB
236 0354 0xEC
237 0355 0xED
238 0356 0xEE
239 0357 0xEF
240 0360 0xF0 ()
241 0361 0xF1
242 0362 0xF2
243 0363 0xF3
244 0364 0xF4
245 0365 0xF5
246 0366 0xF6
247 0367 0xF7
248 0370 0xF8
249 0371 0xF9
250 0372 0xFA
251 0373 0xFB
252 0374 0xFC

253 0375 0xFD ()


254 0376 0xFE ()
255 0377 0xFF
145
EK B: MICROSOFT C
DERLEYCS HAKKINDA TEMEL
BLGLER
Bu ekte, Microsoft C derleyicileri hakknda baz bilgiler verilecektir. Bir C programnn
Microsoft C Eniyiletirici Derleyicisi kullanlarak nasl derleneceine gemeden nce, C
bellek modellerini bilmek ve anlamak gerekir.
B.1. Bellek Modelleri
80x88 ve 80x86 ilemcilerinin yapsndan dolay, bir bellek adresi 16 bitlik kesim adresi
ile kesim iinde 16 bitlik bir uzaklktan oluur. Byle bir adres normalde kesim:uzaklk
(segment:offset) eklinde gsterilir. Verimlilik asndan, bir programn ayn kesim
iinde kalan adresler retmesi daha iyidir, nk adresleme sadece uzaklk oluturularak
salanabilir. Sadece uzaklk blmnden oluan bir adrese yakn adres ad verilir. Bazen,
program, baka kesimlerde bulunan nesneleri adreslemek durumunda kalabilir; byle
adreslere uzak adres ad verilir. Uzak bir adres 32 bittir ve kesim temel adresi ile
uzaklktan oluur. Bir kesimden, yani 64 Kbayttan daha byk olan bir veri yaps,
rnein bir dizi, uzak adres kullanlarak adreslenemez. Bu ama iin, dev adres ad
verilen baka bir adres tipi kullanlr. Dev adreslerin uzak adreslerden fark gstergelerde
ortaya kar; uzak adreslerde gstergeler 16 bit olmalarna ramen, dev adreslerde 32
bittir.
Bir C program derlendikten sonra, en az bir veri kesimi ve bir kod kesiminden
oluur. Bu, olas en kk C program iin bile geerlidir. Byk C programlar birka
veri kesimi, yani ok fazla ve byk veri yaplar ve/veya birka kod kesimi, yani birok
yrtlebilir deyim eklinde oluabilirler. Byk programlarn doru bir ekilde derlenip
146 MICROSOFT C DERLEYCS HAKKINDA TEMEL BLGLER EK B
yrtlebilmeleri iin, Microsoft Cye bellek modelleri konmutur. Aadaki izelge
bellek modelleri arasndaki farklar gstermektedir:
Kod Kesimi Veri Kesimi Kullanlan
Model Says Says Ktphane
minik (tiny) kod ile veri toplam 1 kesim SLIBCE.LIB
kk (small) 1 1 SLIBCE.LIB
ksa (compact) 1 ok CLIBCE.LIB
orta (medium) ok 1 MLIBCE.LIB
byk (large) ok ok LLIBCE.LIB
dev (huge) ok ok LLIBCE.LIB
Microsoft C Eniyiletirici Derleyicisi (MS-CL) iin varsaylan model kk olandr;
Microsoft QuickC (MS-QC) ise her zaman orta modelde alr.
B.1. QC Ktphanesi
MS-QC derleyici ortam iinde bulunan fonksiyonlar ekirdek ktphaneyi olutururlar;
ancak QuickC ekirdek ktphanesi Standart C ktphanesi iindeki btn fonksiyonlar
iermez. rnein, rand standart fonksiyonu QC ile birlikte yklenmez. Bu fonksiyonu
aran bir program altrmaya kalkarsanz, zmlenmemi dsal referans eklinde
bir hata mesaj alrsnz. Bir ama dosya oluturmanz ve daha sonra yrtlebilir bir
dosya elde etmek iin bunu LINK ile balamanz gerekecektir. Programnz her
deitirdiinizde, bunu yapmaktan kurtulmak iin, bir QuickC ktphanesi oluturmanz
ve QCyi altrdnzda bu ktphaneyi de yklemeniz gerekir. Bunu yapmak iin
aadaki yntemi kullann:
Gerektii kadar dsal referans yapan, rnein ql.c adnda, bir program yazn.
Derleme esnasndaki uyar mesajlarn dikkate almayn. rnein:
#include <stdlib.h>
void main (void)
{
rand();
srand();
bsearch();
qsort();
}
QCyi kullanarak bir ama dosya, rnein ql.obj, oluturun.
Bu dosyay MS-QC tarafndan salanan QUICKLIB.OBJ adl ama modlle beraber
balayp bir Quick ktphane oluturun. rnein:
LINK /Q QUICKLIB.OBJ+ql.obj,ql.qlb;
QCyi altrrken bu ktphaneyi belirtin. rnein:
QC /l ql
EK B MICROSOFT C DERLEYCS HAKKINDA TEMEL BLGLER 147
Dikkat: QC ktphanelerinin ierilmesi QC alrken bellek-ii derleme iin ayrlm
bulunan serbest bellek miktarnn azalmasna yol aar. En iyisi, birden fazla kk Quick
ktphane oluturup, gerektii zaman bunlar yklemektir.
B.3. CL Eniyiletirici Derleyicisi
Microsoft C Eniyiletirici Derleyicisinin (MS-CL) 5.10 uyarlamas, 80x8x ilemcileri ile
MS-DOS ve OS/2 iletim sistemleri iin ama kod retmede kullanlan gelimi bir
eniyiletirici derleyicidir. 5.10 uyarlamasnn 5.00 uyarlamasndan tek fark 80386
ilemcisi ile OS/2 iletim sistemini desteklemesidir. Microsoft Visual C++ paketi iinde
bulunan Microsoft C Eniyiletirici Derleyicisinin 8.00 uyarlamas ise Windows ortam ve
C++ iin ek olanaklar tanr.
Ancak, temel olarak, CL derleyici/balaycsnn kullanm, komut satrndan birtakm
seim anahtarlar ile dosya isimleri belirtilmek suretiyle CL komutunun arlmas
eklindedir. Seeneklerin bir zeti ve ar rnekleri yledir:
C>CL /HELP CL seeneklerinin bir zeti grntlenir.
C>CL F1.C F1.C C kaynak dosyas derlenip SLIBCE.LIB
adl varsaylan ktphane ile balanr. F1.OBJ
ama dosyas ve F1.EXE yrtlebilir program
oluturulur.
C>CL F1.C F2.C Yukarda olduu gibi, fakat ayrca F2.C dosyas
F2.OBJ iine derlenir. Yrtlebilir program
F1.EXE iinde balanr.
C>CL /c F1.C Derleme yaplr, ama balama yaplmaz.
C>CL F1.OBJ Daha nce derlenmi bulunan F1.OBJ dosyas
F1.EXE iine balanr.
C>CL F1 Varsaylan dosya tipi .OBJ olduu iin, yukardaki
ile ayn.
C>CL F1.C F2.C F3.OBJ F4 F1.C ve F2.C derlenip, F1.OBJ, F2.OBJ,
F3.OBJ ve F4.OBJ balandktan sonra F1.EXE
oluturulur.
C>CL *.C Bulunulan altdizin iindeki tm C kaynak dosyalar
derlenip tek bir program eklinde balanr.
C>CL * Bulunulan altdizin iindeki tm .OBJ ama
dosyalar balanr.
C>CL /Zi /Od F1.C Eniyilemenin engellendii ve Codeview hata
dzelticisinin kullanlabilecei ekilde F1.EXE
oluturulur.
148 MICROSOFT C DERLEYCS HAKKINDA TEMEL BLGLER EK B
Aada derleyici seeneklerinden bazlarnn zet bir listesi bulunmaktadr:
Bellek Modeli Seenekleri
/AS Kk bellek modeli (varsaylan).
/AC Ksa bellek modeli.
/AM Orta bellek modeli.
/AL Byk bellek modeli.
/AH Dev bellek modeli.
/AT Minik bellek modeli (.COM dosyas oluur).
Eniyileme Seenekleri
/O Eniyilemeye izin ver (/Ot ile ayn).
/Oa Baka ad vermeyi dikkate alma.
/Od Eniyilemeleri engelle (varsaylan).
/Oi Yapii fonksiyonlarn kullanlmasna izin ver.
/Ol Dng eniyilemelerine izin ver.
/On Gvenilmez eniyilemeleri engelle.
/Op Duyarlk eniyilemelerine izin ver.
/Or Satrii dnleri engelle.
/Os Kod iin eniyileme yap.
/Ot Hz iin eniyileme yap.
/Ox En yksek eniyileme (/Oailt /Gs).
Kod Oluturma Seenekleri
/G0 8088/8086 kodu olutur (varsaylan).
/G1 186 kodu olutur.
/G2 286 kodu olutur.
/G3 386 kodu olutur.
/Gc Pascal tarznda fonksiyon arlar olutur.
/Gs Yt kontrol yapma.
/Gtsay Veri boyu eii.
Listeleme Seenekleri
/Fadosyaad
opt
MASM iin girdi olarak kullanlabilecek birletirici
dil listesi (.ASM).
/Fcdosyaad
opt
Birletirilmi kaynak ve birletirici dil listesi
(.COD).
/Fedosyaad Yrtlebilir dosya ad (.EXE).
/Fldosyaad
opt
Ama ve birletirici dil listesi (.COD).
/Fmdosyaad
opt
Balayc plan (.MAP).
/Fodosyaad Ama dosya ad (.OBJ).
/Fsdosyaad
opt
Kaynak listesi (.LST).
EK B MICROSOFT C DERLEYCS HAKKINDA TEMEL BLGLER 149
/Sl satrgenilii Listenin geniliini satrgeniliine ayarla;
varsaylan deer 79dur.
/Sp sayfaboyu Listede sayfa bana satr says; varsaylan deer
63tr.
/Ss "altbalk" Bir liste altbal grntle.
/St "balk" Bir liste bal grntle.
nilemci Seenekleri
/C Aklamalar karma.
/Disim=metin
opt
Kaynak programda #define isim metine
edeerdir.
/E nilemci ktsn stdouta gnder.
/EP nilemci ktsn stdouta, #line emirleri
olmadan, gnder.
/Iisim #include ilemi iin ek altdizin.
/P nilemci ktsn dosyaya gnder; dosya tipi
.Idir.
/Uisim nceden tanmlanm makronun tanmn kaldr.
/u nceden tanmlanm btn makrolarn tanmn
kaldr.
/X Standart yerleri dikkate alma.
Dil Seenekleri
/Za Dildeki geniletmeleri engelle (sadece ANSI
Standardn kullan).
/Zd Satr numaras bilgisi.
/Ze Dildeki geniletmelere izin ver (varsaylan).
/Zg Fonksiyon prototipleri olutur.
/Zi Simgesel hata dzeltme bilgileri.
/Zl .OBJ iindeki varsaylan ktphane bilgisini
kaldr.
/Zpn Yaplar n-baytlk snrlar iine paketle.
/Zs Sadece szdizim kontrol yap.
Balama Seenekleri
/Fonaltl_say Yt boyu (onaltl gsterimde bayt says).
/linkba_se_ve_ktp Balayc seenekleri belirle.
Kayan Noktal lemler in Kod retme Seenekleri
/FPa Karlkl matematik kodu iin arlar olutur.
/FPc 80x87 benzetme kodu iin arlar olutur.
/FPc87 80x87 kodu iin arlar olutur.
150 MICROSOFT C DERLEYCS HAKKINDA TEMEL BLGLER EK B
/FPi Satrii 80x87 benzetme kodu ret (varsaylan).
/FPi87 80x87 komutlar ret.
eitli Seenekler
/c Sadece derle, balama.
/Huzunluk Dsal isim uzunluu.
/J Varsaylan karakter tipi unsigned olsun.
/Tcdosya .Csi olmayan dosyay derle.
/Vkar_dizisi Uyarlama kar_dizisini ver.
/Wdzey Uyar dzeyi (0<dzey4).
151
EK C: MICROSOFT CODEVIEW
HATA DZELTCSNE GENEL
BR BAKI
Microsoft Codeview; C, Pascal, FORTRAN ve birletirici dil programlarnn yrtme
esnasndaki hatalarn dzeltmek iin kullanlan, kullanm kolay, etkileimli bir hata
dzelticisidir. C programclar iin, kaynak dosyalarn /Zi ve /Od seenekleri ile
derlenip /CO seeneiyle balanmalar gerekir. Bir rnek yledir:
C>CL /c /Zi /Od F1.C
C>LINK /CO F1
veya,
C>CL /Zi /Od F1.C
Bu yolla F1.EXE dosyas oluturulduktan sonra, hata dzelticisini armak iin
C>CV seenekler exedosyas argmanlar
yazmak gerekir. Burada, exedosyas derlenip balanm olan program ieren dosyann
ad, argmanlar hatalar dzeltilecek olan programa geirilecek olan argmanlar ve
seenekler de Codeview seeneklerinden oluan bir listedir. Bu seeneklerden en nemli
birka tanesi yledir:
/2 ki monitr kullan; bir tanesi hata dzelticisi kts dieri de program kts iin.
/B Renkli bir adaptr ve monitrde siyah/beyaz renkler kullan.
/M Olsa bile, fareyi kullanma.
Codeviewa girildiinde, seilebilir men maddeleri, bir grntleme penceresi, bir
diyalog penceresi ve istee bal olarak bir yazma ierikleri grntleme blgesinden
oluan bir ekran kullancya sunulur. Hatas dzeltilecek programn ilk birka satr
otomatik olarak grntleme penceresine konur. Codeview komutlar fare ve/veya klavye
araclyla girilebilir. Girdilerin ou iin fare kullanm kolay olduu iin, sadece klavye
152 MICROSOFT CODEVIEW HATA DZELTCSNE GENEL BR BAKI EK C
komutlar burada anlatlmaktadr. Baz klavye komutlar tek tua dayanr; diyalog
komutlar gibi, bazlarnn ise diyalog penceresinden girilmesi gerekir. Aada baz
komutlarn zet bir listesi verilmitir. PAGE UP, PAGE DOWN, oklar vs gibi dzenleme
tular her zamanki anlamlarn tarlar.
CONTROL+HOME Programn ilk satrn grntle.
CONTROL+END Programn son satrn grntle.
F1 Yardm.
F2 Yazma penceresi grntleme anahtar.
F3 Kaynak kodu, birletirici kodu veya her ikisini grntle.
F4 Program kt ekrann grntle.
F5 Eer varsa, bir sonraki kesilme noktasna kadar, program
yrt.
F6 Deiik pencereler arasnda dolama anahtar.
F7 mlecin bulunduu yere kadar program altr.
F8 Bir izleme (trace) komutu altr.
F9 Kesilme noktas (breakpoint) ver/sil.
F10 Bir sonraki kaynak satrn altr (program adm [step]
modu).
Diyalog komutlar komut ilenenler eklindedir. lenenler olarak her tr geerli C
ifadesi kullanlabilir. Diyalog komutlarnda kullanlan dier ilenenler aada rneklerle
tantlmaktadr:
.100 100 numaral satr. (ndeki noktaya dikkat edin.)
.X.C:100 X.C dosyasndaki 100 numaral satr.
1000:2000 kesim:uzaklk eklinde bir adres. Kesim istee baldr.
Rakam gsterimi o andaki say sistemine baldr, fakat
varsaylan sistem onaltldr.
AH BH CH DH Yazmalarn yksek baytlar.
AL BL CL DL Yazmalarn dk baytlar.
AX BX CX DX 16-bit yazmalar.
CS DS SS ES 16-bit kesim yazmalar.
SP BP IP 16-bit gsterge yazmalar.
SI DI 16-bit indis yazmalar.
EAX EBX ECX EDX 32-bit yazmalar.
ESP EBP 32-bit gsterge yazmalar.
ESI EDI 32-bit indis yazmalar.
adr1 adr2 Adr1den adr2ye bir adres aral.
BY adres Adresteki bayt.
WO adres Adresteki szck.
DW adres Adresteki ift szck.
Ska kullanlan diyalog komutlar, komutun genel eklinden sonra gelen rneklerle
birlikte aada liste eklinde verilmitir:
EK C MICROSOFT CODEVIEW HATA DZELTCSNE GENEL BR BAKI 153
V .100 Satr 100 gster.
?ifade,biim Belirtilen biimde ifadenin deerini gster.
?A+B,d Ondalk olarak A+Bnin deerini gster.
?WO SP,x SP ile gsterilen szc onaltl gsterimde gster.
XP simge Simgenin adresini gster.
X* Btn simgelerin adreslerini gster.
R Btn yazmalar gster.
MDbiim adres Biim seimine gre adresten balayarak 128 bayt dk.
MDbiim adr1 adr2 Biim seimine gre adr1den adr2ye kadar dk. Biim
seimi yledir:
A ASCII karakter
B Bayt
C Program kodu
I Tamsay (2 bayt)
IU aretsiz tamsay
L Uzun tamsay (4 bayt)
R Ksa kayan noktal say (4 bayt)
RL Uzun kayan noktal say (8 bayt)
RT 10-baytlk kayan noktal say
MC adr1 adr2 adr3 Adr1den adr2ye kadar olan baytlar adr3ten balayan
baytlarla karlatrp farklar gster.
MS adr1 adr2 deer Adres aral iinde deeri aratr.
MS 100 1000 "isim" 100-1000 aral iinde isimi aratr.
MS 100 1000 0A 100-1000 aral iinde onaltl gsterimde 0Ay aratr.
BP adr_listesi Kesilme noktas koy.
BC adr_listesi Kesilme noktasn sil.
BP .29 Satr 29a kesilme noktas koy.
BC 0 8 22 0, 8 ve 22 adreslerindeki kesilme noktalarn sil.
BC * Tm kesilme noktalarn sil.
BL Tm kesilme noktalarn gster.
W?ifade,biim fadenin deerini gzle ve biimde gster.
W Tm gzetlemeleri gster.
WC * Tm gzetlemeleri sil.
155
EK D: MICROSOFT LIB VE
NMAKE YARDIMCI
PROGRAMLARINA GENEL BR
BAKI
Bu ekte iki Microsoft yardmc programlarna ksaca gz atlacaktr. Daha kesin bilgi iin
kullandnz paketin elkitaplarna dann.
D.1. LIB Yardmc Program
LIB, ama program ktphaneleri oluturmak ve bakmn yapmak iin kullanlan
yardmc bir programdr. LIBi armak iin kullanlacak komutun genel ekli yledir:
C>LIB eskiktphane komutlar
opt
,listedosyas
opt
,yeniktphane
opt
Burada,
eskiktphane Yaratlacak yeni ktphane veya deitirilecek eski
ktphanenin dosya ad.
komutlar LIBe komutlar:
+amadosya Eski ktphaneye yeni ama modl ekle.
+ktphanedosyas Ktphanedosyasndaki tm ama modllerini eski
ktphaneye ekle. (Ktphaneleri birletir.)
-+amadosya Eski ktphane iindeki ama modln yerine
yenisini koy.
156 MICROSOFT LIB VE MAKE YARDIMCI PROGRAMLARINA GENEL BR BAKIEK D
*modlismi Ktphanedeki bir modl (modlismi.OBJ adl)
dosyaya aktar.
-*modlismi Ktphanedeki bir modl bir dosyaya ta, yani
aktarp ktphaneden sil.
listedosyas apraz referans iin liste.
yeniktphane Deiikliklerden sonra oluturulan yeni ktphanenin dosya
ismi. Eer belirtilmezse, eski ktphanenin tipi .BAKa
dntrlp, eskiktphane isminde saklanr.
rnekler:
LIB KH1 +MOD1; MOD1.OBJdaki ama modl KH1.LIB
ktphanesine ekle.
LIB KH1 -+MOD1; KH1.LIB ktphanesindeki ama modl
MOD1.OBJdaki ama modlle deitir.
LIB komutunda ayrca birtakm seenekler de bulunmaktadr.
D.2. NMAKE Yardmc Program
NMAKEveya MAKEfarkl kaynak dosyalarda bulunan ok sayda modlden oluan
byk programlarn otomatik olarak derlenmesi ve balanmas iin kullanlan bir
yardmc programdr. NMAKE programn altracak komutun genel ekli yledir:
C>NMAKE seimler
opt
makrotanmlar
opt
seimler Aadakiler olabilir:
/Fdosyaad NMAKE yardmc program komutlar ieren
tanmlayc dosyann ad. (Dosya tipi .MAKtr.)
/D NMAKE tarafndan ilenen her dosyann son
deitirilme tarihini grntle.
/I Tanmlayc dosyadaki programlardan dndrlen
kodlar dikkate alma ve daha sonraki satrlar
yrtmeyi srdr.
/N Tanmlayc dosyadaki komutlar iletme, sadece
grntle.
/S Sessiz mod, hibir ey grntleme.
/Xdosyaad Hata mesajlarn bir dosyaya ynlendir.
/X- Hata mesajlarn standart kt aygtna ynlendir.
makrotanmlar stee bal olarak, isim=metin eklinde, bir veya daha fazla
sayda karakter dizisi.
Bir tanmlayc dosya bir veya daha fazla sayda tanmlayc bloktan oluur. Bo
satrlar tanmlayc bloklar ayrrlar. Bir tanmlayc bloktaki maddelerin szdizimi ve
anlambilimi aada zetlenmitir:
EK DMICROSOFT LIB VE MAKE YARDIMCI PROGRAMLARINA GENEL BR BAKI 157
kdosya : girdosya ... #aklama
#aklama
komutlar
kdosya iki noktadan sonra gelen dosyalara bamldr. Komutlar, satr kdosya
zerinde yaplacak ilemleri belirtir. rnein, XYZ.MAK tanmlayc dosyasnda
XYZ.EXE : XYZ.C F1.C F2.C
# XYZ'yi derleyip bagla.
CL XYZ.C F1.C F2.C
yazl ise
C>NMAKE /F XYZ
eklinde bir ar, eer XYZ.C, F1.C ve F2.C dosyalarndan herhangi biri XYZ.EXE
oluturulduktan sonra deitirilmise, bu dosyalarn tekrar derlenmesini salayacaktr.
159
EK E: DLLERARASI ARILAR
Yazlm ayr ayr modller eklinde gelitirildiinde, modlleri ayr programlama dilleri
kullanarak gerekletirmek olasdr. Bu, hem o modl iin belli bir dilin daha uygun
olmasndan, hem de programcnn o dili daha iyi bilmesinden dolay belli bir dili semi
olmasndan kaynaklanabilir. rnein, Cde yazlm bir programn baz modleri iin sk
sk birletirici dil kullanlr. Bu ekte bir C programndan bir birletirici dil yordam
armak veya bir birletirici dil programndan bir C fonksiyonu armak iin arma ve
argman geirme yntemlerini ksaca inceleyeceiz. BASIC, Pascal ve FORTRANdan C
yordamlar veya Cden bu dillerde yazlm yordamlar nasl arabileceinizi renmek
iin Microsoft C Version 5.00 Mixed Language Programming Guide (Karma Dil
Programlama Klavuzu) veya Microsoft Visual C++ Programming Techniques
(Programlama Teknikleri) elkitaplarna baknz.
E.1. Birletirici le Balaycnn Kullanlmas
Bir C programnda, fonksiyon isimleri dsal simgelermi gibi ilem grrler ve balayc
tarafndan kullanlmalar iin, ama program dosyasna kaydedilirler. Fakat bir farkla: C
derleyicisi her fonksiyon isminin nne bir altizgi ekler. rnein:
xyz (...)
{
...
}
fonksiyon tanmnda, fonksiyon ismi ama programda _xyz eklinde kaydedilir.
Standarda gre, dsal tantc szcklerde, anlaml karakter says en az 8dir. Ayrca,
kk byk harf ayrm yaplmayabilir.
Bir C fonksiyonu baka bir C fonksiyonunu ardnda, ardaki argmanlar ve
dn adresi, yt ad verilen bir veri yaps iinde arlan fonksiyona geirilir ve
160 DLLERARASI ARILAR EK E
arlan fonksiyon deiiklikleri bu yt iinde yapar. Bundan dolay, aran ile arlan
fonksiyonun bu yt nasl deitirdiini anlamak ok nemlidir.
Yt, bellein byk adreslerinden kk adreslerine doru byr. C derleyicisi,
ardaki argmanlar argman listesindeki sralarna gre fakat sadan balayarak yta
yerletirir. Bylece, yta en son itilen ve bundan dolay en dk adreste bulunan
argman en soldaki, yani argman listesindeki ilk argmandr. aran yordam tarafndan
yta en son itilen ey ise dn adresidir. arlan yordam Taban Yazma BPnin
ieriini saklayarak, yerel verileri iin yer ayrarak ve, SI ile DI gibi, ierikleri
deiebilecek olan yazmalarn ieriklerini saklayarak ytta deiiklikler yapar.
Aadaki izelge ytn ieriini gstermektedir.
ninci argman (byk adres)
aran fonksiyon n-1inci argman
tarafndan deitirilen ...
yt blm birinci argman
dn adresi
arlm fonksiyon saklanm BP BP
tarafndan deitirilen yerel veriler
yt blm saklanm yazmalar SP (kk adres)
Her argman iin kullanlan bayt says argmann tipi ve, deerle veya referansla
ar gibi, argman geirmek iin kullanlan ynteme baldr. Referansla ar
durumunda, bir adres geirildiine gre, bu say adresin yakn/uzak niteliine de baldr.
Ayn durum dn adresi iin de szkonusudur. Her biri iin kullanlan bayt says
yledir:
Yntem Tip Bayt
deerle short, int 2
deerle long 4
deerle float 4
deerle double 8
referansla yakn 2
referansla uzak 4
dn adresi yakn 2
dn adresi uzak 4
Program minik, kk veya ksa bellek modelinde derlenmise dn adresi yakn,
aksi takdirde uzaktr. Uzak adresler kesim:uzaklk eklinde olurlar.
Cde dizi dndaki tm veri yaplarnn deerle, dizilerin ise referansla geirildiini
anmsayn. Eer bir dizinin deerle geirilmesi isteniyorsa, o zaman deerle geirilen bir
yapnn tek yesi olarak tanmlanmaldr.
arlan yordam, iini bitirdikten sonra, hesaplad deeri u ekilde dndrr:
EK E DLLERARASI ARILAR 161
Dndrlen
Deer Yazma
1 bayt AL
2 bayt AX
4 bayt yksek baytlar DXte, dk baytlar AXte
> 4 bayt deerin adresi DX:AXte
Aadaki rnekte, birletirici dilde yazlm xyz adndaki fonksiyonu aran bir C
main fonksiyonu gsterilmektedir:
extern int xyz (int, int);
main (...)
{
...
xyz(3,5);
...
}
.MODEL SMALL
.CODE
PUBLIC _xyz
_xyz PROC
push bp ; Taban gosterge yazmacini sakla
mov bp,sp ; Yigitta ... boyunda yeni
sub sp,... ; bir taban bolge ac
push si ; SI ve DI yazmaclarini sakla
push di ;
pushf ; Bayrak yazmacini sakla
mov ax,[bp+4] ; Ilk argumani AX'e tasi
mov cx,[bp+6] ; Ikinci argumani CX'e tasi
... ; xyz'nin hesaplamasi
... ; gereken seyi hesapla
mov ax,... ; Donus degerini koy
popf ; Bayrak yazmacini geri al
pop di ; DI ve SI yazmaclarini geri al
pop si
mov sp,bp ; Yigiti temizle
pop bp ; Eski BP'yi geri al
ret ; Cagirana don
_xyz ENDP
END
Programlar ayr ayr ama dosyalar iine derleyin ve birletirin; daha sonra bu iki
dosyay tek bir yrtlebilir dosya eklinde balayn.
162 DLLERARASI ARILAR EK E
E.2. Satrii Birletiricisinin Kullanlmas
Microsoft C Derleyicisinin 8.00 uyarlamasn kullanyorsanz, bir nceki ksmda
anlatld ekilde MASM gibi ayr bir birletirici kullanmanza gerek kalmayabilir.
Derleyici iine dahil edilmi satrii birletiricisini kullanabilirsiniz. Bu durumda, ama
dosyalarn LINK ilemiyle de uramanza gerek kalmaz.
Satrii birletiricisinin birok avantajlar vardr: tek bir kaynak dosya iinde hem C
hem de birletirici kodunu yazma; C deimez, deiken, fonksiyon ve etiket isimlerine
birletirici kod iinden ulama; C deyimleri arasna istenilen yere birletirici kodu ekleme
gibi. Ancak, birletirici kodun kullanlmas tanabilirlik sorunlar ortaya karabilir;
bunun iin birletirici kodlarnn, kaynak dosya iinde, ayr bir yerde tutulmas yararl
olur.
Satrii birletiricisini kullanmak iin bir C fonksiyonu iinde uygun yerlere
__asm {
...
}
eklinde zel bir deyim kullanmanz gerekir. rnein
__asm {
mov ah,2
mov dl,7
int 21h
}
deyimi ekrana zil karakterinin yazlmasn salar.
Satrii birletiricisinde birok MASM ifadesi ve 80286 ile 80287 ilemci komutlar
kullanlabilir. fadeler iinde kaynak dosyada tanmlanm C isimleri de kullanlabilir.
Aklamalar, normal olarak satrn sonuna noktal virgln arkasna yazlr. Birletirici
kodu iinde _emit szde komutu kullanlarak tek bir bayt tanmlanabilir. rnein:
_emit 0x66
_emit 0x98
szde komut sras, satrii birletiricisinin anlamad, 80386 CWDE komutunun yerine
kullanlabilir.
Satrii birletiricisi kodu iinde AX, BX, CX, DX, ES ve bayrak yazmalarn
istediiniz gibi kullanabilirsiniz. Ancak, DI, SI, DS, SS, SP ve BP yazmalaryla (STD ve
CLD komutuyla deitirilebilen) yn bayran eski halinde brakmanz gerekir.
EK E DLLERARASI ARILAR 163
E.3. Bir rnekDisket Saklama
Bu ksmda, bir disketi olduu gibi diske kopyalayp geri alabilen veya disketle disk
dosyasn karlatrabilen bir program inceleyeceiz. Program bir disketi blok blok
okuyup diskteki tek bir dosya iine kopyalamakta veya bu iin tam tersini yapmaktadr.
Bu amala diskette istediimiz bir sektr okuyup yazabilen bir ynteme
gereksinimimiz vardr. MS-DOS kesintilerinden 0x25 ve 0x26 bu ii yaparlar, ancak bir
sorunlar vardr: Olas bir hata durumunu bayrak yazmacnn elde (carry) bitinde, hata
kodunu ise AX yazmacnda dndrrler. Bu arada, bayrak yazmacnn eski durumunu da
ytta saklarlar. Bu durumda, bu kesintilerden dnld zaman ytta fazla bir szck
bulunmaktadr. Programa devam etmeden nce bunun geri alnmas gerekir. Bu yzden,
bu kesintileri dos.h balk dosyasnda tanmlanm _int86 fonksiyonunu kullanarak
aramayz; birletirici kodu yazmamz gerekir. Aadaki programda mdisk
fonksiyonu bu ii yapar.
1. /* Disk uzerinde dosya seklinde disket saklama. Uyarlama 2.00.
2. * (C) Fedon Kadifeli 1989-1993.
3. * Derleyici: Microsoft C. Uyarlama 8.00.
4. */
5.
6. #include <stdio.h>
7. #include <stdlib.h>
8. #include <conio.h> /* MS-CL */
9.
10. #define M_OKU (0x25) /* mutlak disk okuma kesinti kodu */
11. #define M_YAZ (0x26) /* mutlak disk yazma kesinti kodu */
12. #define SEKTOR ((size_t)512) /* sektor boyu */
13. #define IOS ((size_t)48) /* bellek tampon boyu (sektor) */
14. #define BBS (1024/SEKTOR) /* 1K'lik bloklar */
15. #define MAKS_DB (66) /* en uzun dosya ismi boyu */
16.
17. typedef unsigned char BAYT; /* 8 bit */
18.
19. BAYT tam1 [IOS*SEKTOR], tam2 [IOS*SEKTOR];
20.
21. /* karsilastirma islemi */
22. int esit (register BAYT * a, register BAYT * b, register size_t u)
23. {
24. while (u--)
25. if (*a++ != *b++)
26. return 0; /* uyusmuyor */
27. return 1; /* uyusuyor */
28. } /* esit */
29.
164 DLLERARASI ARILAR EK E
30. /* mutlak disk girdi/cikti */
31. size_t mdisk (BAYT kesno, BAYT surno, size_t seksay, size_t sekno,
32. BAYT * aktadr)
33. {
34. size_t dondeg;
35. __asm {
36. push di ; yazmaclari
37. push si ; sakla
38. push bp
39. mov ah,kesno ; kesinti numarasi (M_OKU, M_YAZ)
40. mov al,surno ; disket surucu numarasi
41. sub al,'A' ; 'A' -> 0, 'B' -> 1
42. mov cx,seksay ; sektor sayisi
43. mov dx,sekno ; sektor numarasi
44. mov bx,aktadr ; aktarma adresi
45. cmp ah,M_OKU
46. jne else ; eger M_YAZ ise
47. int M_OKU
48. jmp SHORT devam
49. else: int M_YAZ
50. devam: pushf
51. pop ax ; bayraklari al
52. and ax,1 ; hata biti (kesinti donus degeri)
53. popf ; bayraklari geri al
54. pop bp ; yazmaclari
55. pop si ; geri al
56. pop di
57. mov dondeg,ax
58. }
59. return !dondeg; /* 0 hata; 1 tamam */
60. } /* mdisk */
61.
62. /* menu seceneklerini sor */
63. int mensor (void)
64. {
65. int sec;
66. static char * scnklr [] = {
67. "\n",
68. " 1. Sakla\tDisket --> Disk",
69. " 2. Yukle\tDisket <-- Disk",
70. " 3. Karsilastir\tDisket <-> Disk" };
71.
72. printf("\n\n\t%s\n\t%s\n\t%s\n\nSecenek:",
73. scnklr[1], scnklr[2], scnklr[3]);
74. if ((sec = _getch()) == '1' || sec == 'S' || sec == 's')
75. sec = 1;
76. else if (sec == '2' || sec == 'Y' || sec == 'y')
77. sec = 2;
78. else if (sec == '3' || sec == 'K' || sec == 'k')
79. sec = 3;
80. else
81. sec = 0;
82. puts(scnklr[sec]);
83. return sec;
84. } /* mensor */
85.
86. /* kullanilacak disket surucusunu sor */
87. int sursor (void)
88. {
89. int sur;
90.
EK E DLLERARASI ARILAR 165
91. printf("Disket surucusu (A/B): ");
92. if ((sur = toupper(_getch())) != 'A' && sur != 'B')
93. sur = 0;
94. printf(sur ? "%c:\n" : "\n", sur);
95. return sur;
96. } /* sursor */
97.
98. /* kullanilacak disk dosyasinin adini sor */
99. char * dossor (void)
100. {
101. static char da [MAKS_DB+3] = { MAKS_DB+1 };
102.
103. printf("Disk dosya adi: ");
104. _cgets(da);
105. putchar('\n');
106. return da[2] ? da+2 : NULL;
107. } /* dossor */
108.
109. int main (void)
110. {
111. int secenek, surucu;
112. char * da;
113. FILE * dg;
114. int b;
115. size_t i, d1, d2;
116.
117. printf("Disk uzerinde dosya seklinde disket saklama."
118. " Uyarlama 2.00.\n(C) Fedon Kadifeli 1989-1993.\n");
119. while ((secenek = mensor()) != 0)
120. while ((surucu = sursor()) != 0)
121. while ((da = dossor()) != NULL) {
122. i = 0;
123. d1 = 1;
124. b = 0;
125. /* 1 nolu secenek : Disket --> Disk */
126. if (secenek == 1) {
127. if ((dg = fopen(da,"rb")) != NULL) {
128. fclose(dg);
129. printf("'%s' dosyasi zaten var!\n", da);
130. continue;
131. }
132. if ((dg = fopen(da,"wb")) == NULL) {
133. printf("'%s' dosyasi acilamiyor!\n", da);
134. continue;
135. }
136. while (mdisk(M_OKU, (BAYT)surucu, IOS, i, tam1) &&
137. (d1=fwrite((void *)tam1, SEKTOR, IOS, dg)==IOS) != 0)
138. printf("\r%d", (i+=IOS)/BBS);
139. printf(d1 ? (i?" adet blok '%s' dosyasina aktarildi.\n"
140. :". Disket okunamadi!\a\n")
141. : ". '%s' dosyasinda yazma hatasi!\a\n", da);
142. } else {
143. /* 2 veya 3 nolu secenek */
144. if ((dg = fopen(da,"rb")) == NULL) {
145. printf("'%s' dosyasi acilamiyor!\n", da);
146. continue;
147. }
166 DLLERARASI ARILAR EK E
148. /* 2 nolu secenek : Disket <-- Disk */
149. if (secenek == 2) {
150. while (fread((void *)tam1, SEKTOR, IOS, dg) == IOS &&
151. (d1=mdisk(M_YAZ, (BAYT)surucu, IOS, i, tam1)) != 0)
152. printf("\r%d", (i+=IOS)/BBS);
153. printf(d1 ? " adet blok diskete aktarildi.\n"
154. : ". Diskette yazma hatasi!\a\n");
155. } else {
156. /* 3 nolu secenek : Disket <-> Disk */
157. while ((d1=mdisk(M_OKU, (BAYT)surucu, IOS, i, tam1)) &
158. (d2=fread((void *)tam2, SEKTOR, IOS, dg)==IOS) &&
159. (b =esit(tam1, tam2, IOS*SEKTOR)) != 0)
160. printf("\r%d", (i+=IOS)/BBS);
161. printf(
162. !b ? ". Karsilastirma hatasi!\a\n" :
163. d1 ? ". Dosya disketten kisa!\a\n" :
164. d2 ? ". Disket dosyadan kisa!\a\n" :
165. " adet blok uyusuyor.\n");
166. }
167. } /* if */
168. fclose(dg);
169. } /* while */
170. printf("\nIslem tamamlandi\n");
171. return 0;
172. } /* main */
esit fonksiyonu (Satr 22-28) iki tampon blgeyi karlatrr, eitse 1 dndrr,
aksi takdirde 0 dndrr.
mdisk fonksiyonu (Satr 31-60) surnoda verilen srcdekibu programda,
surno 'A' veya 'B' deerlerini alabilmektedirsekno balang sektr (kesim)
numarasndan seksay sektr says kadar sektr zerinde ilem yapar. kesno
M_OKUya eitse disketten bu sektrleri okuyup aktadr tampon blgesine aktarr;
kesno M_YAZa eitse aktadr tampon blgesindeki baytlar disketteki ilgili sektrlere
yazar. Bu fonksiyon, yukarda anlatld gibi ilgili kesintiyi ardktan sonra, ytta
saklanm bulunan bayraklar bayrak yazmacna geri alr (Satr 53).
Menu seeneklerini kullancya mensor fonksiyonu (Satr 63-84) gsterir ve
istenilen seenei kullancdan alr. Bir numaral seenek, programn disketi sektr sektr
okuyup, ad kullancdan alnan, bir disk dosyas iine kopyalamasn salar. ki numaral
seenek bu iin tersini yapar; daha nce, bir numaral seenek kullanlarak, disk dosyas
iine aktarlm olan bir disket grntsnn sektr sektr okunup formatlanm bir
diskete aktarlmasn salar. nolu seenek diskteki dosya ile disketi karlatrr; bu
seenek, bir veya iki nolu seenekler kullanlarak yaplan bir kopyalama ileminden
sonra, ilemin doruluunu snamak iin kullanlabilir.
Kullanlacak disket srcs (A: veya B:) sursor fonksiyonu (Satr 87-96)
araclyla kullancdan alnr. Kullanlacak disk dosyasnn ad ise dossor fonksiyonu
(Satr 99-107) tarafndan alnr. Burada, dosya adn okumak iin standart olmayan
_cgets fonksiyonu kullanlmtr. _cgets fonksiyonu kontroll bir ekilde klavyeden
bir satr okumak iin kullanlabilir.
Ana fonksiyon iie dngden oluur; bunlar, srasyla, kullancdan men
seeneini, kullanlacak srcy ve dosya adn alrlar. Her bir men seenei iin
EK E DLLERARASI ARILAR 167
yaplan ilem temelde ayndr: Bir dng iinde disk dosyas ve/veya disketten bilgi
okunup gerekli ilem yaplr. (Karlatrma seenei ksmnda, satr 157nin sonunda
neden && deil de & kullanlmtr?)
Not: Bu program kullanlrken dikkat edilmesi gereken bir nokta disket kapasitesidir.
lenen bilgi miktar kilobayt cinsinden ekranda grntlenir. rnein 1.44 megabaytlk
bir disket ile ilem yapldnda ekrandaki saynn son durumu 1440 olmaldr.
Programda kullanlan kesintinin gerek disket kapasitesini anlamas olas deildir; MS-
DOS ortamnda iken en son yaplan disket ilemindeki disket kapasitesi kullanlr. Bu
yzden, herhangi bir sorun kmamas iin, program kullanlmadan nce, kullanlacak
disket tipinden bir disket srcye taklp, rnein DIR A: veya CHKDSK A:
eklinde bir MS-DOS komutu altrlmaldr. Bundan sonra, program yrtlmesi
esnasnda, kullanlan disketlerin kapasitesi deimedii srece, herhangi bir sorun
kmayacaktr. Dikkat edilmesi gereken bir dier nokta da, kullanlan disketlerin formatl
olmas ve bozuk sektrlerin bulunmamasdr.
169
EK F: STANDART C
PROGRAMLAMA DLNN DER
ZELLKLER
Bu ekte, ANSI Standardnda olmasna ramen, henz yaygn olarak bilinmeyen ve pek
kullanlmayan baz zelliklerden szedilmektedir. Ayrca kitapta sz edilmi standart
ktphane fonksiyonlar hakknda (dn tipi ve argmanlarnn tipi gibi) baz detaylar
iin son ksma bavurulabilir.
F.1. C Dnyann Her YerindeYreler
Bilginin gsterim yollar lkeden lkeye deiir. rnein, tarih yazlrken, Trkede
nce gn, sonra ay yazlr. Baz bat lkelerinde ise bunun tersi yaplr. ngilizcede
ondalk saylar ayrmak iin nokta kullanlrken, baka lkelerde virgl kullanlr. Ve, en
nemlisi de, her lkenin kendine zg harfleri vardr ve btn dillerin btn karakterlerini
ifade edebilecek tek bir karakter takm yoktur.
Bu konuya bir zm getirmek iin yreler kavram getirilmitir. Bir yre, belirli bir
lke veya dil iin yukardaki paragrafta sz edilen trden bilgileri ieren bir bilgi
paketidir. Yreler, ctype fonksiyonlarn, yaz yazma ynn, saat-tarih biimlerini,
karakterlerin srasn ve ondalklar ayrmak iin kullanlan karakteri belirlerler. Yeni bir
yre belirterek, printf gibi, birok standart fonksiyonu etkilemek olasdr.
Kullanlmakta olan yre ile ilgili bilgileri lconv yaps tutar ve buna bir gsterge
elde etmek iin localeconv adl fonksiyonu armak gerekir. Yrtme esnasnda
yreyi belirtmek iin, u iki argman olan setlocale adl fonksiyonu arrsnz:
Deitirmek istediiniz zelliklerden oluan grup (LC_COLLATE [karakter sras],
LC_CTYPE [karakter tipi], LC_MONETARY [para], LC_NUMERIC [saylar], LC_TIME
[zaman], LC_ALL [hepsi]) ve yeni zelliklerin alnaca yrenin ad. Eer btn diller
170 STANDART C PROGRAMLAMA DLNN DER ZELLKLER EK F
iin yreler tanmlanmsa, programn banda kullancnn milliyetini sorup ondan sonra
bu kiinin alt ekilde alan bir program yazlabilir. rnein,
setlocale(LC_ALL, turkish)
Standart sadece C yresinin gerekletirilmesini gerektirmektedir. Bu da, kitap
boyunca anlatlan zelliklerden olumaktadr.
F.2. Geni Karakterler Ve okbaytl Karakterler
char tipinin 256 farkl deer alabilmesi temin edilmitir. Japonca veya ince gibi, baz
diller 256dan fazla simge gerektirmektedir. Byle dillerle alabilmek iin, geni
karakterler ve okbaytl karakterler kavram gelitirilmitir.
Bir geni karakter wchar_t adl standart tipe aittir. Bu tamsay tipi herhangi bir
karakter takmndaki btn deerleri gsterebilecek kadar byk olan, normalde 16 bitlik
bir tiptir. Geni karakterlerden oluan diziler, balangtaki "n hemen nne bir L harfi
konarak belirtilir. Karakter deimezleri iin de, benzer ekilde, 'n nne L konur.
wchar_t gkd[] = L"Bir genis karakter dizisi";
wchar_t gk = L'h';
Bir okbaytl karakter, evresel bir aygta yazlabilecek, bir veya birden fazla bayttan
oluan, sradan bir karakter srasdr. okbaytl bir karakter dizisinin uzunluunu elde
etmek iin mblen fonksiyonu kullanlr.
Bu iki karakter tr birbirleriyle yakn ilikili olduklar iin, bunlar arasnda
dntrme yapmay isteriz. Aadaki fonksiyonlar bu ii yaparlar:
wctomb bir geni karakteri bir okbaytl karaktere,
mbtowc bir okbaytl karakteri bir geni karaktere,
wcstombs bir geni karakter dizisini bir okbaytl karakter dizisine,
mbstowcs bir okbaytl karakter dizisini bir geni karakter dizisine
dntrr.
F.3. l Karakterler
Baz klavyelerde C programlarnda kullanlan baz nemli karakterler yazlamayabilir.
Byle dokuz karakteri ifade etmek iin dokuz zel karakter sras kullanlr. Btn bu
sralar karakterden olutuu iin bunlara l karakter denir. nilemci bir l
karakter ile karlatnda yerine onun ifade ettii karakteri koyar. l karakterler ve
onlarn edeerleri unlardr:
EK F STANDART C PROGRAMLAMA DLNN DER ZELLKLER 171
l Karakter Karakter
??= # (say iareti)
??( [ (sol keli parantez)
??/ \ (ters bl)
??) ] (sa keli parantez)
??' ^ (uzatma iareti)
??< { (sol engelli parantez)
??! | (dikey izgi)
??> } (sa engelli parantez)
??- ~ (inceltme iareti)
Programn heryerinde l karakter yerine ilgili karakterin konulduuna dikkat edin.
Yani,
printf("Devam??(e/h)")
fonksiyon ars
Devam[e/h)
basacaktr.
F.4. Zaman Fonksiyonlar
Zamanla ilgili dokuz tane standart fonksiyon bulunmaktadr. Gerekli bildirimler time.h
adl dosyada bulunmaktadr.
u anki takvim zamann elde etmek iin time fonksiyonunu arn. Sonu
time_t tipindendir. Eer zaman elde edilebilir deilse, bu fonksiyon -1 dndrr.
difftime fonksiyonu iki time_t argman alr ve bunlar arasndaki zaman
farknn saniye cinsinden verildii bir double dndrr.
Takvim zamann yerel zamana dntrmek iin, localtime fonksiyonunu
kullann.
gmtime fonksiyonu takvim zamann (eskiden Greenwich Ortalama Saati olarak
bilinen) Dzenlenmi Evrensel Saate evirmek iin kullanlr.
Zaman grntlemek iin nce bir karakter dizisine evirmeniz gerekir. Bu
asctime fonksiyonu ile yerine getirilir. Argman tarafndan iaret edilen yap iindeki
zaman bir karakter dizisine dntrr.
ctime(zg)
ars
asctime(localtime(zg))
arsna edeerdir. Yani yerel zaman bir karakter dizisine dntrr.
172 STANDART C PROGRAMLAMA DLNN DER ZELLKLER EK F
mktime fonksiyonu argman tarafndan iaret edilen yap iindeki yerel zaman
takvim zamanna dntrr ve sonucu time_t eklinde dndrr. Eer sonu ifade
edilemezse, -1 dndrlr.
Program almaya baladndan beri ne kadar ilemci zaman kullandn
renmek iin, clock_t tipinden sonu dndren, clock fonksiyonunu arn.
En son olarak, u anki yreye uygun olarak tarih ve saatler ieren karakter dizileri
hazrlamak iin strftime fonksiyonu kullanlabilir. Drt tane argman vardr: Sonuta
uygun formatlanm karakter dizisini ierecek blgeye bir karakter gstergesi; bu karakter
dizisine konulacak en fazla karakter saysn gsteren size_t tipinde bir say;
printftekine benzeyen bir kontrol karakter dizisi ve zaman bilgisini ieren yapya bir
gsterge. Normalde olduu gibi nne % konan, kontrol karakter dizisindeki dnm
tanmlamalar zaman unsurlarn belirtirler ve sonutaki karakter dizisinde kullanlmakta
olan yreye uygun olarak biimlendirilmi ilgili zaman bilgileri ile deitirilirler. Dier
karakterler, tpk printf gibi, deitirilmeden braklrlar. Dnm tanmlamalar ve
anlamlar yledir:
Dnm Karakteri Anlam
a ksaltlm gn ad
A tam gn ad
b ksaltlm ay ad
B tam ay ad
c yerel tarih ve saat gsterimi
d ay iindeki gn
H saat (24 saatlik)
I saat (12 saatlik)
j yl iindeki gn
m ay
M dakika
p AM (leden nce) veya PM (leden sonra)
ifadelerinin yerel edeeri
S saniye
U (Pazar gnnden balamak kouluyla) yl iindeki
hafta says
w hafta iindeki gn
W (Pazartesi gnnden balamak kouluyla) yl
iindeki hafta says
x yerel tarih gsterimi
X yerel saat gsterimi
y yln son iki rakam
Y yl
Z saat dilimi ad
% %
EK F STANDART C PROGRAMLAMA DLNN DER ZELLKLER 173
strftime, en sondaki \0 hari, oluturulan karakter saysn dndrr. Eer bu
say ikinci argmandan bykse, 0 dndrlr.
F.5. Standart Balk Dosyalar
ANSI Standard, deimez, makro ve tip tanmlayan; deiken bildiren ve tm standart
ktphane fonksiyonlarnn prototiplerini ieren 15 tane balk dosyas tanmlar. Bir
ANSI fonksiyonu armadan nce ilgili balk dosyas #include emri ile programa
dahil edilmelidir. Baz gerekletirmelerde, baz fonksiyonlar nilemci makrolar
eklinde tanmlanmlardr. Kullanc asndan bir fonksiyonun gerekten fonksiyon
eklinde mi yoksa makro eklinde mi tanmlanm olduu, bir istisna dnda, farketmez:
Makro argmanlar, parametre makro iinde ka defa kullanlrsa, o kadar kere
hesaplanrlar. Eer argmanlarda yan etkili ile veya fonksiyonlar kullanlrsa, bu sorun
yaratabilir. rnein, baz uygulamalarda tolower ve toupper makro eklinde
ctype.h iinde tanmlanrken, stdlib.h iinde ilgili fonksiyonlarn bildirimi
yaplmaktadr. Eer yan etkisi olmayan ileler ieren argmanlar verecekseniz, daha hzl
olaca iin, makrolar kullanmak daha aklcdr; ancak argmanlar olas yan etkileri olan
karmak ifadeler ise, argmanlarn bir defa hesaplanacaklar ilgili fonksiyonlar arn.
assert.hDiyagnostikler
Bu dosyada, yrtme esnasnda bir sav (mantksal ifadeyi) kontrol edip, eer yanlsa bir
diyagnostik grntleyen bir fonksiyon tanm vardr:
void assert(int)
Eer bu dosya programa ierilmeden nce NDEBUG #define ile tanmlanmsa,
assert ars dikkate alnmaz; aksi takdirde aadakine benzer bir durum gerekleir:
#define assert(exp) { \
if (!(exp)) { \
fprintf(stderr,"Assertion failed: %s, file %s, line %d\n",\
#exp, __FILE__, __LINE__); \
abort(); \
} \
}
ctype.hKarakter Kontrolleri Ve Dnmleri
Bu dosya karakterleri kontrol eden veya deitiren fonksiyonlar ve/veya makrolar bildirir.
Test fonksiyonlar veya makrolar, doru iin sfrdan farkl herhangi bir tamsay, aksi
takdirde sfr dndrrler.
int isalnum(int)
int isalpha(int)
int iscntrl(int)
174 STANDART C PROGRAMLAMA DLNN DER ZELLKLER EK F
int isdigit(int)
int isgraph(int)
int islower(int)
int isprint(int)
int ispunct(int)
int isspace(int)
int isupper(int)
int isxdigit(int)
int tolower(int)
int toupper(int)
errno.hHatalar
Bu dosya errno deikeni iin bir bildirim ierir. Ayrca eitli ktphane fonksiyonlar
tarafndan bir hata durumunu gstermek iin, EDOM, ERANGE gibi, bu deikene
verilebilecek baz sfrdan farkl deimezler tanmlar.
float.hKayan Noktal Deerler in Snrlar
Bu dosya, kayan noktal (yani float, double ve long double) deerler iin baz
deimezler tanmlar. Standart tarafndan kabul edilebilen en kk deerler parantez
iinde gsterilmitir.
FLT_DIG duyarl ondalk rakam says (6)
FLT_EPSILON 1.0+FLT_EPSILON!=1.0 ekilde en kk say (1E-5)
FLT_MANT_DIG FLT_RADIX tabanna gre mantisteki rakam says
FLT_MAX en byk deer (1E+37)
FLT_MAX_10_EXP en byk ondalk s
FLT_MAX_EXP en byk s
FLT_MIN en kk dzgnlenmi pozitif deer (1E-37)
FLT_MIN_10_EXP en kk ondalk s
FLT_MIN_EXP en kk s
FLT_RADIX ssn taban rakam (2)
FLT_ROUNDS toplamada yuvarlama
DBL_DIG duyarl ondalk rakam says (10)
DBL_EPSILON 1.0+DBL_EPSILON!=1.0 ekilde en kk say (1E-9)
DBL_MANT_DIG DBL_RADIX tabanna gre mantisteki rakam says
DBL_MAX en byk deer (1E+37)
DBL_MAX_10_EXP en byk ondalk s
DBL_MAX_EXP en byk s
DBL_MIN en kk dzgnlenmi pozitif deer (1E-37)
DBL_MIN_10_EXP en kk ondalk s
DBL_MIN_EXP en kk s
DBL_RADIX ssn taban rakam
DBL_ROUNDS toplamada yuvarlama
EK F STANDART C PROGRAMLAMA DLNN DER ZELLKLER 175
LDBL_DIG duyarl ondalk rakam says
LDBL_EPSILON 1.0+LDBL_EPSILON!=1.0 ekilde en kk say
LDBL_MANT_DIG LDBL_RADIX tabanna gre mantisteki rakam says
LDBL_MAX en byk deer
LDBL_MAX_10_EXP en byk ondalk s
LDBL_MAX_EXP en byk s
LDBL_MIN en kk dzgnlenmi pozitif deer
LDBL_MIN_10_EXP en kk ondalk s
LDBL_MIN_EXP en kk s
LDBL_RADIX ssn taban rakam
LDBL_ROUNDS toplamada yuvarlama
limits.hTamsay Deerleri in Snrlar
Bu dosya, eitli boylardaki tamsaylar iin baz st ve alt snrlarla ilgili deimezler
tanmlar. Kabul edilebilir en dk deerler parantez iinde gsterilmitir. Yani, bir
derleyici iin INT_MAX 32767den byk olabilir, fakat Standarda uygun hibir
derleyicinin bu saydan kk bir INT_MAX salamasna izin verilmez.
CHAR_BIT bir chardaki bit says (8)
CHAR_MAX en byk char deeri (UCHAR_MAX veya SCHAR_MAX)
CHAR_MIN en kk char deeri (0 veya SCHAR_MIN)
INT_MAX en byk (signed) int deeri (+32767)
INT_MIN en kk (signed) int deeri (-32767)
LONG_MAX en byk (signed) long deeri (+2147483647)
LONG_MIN en kk (signed) long deeri (-2147483647)
SCHAR_MAX en byk signed char deeri (+127)
SCHAR_MIN en kk signed char deeri (-127)
SHRT_MAX en byk (signed) short deeri (+32767)
SHRT_MIN en kk (signed) short deeri (-32767)
UCHAR_MAX en byk unsigned char deeri (255U)
UINT_MAX en byk unsigned int deeri (0xFFFF)
ULONG_MAX en byk unsigned long deeri (0xFFFFFFFF)
USHRT_MAX en byk unsigned short deeri (0xFFFF)
MB_LEN_MAX bir okbaytl karakter iindeki en byk bayt says
locale.hYre Fonksiyonlar
Bu dosya, struct lconv iin bir tip tanmlamas, LC_ALL, LC_COLLATE,
LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME deimezlerinin tanmlarn ve
aadaki fonksiyon prototiplerini ierir:
struct lconv * localeconv(void)
char * setlocale(int, const char *)
176 STANDART C PROGRAMLAMA DLNN DER ZELLKLER EK F
math.hMatematiksel Yordamlar
Bu dosya, birtakm kayan noktal matematik yordamlar tarafndan hata durumunda
dndrlen bir deeri tutmak iin HUGE_VAL adl double deikenini bildirir. Ayrca,
alan hatas veya tama durumlarn gstermek iin srasyla EDOM veya ERANGE deeri
errno deikenine atanr. Fonksiyon prototipleri yledir:
double acos(double)
double asin(double)
double atan(double)
double atan2(double, double)
double ceil(double)
double cos(double)
double cosh(double)
double exp(double)
double fabs(double)
double floor(double)
double fmod(double, double)
double frexp(double, int *)
double ldexp(double, int)
double log(double)
double log10(double)
double modf(double, double *)
double pow(double, double)
double sin(double)
double sinh(double)
double sqrt(double)
double tan(double)
double tanh(double)
setjmp.hYerel Olmayan Atlamalar
Bu dosya, program durumunu saklamak ve tekrar yklemek iin setjmp makrosu ile
longjmp fonksiyonunun kulland jmp_buf adl, makineye bal, bir tampon blge
iin bir tip tanmlar ve ayrca bu yordamlarn bildirimini ierir.
void longjmp(jmp_buf, int)
int setjmp(jmp_buf)
signal.hSinyaller
Bu dosya, yrtme esnasnda kesintileri veya hatalar ilemek iin kullanlan fonksiyonlar
bildirir.
EK F STANDART C PROGRAMLAMA DLNN DER ZELLKLER 177
Sinyal tipleri:
SIGABRT abort ars ile tetiklenen dzensiz sonulanma
SIGFPE kayan noktal ilem hatas
SIGILL hatal komutgeersiz fonksiyon imgesi
SIGINT CONTROL+C kesintisietkileimli dikkat
SIGSEGV bellek snrlar dnda eriim
SIGTERM ldrme sonucu yazlm sonlandrma sinyali
Sinyal ileyi kodlar:
SIG_DFL varsaylan signal ileyii
SIG_IGN dikkate almama
Hata durumunda signal ars tarafndan dndrlen sinyal hata deeri:
SIG_ERR signal hata deeri
Fonksiyon prototipleri:
int raise(int)
void (* signal(int, void (*)(int)))(int)
stdarg.hDeiken Argman Listeleri
Bu dosya, deiken sayda argman alabilen fonksiyonlarn argmanlarna eriebilmesi
iin standart yntemler tanmlar. va_list tipi bir gsterge olarak tanmlanmtr.
tip va_arg(va_list, tip)
void va_end(va_list)
void va_start(va_list, son_argman)
stddef.hStandart Sistem Tanmlar
Bu dosya, NULL gsterge deeri, errno dsal deikenine bir referans ve uygulamaya
bal olarak deien ptrdiff_t (iki gstergenin fark alndnda elde edilen iaretli
deerin tipi), size_t (sizeof ileci tarafndan dndrlen iaretsiz deerin tipi) ve
wchar_t (geni bir karakterin tipi) iin tanmlar iermektedir.
stdio.hStandart Girdi Ve kt
Bu dosya, standart girdi/kt yordamlar tarafndan kullanlan yaplar, deerler, makrolar
ve fonksiyonlar tanmlar. size_t, va_list, fpos_t ve FILE adl tipler; BUFSIZ,
EOF, NULL, FILENAME_MAX (dosya isimlerinde en byk karakter says),
FOPEN_MAX (ayn anda ak olabilecek en ok dosya says), P_tmpnam (geici
dosyalarn alabilecei altdizin), L_tmpnam (geici dosya isimlerinin uzunluu),
TMP_MAX (alabilecek en ok farkl geici dosya isimleri says), SEEK_CUR,
SEEK_END, SEEK_SET, stdin, stdout, stderr, _IOFBF, _IOLBF ve _IONBF
deimezleri bu dosyada tanmlanmlardr. Fonksiyon prototipleri:
178 STANDART C PROGRAMLAMA DLNN DER ZELLKLER EK F
void clearerr(FILE *)
int fclose(FILE *)
int feof(FILE *)
int ferror(FILE *)
int fflush(FILE *)
int fgetc(FILE *)
int fgetpos(FILE *, fpos_t *)
char * fgets(char *, int, FILE *)
FILE * fopen(const char *, const char *)
int fprintf(FILE *, const char *, ...)
int fputc(int, FILE *)
int fputs(const char *, FILE *)
size_t fread(void *, size_t, size_t, FILE *)
FILE * freopen(const char *, const char *,
FILE *)
int fscanf(FILE *, const char *, ...)
int fseek(FILE *, long, int)
int fsetpos(FILE *, const fpos_t *)
long ftell(FILE *)
size_t fwrite(const void *, size_t, size_t,
FILE *)
int getc(FILE *)
int getchar(void)
char * gets(char *)
void perror(const char *)
int printf(const char *, ...)
int putc(int, FILE *)
int putchar(int)
int puts(const char *)
int remove(const char *)
int rename(const char *, const char *)
void rewind(FILE *)
int scanf(const char *, ...)
void setbuf(FILE *, char *)
int setvbuf(FILE *, char *, int, size_t)
int sprintf(char *, const char *, ...)
int sscanf(const char *, const char *, ...)
FILE * tmpfile(void)
char * tmpnam(char *)
int ungetc(int, FILE *)
int vfprintf(FILE *, const char *, va_list)
int vprintf(const char *, va_list)
int vsprintf(char *, const char *, va_list)
stdlib.hSka Kullanlan Ktphane Fonksiyonlar
Bu dosyada, size_t, wchar_t, div_t (divden dndrlen yap) ve ldiv_t
(ldivden dndrlen yap) tipleri ve NULL, RAND_MAX (rand fonksiyonundan
EK F STANDART C PROGRAMLAMA DLNN DER ZELLKLER 179
dndrlen en byk deer), EXIT_SUCCESS (programn baarl exit kodu) ve
EXIT_FAILURE (programn baarsz exit kodu) deimezleri iin tanmlarla
MB_CUR_MAX (u anki yreye gre bir okbaytl karakter iindeki en byk bayt says)
ve errno deikenleri iin bildirimler bulunmaktadr. Fonksiyon prototipleri:
void abort(void)
int abs(int)
int atexit(void (*)(void))
double atof(const char *)
int atoi(const char *)
long atol(const char *)
void * bsearch(const void *, const void *,
size_t, size_t, int (*)(const void *,
const void *))
void * calloc(size_t, size_t)
div_t div(int, int)
void exit(int)
void free(void *)
char * getenv(const char *)
long labs(long)
ldiv_t ldiv(long, long)
void * malloc(size_t)
int mblen(const char *, size_t)
size_t mbstowcs(wchar_t *, const char *, size_t)
int mbtowc(wchar_t *, const char *, size_t)
void perror(const char *)
void qsort(void *, size_t, size_t,
int (*)(const void *, const void *))
int rand(void)
void * realloc(void *, size_t)
void srand(unsigned int)
double strtod(const char *, char **)
long strtol(const char *, char **, int)
unsigned long strtoul(const char *, char **, int)
int system(const char *)
size_t wcstombs(char *, const wchar_t *, size_t)
int wctomb(char *, wchar_t)
Eer tolower makrosu #define ile tanmlanmamsa,
int tolower(int)
Eer toupper makrosu #define ile tanmlanmamsa,
int toupper(int)
string.hKarakter Dizileri leyen Fonksiyonlar
Bu dosya NULL deimezi ile size_t iin bir tip tanm ve aadaki fonksiyon
prototiplerini ierir:
180 STANDART C PROGRAMLAMA DLNN DER ZELLKLER EK F
void * memchr(const void *, int, size_t)
int memcmp(const void *, const void *, size_t)
void * memcpy(void *, const void *, size_t)
void * memmove(void *, const void *, size_t)
void * memset(void *, int, size_t)
char * strcat(char *, const char *)
char * strchr(const char *, int)
int strcmp(const char *, const char *)
int strcoll(const char *, const char *)
char * strcpy(char *, const char *)
size_t strcspn(const char *, const char *)
char * strerror(int)
size_t strlen(const char *)
char * strncat(char *, const char *, size_t)
int strncmp(const char *, const char *,
size_t)
char * strncpy(char *, const char *, size_t)
char * strpbrk(const char *, const char *)
char * strrchr(const char *, int)
size_t strspn(const char *, const char *)
char * strstr(const char *, const char *)
char * strtok(char *, const char *)
size_t strxfrm(char *, const char *, size_t)
time.hTarih Ve Saat Fonksiyonlar
Bu dosya, zaman yordamlar iin bildirimler ile, size_t ve srasyla clock ve time
fonksiyonlar tarafndan dndrlen, uygulamaya bal clock_t ve time_t tiplerinin
tanmlarn ierir. Ayrca, localtime ve gmtime yordamlar tarafndan dndrlp
asctime tarafndan kullanlan yap yle tanmlanmaktadr:
struct tm {
int tm_sec; /* dakikadan sonraki saniyeler: [0,60] */
int tm_min; /* saatten sonraki dakikalar: [0,59] */
int tm_hour; /* geceyarisindan beri saatler: [0,23] */
int tm_mday; /* ayin gunu: [1,31] */
int tm_mon; /* Ocak'tan beri aylar: [0,11] */
int tm_year; /* 1900'dan beri yillar */
int tm_wday; /* Pazar'dan beri gunler: [0,6] */
int tm_yday; /* Ocak 1'den beri gunler: [0,365] */
int tm_isdst; /* Yaz Saati Uygulamasi bayragi */
}
CLOCKS_PER_SEC makrosu, clock()/CLOCKS_PER_SEC ifadesi
araclyla, saniye cinsinden ilemci zamann elde etmek iin kullanlabilir.
Bu dosyada, ayrca, ctime ailesinden yordamlar tarafndan kullanlan kresel
deikenler iin extern bildirimleri de bulunmaktadr:
EK F STANDART C PROGRAMLAMA DLNN DER ZELLKLER 181
int _daylight; /* eger Yaz Saati Uygulamasi kullani-
* liyorsa, sifirdan farkli bir deger */
long _timezone; /* saniye cinsinden Duzenlenmis Evrensel
* Saat ile yerel saat arasindaki fark */
char * _tzname[2]; /* Standart/Yaz Saati dilim isimleri */
Fonksiyon prototipleri:
char * asctime(const struct tm *)
clock_t clock(void)
char * ctime(const time_t *)
double difftime(time_t, time_t)
struct tm * gmtime(const time_t *)
struct tm * localtime(const time_t *)
time_t mktime(struct tm *)
size_t strftime(char *, size_t, const char *,
const struct tm *)
time_t time(time_t *)
F.6. evirme Snrlar
ANSI Standard, Standart C uyumlu her derleyici tarafndan karlanmas gereken
birtakm snrlar tanmlamtr. rnein, tanmlanan bir nesne iin izin verilen en byk
boy 32 767 bayttr; ancak belli bir derleyici, 40 000 karakterlik bir dizi gibi daha byk
bir nesneye izin verebilir. Her durumda, tanabilirlii garantilemek iin programnzn
aada belirtilmi en kk byk snrlar iinde kalmasn salayn:
Bir fonksiyon arsndaki argmanlar.................................................31
Bir nesnedeki baytlar.................................................................... 32 767
Bir switch deyimindeki case etiketleri .........................................257
Mantksal bir kaynak kod satrndaki karakterler ...............................509
Bir karakter dizisi deimezindeki karakterler ...................................509
Bileik deyimler, iie yazma...............................................................15
bir enumdaki deimezler.................................................................127
do, for ve while, iie yazma .........................................................15
Tam bir ifade iindeki ifadeler, iie yazma.........................................32
Bir evirme birimi iindeki dsal tantc szckler ..........................511
Balk dosyalar, iie yazma .................................................................8
Bir blok iindeki, etki alan blok olan, tantc szckler ...................127
if ve switch deyimleri, iie yazma ................................................15
#if, #ifdef ve #ifndef, iie yazma .............................................8
Bir evirme birimi iindeki makro tantc szckleri .................... 1 024
Bir struct veya union iindeki yeler .........................................127
Bir fonksiyon tanmndaki parametreler ...............................................31
Bir makro iindeki parametreler...........................................................31
Bir dsal tantc szck iindeki anlaml karakterler ............................8
182 STANDART C PROGRAMLAMA DLNN DER ZELLKLER EK F
Bir isel tantc szck iindeki anlaml karakterler............................31
struct veya union tanmlar, iie yazma ......................................15
183
EK G: SELM PROBLEMLERE
YANITLAR
Bu ekte, her blmn sonunda verilen problemlerden bazlar iin yantlar verilmitir.
Baz problemler iin deiik zmler de szkonusu olabilir. Burada ilk say blm,
ikinci say ise problemi belirtir.
1.1. unu deneyin
void main (void)
{
int entry;
}
1.4. Evet, x=5; deyimine edeerdir.
1.5. Evet, bo bir blok deyimidir.
1.6. ...
scanf("%f", &x);
printf("%d", (int)x);
...
2.2. switch (yas)
case 16 : printf("...");
2.4. #include <stdio.h>
void main (void)
{
unsigned i, n;
scanf("%u", &n);
for (i=1; i<=n; i++)
printf("%u\t%g\n", i*i, 1.0/i);
}
184 SELM PROBLEMLERE YANITLAR EK G
2.6. #include <stdio.h>
void main (void)
{
int p, c, i;
c = p = getchar();
i = 1;
while (c!=EOF) {
c = getchar();
if (c==p)
i++;
else {
if (i==3)
printf("%c ", p);
p = c;
i = 1;
} /* else */
} /* while */
}
2.8. Satr 32deki doyu uygun bir ekilde whilea evirin.
3.1. Gsterge aritmetiine karlk tamsay aritmetii.
3.2. #include <stdio.h>
void main (void)
{
printf("%s-doldurma\n", (-10>>1<0)?"isaret":"sifir");
}
3.3. #include <stdio.h>
void main (void)
{
unsigned n, b;
scanf("%d", &n);
for (b=0; n!=0; n>>=1)
b += n&1;
printf("%d bit\n", b);
}
3.4. Eer a ve b ayn tipten ise ieriklerini deitirir.
4.1. Hayr! Bundan emin olamayz, nk bu, fonksiyon argmanlarnn hesaplanma
sralarna baldr.
4.2. int maks (int x, ...)
{
int maks, *xg;
for (maks = *(xg=&x); *xg != 0; xg++)
if (maks < *xg)
maks = *xg;
return maks;
}
EK G SELM PROBLEMLERE YANITLAR 185
Tanmda ... ( nokta) geri kalan parametrelerin saylarnn (ve tiplerinin)
belirlenmedii anlamna gelir. Ancak, byle deiken sayda argmanl fonksiyon
yazmann tanabilir yolu bu deildir. Bunun yerine, aada gsterildii gibi,
stdarg.h standart balk dosyasnda tanmlanm bulunan va_start, va_arg
ve va_end makrolar kullanlmaldr.
#include <stdarg.h>
int maks (int x, ...)
{
int m;
va_list xg; /* geri kalan argumanlara gosterge */
va_start(xg, x); /* ilk isimlendirilmemis argumana
* isaret et */
for (m = x; x != 0; x = va_arg(xg,int))
if (x > m)
m = x; /* yeni enbuyuk */
va_end(xg); /* donmeden once temizlik yap */
return m;
}
4.3. lklenmemi otomatik deikenler belirsiz deerler tar. Bu, daha nce ayn adreste
saklanm olan bir otomatik deikenin deeri olabilir.
4.4. Sadece ilk iki register bildirimi dikkate alnr, geri kalanlar auto gibi ilem
grrler. Ayn zamanda bir nceki altrmaya bakn.
4.5. Girilen satrdaki karakterleri tersten basar.
5.1. (a) sfr, yani ilk sayc ve (b) belirsiz bir deer.
5.4. int * tamsayya gsterge,
int *[3] tamsayya 3 gstergeden oluan dizi,
int (*)[3] 3 tamsaydan oluan diziye gsterge,
int *(float) argman float olan ve inte gsterge dndren fonksiyon,
int (*)(void) argman olmayan ve int dndren fonksiyona gsterge.
5.5. a[i,j] ile a[(i,j)] edeerdir, bu da a[j]ye, yani bir gstergeye edeerdir.
5.6. x dizi olmasna karn, a bir gstergedir.
5.8. a deimez bir gstergedir; bundan sonra hep &yyi gstermek zorundadr. Fakat
gsterdii yer, yani y iindeki bilgi deitirilebilir.
b de deimez bir gstergedir, bunun yannda gsterdii yer, yani x de program
tarafndan deitirilemez. Buna ramen, bu yer program dndaki bir sre
tarafndan deitirilmektedir. Yani bnin gsterdii yeri program deitiremez,
sadece okuyabilir.
6.1. typedef int * gosterge;
ile
186 SELM PROBLEMLERE YANITLAR EK G
#define gosterge int *
birbirine benzemektedir, ama
typedef int dizi[N];
#define ile ifade edilemez, onun iin typedef tercih edilir.
6.2. #define dok(x) printf("x = %d\n", x)
Eer Standarda uygun bir nilemciniz varsa, o zaman aadakini kullann:
#define dok(x) printf(#x " = %d\n", x)
7.9. #include <stdlib.h>
void temizle (void)
{
system("CLS");
}
187
EK H: TRKE-NGLZCE VE
NGLZCE-TRKE TERMLER
SZL
Bu kitapta, olanaklar lsnde, ngilizce terimlerden kanlmaya allmtr. Onun
yerine Trkede yaygn olarak kullanlan bilgisayar terimleri veyaCnin zel terimleri
iinyeni Trke karlklar bulunmutur. Okuyucularn terminoloji konusunda fakl
dncelerde olmas doaldr. Ancak bir metnin akcln yitirmemesi ve hi ngilizce
bilmeyen kiilerin de zorlanmadan bilgisayar konusundaki kitaplar okuyabilmeleri iin
ulusal bir bilgisayar terminolojisinin oluturulmas ve gelitirilmesi gerekmektedir. Bu
terminoloji iinde Trkeye girip trkelemi szckler pekala bulunabilir; ancak belli
bir standardn bulunmas esastr. rnein, evirici szcnden birisinin translator,
bakasnn assembler anlamamas gerekir.
Bu ek byle bir dncenin sonucunda ortaya kan ve bu kitapta da kullanlan bir
almann sonucunu vermektedir. lk ksmda, okuyucularmzn kitap iinde
karlatklar Trke terimlerin ngilizce karlklarn bulabilecekleri bir Trke-
ngilizce szlk bulunmaktadr. kinci ksmdaki ngilizce-Trke szlk ise, ngilizce
terimlerin karl olarak hangi Trke terimlerin kullanldn gstermesi asndan
okuyucularmza yardmc olacaktr.
H.1. Trke-ngilizce Szlk
aklama..................................................comment
al parantez, <>....................................angular bracket
ama........................................................unpack
adres .......................................................address
adres alma...............................................address of
adresleme................................................addressing
188 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
a............................................................network
aa kle...................................................master slave
aa.........................................................tree
akm........................................................current
ak izenei ...........................................flowchart
aktarma ...................................................copy, transfer
alan .........................................................field; domain, range
alfasaysal ...............................................alphanumeric
algoritma.................................................algorithm
altizgi, _ ................................................underscore
altdizin....................................................directory
altprogram..............................................subprogram
alttama...................................................underflow
altyordam................................................subroutine
ama program.........................................object program
ana bellek................................................main memory
ana bilgisayar..........................................mainframe, host computer
anahtar ....................................................key; switch; toggle
anahtar szck ........................................keyword
anlambilim..............................................semantics
anlambilimsel..........................................semantic
anlaml rakam.........................................significant digit
anlamsal ..................................................semantic
arabirim..................................................interface
arama ......................................................search, seek
argman..................................................argument
aritmetik mantk birimi ...........................arithmetic and logic unit (ALU)
artm........................................................increment
artrma ....................................................increment
atama deyimi...........................................assignment statement
aygt ........................................................device
ayrc......................................................separator
ayrma.....................................................allocation; partitioning
ayra .......................................................parenthesis
ayrlm szck.......................................reserved word
ayrtrc.................................................parser
azaltma....................................................decrement
bantsal ................................................relational
balam....................................................context
balama ..................................................link
balayc .................................................linker
bakm......................................................maintenance
basamakl ................................................scalar
baslmayan karakter ................................nonprint character
balk ......................................................header
EK H TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL 189
bayrak.....................................................flag
bayt .........................................................byte
belgeleme................................................documentation
belirsiz ....................................................undefined
belirte....................................................specifier
bellek ......................................................memory
bellek ayrma ..........................................storage allocation
bellek snf .............................................storage class
bellenir....................................................mnemonic
benzetim.................................................simulation
benzetme.................................................emulation
biim(lendirme) ......................................format
biimsel ..................................................formal
bildirim...................................................declaration
bildirme ..................................................declare
bileik deyim...........................................compound statement
bilgi.........................................................information
bilgisayar ................................................computer
bilgisayar destekli tasarm......................computer aided design (CAD)
birike.....................................................accumulator
birim.......................................................unit
birleme ..................................................associativity
birletirici................................................assembler
birletirici dil ..........................................assembly language
birletirme...............................................merge
birlik .......................................................union
bit............................................................bit
bitime ....................................................join
bitsel .......................................................bitwise
blok.........................................................block
Boole cebiri ............................................Boolean algebra
bo ..........................................................blank
bo dizgi .................................................null string
bo karakter ............................................null character
boluk karakteri ......................................space character
boy..........................................................size
boyut .......................................................dimension
bl.........................................................slash
bulusal ...................................................heuristic
arma ...................................................call
ar ........................................................call
engelli parantez, {} ...............................brace
evirici ....................................................translator
evresel ...................................................peripheral
evrimd ...............................................offline
190 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
evrimii .................................................online
kt.........................................................output
ift duyarlk ............................................double precision
izelge.....................................................table
izici .......................................................plotter
ok i dzeni ...........................................multitasking
ok kullancl .........................................multiuser
oklama ..................................................multiplexing
oklu.......................................................multiple
zmleme..............................................analysis
znlrlk...........................................resolution
dal ...........................................................branch
dallanma .................................................branching
deer ile ar .........................................call by value
deil ........................................................not
deiken..................................................variable
deimez.................................................constant
denetim...................................................control
denetleme................................................verify
derleme ...................................................compile
derleyici ..................................................compiler
devingen .................................................dynamic
devre.......................................................circuit
deyim......................................................statement
dsal.......................................................external
dikey.......................................................vertical
dil............................................................language
disk .........................................................disk
dizgi ........................................................string
dizi ..........................................................array
dizin........................................................directory; index
dorudan eriim......................................direct access
dorulama...............................................validate
doruluk tablosu .....................................truth table
doruluk-deerli .....................................truth-valued
dolaylama ileci ......................................indirection operator
dolayl adresleme....................................indirect addressing
donanm..................................................hardware
dosya.......................................................file
dosya sonu ..............................................end of file (EOF)
dosya tipi ................................................extension
dkm.....................................................dump
dng......................................................loop
dn ......................................................return
dntrme .............................................convert
EK H TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL 191
dnm.................................................conversion
dnm tanmlamas .............................conversion specification
duraan...................................................static
durak.......................................................tab
dural........................................................static
durma......................................................halt
duyarlk...................................................precision
dm.....................................................node
dk dzeyli dil.....................................low level language
drme ..................................................abort
dzen ......................................................order, scheme
ekran.......................................................screen
elkitab ....................................................manual
emir.........................................................directive
enbyk ..................................................maximum
eniyi ........................................................optimal
eniyiletirici ............................................optimizing
enkk...................................................minimum
erim.........................................................range
eriim......................................................access, retrieval
eriim modu............................................access mode
e(leme).................................................match
eanlaml.................................................synonym
eik .........................................................threshold
eitlik ......................................................equality
elik ........................................................parity
emerkezli...............................................coaxial
ezamanl ................................................synchronous
etiket .......................................................label
etki alan .................................................scope
etkileimli ...............................................interactive
fare..........................................................mouse
fonksiyon ................................................function
gei........................................................pass, run
gei sresi..............................................run time
genileme................................................extension
gerek adres............................................actual address
gerek zaman..........................................real time
gerekletirme.........................................implementation
geri alma .................................................backspace
geriye dn (yapma) .............................backtrack
getirme....................................................fetch
girdi ........................................................input
girdi/kt (G/) ......................................input/output (I/O)
greli adres .............................................relative address
192 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
grev.......................................................task
grnt bellek.........................................virtual memory
grnt noktas .......................................pixel
grnm..................................................configuration
gsterge ..................................................pointer
gsterim..................................................notation
gncelletirme.........................................update
gvenilirlik .............................................reliability
hareket ....................................................transaction
hata .........................................................bug, error
hata dzelticisi ........................................debugger
hata dzeltme..........................................debug
hedef .......................................................destination
hesaplama ...............................................evaluate
ierik.......................................................content
iie ........................................................nested
isel.........................................................internal
ifade........................................................expression
ikil...........................................................bit
ikili .........................................................binary
ikili dmlenmi onlu yazm.................binary coded decimal (BCD)
ikiye tmler.............................................twos complement
ileti..........................................................prompt
iletiim....................................................communication
iliki ........................................................relation
ilikisel....................................................relational
ilk deer atama .......................................initialize
ilkleme ....................................................initialize
ilkleyen ...................................................initializer
imle .......................................................cursor
indis ........................................................subscript; index
indisleme.................................................indexing
iptal.........................................................cancel
istee bal..............................................optional
i .............................................................job
iaret .......................................................mark; sign
iaret biti .................................................sign bit
iaretsiz...................................................unsigned
ile.........................................................operator
ileklik ....................................................activity
ilem.......................................................operation
ilem kodu ..............................................opcode
ilem operatr.......................................operator
ilemci ....................................................operator
ileme......................................................processing
EK H TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL 193
ilenen.....................................................operand
iletilebilir...............................................executable
iletim sistemi .........................................operating system
iletme ....................................................execution
iz.............................................................track
izleme .....................................................trace
kabuk ......................................................shell
ka sras ..............................................escape seqence
ka tuu ................................................escape key
kalp........................................................cast; pattern
kaltm.....................................................inheritance
karakter...................................................character
karakter dizisi .........................................string
karakter sras..........................................character sequence
karar........................................................decision
kayan noktal...........................................floating point
kaydrma.................................................shift
kayt ........................................................record
kayma .....................................................scroll
kaynak program......................................source program
kesilme noktas .......................................breakpoint
kesim......................................................sector; segment
kesinti .....................................................interrupt
ksaad......................................................acronym
ksm.......................................................section
kiisel bilgisayar .....................................personal computer (PC)
kitaplk....................................................library
klavye .....................................................keyboard
kod..........................................................code
kod zme...............................................decode
kodlama ..................................................coding, encode
komut......................................................command, instruction
kontrol ....................................................control
kontrol ak ............................................control flow
kontrol karakteri .....................................control character
konum.....................................................position; offset
kopyalama...............................................copy
koullu dallanma.....................................conditional branch
koulsuz dallanma...................................unconditional branch
kk..........................................................radix
keli parantez, [] ...................................bracket
kullanc ..................................................user
kullanc-tanml......................................user-defined
kullanma .................................................reference
kurgu.......................................................setup
194 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
kurulu ....................................................installation
kuak.......................................................generation
kuyruk.....................................................queue, tail
kme .......................................................set
kme komut ileme.................................pipelining, piping
knye ......................................................tag
kresel ....................................................global
ktphane ...............................................library
liste .........................................................list
makine dili ..............................................machine language
makro......................................................macro
mantk.....................................................logic
mantksal kaydrma.................................logical shift
men .......................................................menu
merkezi ilem birimi (MB)....................central processing unit (CPU)
mesaj.......................................................message
metin.......................................................text
metin dzenleme.....................................editing
metin dzenleyici....................................editor
mikroilemci ...........................................microprocessor
mimari.....................................................architecture
mod.........................................................mode
modler...................................................modular
monitr ...................................................monitor
mutlak adres............................................absolute address
nesne.......................................................object
nesneye dayal.........................................object oriented
niteleyici .................................................qualifier
nitelik......................................................attribute
okunakllk..............................................readability
olumlu say .............................................positive number
olumsuz say ...........................................negative number
olumsuzlama...........................................negation
onaltl gsterim......................................hexadecimal notation
ondalk....................................................decimal
ortam.......................................................environment, medium
otomasyon...............................................automation
otomatik..................................................automatic
bek........................................................block
n bellek .................................................cache memory
ncelik ....................................................priority, precedence
nek ........................................................prefix
nilemci.................................................preprocessor
nykleme ..............................................bootstrapping
rneksel ..................................................analog
EK H TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL 195
rt .........................................................mask
zar ....................................................recursion
zarl ..................................................recursive
zdevimli ................................................automatic
zdevinim...............................................automation
zel karakter ...........................................special character
zellik.....................................................property
paketleme................................................packing
parametre................................................parameter
parantez ..................................................parenthesis
pencere ...................................................window
plan.........................................................schema
program..................................................program
program sayac........................................program counter
programc................................................programmer
programlama dili.....................................programming language
rakam......................................................digit
rastgele eriimli bellek............................random access memory (RAM)
rastgele say ............................................random number
referans ...................................................reference
referans ile ar .....................................call by reference
saat..........................................................clock
sabit ........................................................constant
saa yanatrma.......................................right justify
saklama...................................................save, store
salt okunur bellek....................................read only memory (ROM)
satr ilerletme..........................................line feed
satrba...................................................carriage return
satrii .....................................................inline
saya .......................................................counter
sayfa ilerletme.........................................form feed
say gsterimi..........................................number representation
sayc.......................................................enumerator
sayl .......................................................enumerated
saym.......................................................enumeration
saysal .....................................................digital, numeric
saysal tular ...........................................numerical keypad
seme......................................................select
sekizli......................................................octal
sfr doldurma .........................................zerofill
sfrlama..................................................reset
sfrlarn kaldrlmas ..............................zero suppression
sa .........................................................capacity
sktrma ................................................compression
snama.....................................................test
196 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
snf.........................................................class
snflandrma...........................................taxonomy
snrlayc ................................................delimiter
sra ..........................................................order, sequence
sralama ..................................................sort
sral eriim.............................................sequential access
silme .......................................................clear
simge ......................................................symbol
sistem......................................................system
sola yanak ............................................left justified
sonek.......................................................postfix
sorgu(lama).............................................query
soyut .......................................................abstract
szck.....................................................word
szck ileme..........................................word processing
szck uzunluu .....................................word length
szde kod................................................pseudo code
szde komut............................................pseudo instruction
szdizim..................................................syntax
szdizimsel .............................................syntactic
sre .......................................................process
src .....................................................driver; drive
ifre.........................................................password
imdiki ....................................................current
taban .......................................................base
tahteravalli ..............................................flip flop
tampon....................................................buffer
tamsay....................................................integer
tanm.......................................................definition
tanmlama ...............................................define
tanmlayc ..............................................descriptor
tanmsz...................................................undefined
tantc szck.........................................identifier
tarama .....................................................scan
tasarm....................................................design
tanabilir ................................................portable
tama.......................................................overflow
tekli.........................................................unary
temel adres..............................................base address
ters bl..................................................backslash
tez sralama.............................................quick sort
tikel.........................................................partial
tip............................................................type
toplama ...................................................add
tutamak ...................................................handle
EK H TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL 197
tuzak .......................................................trap
tmleik ..................................................integrated
tretilmi tip............................................derived type
u ............................................................terminal
uyar mesaj ............................................warning message
uyarlama .................................................version
uygulama ................................................application
uyumlu....................................................compatible
uzaklk ....................................................offset
nokta, ... .............................................ellipsis
l.........................................................ternary
l harf..................................................trigraph
s ............................................................exponent; superscript
ye ..........................................................member
varsaylan deer......................................default value
vazgeme ................................................abort
ve ............................................................and
veri..........................................................data
veritaban ................................................database
versiyon ..................................................version
veya ........................................................or
yama .......................................................patch
yan etki ...................................................side-effect
yanatrma...............................................justify
yant sresi..............................................response time
yapay anlay ..........................................artificial intelligence
yap .........................................................structure
yap ad ...................................................structure tag
yapii .....................................................intrinsic
yapsal.....................................................structured
yardmc program...................................utility
yaylma aral ........................................range
yazc ......................................................printer
yazlm....................................................software
yazm......................................................notation
yazma-koruma ........................................write-protect
yazma....................................................register
yedek(leme) ............................................backup
yeni satr .................................................newline
yeniden ynlendirme...............................redirection
yeniden ykleme.....................................restore
yerdeiir ................................................relocatable
yerel ........................................................local
yerleen (-ik) .........................................resident
yerpaylam.............................................overlay
198 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
yt.........................................................stack
yldz.......................................................asterisk
yineleme .................................................iteration
yinelemeli ...............................................iterative
yol...........................................................path
yonga ......................................................chip
yordam....................................................procedure, routine
yorumlayc .............................................interpreter
yntem....................................................method
yre.........................................................locale
yumuak disk ..........................................floppy disk, diskette
ykleme ..................................................load
ykleyici .................................................loader
yksek dzeyli dil ...................................high level language
yrtme...................................................execution
yrtlebilir ............................................executable
zaman uyumsuz.......................................asynchronous
zamanpaylam.......................................timesharing
zil ............................................................bell
H.2. ngilizce-Trke Szlk
abort........................................................drme, vazgeme
absolute address......................................mutlak adres
abstract ...................................................soyut
access......................................................eriim
access mode............................................eriim modu
accumulator ............................................birike
acronym..................................................ksaad
activity....................................................ileklik
actual address .........................................gerek adres
add..........................................................toplama
address....................................................adres
address of................................................adres alma
addressing...............................................adresleme
algorithm.................................................algoritma
allocation ................................................ayrma
alphanumeric ..........................................alfasaysal
analog .....................................................rneksel
analysis ...................................................zmleme
and ..........................................................ve
angular bracket, <>.................................al parantez
application ..............................................uygulama
argument .................................................argman
EK H TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL 199
architecture .............................................mimari
arithmetic and logic unit (ALU) .............aritmetik mantk birimi
array........................................................dizi
artificial intelligence ...............................yapay anlay
assembler ................................................birletirici
assembly language ..................................birletirici dil
assignment statement ..............................atama deyimi
associativity............................................birleme
asterisk....................................................yldz
asynchronous ..........................................zaman uyumsuz
attribute...................................................nitelik
automatic ................................................zdevimli, otomatik
automation..............................................zdevinim, otomasyon
backslash ................................................ters bl
backspace................................................geri alma
backtrack ................................................geriye dn (yapma)
backup ....................................................yedek(leme)
base.........................................................taban
base address............................................temel adres
bell ..........................................................zil
binary......................................................ikili
binary coded decimal (BCD) ..................ikili dmlenmi onlu yazm
bit............................................................bit, ikil
bitwise ....................................................bitsel
blank.......................................................bo
block.......................................................blok, bek
Boolean algebra......................................Boole cebiri
bootstrapping..........................................nykleme
brace, {} .................................................engelli parantez
bracket, [] ...............................................keli parantez
branch.....................................................dal
branching................................................dallanma
breakpoint ...............................................kesilme noktas
buffer ......................................................tampon
bug..........................................................hata
byte .........................................................bayt
cache memory.........................................n bellek
call ..........................................................arma, ar
call by reference .....................................referans ile ar
call by value............................................deer ile ar
cancel......................................................iptal
capacity...................................................sa
carriage return.........................................satrba
cast..........................................................kalp
central processing unit (CPU).................merkezi ilem birimi (MB)
200 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
character .................................................karakter
character sequence..................................karakter sras
chip.........................................................yonga
circuit......................................................devre
class ........................................................snf
clear ........................................................silme
clock .......................................................saat
coaxial ....................................................emerkezli
code ........................................................kod
coding.....................................................kodlama
command ................................................komut
comment .................................................aklama
communication .......................................iletiim
compatible ..............................................uyumlu
compile ...................................................derleme
compiler..................................................derleyici
compound statement ...............................bileik deyim
compression............................................sktrma
computer .................................................bilgisayar
computer aided design (CAD) ................bilgisayar destekli tasarm
conditional branch ..................................koullu dallanma
configuration...........................................grnm
constant...................................................deimez, sabit
content ....................................................ierik
context ....................................................balam
control.....................................................kontrol, denetim
control character .....................................kontrol karakteri
control flow............................................kontrol ak
conversion ..............................................dnm
conversion specification .........................dnm tanmlamas
convert ....................................................dntrme
copy........................................................aktarma, kopyalama
counter ....................................................saya
current.....................................................imdiki; akm
cursor ......................................................imle
data .........................................................veri
database ..................................................veritaban
debug ......................................................hata dzeltme
debugger .................................................hata dzelticisi
decimal ...................................................ondalk
decision...................................................karar
declaration ..............................................bildirim
declare ....................................................bildirme
decode.....................................................kod zme
decrement ...............................................azaltma
EK H TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL 201
default value ...........................................varsaylan deer
define......................................................tanmlama
definition ................................................tanm
delimiter..................................................snrlayc
derived type ............................................tretilmi tip
descriptor ................................................tanmlayc
design......................................................tasarm
destination ..............................................hedef
device .....................................................aygt
digit.........................................................rakam
digital......................................................saysal
dimension ...............................................boyut
direct access............................................dorudan eriim
directive..................................................emir
directory..................................................(alt)dizin
disk .........................................................disk
documentation ........................................belgeleme
domain....................................................alan
double precision .....................................ift duyarlk
drive........................................................src
driver ......................................................src
dump.......................................................dkm
dynamic ..................................................devingen
editing.....................................................metin dzenleme
editor.......................................................metin dzenleyici
ellipsis, ................................................... nokta
emulation................................................benzetme
encode.....................................................kodlama
end of file (EOF) ....................................dosya sonu
enumerated .............................................sayl
enumeration ............................................saym
enumerator..............................................sayc
environment ............................................ortam
equality...................................................eitlik
error ........................................................hata
escape key...............................................ka tuu
escape seqence........................................ka sras
evaluate...................................................hesaplama
executable...............................................iletilebilir, yrtlebilir
execution ................................................iletme, yrtme
exponent .................................................s
expression...............................................ifade
extension.................................................genileme; dosya tipi
external ...................................................dsal
fetch........................................................getirme
202 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
field.........................................................alan
file...........................................................dosya
flag..........................................................bayrak
flip flop...................................................tahteravalli
floating point ..........................................kayan noktal
floppy disk..............................................yumuak disk (disket)
flowchart.................................................ak izenei
form feed ................................................sayfa ilerletme
formal .....................................................biimsel
format .....................................................biim(lendirme)
function...................................................fonksiyon
generation ...............................................kuak
global ......................................................kresel
halt ..........................................................durma
handle .....................................................tutamak
hardware .................................................donanm
header .....................................................balk
heuristic ..................................................bulusal
hexadecimal notation..............................onaltl gsterim
high level language.................................yksek dzeyli dil
host computer .........................................ana bilgisayar
identifier .................................................tantc szck
implementation .......................................gerekletirme
increment ................................................artm, artrma
index.......................................................indis; dizin
indexing..................................................indisleme
indirect addressing..................................dolayl adresleme
indirection operator ................................dolaylama ileci
information .............................................bilgi
inheritance ..............................................kaltm
initialize..................................................ilkleme, ilk deer atama
initializer.................................................ilkleyen
inline.......................................................satrii
input........................................................girdi
input/output (I/O)....................................girdi/kt (G/)
installation ..............................................kurulu
instruction...............................................komut
integer.....................................................tamsay
integrated................................................tmleik
interactive ...............................................etkileimli
interface..................................................arabirim
internal....................................................isel
interpreter ...............................................yorumlayc
interrupt ..................................................kesinti
intrinsic...................................................yapii
EK H TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL 203
iteration...................................................yineleme
iterative...................................................yinelemeli
job...........................................................i
join..........................................................bitime
justify......................................................yanatrma
key ..........................................................anahtar
keyboard .................................................klavye
keyword ..................................................anahtar szck
label ........................................................etiket
language..................................................dil
left justified.............................................sola yanak
library .....................................................ktphane, kitaplk
line feed ..................................................satr ilerletme
link..........................................................balama
linker.......................................................balayc
list ...........................................................liste
load.........................................................ykleme
loader......................................................ykleyici
local ........................................................yerel
locale ......................................................yre
logic........................................................mantk
logical shift .............................................mantksal kaydrma
loop.........................................................dng
low level language ..................................dk dzeyli dil
machine language ...................................makine dili
macro......................................................makro
main memory..........................................ana bellek
mainframe...............................................ana bilgisayar
maintenance............................................bakm
manual ....................................................elkitab
mark........................................................iaret
mask........................................................rt
master slave ............................................aa kle
match ......................................................e(leme)
maximum................................................enbyk
medium...................................................ortam
member ...................................................ye
memory...................................................bellek
menu .......................................................men
merge......................................................birletirme
message...................................................mesaj
method....................................................yntem
microprocessor .......................................mikroilemci
minimum.................................................enkk
mnemonic ...............................................bellenir
204 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
mode .......................................................mod
modular...................................................modler
monitor ...................................................monitr
mouse......................................................fare
multiple...................................................oklu
multiplexing............................................oklama
multiuser .................................................ok kullancl
multitasking ............................................ok i dzeni
negation ..................................................olumsuzlama
negative number .....................................olumsuz say
nested......................................................iie
network...................................................a
newline ...................................................yeni satr
node ........................................................dm
nonprint character ...................................baslmayan karakter
not...........................................................deil
notation...................................................gsterim, yazm
null character ..........................................bo karakter
null string................................................bo dizgi
number representation ............................say gsterimi
numeric...................................................saysal
numerical keypad....................................saysal tular
object ......................................................nesne
object oriented........................................nesneye dayal
object program........................................ama program
octal ........................................................sekizli
offline .....................................................evrimd
offset .......................................................konum, uzaklk
online......................................................evrimii
opcode ....................................................ilem kodu
operand...................................................ilenen
operating system.....................................iletim sistemi
operation.................................................ilem
operator...................................................ile, ilemci, ilem operatr
optimal....................................................eniyi
optimizing...............................................eniyiletirici
optional...................................................istee bal
or ............................................................veya
order .......................................................dzen, sra
output......................................................kt
overflow..................................................tama
overlay....................................................yerpaylam
packing ...................................................paketleme
parameter ................................................parametre
parenthesis ..............................................parantez, ayra
EK H TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL 205
parity.......................................................elik
parser ......................................................ayrtrc
partial......................................................tikel
partitioning .............................................ayrma
pass.........................................................gei
password.................................................ifre
patch .......................................................yama
path.........................................................yol
pattern.....................................................kalp
peripheral................................................evresel
personal computer (PC) ..........................kiisel bilgisayar
pipelining................................................kme komut ileme
piping......................................................kme komut ileme
pixel ........................................................grnt noktas
plotter .....................................................izici
pointer.....................................................gsterge
portable...................................................tanabilir
position...................................................konum
positive number ......................................olumlu say
postfix.....................................................sonek
precedence..............................................ncelik
precision .................................................duyarlk
prefix ......................................................nek
preprocessor ...........................................nilemci
printer .....................................................yazc
priority....................................................ncelik
procedure................................................yordam
process....................................................sre
processing...............................................ileme
program..................................................program
program counter......................................program sayac
programmer ............................................programc
programming language ...........................programlama dili
prompt ....................................................ileti
property ..................................................zellik
pseudo code ............................................szde kod
pseudo instruction...................................szde komut
qualifier ..................................................niteleyici
query.......................................................sorgu(lama)
queue ......................................................kuyruk
quick sort ................................................tez sralama
radix........................................................kk
random access memory (RAM) ..............rastgele eriimli bellek
random number.......................................rastgele say
range .......................................................erim, alan, yaylma aral
206 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
read only memory (ROM) ......................salt okunur bellek
readability...............................................okunakllk
real time..................................................gerek zaman
record......................................................kayt
recursion.................................................zar
recursive .................................................zarl
redirection...............................................yeniden ynlendirme
reference .................................................referans, kullanma
register ....................................................yazma
relation....................................................iliki
relational .................................................bantsal, ilikisel
relative address .......................................greli adres
reliability ................................................gvenilirlik
relocatable ..............................................yerdeiir
reserved word .........................................ayrlm szck
reset ........................................................sfrlama
resident ...................................................yerleen, yerleik
resolution................................................znlrlk
response time..........................................yant sresi
restore.....................................................yeniden ykleme
retrieval...................................................eriim
return ......................................................dn
right justify .............................................saa yanatrma
routine.....................................................yordam
run...........................................................gei
run time...................................................gei sresi
save.........................................................saklama
scalar.......................................................basamakl
scan.........................................................tarama
schema ....................................................plan
scheme ....................................................dzen
scope.......................................................etki alan
screen......................................................ekran
scroll .......................................................kayma
search......................................................arama
section.....................................................ksm
sector ......................................................kesim
seek.........................................................arama
segment...................................................kesim
select.......................................................seme
semantic..................................................anlambilimsel, anlamsal
semantics ................................................anlambilim
separator .................................................ayrc
sequence .................................................sra
sequential access.....................................sral eriim
EK H TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL 207
set ...........................................................kme
setup .......................................................kurgu
shell ........................................................kabuk
shift .........................................................kaydrma
side-effect ...............................................yan etki
sign .........................................................iaret
sign bit ....................................................iaret biti
significant digit .......................................anlaml rakam
simulation ...............................................benzetim
size..........................................................boy
slash........................................................bl
software ..................................................yazlm
sort ..........................................................sralama
source program.......................................kaynak program
space character .......................................boluk karakteri
special character .....................................zel karakter
specifier ..................................................belirte
stack........................................................yt
statement.................................................deyim
static .......................................................dural, duraan
storage allocation....................................bellek ayrma
storage class............................................bellek snf
store ........................................................saklama
string.......................................................karakter dizisi, dizgi
structure..................................................yap
structure tag ............................................yap ad
structured................................................yapsal
subprogram.............................................altprogram
subroutine ...............................................altyordam
subscript..................................................indis
superscript ..............................................s
switch......................................................anahtar
symbol ....................................................simge
synchronous............................................ezamanl
synonym..................................................eanlaml
syntactic..................................................szdizimsel
syntax......................................................szdizim
system.....................................................sistem
tab...........................................................durak
table ........................................................izelge
tag...........................................................knye
tail...........................................................kuyruk
task .........................................................grev
taxonomy................................................snflandrma
terminal...................................................u
208 TRKE-NGLZCE VE NGLZCE-TRKE TERMLER SZL EK H
ternary.....................................................l
test ..........................................................snama
text ..........................................................metin
threshold .................................................eik
timesharing .............................................zamanpaylam
toggle......................................................anahtar
trace ........................................................izleme
track........................................................iz
transaction ..............................................hareket
transfer....................................................aktarma
translator.................................................evirici
trap..........................................................tuzak
tree..........................................................aa
trigraph ...................................................l harf
truth table................................................doruluk tablosu
truth-valued.............................................doruluk-deerli
twos complement ....................................ikiye tmler
type .........................................................tip
unary.......................................................tekli
unconditional branch ..............................koulsuz dallanma
undefined................................................belirsiz, tanmsz
underflow................................................alttama
underscore, _ ..........................................altizgi
union.......................................................birlik
unit..........................................................birim
unpack ....................................................ama
unsigned..................................................iaretsiz
update .....................................................gncelletirme
user .........................................................kullanc
user-defined ............................................kullanc-tanml
utility ......................................................yardmc program
validate ...................................................dorulama
variable ...................................................deiken
verify ......................................................denetleme
version ....................................................uyarlama, versiyon
vertical ....................................................dikey
virtual memory........................................grnt bellek
warning message.....................................uyar mesaj
window...................................................pencere
word........................................................szck
word length.............................................szck uzunluu
word processing......................................szck ileme
write-protect ...........................................yazma-koruma
zero suppression .....................................sfrlarn kaldrlmas
zerofill ....................................................sfr doldurma
209
BBLYOGRAFYA
Bach, Maurice J. The Design of the UNIX Operating System. Englewood Cliffs, NJ:
Prentice-Hall, 1986.
Bolon, C. Mastering C. Berkeley, CA: Sybex, 1986.
Bolsky, Morris I. The C Programmers Handbook. Englewood Cliffs, NJ: Prentice-Hall,
1985.
Brown, D. L. From Pascal to C. Belmont, CA: Wadsworth, 1985.
Butzen, Fred, Porting to ANSI C, UNIX World, May-June 1989.
BYTE. McGraw-Hill Inc., August 1983.
BYTE. McGraw-Hill Inc., August 1988.
Campbell, Joe. Crafting C Tools for the IBM PCs. Englewood Cliffs, NJ: Prentice-Hall,
1986.
Costales, Bryan. C: From A to Z. Englewood Cliffs, NJ: Prentice-Hall, 1985.
Curry, David A. Using C on the UNIX System: A Guide to System Programming.
Sebastopol, CA: OReilly & Associates, 1991.
Feuer, Alan R. The C Puzzle Book. Englewood Cliffs, NJ: Prentice-Hall, 1982.
Gehani, N. Advanced C: Food for the Educated Palate. Rockville, Md.: Computer
Science Press, 1985.
Hancock, Les and Morris Krieger. The C Primer. 2nd ed. New York, NY: McGraw-Hill,
1986.
Harbison, Samuel P. and Guy L. Steele, Jr. C: A Reference Manual. Englewood Cliffs,
NJ: Prentice-Hall, 1984.
Holub, Allen. The C Companion. Englewood Cliffs, NJ: Prentice-Hall, 1987.
210 BBLYOGRAFYA
Holzner, Steven. PS/2-PC Assembly Language. New York, NY: Brady, 1989.
Jaeschke, Rex, Standard C: A status report, Dr. Dobbs Journal, August 1991.
Kelley, A. and I. Pohl. An Introduction to Programming in C. Menlo Park, CA:
Benjamin/Cummings, 1984.
Kernighan, Brian W. and Dennis M. Ritchie. The C Programming Language. Englewood
Cliffs, NJ: Prentice-Hall, 1978.
Kernighan, Brian W. and Dennis M. Ritchie. The C Programming Language. 2nd ed.
Englewood Cliffs, NJ: Prentice-Hall, 1988.
Ladd, Scott Robert. C++ Techniques and Applications. Redwood City, CA: M&T Books,
1990.
Lippman, Stanley B. C++ Primer. 2nd ed. Reading, MA: Addison-Wesley, 1993.
Microsoft C for the MS-DOS Operating System, Version 5.00, Run-time Library
Reference. Microsoft Corporation, 1987.
Microsoft C for the MS-DOS Operating System, Version 5.00, Mixed Language
Programming Guide. Microsoft Corporation, 1987.
Microsoft Macro Assembler for the MS-DOS Operating System, Users Guide.
Microsoft Corporation, 1985.
Microsoft

QuickC Compiler for IBM

Personal Computers and Compatibles,


Microsoft Corporation, 1987.
Microsoft Visual C++ Development System for Windows, Introduction (Presenting
Visual C++). Redmond, WA: Microsoft Corporation, 1993.
Microsoft Visual C++ Development System for Windows, Users Guides (Visual
Workbench Users Guide, App Studio Users Guide). Redmond, WA: Microsoft
Corporation, 1993.
Microsoft Visual C++ Development System for Windows, Programmers Guides
(C++ Tutorial, Class Library Users Guide, Programming Techniques). Redmond,
WA: Microsoft Corporation, 1993.
Microsoft Visual C++ Development System for Windows, Professional Tools
Users Guides (Programming Tools for Windows, CodeView Debugger Users
Guide, Command-line Utilities Users Guide, Source Profiler Users Guide).
Redmond, WA: Microsoft Corporation, 1993.
Microsoft Visual C++ Development System for Windows, Reference, Vol. 1-3
(Class Library Reference; C Language Reference, C++ Language Reference; Run-
time Library Reference, iostream Class Library Reference). Redmond, WA:
Microsoft Corporation, 1993.
Microsoft Visual C++ Development System for Windows, Comprehensive Index.
Redmond, WA: Microsoft Corporation, 1993.
BBLYOGRAFYA 211
Microsoft Visual C++ Development System for Windows, C/C++ Version 7.0
Update. Redmond, WA: Microsoft Corporation, 1993.
Oualline, Steve. Practical C Programming. Sebastopol, CA: OReilly & Associates,
1993.
Plauger, P. J. and Jim Brodie. Standard C.
Plum, Thomas. C Programming Guidelines. Englewood Cliffs, NJ: Prentice-Hall, 1984.
Plum, Thomas. Learning to Program in C. Englewood Cliffs, NJ: Prentice-Hall, 1983.
Plum, Thomas. Notes on the Draft C Standard. Cardiff, NJ: 1988.
Prosser, David F. Draft proposed American National Standard for Information Systems
Programming Language C X3 Secretariat, CBEMA, Washington.
Schildt, Herbert. Windows NT Programming Handbook. Berkeley, CA: Osborne
McGraw-Hill, 1993.
Stroustrup, Bjarne. The C++ Programming Language. Reading, MA: Addison-Wesley,
1986.
Stroustrup, Bjarne. The C++ Programming Language. 2nd ed. Reading, MA: Addison-
Wesley, 1993.
Tanenbaum, Aaron M., Yedidyah Langsam, and Moshe J. Augenstein. Data Structures
Using C. Englewood Cliffs, NJ: Prentice-Hall, 1990.
Tanenbaum, Andrew S. Operating Systems: Design and Implementation. Englewood
Cliffs, NJ: Prentice-Hall, 1987.
The Waite Group. Advanced C Programming. Englewood Cliffs, NJ: Prentice-Hall,
1986.
Tondo, Clovis L. and Scott E. Gimpel. The C Answer Book. 1st ed. Englewood Cliffs, NJ:
Prentice-Hall, 1985.
Tondo, Clovis L. and Scott E. Gimpel. The C Answer Book. 2nd ed. Englewood Cliffs,
NJ: Prentice-Hall, 1988.
Varhol, Peter D. Object-Oriented Programming: The Software Development Revolution.
Charleston, South Carolina: Computer Technology Research Corp., 1993.
Waite, M., S. Prata, and D. Martin. C Primer Plus. Indianapolis, IN: Howard W. Sams &
Co., 1984.
Wiener, Richard S. and Lewis J. Pinson. An Introduction to Object-Oriented
Programming and C++. Reading, MA: Addison-Wesley, 1988.
Williams, Mark. ANSI C Lexical Guide. Englewood Cliffs, NJ: Prentice-Hall, 1988.
Wortman, Leon A. and Thomas O. Sidebottom. The C Programming Tutor. Englewood
Cliffs, NJ: Prentice-Hall, 1984.
213
DZN
#
#define, 12, 110
#elif, 113
#else, 113
#endif, 113
#error, 115
#if, 113
#ifdef, 113
#ifndef, 113
#include, 12, 112
#line, 115
#pragma, 115
#undef, 111
_
__asm, 162
__DATE__, 115
__FILE__, 115
__LINE__, 115
__STDC__, 115
__TIME__, 115
_cgets, 166
_close, 127
_creat, 126
_daylight, 181
_emit, 162
_exit, 125
_getch, 21
_getche, 21
_IOFBF, 125, 177
_IOLBF, 125, 177
_IONBF, 125, 177
_int86, 163
_lseek, 127
_O_CREAT, 127
_O_RDONLY, 127
_open, 127
_read, 127
_S_IREAD, 126
_S_IWRITE, 126
_timezone, 181
_tzname, 181
_write, 127
A
abort, 177, 179
abs, 179
acos, 176
aklama, 5
adm modu, 152
alan, 96
altdizin, 124
anahtar, 130
anahtar szck, 6
ANSI, 2
ANSI karakter kmesi, 136
ANSI Standard, 3, 25, 92, 149, 169, 173, 181
argc, 68
argman, 62
argv, 68
aritmetik kaydrma, 54
ASCII karakter kmesi, 135
asctime, 171, 181
214 DZN
asin, 176
assert, 173
assert.h, 173
atama, 13
atan, 176
atan2, 176
atexit, 179
atof, 52, 179
atoi, 52, 179
atol, 52, 179
auto, 70
B
balama, 59, 68, 146, 149
balayc, 59, 60, 63, 148, 159
balang adresi, 80
balk dosyalar, 12
balk dosyas, 112
bayt, 46
bellek modeli, 146
bellek snf, 69
bellek snf belirteci, 93
beyaz karakter, 20
biimsel argman, 61, 111
bildirim, 72
bileik deyim, 21
bire tmler ileci, 54
birleme, 14, 57
birletirici dil, 159
birlik, 95
bit, 46
bitsel ile, 53
blok, 21, 61
bo deyim, 30, 34, 37
bo karakter, 8, 9
break, 39
bsearch, 179
BUFSIZ, 125, 177
byk model, 146
C
C, 1
C++, 2
calloc, 98, 179
case, 41
ceil, 176
char, 10
CHAR_BIT, 175
CHAR_MAX, 175
CHAR_MIN, 175
clearerr, 178
clock, 172, 181
clock_t, 172, 180
CLOCKS_PER_SEC, 180
Codeview, 151
const, 10, 67
continue, 38
cos, 176
cosh, 176
ctime, 171, 181
ctype.h, 116, 173
C
ar
deer ile, 64, 160
referans ile, 64, 160
evirme snrlar, 181
kt, 17
okbaytl karakter, 170
D
DBL_DIG, 44, 174
DBL_EPSILON, 174
DBL_MANT_DIG, 174
DBL_MAX, 174
DBL_MAX_10_EXP, 174
DBL_MAX_EXP, 174
DBL_MIN, 174
DBL_MIN_10_EXP, 174
DBL_MIN_EXP, 174
DBL_RADIX, 174
DBL_ROUNDS, 174
default, 41
defined, 113
deer ile ar, 64, 160
deiken, 9
dsal, 72
dural, 71
otomatik, 70
yazma, 70
deiken gsterge, 50, 75
deimez, 7
ift duyarlkl, 8
drtl duyarlkl, 8
karakter, 8
karakter dizisi, 9
kayan noktal, 7
ksa tamsay, 7
DZN 215
onaltl, 7
sekizli, 7
tamsay, 7
tek duyarlkl, 8
uzun ift duyarlkl, 8
uzun tamsay, 7
deimez gsterge, 50, 75
deimez ifade, 35, 53, 73, 92, 94, 99, 113
dev adres, 145
dev model, 146
devam etme, satr, 9, 109
devingen dizi, 99
deyim, 29
difftime, 171, 181
div, 179
div_t, 178
dizi, 10, 99
do, 36
dos.h, 163
dosya, 119
dosya gstergesi, 120
dosya sonu, 21
dosya tanmlaycs, 126
dosya tutama, 126
double, 10
dn adresi, 77
dnm tanmlamas, 18
E
EDOM, 174, 176
else, 33
entry, 26
enum, 87
envp, 69
EOF, 21, 121, 124, 177
ERANGE, 174, 176
errno, 174, 176, 177, 179
errno.h, 174
etiket, 39
etiketli deyim, 39
etki alan
deiken, 69
tip bildirimi, 93
EXIT_FAILURE, 126, 179
EXIT_SUCCESS, 126, 179
exit, 102, 125, 179
exp, 176
extern, 72
F
fabs, 176
fclose, 121, 125, 178
fcntl.h, 126
feof, 178
ferror, 178
fflush, 125, 178
fgetc, 178
fgetpos, 178
fgets, 122, 178
FILE, 120, 177
FILENAME_MAX, 177
float, 10
float.h, 12, 174
floor, 176
FLT_DIG, 174
FLT_EPSILON, 174
FLT_MANT_DIG, 174
FLT_MAX, 174
FLT_MAX_10_EXP, 174
FLT_MAX_EXP, 174
FLT_MIN, 174
FLT_MIN_10_EXP, 174
FLT_MIN_EXP, 174
FLT_RADIX, 174
FLT_ROUNDS, 174
fmod, 176
fonksiyon, 59
fonksiyon argman, 60
fonksiyon bildirimi, 64
fonksiyon gstergesi, 78
fonksiyon prototipi, 64
fonksiyon tanm, 60
fopen, 119, 178
FOPEN_MAX, 177
for, 37
fpos_t, 177
fprintf, 122, 178
fputc, 178
fputs, 121, 178
fread, 124, 178
free, 98, 103, 179
freopen, 178
frexp, 176
fscanf, 122, 178
fseek, 123, 178
fsetpos, 178
ftell, 123, 178
fwrite, 124, 178
216 DZN
G
genel gsterge, 98
geni karakter, 170
geniletilmi ASCII karakter kmesi, 135
gerek argman, 62
geriye dn, 81
getc, 121, 178
getchar, 20, 121, 178
getenv, 179
gets, 122, 178
girdi, 17
girdi/ktnn yeniden ynlendirilmesi, 106
gmtime, 171, 181
goto, 39
gsterge, 45
gsterge aritmetii, 48
gzc, 42
H
harf ayrm, 6
HUGE_VAL, 176
I
INT_MAX, 175
INT_MIN, 175
if, 33
ifade, 13
deimez, 10, 16
doruluk-deerli, 32
kark-tip, 16
ifade deyimi, 21
ifadelerin yeniden dzenlenmesi, 16, 54
ikili aa, 103
ikili girdi/kt, 120
ikili ile, 46
ikili sistem, 7
ilk deer atama, 10
ilkleme, 10, 73
int, 10
io.h, 126
isalnum, 173
isalpha, 173
iscntrl, 173
isdigit, 174
isgraph, 174
isim, 6
islower, 174
isprint, 174
ispunct, 174
isspace, 174
isupper, 174
isxdigit, 174
ile, 13
addres alma, 46
adres alma, 20, 65, 79, 97
aritmetik, 13
artrma, 14
atama, 14, 55
azaltma, 14
bantsal, 30
bitsel dlayan VEYA, 54
bitsel VE, 54
bitsel VEYA, 55
doruluk-deerli, 30
dolaylama, 46
eitlik, 31
kaydrma, 54
koullu, 34
mantksal olumsuzlama, 30
mantksal VE, 31
mantksal VEYA, 32
l, 35
virgl, 38
yap yesi, 91
ilem operatr, 13
ilenen, 13
iletim sistemi, 119
itoa, 52
izleme, 24, 152
J
jmp_buf, 176
K
ka sras, 8
kalp, 17, 89, 93
karakter dizisi, 51
karakter dizisi ileme fonksiyonu, 51
kesilme, 152
kesilme noktas, 24
kesim, 145, 152, 160
kesinti, 163, 176
ksa model, 146
kod kesimi, 145
komut satr argman, 68
kullanm, 11
kk byk harf ayrm, 6
kk model, 146
kme komut ileme, 107
DZN 217
kresel deiken, 60, 69
ktphane, 119
ktphane fonksiyonu, 79
L
L_tmpnam, 177
labs, 179
LC_ALL, 169, 175
LC_COLLATE, 169, 175
LC_CTYPE, 169, 175
LC_MONETARY, 169, 175
LC_NUMERIC, 169, 175
LC_TIME, 169, 175
lconv, 169, 175
LDBL_DIG, 175
LDBL_EPSILON, 175
LDBL_MANT_DIG, 175
LDBL_MAX, 175
LDBL_MAX_10_EXP, 175
LDBL_MAX_EXP, 175
LDBL_MIN, 175
LDBL_MIN_10_EXP, 175
LDBL_MIN_EXP, 175
LDBL_RADIX, 175
LDBL_ROUNDS, 175
ldexp, 176
ldiv, 179
ldiv_t, 178
LIB, 155
limits.h, 12, 175
locale.h, 175
localeconv, 169, 175
localtime, 171, 181
log, 176
log10, 176
long, 10
LONG_MAX, 175
LONG_MIN, 175
longjmp, 176
ltoa, 52
M
MAKE, 156
makro, 110
malloc, 98, 103, 179
mantksal kaydrma, 54
math.h, 80, 176
MB_CUR_MAX, 179
MB_LEN_MAX, 175
mblen, 170, 179
mbstowcs, 170, 179
mbtowc, 170, 179
memchr, 180
memcmp, 180
memcpy, 180
memmove, 180
memset, 180
Microsoft C Derleyicisi, 147
minik model, 146
mktime, 172, 181
modf, 176
N
NDEBUG, 173
NMAKE, 156
NULL, 49, 120, 177, 178, 179
O
orta model, 146
otomatik tip dnm, 16, 61, 73

nceden tanmlanm isimler, 115


ncelik, 14, 57
nilemci, 12, 109
rtme, 56
zar, 75, 82, 106
zarl fonksiyon, 75
z-referansl yap, 104
P
P_tmpnam, 177
parametre, 61
perror, 178, 179
pow, 176
printf, 18, 59, 122, 178
program aklamas, 5
ptrdiff_t, 49, 177
putc, 120, 178
putchar, 20, 121, 178
puts, 122, 178
Q
qsort, 179
QuickC ekirdek ktphanesi, 146
QuickC ktphanesi, 146
218 DZN
R
raise, 177
rand, 126, 179
RAND_MAX, 126, 178
rastgele eriim, 123
realloc, 179
referans, 11
referans ile ar, 64, 160
register, 70
remove, 124, 178
rename, 124, 178
return, 61
rewind, 124, 178
S
satr devam etme, 9, 109
satrii birletiricisi, 162
satrii kod, 111
sayc, 88
saym knyesi, 87
saym tipi, 87
scanf, 19, 122, 178
SCHAR_MAX, 175
SCHAR_MIN, 175
SEEK_CUR, 123, 177
SEEK_END, 123, 177
SEEK_SET, 123, 177
setbuf, 125, 178
setjmp, 176
setjmp.h, 176
setlocale, 169, 175
setvbuf, 125, 178
short, 10
SHRT_MAX, 175
SHRT_MIN, 175
SIG_DFL, 177
SIG_ERR, 177
SIG_IGN, 177
SIGABRT, 177
SIGFPE, 177
SIGILL, 177
SIGINT, 177
SIGSEGV, 177
SIGTERM, 177
sral eriim, 123
signal, 177
signal.h, 176
signed, 10
sin, 176
sinh, 176
size_t, 94, 98, 177, 178, 179, 180
sizeof, 93, 94
szck, 46
szck snr, 96
sprintf, 123, 178
sqrt, 176
srand, 126, 179
sscanf, 123, 178
static, 71
stdarg.h, 177, 185
stddef.h, 49, 94, 177
stderr, 18, 120, 177
stdin, 18, 120, 177
stdio.h, 18, 119, 121, 177
stdlib.h, 52, 98, 102, 119, 178
stdout, 18, 120, 177
strcat, 52, 180
strchr, 52, 180
strcmp, 52, 180
strcoll, 180
strcpy, 51, 180
strcspn, 180
strerror, 180
strftime, 172, 181
string.h, 52, 179
strlen, 52, 180
strncat, 52, 180
strncmp, 52, 180
strncpy, 52, 180
strpbrk, 180
strrchr, 52, 180
strspn, 180
strstr, 180
strtod, 179
strtok, 180
strtol, 179
strtoul, 179
struct, 89
struct tm, 180
strxfrm, 180
switch, 40
sys\\stat.h, 126
sys\\types.h, 126
system, 125, 179
T
tan, 176
tanh, 176
DZN 219
tanm, 72
tantc szck, 6
tanabilirlik, 3, 84
tekli ile, 46
temel adres, 47, 80
time, 171, 181
time.h, 171, 180
time_t, 172, 180
tip dnm, 16, 53
otomatik, 16, 61, 73
tip niteleyicisi, 10, 67
tm, 180
TMP_MAX, 177
tmpfile, 178
tmpnam, 178
tolower, 53, 174, 179
toupper, 53, 174, 179
tutamak, 126
typedef, 93
U
UCHAR_MAX, 175
UINT_MAX, 175
ULONG_MAX, 175
ungetc, 124, 178
UNIX, 1
unsigned, 10
USHRT_MAX, 175
uzak adres, 145, 160
uzaklk, 145, 152, 160

nokta, 185
l karakter, 170
ye, 90
V
va_arg, 177, 185
va_end, 177, 185
va_list, 177, 185
va_start, 177, 185
varsaylan altdizin, 112, 115
veri dnm fonksiyonu, 52
veri kesimi, 145
veri yaps, 81, 104
vfprintf, 178
void, 60
void *, 98
volatile, 10
vprintf, 178
vsprintf, 178
W
wchar_t, 170, 177, 178
wcstombs, 170, 179
wctomb, 170, 179
while, 35
Y
yakn adres, 145, 160
yan etkisi, 14
yap, 89
yap knyesi, 90
yeniden ynlendirme, 106
yerel deiken, 60
yt, 77, 159
yt gstergesi, 77
yineleme, 78
yn bayra, 162
yre, 169

You might also like