standart c programlama dili - kitabxana · 2017. 1. 26. · c programlama dili, günümüzde en...
TRANSCRIPT
13
STANDART
CPROGRAMLAMA DİLİ
Fedon KadifeliA C Cem Say
M Ufuk Ccedilağlayan
13
13
Oumlzguumln metin copy 1990 1988 M U Ccedilağlayan F Kadifeli ve A C C Say
Genişletilmiş Tuumlrkccedile baskı copy 2000 1993 F Kadifeli A C C Say ve M U Ccedilağlayan
Her hakkı mahfuzdur Bu yayının hiccedilbir boumlluumlmuuml yazarların izni olmadanfotokopi teksir veya başka bir yolla ccediloğaltılamaz saklanamaz veyayayınlanamaz
Kitabın İngilizcesi ilk defa Tuumlrkiyersquode 1990 Ağustosrsquounda yayınlanmıştır
Tuumlrkccedileye uyarlayan ve guumlncelleyen Fedon Kadifeli
Apple Macintosh MacWrite MacDraw ve MacPaint Apple Computer Incrsquoınonaylı markalarıdır
Courier Smith-Corona Corporationrsquoın onaylı bir markasıdır
IBM International Business Machines Corprsquoın onaylı bir markasıdır
Microsoft MS MS-DOS CodeViewQuickC ve Word Microsoft Corprsquoın onaylı markalarıdır
OS2 Microsoftrsquoa lisanslı onaylı bir markadır
PDP Digital Equipment Corprsquoın ticari bir markasıdır
Times ve Times Roman Linotype AG veveya şubelerinin onaylı markalarıdır
UNIX ATampT Bell Laboratoriesrsquoin onaylı bir markasıdır
Windows Microsoft QuickBasic ve Visual C++ Microsoft Corprsquoın ticarimarkalarıdır
13
13
Ailelerimize
13
13
vii
OumlNSOumlZ
C programlama dili guumlnuumlmuumlzde en yaygın kullanılan dillerden biridir C dili COBOLFORTRAN PLI gibi eski programlama dilleri grubuna dahil edilemeyeceği gibi AdaModula-2 gibi yeni sayılabilecek dil grubuna da girmez
C dili klasik programlama dilleri kavramlarının yeni basit ve kolay kullanılır birşekilde sağlandığı pratik bir dildir Crsquonin popuumllaritesi daha ccedilok UNIXrsquoinki ile ilişkilidirccediluumlnkuuml C ilk olarak UNIX duumlnyasının programlama dili olarak ortaya ccedilıkmıştır Bupopuumllarite kişisel bilgisayarların ccediloğalması ve bunlar uumlzerindeki guumlccedilluuml derleyici ileprogramlama ortamlarının kullanılabilir hale gelmesinden sonra daha ccedilok artmıştır
Bu ders kitabı programlama dilleri uumlzerine Tuumlrkiyersquode hazırlanan ders kitaplarıaccedilığını kapatma amacını guumltmektedir Bilgisayar sistemlerine giriş sistem programlamasistem yazılımı ve işletim sistemleri gibi C dilinin programlama projelerigeliştirilmesinde oumlğretildiği ve kullanıldığı dersler iccedilin tasarlanmıştır
Kitap uumlniversite birinci ve ikinci sınıfında okuyan oumlğrenciler iccedilin hedeflenmiştirancak daha yuumlksek duumlzeyde de bir başvuru kitabı olarak kullanılabilir Bu kitabıokuyacakların en az bir yapısal programlama dilinimdashoumlrneğin Pascal QuickBasic veyaCOBOLmdashbilmeleri ve veri yapıları konusunda temel bilgilere sahip olmalarıbeklenmektedir Bu kitap oumlzellikle yazılım geliştirme projelerinde C dilini kullanmayıduumlşuumlnduumlkleri iccedilin programlama dili bilgilerini genişletmek isteyen bilgi işlem uzmanlarıgibi kişilerin kendi başlarına okuyabilecekleri şekilde de hazırlanmıştır
Bu ders kitabı C programlama dilinin buumltuumln youmlnlerini kapsaması accedilısından tamdırOumlnemli miktarda oumlrnek program ve alıştırmalar verilmiştir Okuyucuların en azından birIBM kişisel bilgisayarını veya uyumlusunu ve Microsoft C Derleyicisi Uyarlama 500veya daha yukarısını kullanabilecekleri beklenmektedir Ancak ekler dışında kitaptaverilen bilgiler değişik C programlama ortamları iccedilin de geccedilerlidir
Bu kitabın Boğaziccedili Uumlniversitesi Yayınları arasında İngilizce olarak yapılan ilkbasımı halen Boğaziccedili Uumlniversitesi Bilgisayar Muumlhendisliği Boumlluumlmuumlrsquonde İşletimSistemleri dersinde yardımcı ders kitabı olarak kullanılmaktadır Kitap şu anda tamamen
13
viii OumlNSOumlZ
guumlncelleştirilmiştir ve ANSI Standardının tuumlm oumlzelliklerini kapsamaya ccedilalışmaktadır Bukitap sayesinde yeni C derleyicileri tarafından desteklenen Standart Crsquonin hem yeni hemde eski C programcıları tarafından kullanılmaya başlanacağını umuyoruz
Bu kitabın hazırlanması ve yayınlanmasında değerli oumlnerileri duumlzeltmeleri desteklerive katkıları olan Rasim Mahmutoğulları Sema Akguumln Oğuz Sinanoğlu Uumllkuuml KaradağAhmet Demirhan Mustafa Elbir Hasan Guumlltekin Nezihe Bahar ve adınısayamayacağımız daha birccedilok kişiye teşekkuumlrlerimizi borccedil biliriz
Yuumlk Muumlh F KadifeliY Doccedil Dr A C C SayDoccedil Dr M U Ccedilağlayan
İstanbulEkim 1993
13
ix
İCcedilİNDEKİLER
OumlNSOumlZ vii
İCcedilİNDEKİLER ix
ŞEKİLLER VE CcedilİZELGELER LİSTESİ xv
BOumlLUumlM 0 GİRİŞ 1
01 C Dilinin Kısa Bir Tarihi 1
02 C Dilinin Uumlstuumlnluumlkleri 2
03 Kullanılan Sistem3
04 Kitabın Yapısı Ve Kullanılan Kurallar 4
Problemler 4
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 5
11 Accedilıklamalar Tanıtıcı Soumlzcuumlkler Ve Anahtar Soumlzcuumlkler 5
12 Değişmezler 7
13 Temel Veri Tipleri Ve Tanımlar9
14 define Ve include Oumlnişlemci Emirleri 12
15 İşleccediller İfadeler Ve Atama Deyimleri13
16 Tip Doumlnuumlşuumlmuuml Ve Kalıplar 16
13
x İCcedilİNDEKİLER
17 Basit GirdiCcedilıktı 17
18 C Deyimleri Ve Program Goumlvdesi21
19 Bir C Programı Nasıl İşletilir22
110 Oumlrnek Programlar 24
Problemler 26
BOumlLUumlM 2 DEYİMLER VE KONTROL AKIŞI29
21 C Dilinin Deyimleri 29
22 Bağıntısal Ve Mantıksal İşleccediller30
23 Doğruluk-Değerli İfadeler 32
24 if Deyimi Ve Koşullu İşleccedil 33
25 while Deyimi 35
26 do Deyimi 36
27 for Deyimi Ve Virguumll İşleci 37
28 continue Deyimi38
29 break Deyimi 39
210 goto Deyimi Ve Etiketler39
211 switch Deyimi40
212 Bir OumlrnekmdashSayı Sıralama42
Problemler 43
BOumlLUumlM 3 GOumlSTERGELER VE BİT İŞLEME45
31 Goumlsterge Değişkenleri Ve İşlemleri45
311 amp Ve İşleccedilleri 46
312 Goumlsterge Değişkenleri Bildirimleri47
313 Goumlsterge Aritmetiği 47
32 Goumlstergeler Ve Diziler49
33 Karakter Dizileri51
34 Bitsel İşleccediller 53
35 İşleccedil Oumlnceliği Ve Birleşme57
Problemler 58
13
İCcedilİNDEKİLER xi
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 59
41 Fonksiyon Tanımlama 60
42 Fonksiyon Ccedilağrıları 62
421 Değer İle Ccedilağrı 64
422 Referans İle Ccedilağrı 65
423 main Fonksiyonunun Parametreleri 67
43 Bellek Sınıfları69
431 auto Değişkenler 70
432 register Değişkenler 70
433 static Değişkenler Ve Fonksiyonlar 71
434 Fonksiyonlar Ve extern Değişkenler72
435 İlkleme73
44 Oumlzccedilağrı 75
45 Fonksiyonlara Goumlstergeler78
46 Bir Oumlrnekmdash8 Vezir Problemi80
Problemler 84
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI87
51 Sayım Tipleri 87
52 Yapılar 89
53 Yeni Tip Tanımlama92
54 sizeof İşleci94
55 Birlikler 95
56 Alanlar 96
57 Bellek Ayırma98
58 Karmaşık Tipler98
581 Dizi Dizileri 99
582 Dizilere Goumlstergeler100
583 Goumlsterge Dizileri 101
584 Goumlstergelere Goumlstergeler 102
59 Bir OumlrnekmdashDosya Sıralama103
13
xii İCcedilİNDEKİLER
Problemler 107
BOumlLUumlM 6 OumlNİŞLEMCİ 109
61 define Ve undef Emirleri 110
62 include Emri 112
63 Koşullu Derleme113
64 Diğer Emirler115
65 Oumlnceden Tanımlanmış İsimler 115
66 Bir Oumlrnekmdashctypeh Başlık Dosyası116
Problemler 117
BOumlLUumlM 7 DOSYALAR VE GİRDİCcedilIKTI 119
71 Dosya Esasları 119
72 Dosya ErişimimdashBaşka Youmlntemler121
73 Rastgele Erişim123
74 Dosyalarla İlgili Başka Bilgiler 124
75 Sistem İle İlgili Fonksiyonlar125
76 Dosya Tanımlayıcıları Ve İlgili Fonksiyonlar 126
77 Bir OumlrnekmdashOumlğrenci Veritabanı 128
Problemler 132
EK A KARAKTER KODLARI CcedilİZELGESİ135
EK B MICROSOFT C DERLEYİCİSİ HAKKINDA TEMEL BİLGİLER145
B1 Bellek Modelleri 145
B1 QC Kuumltuumlphanesi146
B3 CL Eniyileştirici Derleyicisi147
EK C MICROSOFT CODEVIEW HATA DUumlZELTİCİSİNE GENEL BİRBAKIŞ 151
EK D MICROSOFT LIB VE NMAKE YARDIMCI PROGRAMLARINAGENEL BİR BAKIŞ155
13
İCcedilİNDEKİLER xiii
D1 LIB Yardımcı Programı 155
D2 NMAKE Yardımcı Programı 156
EK E DİLLERARASI CcedilAĞRILAR 159
E1 Birleştirici İle Bağlayıcının Kullanılması 159
E2 Satıriccedili Birleştiricisinin Kullanılması 162
E3 Bir OumlrnekmdashDisket Saklama163
EK F STANDART C PROGRAMLAMA DİLİNİN DİĞEROumlZELLİKLERİ 169
F1 C Duumlnyanın Her YerindemdashYoumlreler169
F2 Geniş Karakterler Ve Ccedilokbaytlı Karakterler 170
F3 Uumlccedilluuml Karakterler 170
F4 Zaman Fonksiyonları 171
F5 Standart Başlık Dosyaları 173
F6 Ccedilevirme Sınırları 181
EK G SECcedilİLMİŞ PROBLEMLERE YANITLAR183
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLERSOumlZLUumlĞUuml187
H1 Tuumlrkccedile-İngilizce Soumlzluumlk187
H2 İngilizce-Tuumlrkccedile Soumlzluumlk198
BİBLİYOGRAFYA 209
DİZİN213
13
13
xv
ŞEKİLLER VE CcedilİZELGELERLİSTESİ
CcedilİZELGE 21 C dilinin deyimleri30
CcedilİZELGE 22 C işleccedil oumlnceliği ve birleşme32
ŞEKİL 21 while ve do deyimleri iccedilin akış ccedilizenekleri36
CcedilİZELGE 31 C işleccedil oumlnceliği ve birleşme57
ŞEKİL 41 main fonksiyonuna geccedilirilen komut satırı arguumlmanları 69
ŞEKİL 51 Bir oumlrnek ikili ağaccedil 104
13
13
1
BOumlLUumlM 0 GİRİŞ
Ilk program
include ltstdiohgt
void main (void) int kar if ((kar=getchar())=n) main() putchar(kar)
Eğer bir C programının nasıl goumlruumlnduumlğuumlnuuml merak ettiyseniz yukarıda ldquoyararlı veanlamlırdquo bir iş yapan tam bir C programının durduğunu oumlğrenmek sizi şaşırtabilir Bir Cderleyiciniz varsa ve nasıl kullanacağınızı biliyorsanız bu programı yazın derleyin veccedilalıştırın Fakat oumlnce programın ne yapabileceği konusunda ccedilılgın tahminlerdebulunmaktan da ccedilekinmeyin
Eğer tahmininiz doğru ccedilıkmadıysa uumlzuumllmeyin Bu sadece C hakkında ilginiziccedilekmek iccedilindi ve umarız oumlyle oldu Bu basit gibi goumlruumlnen ancak Crsquonin birtakım ilerioumlzelliklerini kullanan programı kitabın yarısını bitirinceye kadar anlamanızıbeklemiyoruz ve bu kitabı bitirdiğinizde ccedilok daha karmaşık programları bileanlayabileceğinizi ve yazabileceğinizi bekliyoruz
01 C Dilinin Kısa Bir Tarihi
UNIX işletim sistemi ile C programlama dili birbirleriyle yakından ilişkilidir Tarihleri70rsquolerin başında başlar İlginccedil olan şey de ATampT Bell Laboratuvarlarırsquondan KenThompson tarafından yazılan bir bilgisayar oyun programından kaynaklanmalarıdır
13
2 GİRİŞ BOumlLUumlM 0
Thompson programını bir PDP-7 bilgisayarına uyarlamak istediğinde bu kuumlccediluumlk makinahakkında ccedilok şey oumlğrendi ancak işletim sistemini pek beğenmedi Bunun uumlzerine ozamanlar daha buumlyuumlk bir makinada kullanılan MULTICS işletim sistemininbasitleştirilmiş ve değiştirilmiş bir uyarlamasını yazmaya karar verdi Daha sonra DennisM Ritchie de ona katıldı ve Brian W Kernighan tarafından UNICS (UniplexedInformation and Computing ServicemdashBirleştirilmiş Bilgi ve Hesaplama Hizmeti) adıverilen işletim sisteminin ilk uyarlaması doğdu Bu uumlccedil kişi C ve UNIXrsquoin tarihinde enoumlnemli roluuml oynadılar Başlangıccedilta Thompson daha oumlnceleri 1967 civarında geliştirilenBCPL adlı ldquotipsizrdquo dilden de buumlyuumlk oumllccediluumlde etkilenerek B dilini tasarımladı Bundan sonraRitchie UNIXrsquoi daha kolay bir şekilde yazma amacıyla C adında yeni bir dil tasarımladı1973 yılında ise Ritchie ve Thompson Crsquoyi kullanarak UNIXrsquoi yeni baştan yazdılar Sonuccedilo kadar iyiydi ki 1983rsquote ACMrsquoin Turing Oumlduumlluumlrsquonuuml almaya hak kazandılar
O zamandan beri C ccedilok değişmedi Dilde yapılan bazı kuumlccediluumlk genişletmeler DennisM Ritchie tarafından hazırlanan The C Programming LanguagemdashReference Manual (CProgramlama DilimdashBaşvuru Elkitabı) adlı 1983 basımlı Bell Laboratuvarları yayınındaanlatılmaktadır ANSIrsquonin (American National Standards InstitutemdashAmerikan UlusalStandartlar Enstituumlsuuml) X3J11 komitesi tarafından 1988 Ekimrsquoinde sunulan C Standardınınson taslağı bu değişiklikleri resmileştirmekte ve kendi başına yenilerini eklemektedirYapılan duumlzenlemelerle birtakım programcı hatalarını azaltmak iccedilin derleyici kontrolleriartırılmış ve dile yararlı birkaccedil oumlzellik daha katılmıştır Ancak tasarımcılarının felsefesineaykırı olduğu iccedilin dilin daha fazla genişletilmesi beklenmemelidir Bunun yerine budilden yeni diller ortaya ccedilıkmaktadır Bir oumlrnek C++rsquodır Bu dil nesneye youmlnelikprogramlama ve veri soyutlama teknikleri sağlarken Standart C ile uyumlu kalmaya ccedilabagoumlstermektedir Bu oumlzellikleri dili daha kapsamlı bir uygulama programlama diliyapmaktadır Yakın zamanda ise C++rsquonın Crsquonin yerini alması beklenmektedir ancak yinede C++ oumlğrenecek birisinin oumlnce Standart Crsquoyi bilmesi gerekmektedir
02 C Dilinin Uumlstuumlnluumlkleri
Oumlnceki kısımdan Crsquonin pratik gereksinmelerden ortaya ccedilıktığı sonucuna varabiliriz yanibelirli bir sistem iccedilin yapay hazırlanmış bir dil değildir C birleştirici dilinin sorunlarınıkısmen ccediloumlzmek iccedilin duumlşuumlk duumlzeyli programlamayı destekleyici kolaylıkları olan yuumlksekduumlzeyli bir dil olarak tasarımlanmıştır Oumlrneğin dilde girdiccedilıktı deyimleri yokturKullanıcı girdiccedilıktı yapmak iccedilin ldquogetcharrdquo ve ldquoputcharrdquo gibi bazı fonksiyonlarıccedilağırır Derleyici bu fonksiyonların anlamı hakkında hiccedilbir şey bilmez Sadece Ckuumltuumlphanesinde tanımlı olan bu fonksiyonlara ccedilağrılar uumlretir Bu da iyi bir kuumltuumlphaneninCrsquoye ccedilok şey kazandıracağı anlamına gelir
Crsquonin diğer dillere goumlre bazı avantajları vardır Bunlar aşağıda oumlzetlenmektedir
C kısa oumlzluuml verimli esnek ve ifadeli bir dildir Az sayıda anahtar soumlzcuumlğe sahiptirfakat doğru kontrol yapıları guumlccedilluuml işleccedilleri (diğer adıyla işlem operatoumlrleri) ve kolaycabirleştirilen veri tipleri vardır Bu da dili oumlğrenmenin ve bir C derleyicisinin yazılmasınınkolay olduğu ve bu dilde yazılan programların kısa fakat bazen izlemesi zor olduğu
13
BOumlLUumlM 0 GİRİŞ 3
anlamına gelir Bazı işleccediller diğer dillerde yoktur fakat bunlar kolayca makine dilineccedilevrilebilirler bu da C dilinde yazılan programların diğer dillerde yazılanlara goumlre dahaverimli ccedilalışmalarının nedenini accedilıklar Bundan dolayı bazı sistemlerde C birleştiricidilinin yerini almıştır
C popuumller bir işletim sistemi olan UNIXrsquoin temel dilidir Bu da en azından bu işletimsisteminde bu dili vazgeccedililmez kılmaktadır Buna rağmen C başka sistemlerde dekullanılmaya başlanmıştır ve taşınabilme oumlzelliğinden dolayı bir sistem iccedilin yazılmışprogramlar kolayca başka sistemlere de aktarılabilmekte ve orada bazı ufak tefekdeğişikliklerden sonra derlenip doğru bir şekilde ccedilalıştırılabilmektedir Bu durum dilinamaccedillarından biridir programcının makine bağımlılıklarını bir tarafta ayırması vegereksinim duyduğunda programı yeni ortamlara kolayca uyarlayabilmesi C oumlnişlemcisibu konuda oumlnemli bir rol uumlstlenmektedir
C moduumller programlamayı teşvik etmektedir Diğer ccedilağdaş programlama dilleri kadaryaygın olmamasına rağmen programcının bunu sağlaması iccedilin bazı seccedilimler sunar Ccedileşitlibellek sınıfları ccedileşitli duumlzeylerde gizlilik ve moduumllarite sağlar Dildeki tek moduumll yapısıolan fonksiyon tanımı iccedilin C tek bir duumlzeye izin verir buumltuumln fonksiyonlar dışsaldırProgramcı kolayca kullanıcı tarafından tanımlanmış kaynak veya amaccedil kuumltuumlphaneleriyaratabilir ve bu yolla ccedilok buumlyuumlk programlar hazırlayabilir
Crsquonin dezavantajları da vardır C dilinde yazılan programların izlenmesi bir miktarzor olabilir ccediluumlnkuuml zengin işleccedil kuumlmesi program okunaklılığını azaltır C katı-tiplenmiş birdil değildir bir dizinin sınırları dışında indisleme yapmaya ccedilalışmak gibi bazı programcıhataları iccedilin yuumlruumltme zamanı desteği sağlamaz bazı durumlarda derleyici ifadelericcedilindeki alt-ifadelerin veya arguumlman listeleri iccedilindeki ifadelerin hesaplanma sıralarınıdeğiştirebilir aynı simgelerin birden fazla amaca hizmet etmesi bazı programlamahatalarına yol accedilabilirmdasheşitlik testi ve atama işleccedillerinin karıştırılması gibi bazı yapılarmdashoumlrneğin switch deyimimdashdaha iyi tasarlanabilirdi Bu sorunların bazıları Crsquonin ANSIStandardını izleyen bazı yeni derleyicilerde iyileştirilmiştir Ayrıca Crsquoye dayanarakgeliştirilen C++ dili bazı sorunları ccediloumlzmuumlş ve birccedilok yeni oumlzellikler katmıştır Gerccedilek birC programcısının Crsquonin dezavantajları ile birlikte yaşamayı oumlğrenmesi gerektiğineinanıyoruz
03 Kullanılan Sistem
C ldquotaşınabilir bir dilrdquo olmasına rağmenmdashki bu da belirli bir sistem iccedilin yazılmış olan birC programının başka bir sisteme aktarıldığında orada başarılı bir şekilde derlenipyuumlruumltuumllebileceği anlamına gelirmdashsistemler arasında bazı farklılıklar olabilmektedir Bukitapta verilen program veya program parccedilaları Microsoft QuickC Uyarlama 101 (1988)Microsoft C Derleyicisi Uyarlama 500 (1987) ve Microsoft CC++ EniyileştiriciDerleyicisi Uyarlama 800 (1993) kullanılarak denenmiştir Kullandığımız işletim sistemiIBM uyumlu bir PCrsquode ccedilalışan MS-DOS Uyarlama 500 (1991) veya daha yukarısıdır Birsonraki boumlluumlmde bu ortamların nasıl kullanılabileceği konusunda daha detaylı bazı bilgilerverilmiştir Ayrıca Ek Brsquoye bakınız
13
4 GİRİŞ BOumlLUumlM 0
04 Kitabın Yapısı Ve Kullanılan Kurallar
Bu kitabın İngilizce olan ilk uyarlaması bir Apple Macintosh Plusrsquota Word ve MacDrawisimli yazılımlar kullanılarak hazırlanmıştır Kitap en son olarak IBM uyumlu bir PCrsquodeccedilalışan Windows iccedilin Word Uyarlama 20c kullanılarak guumlncelleştirilmiş ve Tuumlrkccedilebaskıya hazır hale getirilmiştir Temel yazı tipi Times Romanrsquodır Soumlzdizimselgoumlsterimde soumlzdizimsel sınıflar italik yazı stili ile goumlsterilmiştir İsteğe bağlı boumlluumlmlerarkalarında satır altına yazılan opt simgesiyle goumlsterilmiştir Program boumlluumlmleri ekranveya yazıcı ccedilıktısına benzetilmek iccedilin Courier yazı tipiyle yazılmıştır C anahtarsoumlzcuumlkleri koyu program accedilıklamaları ise italik ile yazılmıştır Bilgisayargirdiccedilıktısı da Courier yazı tipiyle goumlsterilmiştir ccedilıktı girdiden ayırt edilmesi iccedilinalt ccedilizgili yazılmıştır
Kitabın geri kalan kısmında 7 boumlluumlm 8 ek ve C programlama diliyle ilgili bazıkaynakların liste halinde verildiği bir bibliyografya vardır Boumlluumlm 1rsquode dile bir girişyapılmakta ve ccedilok basit programlar yazmak iccedilin gerekli olan genel bilgiler verilmektedirBoumlluumlm 2 C dilindeki kontrol deyimlerini ve doğruluk-değerli yani mantıksal ifadelerianlatmaktadır Boumlluumlm 3 goumlstergeler ve bit işlemleri hakkındadır Boumlluumlm 4rsquote fonksiyonlarve değişkenlerle fonksiyonlara uygulanabilecek ccedileşitli bellek sınıfları anlatılmaktadırBoumlluumlm 5 karmaşık veri yapıları tanımlamada anahtar olan buumltuumln tuumlretilmiş veri tiplerinikapsamaktadır Boumlluumlm 6 C oumlnişlemcisine ayrılmıştır ve buumltuumln oumlnişlemci emirlerinianlatmaktadır Boumlluumlm 7rsquode diğer bazı fonksiyonlarla beraber Standart Ckuumltuumlphanelerinde tipik olarak rastlanan girdiccedilıktı işlemleri anlatılmaktadır Ekler iseMicrosoft C Derleyicisi ve ccedilevresinin bazı oumlzelliklerini anlatmakta bazı problemlerinyanıtlarını vermekte ve kitapta kullanılan terimlerin İngilizce karşılıklarını bulmak iccedilin birTuumlrkccedile-İngilizce ve İngilizce-Tuumlrkccedile terimler soumlzluumlğuuml iccedilermektedir Kitapta olanaklardahilinde yaygın olarak kullanılan Tuumlrkccedile terimler tercih edildiği iccedilin İngilizcebilgisayar terimleri hakkında bilgi sahibi olan okuyucu bu kitapta kullanılan Tuumlrkccedileterimleri anlamak iccedilin sık sık Ek Hrsquode verilen bu soumlzluumlklere başvuracaktır
Problemler
1 Bu boumlluumlmuumln başında verilen programı sisteminizde ccedilalıştırın Eğer herhangi birzorlukla karşılaşırsanız sisteminizin yardım oumlzellikleri elkitapları veya deneyimliprogramcılara başvurun Bu programı ccedilalıştırmak iccedilin kaccedil komuta gereksiniminizvar
2 Bir oumlnceki alıştırmadaki programı tekrar yazın (veya değiştirin) fakat bu kez ikisatırı tek satırda arada bir boşluk karakteri bırakarak yazın ile başlayan satırınarkasına bir şey yazmamaya dikkat edin Derleyicinin aynı şekilde kabul etmesigerekir Şimdi program iccedilinde rastgele yerlere boşluklar satır başları veya duraklar(tab) ekleyin Derlerken ortaya ccedilıkacak hata mesajları varsa bunları anlamaya veduumlzeltmeye ccedilalışın
13
5
BOumlLUumlM 1 TEMEL KAVRAMLARVE GENEL BİR BAKIŞ
Şimdi C dilinin temel yapı taşlarını anlatıp birtakım temel programlama kavramlarının Cdilinde nasıl gerccedilekleştirildiğini goumlstereceğiz Bu boumlluumlmuumln amacı muumlmkuumln olduğu kadarccedilabuk basit C programları yazmak ve ccedilalıştırmak iccedilin gerekli olan bilginin okuyucuyakazandırılmasıdır Okuyucunun zaten en az bir programlama dilini bildiği farz edildiğiiccedilin burada bahsedilecek olan temel programlama kavramları detaylı olarakaccedilıklanmayacaktır Bir sonraki boumlluumlmden başlayarak bu kavramlar C dilinin genelccedilerccedilevesi iccedilinde ele alınarak derinlemesine accedilıklamalar verilecektir
11 Accedilıklamalar Tanıtıcı Soumlzcuumlkler Ve AnahtarSoumlzcuumlkler
Accedilıklamalar
Boumlluuml-yıldız () ile ondan sonraki ilk yıldız-boumlluuml () arasında bulunan herhangi birkarakter dizisi bir program accedilıklamasıdır ve derleyici accedilısından bir boşluğa eşdeğerolarak kabul edilir Bir accedilıklama grubunun şoumlyle yazılması oumlnerilmektedir
Buyuk bir aciklama obegi
veya
Daha kucuk bir aciklama obegi
13
6 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
Program accedilıklamaları bu kitapta italik olarak yazılmış ve sistemler arasındakiuyumsuzluklardan kaccedilınmak iccedilin Tuumlrkccedile karakterler kullanılmamıştır
Tanıtıcı Soumlzcuumlkler
Değişkenler deyim etiketleri tip isimleri fonksiyon isimleri gibi programcı tarafındanoluşturulan buumltuumln nesneleri isimlendirmek iccedilin tanıtıcı soumlzcuumlkler bir diğer adıylaprogram isimleri kullanılır Tanıtıcı soumlzcuumlkler iccedilin şu kurallar geccedilerlidir
1 Herhangi bir sayıda karakterlerden oluşur ancak ilk 31 karakter dikkate alınır2 İlk karakter bir harf veya altccedilizgi (_) olmalıdır3 Geri kalan buumltuumln karakterler bir harf rakam veya altccedilizgi olabilir
Oumlrnek olarak A12 a12 sayfa_basi değişken ismi olarak kullanılabilir Kuumlccediluumlkve buumlyuumlk harflerin farklı olduğuna dikkat ediniz yani A12 ile a12 farklı tanıtıcısoumlzcuumlklerdir Ancak bazı ortamlarda kuumlccediluumlk buumlyuumlk harf ayırımı yapılmayabilir Bundandolayı aynı program iccedilinde harf ayrımı dışında birbirine benzeyen iki farklı isimkullanmaktan kaccedilının Ayrıca bir tanıtıcı soumlzcuumlkte ilk karakter olarak altccedilizgidenkaccedilınılması oumlnerilir ccediluumlnkuuml bu tip isimler derleyiciye oumlzguuml bazı anahtar soumlzcuumlkler veyadiğer isimler iccedilin kullanılmaktadır
Anahtar Soumlzcuumlkler
C dilinde 32 adet anahtar soumlzcuumlk vardır hepsi kuumlccediluumlk harfle yazılır Anahtar soumlzcuumlklertanıtıcı soumlzcuumlk olarak kullanılamazlar kendilerine oumlzguuml kullanım alanları vardır Cdilindeki buumltuumln anahtar soumlzcuumlklerin sınıflandırılmış bir listesi aşağıda verilmiştir Programiccedilinde kullanacağınız isimlerin aşağıdaki listede olmamasına dikkat edin
veri tipi bellek sınıfı deyim işleccedilchar auto break sizeofconst extern casedouble register continueenum static defaultfloat typedef doint elselong forshort gotosigned ifstruct returnunion switchunsigned whilevoidvolatile
Kullanılan makine ve derleyiciye bağlı olarak C dilinin oumlzel durumundan dolayıbaşka anahtar soumlzcuumlkler de olabilir Bunlar genelde altccedilizgi karakteriyle başlarlar
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 7
12 Değişmezler
C dilinde tamsayı kayan noktalı yani gerccedilek sayı karakter ve karakter dizisideğişmezleri bulunur
Tamsayı Değişmezleri
Tamsayı değişmezleri program iccedilinde ondalık sekizli veya onaltılı sayılar şeklindebelirtilebilirler ve derleyicinin tipine goumlre 16 bit veya 32 bit şeklinde saklanırlarAşağıdaki oumlrneklerde bazı tamsayı değişmezleri goumlruumllmektedir
123 ondalık 1230123 sekizli 123 = ondalık 83083 geccedilersiz bir sayı0x123 onaltılı 123 = ondalık 2910XFF onaltılı FF = ondalık 255
Sayının oumlnuumlndeki bir sıfır rakamının geri kalan rakamların sekizli (yani 0-7) ve sayıoumlnuumlndeki bir sıfırla onun arkasından gelen kuumlccediluumlk veya buumlyuumlk x harfinin geri kalanrakamların onaltılı (yani 0-9 A-F veya a-f) olması gerektiğini goumlsterdiğine dikkat edinSayının program iccedilindeki goumlsterimi ne olursa olsun makine iccedilinde her zaman bitlerhalinde ikili sistemde saklanır ancak bu durum genelde programcıyı ilgilendirmez
Bir tamsayı değişmezi eğer değeri 16 bite sığıyorsa kısa formda (16 bit) saklanıraksi takdirde uzun formda (32 bit) saklanır Tamsayı bir değişmezin uzun formdasaklanmasını zorlamak iccedilin değişmezin arkasına l veya L harfi eklenmelidir 1 sayısı ilekarıştırılmaması iccedilin kuumlccediluumlk l yerine buumlyuumlk L harfinin kullanılması oumlnerilir
123 16 bitte saklanır123l 32 bitte saklanır123L 32 bitte saklanır077 000077 şeklinde 16 bitte saklanır077L 0077 şeklinde 32 bitte saklanır0xFFFF 16 bitte saklanır0xFFFFL 0000FFFF şeklinde 32 bitte saklanır0xFFFFF 000FFFFF şeklinde 32 bitte saklanır
Bir sekizli veya onaltılı tamsayı değişmezi daha buumlyuumlk bir bellek alanınayerleştirildiği zaman soluna sıfır konur Yani boumlyle değişmezlerin işaretsiz olduğuvarsayılır Ondalıklı bir tamsayı değişmezinin işaretsiz olarak işlem goumlrmesini sağlamakiccedilin arkasına u veya U eki konulmalıdır oumlrneğin 65000U
Kayan Noktalı Sayı Değişmezleri
Kayan noktalı sayı değişmezleri ya tamsayı ile kesir kısmı arasına nokta konarak yadabilimsel goumlsterimde belirtilirler İkinci youmlntem genelde ccedilok buumlyuumlk veya ccedilok kuumlccediluumlksayılar iccedilin kullanılır Aşağıda bazı oumlrnekler vardır
13
8 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
1123123E20 = 123times1020
123e20 = 123times1020 (buumlyuumlk veya kuumlccediluumlk harf olabilir)123E18 = 123times1020
123E-20 = 123times10-20
Değişmezin iccedilinde herhangi bir boşluğun olmaması gerektiğine dikkat edinNormalde kayan noktalı değişmezler 8 baytta yani double (ccedilift) duyarlıkta saklanırEğer kayan noktalı değişmezde f veya F eki bulunuyorsa o zaman 4 baytta yani tekduyarlıkta eğer l veya L eki kulanılırsa o zaman long double (uzun ccedilift veya doumlrtluuml)duyarlıkta saklanır
Karakter Değişmezleri
Bir karakter değişmezi A a gibi tırnak işaretleri arasına konulan tek birkarakter veya tek bir karaktere eşdeğer olan bir kaccedilış sırasıdır Bir kaccedilış sırası bir tersboumlluuml işareti ile bir harf veya rakamlardan oluşur C dilinde sadece şu kaccedilış sıralarıkullanılır
n yeni satırb geri almar satırbaşıt durak (tab)f sayfa ilerletmev dikey duraka zil tek tırnak ccedilift tırnak soru işareti ters boumlluumlddd sekizli kodu ddd olan karakterxhhh onaltılı kodu hhh olan karakter (Ek Arsquoya bakınız)
Ek olarak aşağıda bazı karakter değişmezleri oumlrnekleri vardır
0 boş karakter bir karakter değişmezi olarak tek tırnak bir karakter değişmezi olarak ccedilift tırnak bir karakter değişmezi olarak ters boumlluuml101 sekizli kodu 101 olan karakter (ASCII sisteminde A harfi)x041 onaltılı kodu 41 olan karakter (ASCII sisteminde A harfi)
Bir karakter değişmezinin tipi intrsquotir Karakterler ise tipik olarak bir baytta (8 bit)saklanır ve tamsayı gibi işlem goumlruumlrler Ancak signed (işaretli) veya unsigned(işaretsiz) oldukları veya kullanılan kodlama sistemi C Standardında belirtilmemiştirBizim sistemimizde ASCII kodlama sistemi kullanılır (Ek Arsquoya bakınız) Normalkarakterlerin (oumlrneğin sistemimizdeki 7 bitlik ASCII karakterlerinin) işaretsiz oldukları
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 9
garanti edilmiştir Gerektiğinde bir karakter değişkeninin işaretli olup olmadığıprogramcı tarafından accedilıkccedila belirtilmelidir
Karakter Dizisi Değişmezleri
Bir karakter dizisi değişmezi ccedilift tırnaklar arasında yazılmış herhangi bir sayıda karakterveya yukarıda listesi verilmiş kaccedilış sırasından oluşur İşte bazı oumlrnekler Son oumlrnektekiyeni satır (n) ve tek tırnak () kaccedilış sıralarına dikkat edin
boş karakter dizisiMerhaba 7 karakterlik bir karakter dizisiIsminizi girinnveya ENTERa basin
iki satırdan oluşan bir karakter dizisi
Bir karakter dizisi değişmezi bellekte saklandığı zaman dizinin sonuna otomatikolarak boş karakter (0) eklenir bundan dolayı diziyi saklamak iccedilin kullanılan bayt sayısıdizinin uzunluğundan bir fazladır Bir program iccedilinde aralarına hiccedilbir işaret koymadanpeşpeşe yazılan karakter dizisi değişmezleri birleştirilir ve tek bir dizi değişmezi olarakalınırlar Diziler bazı sistemlerde salt-okunur belleğe yerleştirilebilirler bu da onlarıdeğiştirilemez kılabilir Ayrıca birbirine tıpatıp benzeyen iki veya daha fazla karakterdizisi aynı bellek boumllgesinde saklanabilir
Sistemler arasındaki uyumsuzluklardan kaccedilınmak iccedilin bu kitaptaki karakter dizisideğişmez oumlrneklerinde Tuumlrkccedile karakterler kullanılmamıştır
Bir Sonraki Satıra Devam Etme
Bir deyim veya karakter dizisi değişmezi programın tek bir satırına sığmıyorsa ve birsonraki satıra devam etmek gerekiyorsa satırın sonuna ters boumlluuml () işareti konup birsonraki satıra devam edilebilir Ayrıca uzun bir karakter dizisi değişmezi iki satırda ikiayrı karakter dizisi şeklinde de yazılabilir
13 Temel Veri Tipleri Ve Tanımlar
Bir değişken ismi değişkenin alacağı değerlerin tuumlruuml ve işlevini yansıtacak şekildedikkatlice seccedililen bir tanıtıcı soumlzcuumlktuumlr Genelde kalan_gunler veya kalanGunlerşeklinde bir değişken ismi x132 gibi bir isme tercih edilmelidir Değişken isimlerindebuumlyuumlk harfler yerine kuumlccediluumlk harflerin kullanılması alışılagelmiştir
Bir C programında kullanılmadan oumlnce tuumlm değişken ve fonksiyonların tanımı veyabildirimi yapılmalıdır Temel veri tiplerinin yani tamsayı kayan noktalı sayılar vekarakterlerin bildiriminde kullanılan anahtar soumlzcuumlkler şunlardır
13
10 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
int tamsayısigned unsigned işaretli veya işaretsiz tamsayılarshort long kısa veya uzun tamsayılarfloat double tek veya ccedilift duyarlıklı kayan noktalı sayılarchar karakter
Bir tanım bir tip ismi ile tanımlanmakta olan nesnelerin virguumllle ayrılmış listesindenoluşur ve bir noktalı virguumll ile sona erer Aşağıda birkaccedil oumlrnek tanım goumlsterilmiştir
int xint x1 y1 z1long d d1char cchar c1 c2 c3float afloat a1 a2 a3int u[3]float k[1020]
Son iki tanımda tek boyutlu ve uumlccedil elemanlı bir tamsayı dizisi ile tek boyutlu ve 200elemanlı kayan noktalı sayılardan oluşan bir dizi tanımlanmıştır Dizinin boyunun derlemeesnasında hesaplanabilen değişmez bir ifade olduğuna dikkat edin
Aşağıda goumlruumllduumlğuuml gibi değişkenler tanımlandıkları zaman ilk değerleri deverilebilir
int x = 0int x1 = 10 x2 = 20 x3 = 30 x4 = 60 60 ilk deger degismez bir ifadedir char c1 = a c2 = z
Buna ilkleme diyoruz İlk değer olarak bir ifadenin de yazılabileceğine dikkat edinTanımlanan değişkenlerin ilklenmesi iyi bir alışkanlıktır
İsimlendirilmiş değişmezler yani değerleri değiştirilemeyecek olan değişkenlerconst tip niteleyicisi kullanılarak tanımlanırlar
int const x = 100char const ys = nfloat const a = 12345
Bu tip değişmez ldquodeğişkenrdquolerin const ile tanımlanmasının en azından iki avantajıvardır
1 Programcı yanlışlıkla bu tip bir değişkene atama yapmaya kalkar veya değerinideğiştirebilecek bir şekilde kullanmaya kalkarsa derleyici onu uyaracaktır
2 Ccedilok kullanıcılı sistemlerde bu tip değişkenlerin ortak ve değiştirilemez bir bellekkesimine yuumlklenmesi sağlanabilir
Aynı anda başka bir suumlreccedil (program) tarafından kullanılan veya değiştirilebilendeğişkenlerin derleyicinin olası bir eniyileme yapmasını engellemek iccedilin volatile tip
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 11
niteleyicisi kullanılarak tanımlanması gerekmektedir Oumlrneğin ccedilok kullanıcılı ortamlardaiki değişik suumlreccedil tarafından ortak kullanılan bir değişkenin volatile tanımlanmasıgerekir
Tanımlanmış bir değişken bir deyim iccedilinde ismi verilerek anılır Dizi elemanlarınaulaşmak iccedilin ccedileşitli yollar olmasına rağmen ccediloğu zaman dizi isminin arkasına koumlşeliparantezler iccedilinde indis belirtilerek kullanılırlar Eleman sayısı BOY olan bir dizi iccedilinindisin alabileceği değerler 0rsquodan BOY-1rsquoe kadar değişir Yani yukarıda tanımlanmışolan u tamsayı dizisinin elemanları u[0] u[1] veya u[2] şeklinde kullanılabilirİndisin her zaman değişmez bir tamsayı olmasına gerek yoktur genelde bir ifade olurYani u[x+5] geccedilerli bir kullanımdır Doğal olarak eğer ldquox+5rdquo ifadesinin değeri 0 1veya 2 değilse beklenmeyen sonuccedillar elde edilebilir Bu tip kullanımları kontrol altındatutmak tamamen programcının sorumluluğundadır
Değişik tiplerde tanımlanmış değişkenler iccedilin mevcut derleyiciler tarafından ayrılanbellek miktarı ile alt ve uumlst limit değerleri şoumlyledir
tip anlamı bayt sayısı limitlerchar 1 -- signed char 1 -127127-- unsigned char 1 0255short 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) -215 215-1 = -32 768 32 767 (16 bitlik bilgisayarlar iccedilin)(2) -231 231-1 = -2 147 483 648 2 147 483 647 (32 bitlik bilgisayarlar iccedilin)(3) 0 216-1 = 0 65 535 (16 bitlik bilgisayarlar iccedilin)(4) 0 232-1 = 0 4 294 967 295 (32 bitlik bilgisayarlar iccedilin)(5) -1038 -10-38 0 10-38 1038(6) -10308 -10-308 0 10-308 10308(7) -104932 -10-4932 0 10-4932 104932Not 16 bitlik bilgisayarlarda veya derleyicilerde (signed veya unsigned) int 16bittir 32 bitliklerde ise 32 bittir
13
12 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
Tam sayılar ve kayan noktalı sayılar iccedilin her bilgisayarda farklı olabilecek buoumlzellikler tam olarak limitsh ve floath adlı başlık dosyalarında tanımlanmıştırBirtakım varsayımlar yapmak yerine bu başlık dosyalarında tanımlanmış bulunandeğişmezlerin kullanılması oumlzellikle oumlnerilir (Başlık dosyaları iccedilin bir sonraki kısma veayrıca Kısım F5rsquoe bakınız)
14 define Ve include Oumlnişlemci Emirleri
Hemen buumltuumln C derleyicileri oumlzel oumlnişlemci emirlerini tanıyan bir oumlnişlemciyi yapılarındabulundururlar Oumlnişlemci emirleri bir bakıma C derleyicisinin girdisini yani kaynakkodu kontrol etmede kullanılır Bir oumlnişlemci emrinin ilk karakteri her zaman numaraişaretidir () ve kaynak programda satırın ilk karakteri olmalıdır Normalde oumlnişlemciemirlerinin ccediloğu kaynak programın başına bildirimlerden oumlnce yazılır
C programlarında ccedilokccedila kullanıldıkları iccedilin bu boumlluumlmde sadece define veinclude oumlnişlemci emirleri anlatılmaktadır Diğer oumlnişlemci emirlerinin daha detaylıbir anlatımı Boumlluumlm 6rsquoda verilmektedir
define emri şu şekildedir
define tanıtıcı_soumlzcuumlk karakter_dizisi
Bu tuumlr bir define emri emirden sonra gelen program deyimlerinde tanıtıcı_soumlzcuumlkbulunan her yerde onun yerine karakter_dizisinin konulacağını goumlsterir Oumlrneğin
define XYZ 100
emri daha sonra XYZrsquonin her rastlandığı yerde 100 konulmasını sağlar Program iccedilindekullanılacak değişmezleri tanımlamanın yaygın bir yolu da budur define emirleriyletanımlanan tanıtıcı soumlzcuumlklerin buumlyuumlk harfle yazılması alışılagelmiştir
include emri ya
include dosya_adı
yada
include ltdosya_adıgt
şeklinde olur ve oumlnişlemciye include satırının yerini belirtilen dosyanın alacağınıgoumlsterir Eğer dosya_adı ccedilift tırnak iccediline alınmışsa o zaman oumlnişlemci dosyayı kaynakprogram dosyasının saklandığı altdizinde arar Eğer dosya_adı accedilılı parantezler iccedilinde iseo zaman dosya boumlyle include emirleri iccedilin aramaların yapıldığı ldquostandartrdquoaltdizin(ler)de aranır Normalde bu include altdizini olur
include emri daha oumlnceden hazırlanan standart veya kullanıcı tarafındantanımlanan dosyalarda saklanan sık kullanılan veri ve fonksiyon bildirimlerini programadahil etmede kullanılır Boumlyle dosyalara başlık dosyaları adı verilir ve isimleridosyaadih şeklinde olur
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 13
15 İşleccediller İfadeler Ve Atama Deyimleri
C dili sağladığı işleccediller (işlem operatoumlrleri) accedilısından ccedilok zengindir İşletilebilir Cdeyimlerinin ccediloğu bir ifade şeklinde yazılır Bu ifade belirli kurallara uygun olarakoluşturulmuş bir işlenenler ve işleccediller karışımıdır Diğer programlama dillerine karşılık Cdilinde bir atama bile oumlzel bir ccedileşit ifadedir
Bir ifade iccedilinde bir işlenen ya bir değişmez ya bir değişkenin kullanılması ya birfonksiyon ccedilağrısı yada başka bir (alt)ifade şeklinde karşımıza ccedilıkar İşleccediller (işlemoperatoumlrleri) aritmetik işlemler atama bağıntısal ve mantıksal karşılaştırmalar bitişlemleri adreslerle ilgili işlemler ve başka işlerde kullanılırlar Crsquode kullanılan aritmetikişleccediller ve anlamları liste şeklinde aşağıda verilmiştir
+ toplama veya tekli artı- ccedilıkarma veya olumsuzlama ccedilarpma boumllme kalan (52 ifadesinin değeri 52rsquoden arta kalan yani 1rsquodir İşlenenler
olumlu tamsayılar olmalıdr)++ anlamı işlecin işlenenin oumlnuumlnde veya arkasında olmasına bağlı olarak
değişir ancak sonuccedilta işlenenin değeri bir artırılır-- anlamı işlecin işlenenin oumlnuumlnde veya arkasında olmasına bağlı olarak
değişir ancak sonuccedilta işlenenin değeri bir azaltılır
Basit bir atama deyimi şu şekildedir
değişken = ifade
ve ifadenin değerinin hesaplandıktan sonra değişkenin değerinin buna eşitleneceğianlamına gelir İfadeden sonraki noktalı virguumlle dikkat edin Bu noktalı virguumll deyimisonuccedillandırır
İşte bazı oumlrnekler Son iki oumlrneğin aynı anlamı taşıdığına dikkat edina = b + 10c = d + c e - f g + h jx = y sin(z - 314)z = u[2] u[0]u[1] = -12345x = 10(x) = 10
C dilinde diğer programlama dillerine karşılık atamanın kendisi de bir ifadedirbundan dolayı bir değere sahiptir Bir atama ifadesinin değeri değeri hesaplanarak soltaraftaki değişkene atanan ifadenin değeridir Atama ifadesinin tipi ise soldaki işlenenintipiyle aynıdır Bu olgu C dilinde ccedilok kullanılır Oumlrneğin bir ifadenin değeri aynı andabirden fazla değişkene şu şekilde atanabilir
a = b = c = 0
13
14 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
c değişkeni 0rsquoın değerini b crsquonin değerini ve a brsquonin değerini alır boumlylece buumltuumlndeğişkenler 0rsquoa eşitlenir
Aşağıda ++ ve -- işleccedillerini accedilıklamak iccedilin bazı oumlrnekler verilmiştir
x = y++ yrsquonin değeri oumlnce xrsquoe atanır sonra da bir artırılır Bu şunaeşdeğerdir x = y y = y+1
x = ++y yrsquonin değeri oumlnce bir artırılır sonra da xrsquoe atanır Bu şunaeşdeğerdir y = y+1 x = y
x = y-- yrsquonin değeri oumlnce xrsquoe atanır sonra da bir azaltılır Bu şunaeşdeğerdir x = y y = y-1
x = --y yrsquonin değeri oumlnce bir azaltılır sonra da xrsquoe atanır Bu şunaeşdeğerdir y = y-1 x = y
++ ve -- işleccedilleri yan etkisi olan işleccedillerdir ccediluumlnkuuml tek bir atama deyimi ile birdenfazla değişkenin değeri değiştirilebilir Programcıların bu işleccedilleri karmaşık ifadelericcedilinde kullanmaları uygun değildir ccediluumlnkuuml boumlyle bir kullanım nispeten daha zoranlaşılabilir ve hataların daha zor duumlzeltildiği programların ortaya ccedilıkmasına neden olur
Basit atama işleci (=) dışında atamayı aritmetik işlemlerle birleştiren atama işleccedilleride vardır Bunlar += -= = = ve =rsquodır İşte bazı oumlrnekler
x += y xrsquoe y eklenir bu da x = x + (y) anlamına gelirx -= y xrsquoten y ccedilıkarılır bu da x = x - (y) anlamına gelirx = y x y ile ccedilarpılır bu da x = x (y) anlamına gelirx = y x yrsquoye boumlluumlnuumlr bu da x = x (y) anlamına gelirx = y xrsquoe xrsquoin yrsquoe boumlluumlmuumlnden arta kalan atanır bu da x = x
(y) anlamına gelir
Tabii ki yukarıdaki deyimlerin herhangi birinde y değişkeninin yerine genel bir ifadekonulabilir Sol taraftaki x değişkeni yerine de bellekteki belli bir konuma karşılık gelendaha karmaşık bir ifade konulabilir oumlrneğin u[a+b] Bu durumda bu ifade bir kezhesaplanır Diğer bazı işlemlerle atamayı birleştiren atama işleccedilleri daha sonrakiboumlluumlmlerde tartışılacaktır
Oumlncelik Ve Birleşme Kuralları
Bir ifade iccedilinde işleccedillerin işlenenleri ya
1 C dili tarafından belirlenmiş bulunan işleccedillerin oumlncelik ve birleşme oumlzelliklerineyada
2 işlenen ifadelerini parantez iccediline alarak
belirlenir
Parantezler bir işlecin işlenenlerini o işlecin oumlnceliğine bağlı olmadan belirtmekveya işleccedillerin işlenenlerini daha accedilıklayıcı olacak şekilde yazmak iccedilin kullanılırlar İkincineden kolayca anlaşılır ifadeler yazmak iccedilin oumlnemlidir ccediluumlnkuuml C dilinde oumlncelik vebirleşme oumlzellikleri kolayca anımsanamayacak kadar ccedilok işleccedil bulunmaktadır
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 15
Oumlrneğina = b + c d
ifadesinde işleccediller ve işlenenler şoumlyledir
işleccedil işlenenler c ve d+ b ve (c d)rsquonin değeri= a ve (b + (c d))rsquonin değeri
Eğer ifadea = b + (c d)
şeklinde yazılırsa işlenenler aynıdır ancak parantezler işleccedillerin işlenenlerini daha accedilıkhale getirirler
Fakat ifadea = (b + c) d
şeklinde yazılırsa işleccediller ve işlenenler şoumlyle olur
işleccedil işlenenler+ b ve c (b + c)rsquonin değeri ve d= a ve ((b + c) d)rsquonin değeri
Yukarıdaki oumlrneklerden de goumlruumllebileceği gibi bir işlecin oumlncelik duumlzeyi işleccedillereatanacak olan işlenenlerin sırasını belirlemeye yarar Daha yuumlksek oumlnceliği olan bir işlecinişlenenleri daha duumlşuumlk olan bir işleccedilten oumlnce atanacaktır Eğer işleccedillerin oumlncelik duumlzeyleriaynıysa o zaman birleşme kuralı işlenenlerin soldan sağa mı yoksa sağdan sola mıatanacağını belirtir Aşağıdaki ccedilizelgede şimdiye kadar anlatılmış bulunan işleccedillerinoumlncelik duumlzeyleri ve birleşme oumlzellikleri verilmiştir
işleccedil oumlncelik birleşme[] indisleme en yuumlksek rarr+ - ++ -- tekli larr ccedilarpma rarr+ - toplama rarr= += vs atama en duumlşuumlk larr
Burada ldquolarrrdquo sağdan sola ve ldquorarrrdquo soldan sağa birleşmeyi goumlsterir Oumlrneğin
abc ile (ab)c aynı anlama gelir
ve
a=b=c ile a=(b=c) aynı anlama gelir
Bir başka oumlrnek olarakc = d + c e - f g + h j
13
16 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
ifadesic = (((d + (c e)) - (f g)) + (h j))
şeklinde işleccedillerin işlenenlerini ve ifadenin anlamını değiştirmeden parantezlenebilir
Dikkat Bir işlecin işlenenlerinden hangisinin oumlnce hesaplanacağının belirtilmemişolduğuna dikkat edin Oumlrneğin
a = ++b - b
ifadesinin değeri derleyiciye bağlı olarak ya 0 yada 1 olabilir bu yuumlzden bu tuumlr yanetkisi olan ifadelerden kaccedilınılması gerekir Ayrıca + ve gibi birleşme ve değişmeoumlzelliği goumlsteren işleccedillerde parantezlerin bulunmasına rağmen birleşme kuralı bazıderleyiciler tarafından dikkate alınmayabilir
Değişmez İfadeler
Bazı işleccedillermdashoumlrneğin atama ve ++ ile -- işleccedilleri dışında şimdiye kadar oumlğrenmişolduğumuz işleccedillermdashdeğişmezlere (veya değişmez ifadelere) uygulandıklarında değişmezifadeler oluştururlar Değişmez ifadelerin avantajı derleme sırasındahesaplanabilmeleridir Derleyici değişmez ifadenin değerini hesaplayıp yerine değişmezdeğeri koyar Değişmez ifadeler bir değişmezin beklendiği yerlerde kullanılabilirlerOumlrneğin dizi boyları değişmez olmalıdır bu durumda
int a[MAXL5+4]
tanımı eğer MAXL oumlnişlemci tarafından (define ile) tanımlanmış bir değişmez isekabul edilebilecek fakat eğer MAXL bir değişken ise reddedilecektir Programınanlaşılabilirliğini geliştirebileceği iccedilin değişmez ifadelerin kullanımından kaccedilınmamakgerekir
16 Tip Doumlnuumlşuumlmuuml Ve Kalıplar
Bir işleccedil işlenen(ler)ine uygulandığı zaman belirli bir tipten bir değer oluştururMeydana ccedilıkan değerin tipi işlecin işlenen(ler)ine işlecin kendisine ve tip doumlnuumlşuumlmuumlkurallarına bağlıdır Oumlrneğin x+y ifadesinin değeri hesaplandığı zaman x ve y tamsayıise ortaya ccedilıkan değerin tipi de tamsayı olur C dilinde işleccedillerin ccediloğu değişik tiplerdeişlenenleri kabul ettikleri iccedilin genel olma oumlzelliğini taşır Oumlrneğin yukarıdaki ifadede eğery double olsaydı ortaya ccedilıkacak değer de double tipinde olacaktı
Değişik tipte işlenenlerin bulunduğu ifadelere karışık-tip ifadeler denir Karışık-tipifadelerin değerleri hesaplandığında ara veveya sonuccedil değerlerin tipleri ya dolaylıolarak otomatik tip doumlnuumlşuumlmuumlyle belirlenir yada accedilık olarak kalıp kullanılarak kontroledilir
Değişik tipten iki işlenen varsa C dili kurallarına goumlre otomatik tip doumlnuumlşuumlmuumluygulanır Bu kurallar şoumlyledir
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 17
1 Oumlnce char ve short olan işlenenleri intrsquoe veya gerekiyorsa unsignedrsquoadoumlnuumlştuumlr
2 Sonra aşağıdaki listeye uygun bir şekilde duumlşuumlk tipten olan işlenenin tipini dahayuumlksek tipten olanınkine doumlnuumlştuumlr
tip duumlzeylong double en yuumlksekdouble float unsigned long long unsignedrsquoın tuumlm olası değerlerinin
long tarafından iccedilerildiği varsayılırsaunsigned int en duumlşuumlk
Tip doumlnuumlşuumlmuuml uumlzerine birkaccedil oumlrnek i jrsquonin int xrsquoin float drsquonin double vecrsquonin char olduğunu kabul edin
i = j + x + dc = c + A - a
İlk ifadede j floatrsquoa doumlnuumlştuumlruumlluumlr j+xrsquoin değeri doublersquoa doumlnuumlştuumlruumlluumlr vej+x+drsquonin değeri doublersquodan intrsquoe ccedilevrilir İkinci ifadede crsquodeki kuumlccediluumlk harfi buumlyuumlğeccedilevirmek iccedilin tamsayı aritmetiği kullanılır
Otomatik tip doumlnuumlşuumlmuuml programlarda oumlnemli bir hata kaynağı olduğu iccedilin tipdoumlnuumlşuumlmuumlnuumln accedilıkccedila kalıplar kullanılarak kontrol edilmesi oumlnerilir Bir kalıp basitccedileifadenin oumlnuumlne konulan parantez iccediline alınmış bir tiptir yani
(tip) ifade
ifadenin tipinin parantez iccediline alınmış olan tipe doumlnuumlştuumlruumlleceğini goumlsterir Gerccedilekteparantez iccediline alınmış olan tip ifadenin değerini amaccedillanan tipe doumlnuumlştuumlren oumlzel birişleccediltir Bu işlecin oumlnceliği diğer tekli işleccedillerin oumlnceliği ile aynıdır İşte bazı oumlrnekler xy zrsquonin float i jrsquonin int olduğunu varsayın y ve zrsquonin hesaplanmasındaki farkadikkat edin
x = (float) iy = (float) (i j) int bolme islemi z = (float) i (float) j float bolme islemi i = (int) (x (float) j)
17 Basit GirdiCcedilıktı
Girdi ve ccedilıktı deyimleri gerccedilekte C dilinin bir parccedilası değildir Yani diğer programlamadillerinin tersine C dilinin iccediline konmuş girdiccedilıktı deyimleri yoktur Girdiccedilıktı işlemleriher zaman fonksiyonlar ccedilağrılarak yapılır Tabii ki girdiccedilıktı yapmak iccedilin kullanılan
13
18 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
fonksiyonların programcı tarafından yazılmasına gerek yoktur Hemen hemen buumltuumln Cortamlarında girdiccedilıktı fonksiyonları iccedileren standart kuumltuumlphaneler bulunmaktadır Bukuumltuumlphanelerde tanımlanmış bulunan fonksiyonlar (ile alabilecekleri arguumlmanlar) ve ilgilibirtakım değişkenlerin bildirisi ise bir başlık dosyasına konur stdioh boumlyle bir başlıkdosyasıdır ve herhangi bir standart girdiccedilıktı fonksiyonu ccedilağrılmadan veya değişkenlerikullanılmadan oumlnce
include ltstdiohgt
yazılarak kaynak programın iccediline kopyalanması gerekir
Kullanıcının girdiccedilıktı yapması iccedilin uumlccedil girdiccedilıktı ara dosyasının tanımı oumlncedenyapılmıştır Bunlar şunlardır
stdin standart girdistdout standart ccedilıktıstderr standart hata ccedilıktısı
ve normal olarak kullanıcının klavye ve ekranına bağlanmıştır
Programcının basit girdiccedilıktı işlemleri yapması iccedilin sadece gerekli olan printfscanf getchar putchar _getch ve _getche fonksiyonları bu kısımdaanlatılacaktır Diğer girdiccedilıktı fonksiyonları iccedilin girdiccedilıktı ile ilgili boumlluumlme bakınız
printf(kontrol_karakter_dizisi arguumlman_listesiopt) Fonksiyonu
Bu fonksiyon stdoutrsquoa yapılacak biccedilimli ccedilıktı iccedilindir Kontrol_karakter_dizisiarguumlman_listesindeki arguumlmanların değerlerinin ccedilıktısını denetleyen sıfır veya daha fazladoumlnuumlşuumlm tanımlamaları sağlar Arguumlman_listesi virguumlllerle ayrılmış arguumlmanlardan oluşurve bulunması zorunlu değildir
En basit doumlnuumlşuumlm tanımlaması şu şekildedir
z
Burada zrsquonin yerine aşağıdaki doumlnuumlşuumlm karakterlerinden biri gelmelidir
doumlnuumlşuumlm karakteri ccedilıktıc işaretsiz bir karakters karakter dizisi (karakter goumlstergesi)
d veya i işaretli bir ondalık tamsayıu işaretsiz bir ondalık tamsayı
x X işaretsiz bir onaltılı tamsayıo işaretsiz bir sekizli tamsayıf doublee E e veya E goumlsteriminde doubleg G e (E) veya frsquonin en kısasıp bir goumlstergenin değerin şimdiye kadar yazılmış olan karakterlerin sayısı
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 19
Genelde bir doumlnuumlşuumlm tanımlaması şu şekildedir
f0wplz
Burada f isteğe bağlı olarak aşağıdaki bayraklardan biridir
bayrak anlamı- ccedilıktı alanında sola yanaştır+ oumlne bir işaret koy kayan noktalı sayılar iccedilin mutlaka nokta konmasını
sağla sekizli iccedilin oumlne 0 onaltılı iccedilin oumlne 0x (0X)koy
boşluk karakteri eğer işaret yoksa bir boşluk koy
İsteğe bağlı olan 0 sayının solunu sıfırla doldurmak iccedilindir İsteğe bağlı olan w sayısıccedilıktı değerini alacak olan ccedilıktı alanının genişliğini belirtir İsteğe bağlı olan p sayısıkayan noktalı bir sayı iccedilin kesir kısmındaki rakamların sayısını bir karakter dizisi iccedilinyazılacak en fazla karakter sayısını veya bir tamsayı iccedilin yazılacak en az rakam sayısınıgoumlsterir İsteğe bağlı olan l ise arguumlmanın kısa (h) uzun (l) bir tamsayı veya uzun (L) birdouble olduğunu goumlsterir
float iccedilin bir doumlnuumlşuumlm tanımlaması olmadığına dikkat edin herhangi bir floatifadeyi bir kalıp kullanarak doublersquoa doumlnuumlştuumlruumln w ve prsquonin yerine konulacak bir genişliğin arguumlman_listesindeki bir int arguumlmandan alınacağını goumlsterir Normaldedeğerler ccedilıktı alanlarında sağa yanaştırılırlar
İşte bazı oumlrnekler crsquonin int toplamrsquoın da double olduğunu varsayın Yeni satırkarakterlerine dikkat edin
printf(Merhaban)printf(sn Merhaba) yukaridakiyle ayni cikti printf(nSayi=d adet c) cnin degeri gereken genislikte bir tamsayi olarak yazilir printf(nSayi=4d adet c) yukaridakiyle ayni ancak alan genisligi en az 4 printf(nToplam=52f toplam)printf(nToplam=f 5 2 toplam) toplamin degeri dddd biciminde yazilir printf(nToplam=52f Sayi=4d toplam c)
Eğer rsquoden sonraki karakter geccedilerli bir karakter değilse sonucun ne olacağıbelirsizdir tek bir yuumlzde işareti basar printf fonksiyonu hakkında daha fazla bilgiiccedilin ilgili C derleyicisinin girdiccedilıktı kuumltuumlphane fonksiyonları el kitabına veya ccedilevrimiccediliyardım kolaylıklarına bakılması oumlnerilir
scanf(kontrol_karakter_dizisi arguumlman_listesiopt) Fonksiyonu
Bu fonksiyon stdinrsquoden biccedilimli girdi yapmak iccedilindir Kontrol_karakter_dizisiarguumlman_listesindeki arguumlmanlara verilecek değerleri kontrol eden sıfır veya daha fazladoumlnuumlşuumlm tanımlamaları sağlar Kontrol_karakter_dizisindeki doumlnuumlşuumlm karakterleri
13
20 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
dışındaki karakterlerin girdi akımında karşılık gelen karakterlerle aynı olması beklenirArguumlman_listesi girdi değerleri iccedilin hedef olan değişkenlerin adreslerinin birbirindenvirguumllle ayrılarak yazılmasından oluşur Yapılmış olan başarılı doumlnuumlşuumlmlerin sayısıfonksiyonun değeri olarak geri doumlnduumlruumlluumlr
Doumlnuumlşuumlm tanımlamaları şu şekildedir
wlz
Burada değerin arguumlmana atanmasını engeller w en buumlyuumlk alan genişliğini belirtir l isearguumlmanın buumlyuumlkluumlğuumlnuuml goumlsterir Uumlccediluuml de isteğe bağlıdır z doumlnuumlşuumlm karakteri geneldeprintfrsquoteki gibidir Girdi akımında bir alan beyaz (boşluk tab yeni satır vs) olmayanbir karakterle başlayıp ilk gelen beyaz karakterle veya belirtilen alan uzunluğu sonundabiter
İşte bazı oumlrnekler c1 c2rsquonin char irsquonin int yrsquonin float drsquonin double vesrsquonin char dizisi olduğunu varsayın lf bir sayının okunmasını ve double olarakdepolanmasını sağlar long double iccedilin Lf kullanın amp işlecinin fonksiyonadeğişkenin değerinin değil de adresinin iletilmesi iccedilin kullanıldığına dikkat edin Bu işleccedilBoumlluumlm 3rsquote anlatılacaktır
scanf(d ampi)scanf(4d ampi)scanf(cc3sdflf ampc1 ampc2 ampi ampy ampd)scanf([^] s)scanf([ABC] s)
Son iki oumlrneğin ilki (beyaz boşluk karakterlerinden biriyle değil de) bir nokta ilesonlandırılmış bir karakter dizisinin okunarak noktanın atlanmasını sağlar Son oumlrnektesadece A B veya C karakterlerini iccedileren bir karakter dizisi okunmaktadır scanffonksiyonunun kullanımı hakkında daha fazla bilgi iccedilin derleyicinizin elkitaplarına veyaccedilevrimiccedili yardım kolaylıklarına başvurunuz
getchar() Ve putchar() Fonksiyonları
Bu fonksiyonlar stdinrsquoden veya stdoutrsquoa bir karakterin girilmesini veya ccedilıktısınınyapılmasını sağlarlar Tipik bir kullanım şoumlyledir crsquonin char veya int olduğunufarzedin
c = getchar()putchar(c)
Eğer klavyeden girilen bir karakter dizisi arka arkaya getchar fonksiyonununccedilağrılmasıyla okunursa getchar()rsquoın vereceği son karakter satır ilerletme karakteri(n) olacaktır ccediluumlnkuuml satırbaşı karakteri (r) standart girdiccedilıktı yordamlarıtarafından elenmektedir Aynı şekilde putchar() kullanıldığında satır sonuna nyazılması yeterlidir r karakteri otomatik olarak nrsquonin oumlnuumlne eklenecektir
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 21
_getch() Ve _getche() Fonksiyonları
Standart olmayan bu fonksiyonlar klavyedeki bir tuşa yapılan tek bir vuruştan ortayaccedilıkan karakteri verirler Yani programın bilgi alabilmesi iccedilin getchar() gibi satırınENTERrsquola bitirilmesini beklemezler _getche()rsquode girilen karakter ekrana yansıtılır_getch()rsquode bu olmaz Not Bu fonksiyonlar standart olmadıkları iccedilin isimlerininoumlnuumlnde altccedilizgi (_) karakteri bulunmaktadır ancak bazı sistemlerde oumlrneğin Microsoft Cderleyicisinin eski uyarlamalarında altccedilizgi karakteri olmadan kullanılmaları gerekebilirVerilen oumlrnek programlarda bunu dikkate alarak kendi sisteminiz iccedilin gerekliduumlzenlemeleri yapabilirsiniz
Girdide Dosya Sonu Kontroluuml
stdioh başlık dosyasında define ile tanımlanmış bulunan EOF ismi dosya sonunukontrol etmek iccedilin kullanılabilir Sistemimizde dosya sonu ASCII ondalık kodu 26 olanCONTROL+Z (klavyedeki CONTROL tuşu basılı iken Zrsquoye basılarak oluşturulur) karakterininalınması şeklinde tanımlanmıştır Ancak C kuumltuumlphanesindeki standart bir fonksiyontarafından doumlnduumlruumllen dosya sonu işareti EOFrsquotur if deyiminin henuumlz anlatılmamasınarağmen aşağıdaki oumlrnek stdinrsquoden dosya sonunun nasıl anlaşılabileceğini goumlsterirDikkat crsquonin tipi en azından int olmalıdır
c = getchar()if (c == EOF) eger dosya sonu ise dosya sonu işlemleri yapan deyimler
18 C Deyimleri Ve Program Goumlvdesi
C programları deyimlerden oluşur Yazılabilecek en basit deyim bir ifade deyimidir Birifade deyimi arkasına noktalı virguumll konmuş herhangi bir ifadedir Oumlrneğin
a + b ci++
iki ayrı ifade deyimidir ancak bunlardan ilki pek bir işe yaramaz oysa ikincisi yanetkisinden dolayı bir işe yarar irsquonin değerinin bir artırılmasına neden olur
Bileşik bir deyim dışında her deyim noktalı virguumllle sona erer
Bir bileşik deyim (ayrıca bildirimler iccedilerdiği zaman ldquoblokrdquo da denir) aşağıdaki gibiccedilengelli parantezler arasına alınmış bir deyimler sırasıdır Bileşik deyimden sonra noktalıvirguumll olmadığına dikkat edin
bildirimleropt deyim1opt deyim2opt deyimn opt
13
22 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
Soumlzdizimsel accedilıdan bir bileşik deyim tek bir deyime eşdeğerdir İsteğe bağlı olarakbir bileşik deyimin ilk yuumlruumltuumllebilir deyiminden oumlnce değişken tanımları ve bildirimleribulunabilir Tanımların bir bileşik deyim iccediline konmasının oumlnemli bir sonucu vardırYuumlruumltme esnasında bir bileşik deyim iccedilinde tanımlanmış bulunan değişkenler iccedilin bloğagirildiğinde bellek ayrılır bloktan ccedilıkıldığında ise bu bellek boumllgesi serbest bırakılır Eğerbileşik deyim dışında aynı isimde değişkenler varsa bloğa girildiğinde bunlarınkimlikleri geccedilici olarak ldquounutulurrdquo ve yeni tanımlar etkili olur Bloktan ccedilıkıldığında eskitanımlar etkilerini tekrar kazanırlar Bu durum iccediliccedile olan bloklar iccedilin meydana gelebilir
Şimdilik bir C programının genel şekli aşağıdaki gibi oumlzetlenebilir
Programin ne yaptigini kimin tarafindan ne zaman yazildigini vs belirten aciklamalar buumltuumln oumlnişlemci emirlerivoid main (void) veri tanımları deyimler main
Program goumlvdesinin buumlyuumlk bileşik bir deyimden oluştuğuna dikkat ediniz Daha sonraanlatılacağı gibi fonksiyon tanımları da aynı şekilde yazılır yani ana program da birbakıma bir fonksiyondur
19 Bir C Programı Nasıl İşletilir
Birccedilok bilgisayar ve işletim sistemi iccedilin ccedilok sayıda C programı geliştirme ortamları vederleyicileri mevcuttur Bu kısımda IBM Kişisel Bilgisayarları veya uyumlularının MS-DOS işletim sistemi altında ccedilalışan Microsoft QuickC (MS-QC) Uyarlama 101rsquoinkullanımı kısaca anlatılacaktır Microsoft komut satırı derleyicisi (MS-CL) ise dahadetaylı olarak Ek Brsquode anlatılmaktadır
MS-QC kullanımı ccedilok kolay olan bir C programlama ortamıdır bundan dolayıonunla başlamanızı oumlneririz MS-QC buumltuumlnleşmiş bir kaynak programı editoumlruuml detaylısayılabilecek yardım kolaylığı ve yuumlruumltme zamanı hata duumlzelticisiyle birlikte gelir Yenibir C programcısı MS-QC ortamından ayrılmadan bir C programı yazabilir derleyebilirccedilalıştırabilir ve hatalarını duumlzeltebilir
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 23
MS-QC uygun bir şekilde hard diskinize yerleştirilmişse veya dağıtım disketi disketsuumlruumlcuumlnuumlze yerleştirilmişse işletim sistemi iletisine QC yazın İsterseniz C programınızıiccedileren kaynak dosya adını da belirtebilirsiniz Oumlrneğin
CgtQC mprogc
MS-QC tepesinde birtakım menuuml maddelerinin bulunduğu ve komut satırında belirtilenkaynak dosyadan satırlarla doldurulan bir goumlruumlntuumlleme boumllgesinden oluşan bir ekransunacaktır Eğer kaynak dosya belirtilmemişse goumlruumlntuumlleme boumllgesi boş olacaktır Hemenyeni C programınızı yazmaya başlayabilirsiniz veya aşağıdaki duumlzenleme tuşlarınıkullanarak eski bir programda değişiklikler yapabilirsiniz
Yukarı aşağı sola sağa oklarPAGE UP (sayfa yukarı)PAGE DOWN (sayfa aşağı) imleccedil hareketiINSERT araya eklemeuumlste yazmaDELETE imlecin arkasındaki karakteri silme
Diğer klavye tuşlarının duumlzenleme işlevlerini ortaya ccedilıkarmak iccedilin deneme yanılmayoumlntemini kullanın MS-QC editoumlruumlnuumln kullanımı temelde MS-DOSrsquodaki EDITkomutuna benzemektedir
Bir C programı yazıldıktan sonra bir menuuml maddesi seccedililerek derlenebilirccedilalıştırılabilir hataları duumlzeltilebilir veya bir dosyada saklanabilir Eğer fareniz varsaseccedilime doğru suumlruumln ve tuşlayın Yoksa menuuml maddesinin ilk harfinin x olduğunuvarsayarsak ALT+xrsquoe basın Aynı şekilde ALTrsquoa basıp ok tuşlarını kullanarak menuumlmaddesini seccedilip ENTERrsquoa da basabilirsiniz MS-QC menuuml maddesinde altı ccedilizilmiş harfebasarak ilgili seccedilenek seccedililebilir Oumlrneğin
ALT+F Dosya menuumlsuumlnuuml accedilX MS-DOSrsquoa ccedilıkS Programı saklavs
ALT+R Geccediliş menuumlsuumlnuuml accedilC DerleS Derlenmiş programı yuumlruumltmeye başlavs
vs
ESC Alt menuuml penceresini kapa
Bir menuuml maddesinin seccedililmesi diyalog penceresi denilen ya ek seccedilimler yada bilgiveren mesajlar sunan başka bir pencerenin goumlruumlntuumllenmesine yol accedilabilir Bu tip menuumlmaddelerinin sonunda uumlccedil nokta bulunur
Soumlzdizimsel youmlnden hatalı bir program derlendiğinde MS-QC buumltuumln soumlzdizimhatalarını bulup ilk hatalı deyimi goumlruumlntuumlleyecektir İmleccedil hatanın uumlzerinde duracak veekranın alt tarafındaki diyalog kutusunda bir hata mesajı goumlruumlntuumllenecektir Bir oumlnceki
13
24 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
veya sonraki hata boumllgesi SHIFT+F3 veya SHIFT+F4rsquoe basılarak goumlruumlntuumllenebilir Buşekilde tekrar derlemeden oumlnce buumltuumln hataları bulup duumlzeltebilirsiniz
Bir C programı ayrıca basitccedile SHIFT+F5rsquoe basılarak veya RUN altmenuumlsuumlndenSTART seccedililerek derlenip ccedilalıştırılabilir Soumlzdizimsel hatalar az oumlnceki gibibildirilecektir fakat uyarı dışında başka hata yoksa programın yuumlruumltuumllmesine geccedililecektirProgramın ccedilıktısı otomatik olarak ccedilıktı ekranında goumlruumlntuumllenir MS-QC goumlruumlntuumlsuumlne geridoumlnmek iccedilin ENTERrsquoa basın Ccedilıktı ekranını tekrar goumlruumlntuumllemek iccedilin F4rsquoe basın
Şimdi de hata bulma konusunda bir iki soumlz Aşağıdaki youmlntemleri kullanmak iccedilinprogramınızın DEBUG modunda derlenmesi gerekmektedir Bunun iccedilin oumlnce ALT+Rrsquoyesonra Crsquoye basın Gelen pencerenin sağ tarafında ldquoDebugrdquo yazısının oumlnuumlnde X işareti olupolmadığını kontrol edin Eğer yoksa ALT+Drsquoye basın Daha sonra ENTERrsquoa basıp programıderleyin
Programınızı ccedilalıştırmaya başlamadan oumlnce deyime bir kesilme noktası (breakpoint)koyarak yuumlruumltmenin o deyime gelince beklemesini sağlayabilirsiniz Sadece imlecideyimin uumlstuumlne goumltuumlruumlp F9rsquoa basmanız yeterlidir Daha sonra kesilme noktasınıkaldırmak isterseniz aynı işlemi tekrarlayın
Programın ccedilalışması devam ettiği esnada bir değişkenin veveya ifadenin değerinigoumlruumlntuumlleyebilirsiniz DEBUG altmenuumlsuumlndeki ADD WATCH menuuml maddesini seccedilin vesuumlrekli goumlruumlntuumllemek istediğiniz değişkeni veya ifadeyi yazın
Ccedilalıştırılmakta olan deyimleri goumlruumlntuumllemek iccedilin bir izleme (trace) kolaylığı damevcuttur Bir fonksiyon ccedilağrısı esnasında fonksiyon iccedilindeki deyimleri izlemek iccedilin F8rsquoebasın fonksiyon iccedilindeki deyimlerin izlenmesini atlamak iccedilin F10rsquoa basın
QuickCrsquonin C programlamasını kolay hale getiren başka birtakım kolaylıkları davardır Kullanıcının ilgili elkitaplarına bakması veveya menuuml seccedilimlerini deneyerek bukolaylıkları ortaya ccedilıkarması oumlnerilir Microsoft Visual C++ Development System forWindows paketi iccedilindeki Visual Workbench programı kullanım bakımından MS-QCrsquoyeuyumlu ancak profesyonel kullanıcılara youmlnelik ccedilok daha gelişmiş bir ortam sağlar Diğeretkileşimli C ortamlarında da benzer olanaklar sunulmaktadır
110 Oumlrnek Programlar
Bu kısımdaki oumlrnek programlar ne işe yaradıkları hakkında kendi kendilerini accedilıklayacakşekilde yazılmışlardır ancak henuumlz anlatılmamışmdashif ve while gibimdashbazı deyimler veişleccediller iccedilerirler Bunların anlamlarını ortaya ccedilıkarmak iccedilin okuyucu eski programlamadeneyimlerine dayanarak bir kestirimde bulunabilir
Oumlrnek Program 1
Bu programda kullanılan _getche fonksiyonu bir standart girdi fonksiyonu olmadığıiccedilin dosya sonu kontroluuml MS-DOS standardına uygun olarak CONTROL+Z karakteri
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 25
kullanılarak yapılmaktadır Not _getche fonksiyonunun kullanımından dolayı buprogram ANSI Standardına uygun değildir1 2 3 Bu program CONTROL+Z girilinceye 4 kadar klavyeden girilen her karak- 5 terin ASCII kodunu verir 6 7 89 include ltstdiohgt10 include ltconiohgt11 void main (void)12 13 int c14 char ctrlz = 26 ASCII ond kodu 26 (CONTROL+Z) 1516 printf(nBazi kontrol karakterleri disinda17 ngirilen karakterin kodu goruntulenecek)18 while (1) 19 Ekrana yansitarak bir klavye tusunu oku20 CONTROL+Zye basilmissa programi bitir21 22 printf(nBir karakter girin )23 if ((c = _getche()) == ctrlz)24 break25 Girilen karakterle ayni satirda ondalik onaltili26 ve sekizli olarak ASCII kodunu goruntule27 28 printf( ondalik d onaltili x sekizli occc)29 while 30 main
Oumlrnek Program 21 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 1213 include ltstdiohgt14 define AGIRLIK 1015 Eger veri degerleri agirlikli olarak hesaplanacaksa16 agirliga farkli bir deger verin17 18
13
26 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ BOumlLUumlM 1
19 void main (void)20 21 int sayi22 int adet = 023 double kn_sayi toplam=00 karelerin_toplami=0024 double ortalama=00 varyans=002526 printf(nToplam ortalama ve varyans hesaplayan program27 nnLutfen ilk sayiyi (veya cikmak icin -1) girin )28 scanf(d ampsayi)29 Girilen sayi olumsuzsa programi bitir 30 while (sayi gt= 0) 31 adet++ Sayaci artir 32 Sayiyi doublea cevirip AGIRLIKla carp 33 kn_sayi = (double)sayi AGIRLIK34 Yeni toplami ve karelerin toplamini hesapla 35 toplam += kn_sayi36 karelerin_toplami += kn_sayi kn_sayi37 Yeni ortalama ve varyansi hesapla 38 ortalama = toplam (double)adet39 varyans = ortalamaortalama-karelerin_toplami(double)adet40 if (varyans lt 00)41 varyans = -varyans42 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 ampsayi)51 while 5253 En son hesaplanan degerleri bir daha ve degisik54 bir bicimde goruntule55 56 printf(nVerilerin adedi 12d adet)57 printf(nToplam 152f toplam)58 printf(nOrtalama 152f ortalama)59 printf(nVaryans 152f varyans)60 main
Problemler
1 Kernighan ve Ritchiersquonin (1978rsquode yayınlanan) The C Programming Language adlıkitaplarının ilk baskısında entry adı verilen bir anahtar soumlzcuumlkten bahsedilmekteidi Şu anki Standartta ve goumlrduumlğuumlmuumlz herhangi bir derleyicide mevcut değildirileride kullanılmak amacıyle ayrıldığı soumlylenmekte idi Derleyicinizde entryrsquonin biranahtar soumlzcuumlk olup olmadığını belirlemede size yardımcı olacak bir programdeneyin
2 Soyağacınızı basan bir program yazın (Uumlccedil duumlzey yeterlidir)
3 Aşağıdaki deyimin sonucunu accedilıklamaya ccedilalışın
13
BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BİR BAKIŞ 27
printf(d printf(C iyi bir dildirn))
4 Aşağıdaki geccedilerli bir deyim midir((x) = (5))
5 Aşağıdaki geccedilerli bir C deyimi midir
6 Aşağıdaki programın girdi olarak verilen bir gerccedilek sayının tamsayı kısmınıgoumlruumlntuumlleyeceğine inanılmaktadırinclude ltstdiohgtvoid main (void) float x scanf(f x) printf(d x)
Fakat ccedilalışır gibi goumlzuumlkmemektedir Duumlzeltin İpucu Derleyicinin bulamayacağı ikiayrı hata bulunmaktadır
13
13
29
BOumlLUumlM 2 DEYİMLER VEKONTROL AKIŞI
Duumlşuumlnuumlleceği gibi her deyim bilgisayara ne yapacağını soumlyleyen temel bir programadımıdır Bu boumlluumlme tuumlm C deyimlerinin bir listesini vermekle başlayacağız Ondansonra kontrol akışı deyimleri iccedilindeki ifadelerde sıkccedila kullanılan işleccedil grubundanbahsedeceğiz Boumlluumlmuumln geri kalanında C program deyimlerinin yuumlruumltuumllme sırasınıkontrol eden deyimler detaylı olarak anlatılacaktır
Bir C programı main fonksiyonunun ilk deyiminden ccedilalışmaya başlar Eğer kontrolakışı başka youmlne youmlnlendirilmezse deyimler program iccedilindeki sıralarında ard ardaişletilir ve yuumlruumltme mainrsquoin son deyiminden sonra durur Kontrol akışını youmlnlendirmeninbir yolu da bir fonksiyon ccedilağrısı yapmaktır Bu boumlluumlmde ayrıntılı olarak anlatılacakdeyimler ise kontrol akışını kendilerine oumlzguuml yollarla etkilerler
Başlamadan oumlnce Pascal-severlere oumlnemli bir uyarımız var C dilinde noktalı virguumlldeyimleri ayırmak iccedilin değil bazı deyimleri bitirmek iccedilin kullanılır Yani noktalı virguumlldeyimin bir parccedilasıdır Gerek olmadığını sandığınız bazı yerlere noktalı virguumll koymanızgerekebilir Oumlrnekleri goumlrduumlkccedile kuralların daha accedilık olacağını umuyoruz
21 C Dilinin Deyimleri
Ccedilizelge 21rsquode buumltuumln C deyimleri liste halinde verilmiştir Bu ccedilizelgenin ilk iki maddesioumlnceki boumlluumlmde zaten anlatılmıştı Geri kalanlar ise temelde kontrol akışı deyimleridir vereturn dışında hepsi bu boumlluumlmde anlatılacaktır
13
30 DEYİMLER VE KONTROL AKIŞI BOumlLUumlM 2
CcedilİZELGE 21 C dilinin deyimlerideyim işlevifade ccedileşitli (atama fonksiyon ccedilağırma vs)bileşik birden fazla deyimden tek bir deyim oluştururif koşullu yuumlruumltmeswitch (herhangi bir sayıda seccedileneklerle) koşullu yuumlruumltmewhile (devam testinin her yinelemeden oumlnce olduğu) doumlnguumlfor while gibi fakat bir ldquoilklemerdquo boumlluumlmuuml vardo (devam testinin her yinelemeden sonra olduğu) doumlnguumlbreak bulunulan bloktan dışarı atlanmasıcontinue mevcut yinelemenin geri kalanının atlanmasıgoto (bulunulan fonksiyon iccedilinde) herhangi bir boumllgeye atlanmasıetiketli gotorsquonun hedefireturn (olası bir değerle) fonksiyondan doumlnuumlşboş hiccedil (bazı soumlzdizimsel kullanımları vardır)
22 Bağıntısal Ve Mantıksal İşleccediller
C dilinde dokuz işleccedil doğru veya yanlış diye yorumlanabilecek değerler verir Crsquonin oumlzelbir Boolean (yani mantıksal) veri tipi yoktur ve bu işleccedillerle oluşturulmuş bir ifadenindeğeri eğer ifade doğru ise 1 yanlışsa 0rsquodır Aslında sıfırdan farklı her sayı C dilindeldquodoğrurdquo anlamını taşır Boumlyle bir sonucun tipi her zaman intrsquotir Aşağıda bu işleccedillerazalan oumlncelik sıralarına goumlre anlatılmaktadır Buumltuumln doğruluk-değerli işleccediller structve tuumlrevleri dışında her tipten işlenen kabul eder Sağdan sola doğru birleşen tekli işlecidışında burada anlatılan tuumlm işleccediller soldan sağa birleşirler Bağıntısal ve mantıksalişleccediller değişmez ifadelerde de kullanılabilirler
Mantıksal Olumsuzlama İşleci
(ldquodeğilrdquo) işleci işlenenin mantıksal değerini olumsuzlar yani eğer işlenen 0rsquosa 1 verireğer işlenen sıfırdan farklı ise 0 verir Oumlrnekler
Bu ve bir sonraki kisimda a=150 b=4533 c=-132 d=0 a değeri 0rsquodırc değeri 0rsquodırd değeri 1rsquodir(b+c) değeri 0rsquodırc değeri 1rsquodir
Bağıntısal İşleccediller lt gt lt= Ve gt=
Bu işleccedillerin isimleri şoumlyledir
13
BOumlLUumlM 2 DEYİMLER VE KONTROL AKIŞI 31
işleccedil isimlt kuumlccediluumlktuumlrgt buumlyuumlktuumlrlt= kuumlccediluumlk veya eşittirgt= buumlyuumlk veya eşittir
Bağıntısal işleccediller işlenenlerini karşılaştırır ve duruma goumlre doğru veya yanlış birdeğer verirler Oumlrnekler
altb değeri 0rsquodırbgt=d değeri 1rsquodiragtbgtc (agtb)gtcrsquoye eşdeğerdir ve değeri 1rsquodiraltcltb (altc)ltbrsquoye eşdeğerdir ve değeri 1rsquodir
Eşitlik İşleccedilleri == Ve =
== işleci eğer işlenenleri eşitse 1 yoksa 0 verir = işleci ise tam tersini yapar Sıkyapılan bir yanlış == işleci yerine atama işlecini (=) kullanmaktır Buna dikkat edinOumlrnekler
a==b değeri 0rsquodıra=b değeri brsquodir ve bir atama ifadesidir
Bizim sistemde
x = 5030 xin tipi floattir
deyiminden sonra50==30x
ifadesi 0 (yani yanlış) verir Bunun nedeni hiccedilbir bilgisayarın 1666666middotmiddotmiddot sayısındakisonsuz sayıda 6rsquoyı saklayamamasıdır Aynı sorun 30 yerine 250 de kullansanız ortayaccedilıkabilir Genelde kayan noktalı sayıların kesin olmasını bekleyemezsiniz bundan dolayı(derleyici tarafından izin verilmesine rağmen) lt= gt= ve eşitlik işleccedillerinin işlenenleriolarak float tipinde ifadeler kullanmak tehlikelidir
Mantıksal VE İşleci ampamp
ampamp işleci işlenenlerinin mantıksal VErsquosini verir yani eğer her iki işlenen doğru ise sonuccedil1 olur aksi takdirde 0rsquodır Bu tanımdan eğer işlenenlerden biri 0rsquosa sonucun kesinliklesıfır olacağı ve diğer işlenenin değerinin hesaplanmasına gerek olmadığı accedilıktır C bugerccedileğe dayanarak diğer bazı dillerin tersine ilk işlenenin değeri 0rsquosa ikincisinihesaplamaz Oumlrnekler
fn()nin 657 veren bir fonksiyon oldugunu varsayin aampampb değeri 1rsquodirdampampfn() değeri 0rsquodır ve fn() ccedilağrılmazfn()ampampd değeri 0rsquodır ve fn() ccedilağrılır
13
32 DEYİMLER VE KONTROL AKIŞI BOumlLUumlM 2
Mantıksal VEYA İşleci ||
|| işleci işlenenlerinin mantıksal VEYArsquosını verir yani eğer her iki işlenen yanlış isesonuccedil 0 olur aksi takdirde 1rsquodir Goumlrduumlğuumlnuumlz gibi eğer işlenenlerden biri sıfırdan farklıise oumlteki işlenenin değeri ne olursa olsun sonuccedil 1rsquodir Yukarıda anlatılan yararlı oumlzellikburada da geccedilerli olur eğer ilk işlenen sıfırdan farklı ise ikinci işlenen hesaplanmazOumlrnekler
a||d (aampampd)rsquoe eşdeğerdir ve değeri 1rsquodira||b değeri 1rsquodirc||d değeri 1rsquodird||(c) değeri 0rsquodır
23 Doğruluk-Değerli İfadeler
Birccedilok yeni işleccedil oumlğrendiğimize goumlre Boumlluumlm 1rsquode verilmiş olan işleccedil oumlnceliği ve birleşmeccedilizelgesinin genişletilmiş bir uyarlamasını verelim Bu Ccedilizelge 22rsquode goumlsterilmektedir
CcedilİZELGE 22 C işleccedil oumlnceliği ve birleşme[] rarr
++ -- + - (tip) larr rarr
+ - rarrlt lt= gt gt= rarr
== = rarrampamp rarr|| rarr
= = = = += -= larr
Bir oumlnceki kısımdaki işleccediller kullanılarak yazılmış bazı doğruluk-değerli ifadeoumlrnekleri şoumlyledir
(alt=c) agtcrsquoye eşdeğerdir ve değeri 1rsquodiragtc 0gtcrsquoye eşdeğerdir ve değeri 1rsquodir(a==b) a=brsquoye eşdeğerdir ve değeri 1rsquodiraltb==cgtd 0==0rsquoa eşdeğerdir ve değeri 1rsquodiralt=b=campampd değeri 0rsquodır ve buumltuumln ifadeler hesaplanıra||d değeri 0rsquodıra=b||fn() değeri 1rsquodir ve fn() ccedilağrılmaz
13
BOumlLUumlM 2 DEYİMLER VE KONTROL AKIŞI 33
24 if Deyimi Ve Koşullu İşleccedil
if deyimi if anahtar soumlzcuumlğuumlnuumln arkasına parantez iccediline yazılmış bir ifade ve peşindengelen bir deyimden oluşur Tuumlm bunların arkasında isteğe bağlı olarak bir else anahtarsoumlzcuumlğuuml ve bir deyim bulunabilir ifrsquoin bu iki şekli aşağıdaki goumlsterimdeoumlzetlenmektedir
if (ifade) deyim
ve
if (ifade) deyimelse deyim
İşte elsersquoi olmayan bir if deyimi oumlrneği
if (yas gt 65) yasli_kisiler++ printf(Yasli bir kisisinizn)
Eğer yas 65rsquoten buumlyuumlkse blok iccedilindeki deyimler ccedilalıştırılır aksi takdirde kontroldoğrudan bir sonraki deyime geccediler Bu deyimi her yaştan kişiye hitap edecek şekildedeğiştirelim
if (yas gt 65) yasli_kisiler++ printf(Yasli bir kisisinizn) else printf(Henuz yasli bir kisi degilsinizn)
Şimdi deyiminiz eğer yas 65rsquoin uumlstuumlnde ise az oumlnceki deyimle aynı şekildedavranacaktır aksi takdirde yeni mesaj goumlruumlntuumllenecektir Genelde parantez iccediline alınmışifadenin değeri doğru (sıfırdan farklı) ise ifadeden sonra gelen deyim işletilir ifadenindeğeri yanlış (sıfır) ise else anahtar soumlzcuumlğuumlnden sonra gelen deyim (varsa) işletilirOumlrneklerimizde de goumlruumllduumlğuuml gibi bu deyimler bileşik deyimler olabilir bu da bileşikdeyimlerin daha oumlnce belirtiğimiz iyi oumlzelliğidir Birccedilok deyimden tek bir deyimoluştururlar Ayrıca bileşik deyim başlatan ldquordquo karakterinin ifade ile aynı satırda onunkarşılığı olan ldquordquo karakterinin de anahtar soumlzcuumlkle aynı suumltuna yazıldığına dikkat edinizBu karakterlerin tam yerimdashbloğu doğru bir şekilde ayırdıkları suumlrecemdashderleyiciyiilgilendirmez ancak bu şekilde yazmanın programları anlamayı kolaylaştıracağıinancındayız ve bunu kitap iccedilinde uygulamaya devam edeceğiz
Şuumlphesiz iccediliccedile if deyimleri yazabilirsiniz Tipik bir oumlrnek şoumlyle olabilir
13
34 DEYİMLER VE KONTROL AKIŞI BOumlLUumlM 2
if (yas gt 65) yasli_kisiler++ printf(Yasli bir kisisinizn) else if (yas gt 40) orta_yastaki_kisiler++ printf(Orta yastasinizn) else if (yas gt 17) genc_kisiler++ printf(Gencsinizn) else printf(Cocuksunuzn)
Bunun tek bir deyim olduğuna dikkat ediniz Şimdi şunun uumlzerinde duumlşuumlnuumln
if (yas lt 65) if (yas gt 40) printf(Orta yastasinizn)else printf(Cok yaslisinizn)
Eğer yas 65rsquoten buumlyuumlk veya eşitse ne olacaktır Diğer bir deyişle else hangiifrsquoe aittir Mesajlar ve iccedilerlek yazma şekli bu deyimi yazan kişinin ilk ifrsquoe aitolduğunu duumlşuumlnduumlğuuml izlenimini uyandırıyor fakat bu doğru değil Kural şoumlyledir Herelse en yakın elsersquoi olmayan ifrsquoe aittir Bundan dolayı yukarıda yapılmak istenen işidoğru şekilde yapan if şudur
if (yas gt= 65) printf(Cok yaslisinizn)else if (yas gt 40) printf(Orta yastasinizn)
veya
if (yas lt 65) if (yas gt 40) printf(Orta yastasinizn) else else printf(Cok yaslisinizn)
elsersquoten sonraki noktalı virguumll bir boş deyim oluşturur Goumlrduumlğuumlnuumlz gibisoumlzdizimin bir deyim gerektirdiği fakat yapılacak bir şey olmadığı yerde boş deyimkullanılabilir Başka bir yol olarak ikinci ifrsquoi bir blok iccediline alırsak boş deyimli elsekullanmak zorunda kalmayız
if (ifade_1) değişken = ifade_2else değişken = ifade_3
şeklindeki bir if deyimi koşullu işleccedil kullanılarak
13
BOumlLUumlM 2 DEYİMLER VE KONTROL AKIŞI 35
değişken = ifade_1 ifade_2 ifade_3
şeklinde basitccedile yazılabilir Genelde C dilindeki tek uumlccedil-işlenenli (uumlccedilluuml) işleccedil olan ldquordquoişleci oumlnce ifade_1rsquoi hesaplar ve eğer ifade_1 doğru ise ifade_2rsquonin değerini aksitakdirde ifade_3rsquouumln değerini verir Son iki ifadeden sadece biri hesaplanır Sonucun tipioumlnceki boumlluumlmde anlatılan doumlnuumlşuumlm kurallarına goumlre ifade_2 ve ifade_3 birlikte dikkatealınarak belirlenir ldquordquo işlecinin sağdan sola doğru birleşme oumlzelliği vardır ve oumlnceliğiKısım 22rsquode goumlruumllen tuumlm işleccedillerden duumlşuumlk atama işlecinden ise yuumlksektir
ldquordquo işlecinin işleri nasıl kolaylaştırdığına bir oumlrnek
printf(yasgt65 Yasli birisinizn Henuz yasli degilsinizn)
Goumlrduumlğuumlnuumlz gibi hem ifade_2 hem de ifade_3 karakter dizileri ise sonuccedil bir karakterdizisidir ldquordquo işleci değişmez ifadelerde de kullanılabilir
25 while Deyimi
Diğer programlama dillerinde olduğu gibi while deyimi doumlnguumller oluşturmak iccedilinkullanılır Soumlzdizimi şoumlyledir
while (ifade) deyim
Oumlnce ifade hesaplanır Eğer doğru ise deyim yuumlruumltuumlluumlr sonra da ifade tekrar hesaplanırİfadenin hesaplanmasında yanlış (0) sonucu elde edilinceye kadar bu devam eder budurumda kontrol bir sonraki deyime geccediler Eğer başlangıccedilta ifade yanlışsa tekrarlanandeyim hiccedil ccedilalıştırılmaz Şekil 21rsquodeki akış ccedilizeneği while deyiminin yuumlruumltuumllme şeklinigoumlsterir
İşte bir while deyimi
while (yaslt35) genc_kisiler++ scanf(dampyas)
Eğer yas bu deyimden oumlnce 35 veya daha buumlyuumlk bir sayı ise blok hiccedilyuumlruumltuumllmeyecektir Aksi takdirde 35rsquoten buumlyuumlk veya eşit bir sayı girilinceye kadardefalarca yuumlruumltuumllecektir while kullanarak sonsuz doumlnguumller yazmanın olası olduğunadikkat edin İfadenin hiccedilbir zaman yanlış olmayacağını temin etmeniz yeterlidir Oumlrneğin
while (1) printf(Cyi cok seviyorumn)
deyimi ile C hakkındaki duygularınızı sonsuza dek yazabilirsiniz
13
36 DEYİMLER VE KONTROL AKIŞI BOumlLUumlM 2
yanlış
doğruifadeyihesapla
deyimiyuumlruumlt
yanlış
doğru
ifadeyihesapla deyimi
yuumlruumlt
while deyimi do deyimi
ŞEKİL 21 while ve do deyimleri iccedilin akış ccedilizenekleri
26 do Deyimi
do deyimi while deyiminin yakın bir akrabasıdır o kadar ki soumlzdiziminde whileanahtar soumlzcuumlğuumlnuuml iccedilerir
do deyimwhile (ifade)
dorsquonun whilersquodan tek farkı ifadeyi tekrarlanan deyimin yuumlruumltuumllmesinden sonrahesaplamasıdır Bunun anlamı ne olursa olsun do deyiminde en az bir defa doumlnguumlyegirildiğidir Şekil 21rsquode verilen akış ccedilizeneklerindeki farklılıklara dikkat edin
Birisinin yaşını sorup olumlu bir sayı girilinceye kadar sormaya devam eden oumlrnekbir do deyimi şoumlyledir
do printf(Lutfen yasinizi girinizn) scanf(d ampyas) while (yaslt=0)
Normal olarak her do deyiminde burada da olduğu gibi bir blok şeklinde yazılaniccedilteki deyim en az bir defa yuumlruumltuumlluumlr
13
BOumlLUumlM 2 DEYİMLER VE KONTROL AKIŞI 37
27 for Deyimi Ve Virguumll İşleci
for deyimi for anahtar soumlzcuumlğuuml arkasında parantez iccedilinde iki noktalı virguumllle ayrılmışuumlccedil ifade ve ondan sonra gelen bir deyimden oluşur İfadelerden herhangi biri varolmayabilir ancak noktalı virguumlller bulunmalıdır for deyiminin nasıl işlediğinianlatmanın en iyi yolu eşdeğer bir while deyimi ile onu ifade etmektir Şimdi eğer
for (ifade_1opt ifade_2opt ifade_3opt) deyim
şeklinde bir deyimimiz varsa
ifade_1while (ifade_2) deyim ifade_3
deyimi for deyimi ile aynı işi yapacaktır Eğer for deyimindeki ifade_2 boşsa suumlrekliolarak doğru olduğu şeklinde yorumlanacak ve sonsuz bir doumlnguumlnuumlz olacaktır İfade_1rsquoindoumlnguumlyuuml kontrol eden değişkenleri ilklemek iccedilin ifade_2rsquonin doumlnguumlyuuml durdurmak iccedilingereken koşulları belirlemede ifade_3rsquouumln de doumlnguuml iccedilindeki bazı değişkenlerindeğerlerini değiştirmede kullanılacağına dikkat edin Oumlrnek
for (i=0 iltn i++) dizi[i] = 0 printf(Dizinin d nolu elemanina 0 atanmistirn i)
Bu basitccedile dizi dizisinin ilk n elemanına sıfır atar ve n sayıda satır goumlruumlntuumller fordeyimine bir başka oumlrnek ise şoumlyledir
for (bosluklar=0 getchar()== bosluklar++)
Bu deyim girdi akışındaki boşlukları sayar Bu durumda parantez iccediline alınmış olanifadelerin gereken her şeyi yaptığına ve tekrarlanan deyimin boş deyim olduğuna dikkatediniz forrsquoun deyiminin boş olduğunu vurgulamak iccedilin noktalı virguumll ikinci satırayazılmıştır Sık yapılan hatalardan bir tanesi de for deyiminin sağ parantezinin hemenarkasına noktalı virguumll koymak boumlylece deyimi tek bir seferde yuumlruumltuumllecek normal birdeyim haline getirmektir
Bazen for deyiminde ifade_1 ve ifade_3 adını verdiğimiz yerlerde birden fazlaifadenin bulunması daha uygun olabilir Oumlrneğin iki tane sayacımızın bulunduğunu vedoumlnguumlden herhangi birisinin sıfır olduğu zaman ccedilıkmamızın gerektiği bir durumuduumlşuumlnuumln Bunu yapmanın başka youmlntemleri de vardır ama aşağıdaki deyim eniyilerindendir
13
38 DEYİMLER VE KONTROL AKIŞI BOumlLUumlM 2
for ( sayac_1 ampamp sayac_2 sayac_1-- sayac_2--)
Bu virguumll işlecinin en ccedilok kullanıldığı yerlerden biridir Goumlrduumlğuumlnuumlz gibi virguumllişleci iki ifadeden tek bir ifade oluşturmaya yarar Her zaman ikinci işlenenden oumlnce ilkişleneni hesaplar ve soldan sağa birleşir Sonucu ise sadece ikinci ifadenin değeridirSonucun tipi de ikinci ifadenin tipiyle aynıdır Virguumll işleci Crsquonin işleccedilleri arasında enduumlşuumlk oumlnceliğe sahiptir
Virguumll karakterinin C dilinde başka amaccedillar iccedilin de kullanıldığına dikkat edinizBildirimlerde değişken isimlerini ayırmak buna bir oumlrnektir Bu durumlarda soumlz konusuolanın bir ayırıcı değil de bir işleccedil olduğunu belirtmek iccedilin virguumll ifadesi parantezler iccedilinealınmalıdır
28 continue Deyimi
continue deyimi sadece bir doumlnguumlnuumln goumlvdesi iccedilinde yani while do veya forrsquountekrarlanan deyiminde geccedilerlidir Bu deyim yuumlruumltuumllduumlğuumlnde doumlnguuml goumlvdesinin iccedilindekigeri kalan deyimler atlanır ve hemen doumlnguumlnuumln devamlılık testine geccedililir Oumlrneğin
for (a=10 agt0 a--) b = -a if (b==-5) continue printf(d sayisinin olumsuzu d sayisidirn a b)
deyiminde (5 hariccedil) 10rsquodan 1rsquoe kadar buumltuumln tamsayılar olumsuzları ile birlikteyazılırlar Diğer bir oumlrnek olarak
a = 0while (alt100) a++ if (a4) continue printf(dn a)
deyimi 100rsquoe kadar 4rsquouumln katlarını goumlruumlntuumller
continue kontroluuml her zaman iccedilinde kaldığı en kuumlccediluumlk doumlnguumlnuumln sonuna aktarırYukarıdaki gibi birccedilok durumda ifrsquoteki test koşulunu ters ccedilevirerek ve continueyerine doumlnguumlde geri kalan deyimleri bir blok iccediline koyarak continuersquodan kurtulabiliriz
Oumlnceki kısımda for deyiminin while deyimi şeklindeki yazımını anımsayın Bukural forrsquoun tekrarlanan deyiminde bir continue olduğu zaman geccedilerli olmaz ccediluumlnkuuml
13
BOumlLUumlM 2 DEYİMLER VE KONTROL AKIŞI 39
ifade_3 her yinelemenin sonunda baştan hesaplanır Boumlylece bu kısımda verilen fordeyiminin whilersquola yazılmış eşdeğeri şoumlyledir
a=10while (agt0) b=-a if (b==-5) a-- continue printf(d sayisinin olumsuzu d sayisidirn a b) a--
29 break Deyimi
break deyimi continue ile yakından ilintilidir continue deyimi yeni biryinelemenin başlaması amacıyla doumlnguumlnuumln sonuna atlarken break iccedilinde kaldığı enkuumlccediluumlk doumlnguumlnuumln dışına atlar ve doumlnguuml deyiminin tamamen sona ermesine yol accedilar Başkadurumlar dışında break ldquosonsuzrdquo doumlnguumllerden ccedilıkış iccedilin kullanılır Oumlrneğin
while (1) scanf(d ampyas) if (yaslt=0) break printf(Bir sonraki kisi d yasindadirn yas)
Burada olumlu olmayan bir sayı girildiğinde break deyimi kontroluuml whilersquodansonraki deyime aktarır İccedilinde break bulunan bir program parccedilası break olmadan dayazılabileceğine goumlre break kullanmak bir tercih sorunudur
break sadece switch (Kısım 211) do while ve for deyimlerinden ccedilıkış iccedilinkullanılabilir Başka yerlerde kullanılamaz
210 goto Deyimi Ve Etiketler
Her C deyimine deyimden oumlnce bir tanıtıcı soumlzcuumlk ve iki nokta uumlst uumlste koyarak bir etiketiliştirilebilir Bir deyimi etiketlemek suretiyle gerektiğinde o deyime ulaşmak iccedilinkullanılabilecek bir ldquoadresrdquo verilir Bir fonksiyon iccedilinde birden fazla deyime aynı isimetiket olarak verilemez Bir etiket ve onun arkasına bir deyim yeni bir deyim oluştururBu tuumlr bir deyime etiketli deyim denir
tanıtıcı_soumlzcuumlk deyim
goto deyimi kontroluuml doğrudan etiketli deyime aktarır Soumlzdizimi soumlyledir
13
40 DEYİMLER VE KONTROL AKIŞI BOumlLUumlM 2
goto tanıtıcı_soumlzcuumlk
Tanıtıcı_soumlzcuumlk aynı fonksiyon iccedilinde var olan bir etiket olmalıdır goto kullanarakfonksiyon iccedilinde (dışında değil) herhangi bir yere atlanabilir ileri veya geriye doğruistenildiği kadar iccediliccedile geccedilmiş doumlnguuml veya blokların iccediline veya dışına istediğiniz bir yeregidebilirsiniz gotorsquonun sorumsuzca kullanımı anlaşılması ve bakımı yapılmasıolanaksız programlar yaratabilir Kuramsal olarak anlambilimsel hiccedilbir yitimeuğratılmadan goto bir programdan ccedilıkarılıp yerine doumlnguuml ve if deyimleri konulabilirBuna rağmen hata işleme gibi bazı durumlarda işleri kolaylaştırabilir Oumlrneğin
while (bir_kosul) do for ( ) if (guuum) goto felaket while (baska_kosul) felaket hata işlemleri
Bu durumda bile goto deyimi kaldırılabilir Hata işlemlerinin bazı temizlik işleriyapıp olası bir hata kodu ile ccedilağıran fonksiyona doumlnuumlş yaptığını varsayın O zaman niyebu işleri goto deyiminin bulunduğu yerde yapıp bir return kullanmayalım (returndeyimi bir fonksiyondan doumlnmek iccedilin kullanılır ve Boumlluumlm 4rsquote işlenmektedir) breakcontinue ve return gibi daha uygun yapıların bulunduğu C gibi bir dildegotorsquolardan kaccedilınılabilir ve kaccedilınılmalıdır İyi bir programcı gotorsquoyu ve hattacontinuersquoyu hemen hiccedil bir zaman kullanmaz switch dışında da break deyiminiccedilok seyrek kullanır Bu arada goto kullanmadan bile kontrol akışı anlaşılmayanprogramlar yazmak olasıdır Dikkatli tasarım ayrıntılı belgeleme ve makul iccedilerlek yazmaalışkanlığı bundan kaccedilınmanın bazı yollarıdır
211 switch Deyimi
switch (ifade) deyim
switch deyimi birccedilok şıktan bir tanesini seccedilmede kullanılır İşte kullanıcıyaldquomenuumllerrdquo sunan bir programda bulunabilecek bir switch
13
BOumlLUumlM 2 DEYİMLER VE KONTROL AKIŞI 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 deneyinn)
Bu oumlrnek switchrsquoin tuumlm oumlnemli oumlzelliklerini goumlstermektedir Parantez iccedilineyazılmış tamsayı tipindekimdashbu oumlrnekte olduğu gibi bir karakter de olabilirmdashsayı ifadesihesaplanır oumlnuumlne case anahtar soumlzcuumlğuuml getirilmiş olan değişmez ifadelerden birinindeğeri buna uyuyorsa kontrol bu case etiketli deyime aktarılır ve buradan sıralı olarakdevam eder Eğer hiccedilbir case etiketindeki değer ifadenin değerine uymuyorsa ikiolasılık vardır Deyim iccedilinde bir default etiketi varsa kontrol buraya aktarılır aksitakdirde switch deyiminden ccedilıkılır
Yukarıdaki deyimde hiccedilbir break konulmadığı takdirde r veya R girildiğindebuumltuumln fonksiyonlar (rezervasyon_yapma yolcu_listeleme vs) ccedilağrılacak vehata mesajı da basılacaktır Bundan dolayı hemen hemen buumltuumln switch deyimlerindebreakrsquoler bulunur Oumlrnekte olduğu gibi switchrsquoteki parantez iccedilindeki ifadeden sonragelen deyim genelde bir bloktur
case ve default etiketleri switch deyimleri dışında kullanılamazlar Ayrıca birswitch deyimi iccedilinde birden fazla default etiketi ve aynı switch iccedilinde aynı değeresahip birden fazla case etiketi olamaz
switchrsquoin oumlykuumlsuumlnuuml başka bir ilginccedil oumlrnekle bitiriyoruz
switch (yas) case 20 case 40 case 60 printf(20 40 yada 60 yasindasinizn)
13
42 DEYİMLER VE KONTROL AKIŞI BOumlLUumlM 2
212 Bir OumlrnekmdashSayı Sıralama1 include ltstdiohgt2 define GOZCU 03 define LIMIT 2545 void main (void)6 7 int i j k8 int sayi gecici9 int sayilar[LIMIT]1011 girdi 12 i=013 while (iltLIMIT) 14 scanf(d ampsayi)15 if (sayi==GOZCU)16 break girdi sonu 17 sayilar[i++]=sayi18 1920 siralama 21 i--22 for (j=0 jlti j++)23 for (k=j+1 klt=i k++)24 if (sayilar[j]gtsayilar[k]) 25 gecici=sayilar[k]26 sayilar[k]=sayilar[j]27 sayilar[j]=gecici28 2930 cikti 31 k=032 do33 printf(d sayilar[k++])34 while (klt=i)35 main
Girilen tamsayıları artan sıraya goumlre sıralayan yukarıdaki program if while dofor ve break deyimlerini oumlrneklemek iccedilin verilmiştir En başta tanımlanmış olan ikideğişmez sırasıyla girdi iccedilin ldquogoumlzcuumlrdquo bir değer ve iccedilinde sayıların saklanacağı dizininboyudur Goumlzcuuml girdi akışında karşımıza ccedilıktığında daha fazla girdi olmayacağınıbelirten bir değerdir Oumlrnekteki durumda sıfır rastlandığında program girdi okumayıbitirecektir
Program sırasıyla girdi sıralama ve ccedilıktı yapan uumlccedil boumlluumlmden oluşmuştur İlk boumlluumlm(Satır 12-18) klavyeden tamsayılar okur ve bunları sıfırıncı elemandan başlayaraksayilar adlı diziye yerleştirir while deyimindeki (iltLIMIT) ifadesi en fazlaLIMIT sayıda tamsayının okunup sayilar dizisine konulmasını temin eder Sıralamakistediğimiz sıfırdan farklı tamsayıların sayısı LIMITrsquoten azsa girdi sonunda GOZCUdeğerini yani 0 veririz while bloğunun iccedilindeki if deyimi sayilar dizisinekoymadan oumlnce girilen değeri kontrol eder ve eğer sıfırla karşılaşırsa breakrsquole whiledoumlnguumlsuumlnuumln dışına atlar İlk boumlluumlmuuml if ve break kullanmadan bir while ile yazmayaccedilalışın
13
BOumlLUumlM 2 DEYİMLER VE KONTROL AKIŞI 43
İlk boumlluumlmuumln sonunda irsquode sayilar dizisinin son dolu elemanının indisinin birfazlası bulunur Bundan dolayı ikinci boumlluumlm (Satır 21-28) irsquoyi bir azaltarak başlarArkadan gelen for deyimi sıralamayı sağlamak iccedilin i ile beraber j ve k adında ikisayaccedil kullanır Dıştaki (yukarıdaki) for sayilar dizisinin ilk i-1 elemanına bakarDıştaki for tarafından sayilar dizisinin bakılan her jrsquoinci eleman iccedilin iccedilteki forj+1rsquoden irsquoye kadar indislenmiş elemanlara bakar Yani if deyiminin yuumlruumltuumllduumlğuuml hersefer sayilar dizisinin iki farklı elemanı sayilar[j] ve sayilar[k]karşılaştırılır ve jltkrsquodır İşimiz bittiğinde sayilar dizisinde girilmiş sayıların artansıraya goumlre sıralanmasını istediğimize goumlre eğer sayilar[j]gtsayilar[k] ise ikielemanın değerlerini değiş tokuş ederiz Bu işlemin yapıldığı yer Satır 25-27rsquodir
Uumlccediluumlncuuml boumlluumlm (Satır 31-34) bir do kullanarak (artık sıralanmış sayıları iccedileren)dizideki ilk i+1 elemanı basar Eğer en başta ilk (ve son) değer olarak sıfır girersek buboumlluumlm gereksiz ve ilgisiz bir sayı basacaktır (Bunun nedenini soumlyleyebilmemiz gerekir)Bu en kısa ve basit gibi goumlruumlnen programların bile en beklenmeyen zamanda kendinigoumlsteren hatalar iccedilerebileceğini goumlsterir
Problemler
1 do deyimini başka kontrol akışı deyimleri kullanarak ldquoformuumllerdquo edin
2 Aşağıdaki ifrsquoin goumlrevini yapan bir switch yazın
if (yas == 16) printf(Onumuzdeki yil surucu belgesi alabilirsinizn)
3 while deyimini başka kontrol akışı deyimleri kullanarak yazın
4 Bir tamsayı okuduktan sonra 1rsquoden girilen sayıya kadar olan buumltuumln tamsayılarınkareleri ile karşıt (1sayı) değerlerini basan bir program yazın
5 Sıfırla sonlandırılmış bir tamsayı serisini okuyup sonunda sayıların en kuumlccediluumlk enbuumlyuumlk ve ortalamasını veren bir program yazın
6 Bir karakter sırasını okuyup arka arkaya tam 3 defa rastladığı karakterleri basan birprogram yazın Oumlrneğinbcdaaaefghijjjjkkkop
girdisi iccedilin ccedilıktıa k
olmalıdır
7 Tedavuumllde (şimdilik) 5 10 20 50 100 250 500 bin ve bir milyonluk banknotlarbulunmaktadır Fiyatı ve bu cinste goumlsterilmiş para miktarını kabul edip geriyeverilecek bozuk parayı (yani fiyat ile verilmiş para arasındaki farkı) liste şeklinde
13
44 DEYİMLER VE KONTROL AKIŞI BOumlLUumlM 2
veren bir program yazın Bu durumda programın kabul edebileceği para miktarı 5binin katı olmalıdır
8 Kısım 212rsquodeki programı her ccedileşit bilgi iccedilin doğru ccedilalışacak şekilde duumlzeltin
9 Bir x sayısının b tabanına goumlre logaritması şu şekilde hesaplanabilir
Sayının 1lexltb şeklinde olduğunu varsayın (Eğer oumlyle değilse kolayca o halegetirebilirsiniz) Bu durumda logbx=0d1d2middotmiddotmiddotdn Burada n sistemdeki kayan noktalısayılar iccedilin anlamlı rakam sayısıdır yani double sayılar iccedilin DBL_DIG dirakamları şu doumlnguuml kullanılarak hesaplanabilir
i larr 1rsquoden nrsquoye kadar aşağıdaki doumlnguumlyuuml yapx larr x10
1le x
bdi lt b olacak şekilde dirsquoyi hesapla (di 0rsquodan 9rsquoa kadar değişen bir tamsayı)
x larr x
bdi
Oumlnce bazı sayıların logaritmalarını elle hesaplayarak algoritmayı anlamaya ccedilalışınOumlrneğin log102 log162 vsrsquoyi hesaplayın Daha sonra 001 artımlarla 100 ile 1000arasındaki x sayılarının b=10 tabanına goumlre logaritmalarının ccedilizelgesini n=5 ondalıkbasamağa kadar basacak bir C programı yazın
10 Aşağıdaki oyunu oynayacak tam bir program yazın Kullanıcı 1 ile 1000 arasında birsayı seccediler bilgisayar da sayıyı tahmin etmeye ccedilalışır Her tahminden sonra eğertahmin daha buumlyuumlkse kullanıcı B girer daha kuumlccediluumlkse K doğru sayı ise D girerProgramın oumlrnek bir ccedilıktı ve girdisi şoumlyle olabilir (Bu durumda seccedililmiş olan sayı375rsquotir)500 B250 K375 D
Program akılcı kestirimlerde bulunmalıdır Program en fazla kaccedil denemede sayıyıbulmalıdır
13
45
BOumlLUumlM 3 GOumlSTERGELER VEBİT İŞLEME
Bu boumlluumlmde iki konu anlatılacaktır goumlstergeler ve bit işlemleri Bunların ortak bir youmlnuumlvardır Crsquonin duumlşuumlk duumlzeyli destek sağlayan yuumlksek duumlzeyli bir dil olmasından dolayıpopuumller bir sistem programlama dili olduğu gerccedileğini goumlsterirler Goumlstergelerkullanıcının bellek adreslerine ulaşmasına ve bunlarla işlem yapmasına izin verirler bitişlemleri ise tipik olarak birleştirici dillerde rastlanan duumlşuumlk duumlzeyli işlemlerdir
31 Goumlsterge Değişkenleri Ve İşlemleri
Goumlstergeler ve goumlsterge işlemleri Crsquonin ccedilok oumlnemli bir youmlnuumlnuuml oluştururlar Goumlstergelerbaşka değişkenlerin adreslerini veya daha genel konuşursak bellek konumlarınıdepolamaya yarayan değişkenlerdir Goumlstergeler kullanmak suretiyle daha kısa ve hızlıccedilalışan bir kod yazabiliriz ancak bu kodu anlamak daha zor olabilir ayrıca hata yapmaolasılığı da artabilir Oumlrneğin bir int dizisini ldquotemizlemeyerdquo yarayan
int z[N] ifor (i=0 iltN i++) z[i] = 0
şeklindeki klasik for deyiminin yerine
int z[N] gfor (g=ampz[0] gltampz[N] g++) g = 0
kullanılabilir bu da daha verimli (hızlı) olduğu iccedilin bazı programcılar tarafından tercihedilebilir
13
46 GOumlSTERGELER VE BİT İŞLEME BOumlLUumlM 3
Burada iki yeni işleccedil goumlrmekteyiz ve amp Bunlar tekli işleccedillerdir ve ile amp ikiliişleccedilleriyle karıştırılmamalıdır Bir sonraki altkısımda bunlar anlatılmaktadır
311 amp Ve İşleccedilleri
Zaman zaman bir değişkenin depolandığı bellek boumllgesinin adresini elde etmekgerekebilir Bunu yapmak iccedilin adres alma (amp) işlecini kullanırız Diğer tekli işleccedillerleaynı oumlnceliğe sahip olan bu tekli işleccedil bellekte belli bir konumda bulunan işlenenlereuygulanabilir Oumlrneğin bu işlenen basit bir değişken (ampdegisken) veya bir dizi elemanı(ampdizi[indis]) olabilir amp işleci işlenenin adresini (daha doğrusu işlenen tarafındantutulan belleğin ilk baytının adresini) verir
Bunun ne anlama geldiğine bakalım Her değişken (ana) bellekte bir yerde saklanırBilgisayar belleği sınırlıdır herbiri bir sayı verilerek adreslenen belirli sayıda huumlcrelerdenoluşur Her huumlcre belirli bir miktarda bilgi iccedilerir En kuumlccediluumlk bilgi birimi bittir (binarydigitmdashikili rakam) ve 01 doğruyanlış accedilıkkapalı gibi iki olası değerden bir tanesinisaklamaya yarar Bir bit rahat olarak işlenmesi iccedilin ccedilok kuumlccediluumlk bir bilgi birimidir Bundandolayı bitler genelde 8 bitten oluşan bir bayt veya makineden makineye 8 ile 64 bitarasında değişen sayıda bitten oluşan bir soumlzcuumlk şeklinde gruplandırılır
Bizim sistemde bir bayt 8 bir soumlzcuumlk de 16 bittir (ldquo16 bitlikrdquo derleyiciler iccedilin)bilgisayar belleği bayt şeklinde adreslenir arka arkaya gelen baytlar iccedilin arka arkayagelen adresler kullanılır normal boyda bir tamsayı değişkeni bir soumlzcuumlk yani iki baytkaplar Boumlylece iki tamsayıdan oluşan bir dizi (int z[2]) doumlrt bayt kaplar Eğer ilkelemanın adresi oumlrneğin 140rsquosa ikinci elemanınki 142 olacaktır Adres alma işleci busayıları verecektir Diğer bir değişle ampz[0] 140rsquoa eşitse ampz[1] de 142rsquoye eşittir
Adres elimizde olduğu zaman bu sefer o adreste saklanmış olan değeri elde etmekiccedilin bir youmlnteme gerek duyarız Bu temelde amp işlecinin aksi olan dolaylama () işleci ileyapılır Bu işleccedil ccedilarpım işleci ile karıştırılmamalıdır ccediluumlnkuuml bu tekli oysa ccedilarpım işleciikili bir işleccediltir Dolaylama işleci diğer tekli işleccedillerle aynı oumlnceliğe sahiptir ve buumltuumln tekliişleccediller gibi sağdan sola birleşir Bu da eğer yan yana iki tekli işleccedil varsa oumlncesağdakinin ccedilalışacağını goumlsterir Oumlrneğin ampx ile (ampx) aynı anlama gelir ve her ikiside aşağıda accedilıklanacağı gibi xrsquoe eşdeğerdir
Dolaylama işleci işlenen olarak geccedilerli bir adres bekler ve bu adreste saklanmışbulunan değeri verir Ancak bunu yapması iccedilin hangi veri tipinde bilgi vermesi gerektiğinibilmek zorundadır int double char yoksa başka bir şey mi Bu bilgi işlenenindegizlidir Oumlrneğin ampx x değişkeninin tipindeki bir bilgiyi tutan bellek boumllgesinin adresidir(teknik terimi ile bu adrese bir goumlstergedir) Yani eğer x bir char değişkeni ise ampx birchar goumlstergesidir boumlylece ampx ampx ile goumlsterilen boumllgede saklanmış bulunan chardeğerini verir
13
BOumlLUumlM 3 GOumlSTERGELER VE BİT İŞLEME 47
312 Goumlsterge Değişkenleri Bildirimleri
Goumlsterge bildirimleri basittir
int i j
bildirimi nasıl tamsayı değişkenleri tanımlarsa
int ig jg
bildirimi de tamsayı tipindeki değişkenlere goumlstergeler tanımlayacaktır ig ve jg gibigoumlsterge değişkenleri tamsayı değişkenlerinin adreslerini iccedilerecektir Oumlrneğin
ig = ampijg = ampj
anlamlı atamalardır Ancakig = j
şeklindeki atama j ldquoadresinirdquo igrsquoye koyacaktır ve ancak j değişkeni iccedilindeki tamsayıdeğerinin bir adres olarak kullanılması gerektiği durumlarda işe yarayabilir CStandardına uygun derleyiciler boumlyle atamalar olduğunda sizi uyaracaktır ccediluumlnkuumldeğişkenlerin tipleri uymamaktadır
Aynı şekilde
double dg
doublersquoa bir goumlsterge tanımlar Hem ig hem de dg adres saklarlar Fakat neyin adresiDerleyicinin bunu bilmesi gerekir Bundan dolayı farklı tanımlar yapmak zorundayızOumlrneğin
dg = ampi
derleyici tarafından kabul edilebilir ancak anlamsızdır ccediluumlnkuuml dg bir double yerine birtamsayıyı goumlsterecektir Derleyiciler bu tip yanlış atamalarda sizi uyaracaktır Luumltfen buuyarıları dikkate alın
313 Goumlsterge Aritmetiği
Şimdi bu kısım başında verilen oumlrneğe geri doumlnelim ve ne olduğuna bakalım Dizibildirimi derleyicinin dizi iccedilin ana bellekte yer ayırmasını sağlar Bir int değişkeninin 2bayt tuttuğunu ve Nrsquonin 10 olarak define ile tanımlandığını varsayın Bu durumda zdizisi 20 bayt tutacaktır İlk eleman adresi ampz[0] ifadesi ile elde edilen yerde saklanır(Tanım gereği ampz[0] ile z aynı şeydir ve buna dizinin temel adresi denir Diğer birdeyişle bir ifade iccedilinde indissiz kullanılan dizi isimleri belirli bellek boumllgelerinigoumlsterirler yani goumlstergedirler)
Bir dizinin irsquoinci elemanını elde etmek iccedilin (oumlrneğin z[i] yazıldığında) derleyicişunu yapar Dizinin temel adresini (yani ilk elemanının adresini) alır (oumlrneğin 8566)sonra indisin değerini alır (oumlrneğin 3) ve eğer dizinin eleman tipi n tane bayt kullanıyorsa
13
48 GOumlSTERGELER VE BİT İŞLEME BOumlLUumlM 3
(oumlrneğin bizim sistemde tamsayılar iccedilin bu 2 bayttır) irsquoinci elemanın adresini bulmak iccedilinTemelAdres+ntimesi hesaplar Şimdi dizi indislerinin neden sıfırdan başladığı daha iyianlaşılıyor eğer i sıfıra eşitse o zaman ikinci terim yok olur ve olması gerektiği gibidizinin ilk elemanının adresinin gerccedilekte dizinin temel adresi olduğu ortaya ccedilıkar
for deyimlerimize geri doumlnersek ilkinde bu hesaplamanın her yinelemedetekrarlandığını goumlruumlruumlz İkinci durumda ise accedilıkccedila bir goumlsterge kullanılmıştır Tamamen
for (g=z gltampz[N] g++) g = 0
deyimiyle eşdeğer olan bu deyim oumlnce g int goumlstergesine z dizisinin temel adresinikoyar (oumlrneğin 8566) daha sonra g ile işaretlenmiş boumllgeye sıfır koyar Bu adreste (yani8566rsquoda) saklanacak olan değerin tipinin derleyici tarafından bilinmesi gerekir intchar double yoksa başka bir şey mi Her tipin bellekte farklı sayıda bayt kapladığınıanımsayın Bunu goumlstergenin tipinden belirler Bu bir tamsayı goumlstergesi olduğuna goumlrebu goumlsterge tarafından işaret edilen boumllgede bir tamsayı değişkeni bulunmalıdır Bundandolayı 8566 ve 8567 adresli baytlara sıfır yerleştirir
Bundan sonra goumlsterge artırılır Şimdi yine bir sorunumuz var demektir ccediluumlnkuumlsayılar iccedilin artırma (veya azaltma) elimizdeki değere bir sayısı eklenerek (veyaccedilıkarılarak) yapılır Aynı şey goumlstergelere uygulanamaz grsquonin goumlsterdiği adresin değerinebir eklenmesi goumlstergenin dizideki bir sonraki elemana (yani 8568 adresine) işaretetmesini sağlayamayacaktır onun yerine ilk elemanı iccedileren ldquosoumlzcuumlğuumlnrdquo ikinci yarısını(yani 8567 adresini) goumlsterecektir Goumlsterge ile goumlsterilen elemanın boyuna eşit bir sayı(yani bizim sistemimizde tamsayılar iccedilin 2) eklemeliyiz Bu derleyici tarafından bizimiccedilin yapılır Yani int goumlstergesi ldquo++rdquo işleci ile artırıldıktan sonra 8568 adresinigoumlstermeye başlayacaktır Değişik tipteki goumlstergelerin uyumlu olmamalarının nedenleriişte bu farklılıklardır
Goumlsterge aritmetiğinin diğer şekillerinde de benzer bir sorun ortaya ccedilıkar Oumlrneğineğer grsquode 8566 (ampz[0]) adresi varsa g+3 ifadesi nereyi goumlstermelidir 8569 adresinimi Hayır Bu z[1]rsquoi iccedileren soumlzcuumlğuumln ikinci yarısının adresi demektir ki fazla anlamlıbir şey değildir Daha iyisi ampz[3] (yani 8572) adresine işaret etmesi olacaktır Yinederleyici bize bunu sağlar Bir adrese (goumlstergeye) z bir tamsayı i eklediğimizde (veyaccedilıkardığımızda) derleyici z tarafından işaret edilen değişken tipinin boyunu i ile ccedilarparve sonra toplama (veya ccedilıkarmayı) yapar Bunun nedeni adreslerin her zaman baytlaraişaret etmelerine karşılık goumlstergelerin değişik buumlyuumlkluumlklere sahip tipte nesnelerigoumlstermeleridir
Bu anlatılanların anafikri goumlstergelerin tamsayı olmadıkları ve bazı işleccedillerin (++ -- + - += -=) goumlstergeler iccedilin farklı uygulandıklarıdır g ile goumlsterilen değişkenin nbayt kapladığını varsayın O zaman
g++g--g+tamsayi_ifadeg-tamsayi_ifade
13
BOumlLUumlM 3 GOumlSTERGELER VE BİT İŞLEME 49
goumlsterge ifadeleri sırasıyla g+n g-n g+ntimestamsayı_ifade g-ntimestamsayı_ifade şeklindehesaplanır Ayrıca p1 ve p2 aynı tipten goumlstergelerse değeri bir tamsayı olan
p1-p2
ifadesi p1-p2
n şeklinde hesaplanır Oumlrneğin
p1 = ampz[3]p2 = ampz[0]printf(dn (int)(p1-p2))
(z dizisinin eleman tipine bağlı olmaksızın) ccedilıktı olarak 3 verecektir İki goumlstergeyibirbirinden ccedilıkardığımızda kullanılan sistemdeki bellek boyuna bağlı olan bir tipte birifade oluştuğuna dikkat edin İşaretli olan bu tip stddefh adlı başlık dosyasında uygunbir şekilde prtdiff_t adıyla tanımlanmıştır
İki uyumlu goumlsterge (lt gt lt= gt= == ve = kullanarak) karşılaştırılabilir ancakfarklı dizilerdeki nesnelere işaret eden iki goumlstergeyi karşılaştırmak anlamlı (en azındantaşınabilir bir oumlzellik) değildir Doğal olarak bunun nedeni iki dizinin ana bellektekibirbirine goumlre durumları konusunda emin olamayacağınızdır Bu kısımdaki ikinci forrsquodakullanılan ldquogltampz[N]rdquo testi uygundur ccediluumlnkuuml g ve ampz[N] aynı dizi iccedilindeki (olasıdeğişik) yerlere işaret ederler ampz[N] adresinin z dizisi iccedilinde olmadığını soumlyleyerekbuna karşı ccedilıkabilirsiniz zira dizinin son elemanı z[N-1]rsquodir Haklısınız ancak grsquonin buldquogeccedilersizrdquo adrese işaret ettiği zaman grsquoye birşey atamamak iccedilin lt= yerine lt kullanacakkadar dikkatli olduğumuzu da goumlzlemleyin C Standardı ise bir nesnenin sınırları dışındaadres uumlretmeyimdasho adresteki boumllge değiştirilsin değiştirilmesinmdashaccedilıkccedila yasaklamaktadırTek istisna olarak bir nesnenin son baytından bir sonraki baytı goumlsteren adresi uumlretmeğeizin verir İşte bu oumlzellik ldquogltampz[N]rdquode kullanılmıştır
Bir goumlsterge (== veya = kullanılarak) 0 tamsayı değişmeziyle karşılaştırılabilirGeleneksel olarak 0 değerinin hiccedil bir şeyi goumlstermediği varsayılmıştır Bu tamsayıdeğişmezi programlarda o kadar ccedilok kullanılmaktadır ki stdioh başlık dosyasında
define NULL 0
şeklinde bir tanımlama yapılmıştır Boumlylece eğer 0 yerine NULL kullanılacak olursaldquogoumlstergeler tamsayı değildirrdquo kuralı bozulmamış gibi goumlruumlnecektir Bir goumlstergeninherhangi bir yeri goumlstermesini istemiyorsanız
g = NULL
atama deyimini kullanın NULLrsquoun her tip goumlsterge ile uyumlu olduğuna dikkat edin Buoumlzel bir durumdur
32 Goumlstergeler Ve Diziler
Şimdi gelin aşağıdakini inceleyelim
13
50 GOumlSTERGELER VE BİT İŞLEME BOumlLUumlM 3
int z[N] ifor (i=0 iltN i++) (z+i) = 0
Buradaki atama bir oumlnceki kısmın başında verilenle tamamen aynıdır Neden z ileampz[0] aynı şey olduğunu zaten biliyorsunuz Boumlylece (z+i) ile (ampz[0]+i) aynışeydir Yukarıda goumlsterge toplama işlemleri ile ilgili anlatılanlara goumlre aynı zamanda(ampz[i]) ile eşdeğerdir Şimdi ile amp birbirinin aksi işlemleri olduğuna goumlrebirbirlerini goumltuumlruumlrler Boumlylece ifade z[i] olur Aslında derleyici z[i] şeklindeki birifadeyi hemen (z+i) şekline doumlnuumlştuumlruumlr yani ilk şekil programcının rahatlığı iccedilin dildesağlanan bir kısaltma gibi duumlşuumlnuumllebilir Hatta z[i] yerine biraz garip olan i[z]ifadesini de kullanabilirsiniz
Dizi isimlerinin gerccedilekte goumlsterge olduğunu bildiğinize goumlre
float z[N]
ile
float g
arasındaki fark nedir diye sorabilirsinizg = z
ataması bir yapıldı mı
g ampz[0] ve z
kendi aralarında
g+i ampz[i] ve z+i
ve
(g+i) z[i] ve (z+i)
de aynı şekilde kendi aralarında eşdeğerdir
Fakat oumlnemli bir fark varz = g
yazamazsınız ccediluumlnkuuml g bir değişken goumlsterge oysa z bir değişmez goumlstergedir Şimdideğişken tanımlamalarına geri doumlnelim
float z[N]
derleyicinin ana bellekte N float değişken iccedilin gerekli yer ayırmasına yol accedilacaktır(Bizim sistemimizde 4timesN bayt) Bu bellek oumlbeğinin başlangıccedil adresi z değişmezinin(goumlsterge) değeri olur z bir değişken değildir ccediluumlnkuuml bu (değişmez) adresi saklamak iccedilinbellekte ayrıca yer ayrılmamıştır Diğer yandan
float g
13
BOumlLUumlM 3 GOumlSTERGELER VE BİT İŞLEME 51
bir adres tutacak genişlikte bir yerin ayrılmasını sağlar (Bizim sistemimizde 2 bayt)Programın yuumlruumltuumllmesi esnasında bu g değişkeni değişik zamanlarda değişik değerlertutabilir Başlangıccedilta ise şimdiye kadar goumlrduumlğuumlmuumlz değişken tuumlrleri iccedilin değeribelirsizdir
33 Karakter Dizileri
C dilinde oumlzel bir ldquokarakter dizisirdquo tipi yoktur Ancak karakter dizisi gerektiren durumlariccedilin bazı kolaylıklar bulunmaktadır Karakterlerden oluşan normal bir dizi veya birkarakter goumlstergesi bir karakter dizisi olarak duumlşuumlnuumllebilir
include ltstdiohgt
void main (void) char dd dd = dunya printf(Merhaba sn dd)
Bildiğiniz gibi printfrsquoin ilk arguumlmanı bir karakter goumlstergesi olmalıdır ikinci arguumlmanda s doumlnuumlşuumlm tanımlamasının gerektirdiği şekilde bir karakter goumlstergesidirYukarıdaki atama ifadesinde olduğu gibi bir ifade iccedilinde kullanılan bir karakter dizisideğişmezi bir karakter goumlstergesidir ve dizinin ilk karakterine işaret eder Karakter dizisiderleyici tarafından bir tarafta saklanır Boumlylece yukarıdaki atama deyiminde sadece birgoumlsterge ataması yapılmaktadır bir karakter dizisi aktarması soumlz konusu değildir Eğer birkarakter dizisi aktarması yapmak istiyorsak bunu kendimiz yapmalıyız Oumlrneğin
char d[10]d = bir dizi
geccedilersizdir ccediluumlnkuuml derleyici goumlsterge ataması yapmaya ccedilalışacaktır Ancak ldquo=rdquo işaretininsol tarafında bir değişmez goumlsterge bulunduğundan bu olanaksızdır Karakterleri tek tekbir doumlnguuml kullanarak atamak zorundayız Boumlyle işlemler ccedilok sık kullanıldığı iccedilin Ckuumltuumlphanesi bazı karakter dizisi işleme fonksiyonları sağlamaktadır Oumlrneğin
strcpy(d bir dizi)
bizim işimizi goumlrecektir Bu fonksiyon ikinci arguumlman olarak geccedilirilen adresteki buumltuumlnkarakterleri en sonda gelen boş karakteri (0) ile birlikte d tarafından goumlsterilen yereaktaracaktır Bu durumda bu 9 karakterdir Bu fonksiyon hedef dizinin bu kadar ccedilokkarakteri alacak genişlikte olup olmadığını kontrol etmez (Zaten edemez)
Benzer bir durum karakter dizileri karşılaştırması yaparken ortaya ccedilıkar
if (s==Bu dizi)
testi her zaman yanlış sonucunu verecektir Kuşkusuz bunun nedeni goumlsterge eşitliğini testetmemizdir s ya bir goumlsterge yada bir dizi ismi olabilir (her iki durumda da bir goumlsterge
13
52 GOumlSTERGELER VE BİT İŞLEME BOumlLUumlM 3
ifadesidir) değişmez karakter dizisi ise onu saklamak iccedilin kullanılan bellek oumlbeğininbaşına işaret eden bir goumlstergedir Doğal olarak bunlar farklı adreslerdir boumlylece bu testhiccedilbir zaman ldquodoğrurdquo sonucunu vermeyecektir Bunun yerine s1 ve s2 şeklinde verileniki karakter dizisini karşılaştırıp soumlzluumlk sıralamasına goumlre s1rsquoin s2rsquoden kuumlccediluumlk s2rsquoyeeşit veya s2rsquoden buumlyuumlk olmasına bağlı olarak sırasıyla olumsuz bir tamsayı sıfır veyaolumlu bir tamsayı veren strcmp(s1s2) fonksiyonunu kullanmalıyız
strcat(ds) fonksiyonu s dizisini drsquonin arkasına aktarır Kuşkusuz d dizisininhem eski hem de yeni karakter dizisini kapsayacak kadar geniş olması gerekir
strlen(s) s karakter dizisinin uzunluğunu verir bunu yaparken en sondaki boşkarakteri saymaz strchr(sc) c karakterinin s karakter dizisinin iccedilinde ilk ortayaccedilıktığı yerin adresini bir karakter goumlstergesi olarak doumlnduumlruumlr c dizi iccedilinde yoksa NULLverir strrchr(sc) strchr(sc) gibidir sadece tarama işlemini sağdan soladoğru yapılır
Yukarıdaki fonksiyonlardan bazıları iccedilin işlemi sınırlayan başka bir arguumlman nkabul eden bazı uyarlamalar bulunmaktadır strncmp(s1s2n) en fazla n karakterikarşılaştırır strncat(s1s2n) en fazla n boş olmayan karakter eklerstrncpy(s1s2n) tam olarak n karakter aktarır (eğer s2rsquonin uzunluğu daha kısaise boş karakterler eklenir)
Yararlı bir değer doumlnduumlrmuumlyor gibi goumlzuumlken fonksiyonlar aslında karakter goumlstergesidoumlnduumlrmektedir Genelde geri doumlnduumlruumllen goumlsterge hedef dizisinin başına işaret eder
Bir sonraki boumlluumlmde de goumlreceğimiz gibi fonksiyonları kullanmadan oumlncebildirimlerini yapmak zorundayız Bu kısımda anlatılan fonksiyonların bildirimistringh başlık dosyasında bulunmaktadır
Diğer birccedilok fonksiyon yanında C kuumltuumlphanesinde bazı veri doumlnuumlşuumlm fonksiyonlarıda mevcuttur Bunlardan bazılarının bildirimi stdlibh başlık dosyasındabulunmaktadır ve aşağıda accedilıklanmıştır Ayrıca fonksiyon ve arguumlman tipleri degoumlsterilmiştir
double atof(char )karakter dizisi arguumlmanını ccedilift duyarlıklı kayan noktalı sayıya ccedilevirir hatadurumunda 00 doumlnduumlruumlr
int atoi(char )karakter dizisi arguumlmanını tamsayıya ccedilevirir hata durumunda 0 doumlnduumlruumlr
long atol(char )karakter dizisi arguumlmanını uzun tamsayıya ccedilevirir hata durumunda 0L doumlnduumlruumlr
char itoa(int char int)ilk tamsayı arguumlmanını karakter dizisine ccedilevirir sonucu ikinci arguumlman olarak verilenadrese koyar uumlccediluumlncuuml arguumlman tabanı belirtir
char ltoa(long char int)ilk uzun tamsayı arguumlmanını karakter dizisine ccedilevirir sonucu ikinci arguumlman olarakverilen adrese koyar uumlccediluumlncuuml arguumlman tabanı belirtir
13
BOumlLUumlM 3 GOumlSTERGELER VE BİT İŞLEME 53
int toupper(int) ve int tolower(int)sırasıyla karakter arguumlmanının buumlyuumlk harf ve kuumlccediluumlk harf karşılığını doumlnduumlruumlr
34 Bitsel İşleccediller
İşleccediller Crsquonin oumlnemli bir konusudur Ancak hepsinin birlikte anlatılacakları tek bir yeryoktur En iyisi gerek duyulduğunda onları anlatmaktır Bu boumlluumlmde goumlstergelerleberaber kullanıldıkları iccedilin iki tekli işleccedil (amp ve ) anlatılmıştı
Bitsel işleccediller başka şeylerle pek ilgisi olmayan bir grup oluşturduklarından hepsinibu kısımda anlatmaya karar verdik İşleccedillerin azalan oumlnceliklerine goumlre anlatılmalarıaccedilısından bu kısım Kısım 22rsquoye benzemektedir Bire tuumlmler ve atama işleccedilleri sağdansola doğru diğerleri soldan sağa doğru birleşirler Bu kısımda anlatılan tuumlm işleccedillersadece (ccedileşitli boylarda olabilen) tamsayı işlenenleri kabul ederler ve işlenenler uumlzerindeişlem yapmadan oumlnce Kısım 16rsquoda anlatılan tip doumlnuumlşuumlmlerini gerccedilekleştirirler Atama ileilgili olanlar hariccedil eğer işlenenler değişmez ifadeler ise değişmez ifadeler oluştururlarBu işleccedillerin isimleri ve kullanılan simgeler şoumlyledir
işleccedil isim~ bire tuumlmlerltlt sola kaydırmagtgt sağa kaydırmaamp bitsel VE^ bitsel dışlayan VEYA| bitsel VEYA
ltlt= sola kaydırma ve atamagtgt= sağa kaydırma ve atamaamp= bitsel VE ve atama^= bitsel dışlayan VEYA ve atama|= bitsel VEYA ve atama
Detaya girmeden oumlnce bitsel işleccedillerin mantıksal olarak ne yaptığını goumlsteren birccedilizelge sunalım Aşağıda y ve z tek bitlerdir
y z ~y yampz y^z y|z0 0 1 0 0 00 1 1 0 1 11 0 0 0 1 11 1 0 1 0 1
Bitsel bir işleccedil işlenen(ler)in her bitine yukarıda anlatılan şekilde uygulanır
13
54 GOumlSTERGELER VE BİT İŞLEME BOumlLUumlM 3
Bire Tuumlmler İşleci ~
~ işleci işleneninin 1 olan bitlerini 0rsquoa 0 olan bitlerini de 1rsquoe ccedilevirir Sonucun tipiişlenenin tipiyle aynıdır
Kaydırma İşleccedilleri ltlt Ve gtgt
Bir kaydırma ifadesi
ifade_1 ltlt ifade_2
veya
ifade_1 gtgt ifade_2
şeklindedir Normalde ifade_1 bir değişken veya dizi elemanıdır ltlt işleci durumundatip doumlnuumlşuumlmlerinden sonra ifade_2 intrsquoe ccedilevrilir ve ilk işlenenin bitleri ifade_2rsquonindeğeri kadar sola kaydırılır İşlenenin solundan ldquoduumlşenrdquo bitler kaybedilir Sola kayanbitlerden arta kalan sağdaki boş yerler sıfırla doldurulur Sonucun tipi soldaki işlenenintipidir
gtgt işleci yukarıda anlatılanların sağa doğru olan şeklini yerine getirir tek bir farklaEğer soldaki ifade signed (işaretli) ise boş kalan yerler 0 yerine işaret bitiyledoldurulabilir Buna aritmetik kaydırma denir ve sistemimiz bunu yapar Eğer ilk ifadeunsigned (işaretsiz) ise solda boşalan bitlerin sıfırla doldurulacağı garanti edilir ve birmantıksal kaydırma soumlz konusudur
Bitsel VE İşleci amp
İkili amp işleci işlenenlerinin bitlerinin VEsini verir Yani eğer her iki işlenenin irsquoinci bitleri1 ise sonucun irsquoinci biti de 1 olur Aksi takdirde 0rsquodır Tabii ki
(a amp b) amp c
vea amp (b amp c)
aynı değerlere sahiptirler (yani amp işlecinin birleşme oumlzelliği vardır) C bu gerccedileği kullanırve derleyici daha verimli olacağı gerekccedilesiyle parantez iccediline alınmış olsa dahi boumlyleifadeleri (yani ve + gibi birleşme ve değişme oumlzelliği goumlsteren işleccedilleri iccedileren ifadeleri)istediği şekilde yeniden duumlzenleyebilir
Bitsel Dışlayan VEYA İşleci ^
^ işleci işlenenlerinin dışlayan VEYAsını verir Yani eğer işlenenlerin irsquoinci bitleri farklıise sonucun irsquoinci biti 1 olur Aksi takdirde 0rsquodır ^ birleşme oumlzelliği goumlsteren bir işleccediltirve bu işleci iccedileren ifadeler oumlnceki altkısımda anlatıldığı gibi yeniden duumlzenlenebilir
13
BOumlLUumlM 3 GOumlSTERGELER VE BİT İŞLEME 55
Bitsel VEYA İşleci |
| işleci işlenenlerinin kapsayan VEYAsını verir Yani eğer her iki işlenenin irsquoinci bitleri 0ise sonucun irsquoinci biti de 0 olur Aksi takdirde 1rsquodir | da birleşme oumlzelliği goumlsteren birişleccediltir ve yeniden duumlzenleme soumlz konusu olabilir
Atama İşleccedilleri ltlt= gtgt= amp= ^= Ve |=
Yukarıda anlatılan işleccediller belirli ifadeler oluşturmalarına rağmen işlenenlerinindeğerlerini değiştirmezler Şimdi anlatacağımız atama işleccedilleri ise işlemin sonucunusoldaki işlenenlerine aktarırlar
Boumlluumlm 1rsquodeki += -= = vs işleccedillerini anımsayın Her bir ikili bitsel işlecinkarşılığında bir atama işleci mevcuttur ltlt iccedilin ltlt= gtgt iccedilin gtgt= amp iccedilin amp= ^ iccedilin ^=ve | iccedilin |= Bu işleccedillerin işlevselliği diğer atama işleccedillerine benzer
Bitsel İşleccedillermdashOumlrnekler
short long gibi tiplerin uzunlukları derleyiciden derleyiciye değiştiğine goumlreburadaki oumlrnekler sadece bizim sistemimiz iccedilin geccedilerlidir Aşağıdaki buumltuumln oumlrneklerdeifadenin değeri sekizli tabanda verilecektir Sonucun tipi de ayrıca belirtilecektir Buumltuumlndeğişkenlerin ilk değeri 5rsquotir Tipler ise şoumlyledir
signed char c short s int i long l
ifade değer tip~c 0372 char~s 0177772 int~i 0177772 int~l 037777777772 longc ltlt 3 050 chars gtgt 2 01 inti ltlt l 0240 intc amp s 05 int-i amp ~l 037777777772 longc ^ 3 06 int~s ^ 2 0177770 inti ^ l amp i 0 long~c | 3 0177773 ints | sgtgt1 07 inti | l 05 longc ltlt= s 0240 charl gtgt= i 0 longs amp= -i 01 shorti ^= l+1 03 intc |= 16 025 char
13
56 GOumlSTERGELER VE BİT İŞLEME BOumlLUumlM 3
Bir OumlrnekmdashSayı Paketleme
Bitsel işleccedillerin kullanımını goumlstermek iccedilin uumlccedil sayıyı bir tamsayıya ldquopaketleyenrdquo dahasonra ise ldquoaccedilanrdquo aşağıdaki programı inceleyelim1 include ltstdiohgt2 define GUN_UZ 53 define AY_UZ 44 define TABAN_YIL 19005 define TAVAN_YIL (TABAN_YIL+(1ltlt16-GUN_UZ-AY_UZ)-1)6 void main (void)7 8 unsigned const ay_ortu = ~(~0ltltAY_UZ)9 unsigned const gun_ortu = ~(~0ltltGUN_UZ)10 unsigned yil ay gun tarih1112 do 13 scanf(uuu ampyil ampay ampgun)14 while (yilltTABAN_YIL || yilgtTAVAN_YIL ||15 aylt1 || aygt12 || gunlt1 || gungt31)16 yil -= TABAN_YIL17 tarih = (yilltltAY_UZ|ay)ltltGUN_UZ | gun18 printf(Paketleme tamamlandin)1920 yil = ay = gun = 0 degiskenleri temizle 21 gun = tarih amp gun_ortu22 ay = (tarihgtgtGUN_UZ) amp ay_ortu23 yil = tarihgtgt(GUN_UZ+AY_UZ)24 printf(Acma tamamlandinTarih u u u25 yil+TABAN_YIL ay gun)26 main
Program başladığında 1900 ile 2027 yılları arasında bir tarih kabul eder (Satır 12-15) Sadece bazı basit kontroller yapılmıştır 13rsquouumlncuuml ayın 54rsquouumlncuuml guumlnuuml giremezsinizancak Şubatrsquoın 31rsquoini girebilirsiniz Sadece 1900 yılından beri geccedilen yılları sakladığımıziccedilin Satır 16rsquodaki -= işlemi yapılır Paketleme Satır 17rsquode yapılır yil iccedilindeki geccedilenyıllar AY_UZ (yani 4) bit sola kaydırılır ay yeni boşalan yere VEYAlanır sonra bununtamamı GUN_UZ (5) bit sola kaydırılır ve gun iccedileriye VEYAlanır Paketleme sonundatarihin en solundaki 7 bitinde geccedilen yıllar en sağdaki 5 bitte guumln ve geri kalanında aybulunur Bizim sistemimizde short bir tamsayı 16 bit kapladığına goumlre tarihtekibuumltuumln bitler kullanılmış olur do deyimindeki erim (yayılma aralığı) kontrolleri busayıların hiccedilbirinin kendileri iccedilin ayrılan miktardan daha fazla bir yer isteğindebulunmayacaklarını sağlamak iccedilindir
Satır 20 accedilma işleminin gerccedilekten ccedilalışıp ccedilalışmadığı kuşkusunu bertaraf etmekiccedilindir ve programın davranışında herhangi bir değişikliğe yol accedilmadan ccedilıkarılabilir
Satır 21 tarihin guumln bitlerini 1rsquole geri kalanını da 0rsquola VEleyerek guumlnuuml alır Bunabelli nedenden dolayı ldquooumlrtmerdquo denir Satır 10rsquoda ilklenen gun_ortu değişkeni gereklibit kalıbını iccedilerir (~0rsquoın buumltuumln bitleri 1rsquodir) Satır 22 oumlnce ayın en sağdaki 4 bitegeleceği şekilde tarihi kaydırır sonra da ay dışındaki bitleri oumlrterek ayı elde ederSatır 23rsquote tarih sonuccedilta geccedilen yılların elde edileceği şekilde sağa kaydırılır tarihunsigned olduğuna goumlre en solda hep 0 vardır Program yeni accedilılan tarihi yazarak sonaerer
13
BOumlLUumlM 3 GOumlSTERGELER VE BİT İŞLEME 57
Bu arada daha ileriki bir boumlluumlmde aynı paketlemeyi yapacak başka bir youmlntemgoumlreceğiz
35 İşleccedil Oumlnceliği Ve Birleşme
İşleccedil oumlnceliği ve birleşme ccedilizelgesinin en son durumu Ccedilizelge 31rsquode goumlsterilmiştir Buccedilizelge yeni tanıtılan işleccedillerle daha ileriki boumlluumlmlerde tanıtılacak olan işleccedillerin tamamınıiccedilerir
CcedilİZELGE 31 C işleccedil oumlnceliği ve birleşme() [] -gt rarr
~ ++ -- sizeof (tip)+(tekli) -(tekli)
(dolaylama) amp(adres alma)larr
rarr+ - rarr
ltlt gtgt rarrlt lt= gt gt= rarr
== = rarramp rarr^ rarr| rarrampamp rarr|| rarr larr
= = = = += -=ltlt= gtgt= amp= ^= |=
larr
rarr
Şimdi bu ccedilizelgenin ne anlama geldiğini bir daha goumlzden geccedilirelim Bu ccedilizelge Cdilindeki buumltuumln işleccedilleri azalan oumlncelik sıralarına goumlre liste halinde vermektedir Aynısatırda verilmiş olan işleccediller aynı oumlnceliğe sahiptirler Eğer aynı oumlnceliğe sahip ikiişlecimiz varsa o zaman ccedilizelgenin sağ suumltununda goumlsterilen birleşmeyi kullanırız Sağadoğru ok (rarr) soldan sağa birleşmeyi ifade eder oumlrneğin ldquoxyzrdquo ile ldquo(xy)zrdquo aynıanlamı taşırlar Sola doğru ok (larr) sağdan sola birleşmeyi belirtir oumlrneğin ldquox=y=zrdquo ileldquox=(y=z)rdquo eşdeğer ifadelerdir Tuumlm tekli işleccediller uumlccedilluuml (koşullu) işleccedil ve tuumlm atamaişleccedilleri sağdan sola doğru gruplanırlar geri kalanların soldan sağa doğru birleşmeoumlzelliği vardır Bu ccedilizelgede goumlsterilen bazı işleccediller henuumlz anlatılmamıştır Bunlar () -gt ve sizeofrsquotur
13
58 GOumlSTERGELER VE BİT İŞLEME BOumlLUumlM 3
Problemler
1 Bizim sistemimizdeinclude ltstdiohgtvoid main (void) int x printf(d d dn(int)ampx(int)(ampx+1)(int)ampx+1)
programı8580 8582 8581
sonucunu goumlruumlntuumller Tahmin edebileceğiniz gibi bunlar bellek adresleridir Nedenilk durumda fark 2 ikinci durumda ise 1rsquodir
2 Eğer makinenizde (işaretli) bir tamsayı uumlzerinde yapılan bir sağa kaydırma (gtgt)işlemi esnasında boşalan yerler işaret bitiyle dolduruluyorsa isaret-doldurmaaksi takdirde sifir-doldurma mesajını verecek bir program yazınız Sisteminizhakkında (soumlzcuumlk uzunluğu gibi) herhangi bir varsayım yapmayın
3 Girilen bir tamsayıda 1 olan bitleri sayan bir program yazınız
4 Aşağıdaki deyimler ne yapara ^= bb ^= aa ^= b
Accedilıklayınız İpucu Başlangıccedilta arsquonın 0077 brsquonin de 0707 iccedilerdiğini varsayın Sondeğerleri ne olacaktır
5 Zaman da bir soumlzcuumlk iccediline aşağıdaki gibi paketlenebilir 5 bit saat 6 bit dakika 5 bitsaniye Saniyeleri 5 bite sığdırmak iccedilin değeri 2 ile boumlluumln yani saniyenin ensağındaki biti atın Bunu yerine getirecek bir program yazın
6 Aşağıdaki kodun ne işe yaradığını accedilıklayın
int ifor (i=0 ilt10 i++) printf(dcniQWERTYUIOP[i])
13
59
BOumlLUumlM 4 FONKSİYONLAR VEPROGRAM YAPISI
Bir program bir goumlrevi yerine getirmek iccedilin yazılır Eğer yapılacak iş pek kolay değilseprogram oldukccedila uzun olabilir Bazı programlar onbinlerce satır uzunluğunda olabilirBoumlyle durumlarda esas goumlrevi daha kuumlccediluumlk ve kolay idare edilebilir altgoumlrevlereayırmadan yerine getirmek hemen hemen olanaksızdır
C boumlyle altgoumlrevleri ifade etmek ve birbirinden ayırmak iccedilin bir youmlntemoumlngoumlrmektedir Bu youmlntem sayesinde ldquobilgi saklamardquo ilkeleri kullanılabilir C sadece birtek altprogram ccedileşidi sağlamaktadır bu da fonksiyondur Matematiksel olarak birfonksiyon arguumlmanlarını doumlnduumlrduumlğuuml değere ilişkilendiren bir ldquokara kuturdquo gibidir Aynışey C iccedilin de geccedilerlidir ancak bir fonksiyon birden fazla değer doumlnduumlrecek kuumlresel veriyapılarında yan etkiler yapacak veya girdiccedilıktı sağlayacak bir şekilde de tasarımlanabilirOumlrneğin printf fonksiyonu arguumlmanlarının değerlerinin ccedilıktısını yapmak iccedilinkullanılır Geri doumlnduumlrduumlğuuml değer yazılan karakterlerin sayısıdır ancak bu fazla ilgiccedilekici değildir
Ccedilok ldquobasitrdquo bir fonksiyon tanımı aşağıda verilmiştir
void f (void)
Bu fonksiyon hiccedilbir şey yapmamasına rağmen program geliştirmesi esnasında yer tutucuolarak kullanılabilir Bu boumlluumlmde fonksiyon tanımı ve kullanımı hakkında daha fazlaşeyler oumlğreneceğiz
Kitabın başından beri goumlrmekte olduğumuz main tanıtıcı soumlzcuumlğuuml programın yerinegetirmesi gereken goumlrevi ifade eden fonksiyonun ismidir Her makul C programı iccedilindemain adı verilen bir fonksiyonun bulunması gerekir ccediluumlnkuuml program yuumlruumltuumllmeyebaşlandığında program iccedilinde bağlanmış bulunan bir başlangıccedil yordamı ccedilalışmaya başlarbu da kontroluuml sonuccedilta main fonksiyonuna geccedilirir Eğer bağlama esnasında bağlayıcı(linker) main adı verilen bir fonksiyon bulamazsa sizin iccedilin yuumlruumltuumllebilir bir kod
13
60 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
oluşturamayacaktır mainrsquoin bir anahtar soumlzcuumlk olmadığına dikkat edin yani istersenizmain adında bir değişken de tanımlayabilirsiniz
Fonksiyonların guumlcuuml bizim tekrarlanan kod yazmamızdan kaccedilınmamızısağlamalarında yatar Herhangi bir kodu bir fonksiyon şeklinde bir defa belirtiriz onabir isim veririz ve daha sonra bu kodu ccedilalıştırma gereksinimi duyduğumuzda bufonksiyonu ldquoccedilağırırızrdquo Bu iyi fakat yeterli değildir Birccedilok durumda bu kod o ankigereksinmelerimize ldquouyarlanmalıdırrdquo Oumlrneğin bir diziyi sıraya sokan bir kodumuz varsabu kodu her ccedilağırdığımızda değişik sayıda elemandan oluşan değişik bir dizi belirtecekşekilde bunu hazırlamamız daha iyi olur Bu ise fonksiyon arguumlmanları kullanılarakyapılabilir
Her fonksiyon diğerlerinden bağımsız olduğuna yani bir fonksiyon iccedilindetanımlanmış değişkenler başka bir fonksiyonda kullanılamadığına goumlre fonksiyonlarınbirbirleriyle haberleşmelerini sağlayacak youmlntemler geliştirilmiştir Bir youmlntemfonksiyonlara arguumlman geccedilirmektir Başka bir youmlntem kuumlresel değişkenler kullanmaktır
Şimdiye kadar olan oumlrneklerde goumlrduumlğuumlmuumlz buumltuumln değişkenler fonksiyonlar (mainfonksiyonu) iccedilinde tanımlanmışlardı Bu boumlluumlmde goumlreceğimiz gibi değişken bildirimleriveya tanımlamalarını fonksiyonlar dışında yapmamız da olasıdır Boumlyle değişkenlerekuumlresel adını veririz ccediluumlnkuuml fonksiyon iccedilinde tanımlanan yerel değişkenlerin aksinebunlar tanımlamadan sonra gelen program metni iccedilindeki buumltuumln fonksiyonlar tarafındankullanılabilirler
41 Fonksiyon Tanımlama
Aslında bir fonksiyonu yani main fonksiyonunu nasıl tanımlayacağımızı zatenbiliyoruz Şimdi bir fonksiyonun daha genel bir şeklini goumlrelim
doumlnuumlş_tipiopt fonksiyon_ismi (parametre_bildirimleriopt)blok
Doumlnuumlş_tipi fonksiyon tarafından doumlnduumlruumllen değerin tipini belirtir Bu intdouble gibi bir aritmetik tip veya goumlsterge olabilir Bir dizi ve bazı eski derleyicilerdebir yapı veya birlik olamayabilir ancak bunlara bir goumlsterge olabilir Bir fonksiyon iccedilinvarsayılan doumlnuumlş tipi intrsquotir bu da geniş bir alanı kapsar ccediluumlnkuuml genelde mantıksaldeğerler (doğruyanlış değerleri) ve karakterler iccedilin de int kullanırız
Doumlnuumlş_tipi olarak void anahtar soumlzcuumlğuuml kullanıldığında fonksiyondan hiccedilbir değerdoumlnduumlruumllmeyeceği belirtilmiş olur void fonksiyonlar FORTRANrsquodakiSUBROUTINErsquoler veya Pascalrsquodaki procedurersquoların karşılığıdır
Fonksiyon_ismi bir tanıtıcı soumlzcuumlktuumlr Eğer fonksiyon ayrıca derlenen başka birkaynak dosyadan ccedilağrılacaksa fonksiyon isminin sadece ilk 8 karakteri anlamlıdır bu dabağlayıcı tarafından konulan sınırlamadan dolayıdır
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 61
Parametre_bildirimleri virguumllle ayrılmış ve oumlnuumlne tipleri yazılmış biccedilimsel arguumlmanveya parametre isimleri listesidir Diğer bir fonksiyon tarafından ccedilağrıldığında bufonksiyona geccedilirilecek olan arguumlmanların sayısını sırasını ve tipini belirtir Aynızamanda parametrelere sadece fonksiyonun goumlvdesini oluşturan blokrsquoun iccedilinde anlamlıolan isimler verir Hiccedil parametresi olmayan bir fonksiyon da olabilir Bu durumparantezler iccediline void yazılarak accedilıkccedila goumlsterilir Oumlrneğin
rand (void) fonksiyonun goumlvdesi
Blok her biri isteğe bağlı olan iki kısımdan oluşan bileşik bir deyimdir Bir değişkenveya tip tanımlama veya bildirim kısmı ile onu izleyen deyimler Kısım 18rsquoe bakınızBildirim kısmı fonksiyon goumlvdesi iccedilinde yerel olarak kullanılacak olan nesnelerintanımını veya bildirimini iccedilerir Deyimler fonksiyon goumlvdesinin yuumlruumltuumllebilir kısmınıoluştururlar
Bir fonksiyon başka bir fonksiyon iccedilinde tanımlanamaz Diğer bir değişle birfonksiyon tanımı diğer bir fonksiyon tanımının bitmesinden sonra başlar Fonksiyontanımlamalarının sırası oumlnemsizdir ancak bu boumlluumlmde daha ileride bahsedeceğimiz dikkatedilmesi gereken bazı kuumlccediluumlk noktalar vardır
Şimdi bir oumlrnek Crsquonin ldquomutlak değer alma işlecirdquo yoktur Tamsayılar uumlzerindeccedilalışan bir fonksiyon tanımlayalım
abs (int n) if (n gt= 0) return n else return -n
Burada return adında yeni bir deyim goumlrmekteyiz Bu genelde
return
veya
return ifade
şeklinde olur Kontroluumln ccedilağırana geri doumlnmesini sağlar return deyiminden sonragelen deyimler yerine getirilmez ve fonksiyon hemen ccedilağrıldığı yere ldquogeri doumlnerrdquo İlkşekilde kontrol geri doumlner ancak yararlı hiccedil bir değer doumlnduumlruumllmez Geri doumlnduumlruumllendeğer tanımsız olduğu iccedilin ccedilağıran fonksiyon bunu kullanmaya ccedilalışmamalıdır İkincişekilde ifadenin değeri fonksiyonun değeri olarak geri doumlnduumlruumlluumlr Eğer ifadenindeğerinin tipi fonksiyonun doumlnuumlş tipiyle aynı değilse otomatik tip doumlnuumlşuumlmuuml yapılırldquoDoumlnuumlş tipirdquo void olan fonksiyonlar iccedilin ikinci şeklin kullanılamayacağı accedilıktır
13
62 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
Sağ ccedilengelli parantezin oumlnuumlnde bir return olduğu varsayılır bundan dolayı bellibir değer doumlnduumlrmek istemiyorsanız return yazmayabilirsiniz Son deyim yerinegetirildikten sonra yararlı bir değer olmadan kontrol ccedilağıran fonksiyona doumlnduumlruumllecektir
42 Fonksiyon Ccedilağrıları
Bir fonksiyonu ccedilağırmak iccedilin fonksiyon ismini ve virguumllle ayrılıp parantez iccediline alınmışarguumlmanların bir listesini belirtin Fonksiyonun arguumlmanları olmasa dahi parantezlerbulunmalıdır boumlylece derleyici ismin bir değişkeni değil de bir fonksiyonu goumlsterdiğinianlayabilecektir Fonksiyon tarafından geri doumlnduumlruumllen değer kullanılabilir veyakullanılmayabilir Oumlrneğin
abs(-10)
bir fonksiyon ccedilağrısıdır Bu noktada kontrol ccedilağıran fonksiyondan ccedilağrılan fonksiyonaaktarılır -10 değeri abs fonksiyonunun n parametresine atanır Ccedilağrılan fonksiyon yabir return deyiminin yerine getirilmesi yada fonksiyon goumlvdesinin sağ ccedilengelliparantezine ulaşılması sonucu bittiğinde kontrol ccedilağıran fonksiyondaki kaldığı yere geridoumlner Fonksiyon tarafından bir değer doumlnduumlruumlluumlyorsa bu değer ccedilağrının yerini alırOumlrneğin
x = abs(-127)
xrsquoin değerini 127 yapacaktır oysa daha yukarıda aynı fonksiyona yapılan ilk ccedilağrıda geridoumlnduumlruumllen değer (10) kullanılmamıştı bu yuumlzden bu değer kaybolmuştu ldquoDoumlnuumlş tipirdquovoid olan bir fonksiyonun bir ifade iccedilinde kullanılmaması gerektiği accedilıktır
Bir arguumlman istenildiği kadar karmaşık bir ifade olabilir Arguumlman değerinin tipifonksiyon tanımındaki karşılık gelen parametre iccedilin beklenen tipe uymalıdır aksitakdirde aşağıda accedilıklanacağı gibi bulunması zor olan bazı hatalar meydana ccedilıkabilir
Dikkat Fonksiyon arguumlmanlarının hesaplanma sırası belirtilmemiştir Oumlrneğin ikiint arguumlmanının toplamını veren topla isminde bir fonksiyonumuzun olduğunuvarsayalım Ayrıca değeri 5 olan i adında bir değişkenimiz olsun
toplam = topla(i-- i)
yazdığımızda toplamrsquoın değeri ne olacaktır 9 mu 10 mu Bu arguumlmanlarınhesaplanma sırasına bağlıdır Değişik derleyiciler değişik şekilde yapabilirler Bizimsistemimizde arguumlmanlar sağdan sola hesaplanır boumlylece toplamrsquoın değeri 10olacaktır Bu tuumlr şeylerden kaccedilınılması gerektiğini soumlylemeye gerek yok tabii
Fonksiyonlar kullanılmadan oumlnce bildirilmelidirler Bu kural bazı hataların oumlnlenmesiiccedilin titizlikle uygulanmalıdır C derleyicisi bildirimi yapılmayan bir fonksiyon kullanımıile karşılaştığında doumlnuumlş tipinin int olduğunu varsayar Oumlrneğin aşağıdaki gibi dabsadında bir fonksiyon tanımladığımızı
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 63
double dabs (double n) return (n gt= 00) n -n
ve onu
deneme (void) double d d = dabs(-314159)
şeklinde ccedilağırdığımızı duumlşuumlnuumln Uumlccedil olasılık vardır
1 dabsrsquoın tanımı aynı kaynak dosyada denemersquonin tanımından oumlnce gelir Budurumda dabsrsquoın tanımı etkisini denemersquonin iccedilinde de suumlrduumlreceği iccedilin hiccedil birsorun ccedilıkmayacaktır Derleyici yukarıdaki ifadede dabs tarafından beklenen ve geridoumlnduumlruumllen değerin tipinin double olduğunu bilecek ve gerekli tip doumlnuumlşuumlmleriniyapacaktır
2 dabsrsquoın tanımı denemersquonin tanımından sonra gelir Derleyici dabsrsquoın birfonksiyon ccedilağrısı olduğunu tanıyacak ancak henuumlz doumlnuumlş tipinin ne olduğunubilemeyeceği iccedilin int doumlnduumlren bir fonksiyon olduğunu varsayacaktır Daha sonradabsrsquoın gerccedilek tanımıyla karşılaştığında bir sorun ortaya ccedilıkacaktır ccediluumlnkuuml doubledoumlnduumlren bir fonksiyon olarak tekrar tanımlamaya ccedilalışacaktır Bu durumda bir hatamesajı verilecektir
3 En koumltuuml durum dabsrsquoın tanımı ayrı bir kaynak dosyada verildiği zaman ortayaccedilıkacaktır Ayrı ayrı derlemeden dolayı derleyici uyuşmazlığı bulamayacaktır Hattabağlayıcı bile birşey yapamayacaktır Programın yuumlruumltuumllmesi esnasında anlamsızsonuccedillar elde edilecektir Bunun nedeni yine derleyicinin tanımı veya bildirimiyapılmamış olan fonksiyonun int doumlnduumlrduumlğuumlnuuml varsayması boumlylece de dabsfonksiyonu tarafından doumlnduumlruumllen double değerin deneme tarafından int gibiyorumlanmasıdır Birccedilok derleyici yapılan bu tip varsayımları bir uyarı mesajışeklinde kullanıcıya bildirirler Bu tip uyarıları mutlaka dikkate alın ccediluumlnkuumlvarsayımlar her zaman sizin duumlşuumlnduumlklerinizle uyuşmayabilir
Yukarıdaki 2 ve 3rsquoteki sorunları ccediloumlzmek iccedilin aşağıdaki şekil oumlnerilmektedir
deneme (void) double d dabs(double) d = dabs(-314159)
13
64 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
Yukarıdaki bildirim (buna ayrıca fonksiyon prototipi de denir) deneme fonksiyonuntanımının dışında ve oumlnuumlnde de yazılabilir Boumlyle fonksiyon prototiplerinin tamamınıprogramın başlangıcında veya boumlyle fonksiyonları kullanan her kaynak dosya tarafındaninclude kullanılarak iccedilerilecek başlık dosyalarına yazmak sıkccedila kullanılan biryoumlntemdir Standart kuumltuumlphane fonksiyonlarının bildirimlerini yapan standart başlıkdosyaları buna iyi bir oumlrnek oluştururlar Bunlar derleyicilerin ccedileşitli hatalarıyakalamalarını veya gerektiği zaman tip doumlnuumlşuumlmleri yapmalarını sağlar Oumlrneğinyukarıdaki bildirimden sonra derleyici
d = dabs(5)
ifadesindeki 5 tamsayısını dabsrsquoa geccedilirmeden oumlnce doublersquoa doumlnuumlştuumlrecektir Ancak
d = dabs(bes)
iccedilin bir hata mesajı verecektir ccediluumlnkuuml bu durumdaki karakter goumlstergesi doublersquoadoumlnuumlştuumlruumllemez
Arguumlmanlar ccedilağıran fonksiyondan ccedilağrılan fonksiyona geccedilirildiğinde ldquodoğalrdquotiplerine (oumlrneğin shortrsquotan intrsquoe) doumlnuumlştuumlruumlrler Eğer fonksiyon kısa bir tipbekliyorsa bu arguumlmanın kısa tipe doumlnuumlştuumlruumllmesi gerekecektir Boumlylece eğer oumlzel birneden yoksa fonksiyon parametrelerinin bu doğal tiplerden olması daha iyi olacaktırGenelde doumlnuumlş tipleri iccedilin de aynı şey soumlzkonusudur
421 Değer İle Ccedilağrı
FORTRANrsquoda ve bazı diğer dillerde arguumlmanlar referansla geccedilirilir Yani fonksiyonaarguumlmanın değeri yerine adresi verilir Bu yolla ccedilağrılan fonksiyon ccedilağıran fonksiyontarafından arguumlmanın saklandığı boumllgeye erişir ve değerini değiştirebilir Boumlylece buumltuumlnarguumlmanlar hem fonksiyona bilgi iletirler hem de fonksiyondan bilgi geri getirirler yaniistemesek bile fonksiyona hem girdi hem de ccedilıktı iccedilin kullanılırlar Eğer gerccedilek arguumlmanbir değişken değil de bir ifade veya değişmez ise ne olur Bu durumda ccedilağıran fonksiyonifadeyi hesaplar değerini bir yerde saklar sonra da bu adresi geccedilirir Eğer ccedilağrılanfonksiyon mantıksal olarak yapmaması gerektiği halde arguumlmanının değerini değiştirirsebazı garip şeyler ortaya ccedilıkabilir Bir yordamın F FORTRAN fonksiyonunu bir değişmezolan 4 arguumlmanı ile ccedilağırdığını (yani ldquoF(4)rdquo) ancak F fonksiyonu iccedilinde arguumlmanındeğerinin 5 yapıldığını varsayın Bundan sonra program iccedilindeki 4 ldquodeğişmezrdquoinin herkullanıldığı yerde (oumlrneğin ldquoPRINT 4rdquo) 4rsquouumln 5 olduğu ldquogerccedileğirdquo ortayaccedilıkarılacaktır Diğer bir deyişle yukarıdaki deyimden 5 elde edilecektir
Yukarıdaki tartışma arguumlman geccedilirilmesi iccedilin başka bir youmlntemin gerekli olduğunuortaya ccedilıkarmaktadır Bu değer ile ccedilağrıdır ve C tarafından desteklenmektedir Budurumda arguumlmanın adresi yerine değeri fonksiyona geccedilirilir Bu değer oumlzel bir boumllgedetıpkı normal bir yerel değişken gibi saklanır Biccedilimsel arguumlmana yapılan her tuumlrluumldeğişiklik yerel kopyasında yapılacaktır ve ccedilağıran fonksiyondaki arguumlmanlara herhangibir etkisi olmayacaktır
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 65
Bazı diller arguumlman geccedilişinin her iki youmlntemine de izin verirler Oumlrneğin Pascalrsquodaoumlnuumlne var anahtar soumlzcuumlğuuml yazılarak tanımlanan parametreler iccedilin referansla ccedilağrıyapılır var yoksa değerle ccedilağrı yapılır Normalde C değerle ccedilağrıyı desteklediği haldedaha ileride goumlreceğimiz gibi mantıklı bir adres ve goumlsterge kaynaşması ile referanslaccedilağrı yapılabilir İlk oumlnce değerle ccedilağrıya bir oumlrnek verelim
fakt (int n) int i = n while (--n) i = n return i
Burada oumlnce irsquoye n atanır daha sonra n sıfır oluncaya kadar aşağı doğru sayılır hersefer i yeni n ile ccedilarpılır Goumlrduumlğuumlnuumlz gibi nrsquonin değeri değişir ancak ccedilağıran fonksiyontarafından geccedilirilen gerccedilek arguumlman uumlzerinde bunun bir etkisi yoktur Oumlrneğin
sayi = 4printf(d = dn sayi fakt(sayi))
deyimlerinden sonra sayirsquonın değeri (0 değil) 4 olmaya devam edecektir faktrsquotaki nparametresinin i gibi yerel bir değişken olduğuna dikkat edin
422 Referans İle Ccedilağrı
Ccedilağrıyı yapana bilgi doumlnduumlrmek istediğimizde ne yapmamız gerekir Bir youmlntemfonksiyonun doumlnuumlş değerini kullanmaktır Şimdiye kadar olan oumlrneklerimizde bu ccedilok sıkkullanılmıştı Fakat birden fazla doumlnduumlruumllecek değer varsa o zaman ne yapacağız Budurumda referansla arguumlman geccedilirmenin bir yolunu bulmamız gerekecektir Aslında bununasıl yapacağımızı da biliyoruz Daha oumlnceki boumlluumlmlerde programa değer girmek iccedilinscanf fonksiyonunu kullanmıştık Bu fonksiyon arguumlmanlarına yeni değerler atar Bufonksiyonu ilgilendirmediğine goumlre arguumlmanların eski değerlerini geccedilirmek yerineadreslerini geccediliririz Bu amaccedilla da adres alma (amp) işlecini kullanırız
Şimdi referans ile ccedilağrı youmlntemini goumlstermek iccedilin bir oumlrnek vermenin zamanıdır İkiint arguumlmanının değerlerini değiş tokuş eden bir fonksiyon yazmak istediğimizivarsayın
void degis (int x int y) int t t = x x = y y = t
fonksiyonu bu işi yapacaktır ancak sadece yerel olarak Parametrelerin yeni değerlericcedilağıran fonksiyona geri iletilmeyecektir Değerleri geccedilirmek yerine yukarıda anlatıldığı
13
66 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
gibi değişkenlerin adreslerini geccedilirmemiz gerekir Boumlylece a ve brsquonin int değişkenolduğu
degis(ampa ampb)
şeklinde bir ccedilağrı gerekecektir Ancak degis fonksiyonu da bu goumlstergeleri kabuledecek şekilde yeniden duumlzenlenmelidir Herşeyden oumlnce parametre bildirimlerideğiştirilmelidir yeni parametre değişkenleri değerler yerine adresleri saklamalıdırBildirim şoumlyledir
int xg yg
ve oumlrneğin xg değişkeninin bir int goumlstergesi olduğu anlamına gelir Şimdi buumltuumln x veyrsquoleri sıra ile xg ve yg ile değiştirirsek degisrsquoin doğru tanımını elde ederiz
void degis (int xg int yg) int t t = xg xg = yg yg = t
Unutulmaması gereken bir nokta dizi arguumlmanlarının her zaman referans ilegeccedilirildiğidir Oumlrneğin arguumlman olarak verilen diziyi sıraya sokan sirala adında birfonksiyonumuz olduğunu varsayalım Fonsiyonun bildirimi şoumlyle bir şey olacaktır
void sirala (int a[] int n) n dizinin uzunlugudur sıralama işlemi
Bu durumdasirala(dizi eleman_sayisi)
şeklinde bir ccedilağrı dizinin taban adresini fonksiyona geccedilirecektir siralarsquodaki ageccedilirilen dizinin yerel bir kopyası değildir a ldquodizisirdquonin uzunluğunun belirtilmemesindendizi iccedilin bir yer ayrılmadığını anlayabilirsiniz sirala fonksiyonu iccedilinde arsquoya yapılanbuumltuumln referanslar aslında dizirsquoye yapılmaktadır bundan dolayı değişiklikler de oradayapılmaktadır Bunun nedeni dizi ile ampdizi[0]rsquoın tamamen aynı şey olmasıdır Bu iyibir oumlzelliktir ccediluumlnkuuml aksi takdirde buumltuumln dizinin yerel bir diziye aktarılması gerekecektibu da hem bilgisayar zamanı hem de bellek harcayacaktı
Aslında parametre_bildirimlerinde ldquoint a[]rdquo ile ldquoint ardquo aynı şeydir yani abir goumlstergedir Oumlrneğin bir dizinin elemanlarını toplayan bir fonksiyonumuz var diyelimBunu şu şekilde tanımlayabiliriz
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 67
topla (int a[] int n) int s = 0 while (n--) s += a[n] return s
ve dizirsquonin bir tamsayı dizisi uzunlukrsquoun da toplanacak elemanların sayısı olduğu
topla(dizi uzunluk)
şeklinde bir ccedilağrı yapabiliriz dizi isminin bir goumlsterge olduğu bundan dolayıtoplarsquonın arsquoda elde ettiği şeyin bir goumlsterge olduğuna dikkat edin arsquonın ldquoint ardquoşeklinde bildirilmesi daha iyi olacaktı Aslında derleyici de aynı şeyi duumlşuumlnmekte vefonksiyon parametreleri iccedilin iki bildirimi tamamen eşdeğer kabul etmektedir Bunugoumlrmek iccedilin aşağıdakini karşılaştırın
topla (int a[] int n) int s = 0 while (n--) s += a++ return s
Atama deyiminde a++ (a++) anlamına gelir bu da (a)++rsquodan tamamen farklıdırccediluumlnkuuml bu sonuncusu dizinin ilk elemanını suumlrekli olarak artırmaya yarar yani a[0]++toplarsquonın bu yeni şeklinin ilk verilenle aynı işi yaptığını ancak daha verimli olduğunugoumlsterin
Ayrıca toplarsquoya dizinin taban adresi yerine başka bir adresin de verilebileceğiniakıldan ccedilıkarmayın Oumlrneğin
topla(ampdizi[2] uzunluk-2)
vetopla(dizi+2 uzunluk-2)
toplarsquonın dizinin uumlccediluumlncuuml elemanından başlayarak yani ilk iki elemanı atlayarak işlemiyapmasını sağlayan iki eşdeğer ccedilağrıdır
Bir fonksiyon parametresinin bildirimi yapılırken const tip niteleyicisi dekullanılabilir Bir dizinin fonksiyon goumlvdesi iccedilinde değiştirilmeyeceğini goumlstermesiaccedilısından dizi parametrelerinin bildirimlerinde yararlanılabilir
423 main Fonksiyonunun Parametreleri
main de bir fonksiyondur fakat ilk bakışta sanki herhangi biri onu ccedilağırıyor gibigoumlzuumlkmemektedir Bu doğru değildir ccediluumlnkuuml birisi onu gerccedilekten ccedilağırmaktadır İşletim
13
68 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
sistemi programı ccedilalıştırmak iccedilin onu yuumlkledikten sonra bir başlatma yordamı kontroluumleline alır bu da sonuccedilta main adında bir fonksiyonu ccedilağırırmdashbundan dolayı bu isimdebir tane fonksiyon bulunması gerekirmdashve ona uumlccedil tane arguumlman geccedilirir En sıkkullanılanlar ilk iki arguumlmandır bunlar da main fonksiyonunun komut satırıarguumlmanlarına ulaşmasını sağlar
mainrsquoin şu şekilde tanımlanmış olduğunu varsayın
include ltstdiohgtvoid main (int argc char argv[]) int i printf(Merhaba benim ismim sn argv[0]) printf(Argumanlarim sunlar) for (i=1 iltargc i++) printf( s argv[i]) printf(n)
Program derlenip bağlandıktan sonra işletilebilir bir dosya ortaya ccedilıkmış olacaktırBu dosyayı isminin arkasına isteğe bağlı olarak verilen birkaccedil arguumlman yazarakccedilalıştırırsınız Bizim sistemimizde DNMEXE adlı bir dosya oluştuğunu varsayalımAşağıdaki komut kullanılabilir
AgtDNM BIR IKI UC
Ccedilıktı ise şoumlyle olacaktırMerhaba benim ismim ADNMEXEArgumanlarim sunlar BIR IKI UC
mainrsquoin ilk parametresi (argc) bir sayıdır ve programı ccedilalıştırmak iccedilin verilenkomut satırındaki toplam isim sayısına eşittir Yukarıdaki denemede 4 idi Bir tanesiEXE dosya adı iccedilin 3 tanesi de onun arguumlmanları iccedilin mainrsquoin ikinci parametresi(argv) charrsquoa goumlstergelerden oluşan bir dizidir Yine main onun iccedilin yerayırmadığından dolayı uzunluğu belirtilmemiştir ldquochar rdquo bir karakter dizisinitanımlar Bu tipten olan bir değişken printfrsquoin kontrol karakter dizisindeki sdoumlnuumlşuumlm tanımlaması kullanılarak basılabilir argv bir karakter dizileri dizisidir veargv[0] argv[1] elemanları karakter dizilerini goumlsterir Boumlylece yukarıdakiprogram argvrsquonin elemanlarını karakter dizileri olarak basar
Şekil 41rsquodeki şema başlatma yordamının main iccedilin hazırladığı belleğin durumunugoumlsterir
13
BOumlLUumlM 4 FONKSİYONLAR 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
ŞEKİL 41 main fonksiyonuna geccedilirilen komut satırı arguumlmanları
mainrsquoin uumlccediluumlncuuml parametresi (envp) argvrsquoye benzer SET işletim sistemikomutuyla oluşturulan ortam karakter dizilerine goumlstergeler iccedileren bir dizidir Birprogram yazarak bunları bastırmaya ccedilalışın
43 Bellek Sınıfları
Değişken ve fonksiyonların bellek sınıfları onların yaşam suumlrelerini etki alanlarınısaklandıkları boumllgeleri ve ilklenme yolunu belirler C dilinde doumlrt tane bellek sınıfı vardırOtomatik yazmaccedil dural ve dışsal Aşağıda bunların herbiri detaylı olarakanlatılmaktadır Bu kısım değişik bellek sınıfından değişkenlerin ilklenmeleriyle ilgili biranlatımla sona ermektedir
Başlamadan oumlnce kuumlresel değişkenden ne kastettiğimizi accedilıklayalım
fonk_1 () fonk_1rsquoin goumlvdesi
double z
fonk_2 () fonk_2rsquonin goumlvdesi
main () mainrsquoin goumlvdesi
Yukarıdaki dosyada z kuumlresel bir değişkendir ve fonk_1 dışındaki buumltuumln fonksiyonlarsanki kendi blokları iccedilinde tanımlanmış gibi onu kullanabilirler (fonk_1 ve başkadosyalarda tanımlanan fonksiyonlar bu kısımda daha ileride goumlreceğimiz bir youmlntemlezrsquoye ulaşabilirler) Eğer daha ileriki bir blok iccedilinde z adı verilen başka bir değişkentanımlanırsa kuumlresel z değişkeni daha oumlnce accedilıklandığı şekilde geccedilici olarakldquounutulacaktırrdquo Şimdiye kadar goumlrmuumlş olduğumuz yerel değişkenler tanımlanmışoldukları blok sona erdiğinde tamamen yok olurlar Eğer aynı blok daha sonra tekrarbaşlarsa yerel değişkenlerin eski değerlerini almaları beklenemez Oumlte yandan kuumlreseldeğişkenler değerlerini program ccedilalıştığı suumlrece yitirmezler
13
70 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
431 auto Değişkenler
Şimdiye kadar karşılaşmış olduğumuz buumltuumln değişkenlerin bellek sınıfı otomatiktirOumlğrenmiş olduğunuz gibi otomatik değişkenler iccedilinde bulundukları blok yuumlruumltuumllduumlğuumlsuumlrece ldquoyaşarlarrdquo yani bloktan oumlnce veya sonra mevcut olmazlar Değişkenlerin otomatikbellek sınıfından olduğunu belirtmek iccedilin tanımlarından oumlnce auto anahtar soumlzcuumlğuumlnuumlyazabilirsiniz Oumlrneğin
auto int iauto char kar x
(Genelde bellek sınıfı belirten buumltuumln anahtar soumlzcuumlkler bu şekilde kullanılırlar tanımveya bildirimin oumlnuumlne yazılırlar) auto kullanmanın aslında gerccedilek bir anlamı yokturccediluumlnkuuml bloklar iccedilinde tanımlanmış değişkenler iccedilin bellek sınıfı belirtilmediği zamanotomatik oldukları varsayılır Yani Crsquonin bile gereksiz bir anahtar soumlzcuumlğuuml vardır
Doğal olarak kuumlresel değişkenler iccedilin auto kullanılamaz Ayrıca fonksiyonlar daotomatik olamaz Fonksiyon parametrelerinin de otomatik olduğu varsayılır ve değerlericcedilağıran fonksiyon tarafından ilklenir
432 register Değişkenler
register bellek sınıfı auto bellek sınıfı ile yakından ilgilidir Bu iki sınıf iccedilin etkialanı ve yaşam suumlresi kuralları aynıdır ve register tıpkı auto gibi fonksiyonlardışında anlamsızdır Eğer bir değişken register sınıfından tanımlanmışsa derleyicionu makinenin hızlı bellek yazmaccedillarına yerleştirmeye ccedilalışır Bu tuumlr yazmaccedillardan sınırlısayıda olduğu iccedilin sadece ilk birkaccedil register değişkeni gerccedilekten yazmaccedillardasaklanır diğerleri otomatik değişkenler gibi işlem goumlruumlrler Yani bir registerbildirimi derleyiciye sadece bir oumlneri oumlzelliği taşır Boumlylece eğer bir oumlnceki alt kısımdatanımlanmış değişkenlere gerccedilekten hızlı erişmeyi istiyorsak
register int iregister char kar x
yazarız
Ana bellekte depolanmayabilecekleri iccedilin register değişkenlerine tekli amp işleciuygulanamaz Ayrıca diziler gibi ldquokarmaşıkrdquo tipten bazı veriler register olamazlarancak bu sistemden sisteme değişebilir
register bellek sınıfından en iyi şekilde yararlanmak iccedilin sadece birkaccedil değişkenibu tipten tanımlamalısınız Bunlar en ccedilok kullanılanlar olmalıdır (Oumlrneğin doumlnguumlsayaccedilları) Muumlmkuumln olduğu kadar kullanıldıkları program koduna yakıntanımlanabilmeleri iccedilin de blok iccediline alın Fonksiyon parametreleri de register belleksınıfından tanımlanabilirler Bu boumlluumlmuumln sonundaki oumlrneğe bakınız
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 71
433 static Değişkenler Ve Fonksiyonlar
Kullanıldığı yere bağlı olarak static anahtar soumlzcuumlğuumlnuumln iki değişik anlamı vardırBlok iccedilinde static ldquokalıcırdquo anlamına gelir Yani blok iccedilinde değişkenlerintanımlarının oumlnuumlne static anahtar soumlzcuumlğuuml kullanılırsa bu değişkenlerin değerleri bloksona erdiğinde yok olmazlar Blok dışına ccedilıkıldığında değişkenler erişilmez hale gelirfakat blok tekrar işletilirse blok sona erdiği zamanki değerleriyle programınyuumlruumltuumllmesine katılırlar Diğer bir deyişle bu bağlamda static autorsquonun tersidirFonksiyon parametreleri olarak kullanılan değişkenler static olamaz Oumlrnek
void fark (void) static int deger int yeni_deger scanf(d ampyeni_deger) printf(Bu deger son seferden d birim farklidirn deger - yeni_deger) deger = yeni_deger
Bu fonksiyon girilen değerle daha oumlnce en son girilen değer arasındaki farkı yazarİlk ccedilağrıda eski değerin sıfır olduğunu varsayar (Buumltuumln static değişkenlerin sıfırailklendiği varsayılır) deger adı verilen değişken kontrol başka fonksiyonlara doumlnuumlptekrar buraya geldiğinde değerini suumlrduumlruumlr
Bir fonksiyon veya kuumlresel bir değişken tanımının oumlnuumlne yazıldığı zaman staticldquogizlirdquo anlamına gelir Yani bu fonksiyon veya değişken (ayrıca derlenmiş yadaderlenecek) başka dosyalara tamamen yabancı olacaktır diğer bir deyişle bu dosyalarstatic değişken veya fonksiyona erişemeyeceklerdir Bu kısmın başındaki oumlrnekte zve fonk_2rsquoyi static yapalım
fonk_1 () fonk_1rsquoin goumlvdesi
static double z
static fonk_2 () fonk_2rsquoin goumlvdesi
main () mainrsquoin goumlvdesi
Şimdi eğer isterlerse bu dosyadaki fonksiyonlar z ve fonk_2rsquoye erişebilirler ancakbaşka kaynak dosyalardaki fonksiyonlar iccedilin bu olanaksız olacaktır
13
72 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
434 Fonksiyonlar Ve extern Değişkenler
Daha oumlnce de bahsettiğimiz gibi kuumlresel bir değişkenin etki alanı normalde tanımlanmışolduğu kaynak dosyanın sonuna kadar olan kısımdır Ancak başka dosyalarda veya aynıdosyada fakat daha ileride tanımlanmış bulunan kuumlresel değişkenleri kullanmanın bir yoluvardır Anlamlı bir yerde extern anahtar soumlzcuumlğuumlnuuml ve arkasına değişkenin bildiriminiyazmanız gerekir Bundan sonra sanki orada değişkeni tanımlamışsınız gibi onuistediğiniz gibi kullanabilirsiniz Ancak diğer dosyalardan değişkenlere bu tuumlr bir erişimsağlamak iccedilin değişkenin oumlzguumln tanımının static olmaması gerekir
Yukarıda anlatılan youmlntemin kullanıldığı bir dosya topluluğunda static olmayanher kuumlresel değişkenin tam bir tane extern olmayan tanımı ve birtakım externbildirimleri vardır extern kullanılmamış (ldquooumlzguumlnrdquo) tanım değişken iccedilin bellekten birboumllgenin ayrıldığı tek yerdir Diğer bildirimler ise bu değişkenin tanımının başka biryerde bulunduğunu tipinin ise belirtildiği gibi olduğunu derleyiciye anlatmak iccedilindirDiğer bir deyişle extern bildirimi değişken iccedilin yer ayrılmasına neden olmaz
Doğal olarak bir değişkenin oumlzguumln tanımıyla extern bildirimlerinde farklı tiplerinbelirtilmesi istenmeyen şeylerin oluşmasına neden olabilir onun iccedilin dikkatli davranmakgerekir Eğer hem tanım hem de bildirim aynı dosyada ise derleyici hatayı bulabilecektirfakat eğer farklı dosyalarda ise hata bulunamayacaktır
Fonksiyonlar kendi dosyalarında daha yukarıda kalan boumlluumlmler veya (eğer staticdeğillerse) başka dosyalar tarafından kullanılabilirler Boumlyle bir durumda kullanılmadanoumlnce kullanıldığı bloğun (iccedilinde veya) dışında fonksiyonun bildirimi yapılmalıdır Boumlylebir bildirimde fonksiyonun doumlnuumlş tipi adı parantez iccediline alınarak virguumllle ayrılmışparametre tipleri ve noktalı virguumll bulunur Fonksiyonun bloğu yazılmaz Oumlrnek
include ltstdiohgt
double cikar(doubledouble) Bu fonksiyon daha ileride bir yerde tanimlanmaktadir
void main (void) double a a = 32 printf(fn cikar(a2))
double cikar (double x double y) return x-y
Yukarıdaki programda yazılan ldquodouble cikar(doubledouble)rdquo bildirimibaşka bir dosyada veya bu dosyanın daha ileriki boumlluumlmlerinde iki double arguumlman kabuleden ve doumlnuumlş tipi double olan cikar isminde bir fonksiyonun bulunduğunu ve bufonksiyon kullanılırken bu bilginin dikkate alınması gerektiğini derleyiciye anlatır Eğer
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 73
bu satır yazılmamış olsaydı derleyici cikarrsquoın gerccedilek tanımına ulaştığında biri int biride double olan iki cikar isminde fonksiyon bulunduğunu duumlşuumlnecek bu da buumlyuumlk birhata olacaktı Ayrıca bu bilgiyi kullanarak derleyici 2 tamsayı arguumlmanını fonksiyonageccedilirirken doublersquoa doumlnuumlştuumlruumlr
435 İlkleme
Bu altkısma başlamadan oumlnce gelin bellek sınıflarını bir daha goumlzden geccedilirelim Otomatiksınıfından olan değişkenler ait oldukları blokla beraber ortaya ccedilıkarlar ve sonra yokolurlar Yazmaccedil sınıfı değişkenler otomatikler gibidir sadece yazmaccedillarayerleştirilebilirler Dural (static) yerel değişkenler değerlerini asla yitirmezler oysaaynı sınıftan olan kuumlresel değişkenler ve fonksiyonlar kendi dosyalarında gizli kalırlarstatic olmayan kuumlresel değişkenler ve fonksiyonlar doumlrduumlncuuml ve son bellek sınıfınıoluştururlar bunlara dışsal adı verilir ve programın herhangi bir yerinden kullanılabilirler
Programcı tarafından aksi belirtilmediği suumlrece dışsal ve static bellek sınıfındanolan değişkenler sıfıra ilklenir auto ve register sınıfından olan değişkenlerin ilkdeğerleri belirsizdir
Bildiğiniz gibi tanım esnasında bir ilkleme yapmak iccedilin değişkenin arkasına =işaretini koyup (ccedilengelli parantez iccediline alarak veya almayarak) bir ifade yazarız Boumlyleifadeler iccedilin kurallar bellek sınıfına bağlı olarak değişir
Dışsal veya static değişkenler durumunda bu bir değişmez ifade olmalıdır veşimdiye kadar goumlrduumlğuumlmuumlz değişmez ifadelerden farklı olarak (adreslerini belirtmek iccedilin)dizi ve fonksiyon isimleri ve dışsal ile static değişkenler veya dizi elemanlarınauygulanan tekli amp işleciyle oluşturulmuş ifadeler de iccedilerebilir Buumltuumln bunların anlamıboumlyle bir ifadenin değerinin (a) bir adres artı veya eksi bir değişmez veya (b) sadece birdeğişmez olabileceğidir Oumlrnek
float t = (9009-8881)11
Eğer ilklenecek değişken auto veya register ise ilkleme ifadesi daha oumlncetanımlanmış soumlzcuumlkler iccedilerebilen her ccedileşit geccedilerli C ifadesi olabilir Oumlrnek
double v = xa()77 x ve a bu blok
icinde bilinmektedir bloğun geri kalanı
Gelin bu kuralların arkasındaki nedeni araştıralım
Dışsal ve static değişkenler derleme sırasında hesaplanabilecek ilkleme ifadeleriisterler ccediluumlnkuuml bu esnada ilklenmektedirler Program ccedilalışmaya başlamadan budeğişkenler ilk değerlerini almış olurlar Bunun iccedilin tanımında bir ilkleyeni olan yerel birstatic değişken bloğa her girişte değil de sadece bir defa ilklenir (bu da doğru birşeydir ccediluumlnkuuml static bir değişken boumlyle davranmalıdır)
13
74 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
Diğer taraftan derleyici bir auto veya register değişkeni iccedilin bir ilkleyengoumlrduumlğuumlnde bunu o bloğun tanım listesinden hemen sonra gelen ve ilgili değişkenlereatama yapan bir deyim gibi goumlruumlr Bu atamalar yuumlruumltme sırasında bloğun başınaulaşıldığı her sefer tekrarlanır Bundan dolayı auto ve register değişkenleri iccedilinilkleme ifadeleri ilgili değişken bir sol işlenen olarak bir atama deyiminde kullanıldığızaman sağ tarafta gelebilecek her tuumlr geccedilerli ifade olabilir Bu da diğer dillerderastlanması zor olan Crsquonin guumlzel oumlzelliklerinden biridir
Artık static olmayan değişkenlerin bir switch bloğunda ilklenmelerinin nedenanlamsız olduğu anlaşılıyor Her durumda kontrol bu ilklemelerin uumlstuumlnden geccediler
İlklenecek değişken bir dizi ise o zaman ne olur Artan indis sırasına goumlre ccedilengelliparantezler iccediline ve virguumllle ayırarak her dizi uumlyesinin değerini belirten ifadeler yazılırBu listede dizinin boyundan daha fazla sayıda ifadenin bulunması hata olur Fakat eğerdaha az sayıda ifade varsa kalan dizi elemanları sıfıra ilklenir Oumlrneğin
int g[5] = 1 -2 0 3
dizinin ilk doumlrt elemanına belirtilen değerleri atar beşinciye de sıfır yerleştirir
Dizi ilklenmesinde bazı kestirmeler soumlz konusu olabilir Eğer dizinin tanımlanmasıesnasında boyunu belirtmezseniz derleyici (mutlaka var olması gereken) ilkleme listesinebakar ve listedeki eleman sayısına eşit boyda bir dizi yaratır Oumlrneğin
float f[] = 22 03 999 11
doumlrt elemanlı bir dizinin ayrılmasını ve yukarıdaki değerlerle ilklenmesini sağlar
Karakter dizileri liste yerine değişmez 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ş olmasına rağmen derleyici tarafındanotomatik olarak eklenen boş karaktere dikkat edin Eğer boumlyle bir durumda dizininuzunluğu belirtilmiş olsa ve ilkleyen karakter dizisinin uzunluğuna (yukarıdaki oumlrnekte9rsquoa) eşit olsaydı bitirici boş karakter diziye dahil edilmeyecekti
Goumlstergeleri de ilkleyebilirsiniz Otomatik veya register goumlstergeler iccedilin ilkleyenherhangi bir geccedilerli goumlsterge ifadesi olabilir static veya dışsal goumlstergeler iccedilindeğişmez bir ifade olmalıdır Aşağıdaki oumlrnekte
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 75
define N 10test (int i) int a[N] ag = a+i static b[N] bg = ampb[N] bg1 = ampb[0]+i hata bg2 = a hata
ag ve bg iccedilin ilklemeler geccedilerlidir Fakat bg1 iccedilin ilkleme geccedilersizdir ccediluumlnkuuml i birdeğişmez değildir Ayrıca bg2rsquode de bir sorun vardır a otomatik bir dizidir temel adresiyuumlruumltme esnasında belirlenir oysa (agrsquoden farklı olarak) bg2rsquonin ilklemesi derlemeesnasında yapılır ancak bu durumda bu olanaksızdır
Dizilerle goumlstergeler arasında ilgi ccedilekici bir karşılaştırma aşağıda goumlruumllebilir
char const msj1[] = Sonraki lutfen char const msj2 = Sonraki lutfen
Hem msj1 hem de msj2 karakter goumlstergeleri olarak değerlendirilebilirler ve birccedilokbağlamda birbirinin yerine kullanılabilirler Fakat derleyici accedilısından bir farksoumlzkonusudur İlk tanımda dizi iccedilin 17 bayt kullanılır bu da msj1 dizisi iccedilin ayrılanbellek miktarıdır İkincisinde ise dizinin derleyici tarafından başka bir yerde saklanması(yine 17 bayt) ve bunun başlangıccedil adresinin msj2 iccedilin ayrılan yere (bizim sistemde 2bayt) depolanması sağlanır Yani ikinci tanım daha fazla yer kaplar Bu değişken birgoumlsterge iccedilin oumldememiz gereken bedeldir oysa programın yuumlruumltuumllmesi esnasında belki debu goumlstergenin değerini değiştirmeyeceğiz Bu tuumlr program değişmezleri iccedilin ilk seccedileneği(yani değişmez bir goumlstergeyi) kullanmamız daha akıllıca olacaktır
44 Oumlzccedilağrı
Şimdiye kadar başka fonksiyonlar ccedilağıran fonksiyonlara oumlrnekler vermiş bulunuyoruzPeki kendini ccedilağıran bir fonksiyona ne dersiniz Daha oumlnce boumlyle bir şey goumlrmeyenlericcedilin bu oldukccedila garip goumlzuumlkebilir Herşeyden oumlnce bir fonksiyon niye kendisini ccedilağırmakzorunda kalsın İkinci olarak sonsuz boumlyle oumlzccedilağrı sonucu ortaya ccedilıkacak bir doumlnguumldennasıl kaccedilınabiliriz Uumlccediluumlncuuml olarak da aynı fonksiyondan birden fazla kopyanın işlekdurumda olacağı iccedilin fonksiyonun yerel değişkenlerine ne olur
Kendini ccedilağıran fonksiyonlara oumlzccedilağrılı adı verilir Oumlzccedilağrılı bir fonksiyonun kendinidolaylı veya dolaysız olarak ccedilağırabileceğine dikkat edin İkinci durumda oumlrneğin fadında bir fonksiyonun g adında başka bir fonksiyonu ccedilağırması onun da frsquoyi tekrarccedilağırması soumlz konusudur Her durumda bir fonksiyonun bir oumlnceki etkinleştirmesi sonaermeden aynı fonksiyonun tekrar ccedilağrılması soumlzkonusudur Bundan dolayı oumlzccedilağrılıfonksiyonlar oumlzel işlem gerektirirler Oumlzccedilağrılı fonksiyonları desteklemek iccedilinderleyicinin oumlzel bir bellek duumlzeni kullanması oumlzccedilağrılı fonksiyonlar yazmak iccedilin iseprogramcının biraz farklı bir duumlşuumlnme tarzına sahip olması gerekir
13
76 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
Yine de oumlzccedilağrılı fonksiyonlar o kadar garip değildir ve bazı durumlarda eşdeğeroumlzccedilağrılı olmayan fonksiyon yerine oumlzccedilağrılı olanı kodlamak daha kolaydır İşte basit veklasik bir oumlrnek
Matematikte faktoumlriyelin () tanımı şoumlyledir
n = n times (n-1) middotmiddotmiddot 2 times 1
Bu tanım faktoumlriyel fonksiyonunun algoritmasını accedilıkccedila goumlsterir
fakt (int n) int i = 1 while (n) i = n-- return i
Faktoumlriyelin başka bir eşdeğer tanımı da şoumlyledir
0 = 1n = n times (n-1)
Bu bir oumlzccedilağrılı tanımdır Oumlzccedilağrılı bir fonksiyonun tanımının temel unsurları şunlardır
1 Fonksiyonun bazı arguumlmanlar iccedilin değerini veren bir temel (veya ldquoaksiyomlarrdquo veyaldquosınır koşullarırdquo) Yukarıdaki tanımda ilk deyim buna bir oumlrnektir
2 Bilinen değerlerden fonksiyonun başka değerlerinin nasıl elde edileceğini goumlsterenoumlzccedilağrılı yapı kuralı Bu da yukarıdaki oumlrneğin ikinci deyiminde goumlsterilmektedir
Oumlzccedilağrılı tanımın oumlzccedilağrılı yapı kuralının temel fonksiyon değerleri uumlzerinde sınırlısayıda uygulama sonucu sona eren bir youmlntem tarif ettiğine dikkat etmemiz gerekir Hernge0 iccedilin yukarıdaki tanımın doğru olduğu goumlsterilebilir Oumlrneğin
3 = 3 times 2 = 3 times (2 times 1) = 3 times (2 times (1 times 0)) = 3 times (2 times (1 times 1)) = 6
Bu kadar matematik yeter Şimdi de bilgisayarlı gerccedilek yaşama doumlnelim Faktoumlriyelfonksiyonunun oumlzccedilağrılı uyarlaması şoumlyledir
fakt (int n) return (n==0) 1 nfakt(n-1)
Bu da tamamen matematik dilinden bilgisayar diline bir ccedileviridir Koşullu işlece dikkatedin Arguumlmanın temel deyimin gereğine uyup uymadığı yani sıfır olup olmadığı kontroledilir Eğer oumlyle ise temel fonksiyon değeri yani 1 doumlnduumlruumlluumlr Aksi takdirde oumlzccedilağrılıyapı kuralı uygulanır Bu kural (3 oumlrneğinde olduğu gibi) sınırlı sayıda tekrarlanarakdoğru değer hesaplanır Boumlylece bu kısmın başında sorulan ikinci soruyu yanıtlamışbulunuyoruz Temel deyim sonsuz sayıda oumlzccedilağrıya engel olur
İlk soruya gelince Bu bir zevk ve verimlilik sorunudur Bazı programcılar faktrsquoınilk tanımını bazıları ise ikinci tanımını beğenebilir Ancak verimlilik programcılar iccedilin
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 77
oumlnemli (ve nesnel) bir parametredir Goumlreceğimiz gibi oumlzccedilağrılı tanımlar oumlzccedilağrılıolmayan (yani yinelemeli olan) tanımlardan daha az verimlidir Buna rağmen gerccedilekprogramlarda (oumlrneğin bir derleyicinin kendisinde) oumlzccedilağrılı fonksiyonlar kullanılırccediluumlnkuuml oumlzccedilağrılı bir tanım bazen daha zariftir ve anlaşılıp izlenmesi daha kolay olur
Son sorumuz oumlzccedilağrılı fonksiyonların nasıl ccedilalıştığı ile ilgili idi Aşağıdaki atamadeyiminin neyle sonuccedillanacağını izleyelim
f2 = fakt(2)
(faktrsquoın ikinci uyarlamasını kullanmaktayız) Aşağıda adım adım ne olduğuverilmektedir
fakt 2 arguumlmanıyla ccedilağrılır 0n = 2 1fakt n-1 (=1) arguumlmanıyla ccedilağrılır 1
n = 1 2fakt n-1 (=0) arguumlmanıyla ccedilağrılır 2
n = 0 3return 1 3
return n 1 (=1 times 1 = 1) 2return n 1 (= 2 times 1 = 2) 1
f2 = 2 0
Sağda yazılan sayılar fakt fonksiyonunun kaccedil tane işlek kopyasının bulunduğunugoumlsterir Uumlccediluumlncuuml seferki işleme esnasında n yerel değişkeninin (parametrenin) değeri0rsquodır daha sonra ikinci işlemeye doumlnduumlğuumlmuumlzde nrsquonin değeri fonksiyonun o işlemebaşladığı zamanki değer olur Bu oumlrnekten uumlccedil nrsquonin aslında farklı değişken olduğu ortayaccedilıkar
Bunu sağlamak iccedilin derleyici programa bir yığıt kullandırır Buumltuumln auto veregister değişkenleri yığıtta yer alır Yığıt bir bayt dizisi şeklinde bitişik bir bellekboumlluumlmuuml ve bununla birlikte bir yığıt goumlstergesi şeklinde duumlşuumlnuumllebilir Yığıt goumlstergesibaşlangıccedilta yığıtın başına işaret eder yığıtın geri kalanı serbest (yani boş) kabul edilirOumlzccedilağrılı olsun olmasın herhangi bir fonksiyona giriş yapıldığında o fonksiyonun(static ve dışsal olanlar hariccedil) yerel değişkenlerinin tamamını tutacak miktarda bayticcedilin yığıtta yer ayrılır yığıt goumlstergesi yığıtın geri kalan boşluğunun başını goumlstereceğişekilde ileriye goumltuumlruumlluumlr Fonksiyonun buumltuumln (ldquodinamikrdquo) yerel değişkenlerine yapılanreferanslar yığıtın ayrılmış bu kesimine yapılır Fonksiyon bitip geri doumlnduumlğuumlnde yereldeğişkenler yok olur ccediluumlnkuuml yığıt goumlstergesi fonksiyon ccedilağrılmadan oumlnce goumlsterdiği yeritekrar goumlsterecek şekilde geriye kaydırılır Eğer aynı fonksiyondan iki ccedilağrı yapılırsayerel değişkenler iccedilin iki defa yer ayrılır uumlccedil defa ccedilağrılırsa yığıtta yerel değişkenlerin uumlccedilkopyası yaratılır vs Aynı fonksiyona birden fazla ccedilağrı yapılmışsa yerel değişkenlerinsadece son kopyası erişilir olmaktadır Fonksiyon geri doumlnduumlğuumlnde eski değişkenler etkiliolmaya başlarlar vs Bir fonksiyon ccedilağrısı olduğu esnada yuumlruumltmenin suumlrduumlğuuml yer olandoumlnuumlş adresi de yığıta ldquoitilirrdquo Oumlzccedilağrılı fonksiyonları desteklemek iccedilin buumltuumln bunlargereklidir FORTRAN gibi bazı diller bunu yapmazlar bundan dolayı bu dillerde
13
78 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
oumlzccedilağrılı fonksiyonlara izin verilmez Diğer taraftan C ve Pascal gibi bazı diller oumlzccedilağrıyıdestekler
Oumlzccedilağrılı fonksiyonlar yığıttan ccedilok yer harcarlar Bir int değişkenin iki bayt doumlnuumlşadresinin de doumlrt bayt kapladığını varsayalım Bu durumda ldquofakt(i)rdquo şeklinde birccedilağrı yığıtta 6times(i+1) bayt kullanacaktır Oumlrneğin ldquofakt(6)rdquo iccedilin 42 baytagereksinimimiz olacaktır Diğer taraftan faktrsquoın yinelemeli (yani ilk verilen) uyarlamasıyığıttan 4 (doumlnuumlş adresi iccedilin) + 2 (n iccedilin) + 2 (i iccedilin) = 8 bayt kullanacaktır Oumlzccedilağrılıfonksiyonun bellek uumlzerinde daha fazla talepte bulunduğu accedilıktır Ayrıca yereldeğişkenlerin ve doumlnuumlş adresinin yığıta itilip geri alınması işlemci zamanı da harcar
Yinelemenin oumlzccedilağrıdan daha verimli olduğu sonucunu elde edebiliriz Verimliliktekibu farkın o kadar fazla olmadığı gerccedilek oumlrnekler de verebiliriz bundan dolayı eşdeğer biryinelemeli algoritma bulamadığınız zaman oumlzccedilağrı kullanmaya teredduumlt etmeyin
45 Fonksiyonlara Goumlstergeler
C dilinde tıpkı bir değişkenin adresi gibi bir fonksiyonun adresini de bir goumlstergedeğişkeninde depolayabilir veya başka bir fonksiyona arguumlman olarak geccedilirebiliriz Bukısımda diğer fonksiyonlara fonksiyon goumlstergelerini nasıl geccedilirebileceğimiz konusuylailgileneceğiz
Derleyici tarafından bir tanıtıcı soumlzcuumlğuumln bir fonksiyonu goumlsterdiği ya daha oumlnce birfonksiyon olarak tanımlandığı veya bildirimi yapıldığı iccedilin yada tanıtıcı soumlzcuumlğuumlnarkasında sol parantez olduğu iccedilin (yani bağlamdan) derleyici tarafından yapılan otomatikbildirim sonucu bilinir Eğer bu tanıtıcı soumlzcuumlk daha sonra bir parantezle birliktekullanılmazsa derleyici bu fonksiyonu ccedilağırmaya kalkmayacak onun yerine fonksiyonunadresini kullanacaktır (C dilinde sık yapılan bir yanlış ta arguumlmanı olmayan birfonksiyonu parantezleri belirtmeden ccedilağırmaya ccedilalışmaktır Yani
f()
yerinef
şeklinde bir deyim kullanmaktır İkinci deyim ldquofrdquo yerine fonksiyonun adresini koymadışında bir şey yapmayacaktır)
Bazı değerler ile bu değerler uumlzerinde uygulanacak herhangi bir fonksiyondan geridoumlnduumlruumllen değerlerin bir ccedilizelgesini ccedilıkaracak bir fonksiyon yazmak istediğimiziduumlşuumlnuumln Bu oumlrneğin bir sinuumls karekoumlk veya doğal logaritma ccedilizelgesi olabilir
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 79
include ltstdiohgtinclude ltfloathgt
void cizelge (double al double ul double art double (fg)(double) char fi) double x printf(n xts(x)nn fi) for (x = al x lt= ul x += art) printf(72ft72fn x (fg)(x))
Buradaki
double (fg)(double)
tanımına dikkat edin Bunun ne olduğunu anlamak iccedilin işleccedillerin uygulanış sırasını goumlzoumlnuumlnde tutmamız gerekir Bu bir double doumlnduumlruumlp arguumlmanı da double olanfonksiyona bir goumlstergedir İleride bir ifade iccedilinde ldquo(fg)()rdquo yazdığımızda boumlyle birfonksiyona ccedilağrı yapmış oluyoruz Şimdiye kadar incelediğimiz diğer goumlstergedeğişkenlerinin oumlrneğin int goumlstergelerinin hem tanım hem de kullanımındakibenzerliğe dikkat edin fg fonksiyona bir goumlstergedir (fg) ise fonksiyonun kendisidirGoumlsterge ifadesini ccedilevreleyen parantezler gereklidir ccediluumlnkuuml aksi takdirde
double fg(double)
ifadesi
double (fg(double))
anlamına gelecekti bu da double goumlsterge doumlnduumlren bir fonksiyon demektir ki bubildirim parametre tanımlarında kullanılamayacak ccedilok farklı bir şeydir Bunun nedenifgrsquoden sonra gelen parantezlerin rsquodan daha yuumlksek oumlnceliğe sahip bir işleccedil olmasıdır
Aşağıdaki program cizelge fonksiyonuna geccedilerli ccedilağrılar yapmaktadır
include ltmathhgt
void main (void) double sin(double) sqrt(double) log(double) cizelge(00 314 01 sin sin) cizelge(10 1000 10 sqrt kkok) cizelge(10 2718 005 log log)
Doumlrduumlncuuml arguumlmanın bir değişken değil de bir fonksiyon ismi olduğuna dikkat edinFonksiyon tarafımızdan tanımlanmış olabileceği gibi bir kuumltuumlphane fonksiyonu da olabilirBu noktada bu fonksiyona bir ccedilağrı soumlzkonusu değildir ccediluumlnkuuml arguumlmanlar verilmemiştirhatta parantezler bile yoktur Derleyici sin sqrt ve logrsquoun fonksiyon olduğunu bilirccediluumlnkuuml yukarıda bildirimleri yapılmıştır boumlylece bu fonksiyonların başlangıccedil adreslerinialıp cizelge fonksiyonuna geccedilirir Dizilerde olduğu gibi burada da adres alma (amp)
13
80 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
işlecini kullanmamıza gerek yoktur Eğer bir dizi isminin arkasında ldquo[]rdquo varsa o zamandizinin belirtilen elemanının değeri kullanılır aksi takdirde dizinin temel adresi kullanılırAynı şekilde bir fonksiyon isminden sonra eğer ldquo()rdquo varsa (ccedilağrı sonucu) fonksiyondandoumlnduumlruumllen değer kullanılır aksi takdirde ifadenin değeri olarak fonksiyonun başlangıccediladresi kullanılır
cizelge fonksiyonu ona geccedilirilen adresi kullanarak asıl ccedilağrıyı yaparcizelgersquoye geccedilirilen buumltuumln fonksiyonların ldquobenzerrdquo olması gerekir yani aynı sayıda vetipte arguumlman kabul edip aynı tipi doumlnduumlrmelidirler Parametrenin tanımlanması esnasındabuumltuumln bunlar belirtilir main iccedilinde verilen fonksiyon bildirimleri gerekli değildir ccediluumlnkuumlinclude edilen standart başlık dosyası mathhrsquode bu bildirimler zaten mevcuttur
46 Bir Oumlrnekmdash8 Vezir Problemi
Bu kısımda fonksiyonlar bitsel işleccediller kuumlresel değişkenler register bellek sınıfı veoumlzccedilağrı gibi kavramları kullanan oumlrnek bir program vereceğiz
Bu program bize klasikleşmiş bir problemin ccediloumlzuumlmlerini bulacaktır 8 ccedilarpı 8rsquolik birsatranccedil tahtasına birbirini almayacak şekilde 8 vezirin yerleştirilmesi İki vezir aynı sırasuumltun veya ccedilaprazda olduğunda birbirini alabilir Yani bir ccediloumlzuumlmde aynı sıra suumltun veyaccedilapraz hatta iki vezir bulunmamalıdır Oumlrneğin
middot middot middot middot middot middot middot V
middot middot middot V middot middot middot middot
V middot middot middot middot middot middot middot
middot middot V middot middot middot middot middot
middot middot middot middot middot V middot middot
middot V middot middot middot middot middot middot
middot middot middot middot middot middot V middot
middot middot middot middot V middot middot middot
bir ccediloumlzuumlmduumlr Burada ldquoVrdquo bir veziri ldquomiddotrdquo ise boş bir kareyi goumlsterir
Bu problemi ccediloumlzmede ilk yaklaşım sistemli bir şekilde tuumlm yerleştirmeleri inceleyipsadece geccedilerli olanları listelemektir Bir bilgisayarımız olduğuna goumlre bunu ccedilabuk birşekilde yapabiliriz Aslında o kadar da değil Olası tuumlm değişik yerleştirmelerin sayısı
(8 times 8)(8 times 8 - 8) times 8 = 4426165368rsquodir
Her yerleştirme iccedilin bir milisaniye harcasak bile hepsini teker teker denemek elliguumlnden daha uzun bir suumlre alacaktır Araştırma boumllgemizi daraltmamız gerekir Aşağıdakigoumlzlemler yararlı olacaktır
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 81
1 Eğer iki veziri yerleştirdiğimizde bunların birbirini aldığını goumlruumlrsek diğerlerini dedikkate alan buumltuumln olası yerleştirmeleri denememize gerek yoktur Bu buumltuumln vezirlerisatranccedil tahtasına yerleştirdikten sonra değil bir vezir yerleştirir yerleştirmezuyuşmazlıkları kontrol etmemiz gerektiği anlamına gelir
2 Aynı sıraya iki vezir yerleştirmeye ccedilalışmamalıyız Her veziri bir sıraya ldquoatayarakrdquobunu gerccedilekleştirebiliriz Her vezir sadece kendi sırasındaki 8 kareden birisineyerleştirilecektir
Bu iki goumlzlem araştırma boumllgemizi ccedilok daraltacaktır Algoritma şoumlyledir
bull En uumlst sıradan başlayarak her veziri kendi sırasına en sağdaki suumltundan itibarenyerleştirin
bull Bir vezir yerleştirdiğinizde daha oumlnce yerleştirilmiş vezirlerle bir uyuşmazlığın olupolmadığını kontrol edin Eğer varsa veziri bir sonraki (yani hemen solundaki) kareyekaydırın eğer yoksa bir sonraki (yani hemen altındaki) sırayı değerlendirin Eğer sonvezir de başarılı bir şekilde yerleştirilirse bu bir ccediloumlzuumlmduumlr
bull Eğer bir vezir sırasındaki sekizinci suumltunu da geccedilerse o zaman veziri satranccediltahtasından alın bir oumlnceki sıraya geriye doumlnuumlş yapın ve bu sıradaki veziri bir sonraki(yani hemen solundaki) kareye kaydırın
bull İlk sıradaki vezir son suumltundaki kareden dışarı ccedilıkıncaya kadar buna devam edin
Algoritmayı belirledikten sonra bu sefer işlenecek bilgiyi saklayacak veri yapısı iccedilinkarar vermemiz gerekecektir Verimlilik en oumlnemli tasamız olmalıdır Veri yapısı fazlamiktarda bilgisayar belleği harcamamalı ve kolay hızlı erişim sağlamalıdır
Satranccedil tahtasını nasıl goumlstermemiz gerekir En azından iki seccedilenek soumlzkonusudur
1 Her kare bir bitle goumlsterilebilir Eğer bit 1 ise bu karede bir vezir var 0 ise boşdemektir Boumlylece mantıksal olarak 8rsquoe 8rsquolik bir kare şeklinde duumlzenlenmiş 64 bitegereksinimimiz vardır
2 Her sırada en fazla bir vezir olduğuna goumlre her elemanında o sıradaki vezirtarafından işgal edilen suumltun sayısının saklandığı doğrusal bir dizi tutabiliriz
Bu oumlrnekte ilk seccedileneği kullanacağız Her sıra 8 bite gereksinim duyar Birccedilokbilgisayarda bir int değişken en az 16 bittir Boumlylece iki sıra tek bir int değişkeniniccedilinde saklanabilir Ama her sıra iccedilin bir tamsayı ayırıp sadece sağdaki (duumlşuumlk) bitlerinkullanılması daha kolay olacaktır Soldaki bitler ise kullanılmayabilir Ayrıca programıdaha genel bir problem (yani n ccedilarpı nrsquolik bir satranccedil tahtasına n adet vezirinyerleştirilmesi) iccedilin tasarlarsak aynı programı kullanarak oumlrneğin 15 vezir problemini deccediloumlzebiliriz
Programda kullanılan veri yapısı (aşağıdaki program listesine bakın) şoumlyledirint tahta[8]
(Bu arada int unsigned olarak define edilmiştir boumlylece sağa kaydırmaişlemlerinin aritmetik yani işaret doldurma değil de mantıksal yani sıfır doldurma
13
82 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
olması temin edilmiştir) tahta ve sayi kuumlresel değişkenler olarak tanımlanmışlardırboumlylece buumltuumln fonksiyonlar bunlara erişebilir tahta[0] satranccedil tahtasının en uumlsttekisırasını tahta[7] ise en alttaki sırayı goumlsterir Bir dizi elemanının en duumlşuumlk (yanisağdaki) biti sıranın en sağdaki suumltununu goumlsterir Altıncı sıranın en sağındaki suumltununabir vezir koymak istediğimizde
tahta[5] = 1
atama deyimini bu veziri bir sola kaydırmak istediğimizdetahta[5] ltlt= 1
atama deyimini en soldaki suumltundan ileriye bir vezir geccedilip geccedilmediğini anlamak iccedilintahta[sira] gt= 1ltlt8
testini iki farklı sıradaki iki vezirin aynı suumltunda olup olmadığını anlamak iccedilintahta[sira2] == tahta[sira1]
testini aynı ccedilapraz hatta olup olmadığını anlamak iccedilintahta[sira2] == tahta[sira1]ltltsira1-sira2 || tahta[sira2] == tahta[sira1]gtgtsira1-sira2
testini kullanabiliriz Yukarıdaki testleri kullanarak tahtaTamam fonksiyonunutasarlayabiliriz Bu fonksiyon sirarsquoya yeni bir vezir yerleştirildiğinde tahtanın tamamolup olmadığını kontrol eder Bunu yapmak iccedilin 0rsquodan sirarsquoya kadar (sira hariccedil) olanbuumltuumln sıralarla sira arasındaki uyuşmazlıkları kontrol eder Eğer sira 0 ise o zamanfor doumlnguumlsuumlne hiccedil girilmeyecek tahtaTamam fonksiyonu hemen 1 (doğru)doumlnduumlrecektir İlk sıra iccedilin satranccedil tahtası her zaman ldquotamamrdquodır
Bir ccediloumlzuumlm bulunduğunda cozumyaz fonksiyonu ccedilağrılır sayi (ccediloumlzuumlm sayısı)değişkeni bir artırılır ve tahtarsquodaki ccediloumlzuumlm yazılır Dış doumlnguuml sıralar iccedil doumlnguuml desuumltunlar iccedilindir
Programın kalbi yerlestir fonksiyonudur Algoritmadan da tahminedebileceğiniz gibi bu oumlzccedilağrılı bir fonksiyon olarak tanımlanabilir Bu fonksiyon başta0 (ilk sıra) arguumlmanıyla ana programdan ccedilağrılır for doumlnguumlsuuml belirtilen sirarsquonın hersuumltununa veziri yerleştirir Her yerleştirmeden sonra tahta kontrol edilir eğer tamamsabu sira iccedilin yerleştirme işlemi geccedilici olarak bekletilir ve bir sonraki sira denenir Birsonraki sirarsquoyı kim deneyecektir Tabii ki aynı fonksiyon Sonsuz oumlzccedilağrılara engelolmak iccedilin fonksiyonun başında bir test yapılır Eğer yerlestir 8 arguumlmanıylaccedilağrılmışsa bu satranccedil tahtasına (başarılı bir şekilde) 8 vezirin yerleştirildiği anlamınagelir Bu durumda yerlestir fonksiyonu ccediloumlzuumlmuuml yazdırır ve hemen doumlneryerlestir fonksiyonunun her yeni ccedilağrısında sira adı verilen yeni bir (yerel)değişken yaratılır Bir oumlnceki ccedilağrıya geri doumlnduumlğuumlmuumlzde bir oumlnceki sira değişkenitekrar geri gelir değeri ise bir eksiği olur
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 83
1 include ltstdiohgt2 define VEZIRLER 8 vezir sayisi ve tahta boyu 3 define int unsigned isaretsiz tamsayi kullan 45 int sayi = 0 cozum sayisi 6 int tahta [VEZIRLER] her eleman bir sirayi gosterir 78 int tahtaTamam tahtanin gecerliligini kontrol et 9 (register int sira)10 11 register int r1213 for (r = 0 r lt sira r++) onceki tum siralari kontrol et 14 if (tahta[sira] == tahta[r] ||15 tahta[sira] == tahta[r] ltlt sira-r ||16 tahta[sira] == tahta[r] gtgt sira-r)17 return 0 uyusmazlik varsa 18 return 1 uyusmazlik yoksa 19 2021 void cozumyaz (void) cozumu goster sayiyi artir 22 23 register int t r2425 printf(nntCOZUM unn ++sayi)26 for (r = 0 r lt VEZIRLER r++) sira 27 for (t = 1ltltVEZIRLER-1 t gt 0 t gtgt= 1)28 printf( c tahta[r] == t V )29 printf(n)30 31 3233 void yerlestir (int sira) bir sonraki siraya yerlestir 34 35 if (sira == VEZIRLER) tum siralar dolu ve kontrol edilmis 36 cozumyaz()37 else38 for (tahta[sira]=1 tahta[sira]lt1ltltVEZIRLER tahta[sira]ltlt=1)39 if (tahtaTamam(sira))40 yerlestir(sira+1) bir sonraki sirayi dene 41 4243 void main (void)44 45 yerlestir(0) ilk siradan basla 46 printf(nnd vezir probleminin u cozumu vardirn47 VEZIRLER sayi)48
Bu oumlrnekte oumlzccedilağrı adımı yerine bir doumlnguuml ve sira değişkeninin uygun şekildeartırılıp azaltılması kullanılabilir
Aşağıda VEZIRLER değişmezine değişik değerler verildiğinde yukarıdaki programlaelde edilen sonuccedilları goumlruumlyorsunuz
13
84 FONKSİYONLAR VE PROGRAM YAPISI BOumlLUumlM 4
VEZIRLER Ccediloumlzuumlm sayısı1 12 03 04 25 106 47 408 929 352
10 72411 2 68012 14 20013 73 71214 365 59615 2 279 184
Problemler
1 Altkısım 421rsquoin sonundaki printf deyiminin ccedilıktısı
4 = 24
şeklinde olur Bir an iccedilin faktrsquoın sayi değişkeninin değerini gerccedilektendeğiştirdiğini varsayın bu durumda da ccedilıktının aynı olacağını soumlyleyebilir miyiz
2 C dilinde bir fonksiyon ccedilağrısı esnasında verilen arguumlmanların sayı ve tipininbildirimdeki ile aynı olmasına gerek yoktur Ancak ccedilok gerekmedikccedile bu oumlzelliğikullanmak iyi değildir printf kuumltuumlphane fonksiyonu buna bir oumlrnektir Buradasizden (sayısı belli olmayan) arguumlmanların enbuumlyuumlğuumlnuuml doumlnduumlren maks adında birfonksiyon yazmanızı istiyoruz Listenin sonunu belirtmek iccedilin ccedilağrıdaki son arguumlmanher zaman sıfır olacaktır Oumlrnekler maks(15-622157430)==57maks(0)==0 maks(-100)==-10 İpucu Microsoft C derleyicisinde (vemuhtemelen diğer birccedilok C derleyicilerinde) arguumlmanlar bellekte arka arkaya olanyerlerde geccedilirilirler yani ikinci arguumlman ilk arguumlmanın hemen arkasında saklanır vsYazacağınız fonksiyonun tanımında tek bir parametre belirtmeniz yeterli olacaktırArkadan gelen arguumlmanları adres alma ve dolaylama işleccedillerini kullanarak eldeedebilirsiniz Bu fonksiyonun taşınabilir olmadığına dikkat edin
3 Sistemimizde
13
BOumlLUumlM 4 FONKSİYONLAR VE PROGRAM YAPISI 85
include ltstdiohgtvoid main (void) int y = 1993 int i printf(dn i)
programı1993
yazar Bunu accedilıklayabilir misiniz
4 Sistemimizdeinclude ltstdiohgtvoid main (void) int a1=111 a2=222 a3=333 a4=444 register r1 r2 r3 r4 printf(d d d dn r1 r2 r3 r4)
programı131 3982 333 444
yazar Bu size register değişken tanımı konusunda neyi duumlşuumlnduumlruumlr r3değişkeni bir yazmaccedilta mı saklanmaktadır
5 Boumlluumlm 0rsquoın başında verilen programın ne yaptığını anlatın
6 Bir oumlnceki boumlluumlmde anlatılan ve C kuumltuumlphanesinde bulunan strcpy strcmpstrcat ve strlen fonksiyonlarının işlevsel benzerlerini yazın
7 8 vezir programını yerlestir oumlzccedilağrılı fonksiyonu iccedilindeki sira değişkenininkuumlresel bir değişken olacağı şekilde tekrar duumlzenleyin Şimdi program daha az yığıtyeri kullanacaktır
8 8 vezir programını oumlzccedilağrılı olmayana (yani yinelemeli olana) ccedilevirin
13
13
87
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLERVE VERİ YAPILARI
C dilinin yapısı iccedilinde var olan veri tipleri arasında int float double char gibibasit tipler diziler goumlstergeler sayım tipleri yapılar ve birlikler bulunmaktadır Veritipleri oumlzccedilağrılı bir şekilde tanımlanabilirler yani dizilerden oluşan diziler yapılar iccedilerenyapılar goumlstergelere goumlstergeler vs soumlzkonusu olabilir Boumlylece gerccedilektetanımlanabilecek veri tipleri sonsuz sayıdadır
Bu boumlluumlmde yeni veri tiplerini ve var olan veri tiplerinden nasıl yeni tiplertanımlayacağımızı goumlreceğiz Şimdiye kadar goumlstergeler ve dizileri tanımış olduk ancaksayım tipleri yapılar ve birlikler nedir Gelin bunları tek tek inceleyelim
51 Sayım Tipleri
C dilindeki temel veri tipleri arasında basamaklı sayı tipleri vardır (işaretli veya işaretsizccedileşitli boylarda tamsayılar) Buumltuumln basamaklı tipler sınırlı ve doğrusal olarak sıralanmışbir değerler kuumlmesi oluştururlar C dili tarafından sağlananlar dışında kullanıcının kendibasamaklı sayı tiplerini tanımlama olanağı vardır bunlara sayım (veya sayılı) tipler denirBoumlyle bir tipin tanımı sırasıyla buumltuumln olası değerleri belirtir Bunlar tanıtıcı soumlzcuumlklerletemsil edilir ve yeni tipin değişmezleri olurlar
Sayım tiplerini tanımlamanın genel soumlzdizimi aşağıda verilmiştir
enum tanıtıcı_soumlzcuumlkopt sayım_listesi opt bild_belirteccedilleriopt
Tanıtıcı_soumlzcuumlkrsquoe sayım kuumlnyesi denir ve tanımlanmakta olan tipe verilen isteğe bağlıbir isimdir Daha ileride aynı tipten başka değişken veya fonksiyon tanımlamalarıyapmak gerekirse bu isim kullanılabilir
13
88 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 5
Sayım_listesi virguumllle ayrılmış tanıtıcı soumlzcuumlklerden oluşan bir listedir Bunlara sayıcıadı verilir
Bild_belirteccedilleri olası ilkleyenlerle izlenen değişkenlerden oluşan bir listedir
Birkaccedil oumlrnek
enum islecler arti eksi carpi bolu isl1 = arti isl2 = carpi islxenum gunler pa pt sa ca pe cu ct enum gunler ilk_gun = pa bir_gun son_gun = ctenum erkek kadin cinsiyetim = erkek cinsiyetler[MAKSK]
İlk oumlrnekte ldquoenum isleclerrdquo tipini ve bu tipten isl1 isl2 islxdeğişkenlerini tanımlamaktayız Bu değişkenler herhangi bir zamanda arti eksicarpi ve bolu değerlerinin sadece bir tanesini alabilirler Ayrıca isl1 ve isl2değişkenleri sırasıyla arti ve carpi değerleriyle ilklenirler İlkleme işlemi tamsayıdeğişken ilklemesine ccedilok benzer kuralları da aynıdır Uumlccediluumlncuuml değişken islxilklenmemiştir fakat tıpkı diğer değişkenler gibi yuumlruumltme esnasında buna dayukarıdakilerden bir değer atanabilir
İkinci ve uumlccediluumlncuuml satırlarda da buna benzer bir tanımlama yapılmakta ancak bu seferiki adımda olmaktadır Oumlnce ldquoenum gunlerrdquo tipini tanımlıyoruzmdashhenuumlz değişkentanımı yokmdashsonra da ilk_gun gibi değişkenleri bu tipten tanımlıyoruz
Doumlrduumlncuuml satırda kuumlnyeyi atlamış bulunuyoruz boumlylece bundan sonra bu tipten yenideğişken veya fonksiyon tanımlamak istesek sayım_listesini tekrar belirtmek zorundakalacağız Bu oumlrnekte ayrıca sayım tipinden elemanlardan oluşmuş bir dizi tanımlamasınıda goumlrmekteyiz
Bu tanımlardan sonra değişkenleri aşağıdaki gibi deyimlerde kullanabilirizcinsiyetim = kadinbir_gun = caislx = isl1if (isl1==bolu) while (bir_gun=ct) printf(d d dn cinsiyetim bolu son_gun)
cinsiyetim değişkeninin kadin son_gunrsquouumln de ct olduğunu varsayarsak sondeyim
1 3 6
yazacaktır Bunun nedeni sayım tipinden olan değişkenlerin aslında tamsayı değerlerisakladıkları ve değişmezlerin de aslında tamsayı olduklarıdır Oumlrneğin arti pa veerkekrsquoin değerleri 0rsquodır eksi 1 carpi 2 bolu 3rsquotuumlr Normalde sayımdeğişmezlerine sıfırdan başlayarak sırayla değerler verilir ancak C dilinde programcınınistediği değişmez tamsayıyı bir sayıcıya vermesine izin verilir Bundan sonra gelensayıcılar da sonraki değerleri alırlar Oumlrneğin
13
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI 89
enum renk siyah mavi yesil kirmizi=4 sari=14 beyaz
Burada siyahrsquoın değeri 0 mavirsquonin 1 yesilrsquoin 2 ve beyazrsquoın 15rsquotir Bir enumtanımında iki sayıcı aynı değeri alacak şekilde tanımlanabilirler Bir sayıcı eksi bir değeresahip olabilir
Sayım tipinden olan değişkenler fonksiyonlara arguumlman olarak geccedilirilebilir ve birfonksiyonun doumlnuumlş tipi sayım tipinden olabilir Buna oumlrnek bir fonksiyon aşağıdaverilmiştir
enum gunler gun_ekle (enum gunler g int n) return (enum gunler) (((int) g + n) 7)
Bu fonksiyon bir guumln kabul edip n guumln sonraki guumlnuuml verir
bir_gun = gun_ekle(pe 31)
şeklindeki bir ccedilağrı bir_gunrsquoe pa atayacaktır Sayım tiplerini kalıplarda dakullanabileceğimize dikkat ediniz Bu oumlrnekte iki tane kalıp kullanmaktayız Bir tanesihesap yapmak iccedilin guumlnuuml tamsayıya doumlnuumlştuumlrmede diğeri de sonucu tekrarldquoenum gunlerrdquo tipine doumlnuumlştuumlrmede kullanılır
Sistemimizde sayım tiplerinden olan değişkenlerin tamsayı olduğunuduumlşuumlnebilirsiniz oumlrneğin enum değerlerinin girdi ve ccedilıktısını tamsayı biccedilimindeyapabilirsiniz Tıpkı int değişkenleri gibi sayıcıların (ve sonuccedilta sayım tipinden olandeğişkenlerin) alacakları değerler 16 bit iccedilinde kalmalıdır
52 Yapılar
Yapılar ve birlikler C programları iccedilin karmaşık veri yapılarının tanımlanmasında anahtarroluuml oynarlar Bu kısımda yapılar anlatılmaktadır Daha sonraki bir kısım ise birliklerikapsamaktadır
Pascalrsquola tanışıklığı olan okuyucularımız herhalde C dilindeki yapıların Pascalrsquodakirecordrsquolara karşılık olduğunu fark edeceklerdir Aynı tipte belirli sayıdaki değişkenlerisaklamak iccedilin bir dizi kullanılabilir Diğer taraftan bir yapı genelde değişik tipte olan birveya daha fazla değişkeni toplamak iccedilin kullanılabilir Niye ayrı ayrı değişkenlerkullanmak yerine bunları bir yapı iccedilinde toplamaya gerek duyarız Temel nedenkolaylıktır Oumlrneğin bir fonksiyona ccedilok sayıda arguumlman geccedilirmek yerine bazılarınıyapılar iccedilinde gruplayıp yapıları geccedilirebiliriz
Şimdi yapıları nasıl tanımlayabileceğimizi ve kullanacağımızı goumlrelim Yapıtanımlamasının genel şekli şoumlyledir
struct tanıtıcı_soumlzcuumlkopt yapı_bild_listesi opt bild_belirteccedilleriopt
13
90 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 5
struct anahtar soumlzcuumlğuuml bir yapının tanımlanmakta olduğunu goumlstermektedir Herzaman olduğu gibi tanımlanmakta olan değişken(ler)in bellek sınıfını goumlstermek iccedilin buanahtar soumlzcuumlğuumln oumlnuumlne uygun herhangi bir bellek sınıfı belirteci (oumlrneğin staticextern) konulabilir
İsteğe bağlı olan tanıtıcı_soumlzcuumlkrsquoe yapı kuumlnyesi adı verilir Tanımlanmakta olan yapıtipine isim verir ve daha sonra benzer yapı değişkenleri tanımlamak iccedilin bir kısaltmaişlevi goumlruumlr Eğer bu yapı tipi buumltuumln program iccedilinde bir defa kullanılıyorsa daha sonrakullanılmayacağı iccedilin yapı kuumlnyesini atlayabiliriz
Yapı_bild_listesi her bildirimin bir noktalı virguumllle bitirildiği bir dizi bildirim iccedilerirBu bildirimler (ilkleyen iccedilerememeleri dışında) normal değişken tanımlamalarına benzerfakat bu durumda değişkenler bildirimi yapılan yapı altında gruplanacaklar ve yapınınuumlyeleri olacaklardır Bir yapının uumlyeleri diziler veya yapılar gibi karmaşık tiplerolabileceği iccedilin C dilinde istediğimiz kadar karmaşık veri yapıları tanımlayabiliriz
Bild_belirteccedilleri belirtilen yapı tipinden değişkenler tanımlayan isteğe bağlı birlistedir Bunlar basit (yapı) değişkenleri yapılara goumlstergeler yapılardan oluşan dizileryapı doumlnduumlren fonksiyonlar veya bunların herhangi bir birleşimi olabilir
Bir oumlrnek
struct yk int i float f yd
Burada yk yapı kuumlnyesini ve ldquostruct ykrdquo tipinden yd değişkenini tanımlamışbulunuyoruz ldquostruct ykrdquo tipi iki uumlye iccedilerir bir tamsayı bir de gerccedilek sayı yk yapıkuumlnyesi daha sonra aynı tipten başka değişkenlerin bildirimini yapmak iccedilin kullanılabilirOumlrneğin
struct yk yd1 yg
(ydrsquoye benzeyen) bir yd1 değişkenini ve ldquostruct ykrdquo tipindeki bir yapının saklandığıbir yere bir goumlsterge tanımlayacaktır
Gelin birkaccedil oumlrneğe daha bakalım Bu kısmın başında verilen soumlzdizimde uumlccedil taneisteğe bağlı boumlluumlm goumlrmekteyiz Herhangi bir zamanda bunlardan en ccedilok bir tanesibelirtilmeyebilir Boumlylece
struct int i float f yd2
tanımlamasında bir yapı değişkeni yd2 tanımlanmakta fakat yapı kuumlnyesitanımlanmamaktadır
struct yk int i float f
tanımlamasında ise bir yapı kuumlnyesi yk tanımlanmakta fakat değişken tanımlamalarıbulunmamaktadır yani sadece bir tip bildirimi vardır Daha sonra bu ismi kullanarakaşağıda yapıldığı gibi değişkenler tanımlayabiliriz
struct yk ydz[5] yf(float) (ydgf(int))[8]
Burada yapı_bild_listesirsquoni tekrar belirtmeye gerek yoktur ydz boumlyle 5 tane yapıdanoluşan bir dizidir yf bir float arguumlman alan ve boumlyle bir yapı doumlnduumlren bir
13
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI 91
fonksiyondur (bazı eski derleyiciler boumlyle bir bildirimi kabul etmeyebilirler ccediluumlnkuuml eskildquoStandardardquo goumlre fonksiyonlar dizi veya yapı gibi ldquokarmaşıkrdquo tipler doumlnduumlrmezler)ydgf boumlyle 8 yapıdan oluşan bir diziye bir goumlsterge doumlnduumlren ve bir int arguumlman alanbir fonksiyondur Son oumlrneği anlamak iccedilin işleccedilleri uygulandıkları sırayı dikkate alarak(tersten) okuyun () [] yani yapı dizisi goumlstergesi fonksiyonu
Şimdi de daha karmaşık bir oumlrnek
struct kisi char isim int dogumtarihi enum cinsiyet_tipi erkek kadin cinsiyet struct kisi baba ana es cocuklar[MAKSCCK] kisiler[MAKSKS]
Yukarıdaki tanımda goumlrduumlğuumlnuumlz kadarıyla tıpkı diğer dillerde olduğu gibi C dilinde deldquokarmaşıkrdquo veri yapıları tanımlanabilir Burada basit değişkenler goumlstergeler sayımtipinden değişkenler yapılara goumlstergelerden oluşan diziler vs olan uumlyeleri iccedileren biryapı dizisi goumlrmekteyiz Yapının bazı uumlyelerini tanımlarken yapının kendi tanımını dakullanmakta olduğumuza dikkat edin tanımlamakta olduğumuz uumlyeler goumlsterge olduklarıiccedilin bu herhangi bir problem oluşturmaz Aslında goumlsterge tanımlarken daha ileridetanımlanmış yapıları da kullanabiliriz Yukarıda tanımlanan kisiler değişkeni kolaycaerişilip işlenebilen en fazla MAKSKS kadar kişinin bilgisini saklayabilir
Bir yapının uumlyelerine ulaşmak iccedilin bir nokta (ldquordquo) ile goumlsterilen yapı uumlyesi işlecinikullanırız Bu işleccedil yapı değişkeni ile uumlyesi arasına konur Oumlrneğin
ydi = (int) ydf
yd yapı değişkeninin f uumlyesi iccedilindeki tamsayıyı i uumlyesine atayacaktır ldquordquo işleci enyuumlksek oumlnceliği olan işleccedillerden biridir boumlylece oumlrneğin ydi genelde sanki tek birdeğişkenmiş gibi etrafına parantez koymaya gerek duymadan kullanılabilir
Şimdi bir yapı goumlstergesi değişkeninin uumlyesine erişirken karşılaşabileceğimiz kuumlccediluumlkbir problemi inceleyelim Oumlrneğin yg bir yapıya bir goumlstergedir yg yapıya erişmek iccedilinkullanılır ancak onun uumlyesine erişmek iccedilin ygi kullanılamaz Bunun nedenioumlnceliklerdir ldquordquonin oumlnceliği rsquodan yuumlksektir boumlylece ygi aslında (ygi)anlamına gelir bu da ygrsquonin bir uumlyesi olan irsquonin bir goumlsterge olduğunu varsayar Doğrusonucu elde etmek iccedilin parantez kullanmak zorundayız (yg)i Ancak bu da sıkıntılıolabilir Bunun uumlstesinden gelmek iccedilin Crsquoye başka bir işleccedil (-gt) eklenmiştir yg-gtitamamen (yg)i ile eşdeğerdir ve daha kısa ve anlamlıdır
Doumlrt işleccedil () [] ve -gt oumlncelik tablosunda en yuumlksek duumlzeyi oluştururlar vereferans oluşturmak iccedilin kullanıldıklarından diğer işleccedillerden farklıdırlar
Bazı eski C uygulamalarında yapılarla yapabileceğimiz şeyler amp kullanarak biryapının adresini almak ve uumlyelerinden birisine erişmekle sınırlıdır Oumlrneğin yapılarfonksiyonlara geccedilirilip geri doumlnduumlruumllemez
13
92 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 5
yapi1 = yapi2
şeklinde her iki tarafında yapı değişkeni olan bir atama gerccedilekleştirilemez Busınırlamaların uumlstesinden gelmek iccedilin goumlstergeler kullanılabilir Buna rağmen ANSIStandardını izleyen yeni C derleyicilerinde boumlyle sınırlamalar yoktur Oumlrneğin bizimsistemde aşağıdaki program kabul edilmektedir
include ltstdiohgt
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 zi = yi 2 uyelere degerler ata zc = 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 sn y2i y2c) main
ve ccedilıktı şoumlyledir2 iki kere
Burada yapılarla yapılacak uumlccedil şeyi goumlrmekteyiz Bir yapıyı bir arguumlman olarak geccedilirmekfonksiyondan bir yapı doumlnduumlrmek ve bir yapıyı başka bir yapıya atamak Yapı atamasıkaynak yapının her uumlyesinin hedef yapının ilgili uumlyesine atanması demektir ve yapınınboyuna goumlre bir miktar zaman alabilir
Yukarıdaki oumlrnekte yapı değişkenlerini ilkleme youmlntemini de goumlrmekteyiz Soumlzdizimidiziler iccedilin kullanılana benzemektedir İlklenecek değişken = atama simgesinden sonravirguumllle ayrılıp ccedilengelli parantezler iccediline alınmış değişmez ifadelerden oluşan bir liste ileizlenir Her uumlye ilgili ifadenin değerine ilklenir Eğer ifadelerden daha fazla uumlye varsageri kalan uumlyeler C dilindeki varsayılan değere yani sıfıra ilklenir
53 Yeni Tip Tanımlama
Tuumlretilmiş veri tipleri uumlzerindeki tartışmamıza devam etmeden oumlnce gelin dilin iccedilindekibasit tipler gibi goumlruumlnen ancak karmaşık tip olan yeni yani kullanıcı tarafındantanımlanmış tiplere ve boumlyle tiplerin tanımlanması iccedilin kullanılan youmlnteme bakalım Bu
13
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI 93
amaccedilla C dilinde bir tipe bir tanıtıcı soumlzcuumlk vererek yeni bir tip tanımlamaya yarayantypedef bildirimi bulunmaktadır Bildirim anlambilim accedilısından oldukccedila farklıolmasına rağmen soumlzdizimsel olarak bir değişken tanımıyla aynıdır Sadece başınatypedef anahtar soumlzcuumlğuuml getirilir typedef anahtar soumlzcuumlğuumlnuumln bir bellek sınıfıbelirteci olduğu kabul edilir ve C dili bir bildirimde en fazla bir tane bellek sınıfıbelirtecine izin verdiği iccedilin typedefrsquoin arkasına (veya oumlnuumlne) auto registerstatic veya extern konulamaz Gelin birkaccedil oumlrneğe bakalım
typedef unsigned short int kisatypedef char kdizisi kdfonk(char char )typedef struct float ger im komplekstypedef int vektor[6] matriks[8][6]typedef enum yanlis dogru mantiksal
(kisa kdizisi kdfonk kompleks vektor matriks ve mantiksal gibi)yeni tanımlanan tanıtıcı soumlzcuumlklerin kendileri değişken veya fonksiyon değillerdir (eğertypedef anahtar soumlzcuumlkleri olmasaydı oumlyle olacaklardı) ancak bu tuumlr değişken veyafonksiyon tanımlamaya yarayacak tiplerdir Boumlyle tip isimleri kalıplarda ve sizeofrsquounişlenenleri olarak kullanılabilir (sizeof bir sonraki kısımda anlatılmaktadır) Oumlrneğinaşağıdakiler birbirlerine eşdeğerdir
kisa i j k ile unsigned short int i j kkdizisi s1 s2 ile char s1 s2kdfonk 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 kullanmanın temel nedeni uzun bildirimleri kısaltmasıdır Fakat mantıksalolarak programcı C dilinin sağladığı tiplerin yanına sanki yeni bir tip ekliyormuş gibiduumlşuumlnebilir Bu kolaylık programlama ccedilabasını azaltır programın okunaklılığını geliştirirve programlarımızı daha ldquoyapısalrdquo hale getirir Ayrıca oumlnemli ve karmaşık tip bildirimleriprogramın belirli bir yerinde toplandığında programı belgelemek ve daha sonra onuanlayıp değiştirmek daha kolay olacaktır
typedef bildirimlerinin etki alanı değişkenlerde olduğu gibidir Bir blok iccedilindetanımlanmış bir tip dış bloklara erişilebilir değildir fakat bir dış blokta tanımlanmış birtip tekrar tanımlanmadığı suumlrece bir iccedil blokta kullanılabilir Dışsal duumlzeyde yapılmış birtypedef bildirimi kaynak dosyasının sonuna kadar etkisini suumlrduumlrecektir fakat ayrıderlenen dosyalarda değil struct union ve sayım tipi bildirimlerinin etki alanı daaynıdır
13
94 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 5
54 sizeof İşleci
C dilinin bir diğer anahtar soumlzcuumlğuuml de sizeofrsquotur sizeof C dilinde bir anahtar soumlzcuumlkile ifade edilen tek işleccediltir Bir fonksiyon değildir diğer tekli işleccediller ile aynı oumlnceliğesahip olan ve sağdan sola birleşme oumlzelliği goumlsteren bir tekli işleccediltir Genelde ya birdeğişkene yada bir tipe uygulanır Bu işleccedil işlenenin tipinden olan bir değişkenin bellektetutacağı bayt sayısını (bir değişmez) doumlnduumlruumlr Bir oumlnceki kısmın değişkentanımlamalarını kullanan oumlrnekler aşağıda verilmiştir
printf(ld ld ld ld ldn (long)sizeof i (long)sizeof a (long)sizeof s1 (long)sizeof z[3] (long)sizeof 10)printf(ld ld ld ld ldn (long)sizeof(int) (long)sizeof(float) (long)sizeof(double) (long)sizeof(int ) (long)sizeof(kompleks[3]))printf(ld ld ld ld ldn (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ı ccedilıktılar goumlruumlntuumlleyecektir Sistemimizde ccedilıktışoumlyledir
2 96 2 8 82 4 8 2 2412 16 62 1 12
Bunun anlamı int değişkenlerinin 2 bayt float değişkenlerinin 4 bayt doubledeğişkenlerinin 8 bayt ve goumlsterge değişkenlerinin 2 bayt tuttuğudur Hergerccedilekleştirmede sizeof(char)rsquoın 1 olduğu tanımlanmıştır Diğer sayıları kendinizdoğrulamaya ccedilalışın Bir long kaccedil bayttır
sizeofrsquoun değerinin derleme zamanında belirlendiğine dikkat edin boumlylecesizeof bir değişmez ifadenin kullanılmasına izin verilen yerlerde kullanılabilirStandarda goumlre sizeof işlecinin verdiği sayının int olması beklenmemelidirgerccedilekleştirmeye bağlı olarak long veya herhangi bir uygun tamsayı tipi olabilir Bu(unsigned olan) tip standart başlık dosyası stddefhrsquode size_t ismi iletanımlanmıştır Bu sayıyı printfrsquoe geccedilirmeden oumlnce bir kalıpla longrsquoa ccedilevirecek velong iccedilin olan doumlnuumlşuumlm tanımlamasını kullanacak kadar dikkatli davrandık
sizeof ile ilgili bir soumlzdizimsel ayrıntı da bir ifade yerine bir tipe uygulandığındatipin parantezler iccediline alınması gerektiğidir
13
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI 95
55 Birlikler
Birlikler bir soumlzdizimsel bir de anlambilimsel fark dışında yapılara ccedilok benzerler Birbirliğin soumlzdizimi aynıdır sadece struct yerine union anahtar soumlzcuumlğuumlnuuml kullanırızYapılarda uumlyeler belleğe birbiri ardınca yerleştirilirler (yani bir uumlyenin diğerinin uumlstuumlnesarkması soumlz konusu değildir) boumlylece her uumlyeyi diğerlerinden bağımsız işleyebilirizBirliklerde uumlyeler aynı bellek boumllgesini paylaşırlar Boumlylece herhangi bir zamandauumlyelerden sadece bir tanesi ile ilgilenebiliriz Derleyici en buumlyuumlk uumlyeyi iccediline alabilecekkadar geniş bellek ayırır Oumlrneğin
union cifdg char c int i float f double d int g bd = A
5 yerpaylaşımlı uumlyeden oluşan bd birlik değişkenini tanımlar sizeof bd 8rsquodir bu daen buumlyuumlk uumlye olan double değişkeninin boyudur Uumlyelere yapılarda olduğu gibi aynıyolla ulaşılır (yani ldquordquo veya ldquo-gtrdquo işlecini kullanarak) Oumlrneğin
bd d = 98696044011printf(cn bdc)
Bu şekilde bu iki deyimi arka arkaya kullanmanın yanlış olduğuna dikkat edin ccediluumlnkuuml birtaraftan double bir değer koyup diğer taraftan bir char almaya ccedilalışmaktayız Ayrıcaher uumlye iccedilin bir ilkleyenin bulunduğu yapılara karşılık birliklerde en fazla bir taneilkleyenin olabildiğine dikkat edin İlkleyen ilk uumlyeye uygulanır Oumlrneğin yukarıdakitanımda bdcrsquoye A atanmaktadır daha sonra yukarıdaki iki deyim yerine getirildiktensonra E ccedilıktısını elde ederiz bu da anlamsız bir değerdir ccediluumlnkuuml bddrsquoye atanan değerbdcrsquodeki değeri bozar
Herhangi bir zamanda uumlyelerinden en fazla bir tanesinin bir değer tutacağınıbildiğimiz zamanlarda bellekten tasarruf etmek amacıyla genelde birlikler kullanılır Buoumlzellik daha oumlnce verilmiş olan bir oumlrneğin genişletilmiş uyarlaması olan aşağıdakioumlrnekte kullanılmıştır
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]
13
96 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 5
Burada kişinin cinsiyetine bağlı olan iki adet bilgi vardır Erkekler iccedilin askerlikhizmetini bitirme yani terhis tarihi (ahbtarihi) kadınlar iccedilin ise kızlık yanievlenmeden oumlnceki soyadı (ksoyadi) Aynı zamanda her iki uumlyenin anlamlı bir değersaklamayacaklarını bildiğimiz iccedilin bellekten tasarruf etmek amacıyla bunları bir birliğiniccediline alıyoruz Hangi uumlyeyi (kisiler[birisi]cbilahbtarihi veyakisiler[birisi]cbilksoyadi) kulanmamız gerektiğini belirlemek iccedilinkisiler[birisi]cinsiyet iccedilindeki bilgiyi kullanabiliriz
56 Alanlar
Bazı durumlarda dar bir yer iccediline (oumlrneğin bir tamsayı boyunda bir boumllgeye) birccedilok bilgisığdırmamız gerekebilir Bunun nedeni bellek tasarrufu olabildiği gibi program dışındakibazı durumlardan (oumlrneğin donanım aygıtlarına olan arabirimlerden) kaynaklanabilirBunu yapmak iccedilin bir yapının uumlyelerini bit uzunluklarını da vererek tanımlarız Bu tuumlruumlyelere alan adı verilir Doğal olarak uzunluklar sıfırdan kuumlccediluumlk olmayan değişmezifadelerdir Tanım yapılarda olduğu gibidir sadece her uumlyenin arkasına iki nokta ileuzunluk verilebilir Erişim de yapılarda olduğu gibi ldquordquo veya ldquo-gtrdquo işleccedilleri ile yapılır Biroumlrnek
struct tarih unsigned yil 7 unsigned ay 4 unsigned gun 5
Burada tarihin iki bayt (sizeof(struct tarih) 2rsquodir) iccediline sığdırılabileceği biryapı tanımlanmaktadır yil 7 bit kullanır (işaretsiz olduğu iccedilin değeri 0rsquodan 27-1=127rsquoekadar değişebilir ve oumlrneğin 1900 ile 2027 arasındaki yılları ifade etmek iccedilinkullanılabilir) ay 4 bit (0rsquodan 24-1=15rsquoe kadar değişir) gun ise 5 bittir (0rsquodan25-1=31rsquoe kadar değişir) Eğer uzunlukları belirtmemiş olsaydık her uumlye 2 baytkullanacak boumlylece tuumlm yapı 6 bayt kaplayacaktı
Alanlarla uğraşan birisinin dikkat etmesi gereken kurallar şoumlyle oumlzetlenebilir
1 Alan tipi unsigned bir tamsayı olmalıdır Standart en azından unsignedintrsquoin desteklenmesini gerektirir
2 Bitlerin alanlara atanma tarzı (soldan sağa veya sağdan sola) derleyiciye bağlıdır
3 Eğer bir alan soumlzcuumlk sınırlarını (sistemimizde short ve int iccedilin 16 long iccedilin 32ve char iccedilin 8 bitlik sınırları) kesecek şekilde tanımlanırsa bir sonraki soumlzcuumlktenbaşlatılır kullanılmakta olan soumlzcuumlkteki bitler kullanılmaz Oumlrneğin
13
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI 97
struct dnm unsigned a1 12 unsigned a2 5 unsigned a3 12
aşağıdaki biccedilimde 6 bayt kaplar
12 bit a1 4 bit kullanılmıyor (ilk soumlzcuumlk yani iki bayt)5 bit a2 11 bit kullanılmıyor (ikinci soumlzcuumlk)12 bit a3 4 bit kullanılmıyor (uumlccediluumlncuuml soumlzcuumlk)
Eğer unsigned yerine unsigned long kullanmış olsaydık yapı aşağıdakibiccedilimde 4 bayt kaplayacaktı
12 bit a1 5 bit a2 12 bit a3 3 bit kullanılmıyor (bir long soumlzcuumlk yani 4 bayt)
Eğer unsigned char kullanmış olsaydık tanım kabul edilmeyecekti ccediluumlnkuuml alana1 12 bit uzunluğundadır oysa bir char en fazla 8 bit tutabilir Bu bir alanın kenditipinden daha geniş olamayacağı anlamına gelir Eğer bir alan iccedilin bit sayısıbelirtilmemişse o tip iccedilin en buumlyuumlk değer kullanılır
4 Alanlardan oluşan diziler tanımlanamaz
5 Adres alma işleci (amp) alanlara uygulanamaz boumlylece alanlar goumlsterge kullanarakdoğrudan doğruya adreslenemezler
6 Alan isimleri isteğe bağlıdır Eğer bir alanı kullanmayı duumlşuumlnmuumlyorsanızmdashoumlrneğinyukarıdaki oumlrnekte a2rsquoyimdashtipi ve alan ismini atlayın Oumlrneğin
struct dnm unsigned a1 12 5 unsigned a3 12
7 Eğer bir sonraki soumlzcuumlğuumln başına atlamak istiyorsanız araya 0 genişliğinde bir boşalan koyun Oumlrneğin sistemimizde
struct dnm unsigned a1 12 0 unsigned a3 12
ile
struct dnm unsigned a1 12 4 unsigned a3 12
13
98 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 5
eşdeğerdir Neden
8 Alanlar da tıpkı yapı uumlyeleri gibi ilklenebilirler fakat alan iccedilin ccedilok buumlyuumlk olan birdeğer vermemeye dikkat etmek gerekir
57 Bellek Ayırma
Bazı durumlarda programcı program iccedilin gereken ana bellek miktarını oumlncedenbelirleyemez Oumlrneğin bu buumlyuumlk oranda program girdisine bağlı olabilir Bir dosyayısıraya sokan bir program buumltuumln dosyayı alacak kadar ana belleğe gereksinim duyabilirBir dosya istenildiği kadar uzun olabildiğine goumlre yuumlruumltme esnasında sistemin bizesağlayabileceği kadar daha fazla bellek elde edebilme youmlntemine gereksinimimiz vardır
Standart kuumltuumlphane buna izin verecek bir fonksiyon calloc(nboy) iccedilerir İkiarguumlmanı size_t tipinden tamsayılar olmalıdır boy boyunda n tane değişkentutabilecek sıfıra ilklenmiş bir bellek bloğuna bir goumlsterge doumlnduumlruumlr
Daha basit başka bir fonksiyon malloc(bayts)rsquotır ve bayts kadar bayttanoluşan bir bellek bloğuna bir goumlsterge doumlnduumlruumlr Arguumlmanın tipi yine size_trsquodirsize_t gerccedilekleştirmeye bağlı olan ve en buumlyuumlk bellek boyunu saklayabilecek kadarbuumlyuumlk olan bir tamsayıdır
free(g) fonksiyonu daha oumlnce calloc veya malloc ile ayrılmış bulunan ve gile goumlsterilen bellek bloğunu serbest bırakacaktır
malloc ve callocrsquoun doumlnuumlş tipi ve freersquonin arguumlman tipi genel goumlsterge tipiolan ldquovoid rdquorsquodır ldquovoid rdquo tipi bekleyen bir fonksiyona bir goumlsterge arguumlmanıgeccedilirdiğinizde bir kalıp kullanarak bunu ldquovoid rdquo tipine doumlnuumlştuumlrmeniz gerekir Aynışekilde bir fonksiyon ldquovoid rdquo doumlnduumlruumlyorsa bunu uygun goumlsterge tipinedoumlnuumlştuumlrmeniz gerekir Her tip goumlsterge herhangi bir bilgi yitimine uğramadanldquovoid rdquo tipine ve daha sonra eski tipine doumlnuumlştuumlruumllebilir stdlibh başlık dosyasıbu fonksiyonlar iccedilin gerekli bildirimleri iccedilerir ve bu boumlluumlmuumln sonunda bu fonksiyonlarıkullanan oumlrnek bir program bulunmaktadır
58 Karmaşık Tipler
Bu kısımda dizi dizileri dizilere goumlstergeler goumlsterge dizileri ve goumlstergelere goumlstergelergibi daha karmaşık veri tiplerini inceleyeceğiz Bir tanımı istediğimiz kadarkarmaşıklaştırabileceğimize dikkat edin oumlrneğin tamsayı dizilerine goumlstergeler iccedilerendiziye bir goumlsterge Biz ise burada yalnızca yukarıda sıraladığımız gibi ldquoiki-duumlzeylirdquokarmaşık veri tiplerine bakacağız
13
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI 99
581 Dizi Dizileri
Bir dizi benzer elemanlardan oluşan bir topluluktur Eleman sayısı derleme sırasındabelirlenir boumlylece C dilinde devingen dizilere izin verilmez Bir dizinin elemanları (alanveya fonksiyon dışında) herşey olabilir ayrıca dizi de olabilir boumlylece ccedilok-boyutlu dizilertanımlanabilir Bir dizinin elemanlarına ulaşmak iccedilin indisler kullanılır İndisler tamsayıifadelerdir ve dizinin n tane elemanı varsa değerleri 0 ile n-1 arasında değişebilir
Tek-boyutlu dizileri nasıl kullanacağımızı biliyoruz Şimdi ccedilok boyutlu bir dizitanımına bakalım
int a[3][4] = 1 2 3 2+2 5 6 7 1ltlt3 33 10 11 0xFamp~03
Burada ccedilok-boyutlu bir dizinin (bir dizi dizisinin) tanımının buumltuumln boyutlarda boylarınayrı ayrı koumlşeli parantezler iccediline alınarak verildiği goumlruumlyoruz Yukarıdaki tanımda dizininher biri 4 elemanlı 3 ldquovektoumlrrdquo şeklinde duumlzenlenmiş 12 elemanı vardır Diğer bir deyişlediziler satır şeklinde saklanırlar yani son indis en hızlı değişendir İlkleme beklendiği gibiyapılır dizinin her elemanı iccedilin uumlccedil madde bulunmaktadır bunlar da virguumllle ayrılmışvektoumlrlerdir Bu maddelerin her biri birbirinden virguumllle ayrılıp ccedilengelli parantezler iccedilinealınmış 4 değişmez ifadeden oluşurlar Buumltuumln (12) değerleri de belirtmemize gerek yokturOumlrneğin
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
aynıdır Eğer buumltuumln değerleri belirtirsek iccedilteki ccedilengelli parantezlere gerek yoktur
int a[3][4] = 1 2 3 2+2 5 6 7 1ltlt3 33 10 11 0xFamp~03
Eğer derleyici dizinin boyunu ilkleyenden ccedilıkarabilirse o zaman boyu belirtmeye gerekyoktur Oumlrneğin
int a[][4] = 1 2 3 2+2 5 6 7 1ltlt3 33 10 11 0xFamp~03
13
100 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 5
a iccedilin ilk verilen tanıma eşdeğerdir Bildirimdeki ilk (yani belirtilmeyebilen) indisinsadece dizi tarafından gerek duyulan bellek miktarını belirlemede kullanıldığına dikkatedin indis hesaplamalarında kullanılmamaktadır
Bir dizi elemanına ulaşmak iccedilin ldquo[]rdquo işlecini kullanırız Eğer n-boyutlu bir dizimizvarsa n tane boumlyle işleccedil kullanılmalıdır Oumlrneğin a[1][2] değeri 7 olan dizi elemanınıgoumlstermektedir Pascal programlama dilinden farklı olarak a[12]mdashveya a[(12)]mdasha[2]rsquoye eşdeğerdir ve bir intrsquoin beklendiği bir yerde kullanılamaz
582 Dizilere Goumlstergeler
Daha oumlnce de accedilıklandığı gibi bir fonksiyon parametresi olarak tanımlanmış tek boyutlubir dizinin boyunun belirtilmesine gerek yoktur ccediluumlnkuuml bu bir dizi değil gerccedilekte birgoumlstergedir Ccedilok-boyutlu bir dizide ne olur Kural şoumlyledir İlki dışında buumltuumln boyutlarınboyunu belirtmeniz gerekir Oumlrneğin
f (int uc_b[][5][7])
Gelin bunun nedenine bakalım uc_b[0]rsquoın 5times7 boyunda iki-boyutlu bir dizi olduğunadikkat edin uc_b[1] ilkinden 35 int ileride olan bir sonraki iki-boyutlu dizidir Yaniuc_b[1] veya (uc_b+1)mdashbir goumlsterge ifadesimdashuc_b[0]rsquoın 35 int ilerisinigoumlstermelidir Bu uc_brsquonin 5 ccedilarpı 7 (yani 35) elemanlık bir diziye goumlsterge olduğuanlamına gelir Yukarıdaki parametre bildirimi şoumlyle de yazılabilirdi
int (uc_b)[5][7]
bu da yukarıdaki ile tamamen aynıdır Parantezlere dikkat edin Eğer yazılmasalardı
int (uc_b[5][7])
anlamına gelecek bu da int goumlstergelerden oluşan iki-boyutlu bir dizi anlamınagelecekti bir sonraki altkısmın konusu
Aşağıdaki oumlrnek ccedilok-boyutlu dizilerin kullanımını oumlzetlemeye ccedilalışmaktadırProgramı inceleyip onu izleyen ccedilıktıyı doğrulamaya ccedilalışın
include ltstdiohgtint x[3][5][7] uc-boyutlu bir dizi
void f (int a[][5][7]) iki-boyutlu diziye goumlsterge printf(dtdn a[0][0][0] (int)sizeof a[0][0][0]) printf(dtdn a[0][0] (int)sizeof a[0][0]) printf(dtdn a[0] (int)sizeof a[0]) printf(dtdn a (int)sizeof a) printf(ndtdn x[0][0][0] (int)sizeof x[0][0][0])
13
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI 101
printf(dtdn x[0][0] (int)sizeof x[0][0]) printf(dtdn x[0] (int)sizeof x[0]) printf(dtdn x (int)sizeof x) printf(ndtdtd (int)a[0] (int)a[1] ((int)a[1]-(int)a[0]) (int)sizeof(int)) printf(ndtdtd (int)x[0] (int)x[1] ((int)x[1]-(int)x[0]) (int)sizeof(int)) printf(ndtdtd (int)a[0][0] (int)a[0][1] ((int)a[0][1]-(int)a[0][0]) (int)sizeof(int)) printf(ndtdtd (int)x[0][0] (int)x[0][1] ((int)x[0][1]-(int)x[0][0]) (int)sizeof(int))
void main (void) f(x)
Ccedilıktı şoumlyledir0 23384 143384 703384 2
0 23384 143384 703384 210
3384 3454 353384 3454 353384 3398 73384 3398 7
583 Goumlsterge Dizileri
Daha oumlnceki bir boumlluumlmde geleneksel olarak argv adı verilen mainrsquoin ikinciparametresinin bir karakter goumlstergeleri dizisi olduğunu goumlrmuumlştuumlk Aslında bunuanlamak ta o kadar zor değildir eğer belirli bir sayıda goumlstergemiz varsa diğer tiptekideğişkenler iccedilin yaptığımız gibi bunları da bir dizi iccedilinde saklayabiliriz Bir oumlrnekgoumlrelim
char msj[] = Tamam Disk dolu Sozdizim hatasi Dosya bulunamadi
Burada ilkleyen iccedilinde verilen karakter dizilerinin sayısı kadar boyda bir dizimiz vardırHer karakter dizisinin temel adresi msj dizisi iccedilinde arka arkaya gelen goumlsterge
13
102 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 5
elemanları iccedilinde saklanmaktadır Bu msjrsquoyi iki-boyutlu bir karakter dizisi olaraktanımlamaktan iyidir Bellek kullanımı dikkate alarak bunun nedenini accedilıklamaya ccedilalışın
Bu diziyi kullanabilecek bir hata yordamı şoumlyledir
void hata (int hk) printf(ltdgt sn hk msj[hk]) exit(hk)
Burada exit programı bitiren bir kuumltuumlphane fonksiyonudur stdlibh başlıkdosyasında bildirilmiştir int tipinden olan arguumlmanı da ccedilağıran suumlrecemdashtipik olarakişletim sisteminemdashdoumlnduumlruumllen bir durum kodudur Geleneksel olarak 0 normalsonuccedillanmayı sıfırdan farklı bir sayı da farklı bir durumu goumlstermek iccedilin kullanılır
Başka bir oumlrneğe bakalım
int cikis(void) ekleme(void) silme(void) degistirme(void)int (fonkt[])(void) = cikis ekleme silme degistirme
Bu fonksiyonlara goumlstergelerden oluşan bir dizidir Tekrar işleccedil oumlnceliklerini anımsayınİlk olarak fonksiyon tiplerini tanımlıyoruz Fonksiyonların hepsinin parametresiz vedoumlnuumlş tiplerinin de hep aynı olduğuna dikkat edin Daha sonra bu fonksiyonlaragoumlstergelerle diziyi ilkliyoruz Bildiğiniz gibi eğer bir fonksiyon ismi arkasında parantezbulunmuyorsa bu o fonksiyona bir goumlstergedir Bu dizideki bir fonksiyonu ccedilağırmak iccedilin
(fonkt[secenek])()
kullanırız secenek burada bir tamsayıdır Eğer secenek 0rsquosa cikis 1 ise eklemeccedilağrılır vs
584 Goumlstergelere Goumlstergeler
Goumlstergeler değişken olduklarına goumlre onlara da goumlsterge tanımlanabilir Pratik birdurum bir fonksiyona geccedilirilen bir goumlsterge dizisidir mainrsquoin ikinci parametresi boumlylebir oumlrnektir argv char goumlstergelerine bir goumlsterge olarak duumlşuumlnuumllebilir Boumlylece
void main (int argc char argv[])
ve
void main (int argc char argv)
tanımları eşdeğerdir Aşağıda Altkısım 423rsquote verilen programın bir başka şekliverilmiştir
13
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI 103
include ltstdiohgt
void main (int argc char argv[]) printf(Merhaba benim ismim sn argv) printf(Argumanlarim sunlar) while (++argv) printf( s argv) printf(n)
argvrsquonin en sonunda bir NULL goumlstergenin bulunduğuna dikkat edin
Bir sonraki kısımda bir goumlstergeye goumlsterge oumlrneği vardır
59 Bir OumlrnekmdashDosya Sıralama
Bu kısımda malloc ve free kuumltuumlphane fonksiyonlarını kullanan ve bu boumlluumlmdeoumlğrenilmiş bazı kavramları goumlsteren bir oumlrneğe bakacağız Problem bir metindosyasındaki satırları sıraya sokmaktır Sıraya sokma duumlzeni sistem tarafından sağlanansıraya goumlre olacaktır Bu bizim sistem iccedilin artan ASCII karakterleri sırasıdır (Ek Arsquoyabakınız) Bu program MS-DOSrsquoun SORT komutuna benzemektedir
Youmlntemimiz ikili bir ağaccedil kullanmak olacaktır Ağacın her duumlğuumlmuumlnde bir bilgi alanıve iki goumlsterge vardır biri sola biri sağa Algoritma şoumlyledir
bull Boş bir ağaccedilla başla
bull Bir satır oku bir duumlğuumlm oluştur bilgi boumlluumlmuumlnuuml satırla doldurup iki goumlstergeye BOŞ(NULL) koy Bu koumlk duumlğuumlmuuml olacaktır
bull Bir sonraki satırı oku bu satır iccedilin yukarıdaki gibi bir duumlğuumlm oluştur Şimdi buduumlğuumlmuumln ağaccedil iccediline konulacak yeri araştır Koumlk duumlğuumlmuumlne olan goumlstergedenbaşlayarak ve BOŞ bir goumlsterge elde edilmediği suumlrece goumlstergeleri şu şekilde izleEğer yeni satır eldeki goumlsterge tarafından işaret edilen duumlğuumlmdeki satırdan soumlzluumlksırası accedilısından kuumlccediluumlkse goumlstergeye o duumlğuumlmuumln sol goumlstergesini aktar aksi takdirdesağ goumlstergeyi aktar bu işlemi tekrarla Sonunda BOŞ bir goumlstergeye ulaşılacaktır bugoumlstergeyi yeni duumlğuumlmuuml goumlsterecek şekilde değiştir
bull Girilen buumltuumln satırlar iccedilin oumlnceki adımı tekrarla Sonundamdashille de dengeli olmasınagerek olmayanmdashbir ikili ağaccedil elde edilecektir
Sayısal değerler kullanılarak elde edilen oumlrnek bir ikili ağaccedil Şekil 51rsquodegoumlsterilmiştir
13
104 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 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
Sayılar şu sırada girilmiştir
ve ccedilıkış sırası şoumlyledir
işareti BOŞ goumlsterge anlamına gelir
ŞEKİL 51 Bir oumlrnek ikili ağaccedil
Ağacı bastırmak iccedilin aşağıdaki oumlzccedilağrılı algoritmayı kullanacağız Koumlk duumlğuumlme olangoumlstergeden başla Eğer goumlsterge BOŞ değilse soldaki altağacı bastır eldeki duumlğuumlmuumlnbilgisini bastır sağdaki altağacı bastır ldquoAltağaccedilrdquoların basım işi aynı tuumlmcede anlatılanalgoritma kullanılarak yapılacaktır Bu algoritma eninde sonunda bitecektir ccediluumlnkuuml tuumlmcebaşında ldquoeğerrdquo koşulu vardır Dikkat ederseniz bir ağaccediltaki goumlstergelerin yarısındanfazlası BOŞtur Neden
Bu algoritmayı bir program şeklinde uygulamaya sokmak iccedilin duumlğuumlm iccedilin ne tuumlr birveri yapısı kullanacağımıza karar vermemiz gerekir Doğal olarak bu uumlccedil uumlyeden oluşanbir yapı (struct) olacaktır satir sol ve sag bu son ikisi de aynı yapıya olangoumlsterge tipinden olacaktır Yani bir oumlz-referanslı yapımız olacaktır İlk uumlye (satir)belirli bir uumlst limite (oumlrneğin 80 karaktere) kadar olabilecek bir satırı saklayabilecekbuumlyuumlkluumlkte bir karakter dizisi şeklinde tanımlanabilir Fakat buumltuumln satırlar bu kadar uzunolamayacaklarına goumlre dizi iccedilindeki alanın buumlyuumlk bir boumlluumlmuuml kullanılmayabilecektir yanibellek israfı olacaktır Bundan dolayı satir bir karakter goumlstergesi şeklindetanımlanmıştır ve satırın boyu kadar yuumlruumltme esnasında istenen bellek boumllgesinin başınaişaret edecektir
Şimdi de program1 include ltstddefhgt2 include ltstdiohgt3 include ltstdlibhgt4 include ltstringhgt5 define MAKSSU 80 en buyuk satir uzunlugu 6
13
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI 105
7 typedef struct dugum struct dugumun tanimi 8 char satir bilgi 9 struct dugum sol sag10 dugumg dugumg tipinin tanimi1112 void yeni (size_t d) bellek ayirma 13 14 void g1516 if ((g=malloc(d))=NULL)17 return g tamam 18 fprintf(stderr SIRALA Yetersiz bellek)19 exit(1) programi kes 20 yeni 2122 size_t satiroku satir uzunlugu dondur 0 dosya sonu 23 (char d int u)24 25 register char g = d26 register int c2728 while ((c=getchar())=n ampamp c=EOF)29 if (u--gt1)30 g++ = (char)c daha uzun satirlari kes 31 if (c==EOF ampamp g==d)32 return 0 bir sey okunamadi 33 g++ = 034 return g-d asil uzunluk arti bir (0 icin) 35 satiroku 3637 void satirlaribas agacin ozcagrili taranmasi 38 (dugumg g)39 40 if (g=NULL) 41 satirlaribas(g-gtsol)42 printf(sn g-gtsatir)43 satirlaribas(g-gtsag)44 free((void )g-gtsatir)45 free((void )g)46 47 satirlaribas 4849 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 g5455 while ((su=satiroku(satir(int)sizeof satir)) gt 0) 56 g = ampkok57 while (g=NULL)58 g = (strcmp(satir(g)-gtsatir) lt 0)59 amp(g)-gtsol amp(g)-gtsag60 g = (dugumg) yeni(sizeof(struct dugum))61 strcpy((g)-gtsatir = (char )yeni(su) satir)62 (g)-gtsol = (g)-gtsag = NULL63 64 satirlaribas(kok)65 main
13
106 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 5
Programın başında yapı (struct dugum) ve boumlyle bir yapıya bir goumlsterge(dugumg) iccedilin tipler tanımlamış bulunuyoruz main yordamı her okunan satır iccedilin birdefa yuumlruumltuumllen buumlyuumlk bir while doumlnguumlsuumlnden oluşmaktadır
satiroku fonksiyonu satir karakter dizisinin iccediline bir satır okur ve okunankarakter sayısı artı bir (en sona konan 0 iccedilin) verir Dosya sonu (EOF) durumunda ise0 doumlnduumlruumlr
main iccedilinde iki oumlnemli değişkenimiz vardır kok duumlğuumlme bir goumlstergedir ve herzaman koumlk duumlğuumlmuumlne işaret eder g ise bir duumlğuumlme olan goumlstergeye goumlstergedir birduumlğuumlmuumln sol yada sag goumlstergelerine işaret eder Bir defa bir satır okundu mu g koumlkduumlğuumlm goumlstergesine işaret edecek şekilde getirilir
Sonra g tarafından işaret edilen yerde NULL (BOŞ) bir goumlsterge olmadığı suumlrecegrsquonin işaret ettiği goumlsterge tarafından işaret edilen duumlğuumlmde şimdi okunan satırdan soumlzluumlksırasına goumlre daha buumlyuumlk bir satırın olup olmadığını kontrol ederiz Eğer oumlyle ise grsquoninsol aksi takdirde sag goumlstergeye işaret etmesini sağlarız while doumlnguumlsuuml g tarafındanişaret edilen (sol ve sag) goumlsterge bir duumlğuumlme işaret ettiği (yani NULL olmadığı) suumlrecetekrarlanır
Bir NULL goumlstergeye ulaştığımızda grsquonin bu goumlstergeye işaret ettiğini bilerekdoumlnguumlden ccedilıkarız Şimdi yeni bir duumlğuumlm oluşturmanın zamanıdır malloc kuumltuumlphanefonksiyonunu kullanan yeni fonksiyonu bu duumlğuumlm iccedilin yeterli miktarda bellek boumlluumlmuumlayırmak iccedilin ccedilağrılır Doumlnduumlrduumlğuuml goumlsterge g tarafından işaret edilen goumlstergeye aktarılırDaha sonra okunmuş olan satırı alacak buumlyuumlkluumlkte bir bellek boumllgesi ayrılır satır buboumllgeye aktarılır ve bu boumllgeye olan goumlsterge grsquonin işaret ettiği goumlsterge tarafındangoumlsterilen duumlğuumlm yani yeni duumlğuumlm iccedilindeki satir goumlstergesine atanır Ayrıca buduumlğuumlmuumln sol ve sag goumlstergelerine de NULL konur
Yukarıda anlatılanlar ilk bakışta ccedilok karmaşık gelebilir Eğer accedilıklamayı tam olarakizleyemediyseniz tamamen haklısınız Birkaccedil tekrar yararlı olacaktır
Yapılacak son şey ağacı basmaktır Burada oumlzccedilağrı bize ccedilok yardımcı olacaktır Anaprogram kok goumlstergesini vererek satirlaribas adlı oumlzccedilağrılı fonksiyonu ccedilağırırBu fonksiyon ldquoEğer goumlsterge NULL değilse sol altağacı bas şimdiki duumlğuumlmuumln bilgisinibas sağ altağacı basrdquo cuumlmlesinde denileni yapar ve ayrıca ldquobu duumlğuumlm tarafındankullanılan belleği serbest bırakrdquo işini de yapar Bellek serbest bırakıldıktan sonra tekrarbellek ayırma soumlz konusu olmadığı iccedilin free fonksiyonu ccedilağrılarının bu program iccedilingereksiz olduğuna dikkat edin
Programımız girdisini standart girdi aygıtından alır ve ccedilıktısını da standart ccedilıktıaygıtına goumlnderir Daha sonraki bir boumlluumlmde goumlreceğimiz gibi programlarımızdagirdiccedilıktı iccedilin dosyalar da kullanabiliriz ama daha basit bir yol vardır Birccedilok işletimsistemi girdiccedilıktının yeniden youmlnlendirilmesi adı verilen ve tekrar derleme yapmadanstandart girdi ve ccedilıktı dosyaları yerine başka dosyaların kullanılmasına izin veren biryoumlntem sağlarlar MS-DOSrsquota bu şu şekilde yapılabilir Programınızın SIRALA adlıyuumlruumltuumllebilir dosya iccedilinde derlendiğini varsayın
AgtSIRALA ltSIRASIZ gtSIRALI
13
BOumlLUumlM 5 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI 107
komutunu kullanarak programın girdiyi SIRASIZ adlı disk dosyasından almasını veccedilıktıyı SIRALI adlı dosyaya koymasını sağlayabilirsiniz Bu ldquoarguumlmanlarınrdquo bir tanesinibelirtmediğinizde ne olduğunu deneyip kendiniz bulmaya ccedilalışın Program iccedilin buldquoarguumlmanlarınrdquo tamamen goumlruumlnmez olduğuna dikkat edin yani (main fonksiyonununikinci parametresi olan) argv dizisinde goumlzuumlkmeyeceklerdir gerekli işlemleri işletimsistemi yapar
Başka bir oumlzellik kuumlme komut işlemedirAgtDIR | SIRALA
şeklindeki MS-DOS komutunu deneyip ccedilıktıyı accedilıklayın Daha fazla bilgi iccedilin işletimsisteminizin elkitabına danışın
Problemler
1 İlklenmemiş ldquoenum gunlerrdquo tipinden bir değişken (a) eğer static veya dışsalsave (b) eğer auto veya register ise hangi değere sahip olacaktır
2 Kısım 52rsquode soumlzuuml edilen yapılarla ilgili sınırlamaları olan bir derleyiciniz olduğunuvarsayın Arguumlman olarak aynı tipten iki yapının adreslerini alıp ikinci yapıyı ilkyapıya aktaran yapi_ata adında bir fonksiyon yazın
3 Yeni yapı tipleri tanımlamanın iki youmlntemi vardır yapı kuumlnyesi kullanarak vetypedef kullanarak Aşağıdakini typedef kullanan bir bildirime doumlnuumlştuumlruumlnaylar değişkeni iccedilin yazılmış tanımı da uygun şekilde değiştirin
struct ay char ayadi int ayuzunlugustruct ay aylar[12]
4 İki yerde (yani kalıplarda ve sizeofrsquoun işlenenleri olarak) bir veri tipi verilmesigerekir Bu basit bir tip ismi olabileceği gibi daha karmaşık bir ifade de olabilirBoumlyle bir bağlamda aşağıdakilerin ne anlama geldiğini bulmaya ccedilalışın
int int [3]int ()[3]int (float)int ()(void)
5 Altkısım 581rsquoin başında tanımlanmış bulunan a dizisinin iccedilindekileri goumlruumlntuumllemekiccedilin aşağıdakini deneyin
13
108 TUumlRETİLMİŞ TİPLER VE VERİ YAPILARI BOumlLUumlM 5
include ltstdiohgtvoid main (void) int i j for (i=0 ilt3 i++) for (j=0 jlt4 j++) printf(2dca[ij] j==3 n )
Neden doğru ccedilıktıyı elde edemiyoruz Goumlruumlntuumllenen sayılar nelerdir Beklenenccedilıktıyı elde edecek şekilde programı değiştirin
6 Altkısım 582rsquode verilen oumlrnekte neden sizeof(x) 210rsquodur da sizeof(a)2rsquodir
7 Eğer MS-DOS kullanmakta iseniz MS-DOS elkitabında SORT komutu iccedilinbelirtilenleri okuyup bu boumlluumlmuumln sonunda verilen oumlrnek programı bunları dayapacak şekilde geliştirin Oumlrneğin buumlyuumlk-kuumlccediluumlk harf ayırımı yapmadan sıralamayapmayı veya sıralama yaparken belirli bir kolondan itibaren dikkate almayı sağlayın
8 Aşağıdaki oumlrneklerde const ve volatile anahtar soumlzcuumlklerinin ne işe yaradığınıanlamaya ccedilalışın
int const x = 11int y = 22int const a = ampyconst volatile const b = ampx
13
109
BOumlLUumlM 6 OumlNİŞLEMCİ
1 include ltconiohgt2 define PI 3141592653589793238463 define DEGIS(xytip) tip t t = x x = y 4 y = t 5 ifdef EOF6 define SON EOF7 else8 define SON (-1)9 endif10 ifndef MAKS11 define MAKS(pq) ((p)gt(q) (p) (q))12 endif13 define OZEL static
14 undef OZEL15 if (HDUZ amp 0x40) = 016 printf(satir = dn __LINE__)17 endif
Bu boumlluumlmde hemen her zaman C derleyicisi ile birlikte kullanılan ayrı bir ldquoişlemcirdquoyegoumlz atacağız Bu derlenmeden oumlnce kaynak dosyalarımızı metin youmlnuumlnden oumlnişlemeyetabi tuttuğu iccedilin bu şekilde adlandırılan C oumlnişlemcisidir Oumlnişlemciyi kaynakdosyalarımızı alıp verilen oumlnişlemci emirlerine goumlre yeni bir dosya oluşturan birduumlzenleyici şeklinde duumlşuumlnebiliriz Kabaca durum şoumlyledir
stdiohbenimhprogc
rarr rarr rarr amaccedil kod
Oumlnişlemci aslında derleyici ile buumltuumlnleşmiştir yani genelde ayrı bir sistem programıdeğildir
Bir oumlnişlemci emrini ile sıradan bir C deyimini ne ayırır İlk olarak farklı soumlzdizimiİkinci olarak ta satırın başındaki sayı işareti () Genelde emirler bir satır tutarlar ancakbir satır sonuna bir ters boumlluuml işareti () konularak bir sonraki satıra devam ettirilebilirAyrıca emrin sonunda noktalı virguumll olmadığına dikkat edin
13
110 OumlNİŞLEMCİ BOumlLUumlM 6
Emirler hiccedilbir zaman derleyici tarafından goumlruumlnmezler Oumlnişlemci emirleri ccedilıkarıpyerlerine istenen işlemleri yapar Oumlrneğin bir include emri iccedileren satır yerine emirdebelirtilen dosyanın iccedileriği konur Oumlnişlemci emirleri herhangi bir satıra konabilirler ancakoumlnişlemci accedilıklamaları atladığı iccedilin accedilıklamaların iccediline konulamazlar
Bu boumlluumlmuumln geri kalan kısımlarında oumlnişlemci emirlerini ayrıntılı olarakaccedilıklayacağız
61 define Ve undef Emirleri
define emri belirli karakter dizileri iccedilin (ldquomakrordquo adı da verilen) takma isimlertanımlamaya yarar Soumlzdizimi şoumlyledir
define tanıtıcı_soumlzcuumlk değiştirme_dizisi
Oumlrneğindefine BLOKBASI define BLOKSONU define YORDAM static void
Tanımlanmakta olan tanıtıcı_soumlzcuumlkrsquouumln oumlnuumlnde ve arkasında en az bir tane boşlukkarakteri bulunmalıdır Normal C tanıtıcı soumlzcuumlklerinden ayırt etmek iccedilin bu tuumlr isimlerdebuumlyuumlk harflerin kullanılması alışılagelmiştir Bu isimlerin tanımı undef ile iptaledilmediği suumlrece kaynak dosyanın geri kalan kısmında tanımında ondan sonra gelenkarakter dizisi (yani değiştirme_dizisi) ile değiştirilirler Tanımlanmış bulunan birtanıtıcı_soumlzcuumlk iccedilin ikinci bir define ancak değiştirme_dizisi aynı ise kabuledilebilecektir
Oumlrneğin
YORDAM hepsini_goster ()BLOKBASI BLOKSONU
program parccedilası derlenmeden oumlnce oumlnişlemci tarafından
static void hepsini_goster ()
şeklinde değiştirilecektir Bir istisna Eğer isim tırnak iccedilinde yer alıyorsa makrodeğişikliği yapılmayacaktır Oumlrneğin
printf(BU YORDAM)
deyimi değiştirilmeden aynı şekilde kalacaktır
13
BOumlLUumlM 6 OumlNİŞLEMCİ 111
Tipik olarak define emri program iccedilin sayı karakter dizisi vs değişmezleritanımlamak iccedilin kullanılır ancak değiştirme_dizisi daha oumlnce veya sonra tanımlananmakrolar da dahil her şeyi iccedilerebilir
Daha oumlnce tanımlanmış bir makronun tanımını kaldırmak iccedilin undef emriniarkasına makro ismini belirterek kullanabilirsiniz (Bu boumlluumlmuumln başındaki ilk oumlrnekteSatır 13 ve 14rsquoe bakınız) Yani
undef tanıtıcı_soumlzcuumlk
Makrolara arguumlman da verilebilir (Boumlluumlmuumln başında Satır 3 ve 11rsquoe bakınız) Genelşekil şoumlyledir
define tanıtıcı_soumlzcuumlk(tanıtıcı_soumlzcuumlkopt ) değiştirme_dizisi
Makro ismi ile ldquobiccedilimsel arguumlman listesirdquo iccedilindeki ilk parametreden oumlnce gelen solparantez arasında herhangi bir boşluk bulunmamalıdır Bir fonksiyona benzemesinerağmen bazı farklar vardır Makrolar ldquosatıriccedili kodrdquo oluştururlar yani makronunkullanıldığı her sefer biccedilimsel arguumlmanlar yerine gerccedilek arguumlmanlar konularak ilgilideğiştirme_dizisi onun yerini alır Makro ccedilağrısındaki arguumlmanların sayısı bildirimdebelirtilmiş bulunan biccedilimsel arguumlmanların sayısı ile aynı olmalı ve virguumlllerleayrılmalıdırlar Tırnak işaretleri iccedilinde veya bir ccedilift parantez arasında bulunan virguumlllergerccedilek arguumlman ayırıcıları olarak sayılmazlar
Oumlrneğin Satır 11rsquode tanımlanmış makroya bir ccedilağrı iccedilerenm = MAKS(x=10 cyz) + 5
ifadesi oumlnişlemci tarafındanm = ((x=10)gt(cyz) (x=10) (cyz)) + 5
şeklinde ldquoaccedilılacaktırrdquo Şimdi makro tanımında parametreler etrafında neden parantezkullanmış olduğumuzu goumlruumlyorsunuz Hepsi gereklidir Aksi takdirde istenen sonuccedil eldeedilemeyecektir Eğer inanmıyorsanız bir de parantezler olmadan deneyin (İşleccediloumlnceliklerini unutmayın) Boumlyle durumlar iccedilin kural şoumlyledir
bull İlk olarak değiştirme_dizisini sol parantezle başlatıp sağ parantezle bitirin Azoumlnceki oumlrnekte olduğu gibi genelde bir makro ifadenin bir boumlluumlmuumlnuuml oluşturur Buaynı zamanda Satır 8rsquodeki tanımda da gerekli idi [Neden ldquoif (kar SON)rdquodurumunu inceleyin]
bull İkinci olarak değiştirme_dizisindeki buumltuumln parametreleri parantez iccediline alın Ccediluumlnkuumlgerccedilek arguumlmanların karmaşık ifadeler olabileceğini unutmayın
Bir oumlnceki oumlrnekte olduğu gibi dikkat ettiyseniz makro accedilılımından sonra bazıhesaplamalar birden fazla kez yapılabilir Oumlrneğin ldquox=10rdquo atama deyimi Bu durumverimsiz olması dışında bazı beklenmeyen sonuccedilların ccedilıkmasına da neden olabilirOumlrneğin irsquonin değerinin 6 olduğunu varsayın ldquoMAKS(6i++)rdquonin değeri ne olacaktır6 mı Bakalım Oumlnişlemci ldquo((6)gt(i++) (6) (i++))rdquo şeklinde accedilacaktırBoumlylece değeri 7 olacaktır Ayrıca irsquonin yeni değeri 7 değil de 8 olacaktır
13
112 OumlNİŞLEMCİ BOumlLUumlM 6
Eğer değiştirme_dizisinde bir parametrenin oumlnuumlne konursa makro accedilılımındansonra ccedilift tırnak iccediline alınacaktır yani arguumlman bir karakter dizisine doumlnuumlştuumlruumllecektirAyrıca boumlyle bir arguumlmanın iccedilinde bulunan ve karakterlerinin oumlnuumlne eklenecektir
Eğer değiştirme_dizisi iccedilinde bir simgesi varsa bu işlecin oumlnuumlnde ve arkasındabulunan isimlerin birbirine yapıştırılacağı şekilde ve etrafındaki her tuumlrluuml beyazboşluk karakteri ccedilıkarılacaktır Oumlrneğin
define cagir(x) yord x()
tanımını ele alalım Bu makroyucagir(1)
şeklinde kullandığımızdayord1()
şeklinde accedilılacaktır
62 include Emri
include dosya_adı
include ltdosya_adıgt
veya
include karakter_dizisi
şeklindeki bir satır oumlnişlemcinin bu satır yerine belirtilen dosyanın iccedilindekilerinikoymasını sağlar Dosyanın iccedilinde uygun C kodunun bulunması gerektiği accedilıktır İlk şekiloumlnişlemcinin dosya_adı iccedilin oumlnce varsayılan altdizine yani derlenmekte olan kaynakdosyanın bulunduğu altdizine daha sonra ldquostandart yerlerrdquoe bakmasını sağlayacaktırİkinci şekil sadece standart yerlerde aramaya neden olur ldquoStandart yerlerrdquo derken bu tuumlrdosyaların bulunduğu oumlnişlemci tarafından bilinen altdizinlerden soumlzetmekteyizDosya_adına bazen başlık dosyası adı da verilir Uumlccediluumlncuuml şekilde ise oumlnişlemci tarafındandefine ile tanımlanmış karakter_dizisi accedilıldığında ilk iki şekilden birisinin eldeedilmesi beklenir
Sistemimizde standart yerler ldquoINCLUDErdquo adındaki MS-DOS ortam değişkenindebelirtilir Oumlrneğin
SET INCLUDE=aktphnmainclude
MS-DOS komutu oumlnişlemcinin dosyayı bulması iccedilin belirtilen iki altdizine bakmasınısağlayacaktır Eğer includersquoun ccedilift tırnaklı olanı kullanılırsa oumlnce varsayılan aldizinebakılacaktır Ayrıca isterseniz include emrindeki dosya_adında dosya isminin oumlnuumlnealtdizin ismini de belirtebilirsiniz
13
BOumlLUumlM 6 OumlNİŞLEMCİ 113
Son bir nokta include emirleri (8 duumlzeye kadar) iccediliccedile yazılabilir buinclude edilen bir dosyanın iccedilinde başka include emirleri de bulunabiliranlamına gelir
63 Koşullu Derleme
if ifdef ifndef else elif ve endif emirleri bazı koşullara bağlıolarak derlemeyi kontrol ermek iccedilin kullanılırlar
if değişmez_ifade
emri eğer değişmez_ifadenin değeri doğru (sıfırdan farklı) ise bir sonraki endif veyaelse (veya elif) emrine kadar olan satırların derlemeye dahil edilmesini sağlar İlkdurumda derleme endifrsquoten sonra normal olarak devam eder ikinci durumda iseelsersquoden sonra ilgili endifrsquoe kadar olan satırlar oumlnişlemci tarafından atlanır (yaniderleyiciye goumlnderilmez) Eğer değişmez_ifadeni değeri yanlış (0L) ise if ile endifveya else (hangisi oumlnce geliyorsa) arasındaki metin atlanır if emirlerinin iccediliccedileyazılabildiğine dikkat edin bunun iccedilin hangi elsersquoin hangi ifrsquoe ait olduğunubilmemiz gerekir else bir endif ile bağlantısı olmayan yukarıdaki en yakın ifrsquoeaittir Değişmez_ifade oumlnişlemcinin ldquooumlnişlem zamanındardquo hesaplayabileceği herhangi birC ifadesidir sizeof ve kalıp işleccedilleriyle sayım ve kayan noktalı sayı değişmezleriburada kullanılamazlar Daha oumlnce oumlnişlemciye tanımlanmış makrolar ise kullanılabilirlerancak tanımsız isimlerin yerine 0L konur Değişmez_ifade her zaman long duyarlıktahesaplanır
Bir emir satırında
defined tanıtıcı_soumlzcuumlk
şeklindeki bir ifade eğer tanıtıcı_soumlzcuumlk oumlnişlemci tarafından biliniyorsa 1L iledeğiştirilir aksi takdirde 0L konur
Bir oumlrnek olarak iki muumlşteri iccedilin hazırlanmış bir programı ele alalım Program iccedilindebelirli bir muumlşteri iccedilin gerekli boumlluumlmler olabilir Derlemeyi kontrol etmek iccedilin şu ankiderlemenin hangi muumlşteri iccedilin yapıldığını goumlsteren bir tanıtıcı soumlzcuumlk tanımlayabilirizOumlrneğin
define MUSTERI 1 diger must icin baska bir deger if MUSTERI == 1 ilk musteri icin kod else ikinci musteri icin kod endif
Bu arada
13
114 OumlNİŞLEMCİ BOumlLUumlM 6
ifdef tanıtıcı_soumlzcuumlk
ve
ifndef tanıtıcı_soumlzcuumlk
emirleri sırasıyla tanıtıcı_soumlzcuumlkrsquouumln oumlnişlemci tarafından define ile tanımlanmış olupolmadığını test ederler Bunlar sırasıyla
if defined tanıtıcı_soumlzcuumlk
ve
if defined tanıtıcı_soumlzcuumlk
emirleriyle eşdeğerdirler
elif değişmez_ifade
emrielseif değişmez_ifade
iccedilin bir kısaltma şeklinde duumlşuumlnuumllebilir ancak elif kullanıldığında yeni bir endifrsquoegerek kalmaz oumlnceki ifrsquoin endifrsquoi kullanılır
Başka bir oumlrnek olarak hataların duumlzeltilmekte olduğu bir program duumlşuumlnuumln boumlylecebu programda htkntrl adlı bir fonksiyona bazı yerlerde ccedilağrılar olmaktadır (Bufonksiyon oumlrneğin bazı değişkenlerin o anki değerlerini basıyor olabilir) Ancakprogram geliştirilmesi sonunda programı ldquonormalrdquo bir şekilde derlememiz gerekecektirBunu yapmanın kolay bir yolu da şoumlyledir
ifndef HATASIZ hata duzeltme yardimci fonksiyonu iceren baslik dosyasi include htkntrlhelse define htkntrl()endif
Eğer HATASIZ adlı tanıtıcı soumlzcuumlk define ile tanımlanmamışsa o zamaninclude emri oumlnişlemeye girecek ve htkntrl fonksiyonu da dahil hata duumlzeltmeyardımcı programları iccedileren ldquohtkntrlhrdquo dosyasının iccedilindekileri derlenecektir Ancakeğer HATASIZ define ile tanımlanırsa o zaman boş bir değiştirme dizisine sahipolan htkntrl makrosu define ile tanımlanmış olacaktır Bu durumda htkntrlrsquoeyapılan ccedilağrılar oumlnişlemci tarafından boşlukla değiştirilecektir Buna benzer ifemirleri programın başka boumlluumlmlerinde de konulabilir HATASIZ tanıtıcı soumlzcuumlğuumlprogramın başında tanımlanabileceği gibi UNIX veya sistemimizde olduğu gibi C(oumlnişlemcisi ve) derleyicisinin ccedilağrıldığı komut satırında belirtilebilir Ek Brsquoye bakınız
13
BOumlLUumlM 6 OumlNİŞLEMCİ 115
64 Diğer Emirler
Pek kullanılmayan bir emir de aşağıdakidir
line değişmez dosya_adıopt
Burada değişmez bir değişmez ifade değil 1 ile 32 767 arasında bir tamsayıdeğişmezidir Dosya_adı ise bir karakter dizisidir Bu emir derleyicinin şu anki satırsayısını unutup derlemekte olduğu satırın sayısının sanki değişmez ile ifade edilen sayıimiş gibi davranmasını sağlar Yani emirden sonraki beşinci satırda bir hata olursaldquodeğişmez+4 nolu satırda hata varrdquo şeklinde bir hata mesajı ortaya ccedilıkacaktır İsteğebağlı olan ikinci arguumlman ise derleyicinin şu anda derlenmekte olan dosyanın adınınsanki dosya_adı imiş gibi bir varsayımda bulunmasına neden olur Dosya_adının iccedilindealtdizin de belirtilmişse bu include dosyaları iccedilin taranacak olan varsayılan altdizinide etkileyebilir (Kısım 62rsquodeki tartışmaya bakınız)
error karakter_dizisi
şeklindeki bir satır oumlnişlemcinin karakter_dizisini de iccedileren bir mesaj yazmasınısağlayacaktır
pragma karakter_dizisi
şeklindeki bir oumlnişlemci emri oumlnişlemci veveya derleyicinin karakter_dizisi iccedilindebelirtilen bir işlem yapmasına neden olacaktır Karakter_dizisi iccedilin kabul edilebilecekdeğerler C Standardında belirtilmemiştir Onun iccedilin bu tamamen uygulamaya bağlı biroumlzelliktir ve dikkate de alınmayabilir
En son olarak goumlruumlnen tek karakteri olan bir satır dikkate alınmaz ve atlanır
65 Oumlnceden Tanımlanmış İsimler
Oumlnişlemci ayrıca bazı tanıtıcı soumlzcuumlkleri oumlnceden define ile tanımlamıştır Bunlarıntanımının undef ile kaldırılması veya define ile yeniden tanımlanmaları muumlmkuumlndeğildir Bunlar şunlardır
__FILE__ Derlenmekte olan dosyanın adı (karakter dizisi)__LINE__ Şu anki kaynak satır numarası (ondalık sayı)__DATE__ Tarih (ldquoAaa gg yyyyrdquo şeklinde karakter dizisi)__TIME__ Saat (ldquossddssrdquo şeklinde karakter dizisi)__STDC__ Standarda uyan derlemeler iccedilin 1 değişmezi
13
116 OumlNİŞLEMCİ BOumlLUumlM 6
66 Bir Oumlrnekmdashctypeh Başlık Dosyası
Aşağıda ctypeh başlık dosyasının basitleştirilmiş ve Tuumlrkccedileleştirilmiş bir uyarlamasıverilmektedir
1 2 ctypeh - karakter donusum makrolari ve ctype makrolari3 4 Copyright (c) 1985-1992 Microsoft Corp Her hakki saklidir5 6 Amac7 Karakter siniflandirmasi ve donusumu icin makrolar tanimlar8 [ANSISistem V]9 10 1112 ifndef _INC_CTYPE1314 1516 Asagidaki tanim kullanicinin ctypeobjda17 tanimlanmis bulunan _ctype adli karakter tipi18 dizisine erisimini saglar19 2021 extern unsigned char _ctype[]2223 olasi karakter tipleri icin bit ortulerinin tanimlanmasi 2425 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 3435 3637 karakter siniflandirilmasi ile ilgili makro tanimlari 3839 define isalpha(_c) ( (_ctype+1)[_c] amp (_UPPER|_LOWER) )40 define isupper(_c) ( (_ctype+1)[_c] amp _UPPER )41 define islower(_c) ( (_ctype+1)[_c] amp _LOWER )42 define isdigit(_c) ( (_ctype+1)[_c] amp _DIGIT )43 define isxdigit(_c) ( (_ctype+1)[_c] amp _HEX )44 define isspace(_c) ( (_ctype+1)[_c] amp _SPACE )45 define ispunct(_c) ( (_ctype+1)[_c] amp _PUNCT )46 define isalnum(_c) ( (_ctype+1)[_c] amp (_UPPER|_LOWER|_DIGIT) )47 define isprint(_c) ( (_ctype+1)[_c] amp (_BLANK|_PUNCT| 48 _UPPER|_LOWER|_DIGIT))49 define isgraph(_c) ( (_ctype+1)[_c] amp (_PUNCT|_UPPER| 50 _LOWER|_DIGIT) )51 define iscntrl(_c) ( (_ctype+1)[_c] amp _CONTROL )52 ifndef __STDC__53 define toupper(_c) ( (islower(_c)) _toupper(_c) (_c) )
13
BOumlLUumlM 6 OumlNİŞLEMCİ 117
54 define tolower(_c) ( (isupper(_c)) _tolower(_c) (_c) )55 endif56 define _tolower(_c) ( (_c)-A+a )57 define _toupper(_c) ( (_c)-a+A )58 define __isascii(_c) ( (unsigned)(_c) lt 0x80 )59 define __toascii(_c) ( (_c) amp 0x7f )6061 genisletilmis ctype makrolari 6263 define __iscsymf(_c) (isalpha(_c) || ((_c) == _))64 define __iscsym(_c) (isalnum(_c) || ((_c) == _))6566 6768 define _INC_TYPE69 endif
Bu dosyanın başında (_ctype) extern dizisinin bildirimi yapılmaktadır Bu 129elemanlık bir dizidir İlk elemanının değeri 0rsquodır boumlylece ikinci elemandan başlamamızgerekir İlk elemanını atlamak iccedilin dizi şu şekilde indislenebilir
(_ctype+1)[indis]
Her eleman indis olarak kullanılan karaktere karşılık gelen bir kod iccedilerir Oumlrneğin
(_ctype+1)[ ]rsquoin değeri 0x48rsquodir(_ctype+1)[A]rsquoin değeri 0x81rsquodir
Bu sayılar herbirinin oumlzel bir anlamı olan 8 bitten oluşmaktadır Bu bitlerin anlamları25rsquoten 33rsquoe kadar olan satırlarda verilmiştir Oumlrneğin 0x48 _BLANK (boşluk) ve_SPACE (goumlruumlnmeyen karakter) anlamına gelir 0x81 _HEX (onaltılı rakam) ve _UPPER(buumlyuumlk harf) demektir Bu bilgi ile ldquoisrdquo (dır) makrolarının nasıl ccedilalıştığını accedilıklamakzor olmayacaktır __isascii (ASCII karakteri) olup olmadığını test eder
Diğer makroların accedilıklaması kolaydır ve okuyucuya bırakılmıştır
Problemler
1 Yeni tipler tanımlamak iccedilin en az iki yolunuz vardır Bir oumlnişlem esnasındadefine kullanarak iki derleme sırasında typedef anahtar soumlzcuumlğuumlnuumlkullanarak definersquoın typedef yerine kullanılamayacağı bir oumlrnek verin
2 Makrolar karakter dizileri yani ccedilift tırnak iccedilinde ise accedilılmazlar Ancak makroparametreleri makro tanımında tırnak iccedilinde olsalar bile değiştirilebilirler Standartaccedilıkccedila bunu yasaklamaktadır ve bizim oumlnişlemcimiz de bunu yapmamaktadırSizinkinin de aynı şeyi yapıp yapmadığını deneyerek goumlruumln ve bu ldquooumlzelliğirdquo kullananyararlı bir oumlrnek verin
3 _ctype dizisini kullanmadan ctypeh dosyasında tanımlanmış bulunan ldquoisrdquo(dır) makrolarına eşdeğer uyarlamalar tanımlayın Bir oumlrnek aşağıda verilmiştir
13
118 OumlNİŞLEMCİ BOumlLUumlM 6
define isalpha(_c) (((_c)gt=A ampamp (_c)lt=Z) || ((_c)gt=a ampamp (_c)lt=z))
4 Anahtar soumlzcuumlkleri Tuumlrkccedile Almanca İtalyanca veya başka bir dilde olan Cprogramları yazmanızı sağlayacak definersquolar yazın
13
119
BOumlLUumlM 7 DOSYALAR VEGİRDİCcedilIKTI
Alıştığımız değişkenlerden farklı olarak bir dosya programın yuumlruumltuumllmesinden oumlnceveveya sonra da var olan bir nesnedir ldquoKalıcı olmardquo oumlzelliği dosyaları ccedilok yararlı kılarŞimdiye kadar goumlrduumlğuumlmuumlz programlarda olduğu gibi dosyalar sayesinde programlarkullanıcılarıyla veya birbirleriyle haberleşebilirler C dilinde dosyalar istenildiği kadaruzun olabilen karakter (bayt) sıraları şeklinde goumlruumlluumlrler Ancak daha karmaşık bir yapıkullanıcı tarafından uygulamaya goumlre verilebilir Bu boumlluumlmuumln buumlyuumlk bir kısmıdosyalarla ilgili ccedileşitli işlemler ve girdiccedilıktı yapmak iccedilin bize yardımcı olacak standartkuumltuumlphaneyi anlatacaktır Bu boumlluumlmde anlatılan fonksiyonlar birccedilok C ortamındasağlananların sadece kuumlccediluumlk bir kısmıdır Daha fazla bilgi iccedilin ilgili başvuru elkitaplarınadanışın
Kullanıcı programları işletim sistemi adı verilen karmaşık bir sistem programınıngoumlzetimi altında ccedilalıştırılırlar Programların işletim sistemine ccedileşitli işlemler yaptırmasıiccedilin C kuumltuumlphanesi bazı yordamlar iccedilerir C farklı sistemlerde uygulandığı iccedilinkuumltuumlphanenin bu boumlluumlmuuml pek standart değildir Bu boumlluumlmde tartışılacak başka bir konu dabizim sistemin C ile nasıl etkileştiğidir
Kısım 71rsquoden 74rsquoe kadar anlatılan fonksiyonlar Standardın bir parccedilasıdır vestdioh başlık dosyasında bildirilmiştir Kısım 75rsquoteki fonksiyonların bildirimistdlibh standart başlık dosyasında bulunmaktadır Ancak Kısım 76rsquodakilerStandardın bir parccedilası değildir buna rağmen birccedilok ortamda desteklenmektedir
71 Dosya Esasları
Program bir dosya uumlzerinde herhangi bir işlem yapmadan oumlnce dosyanın accedilılmasıgerekmektedir fopen standart fonksiyonu bunu yapar ve iki karakter dizisi arguumlmanalır accedilılacak olan dosyanın adı ve erişim modu İlk arguumlman herhangi geccedilerli bir dosya
13
120 DOSYALAR VE GİRDİCcedilIKTI BOumlLUumlM 7
adı iccedilerebilir dosya adının oumlnuumlne suumlruumlcuuml ve altdizinler de belirtilebilir İkinci arguumlmanınalabileceği değerler ve anlamları aşağıdaki ccedilizelgede goumlsterilmiştir
değer erişim modur okumaw yeniden yazmaa sona eklemer+ okuma ve yazma (değiştirme)w+ okuma ve yeniden yazma (değiştirme)a+ okuma ve ekleme
Varolmayan bir dosyadan okumaya kalkmak hatadır Yeni bir dosya yaratmanın yoluvarolmayan bir dosya adı verip a veya w belirtmektir Eğer erişim modununsonuna b harfi eklenirsemdashoumlrneğin rbmdashikili (ham) modda girdiccedilıktı yapılacaktır aksitakdirde metin girdiccedilıktısı yapılır Eğer accedilma işlemi başarılı ise fopen accediltığı dosyaya birdosya goumlstergesi doumlnduumlruumlr yoksa standart kuumltuumlphanede de bulunan NULL yani boşgoumlsterge doumlnduumlruumlr
Dosya goumlstergeleri şu şekilde tanımlanmalıdırFILE dosya_gostergesi
FILE buumltuumln dosyaların tipidir kuumltuumlphanede tanımı bulunan bir yapıdır ve bu tanımındetayları normal kullanıcıları ilgilendirmez Gelin bir dosya oluşturalım
dosya_gostergesi = fopen(DOSYAYEN w)
Bundan sonra DOSYAYEN ile ilgili işlemlerde dosya_gostergesikullanılacaktır
Bir program ekrana bilgi goumlruumlntuumllediği zaman aslında standart ccedilıktı dosyasınakarakter yazmaktadır Programınıza klavyeden bilgi girdiğinizde aslında bunları standartgirdi dosyasına yazmaktasınız ve program bu dosyayı okumaktadır ldquoStandart dosyalarrdquoprogramcı tarafından fopen kullanılarak accedilılmazlar yuumlruumltme başlamadan oumlnceotomatik olarak accedilılıp normalde kullandığınız ekran ve klavyeye atanırlar Kuumltuumlphanebu iki dosya iccedilin de dosya goumlstergeleri iccedilermektedir standart girdi dosyası iccedilin stdinstandart ccedilıktı dosyası iccedilin de stdout
Bazı durumlarda hata mesajları iccedilin ayrı bir ccedilıktı akışının olması uygun olabilir Cbir standart hata dosyası sağlamaktadır bu dosyaya olan goumlstergenin adı stderrrsquodirNormalde stderrrsquoe giden ccedilıktı stdoutrsquoınkiyle birlikte aynı aygıta yapılır ancak bunudeğiştirmenin yolları vardır stdin stdout ve stderr değişmez goumlstergelerdironları kullanırken bunu unutmayın
Şimdi bir dosyayı nasıl accedilacağımızı bildiğimize goumlre gelin ona nasıl yazacağımızabakalım dosya_gostergesi tarafından işaret edilen dosyaya kar karakteriniyazmak iccedilin putc fonksiyonunu kullanırız
putc(kar dosya_gostergesi)
13
BOumlLUumlM 7 DOSYALAR VE GİRDİCcedilIKTI 121
putc aslında karakterleri bir tampon boumllgeye koymakta ve bu boumllge dolduğundaiccedilindekileri dosyaya aktarmaktadır Eğer dosyaya tamponun boyundan daha az miktardabirkaccedil karakter yazmak isterseniz ne olacaktır Tamponu ldquoboşaltmakrdquo iccedilin bir yolgereklidir fclose fonksiyonu diğer işlerin yanında bunu yapmaktadır fclosersquoundosya goumlstergesi olan bir arguumlmanı vardır
fclose(dosya_gostergesi)
ccedilalıştırıldıktan sonra dosya kapatılır ve dosya_gostergesi artık ona işaret etmezfclose fopenrsquoin ldquotersirdquodir fopen ile accediltığınız her dosyayı fclose ile kapatmanızgerekir Sistemden sisteme fark etmekle beraber herhangi bir zamanda accedilık olan dosyasayısında bir sınırlama olduğu iccedilin bu ayrıca gerekli de olabilir Program normal olaraksona erdiğinde buumltuumln accedilık dosyalar fclose ile kapatılır
Okuma iccedilin accedilılmış ve dosya_gostergesi tarafından işaret edilen bir dosyadanbir karakter okumak iccedilin getc kullanılır
kar = getc(dosya_gostergesi)
Eğer okuyacağı karakter kalmazsa getc ne yapar Dosya sonuna ulaştığınıgoumlstermek iccedilin oumlzel bir değer doumlnduumlrmesi gerektiği accedilıktır Bu değer bir karakterolmamalıdır ccediluumlnkuuml aksi takdirde getcrsquonin dosyadan bir karakter mi okuduğunu yoksadosya sonunu mu işaret etmek istediğini anlıyamayacağız Boumlyle bir durumda getcEOF değişmezini doumlnduumlruumlr Kuumltuumlphane genelde EOFrsquou (-1) olarak tanımlar Bu değeride tutmak iccedilin yukarıda kullanılan kar ldquokarakterirdquonin bir char değil de bir int olaraktanımlanması gerektiğine dikkat edin Boumlylece her seferinde dosyadan bir karakterokuyup o karakter iccedilin bir şey yapan ve dosyada karakter kalmadığı zaman sona eren birprogram parccedilası şu şekilde olacaktır
if ((kar=getc(dosya_gostergesi))=EOF) karrsquoa goumlre işlem yap else programı bitir
72 Dosya ErişimimdashBaşka Youmlntemler
fopen fclose putc ve getc ile ccedilok yararlı şeyler yapılabilir fakat C kolaylık iccedilinbaşka ldquodaha gelişmişrdquo dosya erişim youmlntemleri de sağlar Zaten bildiğiniz getchar veputchar boumlyle iki oumlrnektir Sistemimizde stdioh dosyasında şu şekildetanımlanmışlardır
define getchar() getc(stdin)define putchar(c) putc((c)stdout)
Doğal olarak programcılar bir seferde birden fazla karakter yazabilen fonksiyonlaragereksinim duyarlar İşte bunu yapan fputs fonksiyonu
fputs(kar_dizisi dosya_gostergesi)
13
122 DOSYALAR VE GİRDİCcedilIKTI BOumlLUumlM 7
Bu kar_dizisi adlı karakter dizisinin dosya_gostergesi tarafından işaret edilendosyaya yazılmasını sağlar Dizinin sonundaki boş karakter yazılmaz Bu fonksiyonun daputs adında ldquostandart dosyardquo uyarlaması bulunmaktadır
puts(kar_dizisi)
kar_dizisirsquoni stdoutrsquoa yazar ve fputsrsquotan farklı olarak yeni satır karakteri yazıpyeni bir satıra geccediler
Kuumltuumlphanede ayrıca bir seferde bir satır okuyan fgets adında bir fonksiyonbulunmaktadır
fgets(kar_dizisi maks_uzunluk dosya_gostergesi)
dosya_gostergesi tarafından işaret edilen dosyanın bir sonraki satırından en fazlamaks_uzunluk-1 sayıda karakteri kar_dizisi iccediline okuyup eğer dosya sonudeğilse kar_dizisirsquoni (bir goumlsterge) aksi takdirde NULL doumlnduumlruumlr (Bir satır sadecesonunda yeni satır karakterinin bulunduğu bir karakter sırasıdır) kar_dizisi iccedilineaktarılan satırın sonuna boş karakter eklenir
Standart girdi fonksiyonu gets biraz fgetsrsquoe benzer
gets(kar_dizisi)
stdinrsquoden bir satır okuyup kar_dizisi ile başlayan yere koyar fgetsrsquoten farklıolarak gets kar_dizisirsquone yeni satır karakterini koymaz
Kolaylık isteyen programcılar karakter dizisi-sayı doumlnuumlşuumlmlerinin fonksiyontarafından yerine getirildiği herhangi bir tipten sayıların dosyaya yazılmasını veya oradanokunmasını isterler Bu gereksinimler fprintf ve fscanf fonksiyonları tarafındanyerine getirilirler
fprintf(dosya_gostergesi kontrol_karakter_dizisi arguumlman_listesi)
ccedilağrısı kontrol_karakter_dizisi iccedilindeki sıradan karakterlerle arguumlman_listesinden aldığıarguumlmanları uygun bir şekilde biccedilimlendirerek dosya_gostergesi tarafından işaretedilen dosyaya yazar Kontrol_karakter_dizisi ve arguumlman_listesi iccedilin kurallarprintfrsquoteki gibidir
fscanf(dosya_gostergesi kontrol_karakter_dizisi arguumlman_listesi)
ccedilağrısı dosya_gostergesi tarafından işaret edilen dosyadan bir karakter dizisi okurkontrol_karakter_dizisine goumlre doumlnuumlşuumlmleri yapıp değerleri arguumlman_listesindekiarguumlmanlar tarafından goumlsterilen yerlere koyar Kurallar scanfrsquoteki gibidir Arguumlmanlariccedilin doğru biccedilimleri ve doğru sayıda arguumlman sayısını vermek kullanıcınınsorumluluğundadır
printf ve scanf fonksiyonları fprintf ve fscanfrsquoin oumlzel uyarlamalarıdır İlkarguumlman olarak dosya goumlstergesi yoktur bunlar sırasıyla stdout ve stdinrsquoikullanırlar
13
BOumlLUumlM 7 DOSYALAR VE GİRDİCcedilIKTI 123
Bu fonksiyon ailesinin başka iki uumlyesi de sprintf ve sscanfrsquotir Bunlar dosyayaerişmezler onun yerine ilk arguumlman olarak belirtilen bir karakter dizisi uumlstuumlnde ccedilalışırlar
sprintf(kar_dizisi kontrol_karakter_dizisi arguumlman_listesi)
ccedilağrısı tıpkı fprintf gibi kontrol_karakter_dizisi ve arguumlman_listesi ile normal biccedilimdoumlnuumlşuumlmlerini yapar sonucu fprintfrsquoten farklı olarak kar_dizisirsquone koyar Bunabenzer olarak
sscanf(kar_dizisi kontrol_karakter_dizisi arguumlman_listesi)
ccedilağrısı scanfrsquoin stdinrsquoi taradığı şekilde kar_dizisirsquonin taranıp değerlerinnormalde olduğu gibi arguumlman_listesinin elemanları tarafından goumlsterilen yerlerekonmasını sağlar Oumlrneğin
sprintf(kar_dizisi abcdcba 100)
deyimi kar_dizisirsquonin iccediline abc100cba koyar eğer ondan sonra
sscanf(kar_dizisi abcd ampint_deg)
deyimi işletilirse beklendiği gibi int_degrsquoin iccediline 100 konur
73 Rastgele Erişim
Normalde bir dosya accedilıldıktan sonra ilk okuma veya yazma işlemi dosyanın hemenbaşından yapılır Bir sonraki işlem ise en son işlem tarafından etkilenen son baytı izleyenbayttan başlayarak yapılır Bundan dolayı buna sıralı erişim denir Bunu yapmadan yanioumlnceki baytları okuyup veya yazmadan istediğimiz bir bayta ulaşmak (yani rastgeleerişim yapmak) iccedilin fseek kullanırız
fseek(dosya_gostergesi uzun_sayi nereden)
Yukarıdaki ccedilağrıda ilk iki arguumlmanın tipleri isimlerinden anlaşılabilir nereden iseya SEEK_SET (dosyanın başından) ya SEEK_CUR (şu anki konumundan) yadaSEEK_END (dosyanın sonundan) olabilir fseek işletildikten sonradosya_gostergesi tarafından işaret edilen dosya uumlzerindeki okuma veya yazmanereden ile belirtilmiş yerden uzun_sayi mesafedeki bayttan başlıyacaktır Eğerherhangi bir hata olursa fseek sıfırdan farklı bir sayı doumlnduumlruumlr aksi takdirde 0 verirBir metin dosyasında bir karakterin konumunun hesaplanmasının anlamlı yada en azındantaşınabilir bir oumlzellik olmadığına dikkat edin fseek tamamen ikili (ham) girdiccedilıktıiccedilindir
Eğer birtakım işlemlerden sonra dosyanın başından kaccedil bayt ileride olduğunuzuoumlğrenmek isterseniz ftell kullanın
uzun_sayi = ftell(dosya_gostergesi)
uzun_sayirsquoya miktarı koyacaktır eğer bir hata olursa -1L verecektir
13
124 DOSYALAR VE GİRDİCcedilIKTI BOumlLUumlM 7
Sık sık dosyayı ldquogeri sarmakrdquo yani başına fseek yapmak isteyebilirsiniz
rewind(dosya_gostergesi)
bunu yapmanın kısa bir yoludur
74 Dosyalarla İlgili Başka Bilgiler
ldquoOkumardquo fonksiyonları veya makrolarının okuduğu şey ungetc tarafından etkilenebilir
ungetc(kar dosya_gostergesi)
ccedilağrısı dosya_gostergesi ile işaret edilen dosyadan yapılacak bir sonraki okumaişlemi (getc fgets fscanf vs) tarafından dosyada var olan karakterlerden oumlncekarrsquoda verilen karakterin okunmasını sağlar ungetc ile okuma işlemi arasında fseekyapılırsa ungetc ile saklanan karakter unutulacaktır ungetc isminin aslında birazyanıltıcı olmasına rağmen ungetc genelde okunmaması gerekirken okunmuş birkarakterin sanki okunmamış gibi geri alınmasını sağlar Her dosya iccedilin en fazla birkarakter bu şekilde geri konabilir ungetc işlemi başarısız olursa EOF doumlnduumlruumlluumlr
Dosyaları oluşturduğunuz gibi onları silebilirsiniz de Dosyanın ismi dosya_adiise o zaman
remove(dosya_adi)
yazın Dosya bu altdizinden silinmiş olacaktır Eğer dosyanın ait olduğu tek altdizin bu isedosya sistemden tamamen silinecektir (Bir altdizin başka altdizin veya dosya isimleriiccedilerebilen bir rehber olarak duumlşuumlnuumllebilir) Eğer işlem başarılı ise remove 0doumlnduumlrecektir
Buna benzer olarak bir dosyanın adını değiştirmek istiyorsanızrename(eski_dosya_adi yeni_dosya_adi)
kullanın
Bilgi oumlbekleri okumak veya yazmak iccedilin iki yararlı fonksiyon vardırfread(gosterge boy sayi dosya_gostergesi)
vefwrite(gosterge boy sayi dosya_gostergesi)
fread dosya_gostergesi tarafından işaret edilen dosyadan gosterge ile işaretedilen diziye boy uzunluğunda sayi kadar nesne aktaracaktır fwrite ise bu işlemiters youmlnde yapacaktır Bu fonksiyonlar aktarılan nesne sayısını doumlnduumlruumlrler eğer bir hataolmuşsa bu sayı sayirsquodan az olacaktır
Ccedilok girdiccedilıktı oumlrneğin bir aktarma işlemi yapan bir program dosyalar iccedilin buumlyuumlktampon boumllgeleri kullanırsa kazanccedillı ccedilıkacaktır Tamponlu girdiccedilıktı yapmak iccedilin standartkuumltuumlphane iki fonksiyon sağlamaktadır Bunlar fopenrsquodan hemen sonra ccedilağrılmalıdır
13
BOumlLUumlM 7 DOSYALAR VE GİRDİCcedilIKTI 125
setbuf(dosya_gostergesi tampon)
fonksiyonu normalde
char tampon [BUFSIZ]
olarak tanımlanması gereken tampon dizisini dosya iccedilin tampon boumllge haline getirirBUFSIZ stdioh dosyasında tanımlanmış olan uygun bir değişmezdir Eğer tamponyerine NULL verirsek tamponlama ortadan kalkar
Tampon boyunun kullanıcı tarafından belirlendiği daha iyi bir fonksiyon ise şoumlyledirsetvbuf(dosya_gostergesi tampon mod tampon_boyu)
Burada mod ya _IOFBF (tam tamponlama) ya _IOLBF (metin dosyaları iccedilin satırtamponlama) yada _IONBF (tamponlamanın kaldırılması) olabilir Eğer tampon NULLise tampon_boyu boyundan bir tampon boumllgesi setvbuf tarafından ayrılacaktırİşlem başarılı ise bu fonksiyon 0 doumlnduumlruumlr
Son olarakfflush(dosya_gostergesi)
fonksiyonu tamponda bilgi varsa bunun dosyaya aktarılmasını sağlar Sadece bir ccedilıktıdosyası iccedilin kullanılabilir ve bir hata durumunda EOF aksi durumda 0 doumlnduumlruumlr
75 Sistem İle İlgili Fonksiyonlar
İlginccedil bir fonksiyon olan system bir C programı iccedilinden işletim sisteminizin kabuledebileceği herhangi bir komutu ccedilalıştırmanızı sağlar
system(kar_dizisi)
ccedilağrısı yapıldığında kar_dizisi iccedilindeki işletim sistemi komutu ccedilalıştırılır bu komuttamamlandıktan sonra ise program normal bir şekilde devam eder Oumlrneğin
system(DIR CMSVCINCLUDEH)
ifadesi cmsvcinclude altdizini iccedilinde dosya tipi h olan buumltuumln dosyaların ekrandagoumlruumlntuumllenmesini sağlar
Şimdiye kadar goumlrmuumlş olduğumuz programlar (herhangi bir sorun ccedilıkmazsa) kontrolmain bloğunun sonuna ulaştığında biterler exit fonksiyonu ise konulduğu yerdeprogramın sona ermesini sağlar
exit(durum)
ccedilağrısı accedilık olan tuumlm dosyalar iccedilin fclosersquoun daha sonra da _exit kuumltuumlphanefonksiyonunun ccedilağrılmasını sağlar _exit başka bir şey yapmadan programı bitirir(Programlarınızda kuumltuumlphanede tanımlanmış bulunan ve ldquo_rdquo ile başlayan bir şeykullanmanız tavsiye edilmez normal programcılar iccedilin bunlar biraz duumlşuumlk duumlzeydekalırlar ve Standarda girmezler) Bir tamsayı olan durumrsquoun değeri bu programın
13
126 DOSYALAR VE GİRDİCcedilIKTI BOumlLUumlM 7
ccedilalışmasını sağlayan suumlrece geccedilirilir ve bu suumlreccedil tarafından bazı kararlar vermek iccedilinkullanılabilir Geleneksel olarak sıfırdan farklı durum değerleri ccedileşitli hatalı durumlarıgoumlsterirler 0 ise başarılı bir sonuccedillanmayı goumlsterir stdlibh başlık dosyasındatanımlanmış EXIT_SUCCESS (başarılı sonuccedillanma) ve EXIT_FAILURE (hatalısonuccedillanma) değerleri bu kodları standartlaştırmaktadırlar
Birbirleriyle ilişkili iki fonksiyon da şunlardırrand()
vesrand(tohum)
İlki 0 ile RAND_MAX (ge32767) arasında bir soumlzde rastgele tamsayı verir İkincisi iserand tarafından uumlretilecek yeni bir soumlzde rastgele sayı sırası iccedilin tohumu (işaretsiz birtamsayı) belirtmek iccedilin kullanılır Eğer srand ccedilağrılmazsa program başlarkentohumrsquoun değeri 1rsquodir
76 Dosya Tanımlayıcıları Ve İlgili Fonksiyonlar
Dosya goumlstergelerine bir alternatif de dosya tanımlayıcılarıdır Her dosya tanımlayıcısı(sistemimizde tutamak da denir) programın yuumlruumltuumllmesi esnasında dosyayı goumlsterensıfırdan kuumlccediluumlk olmayan bir tamsayıdır Kısım 71rsquoden 74rsquoe kadar anlatılan dosya erişimfonksiyonlarının dosya tanımlayıcıları iccedilin ayrı uyarlamaları bulunmaktadır
Dikkat Oumlnceki kısımdakilerden farklı olarak bu kısımda anlatılan fonksiyonlarstandartlaşmış değillerdir sadece bizim sistem tarafından bunların desteklendiğinisoumlyleyebiliriz Bundan başka dosya tanımlayıcısı fonksiyonları ile dosya goumlstergefonksiyonları birbirinden tamamen farklı ve uyumsuzdurlar bir program iccedilinde ikisibirlikte kullanılmamalıdır Aslında bu kısımda anlatılan fonksiyonları hiccedil kullanmamaken iyi yoldur Bu kısımda anlatılanlarla ilgili bilgiler Standarda dahil olmayanfcntlh systypesh sysstath ve ioh adlı başlık dosyalarında bulunurAşağıda anlatılan isimlerin oumlnuumlnde standart olmadıklarını goumlstermek iccedilin altccedilizgi (_)karakteri bulunmaktadır birccedilok sistemde bu karakter bulunmayabilir
Standart girdi ccedilıktı ve hata dosyalarının sırasıyla 0 1 ve 2 şeklinde dosyatanımlayıcıları vardır
Bir dosya oluşturmanın yoludosya_tanimlayicisi = _creat(kar_dizisi izin)
yazmaktır _creat ile ilgili yeni bir şey de her dosya iccedilin bir izin belirtebilmeyisağlamasıdır kar_dizisi adında bir dosya oumlnceden bulunmuyorsa _creat boumlyle birdosya yaratır ve yazma iccedilin accedilar Daha sonra dosya ilk defa kapatıldığında _creatrsquoinikinci arguumlmanı olarak belirtilen izin dosyaya atanır izin _S_IWRITE ve _S_IREADkuumltuumlphane değişmezlerinin bir tanesine eşit olması gereken bir tamsayı ifadesidir
13
BOumlLUumlM 7 DOSYALAR VE GİRDİCcedilIKTI 127
_S_IREAD sadece okumaya izin verilmiştir _S_IWRITE yazılmaya izin verilmiştiranlamına gelir Hem yazma hem de okumaya izin vermek iccedilin _S_IREAD|_S_IWRITEkullanın
Eğer kar_dizisi adında bir dosya daha oumlnceden bulunuyorsa _creaticcedilindekileri silip yazma iccedilin accedilmaya ccedilalışır Dosyanın eski izin durumu etkisinisuumlrduumlruumlr
Normalde _creat dosya iccedilin bir tanımlayıcı doumlnduumlruumlr Eğer başarısızsa oumlrneğindosya daha oumlnceden var olan salt okunabilen bir dosya ise veya ccedilok fazla accedilık dosyavarsa -1 doumlnduumlruumlr
kar_dizisi adında bir dosyayı accedilmak iccedilin aşağıdaki yazılır
dosya_tanimlayicisi = _open(kar_dizisi bayrak izin)
Eğer her şey iyi giderse dosya_tanimlayicisirsquonın iccediline bir tutamak değeri konuraksi takdirde -1 doumlnduumlruumlluumlr bayrak dosya ile ilgili yapılacak işlemi goumlsterir oumlrneğindosyayı okumak iccedilin _O_RDONLY kullanın izin yukarıdaki gibi _S_IWRITE ve_S_IREAD kuumltuumlphane değişmezlerinden biri olmalıdır ve sadece bayrak iccedilin_O_CREAT (dosyayı yarat) kullanıldığında anlam taşır
_close fonksiyonu daha oumlnce accedilık bulunan bir dosyayı kapatmak iccedilin kullanılır ve
_close(dosya_tanimlayicisi)
şeklindedir Dosyayı kapatabilirse 0 aksi takdirde -1 doumlnduumlruumlr
Dosya tanımlayıcıları kullanarak girdi-ccedilıktı yapmak istiyorsanız okunacak veyayazılacak baytlar iccedilin oumlnceden yeterli buumlyuumlkluumlkte bir (tampon) boumllge tanımlamanızgerekir Aşağıda tamponrsquoun yeterince buumlyuumlk bir char dizisi olduğunu varsayın
dosya_tanimlayicisi tarafından belirtilmiş bulunan dosyaya sayi kadar baytyazmak isterseniz
s = _write(dosya_tanimlayicisi tampon sayi)
kullanın Yazmayı duumlşuumlnduumlğuumlnuumlz baytları tampon ile başlayan boumllgeye daha oumlncedenyerleştirmiş olmanız gerekir srsquoye ya -1 (hatayı goumlstermek iccedilin) veya gerccedilekte yazılmışbulunan bayt sayısı konur _write işleminden sonra eğer s=sayi ise bir hata olmuşdemektir fonksiyonu kullandıktan sonra bu testi yapmayı unutmayın
s = _read(dosya_tanimlayicisi tampon sayi)
ifadesi dosya_tanimlayicisi ile belirtilen dosyanın okunup tampon ile başlayanboumllgeye baytların konulmasını sağlar Dosya sonuna ulaşıldığında okuma biter Herdurumda en fazla sayi kadar bayt okunur s okunmuş bulunan bayt sayısını veya okumayapılamazsa -1 iccedilerecektir
fseekrsquoin dosya tanımlayıcısı karşılığı _lseekrsquotir
uzun_yeni_yer = _lseek(dosya_tanimlayicisi uzun_sayi nereden)
13
128 DOSYALAR VE GİRDİCcedilIKTI BOumlLUumlM 7
ccedilağrısında son iki arguumlman fseekrsquote olduğu gibi aynı anlam taşırlar ve aynı iş yapılmışolur _lseek dosyanın başından şimdiki konuma kadar olan uzaklığı bayt cinsindendoumlnduumlruumlr
77 Bir OumlrnekmdashOumlğrenci Veritabanı
Oumlğrenci kayıtlarını tutup bunlar uumlzerinde ekleme silme ve goumlruumlntuumlleme işlemlerini yapanbir program yazalım Program kullanıcıya bir menuuml sunacak ve kullanıcının seccedilimine goumlreilgili seccedileneği ccedilalıştıracaktır Crsquonin bu tuumlr uygulama iccedilin en uygun dil olduğunu veyabunun en iyi ve kısa program olduğunu savunmuyoruz amacımız sadece bu boumlluumlmdeanlatılmış olan C ile ilgili bazı konuları goumlstermektir Programın listesinden sonra kodundetaylı bir accedilıklaması verilmektedir Devam etmeden oumlnce programı bilgisayara giripccedilalıştırmanız oumlnerilir1 include ltconiohgt2 include ltstdiohgt3 include ltstdlibhgt4 include ltstringhgt56 Degismezler 7 char const DOSYA_ADI[] = OGRENCIDAT8 char const BOS[] = rrrrrrr9 define ANHTR_UZ 710 char const AKD[] = 7s11 define ISIM_UZ 1512 define KAYIT_BOYU ((long)(ANHTR_UZ+ISIM_UZ+4))13 char const KKD[] = 7s15s4d1415 struct kayit 16 char anhtr[ANHTR_UZ+1] isim[ISIM_UZ+1]17 int yil18 1920 Her fonksiyonda bastan tanimlamak yerine bu21 degiskenler burada tanimlanmislardir22 23 char satir[128]24 FILE dg2526 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] = 032 dizioku 3334 long bul Dosya icindeki ANHTRin yerini 35 (char const anhtr[]) aksi takdirde -1L dondur 36 37 int drm kar = 138 long dns39 char d1[ANHTR_UZ+1] d2[ANHTR_UZ+1]40
13
BOumlLUumlM 7 DOSYALAR VE GİRDİCcedilIKTI 129
41 sprintf(d2 AKD anhtr) soldan bosluk doldur 42 dg = fopen(DOSYA_ADI rb)43 if (dg == NULL)44 return -1L45 drm = fseek(dg -KAYIT_BOYU SEEK_END)46 while (drm == 0 ampamp fgets(d1 ANHTR_UZ+1 dg) = NULL ampamp47 (kar=strcmp(d2d1)) = 0)48 drm = fseek(dg -KAYIT_BOYU-ANHTR_UZ SEEK_CUR)49 if (kar == 0)50 dns = ftell(dg)-ANHTR_UZ51 else52 dns = -1L53 fclose(dg)54 return dns55 bul 5657 void ekleme (void)58 59 long konum60 struct kayit k61 int scd6263 puts(Eklenecek ogrenci numarasini girin)64 dizioku(kanhtr ANHTR_UZ)65 if (bul(kanhtr) == -1L) 66 puts(Ogrenci adini girin)67 dizioku(kisim ISIM_UZ)68 do 69 puts(Kayit yilini girin)70 scd = scanf(d ampkyil)71 gets(satir)72 while (1=scd || kyillt1980 || kyilgt9999)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 else80 fseek(dg konum SEEK_SET) bos kayida git 81 fprintf(dg KKD kanhtr kisim kyil)82 fclose(dg)83 puts(Ekleme islemi tamamlandi)84 85 else86 fprintf(stderr Cift anahtarna)87 ekleme 8889 void silme (void)90 91 long konum92 char anhtr[ANHTR_UZ+1]93
13
130 DOSYALAR VE GİRDİCcedilIKTI BOumlLUumlM 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 else104 fprintf(stderr Boyle anahtar yokna)105 silme 106107 void goruntuleme (void)108 109 long konum110 struct kayit k111112 puts(Goruntulenecek ogrenci numarasini girin)113 dizioku(kanhtr ANHTR_UZ)114 if ((konum = bul(kanhtr)) = -1L) 115 dg = fopen(DOSYA_ADI rb)116 fseek(dg konum+ANHTR_UZ SEEK_SET)117 printf(Ogrenci adi sn fgets(kisimISIM_UZ+1dg))118 fscanf(dg d ampkyil)119 fclose(dg)120 printf(Kayit yili dn kyil)121 122 else123 fprintf(stderr Boyle anahtar yokna)124 goruntuleme 125126 int menu (void)127 128 int secenek129130 do 131 puts(nt1EKLEMEnt2SILMEnt3GORUNTULEMEnt0CIKIS)132 printf(Seciminizi yapin)133 while ((secenek=_getche()) lt 0 || secenek gt 3)134 putchar(n)135 return secenek - 0136 menu 137138 void main (void)139 140 static void (fd[])(void) =141 (void ()(void)) exit ekleme silme goruntuleme 142143 while (1) (fd[menu()])()144 main
Programda her oumlğrenci iccedilin bir sayı isim ve kayıt yılı saklanır Bu bilgiyibirleştirmek iccedilin Satır 15rsquote kayit yapısı tanımlanmıştır Oumlğrenci numarası ldquoanahtarrdquodıryani her oumlğrencinin ayrı numarası vardır ve oumlğrencinin bilgisine ulaşmak iccedilin bu numarayıkullanırız
menu fonksiyonu (Satır 126-136) kullanıcıya seccedilimleri sunar ve neyi seccediltiğinigoumlsteren bir sayı (aslında bir char) girmesini ister 0rsquodan kuumlccediluumlk veya 3rsquoten buumlyuumlk
13
BOumlLUumlM 7 DOSYALAR VE GİRDİCcedilIKTI 131
seccedilimler kabul edilmez Geccedilerli bir seccedilenek girildiğinde fonksiyon tarafından secenekdeğişkeninin tamsayı eşdeğeri doumlnduumlruumlluumlr Bu fonksiyonda puts kullanımına dikkatedin Herhangi bir değişkenin değerinin basılmasına gerek olmadığından printfkullanmanıza gerek yoktur Programda boumlyle durumlar iccedilin puts kullandık
mainrsquodeki while deyimi biraz karmaşık goumlzuumlkebilir Satır 140-141rsquode exitekleme silme ve goruntuleme fonksiyonlarına goumlstergeler iccedilerecek şekildeilklenmiş bulunan fd dizisinin menursquoncuuml elemanını ccedilağırır Goumlrduumlğuumlnuumlz gibifonksiyonlara goumlstergeler iccedilin bir dizi gibi karmaşık veri yapılarının kullanımı kuumlccediluumlk biryerde ccedilok şey yapabilecek kod yazmamızı sağlar Dikkat stdlibhrsquode tanımlanmışolan exit fonksiyonu bir int arguumlman beklemektedir diğer fonksiyonlara uyması iccedilinbir kalıp aracılığı ile bu fonksiyonu arguumlmansız hale ccedilevirdik
ekleme silme ve goruntuleme fonksiyonları arguumlman olarak verilmişanahtarı iccedileren kaydı taramak iccedilin bul adı verilen bir fonksiyonu ccedilağırırlar bul(Satır 34-55) kaydın dosyanın başına goumlre konumunu bir long sayı şeklinde verirherhangi bir hata olursa -1L doumlnduumlruumlr bulrsquoun başındaki sprintf anhtrrsquoın sağadayanmış bir uyarlamasını d2rsquoye koyar Daha sonra oumlğrenci dosyasını okumak iccedilindosyayı accedilmaya ccedilalışırız Eğer accedilılamazsa hata doumlnduumlruumlluumlr Eğer dosya accedilılırsadosyadaki son kaydın başına konumlanırız Satır 46-48rsquodeki while şu andakonumlandırılan kaydın anahtarını d2 ile karşılaştırır ve eğer eşitseler veya dosyanınbaşına ulaştıysak sona erer Satır 48 dosyayı bir oumlnceki kaydın başına konumlandırırDosya taramasını geriye doğru yapmamızın nedeni fseek fonksiyonunun dosyanınsonundan ileri doğru gitmeyi bir hata şeklinde değerlendirmemesinden kaynaklanırSatır 53rsquote dosyayı kapattıktan sonra bulrsquoun sonunda (Satır 50rsquode ftell kullanılarakuygun değer verilen) dns doumlnduumlruumlluumlr
Uumlccedil ldquobuumlyuumlkrdquo fonksiyon tarafından ccedilokccedila kullanılan başka bir fonksiyon dadiziokursquodur Bu ldquokolaylıkrdquo fonksiyonu iki arguumlman kabul eder İccediline bir şey okunacakkarakter dizisi ile okunacak dizinin uzunluğunu goumlsteren bir tamsayı Baştaki getsgirdiden bir satır okur Geri kalan deyimler gerekli sayıda karakteri drsquoye aktarıp sonunabir boş karakter koyarlar
ekleme fonksiyonu dosyaya yeni bir oumlğrenci kaydı yerleştirmeye ccedilalışır Yenioumlğrencinin numarasını okur ve bu anahtarla bulrsquou ccedilağırır Eğer bul -1Lrsquoden farklı birşey doumlnduumlruumlrse dosya iccedilinde bu numaradan bir oumlğrenci kaydı vardır demektir onun iccedilinekleme uygun bir uyarı mesajı ile sona erer Eğer bu numara dosyada yeni iseoumlğrencinin ismi ve kayıt yılı sorulur Yıl iccedilin doumlrt rakamlı bir sayı girinceye kadar devametmeyi engelleyen do deyimine dikkat ediniz scanfrsquoin gerccedilekleştirilen başarılıdoumlnuumlşuumlm sayısını doumlnduumlrduumlğuumlnuuml anımsayın
Oumlğrenci hakkında buumltuumln bilgileri elde ettiğimize goumlre onu dosyaya yazmamızgerekir Satır 73rsquote BOS anahtarı iccedileren bir kayıt ararız BOS bir oumlğrenci numarası olarakkullanıcı ne kadar ccedilalışırsa ccedilalışsın giremeyeceği oumlzel bir karakter dizisidir (Satır 8rsquodekiBOSrsquoun tanımına bakıp bunun neden boumlyle olduğunu soumlyleyiniz) BOS anahtarı daha oumlnceeklenmiş fakat sonra silinmiş kayıtları goumlsterir Satır 74-75 dosya yoksa yeni bir dosyaaccedilar aksi takdirde bir değişiklik yapmaz Satır 76 okuma-yazma erişimi iccedilin dosyayı
13
132 DOSYALAR VE GİRDİCcedilIKTI BOumlLUumlM 7
accedilar Eğer BOS bir kayıt yoksa yeni kayıt dosyanın sonuna eklenir (Satır 78) Aksitakdirde adresi konum iccedilinde bulunan BOS kayda yazılır (Satır 80) Asıl yazma işlemiSatır 81rsquode fprintf ile yapılır Dosyayı kapattıktan sonra ekleme sona erer
silme silinecek oumlğrenci numarasını okuyarak başlar Boumlyle bir oumlğrencinin dosyaiccedilinde olup olmadığını araştırmak iccedilin bul ccedilağrılır Eğer kayıt varsa anahtarına BOSyazılır ve silme biter Eğer yoksa doumlnmeden oumlnce uygun bir hata mesajı basılır Hatamesajlarının stderrrsquoe goumlnderildiğinde dikkat edin
goruntuleme oumlğrenci numarasını okur ve silmersquoye benzer bir şekilde kaydınbulunup bulunmadığını kontrol eder Kayıt bulunursa anahtar dışındaki bilgilergoumlruumlntuumllenir
Problemler
1 stdioh dosyasında getc() ve putc()rsquonin tanımlarına bakıp ne olduğunuaccedilıklamaya ccedilalışın
2 Kısım 77rsquodeki oumlrnek programa degistirme adında yeni bir seccedilenek ekleyinSeccedilildiğinde oumlğrenci numarası okunur ve oumlğrencinin şu anki bilgileri goumlruumlntuumllenirKullanıcı isterse anahtar dışındaki bilgileri değiştirebilir ve yeni bilgiler eskibilgilerin yerini dosyada alır Varlık testleri ve uygun hata mesajları bulunmalıdır
3 Soumlzdizimsel accedilıdan doğru olan bir C programından buumltuumln accedilıklama ve goumlruumlnmeyengereksiz karakterleri ccedilıkaran bir program yazın
4 Komut satırında arguumlman olarak verilen dosyaları birleştirip stdoutrsquoa yazan (veUNIX komutu catrsquoe benzeyen) bir program yazın
5 Buumlyuumlk bir dosyayı birkaccedil kuumlccediluumlk dosyaya ayıran bir program yazın İlk arguumlmandosya adını ikincisi (eğer verilmezse 1000 varsayılacak) parccedila başına satır sayısınıgoumlsterir Parccedilaların dosya isimleri parca1 parca2 vs olacaktır
6 Arguumlman olarak verilen iki dosyayı karşılaştırıp farklı olan baytları sekizligoumlsterimde goumlruumlntuumlleyecek (ve UNIX komutu cmprsquoe benzeyen) bir program yazın
7 Bir satır editoumlruuml yazın Ccedilalışma dosyasının adı komut satırı arguumlmanı olarakverilecektir Program aşağıdaki komutların herhangi birini girdi olarak kabuledebilecektir
E numara
Bu komuttan sonra standart girdiden bir satır okunup numararsquoıncı satırdan oumlnceyerleştirilir
S numara
Numararsquoıncı satır silinir
G numara
13
BOumlLUumlM 7 DOSYALAR VE GİRDİCcedilIKTI 133
Numararsquoıncı satır goumlruumlntuumllenirC
Program sona erer
8 Bir metin dosyasındaki satırları tersten basacak bir program yazın yani son satır ilkolarak basılacak vs Dosya boyuna herhangi bir sınırlama getirmeyin
9 Ekranı temizleyen bir fonksiyon yazın
10 Soumlzdizimsel accedilıdan doğru ve tam olan bir C programını iccedileren bir dosyayı alıp aynıprogramı daha iyi bir biccedilimde başka bir dosyaya yazan bir program hazırlayın ldquoDahaiyi bir biccedilimrdquo derken şunu anlatmak istiyoruz Buumltuumln fonksiyon başlıkları aynısuumltunda başlar ve başka deyimlerin parccedilaları olan blokların sol ve sağ ccedilengelliparantezlerin yeri Boumlluumlm 2rsquode oumlnerilen şekildedir
11 Metin okuyup aşağıdaki şekilde biccedilimlendirilmiş olarak bir dosyaya koyan birprogram yazın Solda 7 karakterlik boşluk bulunur dokuumlman her biri 55 satır olansayfalardan oluşur her satır en fazla 65 karakterdir her sayfanın son satırında sayfanumarası bulunur ve noktadan sonra gelen ilk harf buumlyuumlğe doumlnuumlştuumlruumlluumlr Program tekbir yeni satır (n) karakterini boşluğa ccedilevirecek arka arkaya iki tane yeni satırkarakteri varsa bunlar paragraf sonu olarak değerlendirilecek ve aynen bırakılacaktırGereksinimlerinize goumlre programı geliştirin (Bazı biccedilimleme komutları ekleyinOumlrneğin oumlzel bir karakterle başlayan satırlar emir olarak değerlendirilebilir)
13
13
135
EK A KARAKTER KODLARICcedilİZELGESİ
Bizim kullandığımız sistemde olduğu gibi birccedilok sistemde karakterleri goumlstermek iccedilinASCII (American Standard Code for Information InterchangemdashBilgi Değişimi iccedilinStandart Amerikan Kodu) karakter kodları kullanılır ASCII karakter kuumlmesi 128 tane (7bitlik) koddan oluşur ve 33 kontrol karakteri bir boşluk ve 94 goumlruumlntuumllenebilen (grafik)karakteri tanımlar Bir kontrol karakteri ccedilıktı aygıtında değişik etkilere neden olabildiğigibi bazen grafik bir şekil de oluşturabilir
Bir karakterlik bilginin saklanması iccedilin 8 bitlik baytların kullanıldığı makinelergenelde 128 tane daha karakter iccedileren ldquogenişletilmişrdquo bir karakter kuumlmesi sağlarlar Bukarakterlerin kodları 128rsquoden 255rsquoe kadardır ve aygıttan aygıta veya sistemden sistemedeğişebilir
Bundan sonraki doumlrt sayfa standart ASCII karakter kuumlmesinin bir listesinivermektedir Bu listede kontrol karakterleri ^tuş şeklinde goumlsterilirler bu da CONTROLtuşu basılı iken tuşa basarak bu karakterin elde edilebileceği anlamına gelmektedir IBMuyumlu kişisel bilgisayarlarda (PCrsquolerde) ALT tuşu basılı iken klavyenin sağındaki sayısaltuşlar kullanılarak girilecek olan ASCII ondalık kod aracılığıyla ilgili karakteroluşturulabilir Oumlrneğin lsquoArsquo harfini elde etmek iccedilin ALT tuşu basılı iken sırayla oumlnce 6rsquoyasonra da 5rsquoe basın
Daha sonraki doumlrt sayfada ise 128rsquoden 255rsquoe kadar kodlara sahip olan karakterler iccedilinPCrsquolerde kullanılan iki ayrı karakter standardı goumlsterilmiştir
bull ASCII (genişletilmiş) Bu daha ccedilok MS-DOS ortamında kullanılmaktadır MS-DOSortamında bu karakterlerin klavyeden girilmesi iccedilin ALT tuşu basılı iken klavyeninsağındaki sayısal tuşlar kullanılarak ilgili karakterin ondalık kodu girilmelidirOumlrneğin lsquoCcedilrsquo iccedilin ALT+128 Windows ortamında da kullanılan youmlntem aynıdır ancakbu işlemi yaparken NUM LOCK ışığının yakılı olması gerekmektedir
13
136 KARAKTER KODLARI CcedilİZELGESİ EK A
bull ANSI Windows ortamında kullanılmaktadır Bu karakterlerin klavyeden girilmesiiccedilin yukarıdaki youmlntem kullanılır sadece girilen kodun ANSI olduğunu belirtmek iccedilinkodun oumlnuumlne lsquo0rsquo eklenir Oumlrneğin lsquoCcedilrsquo iccedilin ALT+0199
Tuumlrkccedile karakterler iccedilin en az uumlccedil ayrı standart bulunmaktadır Herbirinde belirlikarakter kodları iccedilin uluslararası tanımlanmış karakterin yerini Tuumlrkccedile karakteralmaktadır Bunlar listede yerini aldıkları karakterlerin yanında parantez iccedilindeverilmiştir
bull 7 bitlik ASCII standardı Bu sadece 128 değişik karakter kodunu destekleyenaygıtlarda kullanılmaktadır Guumlnuumlmuumlzde 256 değişik karakter kullanan PCrsquolerinyaygınlaşmasıyla bu standart daha az kullanılmaya başlanmıştır
bull 8 bitlik genişletilmiş ASCII standardı Genelde MS-DOS ortamında kullanılmaktadır
bull 8 bitlik ANSI standardı Windows gibi grafik ortamlarda kullanılmaktadır
13
EK A KARAKTER KODLARI CcedilİZELGESİ 137
Ond Sekizli OnaltılıKarakter Anlamı 0 0000 0x00 ^ NUL Boşmdashzaman doldurmak iccedilin kull tamamı sıfır karakter
1 0001 0x01 ^A SOH Başlık 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 SorgumdashldquoKimsinizrdquo
6 0006 0x06 ^F ACK Olumlu yanıtmdashldquoEvetrdquo
7 0007 0x07 ^G BEL Zilmdashİnsan dikkati gerekiyor
8 0010 0x08 ^H BS Geriye alma (biccedilim etkileyicisi)
9 0011 0x09 ^I HT Yatay durak (biccedilim etkileyicisi)
10 0012 0x0A ^J LF Satır ilerletme (biccedilim etkileyicisi)
11 0013 0x0B ^K VT Dikey durak (biccedilim etkileyicisi)
12 0014 0x0C ^L FF Sayfa ilerletme (biccedilim etkileyicisi)
13 0015 0x0D ^M CR Satırbaşı (biccedilim etkileyicisi)
14 0016 0x0E ^N SO Dışarı kaymamdashstandart olmayan kod geliyor
15 0017 0x0F ^O SI İccedileri kaymamdashstandart koda geri doumlnuumlş
16 0020 0x10 ^P DLE Veri bağl kaccedilışımdashsınırlı veri iletişimi kontr değişikliği
17 0021 0x11 ^Q DC1 Yardımcı aygıtları accedilıp kapamak iccedilin aygıt kontroluuml
18 0022 0x12 ^R DC2 Yardımcı aygıtları accedilıp kapamak iccedilin aygıt kontroluuml
19 0023 0x13 ^S DC3 Yardımcı aygıtları accedilıp kapamak iccedilin aygıt kontroluuml
20 0024 0x14 ^T DC4 Yardımcı aygıtları accedilıp kapamak iccedilin aygıt kontroluuml
21 0025 0x15 ^U NAK Olumsuz yanıtmdashldquoHayırrdquo
22 0026 0x16 ^V SYN Eşzamanlı boşa işlememdasheşzamanlama sağlamak iccedilin
23 0027 0x17 ^W ETB İletim oumlbeği sonumdashfiziksel iletişim oumlbekleri ile ilintili
24 0030 0x18 ^X CAN Oumlnceki bilginin iptali
25 0031 0x19 ^Y EM Ortam sonumdashkullanılanistenen bilgi boumlluumlmuumlnuumln sonu
26 0032 0x1A ^Z SUB Hatalı karakterin yerine gelen karakter
27 0033 0x1B ^[ ESC Kaccedilışmdashkod genişlemesi iccedilin
28 0034 0x1C ^ FS Dosya ayırıcısı
29 0035 0x1D ^] GS Grup ayırıcısı
30 0036 0x1E ^^ RS Kayıt ayırıcısı
31 0037 0x1F ^_ US Birim ayırıcısı
13
138 KARAKTER KODLARI CcedilİZELGESİ EK A
Ond Sekizli OnaltılıKarakter Anlamı 32 0040 0x20 BOSLUK Basılmayan karaktermdashsoumlzcuumlk ayırıcısı
33 0041 0x21 Uumlnlem işareti
34 0042 0x22 (Ccedilift) tırnak işareti
35 0043 0x23 (Ğ) Sayı işareti
36 0044 0x24 $ Dolar
37 0045 0x25 Yuumlzde
38 0046 0x26 amp Ve işareti
39 0047 0x27 Kesme işareti (tek tırnak)
40 0050 0x28 ( Sol parantez
41 0051 0x29 ) Sağ parantez
42 0052 0x2A Yıldız
43 0053 0x2B + Artı
44 0054 0x2C Virguumll
45 0055 0x2D - Ccedilizgi işareti
46 0056 0x2E Nokta
47 0057 0x2F Boumlluuml
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ı virguumll
60 0074 0x3C lt Kuumlccediluumlktuumlr
61 0075 0x3D = Eşittir
62 0076 0x3E gt Buumlyuumlktuumlr
63 0077 0x3F Soru işareti
13
EK A KARAKTER KODLARI CcedilİZELGESİ 139
Ond Sekizli OnaltılıKarakter Anlamı 64 0100 0x40 (Ccedil) -de işareti
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 koumlşeli parantez
92 0134 0x5C (İ) Ters boumlluuml
93 0135 0x5D ](Ouml) Sağ koumlşeli parantez
94 0136 0x5E ^(Uuml) Uzatma işareti
95 0137 0x5F _ Alt ccedilizgi
13
140 KARAKTER KODLARI CcedilİZELGESİ EK A
Ond Sekizli OnaltılıKarakter Anlamı 96 0140 0x60 `(ccedil) Ağır vurgu
97 0141 0x61 a 98 0142 0x62 b 99 0143 0x63 c100 0144 0x64 d101 0145 0x65 e102 0146 0x66 f103 0147 0x67 g104 0150 0x68 h105 0151 0x69 i106 0152 0x6A j107 0153 0x6B k108 0154 0x6C l109 0155 0x6D m110 0156 0x6E n111 0157 0x6F o112 0160 0x70 p113 0161 0x71 q(ğ)114 0162 0x72 r115 0163 0x73 s116 0164 0x74 t117 0165 0x75 u118 0166 0x76 v119 0167 0x77 w120 0170 0x78 x121 0171 0x79 y122 0172 0x7A z123 0173 0x7B (ş) Sol ccedilengelli parantez
124 0174 0x7C |(ı) Dikey ccedilizgi
125 0175 0x7D (ouml) Sağ ccedilengelli parantez
126 0176 0x7E ~(uuml) İnceltme işareti
127 0177 0x7F DEL Ortam doldurma
13
EK A KARAKTER KODLARI CcedilİZELGESİ 141
Ond Sekizli Onaltılı ASCII karakter ANSI karakter128 0200 0x80 Ccedil euro129 0201 0x81 uuml 130 0202 0x82 eacute sbquo131 0203 0x83 acirc ƒ132 0204 0x84 auml bdquo133 0205 0x85 agrave hellip134 0206 0x86 aring dagger135 0207 0x87 ccedil Dagger136 0210 0x88 ecirc ˆ137 0211 0x89 euml permil138 0212 0x8A egrave Š139 0213 0x8B iuml lsaquo140 0214 0x8C icirc Œ141 0215 0x8D igrave(ı) 142 0216 0x8E Auml 143 0217 0x8F Aring 144 0220 0x90 Eacute 145 0221 0x91 aelig lsquo146 0222 0x92 AElig rsquo147 0223 0x93 ocirc ldquo148 0224 0x94 ouml rdquo149 0225 0x95 ograve bull150 0226 0x96 ucirc ndash151 0227 0x97 ugrave mdash152 0230 0x98 yuml(İ) ˜153 0231 0x99 Ouml trade154 0232 0x9A Uuml š155 0233 0x9B cent rsaquo156 0234 0x9C pound œ157 0235 0x9D yen 158 0236 0x9E ₧(Ş) 159 0237 0x9F ƒ(ş) Ÿ
13
142 KARAKTER KODLARI CcedilİZELGESİ EK A
Ond Sekizli Onaltılı ASCII karakter ANSI karakter160 0240 0xA0 aacute 161 0241 0xA1 iacute iexcl162 0242 0xA2 oacute cent163 0243 0xA3 uacute pound164 0244 0xA4 ntilde curren165 0245 0xA5 Ntilde yen166 0246 0xA6 ordf(Ğ) brvbar167 0247 0xA7 deg(ğ) sect168 0250 0xA8 iquest uml169 0251 0xA9 copy170 0252 0xAA not ordf171 0253 0xAB frac12 laquo172 0254 0xAC frac14 not173 0255 0xAD iexcl -174 0256 0xAE laquo reg175 0257 0xAF raquo macr176 0260 0xB0 deg177 0261 0xB1 plusmn178 0262 0xB2 sup2179 0263 0xB3 sup3180 0264 0xB4 acute181 0265 0xB5 micro182 0266 0xB6 para183 0267 0xB7 middot184 0270 0xB8 cedil185 0271 0xB9 sup1186 0272 0xBA ordm187 0273 0xBB raquo188 0274 0xBC frac14189 0275 0xBD frac12190 0276 0xBE frac34191 0277 0xBF iquest
13
EK A KARAKTER KODLARI CcedilİZELGESİ 143
Ond Sekizli Onaltılı ASCII karakter ANSI karakter192 0300 0xC0 Agrave193 0301 0xC1 Aacute194 0302 0xC2 Acirc195 0303 0xC3 Atilde196 0304 0xC4 Auml197 0305 0xC5 Aring198 0306 0xC6 AElig199 0307 0xC7 Ccedil200 0310 0xC8 Egrave201 0311 0xC9 Eacute202 0312 0xCA Ecirc203 0313 0xCB Euml204 0314 0xCC Igrave205 0315 0xCD Iacute206 0316 0xCE Icirc207 0317 0xCF Iuml208 0320 0xD0 ETH(Ğ)209 0321 0xD1 Ntilde210 0322 0xD2 Ograve211 0323 0xD3 Oacute212 0324 0xD4 Ocirc213 0325 0xD5 Otilde214 0326 0xD6 Ouml215 0327 0xD7 times216 0330 0xD8 Oslash217 0331 0xD9 Ugrave218 0332 0xDA Uacute219 0333 0xDB Ucirc220 0334 0xDC Uuml221 0335 0xDD Yacute(İ)222 0336 0xDE THORN(Ş)223 0337 0xDF szlig
13
144 KARAKTER KODLARI CcedilİZELGESİ EK A
Ond Sekizli Onaltılı ASCII karakter ANSI karakter224 0340 0xE0 α agrave225 0341 0xE1 szlig aacute226 0342 0xE2 Γ acirc227 0343 0xE3 π atilde228 0344 0xE4 Σ auml229 0345 0xE5 σ aring230 0346 0xE6 micro aelig231 0347 0xE7 τ ccedil232 0350 0xE8 Φ egrave233 0351 0xE9 θ eacute234 0352 0xEA Ω ecirc235 0353 0xEB δ euml236 0354 0xEC infin igrave237 0355 0xED Oslash iacute238 0356 0xEE Є icirc239 0357 0xEF cap iuml240 0360 0xF0 equiv eth(ğ)241 0361 0xF1 plusmn ntilde242 0362 0xF2 ge ograve243 0363 0xF3 le oacute244 0364 0xF4 ⌠ ocirc245 0365 0xF5 ⌡ otilde246 0366 0xF6 divide ouml247 0367 0xF7 asymp divide248 0370 0xF8 deg oslash249 0371 0xF9 ugrave250 0372 0xFA uacute251 0373 0xFB radic ucirc252 0374 0xFC ⁿ uuml253 0375 0xFD sup2 yacute(ı)254 0376 0xFE bull thorn(ş)255 0377 0xFF yuml
13
145
EK B MICROSOFT CDERLEYİCİSİ HAKKINDA TEMEL
BİLGİLER
Bu ekte Microsoft C derleyicileri hakkında bazı bilgiler verilecektir Bir C programınınMicrosoft C Eniyileştirici Derleyicisi kullanılarak nasıl derleneceğine geccedilmeden oumlnce Cbellek modellerini bilmek ve anlamak gerekir
B1 Bellek Modelleri
80x88 ve 80x86 işlemcilerinin yapısından dolayı bir bellek adresi 16 bitlik kesim adresiile kesim iccedilinde 16 bitlik bir uzaklıktan oluşur Boumlyle bir adres normalde kesimuzaklık(segmentoffset) şeklinde goumlsterilir Verimlilik accedilısından bir programın aynı kesimiccedilinde kalan adresler uumlretmesi daha iyidir ccediluumlnkuuml adresleme sadece uzaklık oluşturularaksağlanabilir Sadece uzaklık boumlluumlmuumlnden oluşan bir adrese yakın adres adı verilir Bazenprogram başka kesimlerde bulunan nesneleri adreslemek durumunda kalabilir boumlyleadreslere uzak adres adı verilir Uzak bir adres 32 bittir ve kesim temel adresi ileuzaklıktan oluşur Bir kesimden yani 64 Kbayttan daha buumlyuumlk olan bir veri yapısıoumlrneğin bir dizi uzak adres kullanılarak adreslenemez Bu amaccedil iccedilin dev adres adıverilen başka bir adres tipi kullanılır Dev adreslerin uzak adreslerden farkı goumlstergelerdeortaya ccedilıkar uzak adreslerde goumlstergeler 16 bit olmalarına rağmen dev adreslerde 32bittir
Bir C programı derlendikten sonra en az bir veri kesimi ve bir kod kesimindenoluşur Bu olası en kuumlccediluumlk C programı iccedilin bile geccedilerlidir Buumlyuumlk C programları birkaccedilveri kesimi yani ccedilok fazla ve buumlyuumlk veri yapıları veveya birkaccedil kod kesimi yani birccedilokyuumlruumltuumllebilir deyim şeklinde oluşabilirler Buumlyuumlk programların doğru bir şekilde derlenip
13
146 MICROSOFT C DERLEYİCİSİ HAKKINDA TEMEL BİLGİLER EK B
yuumlruumltuumllebilmeleri iccedilin Microsoft Crsquoye bellek modelleri konmuştur Aşağıdaki ccedilizelgebellek modelleri arasındaki farkları goumlstermektedir
Kod Kesimi Veri Kesimi KullanılanModel Sayısı Sayısı Kuumltuumlphaneminik (tiny) kod ile veri toplam 1 kesim SLIBCELIBkuumlccediluumlk (small) 1 1 SLIBCELIBkısa (compact) 1 ccedilok CLIBCELIBorta (medium) ccedilok 1 MLIBCELIBbuumlyuumlk (large) ccedilok ccedilok LLIBCELIBdev (huge) ccedilok ccedilok LLIBCELIB
Microsoft C Eniyileştirici Derleyicisi (MS-CL) iccedilin varsayılan model kuumlccediluumlk olandırMicrosoft QuickC (MS-QC) ise her zaman orta modelde ccedilalışır
B1 QC Kuumltuumlphanesi
MS-QC derleyici ortamı iccedilinde bulunan fonksiyonlar ccedilekirdek kuumltuumlphaneyi oluştururlarancak QuickC ccedilekirdek kuumltuumlphanesi Standart C kuumltuumlphanesi iccedilindeki buumltuumln fonksiyonlarıiccedilermez Oumlrneğin rand standart fonksiyonu QC ile birlikte yuumlklenmez Bu fonksiyonuccedilağıran bir program ccedilalıştırmaya kalkarsanız ldquoccediloumlzuumlmlenmemiş dışsal referansrdquo şeklindebir hata mesajı alırsınız Bir amaccedil dosya oluşturmanız ve daha sonra yuumlruumltuumllebilir birdosya elde etmek iccedilin bunu LINK ile bağlamanız gerekecektir Programınızı herdeğiştirdiğinizde bunu yapmaktan kurtulmak iccedilin bir QuickC kuumltuumlphanesi oluşturmanızve QCrsquoyi ccedilalıştırdığınızda bu kuumltuumlphaneyi de yuumlklemeniz gerekir Bunu yapmak iccedilinaşağıdaki youmlntemi kullanın
bull Gerektiği kadar dışsal referans yapan oumlrneğin qlc adında bir program yazınDerleme esnasındaki uyarı mesajlarını dikkate almayın Oumlrneğininclude ltstdlibhgtvoid main (void) rand() srand() bsearch() qsort()
bull QCrsquoyi kullanarak bir amaccedil dosya oumlrneğin qlobj oluşturun
bull Bu dosyayı MS-QC tarafından sağlanan QUICKLIBOBJ adlı amaccedil moduumllle beraberbağlayıp bir Quick kuumltuumlphane oluşturun OumlrneğinLINK Q QUICKLIBOBJ+qlobjqlqlb
bull QCrsquoyi ccedilalıştırırken bu kuumltuumlphaneyi belirtin OumlrneğinQC l ql
13
EK B MICROSOFT C DERLEYİCİSİ HAKKINDA TEMEL BİLGİLER 147
Dikkat QC kuumltuumlphanelerinin iccedilerilmesi QC ccedilalışırken bellek-iccedili derleme iccedilin ayrılmışbulunan serbest bellek miktarının azalmasına yol accedilar En iyisi birden fazla kuumlccediluumlk Quickkuumltuumlphane oluşturup gerektiği zaman bunları yuumlklemektir
B3 CL Eniyileştirici Derleyicisi
Microsoft C Eniyileştirici Derleyicisinin (MS-CL) 510 uyarlaması 80x8x işlemcileri ileMS-DOS ve OS2 işletim sistemleri iccedilin amaccedil kod uumlretmede kullanılan gelişmiş bireniyileştirici derleyicidir 510 uyarlamasının 500 uyarlamasından tek farkı 80386işlemcisi ile OS2 işletim sistemini desteklemesidir Microsoft Visual C++ paketi iccedilindebulunan Microsoft C Eniyileştirici Derleyicisinin 800 uyarlaması ise Windows ortamı veC++ iccedilin ek olanaklar tanır
Ancak temel olarak CL derleyicibağlayıcısının kullanımı komut satırından birtakımseccedilim anahtarları ile dosya isimleri belirtilmek suretiyle CL komutunun ccedilağrılmasışeklindedir Seccedileneklerin bir oumlzeti ve ccedilağrı oumlrnekleri şoumlyledir
CgtCL HELP CL seccedileneklerinin bir oumlzeti goumlruumlntuumllenir
CgtCL F1C F1C C kaynak dosyası derlenip SLIBCELIBadlı varsayılan kuumltuumlphane ile bağlanır F1OBJamaccedil dosyası ve F1EXE yuumlruumltuumllebilir programoluşturulur
CgtCL F1C F2C Yukarıda olduğu gibi fakat ayrıca F2C dosyasıF2OBJ iccediline derlenir Yuumlruumltuumllebilir programF1EXE iccedilinde bağlanır
CgtCL c F1C Derleme yapılır ama bağlama yapılmaz
CgtCL F1OBJ Daha oumlnce derlenmiş bulunan F1OBJ dosyasıF1EXE iccediline bağlanır
CgtCL F1 Varsayılan dosya tipi OBJ olduğu iccedilin yukarıdakiile aynı
CgtCL F1C F2C F3OBJ F4 F1C ve F2C derlenip F1OBJ F2OBJF3OBJ ve F4OBJ bağlandıktan sonra F1EXEoluşturulur
CgtCL C Bulunulan altdizin iccedilindeki tuumlm C kaynak dosyalarıderlenip tek bir program şeklinde bağlanır
CgtCL Bulunulan altdizin iccedilindeki tuumlm OBJ amaccedildosyaları bağlanır
CgtCL Zi Od F1C Eniyilemenin engellendiği ve Codeview hataduumlzelticisinin kullanılabileceği şekilde F1EXEoluşturulur
13
148 MICROSOFT C DERLEYİCİSİ HAKKINDA TEMEL BİLGİLER EK B
Aşağıda derleyici seccedileneklerinden bazılarının oumlzet bir listesi bulunmaktadır
Bellek Modeli SeccedilenekleriAS Kuumlccediluumlk bellek modeli (varsayılan)AC Kısa bellek modeliAM Orta bellek modeliAL Buumlyuumlk bellek modeliAH Dev bellek modeliAT Minik bellek modeli (COM dosyası oluşur)
Eniyileme SeccedilenekleriO Eniyilemeye izin ver (Ot ile aynı)Oa Başka ad vermeyi dikkate almaOd Eniyilemeleri engelle (varsayılan)Oi Yapıiccedili fonksiyonların kullanılmasına izin verOl Doumlnguuml eniyilemelerine izin verOn ldquoGuumlvenilmezrdquo eniyilemeleri engelleOp Duyarlık eniyilemelerine izin verOr Satıriccedili doumlnuumlşleri engelleOs Kod iccedilin eniyileme yapOt Hız iccedilin eniyileme yapOx En yuumlksek eniyileme (Oailt Gs)
Kod Oluşturma SeccedilenekleriG0 80888086 kodu oluştur (varsayılan)G1 186 kodu oluşturG2 286 kodu oluşturG3 386 kodu oluşturGc Pascal tarzında fonksiyon ccedilağrıları oluşturGs Yığıt kontroluuml yapmaGtsayı Veri boyu eşiği
Listeleme SeccedilenekleriFadosyaadıopt MASM iccedilin girdi olarak kullanılabilecek birleştirici
dil listesi (ASM)Fcdosyaadıopt Birleştirilmiş kaynak ve birleştirici dil listesi
(COD)Fedosyaadı Yuumlruumltuumllebilir dosya adı (EXE)Fldosyaadıopt Amaccedil ve birleştirici dil listesi (COD)Fmdosyaadıopt Bağlayıcı planı (MAP)Fodosyaadı Amaccedil dosya adı (OBJ)Fsdosyaadıopt Kaynak listesi (LST)
13
EK B MICROSOFT C DERLEYİCİSİ HAKKINDA TEMEL BİLGİLER 149
Sl satırgenişliği Listenin genişliğini satırgenişliğine ayarlavarsayılan değer 79rsquodur
Sp sayfaboyu Listede sayfa başına satır sayısı varsayılan değer63rsquotuumlr
Ss altbaşlık Bir liste altbaşlığı goumlruumlntuumlleSt başlık Bir liste başlığı goumlruumlntuumlle
Oumlnişlemci SeccedilenekleriC Accedilıklamaları ccedilıkarmaDisim=metinopt Kaynak programda ldquodefine isim metinrdquoe
eşdeğerdirE Oumlnişlemci ccedilıktısını stdoutrsquoa goumlnderEP Oumlnişlemci ccedilıktısını stdoutrsquoa ldquolinerdquo emirleri
olmadan goumlnderIisim include işlemi iccedilin ek altdizinP Oumlnişlemci ccedilıktısını dosyaya goumlnder dosya tipi
IrsquodirUisim Oumlnceden tanımlanmış makronun tanımını kaldıru Oumlnceden tanımlanmış buumltuumln makroların tanımını
kaldırX ldquoStandart yerlerirdquo dikkate alma
Dil SeccedilenekleriZa Dildeki genişletmeleri engelle (sadece ANSI
Standardını kullan)Zd Satır numarası bilgisiZe Dildeki genişletmelere izin ver (varsayılan)Zg Fonksiyon prototipleri oluşturZi Simgesel hata duumlzeltme bilgileriZl OBJ iccedilindeki varsayılan kuumltuumlphane bilgisini
kaldırZpn Yapıları n-baytlık sınırlar iccediline paketleZs Sadece soumlzdizim kontroluuml yap
Bağlama SeccedilenekleriFonaltılı_sayı Yığıt boyu (onaltılı goumlsterimde bayt sayısı)linkbağ_seccedil_ve_kuumltuumlp Bağlayıcı seccedilenekleri belirle
Kayan Noktalı İşlemler İccedilin Kod Uumlretme SeccedilenekleriFPa Karşılıklı matematik kodu iccedilin ccedilağrılar oluşturFPc 80x87 benzetme kodu iccedilin ccedilağrılar oluşturFPc87 80x87 kodu iccedilin ccedilağrılar oluştur
13
150 MICROSOFT C DERLEYİCİSİ HAKKINDA TEMEL BİLGİLER EK B
FPi Satıriccedili 80x87 benzetme kodu uumlret (varsayılan)FPi87 80x87 komutları uumlret
Ccedileşitli Seccedileneklerc Sadece derle bağlamaHuzunluk Dışsal isim uzunluğuJ Varsayılan karakter tipi unsigned olsunTcdosya Crsquosi olmayan dosyayı derleVkar_dizisi Uyarlama kar_dizisini verWduumlzey Uyarı duumlzeyi (0ltduumlzeyle4)
13
151
EK C MICROSOFT CODEVIEWHATA DUumlZELTİCİSİNE GENEL
BİR BAKIŞ
Microsoft Codeview C Pascal FORTRAN ve birleştirici dil programlarının yuumlruumltmeesnasındaki hatalarını duumlzeltmek iccedilin kullanılan kullanımı kolay etkileşimli bir hataduumlzelticisidir C programcıları iccedilin kaynak dosyaların Zi ve Od seccedilenekleri ilederlenip CO seccedileneğiyle bağlanmaları gerekir Bir oumlrnek şoumlyledir
CgtCL c Zi Od F1CCgtLINK CO F1
veyaCgtCL Zi Od F1C
Bu yolla F1EXE dosyası oluşturulduktan sonra hata duumlzelticisini ccedilağırmak iccedilin
CgtCV seccedilenekler exedosyası arguumlmanlar
yazmak gerekir Burada exedosyası derlenip bağlanmış olan programı iccedileren dosyanınadı arguumlmanlar hataları duumlzeltilecek olan programa geccedilirilecek olan arguumlmanlar veseccedilenekler de Codeview seccedileneklerinden oluşan bir listedir Bu seccedileneklerden en oumlnemlibirkaccedil tanesi şoumlyledir
2 İki monitoumlr kullan bir tanesi hata duumlzelticisi ccedilıktısı diğeri de program ccedilıktısı iccedilinB Renkli bir adaptoumlr ve monitoumlrde siyahbeyaz renkler kullanM Olsa bile fareyi kullanma
Codeviewrsquoa girildiğinde seccedililebilir menuuml maddeleri bir goumlruumlntuumlleme penceresi birdiyalog penceresi ve isteğe bağlı olarak bir yazmaccedil iccedilerikleri goumlruumlntuumlleme boumllgesindenoluşan bir ekran kullanıcıya sunulur Hatası duumlzeltilecek programın ilk birkaccedil satırıotomatik olarak goumlruumlntuumlleme penceresine konur Codeview komutları fare veveya klavyearacılığıyla girilebilir Girdilerin ccediloğu iccedilin fare kullanımı kolay olduğu iccedilin sadece klavye
13
152 MICROSOFT CODEVIEW HATA DUumlZELTİCİSİNE GENEL BİR BAKIŞ EK C
komutları burada anlatılmaktadır Bazı klavye komutları tek tuşa dayanır diyalogkomutları gibi bazılarının ise diyalog penceresinden girilmesi gerekir Aşağıda bazıkomutların oumlzet bir listesi verilmiştir PAGE UP PAGE DOWN oklar vs gibi duumlzenlemetuşları her zamanki anlamlarını taşırlar
CONTROL+HOME Programın ilk satırını goumlruumlntuumlleCONTROL+END Programın son satırını goumlruumlntuumlleF1 YardımF2 Yazmaccedil penceresi goumlruumlntuumlleme anahtarıF3 Kaynak kodu birleştirici kodu veya her ikisini goumlruumlntuumlleF4 Program ccedilıktı ekranını goumlruumlntuumlleF5 Eğer varsa bir sonraki kesilme noktasına kadar programı
yuumlruumltF6 Değişik pencereler arasında dolaşma anahtarıF7 İmlecin bulunduğu yere kadar programı ccedilalıştırF8 Bir izleme (trace) komutu ccedilalıştırF9 Kesilme noktası (breakpoint) versilF10 Bir sonraki kaynak satırını ccedilalıştır (program adım [step]
modu)
Diyalog komutları ldquokomut işlenenlerrdquo şeklindedir İşlenenler olarak her tuumlr geccedilerli Cifadesi kullanılabilir Diyalog komutlarında kullanılan diğer işlenenler aşağıda oumlrneklerletanıtılmaktadır
100 100 numaralı satır (Oumlndeki noktaya dikkat edin)
XC100 XC dosyasındaki 100 numaralı satır10002000 kesimuzaklık şeklinde bir adres Kesim isteğe bağlıdır
Rakam goumlsterimi o andaki sayı sistemine bağlıdır fakatvarsayılan sistem onaltılıdır
AH BH CH DH Yazmaccedilların yuumlksek baytlarıAL BL CL DL Yazmaccedilların duumlşuumlk baytlarıAX BX CX DX 16-bit yazmaccedillarCS DS SS ES 16-bit kesim yazmaccedillarıSP BP IP 16-bit goumlsterge yazmaccedillarıSI DI 16-bit indis yazmaccedillarıEAX EBX ECX EDX 32-bit yazmaccedillarESP EBP 32-bit goumlsterge yazmaccedillarıESI EDI 32-bit indis yazmaccedillarıadr1 adr2 Adr1rsquoden adr2rsquoye bir adres aralığıBY adres Adresteki baytWO adres Adresteki soumlzcuumlkDW adres Adresteki ccedilift soumlzcuumlk
Sıkccedila kullanılan diyalog komutları komutun genel şeklinden sonra gelen oumlrneklerlebirlikte aşağıda liste şeklinde verilmiştir
13
EK C MICROSOFT CODEVIEW HATA DUumlZELTİCİSİNE GENEL BİR BAKIŞ 153
V 100 Satır 100rsquouuml goumlster
ifadebiccedilim Belirtilen biccedilimde ifadenin değerini goumlsterA+Bd Ondalık olarak A+Brsquonin değerini goumlsterWO SPx SP ile goumlsterilen soumlzcuumlğuuml onaltılı goumlsterimde goumlster
XP simge Simgenin adresini goumlsterX Buumltuumln simgelerin adreslerini goumlsterR Buumltuumln yazmaccedilları goumlster
MDbiccedilim adres Biccedilim seccedilimine goumlre adresten başlayarak 128 bayt doumlkMDbiccedilim adr1 adr2 Biccedilim seccedilimine goumlre adr1rsquoden adr2rsquoye kadar doumlk Biccedilim
seccedilimi şoumlyledir
A ASCII karakterB BaytC Program koduI Tamsayı (2 bayt)IU İşaretsiz tamsayıL Uzun tamsayı (4 bayt)R Kısa kayan noktalı sayı (4 bayt)RL Uzun kayan noktalı sayı (8 bayt)RT 10-baytlık kayan noktalı sayı
MC adr1 adr2 adr3 Adr1rsquoden adr2rsquoye kadar olan baytları adr3rsquoten başlayanbaytlarla karşılaştırıp farkları goumlster
MS adr1 adr2 değer Adres aralığı iccedilinde değeri araştırMS 100 1000 isim 100-1000 aralığı iccedilinde ldquoisimrdquoi araştırMS 100 1000 0A 100-1000 aralığı iccedilinde onaltılı goumlsterimde 0Arsquoyı araştır
BP adr_listesi Kesilme noktası koyBC adr_listesi Kesilme noktasını silBP 29 Satır 29rsquoa kesilme noktası koyBC 0 8 22 0 8 ve 22 adreslerindeki kesilme noktalarını silBC Tuumlm kesilme noktalarını silBL Tuumlm kesilme noktalarını goumlster
Wifadebiccedilim İfadenin değerini goumlzle ve biccedilimde goumlsterW Tuumlm goumlzetlemeleri goumlsterWC Tuumlm goumlzetlemeleri sil
13
13
155
EK D MICROSOFT LIB VENMAKE YARDIMCI
PROGRAMLARINA GENEL BİRBAKIŞ
Bu ekte iki Microsoft yardımcı programlarına kısaca goumlz atılacaktır Daha kesin bilgi iccedilinkullandığınız paketin elkitaplarına danışın
D1 LIB Yardımcı Programı
LIB amaccedil program kuumltuumlphaneleri oluşturmak ve bakımını yapmak iccedilin kullanılanyardımcı bir programdır LIBrsquoi ccedilağırmak iccedilin kullanılacak komutun genel şekli şoumlyledir
CgtLIB eskikuumltuumlphane komutlaropt listedosyasıopt yenikuumltuumlphaneopt
Burada
eskikuumltuumlphane Yaratılacak yeni kuumltuumlphane veya değiştirilecek eskikuumltuumlphanenin dosya adı
komutlar LIBrsquoe komutlar+amaccedildosya Eski kuumltuumlphaneye yeni amaccedil moduumlluuml ekle+kuumltuumlphanedosyası Kuumltuumlphanedosyasındaki tuumlm amaccedil moduumlllerini eski
kuumltuumlphaneye ekle (Kuumltuumlphaneleri birleştir)-+amaccedildosya Eski kuumltuumlphane iccedilindeki amaccedil moduumlluumln yerine
yenisini koy
13
156 MICROSOFT LIB VE MAKE YARDIMCI PROGRAMLARINA GENEL BİR BAKIŞEK D
moduumllismi Kuumltuumlphanedeki bir moduumlluuml (moduumllismiOBJ adlı)dosyaya aktar
-moduumllismi Kuumltuumlphanedeki bir moduumlluuml bir dosyaya taşı yaniaktarıp kuumltuumlphaneden sil
listedosyası Ccedilapraz referans iccedilin liste
yenikuumltuumlphane Değişikliklerden sonra oluşturulan yeni kuumltuumlphanenin dosyaismi Eğer belirtilmezse eski kuumltuumlphanenin tipi BAKrsquoadoumlnuumlştuumlruumlluumlp eskikuumltuumlphane isminde saklanır
Oumlrnekler
LIB KH1 +MOD1 MOD1OBJrsquodaki amaccedil moduumlluuml KH1LIBkuumltuumlphanesine ekle
LIB KH1 -+MOD1 KH1LIB kuumltuumlphanesindeki amaccedil moduumlluumlMOD1OBJrsquodaki amaccedil moduumllle değiştir
LIB komutunda ayrıca birtakım seccedilenekler de bulunmaktadır
D2 NMAKE Yardımcı Programı
NMAKEmdashveya MAKEmdashfarklı kaynak dosyalarda bulunan ccedilok sayıda moduumllden oluşanbuumlyuumlk programların otomatik olarak derlenmesi ve bağlanması iccedilin kullanılan biryardımcı programdır NMAKE programını ccedilalıştıracak komutun genel şekli şoumlyledir
CgtNMAKE seccedilimleropt makrotanımlarıopt
seccedilimler Aşağıdakiler olabilirFdosyaadı NMAKE yardımcı programı komutları iccedileren
tanımlayıcı dosyanın adı (Dosya tipi MAKrsquotır)D NMAKE tarafından işlenen her dosyanın son
değiştirilme tarihini goumlruumlntuumlleI Tanımlayıcı dosyadaki programlardan doumlnduumlruumllen
kodları dikkate alma ve daha sonraki satırlarıyuumlruumltmeyi suumlrduumlr
N Tanımlayıcı dosyadaki komutları işletme sadecegoumlruumlntuumlle
S Sessiz mod hiccedilbir şey goumlruumlntuumllemeXdosyaadı Hata mesajlarını bir dosyaya youmlnlendirX- Hata mesajlarını standart ccedilıktı aygıtına youmlnlendir
makrotanımları İsteğe bağlı olarak isim=metin şeklinde bir veya daha fazlasayıda karakter dizisi
Bir tanımlayıcı dosya bir veya daha fazla sayıda tanımlayıcı bloktan oluşur Boşsatırlar tanımlayıcı blokları ayırırlar Bir tanımlayıcı bloktaki maddelerin soumlzdizimi veanlambilimi aşağıda oumlzetlenmiştir
13
EK DMICROSOFT LIB VE MAKE YARDIMCI PROGRAMLARINA GENEL BİR BAKIŞ 157
ccedilıkdosya girdosya accedilıklamaaccedilıklama
komutlar
Ccedilıkdosya iki noktadan sonra gelen dosyalara bağımlıdır Komutlar satırı ccedilıkdosyauumlzerinde yapılacak işlemleri belirtir Oumlrneğin XYZMAK tanımlayıcı dosyasında
XYZEXE XYZC F1C F2C XYZyi derleyip bagla
CL XYZC F1C F2C
yazılı iseCgtNMAKE F XYZ
şeklinde bir ccedilağrı eğer XYZC F1C ve F2C dosyalarından herhangi biri XYZEXEoluşturulduktan sonra değiştirilmişse bu dosyaların tekrar derlenmesini sağlayacaktır
13
13
159
EK E DİLLERARASI CcedilAĞRILAR
Yazılım ayrı ayrı moduumlller şeklinde geliştirildiğinde moduumllleri ayrı programlama dillerikullanarak gerccedilekleştirmek olasıdır Bu hem o moduumll iccedilin belli bir dilin daha uygunolmasından hem de programcının o dili daha iyi bilmesinden dolayı belli bir dili seccedilmişolmasından kaynaklanabilir Oumlrneğin Crsquode yazılmış bir programın bazı moduumlleri iccedilin sıksık birleştirici dil kullanılır Bu ekte bir C programından bir birleştirici dil yordamıccedilağırmak veya bir birleştirici dil programından bir C fonksiyonu ccedilağırmak iccedilin ccedilağırma vearguumlman geccedilirme youmlntemlerini kısaca inceleyeceğiz BASIC Pascal ve FORTRANrsquodan Cyordamları veya Crsquoden bu dillerde yazılmış yordamları nasıl ccedilağırabileceğinizi oumlğrenmekiccedilin Microsoft C Version 500 Mixed Language Programming Guide (Karma DilProgramlama Kılavuzu) veya Microsoft Visual C++ Programming Techniques(Programlama Teknikleri) elkitaplarına bakınız
E1 Birleştirici İle Bağlayıcının Kullanılması
Bir C programında fonksiyon isimleri dışsal simgelermiş gibi işlem goumlruumlrler ve bağlayıcıtarafından kullanılmaları iccedilin amaccedil program dosyasına kaydedilirler Fakat bir farkla Cderleyicisi her fonksiyon isminin oumlnuumlne bir altccedilizgi ekler Oumlrneğin
xyz ()
fonksiyon tanımında fonksiyon ismi amaccedil programda _xyz şeklinde kaydedilirStandarda goumlre dışsal tanıtıcı soumlzcuumlklerde anlamlı karakter sayısı en az 8rsquodir Ayrıcakuumlccediluumlk buumlyuumlk harf ayırımı yapılmayabilir
Bir C fonksiyonu başka bir C fonksiyonunu ccedilağırdığında ccedilağrıdaki arguumlmanlar vedoumlnuumlş adresi yığıt adı verilen bir veri yapısı iccedilinde ccedilağrılan fonksiyona geccedilirilir ve
13
160 DİLLERARASI CcedilAĞRILAR EK E
ccedilağrılan fonksiyon değişiklikleri bu yığıt iccedilinde yapar Bundan dolayı ccedilağıran ile ccedilağrılanfonksiyonun bu yığıtı nasıl değiştirdiğini anlamak ccedilok oumlnemlidir
Yığıt belleğin buumlyuumlk adreslerinden kuumlccediluumlk adreslerine doğru buumlyuumlr C derleyicisiccedilağrıdaki arguumlmanları arguumlman listesindeki sıralarına goumlre fakat sağdan başlayarak yığıtayerleştirir Boumlylece yığıta en son itilen ve bundan dolayı en duumlşuumlk adreste bulunanarguumlman en soldaki yani arguumlman listesindeki ilk arguumlmandır Ccedilağıran yordam tarafındanyığıta en son itilen şey ise doumlnuumlş adresidir Ccedilağrılan yordam Taban Yazmaccedil BPrsquoniniccedileriğini saklayarak yerel verileri iccedilin yer ayırarak ve SI ile DI gibi iccedileriklerideğişebilecek olan yazmaccedilların iccedileriklerini saklayarak yığıtta değişiklikler yaparAşağıdaki ccedilizelge yığıtın iccedileriğini goumlstermektedir
nrsquoinci arguumlman (buumlyuumlk adres)ccedilağıran fonksiyon n-1rsquoinci arguumlmantarafından değiştirilen yığıt boumlluumlmuuml birinci arguumlman
doumlnuumlş adresiccedilağrılmış fonksiyon saklanmış BP larr BPtarafından değiştirilen yerel verileryığıt boumlluumlmuuml saklanmış yazmaccedillar larr SP (kuumlccediluumlk adres)
Her arguumlman iccedilin kullanılan bayt sayısı arguumlmanın tipi ve değerle veya referanslaccedilağrı gibi arguumlmanı geccedilirmek iccedilin kullanılan youmlnteme bağlıdır Referansla ccedilağrıdurumunda bir adres geccedilirildiğine goumlre bu sayı adresin yakınuzak niteliğine de bağlıdırAynı durum doumlnuumlş adresi iccedilin de soumlzkonusudur Her biri iccedilin kullanılan bayt sayısışoumlyledir
Youmlntem Tip Baytdeğerle short int 2değerle long 4değerle float 4değerle double 8referansla yakın 2referansla uzak 4doumlnuumlş adresi yakın 2doumlnuumlş adresi uzak 4
Program minik kuumlccediluumlk veya kısa bellek modelinde derlenmişse doumlnuumlş adresi yakınaksi takdirde uzaktır Uzak adresler kesimuzaklık şeklinde olurlar
Crsquode dizi dışındaki tuumlm veri yapılarının değerle dizilerin ise referansla geccedilirildiğinianımsayın Eğer bir dizinin değerle geccedilirilmesi isteniyorsa o zaman değerle geccedilirilen biryapının tek uumlyesi olarak tanımlanmalıdır
Ccedilağrılan yordam işini bitirdikten sonra hesapladığı değeri şu şekilde doumlnduumlruumlr
13
EK E DİLLERARASI CcedilAĞRILAR 161
DoumlnduumlruumllenDeğer Yazmaccedil1 bayt AL2 bayt AX4 bayt yuumlksek baytlar DXrsquote duumlşuumlk baytlar AXrsquote
gt 4 bayt değerin adresi DXAXrsquote
Aşağıdaki oumlrnekte birleştirici dilde yazılmış xyz adındaki fonksiyonu ccedilağıran bir Cmain fonksiyonu goumlsterilmektedir
extern int xyz (int int)
main () xyz(35)
MODEL SMALL
CODEPUBLIC _xyz
_xyz PROCpush bp Taban gosterge yazmacini saklamov bpsp Yigitta boyunda yenisub sp bir taban bolge acpush si SI ve DI yazmaclarini saklapush di pushf Bayrak yazmacini saklamov ax[bp+4] Ilk argumani AXe tasimov cx[bp+6] Ikinci argumani CXe tasi xyznin hesaplamasi gereken seyi hesaplamov ax Donus degerini koypopf Bayrak yazmacini geri alpop di DI ve SI yazmaclarini geri alpop simov spbp Yigiti temizlepop bp Eski BPyi geri alret Cagirana don
_xyz ENDPEND
Programları ayrı ayrı amaccedil dosyaları iccediline derleyin ve birleştirin daha sonra bu ikidosyayı tek bir yuumlruumltuumllebilir dosya şeklinde bağlayın
13
162 DİLLERARASI CcedilAĞRILAR EK E
E2 Satıriccedili Birleştiricisinin Kullanılması
Microsoft C Derleyicisinin 800 uyarlamasını kullanıyorsanız bir oumlnceki kısımdaanlatıldığı şekilde MASM gibi ayrı bir birleştirici kullanmanıza gerek kalmayabilirDerleyici iccediline dahil edilmiş satıriccedili birleştiricisini kullanabilirsiniz Bu durumda amaccedildosyaların LINK işlemiyle de uğraşmanıza gerek kalmaz
Satıriccedili birleştiricisinin birccedilok avantajları vardır tek bir kaynak dosya iccedilinde hem Chem de birleştirici kodunu yazma C değişmez değişken fonksiyon ve etiket isimlerinebirleştirici kod iccedilinden ulaşma C deyimleri arasına istenilen yere birleştirici kodu eklemegibi Ancak birleştirici kodun kullanılması taşınabilirlik sorunları ortaya ccedilıkarabilirbunun iccedilin birleştirici kodlarının kaynak dosya iccedilinde ayrı bir yerde tutulması yararlıolur
Satıriccedili birleştiricisini kullanmak iccedilin bir C fonksiyonu iccedilinde uygun yerlere__asm
şeklinde oumlzel bir deyim kullanmanız gerekir Oumlrneğin__asm mov ah2 mov dl7 int 21h
deyimi ekrana zil karakterinin yazılmasını sağlar
Satıriccedili birleştiricisinde birccedilok MASM ifadesi ve 80286 ile 80287 işlemci komutlarıkullanılabilir İfadeler iccedilinde kaynak dosyada tanımlanmış C isimleri de kullanılabilirAccedilıklamalar normal olarak satırın sonuna noktalı virguumlluumln arkasına yazılır Birleştiricikodu iccedilinde _emit soumlzde komutu kullanılarak tek bir bayt tanımlanabilir Oumlrneğin
_emit 0x66_emit 0x98
soumlzde komut sırası satıriccedili birleştiricisinin anlamadığı 80386 CWDE komutunun yerinekullanılabilir
Satıriccedili birleştiricisi kodu iccedilinde AX BX CX DX ES ve bayrak yazmaccedillarınıistediğiniz gibi kullanabilirsiniz Ancak DI SI DS SS SP ve BP yazmaccedillarıyla (STD veCLD komutuyla değiştirilebilen) youmln bayrağını eski halinde bırakmanız gerekir
13
EK E DİLLERARASI CcedilAĞRILAR 163
E3 Bir OumlrnekmdashDisket Saklama
Bu kısımda bir disketi olduğu gibi diske kopyalayıp geri alabilen veya disketle diskdosyasını karşılaştırabilen bir programı inceleyeceğiz Program bir disketi blok blokokuyup diskteki tek bir dosya iccediline kopyalamakta veya bu işin tam tersini yapmaktadır
Bu amaccedilla diskette istediğimiz bir sektoumlruuml okuyup yazabilen bir youmlntemegereksinimimiz vardır MS-DOS kesintilerinden 0x25 ve 0x26 bu işi yaparlar ancak birsorunları vardır Olası bir hata durumunu bayrak yazmacının elde (carry) bitinde hatakodunu ise AX yazmacında doumlnduumlruumlrler Bu arada bayrak yazmacının eski durumunu dayığıtta saklarlar Bu durumda bu kesintilerden doumlnuumllduumlğuuml zaman yığıtta fazla bir soumlzcuumlkbulunmaktadır Programa devam etmeden oumlnce bunun geri alınması gerekir Bu yuumlzdenbu kesintileri dosh başlık dosyasında tanımlanmış _int86 fonksiyonunu kullanarakccedilağıramayız birleştirici kodu yazmamız gerekir Aşağıdaki programda mdiskfonksiyonu bu işi yapar1 Disk uzerinde dosya seklinde disket saklama Uyarlama 2002 (C) Fedon Kadifeli 1989-19933 Derleyici Microsoft C Uyarlama 8004 56 include ltstdiohgt7 include ltstdlibhgt8 include ltconiohgt MS-CL 910 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 (1024SEKTOR) 1Klik bloklar 15 define MAKS_DB (66) en uzun dosya ismi boyu 1617 typedef unsigned char BAYT 8 bit 1819 BAYT tam1 [IOSSEKTOR] tam2 [IOSSEKTOR]2021 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
13
164 DİLLERARASI CcedilAĞRILAR EK E
30 mutlak disk girdicikti 31 size_t mdisk (BAYT kesno BAYT surno size_t seksay size_t sekno32 BAYT aktadr)33 34 size_t dondeg35 __asm 36 push di yazmaclari37 push si sakla38 push bp39 mov ahkesno kesinti numarasi (M_OKU M_YAZ)40 mov alsurno disket surucu numarasi41 sub alA A -gt 0 B -gt 142 mov cxseksay sektor sayisi43 mov dxsekno sektor numarasi44 mov bxaktadr aktarma adresi45 cmp ahM_OKU46 jne else eger M_YAZ ise47 int M_OKU48 jmp SHORT devam49 else int M_YAZ50 devam pushf51 pop ax bayraklari al52 and ax1 hata biti (kesinti donus degeri)53 popf bayraklari geri al54 pop bp yazmaclari55 pop si geri al56 pop di57 mov dondegax58 59 return dondeg 0 hata 1 tamam 60 mdisk 6162 menu seceneklerini sor 63 int mensor (void)64 65 int sec66 static char scnklr [] = 67 n68 1 SaklatDisket --gt Disk69 2 YukletDisket lt-- Disk70 3 KarsilastirtDisket lt-gt Disk 7172 printf(nntsntsntsnnSecenek73 scnklr[1] scnklr[2] scnklr[3])74 if ((sec = _getch()) == 1 || sec == S || sec == s)75 sec = 176 else if (sec == 2 || sec == Y || sec == y)77 sec = 278 else if (sec == 3 || sec == K || sec == k)79 sec = 380 else81 sec = 082 puts(scnklr[sec])83 return sec84 mensor 8586 kullanilacak disket surucusunu sor 87 int sursor (void)88 89 int sur90
13
EK E DİLLERARASI CcedilAĞRILAR 165
91 printf(Disket surucusu (AB) )92 if ((sur = toupper(_getch())) = A ampamp sur = B)93 sur = 094 printf(sur cn n sur)95 return sur96 sursor 9798 kullanilacak disk dosyasinin adini sor 99 char dossor (void)100 101 static char da [MAKS_DB+3] = MAKS_DB+1 102103 printf(Disk dosya adi )104 _cgets(da)105 putchar(n)106 return da[2] da+2 NULL107 dossor 108109 int main (void)110 111 int secenek surucu112 char da113 FILE dg114 int b115 size_t i d1 d2116117 printf(Disk uzerinde dosya seklinde disket saklama118 Uyarlama 200n(C) Fedon Kadifeli 1989-1993n)119 while ((secenek = mensor()) = 0)120 while ((surucu = sursor()) = 0)121 while ((da = dossor()) = NULL) 122 i = 0123 d1 = 1124 b = 0125 1 nolu secenek Disket --gt Disk 126 if (secenek == 1) 127 if ((dg = fopen(darb)) = NULL) 128 fclose(dg)129 printf(s dosyasi zaten varn da)130 continue131 132 if ((dg = fopen(dawb)) == NULL) 133 printf(s dosyasi acilamiyorn da)134 continue135 136 while (mdisk(M_OKU (BAYT)surucu IOS i tam1) ampamp137 (d1=fwrite((void )tam1 SEKTOR IOS dg)==IOS) = 0)138 printf(rd (i+=IOS)BBS)139 printf(d1 (i adet blok s dosyasina aktarildin140 Disket okunamadian)141 s dosyasinda yazma hatasian da)142 else 143 2 veya 3 nolu secenek 144 if ((dg = fopen(darb)) == NULL) 145 printf(s dosyasi acilamiyorn da)146 continue147
13
166 DİLLERARASI CcedilAĞRILAR EK E
148 2 nolu secenek Disket lt-- Disk 149 if (secenek == 2) 150 while (fread((void )tam1 SEKTOR IOS dg) == IOS ampamp151 (d1=mdisk(M_YAZ (BAYT)surucu IOS i tam1)) = 0)152 printf(rd (i+=IOS)BBS)153 printf(d1 adet blok diskete aktarildin154 Diskette yazma hatasian)155 else 156 3 nolu secenek Disket lt-gt Disk 157 while ((d1=mdisk(M_OKU (BAYT)surucu IOS i tam1)) amp158 (d2=fread((void )tam2 SEKTOR IOS dg)==IOS) ampamp159 (b =esit(tam1 tam2 IOSSEKTOR)) = 0)160 printf(rd (i+=IOS)BBS)161 printf(162 b Karsilastirma hatasian 163 d1 Dosya disketten kisaan 164 d2 Disket dosyadan kisaan 165 adet blok uyusuyorn)166 167 if 168 fclose(dg)169 while 170 printf(nIslem tamamlandin)171 return 0172 main
esit fonksiyonu (Satır 22-28) iki tampon boumllgeyi karşılaştırır eşitse 1 doumlnduumlruumlraksi takdirde 0 doumlnduumlruumlr
mdisk fonksiyonu (Satır 31-60) surnoda verilen suumlruumlcuumldekimdashbu programdasurno A veya B değerlerini alabilmektedirmdashsekno başlangıccedil sektoumlr (kesim)numarasından seksay sektoumlr sayısı kadar sektoumlr uumlzerinde işlem yapar kesnoM_OKUrsquoya eşitse disketten bu sektoumlrleri okuyup aktadr tampon boumllgesine aktarırkesno M_YAZrsquoa eşitse aktadr tampon boumllgesindeki baytları disketteki ilgili sektoumlrlereyazar Bu fonksiyon yukarıda anlatıldığı gibi ilgili kesintiyi ccedilağırdıktan sonra yığıttasaklanmış bulunan bayrakları bayrak yazmacına geri alır (Satır 53)
Menu seccedileneklerini kullanıcıya mensor fonksiyonu (Satır 63-84) goumlsterir veistenilen seccedileneği kullanıcıdan alır Bir numaralı seccedilenek programın disketi sektoumlr sektoumlrokuyup adı kullanıcıdan alınan bir disk dosyası iccediline kopyalamasını sağlar İki numaralıseccedilenek bu işin tersini yapar daha oumlnce bir numaralı seccedilenek kullanılarak disk dosyasıiccediline aktarılmış olan bir disket goumlruumlntuumlsuumlnuumln sektoumlr sektoumlr okunup formatlanmış birdiskete aktarılmasını sağlar Uumlccedil nolu seccedilenek diskteki dosya ile disketi karşılaştırır buseccedilenek bir veya iki nolu seccedilenekler kullanılarak yapılan bir kopyalama işlemindensonra işlemin doğruluğunu sınamak iccedilin kullanılabilir
Kullanılacak disket suumlruumlcuumlsuuml (ldquoArdquo veya ldquoBrdquo) sursor fonksiyonu (Satır 87-96)aracılığıyla kullanıcıdan alınır Kullanılacak disk dosyasının adı ise dossor fonksiyonu(Satır 99-107) tarafından alınır Burada dosya adını okumak iccedilin standart olmayan_cgets fonksiyonu kullanılmıştır _cgets fonksiyonu kontrolluuml bir şekilde klavyedenbir satır okumak iccedilin kullanılabilir
Ana fonksiyon iccediliccedile uumlccedil doumlnguumlden oluşur bunlar sırasıyla kullanıcıdan menuumlseccedileneğini kullanılacak suumlruumlcuumlyuuml ve dosya adını alırlar Her bir menuuml seccedileneği iccedilin
13
EK E DİLLERARASI CcedilAĞRILAR 167
yapılan işlem temelde aynıdır Bir doumlnguuml iccedilinde disk dosyası veveya disketten bilgiokunup gerekli işlem yapılır (Karşılaştırma seccedileneği kısmında satır 157rsquonin sonundaneden ampamp değil de amp kullanılmıştır)
Not Bu program kullanılırken dikkat edilmesi gereken bir nokta disket kapasitesidirİşlenen bilgi miktarı kilobayt cinsinden ekranda goumlruumlntuumllenir Oumlrneğin 144 megabaytlıkbir disket ile işlem yapıldığında ekrandaki sayının son durumu 1440 olmalıdırProgramda kullanılan kesintinin gerccedilek disket kapasitesini anlaması olası değildir MS-DOS ortamında iken en son yapılan disket işlemindeki disket kapasitesi kullanılır Buyuumlzden herhangi bir sorun ccedilıkmaması iccedilin program kullanılmadan oumlnce kullanılacakdisket tipinden bir disket suumlruumlcuumlye takılıp oumlrneğin ldquoDIR Ardquo veya ldquoCHKDSK Ardquoşeklinde bir MS-DOS komutu ccedilalıştırılmalıdır Bundan sonra program yuumlruumltuumllmesiesnasında kullanılan disketlerin kapasitesi değişmediği suumlrece herhangi bir sorunccedilıkmayacaktır Dikkat edilmesi gereken bir diğer nokta da kullanılan disketlerin formatlıolması ve bozuk sektoumlrlerin bulunmamasıdır
13
13
169
EK F STANDART CPROGRAMLAMA DİLİNİN DİĞER
OumlZELLİKLERİ
Bu ekte ANSI Standardında olmasına rağmen henuumlz yaygın olarak bilinmeyen ve pekkullanılmayan bazı oumlzelliklerden soumlzedilmektedir Ayrıca kitapta soumlzuuml edilmiş standartkuumltuumlphane fonksiyonları hakkında (doumlnuumlş tipi ve arguumlmanlarının tipi gibi) bazı detaylariccedilin son kısma başvurulabilir
F1 C Duumlnyanın Her YerindemdashYoumlreler
Bilginin goumlsterim yolları uumllkeden uumllkeye değişir Oumlrneğin tarih yazılırken Tuumlrkccedilersquodeoumlnce guumln sonra ay yazılır Bazı batı uumllkelerinde ise bunun tersi yapılır İngilizcersquodeondalık sayıları ayırmak iccedilin nokta kullanılırken başka uumllkelerde virguumll kullanılır Ve enoumlnemlisi de her uumllkenin kendine oumlzguuml harfleri vardır ve buumltuumln dillerin buumltuumln karakterleriniifade edebilecek tek bir karakter takımı yoktur
Bu konuya bir ccediloumlzuumlm getirmek iccedilin youmlreler kavramı getirilmiştir Bir youmlre belirli biruumllke veya dil iccedilin yukarıdaki paragrafta soumlzuuml edilen tuumlrden bilgileri iccedileren bir bilgipaketidir Youmlreler ctype fonksiyonlarını yazı yazma youmlnuumlnuuml saat-tarih biccedilimlerinikarakterlerin sırasını ve ondalıkları ayırmak iccedilin kullanılan karakteri belirlerler Yeni biryoumlre belirterek printf gibi birccedilok standart fonksiyonu etkilemek olasıdır
Kullanılmakta olan youmlre ile ilgili bilgileri lconv yapısı tutar ve buna bir goumlstergeelde etmek iccedilin localeconv adlı fonksiyonu ccedilağırmak gerekir Yuumlruumltme esnasındayoumlreyi belirtmek iccedilin şu iki arguumlmanı olan setlocale adlı fonksiyonu ccedilağırırsınızDeğiştirmek istediğiniz oumlzelliklerden oluşan grup (LC_COLLATE [karakter sırası]LC_CTYPE [karakter tipi] LC_MONETARY [para] LC_NUMERIC [sayılar] LC_TIME[zaman] LC_ALL [hepsi]) ve yeni oumlzelliklerin alınacağı youmlrenin adı Eğer buumltuumln diller
13
170 STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ EK F
iccedilin youmlreler tanımlanmışsa programın başında kullanıcının milliyetini sorup ondan sonrabu kişinin alıştığı şekilde ccedilalışan bir program yazılabilir Oumlrneğin
setlocale(LC_ALL turkish)
Standart sadece ldquoCrdquo youmlresinin gerccedilekleştirilmesini gerektirmektedir Bu da kitapboyunca anlatılan oumlzelliklerden oluşmaktadır
F2 Geniş Karakterler Ve Ccedilokbaytlı Karakterler
char tipinin 256 farklı değer alabilmesi temin edilmiştir Japonca veya Ccedilince gibi bazıdiller 256rsquodan fazla simge gerektirmektedir Boumlyle dillerle ccedilalışabilmek iccedilin genişkarakterler ve ccedilokbaytlı karakterler kavramı geliştirilmiştir
Bir geniş karakter wchar_t adlı standart tipe aittir Bu tamsayı tipi herhangi birkarakter takımındaki buumltuumln değerleri goumlsterebilecek kadar buumlyuumlk olan normalde 16 bitlikbir tiptir Geniş karakterlerden oluşan diziler başlangıccediltaki rsquoın hemen oumlnuumlne bir L harfikonarak belirtilir Karakter değişmezleri iccedilin de benzer şekilde rsquoın oumlnuumlne L konur
wchar_t gkd[] = LBir genis karakter dizisiwchar_t gk = Lh
Bir ccedilokbaytlı karakter ccedilevresel bir aygıta yazılabilecek bir veya birden fazla bayttanoluşan sıradan bir karakter sırasıdır Ccedilokbaytlı bir karakter dizisinin uzunluğunu eldeetmek iccedilin mblen fonksiyonu kullanılır
Bu iki karakter tuumlruuml birbirleriyle yakın ilişkili oldukları iccedilin bunlar arasındadoumlnuumlştuumlrme yapmayı isteriz Aşağıdaki fonksiyonlar bu işi yaparlar
wctomb bir geniş karakteri bir ccedilokbaytlı karakterembtowc bir ccedilokbaytlı karakteri bir geniş karakterewcstombs bir geniş karakter dizisini bir ccedilokbaytlı karakter dizisinembstowcs bir ccedilokbaytlı karakter dizisini bir geniş karakter dizisine
doumlnuumlştuumlruumlr
F3 Uumlccedilluuml Karakterler
Bazı klavyelerde C programlarında kullanılan bazı oumlnemli karakterler yazılamayabilirBoumlyle dokuz karakteri ifade etmek iccedilin dokuz oumlzel karakter sırası kullanılır Buumltuumln busıralar uumlccedil karakterden oluştuğu iccedilin bunlara uumlccedilluuml karakter denir Oumlnişlemci bir uumlccedilluumlkarakter ile karşılaştığında yerine onun ifade ettiği karakteri koyar Uumlccedilluuml karakterler veonların eşdeğerleri şunlardır
13
EK F STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ 171
Uumlccedilluuml Karakter Karakter= (sayı işareti)( [ (sol koumlşeli parantez) (ters boumlluuml)) ] (sağ koumlşeli parantez) ^ (uzatma işareti)lt (sol ccedilengelli parantez) | (dikey ccedilizgi)gt (sağ ccedilengelli parantez)- ~ (inceltme işareti)
Programın heryerinde uumlccedilluuml karakter yerine ilgili karakterin konulduğuna dikkat edinYani
printf(Devam(eh))
fonksiyon ccedilağrısıDevam[eh)
basacaktır
F4 Zaman Fonksiyonları
Zamanla ilgili dokuz tane standart fonksiyon bulunmaktadır Gerekli bildirimler timehadlı dosyada bulunmaktadır
Şu anki takvim zamanını elde etmek iccedilin time fonksiyonunu ccedilağırın Sonuccediltime_t tipindendir Eğer zaman elde edilebilir değilse bu fonksiyon -1 doumlnduumlruumlr
difftime fonksiyonu iki time_t arguumlmanı alır ve bunlar arasındaki zamanfarkının saniye cinsinden verildiği bir double doumlnduumlruumlr
Takvim zamanını yerel zamana doumlnuumlştuumlrmek iccedilin localtime fonksiyonunukullanın
gmtime fonksiyonu takvim zamanını (eskiden Greenwich Ortalama Saati olarakbilinen) Duumlzenlenmiş Evrensel Saate ccedilevirmek iccedilin kullanılır
Zamanı goumlruumlntuumllemek iccedilin oumlnce bir karakter dizisine ccedilevirmeniz gerekir Buasctime fonksiyonu ile yerine getirilir Arguumlmanı tarafından işaret edilen yapı iccedilindekizamanı bir karakter dizisine doumlnuumlştuumlruumlr
ctime(zg)
ccedilağrısıasctime(localtime(zg))
ccedilağrısına eşdeğerdir Yani yerel zamanı bir karakter dizisine doumlnuumlştuumlruumlr
13
172 STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ EK F
mktime fonksiyonu arguumlmanı tarafından işaret edilen yapı iccedilindeki yerel zamanıtakvim zamanına doumlnuumlştuumlruumlr ve sonucu time_t şeklinde doumlnduumlruumlr Eğer sonuccedil ifadeedilemezse -1 doumlnduumlruumlluumlr
Program ccedilalışmaya başladığından beri ne kadar işlemci zamanı kullandığınıoumlğrenmek iccedilin clock_t tipinden sonuccedil doumlnduumlren clock fonksiyonunu ccedilağırın
En son olarak şu anki youmlreye uygun olarak tarih ve saatler iccedileren karakter dizilerihazırlamak iccedilin strftime fonksiyonu kullanılabilir Doumlrt tane arguumlmanı vardır Sonuccediltauygun formatlanmış karakter dizisini iccedilerecek boumllgeye bir karakter goumlstergesi bu karakterdizisine konulacak en fazla karakter sayısını goumlsteren size_t tipinde bir sayıprintfrsquotekine benzeyen bir kontrol karakter dizisi ve zaman bilgisini iccedileren yapıya birgoumlsterge Normalde olduğu gibi oumlnuumlne konan kontrol karakter dizisindeki doumlnuumlşuumlmtanımlamaları zaman unsurlarını belirtirler ve sonuccediltaki karakter dizisinde kullanılmaktaolan youmlreye uygun olarak biccedilimlendirilmiş ilgili zaman bilgileri ile değiştirilirler Diğerkarakterler tıpkı printf gibi değiştirilmeden bırakılırlar Doumlnuumlşuumlm tanımlamaları veanlamları şoumlyledir
Doumlnuumlşuumlm Karakteri Anlamıa kısaltılmış guumln adıA tam guumln adıb kısaltılmış ay adıB tam ay adıc yerel tarih ve saat goumlsterimid ay iccedilindeki guumlnH saat (24 saatlik)I saat (12 saatlik)j yıl iccedilindeki guumlnm ayM dakikap AM (oumlğleden oumlnce) veya PM (oumlğleden sonra)
ifadelerinin yerel eşdeğeriS saniyeU (Pazar guumlnuumlnden başlamak koşuluyla) yıl iccedilindeki
hafta sayısıw hafta iccedilindeki guumlnW (Pazartesi guumlnuumlnden başlamak koşuluyla) yıl
iccedilindeki hafta sayısıx yerel tarih goumlsterimiX yerel saat goumlsterimiy yılın son iki rakamıY yılZ saat dilimi adı
13
EK F STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ 173
strftime en sondaki 0 hariccedil oluşturulan karakter sayısını doumlnduumlruumlr Eğer busayı ikinci arguumlmandan buumlyuumlkse 0 doumlnduumlruumlluumlr
F5 Standart Başlık Dosyaları
ANSI Standardı değişmez makro ve tip tanımlayan değişken bildiren ve tuumlm standartkuumltuumlphane fonksiyonlarının prototiplerini iccedileren 15 tane başlık dosyası tanımlar BirANSI fonksiyonu ccedilağırmadan oumlnce ilgili başlık dosyası include emri ile programadahil edilmelidir Bazı gerccedilekleştirmelerde bazı ldquofonksiyonlarrdquo oumlnişlemci makrolarışeklinde tanımlanmışlardır Kullanıcı accedilısından bir fonksiyonun gerccedilekten fonksiyonşeklinde mi yoksa makro şeklinde mi tanımlanmış olduğu bir istisna dışında farketmezMakro arguumlmanları parametre makro iccedilinde kaccedil defa kullanılırsa o kadar kerehesaplanırlar Eğer arguumlmanlarda yan etkili işleccedil veya fonksiyonlar kullanılırsa bu sorunyaratabilir Oumlrneğin bazı uygulamalarda tolower ve toupper makro şeklindectypeh iccedilinde tanımlanırken stdlibh iccedilinde ilgili fonksiyonların bildirimiyapılmaktadır Eğer yan etkisi olmayan işleccediller iccedileren arguumlmanlar verecekseniz daha hızlıolacağı iccedilin makroları kullanmak daha akılcıdır ancak arguumlmanlar olası yan etkileri olankarmaşık ifadeler ise arguumlmanların bir defa hesaplanacakları ilgili fonksiyonları ccedilağırın
asserthmdashDiyagnostikler
Bu dosyada yuumlruumltme esnasında bir savı (mantıksal ifadeyi) kontrol edip eğer yanlışsa birdiyagnostik goumlruumlntuumlleyen bir ldquofonksiyonrdquo tanımı vardır
void assert(int)
Eğer bu dosya programa iccedilerilmeden oumlnce NDEBUG define ile tanımlanmışsaassert ccedilağrısı dikkate alınmaz aksi takdirde aşağıdakine benzer bir durum gerccedilekleşir
define assert(exp) if ((exp)) fprintf(stderrAssertion failed s file s line dn exp __FILE__ __LINE__) abort()
ctypehmdashKarakter Kontrolleri Ve Doumlnuumlşuumlmleri
Bu dosya karakterleri kontrol eden veya değiştiren fonksiyonlar veveya makrolar bildirirTest fonksiyonları veya makroları doğru iccedilin sıfırdan farklı herhangi bir tamsayı aksitakdirde sıfır doumlnduumlruumlrler
int isalnum(int)int isalpha(int)int iscntrl(int)
13
174 STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ 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)
errnohmdashHatalar
Bu dosya errno değişkeni iccedilin bir bildirim iccedilerir Ayrıca ccedileşitli kuumltuumlphane fonksiyonlarıtarafından bir hata durumunu goumlstermek iccedilin EDOM ERANGE gibi bu değişkeneverilebilecek bazı sıfırdan farklı değişmezler tanımlar
floathmdashKayan Noktalı Değerler İccedilin Sınırlar
Bu dosya kayan noktalı (yani float double ve long double) değerler iccedilin bazıdeğişmezler tanımlar Standart tarafından kabul edilebilen en kuumlccediluumlk değerler paranteziccedilinde goumlsterilmiştir
FLT_DIG duyarlı ondalık rakam sayısı (6)FLT_EPSILON 10+FLT_EPSILON=10 şekilde en kuumlccediluumlk sayı (1E-5)FLT_MANT_DIG FLT_RADIX tabanına goumlre mantisteki rakam sayısıFLT_MAX en buumlyuumlk değer (1E+37)FLT_MAX_10_EXP en buumlyuumlk ondalık uumlsFLT_MAX_EXP en buumlyuumlk uumlsFLT_MIN en kuumlccediluumlk duumlzguumlnlenmiş pozitif değer (1E-37)FLT_MIN_10_EXP en kuumlccediluumlk ondalık uumlsFLT_MIN_EXP en kuumlccediluumlk uumlsFLT_RADIX uumlssuumln taban rakamı (2)FLT_ROUNDS toplamada yuvarlama
DBL_DIG duyarlı ondalık rakam sayısı (10)DBL_EPSILON 10+DBL_EPSILON=10 şekilde en kuumlccediluumlk sayı (1E-9)DBL_MANT_DIG DBL_RADIX tabanına goumlre mantisteki rakam sayısıDBL_MAX en buumlyuumlk değer (1E+37)DBL_MAX_10_EXP en buumlyuumlk ondalık uumlsDBL_MAX_EXP en buumlyuumlk uumlsDBL_MIN en kuumlccediluumlk duumlzguumlnlenmiş pozitif değer (1E-37)DBL_MIN_10_EXP en kuumlccediluumlk ondalık uumlsDBL_MIN_EXP en kuumlccediluumlk uumlsDBL_RADIX uumlssuumln taban rakamıDBL_ROUNDS toplamada yuvarlama
13
EK F STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ 175
LDBL_DIG duyarlı ondalık rakam sayısıLDBL_EPSILON 10+LDBL_EPSILON=10 şekilde en kuumlccediluumlk sayıLDBL_MANT_DIG LDBL_RADIX tabanına goumlre mantisteki rakam sayısıLDBL_MAX en buumlyuumlk değerLDBL_MAX_10_EXP en buumlyuumlk ondalık uumlsLDBL_MAX_EXP en buumlyuumlk uumlsLDBL_MIN en kuumlccediluumlk duumlzguumlnlenmiş pozitif değerLDBL_MIN_10_EXP en kuumlccediluumlk ondalık uumlsLDBL_MIN_EXP en kuumlccediluumlk uumlsLDBL_RADIX uumlssuumln taban rakamıLDBL_ROUNDS toplamada yuvarlama
limitshmdashTamsayı Değerleri İccedilin Sınırlar
Bu dosya ccedileşitli boylardaki tamsayılar iccedilin bazı uumlst ve alt sınırlarla ilgili değişmezlertanımlar Kabul edilebilir en duumlşuumlk değerler parantez iccedilinde goumlsterilmiştir Yani birderleyici iccedilin INT_MAX 32767rsquoden buumlyuumlk olabilir fakat Standarda uygun hiccedilbirderleyicinin bu sayıdan kuumlccediluumlk bir INT_MAX sağlamasına izin verilmez
CHAR_BIT bir charrsquodaki bit sayısı (8)CHAR_MAX en buumlyuumlk char değeri (UCHAR_MAX veya SCHAR_MAX)CHAR_MIN en kuumlccediluumlk char değeri (0 veya SCHAR_MIN)INT_MAX en buumlyuumlk (signed) int değeri (+32767)INT_MIN en kuumlccediluumlk (signed) int değeri (-32767)LONG_MAX en buumlyuumlk (signed) long değeri (+2147483647)LONG_MIN en kuumlccediluumlk (signed) long değeri (-2147483647)SCHAR_MAX en buumlyuumlk signed char değeri (+127)SCHAR_MIN en kuumlccediluumlk signed char değeri (-127)SHRT_MAX en buumlyuumlk (signed) short değeri (+32767)SHRT_MIN en kuumlccediluumlk (signed) short değeri (-32767)UCHAR_MAX en buumlyuumlk unsigned char değeri (255U)UINT_MAX en buumlyuumlk unsigned int değeri (0xFFFF)ULONG_MAX en buumlyuumlk unsigned long değeri (0xFFFFFFFF)USHRT_MAX en buumlyuumlk unsigned short değeri (0xFFFF)MB_LEN_MAX bir ccedilokbaytlı karakter iccedilindeki en buumlyuumlk bayt sayısı
localehmdashYoumlre Fonksiyonları
Bu dosya ldquostruct lconvrdquo iccedilin bir tip tanımlaması LC_ALL LC_COLLATELC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME değişmezlerinin tanımlarını veaşağıdaki fonksiyon prototiplerini iccedilerir
struct lconv localeconv(void)char setlocale(int const char )
13
176 STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ EK F
mathhmdashMatematiksel Yordamlar
Bu dosya birtakım kayan noktalı matematik yordamları tarafından hata durumundadoumlnduumlruumllen bir değeri tutmak iccedilin HUGE_VAL adlı double değişkenini bildirir Ayrıcaalan hatası veya taşma durumlarını goumlstermek iccedilin sırasıyla EDOM veya ERANGE değerierrno değişkenine atanır Fonksiyon prototipleri şoumlyledir
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)
setjmphmdashYerel Olmayan Atlamalar
Bu dosya program durumunu saklamak ve tekrar yuumlklemek iccedilin setjmp makrosu ilelongjmp fonksiyonunun kullandığı jmp_buf adlı makineye bağlı bir tampon boumllgeiccedilin bir tip tanımlar ve ayrıca bu yordamların bildirimini iccedilerir
void longjmp(jmp_buf int)int setjmp(jmp_buf)
signalhmdashSinyaller
Bu dosya yuumlruumltme esnasında kesintileri veya hataları işlemek iccedilin kullanılan fonksiyonlarbildirir
13
EK F STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ 177
Sinyal tipleri
SIGABRT abort ccedilağrısı ile tetiklenen duumlzensiz sonuccedillanmaSIGFPE kayan noktalı işlem hatasıSIGILL hatalı komutmdashgeccedilersiz fonksiyon imgesiSIGINT CONTROL+C kesintisimdashetkileşimli dikkatSIGSEGV bellek sınırları dışında erişimSIGTERM oumllduumlrme sonucu yazılım sonlandırma sinyali
Sinyal işleyiş kodları
SIG_DFL varsayılan signal işleyişiSIG_IGN dikkate almama
Hata durumunda signal ccedilağrısı tarafından doumlnduumlruumllen sinyal hata değeri
SIG_ERR signal hata değeri
Fonksiyon prototipleri
int raise(int)void ( signal(int void ()(int)))(int)
stdarghmdashDeğişken Arguumlman Listeleri
Bu dosya değişken sayıda arguumlman alabilen fonksiyonların arguumlmanlarına erişebilmesiiccedilin standart youmlntemler tanımlar va_list tipi bir goumlsterge olarak tanımlanmıştır
tip va_arg(va_list tip)void va_end(va_list)void va_start(va_list son_arguumlman)
stddefhmdashStandart Sistem Tanımları
Bu dosya NULL goumlsterge değeri errno dışsal değişkenine bir referans ve uygulamayabağlı olarak değişen ptrdiff_t (iki goumlstergenin farkı alındığında elde edilen işaretlideğerin tipi) size_t (sizeof işleci tarafından doumlnduumlruumllen işaretsiz değerin tipi) vewchar_t (geniş bir karakterin tipi) iccedilin tanımlar iccedilermektedir
stdiohmdashStandart Girdi Ve Ccedilıktı
Bu dosya standart girdiccedilıktı yordamları tarafından kullanılan yapılar değerler makrolarve fonksiyonlar tanımlar size_t va_list fpos_t ve FILE adlı tipler BUFSIZEOF NULL FILENAME_MAX (dosya isimlerinde en buumlyuumlk karakter sayısı)FOPEN_MAX (aynı anda accedilık olabilecek en ccedilok dosya sayısı) P_tmpnam (geccedilicidosyaların accedilılabileceği altdizin) L_tmpnam (geccedilici dosya isimlerinin uzunluğu)TMP_MAX (accedilılabilecek en ccedilok farklı geccedilici dosya isimleri sayısı) SEEK_CURSEEK_END SEEK_SET stdin stdout stderr _IOFBF _IOLBF ve _IONBFdeğişmezleri bu dosyada tanımlanmışlardır Fonksiyon prototipleri
13
178 STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ 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)
stdlibhmdashSıkccedila Kullanılan Kuumltuumlphane Fonksiyonları
Bu dosyada size_t wchar_t div_t (divrsquoden doumlnduumlruumllen yapı) ve ldiv_t(ldivrsquoden doumlnduumlruumllen yapı) tipleri ve NULL RAND_MAX (rand fonksiyonundan
13
EK F STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ 179
doumlnduumlruumllen en buumlyuumlk değer) EXIT_SUCCESS (programın başarılı exit kodu) veEXIT_FAILURE (programın başarısız exit kodu) değişmezleri iccedilin tanımlarlaMB_CUR_MAX (şu anki youmlreye goumlre bir ccedilokbaytlı karakter iccedilindeki en buumlyuumlk bayt sayısı)ve errno değişkenleri iccedilin bildirimler bulunmaktadır 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)
Eğer tolower makrosu define ile tanımlanmamışsa
int tolower(int)
Eğer toupper makrosu define ile tanımlanmamışsa
int toupper(int)
stringhmdashKarakter Dizileri İşleyen Fonksiyonlar
Bu dosya NULL değişmezi ile size_t iccedilin bir tip tanımı ve aşağıdaki fonksiyonprototiplerini iccedilerir
13
180 STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ 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)
timehmdashTarih Ve Saat Fonksiyonları
Bu dosya zaman yordamları iccedilin bildirimler ile size_t ve sırasıyla clock ve timefonksiyonları tarafından doumlnduumlruumllen uygulamaya bağlı clock_t ve time_t tiplerinintanımlarını iccedilerir Ayrıca localtime ve gmtime yordamları tarafından doumlnduumlruumlluumlpasctime tarafından kullanılan yapı şoumlyle tanımlanmaktadır
struct tm int tm_sec dakikadan sonraki saniyeler [060] int tm_min saatten sonraki dakikalar [059] int tm_hour geceyarisindan beri saatler [023] int tm_mday ayin gunu [131] int tm_mon Ocaktan beri aylar [011] int tm_year 1900dan beri yillar int tm_wday Pazardan beri gunler [06] int tm_yday Ocak 1den beri gunler [0365] int tm_isdst Yaz Saati Uygulamasi bayragi
CLOCKS_PER_SEC makrosu ldquoclock()CLOCKS_PER_SECrdquo ifadesiaracılığıyla saniye cinsinden işlemci zamanını elde etmek iccedilin kullanılabilir
Bu dosyada ayrıca ctime ailesinden yordamlar tarafından kullanılan kuumlreseldeğişkenler iccedilin extern bildirimleri de bulunmaktadır
13
EK F STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ 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] StandartYaz 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 )
F6 Ccedilevirme Sınırları
ANSI Standardı Standart C uyumlu her derleyici tarafından karşılanması gerekenbirtakım sınırlar tanımlamıştır Oumlrneğin tanımlanan bir nesne iccedilin izin verilen en buumlyuumlkboy 32 767 bayttır ancak belli bir derleyici 40 000 karakterlik bir dizi gibi daha buumlyuumlkbir nesneye izin verebilir Her durumda taşınabilirliği garantilemek iccedilin programınızınaşağıda belirtilmiş ldquoen kuumlccediluumlk buumlyuumlkrdquo sınırlar iccedilinde kalmasını sağlayın
Bir fonksiyon ccedilağrısındaki arguumlmanlar31Bir nesnedeki baytlar 32 767Bir switch deyimindeki case etiketleri 257Mantıksal bir kaynak kod satırındaki karakterler 509Bir karakter dizisi değişmezindeki karakterler 509Bileşik deyimler iccediliccedile yazma15bir enumrsquodaki değişmezler127do for ve while iccediliccedile yazma 15Tam bir ifade iccedilindeki ifadeler iccediliccedile yazma32Bir ccedilevirme birimi iccedilindeki dışsal tanıtıcı soumlzcuumlkler 511Başlık dosyaları iccediliccedile yazma 8Bir blok iccedilindeki etki alanı blok olan tanıtıcı soumlzcuumlkler 127if ve switch deyimleri iccediliccedile yazma 15if ifdef ve ifndef iccediliccedile yazma 8Bir ccedilevirme birimi iccedilindeki makro tanıtıcı soumlzcuumlkleri 1 024Bir struct veya union iccedilindeki uumlyeler 127Bir fonksiyon tanımındaki parametreler 31Bir makro iccedilindeki parametreler31Bir dışsal tanıtıcı soumlzcuumlk iccedilindeki anlamlı karakterler 8
13
182 STANDART C PROGRAMLAMA DİLİNİN DİĞER OumlZELLİKLERİ EK F
Bir iccedilsel tanıtıcı soumlzcuumlk iccedilindeki anlamlı karakterler31struct veya union tanımları iccediliccedile yazma 15
13
183
EK G SECcedilİLMİŞ PROBLEMLEREYANITLAR
Bu ekte her boumlluumlmuumln sonunda verilen problemlerden bazıları iccedilin yanıtlar verilmiştirBazı problemler iccedilin değişik ccediloumlzuumlmler de soumlzkonusu olabilir Burada ilk sayı boumlluumlmuumlikinci sayı ise problemi belirtir
11 Şunu deneyin
void main (void) int entry
14 Evet x=5 deyimine eşdeğerdir
15 Evet boş bir blok deyimidir
16 scanf(f ampx)printf(d (int)x)
22 switch (yas) case 16 printf()
24 include ltstdiohgtvoid main (void) unsigned i n scanf(u ampn) for (i=1 ilt=n i++) printf(utgn ii 10i)
13
184 SECcedilİLMİŞ PROBLEMLERE YANITLAR EK G
26 include ltstdiohgtvoid 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
28 Satır 32rsquodeki dorsquoyu uygun bir şekilde whilersquoa ccedilevirin
31 Goumlsterge aritmetiğine karşılık tamsayı aritmetiği
32 include ltstdiohgtvoid main (void) printf(s-doldurman (-10gtgt1lt0)isaretsifir)
33 include ltstdiohgtvoid main (void) unsigned n b scanf(d ampn) for (b=0 n=0 ngtgt=1) b += namp1 printf(d bitn b)
34 Eğer a ve b aynı tipten ise iccedileriklerini değiştirir
41 Hayır Bundan emin olamayız ccediluumlnkuuml bu fonksiyon arguumlmanlarının hesaplanmasıralarına bağlıdır
42 int maks (int x ) int maks xg for (maks = (xg=ampx) xg = 0 xg++) if (maks lt xg) maks = xg return maks
13
EK G SECcedilİLMİŞ PROBLEMLERE YANITLAR 185
Tanımda ldquordquo (uumlccedil nokta) geri kalan parametrelerin sayılarının (ve tiplerinin)belirlenmediği anlamına gelir Ancak boumlyle değişken sayıda arguumlmanlı fonksiyonyazmanın taşınabilir yolu bu değildir Bunun yerine aşağıda goumlsterildiği gibistdargh standart başlık dosyasında tanımlanmış bulunan va_start va_argve va_end makroları kullanılmalıdır
include ltstdarghgtint 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(xgint)) if (x gt m) m = x yeni enbuyuk va_end(xg) donmeden once temizlik yap return m
43 İlklenmemiş otomatik değişkenler belirsiz değerler taşır Bu daha oumlnce aynı adrestesaklanmış olan bir otomatik değişkenin değeri olabilir
44 Sadece ilk iki register bildirimi dikkate alınır geri kalanlar auto gibi işlemgoumlruumlrler Aynı zamanda bir oumlnceki alıştırmaya bakın
45 Girilen satırdaki karakterleri tersten basar
51 (a) sıfır yani ilk sayıcı ve (b) belirsiz bir değer
54 int tamsayıya goumlstergeint [3] tamsayıya 3 goumlstergeden oluşan diziint ()[3] 3 tamsayıdan oluşan diziye goumlstergeint (float) arguumlmanı float olan ve intrsquoe goumlsterge doumlnduumlren fonksiyonint ()(void) arguumlmanı olmayan ve int doumlnduumlren fonksiyona goumlsterge
55 a[ij] ile a[(ij)] eşdeğerdir bu da a[j]rsquoye yani bir goumlstergeye eşdeğerdir
56 x dizi olmasına karşın a bir goumlstergedir
58 a değişmez bir goumlstergedir bundan sonra hep ampyrsquoyi goumlstermek zorundadır Fakatgoumlsterdiği yer yani y iccedilindeki bilgi değiştirilebilir
b de değişmez bir goumlstergedir bunun yanında goumlsterdiği yer yani x de programtarafından değiştirilemez Buna rağmen bu yer program dışındaki bir suumlreccediltarafından değiştirilmektedir Yani brsquonin goumlsterdiği yeri program değiştiremezsadece okuyabilir
61 typedef int gosterge
ile
13
186 SECcedilİLMİŞ PROBLEMLERE YANITLAR EK G
define gosterge int
birbirine benzemektedir ama
typedef int dizi[N]
define ile ifade edilemez onun iccedilin typedef tercih edilir
62 define dok(x) printf(x = dn x)
Eğer Standarda uygun bir oumlnişlemciniz varsa o zaman aşağıdakini kullanındefine dok(x) printf(x = dn x)
79 include ltstdlibhgtvoid temizle (void) system(CLS)
13
187
EK H TUumlRKCcedilE-İNGİLİZCE VEİNGİLİZCE-TUumlRKCcedilE TERİMLER
SOumlZLUumlĞUuml
Bu kitapta olanaklar oumllccediluumlsuumlnde İngilizce terimlerden kaccedilınılmaya ccedilalışılmıştır Onunyerine Tuumlrkccedilersquode yaygın olarak kullanılan bilgisayar terimleri veyamdashCrsquonin oumlzel terimleriiccedilinmdashyeni Tuumlrkccedile karşılıklar bulunmuştur Okuyucuların terminoloji konusunda faklıduumlşuumlncelerde olması doğaldır Ancak bir metnin akıcılığını yitirmemesi ve hiccedil İngilizcebilmeyen kişilerin de zorlanmadan bilgisayar konusundaki kitapları okuyabilmeleri iccedilinulusal bir bilgisayar terminolojisinin oluşturulması ve geliştirilmesi gerekmektedir Buterminoloji iccedilinde Tuumlrkccedilersquoye girip tuumlrkccedileleşmiş soumlzcuumlkler pekala bulunabilir ancak bellibir standardın bulunması esastır Oumlrneğin ldquoccedileviricirdquo soumlzcuumlğuumlnden birisinin translatorbaşkasının assembler anlamaması gerekir
Bu ek boumlyle bir duumlşuumlncenin sonucunda ortaya ccedilıkan ve bu kitapta da kullanılan birccedilalışmanın sonucunu vermektedir İlk kısımda okuyucularımızın kitap iccedilindekarşılaştıkları Tuumlrkccedile terimlerin İngilizce karşılıklarını bulabilecekleri bir Tuumlrkccedile-İngilizce soumlzluumlk bulunmaktadır İkinci kısımdaki İngilizce-Tuumlrkccedile soumlzluumlk ise İngilizceterimlerin karşılığı olarak hangi Tuumlrkccedile terimlerin kullanıldığını goumlstermesi accedilısındanokuyucularımıza yardımcı olacaktır
H1 Tuumlrkccedile-İngilizce Soumlzluumlkaccedilıklamacommentaccedilılı parantez ltgt angular bracketaccedilmaunpackadres addressadres almaaddress ofadreslemeaddressing
13
188 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
ağ networkağa koumllemaster slaveağaccediltreeakımcurrentakış ccedilizeneği flowchartaktarma copy transferalan field domain rangealfasayısal alphanumericalgoritmaalgorithmaltccedilizgi _ underscorealtdizin directoryaltprogram subprogramalttaşmaunderflowaltyordamsubroutineamaccedil program object programana bellekmain memoryana bilgisayarmainframe host computeranahtar key switch toggleanahtar soumlzcuumlk keywordanlambilimsemanticsanlambilimselsemanticanlamlı rakam significant digitanlamsalsemanticarabirim interfacearama search seekarguumlman argumentaritmetik mantık birimi arithmetic and logic unit (ALU)artımincrementartırma incrementatama deyimiassignment statementaygıt deviceayırıcıseparatorayırmaallocation partitioningayraccedil parenthesisayrılmış soumlzcuumlk reserved wordayrıştırıcıparserazaltmadecrementbağıntısal relationalbağlam contextbağlama linkbağlayıcı linkerbakımmaintenancebasamaklı scalarbasılmayan karakter nonprint characterbaşlık header
13
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml 189
bayrak flagbayt bytebelgelemedocumentationbelirsiz undefinedbelirteccedilspecifierbellek memorybellek ayırma storage allocationbellek sınıfı storage classbellenirmnemonicbenzetim simulationbenzetmeemulationbiccedilim(lendirme) formatbiccedilimsel formalbildirim declarationbildirme declarebileşik deyimcompound statementbilgiinformationbilgisayar computerbilgisayar destekli tasarım computer aided design (CAD)birikeccedilaccumulatorbirim unitbirleşme associativitybirleştiriciassemblerbirleştirici dil assembly languagebirleştirmemergebirlik unionbitbitbitişme joinbitsel bitwiseblokblockBoole cebiri Boolean algebraboş blankboş dizgi null stringboş karakter null characterboşluk karakteri space characterboysizeboyutdimensionboumlluumlslashbuluşsal heuristicccedilağırma callccedilağrı callccedilengelli parantez braceccedilevirici translatorccedilevreselperipheralccedilevrimdışı offline
13
190 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
ccedilevrimiccedili onlineccedilıktıoutputccedilift duyarlık double precisionccedilizelgetableccedilizici plotterccedilok iş duumlzeni multitaskingccedilok kullanıcılı multiuserccediloklama multiplexingccediloklu multipleccediloumlzuumlmlemeanalysisccediloumlzuumlnuumlluumlrluumlk resolutiondal branchdallanma branchingdeğer ile ccedilağrı call by valuedeğil notdeğişkenvariabledeğişmezconstantdenetim controldenetlemeverifyderleme compilederleyici compilerdevingen dynamicdevre circuitdeyimstatementdışsalexternaldikey verticaldillanguagedisk diskdizgi stringdiziarraydizindirectory indexdoğrudan erişimdirect accessdoğrulamavalidatedoğruluk tablosu truth tabledoğruluk-değerli truth-valueddolaylama işleci indirection operatordolaylı adreslemeindirect addressingdonanımhardwaredosyafiledosya sonu end of file (EOF)dosya tipi extensiondoumlkuumlmdumpdoumlnguumlloopdoumlnuumlş returndoumlnuumlştuumlrme convert
13
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml 191
doumlnuumlşuumlm conversiondoumlnuumlşuumlm tanımlaması conversion specificationdurağan staticduraktabduralstaticdurmahaltduyarlıkprecisionduumlğuumlmnodeduumlşuumlk duumlzeyli dillow level languageduumlşuumlrme abortduumlzen order schemeekran screenelkitabı manualemirdirectiveenbuumlyuumlk maximumeniyi optimaleniyileştirici optimizingenkuumlccediluumlkminimumerimrangeerişimaccess retrievalerişim modu access modeeş(leşme)matcheşanlamlısynonymeşik thresholdeşitlik equalityeşlik parityeşmerkezlicoaxialeşzamanlı synchronousetiket labeletki alanı scopeetkileşimli interactivefaremousefonksiyon functiongeccedilişpass rungeccediliş suumlresirun timegenişlemeextensiongerccedilek adresactual addressgerccedilek zaman real timegerccedilekleştirmeimplementationgeri alma backspacegeriye doumlnuumlş (yapma) backtrackgetirmefetchgirdi inputgirdiccedilıktı (GCcedil) inputoutput (IO)goumlreli adres relative address
13
192 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
goumlrevtaskgoumlruumlntuuml bellekvirtual memorygoumlruumlntuuml noktası pixelgoumlruumlnuumlmconfigurationgoumlsterge pointergoumlsterimnotationguumlncelleştirmeupdateguumlvenilirlik reliabilityhareket transactionhata bug errorhata duumlzelticisi debuggerhata duumlzeltmedebughedef destinationhesaplama evaluateiccedilerikcontenticcediliccedile nestediccedilselinternalifadeexpressionikilbitikili binaryikili duumlğuumlmlenmiş onlu yazımbinary coded decimal (BCD)ikiye tuumlmlertwos complementiletipromptiletişimcommunicationilişki relationilişkiselrelationalilk değer atama initializeilkleme initializeilkleyen initializerimleccedil cursorindis subscript indexindislemeindexingiptalcancelisteğe bağlıoptionaliş jobişaret mark signişaret biti sign bitişaretsizunsignedişleccediloperatorişleklik activityişlem operationişlem kodu opcodeişlem operatoumlruuml operatorişlemci operatorişlemeprocessing
13
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml 193
işlenenoperandişletilebilirexecutableişletim sistemi operating systemişletme executioniz trackizleme tracekabuk shellkaccedilış sırası escape seqencekaccedilış tuşu escape keykalıpcast patternkalıtıminheritancekaraktercharacterkarakter dizisi stringkarakter sırasıcharacter sequencekarardecisionkayan noktalıfloating pointkaydırma shiftkayıt recordkayma scrollkaynak program source programkesilme noktası breakpointkesim sector segmentkesinti interruptkısaadacronymkısım sectionkişisel bilgisayar personal computer (PC)kitaplıklibraryklavye keyboardkodcodekod ccediloumlzmedecodekodlama coding encodekomutcommand instructionkontrol controlkontrol akışı control flowkontrol karakteri control characterkonumposition offsetkopyalamacopykoşullu dallanmaconditional branchkoşulsuz dallanmaunconditional branchkoumlkradixkoumlşeli parantez [] bracketkullanıcı userkullanıcı-tanımlıuser-definedkullanma referencekurgusetup
13
194 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
kuruluş installationkuşakgenerationkuyrukqueue tailkuumlme setkuumlme komut işlemepipelining pipingkuumlnye tagkuumlresel globalkuumltuumlphane libraryliste listmakine dili machine languagemakromacromantıklogicmantıksal kaydırmalogical shiftmenuuml menumerkezi işlem birimi (MİB)central processing unit (CPU)mesajmessagemetintextmetin duumlzenlemeeditingmetin duumlzenleyicieditormikroişlemci microprocessormimariarchitecturemodmodemoduumllermodularmonitoumlr monitormutlak adresabsolute addressnesneobjectnesneye dayalıobject orientedniteleyici qualifiernitelikattributeokunaklılıkreadabilityolumlu sayı positive numberolumsuz sayı negative numberolumsuzlamanegationonaltılı goumlsterimhexadecimal notationondalıkdecimalortamenvironment mediumotomasyonautomationotomatikautomaticoumlbek blockoumln bellek cache memoryoumlncelik priority precedenceoumlnek prefixoumlnişlemcipreprocessoroumlnyuumlkleme bootstrappingoumlrneksel analog
13
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml 195
oumlrtuuml maskoumlzccedilağrı recursionoumlzccedilağrılı recursiveoumlzdevimli automaticoumlzdevinim automationoumlzel karakter special characteroumlzellik propertypaketlemepackingparametre parameterparantez parenthesispencere windowplan schemaprogram programprogram sayacıprogram counterprogramcıprogrammerprogramlama diliprogramming languagerakamdigitrastgele erişimli bellekrandom access memory (RAM)rastgele sayı random numberreferans referencereferans ile ccedilağrı call by referencesaatclocksabit constantsağa yanaştırmaright justifysaklamasave storesalt okunur bellekread only memory (ROM)satır ilerletme line feedsatırbaşıcarriage returnsatıriccedili inlinesayaccedil countersayfa ilerletmeform feedsayı goumlsteriminumber representationsayıcıenumeratorsayılı enumeratedsayımenumerationsayısal digital numericsayısal tuşlar numerical keypadseccedilme selectsekizlioctalsıfır doldurma zerofillsıfırlamaresetsıfırların kaldırılması zero suppressionsığa capacitysıkıştırma compressionsınamatest
13
196 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
sınıfclasssınıflandırmataxonomysınırlayıcı delimitersıra order sequencesıralama sortsıralı erişim sequential accesssilme clearsimge symbolsistemsystemsola yanaşık left justifiedsonekpostfixsorgu(lama)querysoyut abstractsoumlzcuumlkwordsoumlzcuumlk işlemeword processingsoumlzcuumlk uzunluğu word lengthsoumlzde kodpseudo codesoumlzde komutpseudo instructionsoumlzdizimsyntaxsoumlzdizimsel syntacticsuumlreccedil processsuumlruumlcuuml driver driveşifrepasswordşimdiki currenttaban basetahteravalli flip floptampon buffertamsayıintegertanımdefinitiontanımlama definetanımlayıcı descriptortanımsızundefinedtanıtıcı soumlzcuumlkidentifiertarama scantasarım designtaşınabilir portabletaşmaoverflowtekliunarytemel adresbase addressters boumlluuml backslashtez sıralamaquick sorttikelpartialtiptypetoplama addtutamak handle
13
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml 197
tuzak traptuumlmleşik integratedtuumlretilmiş tipderived typeuccedil terminaluyarı mesajı warning messageuyarlama versionuygulama applicationuyumlucompatibleuzaklık offsetuumlccedil nokta ellipsisuumlccedilluuml ternaryuumlccedilluuml harftrigraphuumls exponent superscriptuumlye membervarsayılan değerdefault valuevazgeccedilme abortve andveridataveritabanı databaseversiyon versionveya oryama patchyan etki side-effectyanaştırmajustifyyanıt suumlresiresponse timeyapay anlayış artificial intelligenceyapı structureyapı adı structure tagyapıiccedili intrinsicyapısalstructuredyardımcı program utilityyayılma aralığı rangeyazıcı printeryazılım softwareyazım notationyazma-koruma write-protectyazmaccedilregisteryedek(leme) backupyeni satır newlineyeniden youmlnlendirmeredirectionyeniden yuumlklemerestoreyerdeğişir relocatableyerel localyerleşen (-şik) residentyerpaylaşımoverlay
13
198 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
yığıtstackyıldızasteriskyineleme iterationyinelemeli iterativeyolpathyonga chipyordamprocedure routineyorumlayıcı interpreteryoumlntem methodyoumlrelocaleyumuşak disk floppy disk disketteyuumlkleme loadyuumlkleyici loaderyuumlksek duumlzeyli dil high level languageyuumlruumltmeexecutionyuumlruumltuumllebilir executablezaman uyumsuzasynchronouszamanpaylaşım timesharingzilbell
H2 İngilizce-Tuumlrkccedile Soumlzluumlkabortduumlşuumlrme vazgeccedilmeabsolute addressmutlak adresabstract soyutaccesserişimaccess mode erişim moduaccumulator birikeccedilacronym kısaadactivity işleklikactual address gerccedilek adresadd toplamaaddressadresaddress ofadres almaaddressingadreslemealgorithmalgoritmaallocation ayırmaalphanumeric alfasayısalanalog oumlrnekselanalysis ccediloumlzuumlmlemeand veangular bracket ltgtaccedilılı parantezapplication uygulamaargument arguumlman
13
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml 199
architecture mimariarithmetic and logic unit (ALU) aritmetik mantık birimiarraydiziartificial intelligence yapay anlayışassembler birleştiriciassembly language birleştirici dilassignment statement atama deyimiassociativity birleşmeasteriskyıldızasynchronous zaman uyumsuzattributenitelikautomatic oumlzdevimli otomatikautomation oumlzdevinim otomasyonbackslash ters boumlluumlbackspacegeri almabacktrack geriye doumlnuumlş (yapma)backup yedek(leme)basetabanbase addresstemel adresbellzilbinaryikilibinary coded decimal (BCD) ikili duumlğuumlmlenmiş onlu yazımbitbit ikilbitwise bitselblank boşblock blok oumlbekBoolean algebraBoole cebiribootstrapping oumlnyuumlklemebrace ccedilengelli parantezbracket [] koumlşeli parantezbranch dalbranching dallanmabreakpointkesilme noktasıbuffer tamponbughatabyte baytcache memoryoumln bellekcall ccedilağırma ccedilağrıcall by reference referans ile ccedilağrıcall by valuedeğer ile ccedilağrıcanceliptalcapacitysığacarriage returnsatırbaşıcastkalıpcentral processing unit (CPU)merkezi işlem birimi (MİB)
13
200 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
character karaktercharacter sequencekarakter sırasıchip yongacircuitdevreclass sınıfclear silmeclock saatcoaxial eşmerkezlicode kodcoding kodlamacommand komutcomment accedilıklamacommunication iletişimcompatible uyumlucompile derlemecompilerderleyicicompound statement bileşik deyimcompressionsıkıştırmacomputer bilgisayarcomputer aided design (CAD) bilgisayar destekli tasarımconditional branch koşullu dallanmaconfigurationgoumlruumlnuumlmconstantdeğişmez sabitcontent iccedilerikcontext bağlamcontrolkontrol denetimcontrol character kontrol karaktericontrol flow kontrol akışıconversion doumlnuumlşuumlmconversion specification doumlnuumlşuumlm tanımlamasıconvert doumlnuumlştuumlrmecopy aktarma kopyalamacounter sayaccedilcurrentşimdiki akımcursor imleccedildata veridatabase veritabanıdebug hata duumlzeltmedebugger hata duumlzelticisidecimal ondalıkdecisionkarardeclaration bildirimdeclare bildirmedecodekod ccediloumlzmedecrement azaltma
13
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml 201
default value varsayılan değerdefine tanımlamadefinition tanımdelimitersınırlayıcıderived type tuumlretilmiş tipdescriptor tanımlayıcıdesigntasarımdestination hedefdevice aygıtdigitrakamdigitalsayısaldimension boyutdirect accessdoğrudan erişimdirective emirdirectory(alt)dizindisk diskdocumentation belgelemedomain alandouble precision ccedilift duyarlıkdrivesuumlruumlcuumldriver suumlruumlcuumldumpdoumlkuumlmdynamic devingeneditingmetin duumlzenlemeeditormetin duumlzenleyiciellipsis uumlccedil noktaemulation benzetmeencodekodlamaend of file (EOF) dosya sonuenumerated sayılıenumeration sayımenumeratorsayıcıenvironment ortamequality eşitlikerror hataescape keykaccedilış tuşuescape seqencekaccedilış sırasıevaluatehesaplamaexecutableişletilebilir yuumlruumltuumllebilirexecution işletme yuumlruumltmeexponent uumlsexpressionifadeextensiongenişleme dosya tipiexternal dışsalfetchgetirme
13
202 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
fieldalanfiledosyaflagbayrakflip flop tahteravallifloating point kayan noktalıfloppy diskyumuşak disk (disket)flowchartakış ccedilizeneğiform feed sayfa ilerletmeformal biccedilimselformat biccedilim(lendirme)functionfonksiyongeneration kuşakglobal kuumlreselhalt durmahandle tutamakhardware donanımheader başlıkheuristic buluşsalhexadecimal notationonaltılı goumlsterimhigh level language yuumlksek duumlzeyli dilhost computer ana bilgisayaridentifier tanıtıcı soumlzcuumlkimplementation gerccedilekleştirmeincrement artım artırmaindex indis dizinindexing indislemeindirect addressingdolaylı adreslemeindirection operator dolaylama işleciinformation bilgiinheritance kalıtıminitialize ilkleme ilk değer atamainitializerilkleyeninlinesatıriccediliinputgirdiinputoutput (IO)girdiccedilıktı (GCcedil)installation kuruluşinstructionkomutintegertamsayıintegrated tuumlmleşikinteractive etkileşimliinterface arabiriminternaliccedilselinterpreter yorumlayıcıinterrupt kesintiintrinsic yapıiccedili
13
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml 203
iterationyinelemeiterativeyinelemelijobişjoinbitişmejustifyyanaştırmakey anahtarkeyboard klavyekeyword anahtar soumlzcuumlklabel etiketlanguagedilleft justifiedsola yanaşıklibrary kuumltuumlphane kitaplıkline feed satır ilerletmelinkbağlamalinkerbağlayıcılist listeload yuumlklemeloaderyuumlkleyicilocal yerellocale youmlrelogicmantıklogical shift mantıksal kaydırmaloopdoumlnguumllow level language duumlşuumlk duumlzeyli dilmachine language makine dilimacro makromain memoryana bellekmainframeana bilgisayarmaintenance bakımmanual elkitabımarkişaretmaskoumlrtuumlmaster slave ağa koumllematch eş(leşme)maximumenbuumlyuumlkmediumortammember uumlyememorybellekmenu menuumlmerge birleştirmemessagemesajmethod youmlntemmicroprocessor mikroişlemciminimumenkuumlccediluumlkmnemonic bellenir
13
204 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
mode modmodularmoduumllermonitor monitoumlrmousefaremultipleccediloklumultiplexingccediloklamamultiuser ccedilok kullanıcılımultitasking ccedilok iş duumlzeninegation olumsuzlamanegative number olumsuz sayınestediccediliccedilenetworkağnewline yeni satırnode duumlğuumlmnonprint character basılmayan karakternotdeğilnotationgoumlsterim yazımnull character boş karakternull stringboş dizginumber representation sayı goumlsteriminumeric sayısalnumerical keypadsayısal tuşlarobject nesneobject oriented nesneye dayalıobject programamaccedil programoctal sekizlioffline ccedilevrimdışıoffsetkonum uzaklıkonline ccedilevrimiccediliopcode işlem koduoperand işlenenoperating systemişletim sistemioperationişlemoperatorişleccedil işlemci işlem operatoumlruumloptimaleniyioptimizingeniyileştiricioptionalisteğe bağlıor veyaorder duumlzen sıraoutputccedilıktıoverflowtaşmaoverlayyerpaylaşımpacking paketlemeparameter parametreparenthesis parantez ayraccedil
13
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml 205
parityeşlikparser ayrıştırıcıpartialtikelpartitioning ayırmapass geccedilişpasswordşifrepatch yamapath yolpatternkalıpperipheralccedilevreselpersonal computer (PC) kişisel bilgisayarpipeliningkuumlme komut işlemepipingkuumlme komut işlemepixel goumlruumlntuuml noktasıplotter ccedilizicipointergoumlstergeportabletaşınabilirposition konumpositive number olumlu sayıpostfixsonekprecedence oumlncelikprecision duyarlıkprefix oumlnekpreprocessor oumlnişlemciprinter yazıcıpriorityoumlncelikprocedureyordamprocesssuumlreccedilprocessingişlemeprogram programprogram counterprogram sayacıprogrammer programcıprogramming language programlama diliprompt iletiproperty oumlzellikpseudo code soumlzde kodpseudo instructionsoumlzde komutqualifier niteleyiciquerysorgu(lama)queue kuyrukquick sort tez sıralamaradixkoumlkrandom access memory (RAM) rastgele erişimli bellekrandom numberrastgele sayırange erim alan yayılma aralığı
13
206 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
read only memory (ROM) salt okunur bellekreadabilityokunaklılıkreal timegerccedilek zamanrecordkayıtrecursion oumlzccedilağrırecursive oumlzccedilağrılıredirectionyeniden youmlnlendirmereference referans kullanmaregister yazmaccedilrelationilişkirelationalbağıntısal ilişkiselrelative address goumlreli adresreliability guumlvenilirlikrelocatable yerdeğişirreserved word ayrılmış soumlzcuumlkreset sıfırlamaresident yerleşen yerleşikresolution ccediloumlzuumlnuumlluumlrluumlkresponse time yanıt suumlresirestore yeniden yuumlklemeretrievalerişimreturn doumlnuumlşright justify sağa yanaştırmaroutineyordamrungeccedilişrun timegeccediliş suumlresisavesaklamascalarbasamaklıscantaramaschema planscheme duumlzenscopeetki alanıscreenekranscroll kaymasearcharamasectionkısımsector kesimseekaramasegmentkesimselectseccedilmesemanticanlambilimsel anlamsalsemantics anlambilimseparator ayırıcısequence sırasequential accesssıralı erişim
13
EK H TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml 207
set kuumlmesetup kurgushell kabukshiftkaydırmaside-effect yan etkisign işaretsign bit işaret bitisignificant digit anlamlı rakamsimulation benzetimsizeboyslashboumlluumlsoftware yazılımsortsıralamasource program kaynak programspace character boşluk karakterispecial character oumlzel karakterspecifier belirteccedilstackyığıtstatementdeyimstatic dural durağanstorage allocationbellek ayırmastorage classbellek sınıfıstore saklamastringkarakter dizisi dizgistructure yapıstructure tag yapı adıstructured yapısalsubprogramaltprogramsubroutine altyordamsubscriptindissuperscript uumlsswitchanahtarsymbol simgesynchronous eşzamanlısynonymeşanlamlısyntacticsoumlzdizimselsyntaxsoumlzdizimsystemsistemtab duraktable ccedilizelgetag kuumlnyetailkuyruktask goumlrevtaxonomy sınıflandırmaterminaluccedil
13
208 TUumlRKCcedilE-İNGİLİZCE VE İNGİLİZCE-TUumlRKCcedilE TERİMLER SOumlZLUumlĞUuml EK H
ternaryuumlccedilluumltest sınamatext metinthreshold eşiktimesharing zamanpaylaşımtoggle anahtartrace izlemetrackiztransaction harekettransferaktarmatranslatorccedileviricitraptuzaktreeağaccediltrigraph uumlccedilluuml harftruth tabledoğruluk tablosutruth-valueddoğruluk-değerlitwos complement ikiye tuumlmlertype tipunarytekliunconditional branch koşulsuz dallanmaundefined belirsiz tanımsızunderflowalttaşmaunderscore _ altccedilizgiunionbirlikunitbirimunpack accedilmaunsignedişaretsizupdate guumlncelleştirmeuser kullanıcıuser-defined kullanıcı-tanımlıutility yardımcı programvalidate doğrulamavariable değişkenverify denetlemeversion uyarlama versiyonvertical dikeyvirtual memorygoumlruumlntuuml bellekwarning messageuyarı mesajıwindow pencerewordsoumlzcuumlkword lengthsoumlzcuumlk uzunluğuword processingsoumlzcuumlk işlemewrite-protect yazma-korumazero suppression sıfırların kaldırılmasızerofill sıfır doldurma
13
209
BİBLİYOGRAFYA
Bach Maurice J The Design of the UNIX Operating System Englewood Cliffs NJPrentice-Hall 1986
Bolon C Mastering C Berkeley CA Sybex 1986
Bolsky Morris I The C Programmerrsquos Handbook Englewood Cliffs NJ Prentice-Hall1985
Brown D L From Pascal to C Belmont CA Wadsworth 1985
Butzen Fred ldquoPorting to ANSI Crdquo 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-Hall1986
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 ProgrammingSebastopol CA OrsquoReilly amp 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 ComputerScience Press 1985
Hancock Les and Morris Krieger The C Primer 2nd ed New York NY McGraw-Hill1986
Harbison Samuel P and Guy L Steele Jr C A Reference Manual Englewood CliffsNJ Prentice-Hall 1984
Holub Allen The C Companion Englewood Cliffs NJ Prentice-Hall 1987
13
210 BİBLİYOGRAFYA
Holzner Steven PS2-PC Assembly Language New York NY Brady 1989
Jaeschke Rex ldquoStandard C A status reportrdquo Dr Dobbrsquos Journal August 1991
Kelley A and I Pohl An Introduction to Programming in C Menlo Park CABenjaminCummings 1984
Kernighan Brian W and Dennis M Ritchie The C Programming Language EnglewoodCliffs NJ Prentice-Hall 1978
Kernighan Brian W and Dennis M Ritchie The C Programming Language 2nd edEnglewood Cliffs NJ Prentice-Hall 1988
Ladd Scott Robert C++ Techniques and Applications Redwood City CA MampT Books1990
Lippman Stanley B C++ Primer 2nd ed Reading MA Addison-Wesley 1993
Microsoftreg C for the MS-DOSreg Operating System Version 500 Run-time LibraryReference Microsoft Corporation 1987
Microsoftreg C for the MS-DOSreg Operating System Version 500 Mixed LanguageProgramming Guide Microsoft Corporation 1987
Microsoftreg Macro Assembler for the MS-DOSreg Operating System Userrsquos GuideMicrosoft Corporation 1985
Microsoftreg QuickCtrade Compiler for IBMreg Personal Computers and CompatiblesMicrosoft Corporation 1987
Microsoftreg Visual C++trade Development System for Windowstrade Introduction (PresentingVisual C++) Redmond WA Microsoft Corporation 1993
Microsoftreg Visual C++trade Development System for Windowstrade Userrsquos Guides (VisualWorkbench Userrsquos Guide App Studio Userrsquos Guide) Redmond WA MicrosoftCorporation 1993
Microsoftreg Visual C++trade Development System for Windowstrade Programmerrsquos Guides(C++ Tutorial Class Library Userrsquos Guide Programming Techniques) RedmondWA Microsoft Corporation 1993
Microsoftreg Visual C++trade Development System for Windowstrade Professional ToolsUserrsquos Guides (Programming Tools for Windows CodeView Debugger UserrsquosGuide Command-line Utilities Userrsquos Guide Source Profiler Userrsquos Guide)Redmond WA Microsoft Corporation 1993
Microsoftreg Visual C++trade Development System for Windowstrade Reference Vol 1-3(Class Library Reference C Language Reference C++ Language Reference Run-time Library Reference iostream Class Library Reference) Redmond WAMicrosoft Corporation 1993
Microsoftreg Visual C++trade Development System for Windowstrade Comprehensive IndexRedmond WA Microsoft Corporation 1993
13
BİBLİYOGRAFYA 211
Microsoftreg Visual C++trade Development System for Windowstrade CC++ Version 70Update Redmond WA Microsoft Corporation 1993
Oualline Steve Practical C Programming Sebastopol CA OrsquoReilly amp Associates1993
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 SystemsmdashProgramming Language C X3 Secretariat CBEMA Washington
Schildt Herbert Windows NT Programming Handbook Berkeley CA OsborneMcGraw-Hill 1993
Stroustrup Bjarne The C++ Programming Language Reading MA Addison-Wesley1986
Stroustrup Bjarne The C++ Programming Language 2nd ed Reading MA Addison-Wesley 1993
Tanenbaum Aaron M Yedidyah Langsam and Moshe J Augenstein Data StructuresUsing C Englewood Cliffs NJ Prentice-Hall 1990
Tanenbaum Andrew S Operating Systems Design and Implementation EnglewoodCliffs NJ Prentice-Hall 1987
The Waite Group Advanced C Programming Englewood Cliffs NJ Prentice-Hall1986
Tondo Clovis L and Scott E Gimpel The C Answer Book 1st ed Englewood Cliffs NJPrentice-Hall 1985
Tondo Clovis L and Scott E Gimpel The C Answer Book 2nd ed Englewood CliffsNJ Prentice-Hall 1988
Varhol Peter D Object-Oriented Programming The Software Development RevolutionCharleston South Carolina Computer Technology Research Corp 1993
Waite M S Prata and D Martin C Primer Plus Indianapolis IN Howard W Sams ampCo 1984
Wiener Richard S and Lewis J Pinson An Introduction to Object-OrientedProgramming 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 EnglewoodCliffs NJ Prentice-Hall 1984
13
13
213
DİZİN
define 12 110elif 113else 113endif 113error 115if 113ifdef 113ifndef 113include 12 112line 115pragma 115undef 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
Aabort 177 179abs 179acos 176accedilıklama 5adım modu 152alan 96altdizin 124anahtar 130anahtar soumlzcuumlk 6ANSI 2ANSI karakter kuumlmesi 136ANSI Standardı 3 25 92 149 169 173 181argc 68arguumlman 62argv 68aritmetik kaydırma 54ASCII karakter kuumlmesi 135asctime 171 181
13
214 DİZİN
asin 176assert 173asserth 173atama 13atan 176atan2 176atexit 179atof 52 179atoi 52 179atol 52 179auto 70
Bbağlama 59 68 146 149bağlayıcı 59 60 63 148 159başlangıccedil adresi 80başlık dosyaları 12başlık dosyası 112bayt 46bellek modeli 146bellek sınıfı 69bellek sınıfı belirteci 93beyaz karakter 20biccedilimsel arguumlman 61 111bildirim 72bileşik deyim 21bire tuumlmler işleci 54birleşme 14 57birleştirici dil 159birlik 95bit 46bitsel işleccedil 53blok 21 61boş deyim 30 34 37boş karakter 8 9break 39bsearch 179BUFSIZ 125 177buumlyuumlk model 146
CC 1C++ 2calloc 98 179case 41ceil 176char 10CHAR_BIT 175CHAR_MAX 175
CHAR_MIN 175clearerr 178clock 172 181clock_t 172 180CLOCKS_PER_SEC 180Codeview 151const 10 67continue 38cos 176cosh 176ctime 171 181ctypeh 116 173
Cccedilağrı
değer ile 64 160referans ile 64 160
ccedilevirme sınırları 181ccedilıktı 17ccedilokbaytlı karakter 170
DDBL_DIG 44 174DBL_EPSILON 174DBL_MANT_DIG 174DBL_MAX 174DBL_MAX_10_EXP 174DBL_MAX_EXP 174DBL_MIN 174DBL_MIN_10_EXP 174DBL_MIN_EXP 174DBL_RADIX 174DBL_ROUNDS 174default 41defined 113değer ile ccedilağrı 64 160değişken 9
dışsal 72dural 71otomatik 70yazmaccedil 70
değişken goumlsterge 50 75değişmez 7
ccedilift duyarlıklı 8doumlrtluuml duyarlıklı 8karakter 8karakter dizisi 9kayan noktalı 7kısa tamsayı 7
13
DİZİN 215
onaltılı 7sekizli 7tamsayı 7tek duyarlıklı 8uzun ccedilift duyarlıklı 8uzun tamsayı 7
değişmez goumlsterge 50 75değişmez ifade 35 53 73 92 94 99 113dev adres 145dev model 146devam etme satır 9 109devingen dizi 99deyim 29difftime 171 181div 179div_t 178dizi 10 99do 36dosh 163dosya 119dosya goumlstergesi 120dosya sonu 21dosya tanımlayıcısı 126dosya tutamağı 126double 10doumlnuumlş adresi 77doumlnuumlşuumlm tanımlaması 18
EEDOM 174 176else 33entry 26enum 87envp 69EOF 21 121 124 177ERANGE 174 176errno 174 176 177 179errnoh 174etiket 39etiketli deyim 39etki alanı
değişken 69tip bildirimi 93
EXIT_FAILURE 126 179EXIT_SUCCESS 126 179exit 102 125 179exp 176extern 72
Ffabs 176fclose 121 125 178fcntlh 126feof 178ferror 178fflush 125 178fgetc 178fgetpos 178fgets 122 178FILE 120 177FILENAME_MAX 177float 10floath 12 174floor 176FLT_DIG 174FLT_EPSILON 174FLT_MANT_DIG 174FLT_MAX 174FLT_MAX_10_EXP 174FLT_MAX_EXP 174FLT_MIN 174FLT_MIN_10_EXP 174FLT_MIN_EXP 174FLT_RADIX 174FLT_ROUNDS 174fmod 176fonksiyon 59fonksiyon arguumlmanı 60fonksiyon bildirimi 64fonksiyon goumlstergesi 78fonksiyon prototipi 64fonksiyon tanımı 60fopen 119 178FOPEN_MAX 177for 37fpos_t 177fprintf 122 178fputc 178fputs 121 178fread 124 178free 98 103 179freopen 178frexp 176fscanf 122 178fseek 123 178fsetpos 178ftell 123 178fwrite 124 178
13
216 DİZİN
Ggenel goumlsterge 98geniş karakter 170genişletilmiş ASCII karakter kuumlmesi 135gerccedilek arguumlman 62geriye doumlnuumlş 81getc 121 178getchar 20 121 178getenv 179gets 122 178girdi 17girdiccedilıktının yeniden youmlnlendirilmesi 106gmtime 171 181goto 39goumlsterge 45goumlsterge aritmetiği 48goumlzcuuml 42
Hharf ayırımı 6HUGE_VAL 176
IINT_MAX 175INT_MIN 175if 33ifade 13
değişmez 10 16doğruluk-değerli 32karışık-tip 16
ifade deyimi 21ifadelerin yeniden duumlzenlenmesi 16 54ikili ağaccedil 103ikili girdiccedilıktı 120ikili işleccedil 46ikili sistem 7ilk değer atama 10ilkleme 10 73int 10ioh 126isalnum 173isalpha 173iscntrl 173isdigit 174isgraph 174isim 6islower 174isprint 174ispunct 174
isspace 174isupper 174isxdigit 174işleccedil 13
addres alma 46adres alma 20 65 79 97aritmetik 13artırma 14atama 14 55azaltma 14bağıntısal 30bitsel dışlayan VEYA 54bitsel VE 54bitsel VEYA 55doğruluk-değerli 30dolaylama 46eşitlik 31kaydırma 54koşullu 34mantıksal olumsuzlama 30mantıksal VE 31mantıksal VEYA 32uumlccedilluuml 35virguumll 38yapı uumlyesi 91
işlem operatoumlruuml 13işlenen 13işletim sistemi 119itoa 52izleme 24 152
Jjmp_buf 176
Kkaccedilış sırası 8kalıp 17 89 93karakter dizisi 51karakter dizisi işleme fonksiyonu 51kesilme 152kesilme noktası 24kesim 145 152 160kesinti 163 176kısa model 146kod kesimi 145komut satırı arguumlmanı 68kullanım 11kuumlccediluumlk buumlyuumlk harf ayırımı 6kuumlccediluumlk model 146kuumlme komut işleme 107
13
DİZİN 217
kuumlresel değişken 60 69kuumltuumlphane 119kuumltuumlphane fonksiyonu 79
LL_tmpnam 177labs 179LC_ALL 169 175LC_COLLATE 169 175LC_CTYPE 169 175LC_MONETARY 169 175LC_NUMERIC 169 175LC_TIME 169 175lconv 169 175LDBL_DIG 175LDBL_EPSILON 175LDBL_MANT_DIG 175LDBL_MAX 175LDBL_MAX_10_EXP 175LDBL_MAX_EXP 175LDBL_MIN 175LDBL_MIN_10_EXP 175LDBL_MIN_EXP 175LDBL_RADIX 175LDBL_ROUNDS 175ldexp 176ldiv 179ldiv_t 178LIB 155limitsh 12 175localeh 175localeconv 169 175localtime 171 181log 176log10 176long 10LONG_MAX 175LONG_MIN 175longjmp 176ltoa 52
MMAKE 156makro 110malloc 98 103 179mantıksal kaydırma 54mathh 80 176MB_CUR_MAX 179MB_LEN_MAX 175
mblen 170 179mbstowcs 170 179mbtowc 170 179memchr 180memcmp 180memcpy 180memmove 180memset 180Microsoft C Derleyicisi 147minik model 146mktime 172 181modf 176
NNDEBUG 173NMAKE 156NULL 49 120 177 178 179
Oorta model 146otomatik tip doumlnuumlşuumlmuuml 16 61 73
Oumloumlnceden tanımlanmış isimler 115oumlncelik 14 57oumlnişlemci 12 109oumlrtme 56oumlzccedilağrı 75 82 106oumlzccedilağrılı fonksiyon 75oumlz-referanslı yapı 104
PP_tmpnam 177parametre 61perror 178 179pow 176printf 18 59 122 178program accedilıklaması 5ptrdiff_t 49 177putc 120 178putchar 20 121 178puts 122 178
Qqsort 179QuickC ccedilekirdek kuumltuumlphanesi 146QuickC kuumltuumlphanesi 146
13
218 DİZİN
Rraise 177rand 126 179RAND_MAX 126 178rastgele erişim 123realloc 179referans 11referans ile ccedilağrı 64 160register 70remove 124 178rename 124 178return 61rewind 124 178
Ssatır devam etme 9 109satıriccedili birleştiricisi 162satıriccedili kod 111sayıcı 88sayım kuumlnyesi 87sayım tipi 87scanf 19 122 178SCHAR_MAX 175SCHAR_MIN 175SEEK_CUR 123 177SEEK_END 123 177SEEK_SET 123 177setbuf 125 178setjmp 176setjmph 176setlocale 169 175setvbuf 125 178short 10SHRT_MAX 175SHRT_MIN 175SIG_DFL 177SIG_ERR 177SIG_IGN 177SIGABRT 177SIGFPE 177SIGILL 177SIGINT 177SIGSEGV 177SIGTERM 177sıralı erişim 123signal 177signalh 176signed 10sin 176
sinh 176size_t 94 98 177 178 179 180sizeof 93 94soumlzcuumlk 46soumlzcuumlk sınırı 96sprintf 123 178sqrt 176srand 126 179sscanf 123 178static 71stdargh 177 185stddefh 49 94 177stderr 18 120 177stdin 18 120 177stdioh 18 119 121 177stdlibh 52 98 102 119 178stdout 18 120 177strcat 52 180strchr 52 180strcmp 52 180strcoll 180strcpy 51 180strcspn 180strerror 180strftime 172 181stringh 52 179strlen 52 180strncat 52 180strncmp 52 180strncpy 52 180strpbrk 180strrchr 52 180strspn 180strstr 180strtod 179strtok 180strtol 179strtoul 179struct 89struct tm 180strxfrm 180switch 40sysstath 126systypesh 126system 125 179
Ttan 176tanh 176
13
DİZİN 219
tanım 72tanıtıcı soumlzcuumlk 6taşınabilirlik 3 84tekli işleccedil 46temel adres 47 80time 171 181timeh 171 180time_t 172 180tip doumlnuumlşuumlmuuml 16 53
otomatik 16 61 73tip niteleyicisi 10 67tm 180TMP_MAX 177tmpfile 178tmpnam 178tolower 53 174 179toupper 53 174 179tutamak 126typedef 93
UUCHAR_MAX 175UINT_MAX 175ULONG_MAX 175ungetc 124 178UNIX 1unsigned 10USHRT_MAX 175uzak adres 145 160uzaklık 145 152 160
Uumluumlccedil nokta 185uumlccedilluuml karakter 170uumlye 90
Vva_arg 177 185va_end 177 185va_list 177 185va_start 177 185varsayılan altdizin 112 115veri doumlnuumlşuumlm fonksiyonu 52veri kesimi 145veri yapısı 81 104vfprintf 178void 60void 98volatile 10vprintf 178vsprintf 178
Wwchar_t 170 177 178wcstombs 170 179wctomb 170 179while 35
Yyakın adres 145 160yan etkisi 14yapı 89yapı kuumlnyesi 90yeniden youmlnlendirme 106yerel değişken 60yığıt 77 159yığıt goumlstergesi 77yineleme 78youmln bayrağı 162youmlre 169
- KAPAK
- OumlNSOumlZ
- YacuteCcedilYacuteNDEKYacuteLER
- THORNEKYacuteLLER VE CcedilYacuteZELGELER LYacuteSTESYacute
- BOumlLUumlM 0 GYacuteRYacuteTHORN
-
- 01 C Dilinin Kyacutesa Bir Tarihi
- 02 C Dilinin Uumlstuumlnluumlkleri
- 03 Kullanyacutelan Sistem
- 04 Kitabyacuten Yapyacutesyacute Ve Kullanyacutelan Kurallar
- Problemler
-
- BOumlLUumlM 1 TEMEL KAVRAMLAR VE GENEL BYacuteR BAKITHORN
-
- 11 Accedilyacuteklamalar Tanyacutetyacutecyacute Soumlzcuumlkler Ve Anahtar Soumlzcuumlkler
- 12 Deethithornmezler
- 13 Temel Veri Tipleri Ve Tanyacutemlar
- 14 define Ve include Oumlnithornlemci Emirleri
- 15 Yacutethornleccediller Yacutefadeler Ve Atama Deyimleri
- 16 Tip Doumlnuumlthornuumlmuuml Ve Kalyacuteplar
- 17 Basit GirdiCcedilyacutektyacute
- 18 C Deyimleri Ve Program Goumlvdesi
- 19 Bir C Programyacute Nasyacutel Yacutethornletilir
- 110 Oumlrnek Programlar
- Problemler
-
- BOumlLUumlM 2 DEYYacuteMLER VE KONTROL AKITHORNI
-
- 21 C Dilinin Deyimleri
- 22 Baethyacutentyacutesal Ve Mantyacuteksal Yacutethornleccediller
- 23 Doethruluk-Deetherli Yacutefadeler
- 24 if Deyimi Ve Kothornullu Yacutethornleccedil
- 25 while Deyimi
- 26 do Deyimi
- 27 for Deyimi Ve Virguumll Yacutethornleci
- 28 continue Deyimi
- 29 break Deyimi
- 210 goto Deyimi Ve Etiketler
- 211 switch Deyimi
- 212 Bir OumlrnekmdashSayyacute Syacuteralama
- Problemler