standart c programlama dili - kitabxana · 2017. 1. 26. · c programlama dili, günümüzde en...

235
6$'(&(.øùø6(/.8//$1,0ødø1'ø5 STANDART C PROGRAMLAMA DİLİ Fedon Kadifeli A. C. Cem Say M. Ufuk Çağlayan

Upload: others

Post on 02-Aug-2021

39 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama

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
              • BOumlLUumlM 3 GOumlSTERGELER VE BYacuteT YacuteTHORNLEME
                • 31 Goumlsterge Deethithornkenleri Ve Yacutethornlemleri
                  • 311 amp Ve Yacutethornleccedilleri
                  • 312 Goumlsterge Deethithornkenleri Bildirimleri
                  • 313 Goumlsterge Aritmetiethi
                    • 32 Goumlstergeler Ve Diziler
                    • 33 Karakter Dizileri
                    • 34 Bitsel Yacutethornleccediller
                    • 35 Yacutethornleccedil Oumlnceliethi Ve Birlethornme
                    • Problemler
                      • BOumlLUumlM 4 FONKSYacuteYONLAR VE PROGRAM YAPISI
                        • 41 Fonksiyon Tanyacutemlama
                        • 42 Fonksiyon Ccedilaethryacutelaryacute
                          • 421 Deether Yacutele Ccedilaethryacute
                          • 422 Referans Yacutele Ccedilaethryacute
                          • 423 main Fonksiyonunun Parametreleri
                            • 43 Bellek Syacutenyacuteflaryacute
                              • 431 auto Deethithornkenler
                              • 432 register Deethithornkenler
                              • 433 static Deethithornkenler Ve Fonksiyonlar
                              • 434 Fonksiyonlar Ve extern Deethithornkenler
                              • 435 Yacutelkleme
                                • 44 Oumlzccedilaethryacute
                                • 45 Fonksiyonlara Goumlstergeler
                                • 46 Bir Oumlrnekmdash8 Vezir Problemi
                                • Problemler
                                  • BOumlLUumlM 5 TUumlRETYacuteLMYacuteTHORN TYacutePLER VE VERYacute YAPILARI
                                    • 51 Sayyacutem Tipleri
                                    • 52 Yapyacutelar
                                    • 53 Yeni Tip Tanyacutemlama
                                    • 54 sizeof Yacutethornleci
                                    • 55 Birlikler
                                    • 56 Alanlar
                                    • 57 Bellek Ayyacuterma
                                    • 58 Karmathornyacutek Tipler
                                      • 581 Dizi Dizileri
                                      • 582 Dizilere Goumlstergeler
                                      • 583 Goumlsterge Dizileri
                                      • 584 Goumlstergelere Goumlstergeler
                                        • 59 Bir OumlrnekmdashDosya Syacuteralama
                                        • Problemler
                                          • BOumlLUumlM 6 OumlNYacuteTHORNLEMCYacute
                                            • 61 define Ve undef Emirleri
                                            • 62 include Emri
                                            • 63 Kothornullu Derleme
                                            • 64 Diether Emirler
                                            • 65 Oumlnceden Tanyacutemlanmyacutethorn Yacutesimler
                                            • 66 Bir Oumlrnekmdashctypeh Bathornlyacutek Dosyasyacute
                                            • Problemler
                                              • BOumlLUumlM 7 DOSYALAR VE GYacuteRDYacuteCcedilIKTI
                                                • 71 Dosya Esaslaryacute
                                                • 72 Dosya ErithornimimdashBathornka Youmlntemler
                                                • 73 Rastgele Erithornim
                                                • 74 Dosyalarla Yacutelgili Bathornka Bilgiler
                                                • 75 Sistem Yacutele Yacutelgili Fonksiyonlar
                                                • 76 Dosya Tanyacutemlayyacutecyacutelaryacute Ve Yacutelgili Fonksiyonlar
                                                • 77 Bir OumlrnekmdashOumlethrenci Veritabanyacute
                                                • Problemler
                                                  • EK A KARAKTER KODLARI CcedilYacuteZELGESYacute
                                                  • EK B MICROSOFT C DERLEYYacuteCYacuteSYacute HAKKINDA TEMEL BYacuteLGYacuteLER
                                                    • B1 Bellek Modelleri
                                                    • B1 QC Kuumltuumlphanesi
                                                    • B3 CL Eniyilethorntirici Derleyicisi
                                                      • EK C MICROSOFT CODEVIEW HATA DUumlZELTYacuteCYacuteSYacuteNE GENEL BYacuteR BAKITHORN
                                                      • EK D MICROSOFT LIB VE NMAKE YARDIMCI PROGRAMLARINA GENEL BYacuteR BAKITHORN
                                                        • D1 LIB Yardyacutemcyacute Programyacute
                                                        • D2 NMAKE Yardyacutemcyacute Programyacute
                                                          • EK E DYacuteLLERARASI CcedilAETHRILAR
                                                            • E1 Birlethorntirici Yacutele Baethlayyacutecyacutenyacuten Kullanyacutelmasyacute
                                                            • E2 Satyacutericcedili Birlethorntiricisinin Kullanyacutelmasyacute
                                                            • E3 Bir OumlrnekmdashDisket Saklama
                                                              • EK F STANDART C PROGRAMLAMA DYacuteLYacuteNYacuteN DYacuteETHER OumlZELLYacuteKLERYacute
                                                                • F1 C Duumlnyanyacuten Her YerindemdashYoumlreler
                                                                • F2 Genithorn Karakterler Ve Ccedilokbaytlyacute Karakterler
                                                                • F3 Uumlccedilluuml Karakterler
                                                                • F4 Zaman Fonksiyonlaryacute
                                                                • F5 Standart Bathornlyacutek Dosyalaryacute
                                                                • F6 Ccedilevirme Syacutenyacuterlaryacute
                                                                  • EK G SECcedilYacuteLMYacuteTHORN PROBLEMLERE YANITLAR
                                                                  • EK H TUumlRKCcedilE-YacuteNGYacuteLYacuteZCE VE YacuteNGYacuteLYacuteZCE-TUumlRKCcedilE TERYacuteMLER SOumlZLUumlETHUuml
                                                                    • H1 Tuumlrkccedile-Yacutengilizce Soumlzluumlk
                                                                    • H2 Yacutengilizce-Tuumlrkccedile Soumlzluumlk
                                                                      • BYacuteBLYacuteYOGRAFYA
                                                                      • DYacuteZYacuteN
Page 2: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama

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
              • BOumlLUumlM 3 GOumlSTERGELER VE BYacuteT YacuteTHORNLEME
                • 31 Goumlsterge Deethithornkenleri Ve Yacutethornlemleri
                  • 311 amp Ve Yacutethornleccedilleri
                  • 312 Goumlsterge Deethithornkenleri Bildirimleri
                  • 313 Goumlsterge Aritmetiethi
                    • 32 Goumlstergeler Ve Diziler
                    • 33 Karakter Dizileri
                    • 34 Bitsel Yacutethornleccediller
                    • 35 Yacutethornleccedil Oumlnceliethi Ve Birlethornme
                    • Problemler
                      • BOumlLUumlM 4 FONKSYacuteYONLAR VE PROGRAM YAPISI
                        • 41 Fonksiyon Tanyacutemlama
                        • 42 Fonksiyon Ccedilaethryacutelaryacute
                          • 421 Deether Yacutele Ccedilaethryacute
                          • 422 Referans Yacutele Ccedilaethryacute
                          • 423 main Fonksiyonunun Parametreleri
                            • 43 Bellek Syacutenyacuteflaryacute
                              • 431 auto Deethithornkenler
                              • 432 register Deethithornkenler
                              • 433 static Deethithornkenler Ve Fonksiyonlar
                              • 434 Fonksiyonlar Ve extern Deethithornkenler
                              • 435 Yacutelkleme
                                • 44 Oumlzccedilaethryacute
                                • 45 Fonksiyonlara Goumlstergeler
                                • 46 Bir Oumlrnekmdash8 Vezir Problemi
                                • Problemler
                                  • BOumlLUumlM 5 TUumlRETYacuteLMYacuteTHORN TYacutePLER VE VERYacute YAPILARI
                                    • 51 Sayyacutem Tipleri
                                    • 52 Yapyacutelar
                                    • 53 Yeni Tip Tanyacutemlama
                                    • 54 sizeof Yacutethornleci
                                    • 55 Birlikler
                                    • 56 Alanlar
                                    • 57 Bellek Ayyacuterma
                                    • 58 Karmathornyacutek Tipler
                                      • 581 Dizi Dizileri
                                      • 582 Dizilere Goumlstergeler
                                      • 583 Goumlsterge Dizileri
                                      • 584 Goumlstergelere Goumlstergeler
                                        • 59 Bir OumlrnekmdashDosya Syacuteralama
                                        • Problemler
                                          • BOumlLUumlM 6 OumlNYacuteTHORNLEMCYacute
                                            • 61 define Ve undef Emirleri
                                            • 62 include Emri
                                            • 63 Kothornullu Derleme
                                            • 64 Diether Emirler
                                            • 65 Oumlnceden Tanyacutemlanmyacutethorn Yacutesimler
                                            • 66 Bir Oumlrnekmdashctypeh Bathornlyacutek Dosyasyacute
                                            • Problemler
                                              • BOumlLUumlM 7 DOSYALAR VE GYacuteRDYacuteCcedilIKTI
                                                • 71 Dosya Esaslaryacute
                                                • 72 Dosya ErithornimimdashBathornka Youmlntemler
                                                • 73 Rastgele Erithornim
                                                • 74 Dosyalarla Yacutelgili Bathornka Bilgiler
                                                • 75 Sistem Yacutele Yacutelgili Fonksiyonlar
                                                • 76 Dosya Tanyacutemlayyacutecyacutelaryacute Ve Yacutelgili Fonksiyonlar
                                                • 77 Bir OumlrnekmdashOumlethrenci Veritabanyacute
                                                • Problemler
                                                  • EK A KARAKTER KODLARI CcedilYacuteZELGESYacute
                                                  • EK B MICROSOFT C DERLEYYacuteCYacuteSYacute HAKKINDA TEMEL BYacuteLGYacuteLER
                                                    • B1 Bellek Modelleri
                                                    • B1 QC Kuumltuumlphanesi
                                                    • B3 CL Eniyilethorntirici Derleyicisi
                                                      • EK C MICROSOFT CODEVIEW HATA DUumlZELTYacuteCYacuteSYacuteNE GENEL BYacuteR BAKITHORN
                                                      • EK D MICROSOFT LIB VE NMAKE YARDIMCI PROGRAMLARINA GENEL BYacuteR BAKITHORN
                                                        • D1 LIB Yardyacutemcyacute Programyacute
                                                        • D2 NMAKE Yardyacutemcyacute Programyacute
                                                          • EK E DYacuteLLERARASI CcedilAETHRILAR
                                                            • E1 Birlethorntirici Yacutele Baethlayyacutecyacutenyacuten Kullanyacutelmasyacute
                                                            • E2 Satyacutericcedili Birlethorntiricisinin Kullanyacutelmasyacute
                                                            • E3 Bir OumlrnekmdashDisket Saklama
                                                              • EK F STANDART C PROGRAMLAMA DYacuteLYacuteNYacuteN DYacuteETHER OumlZELLYacuteKLERYacute
                                                                • F1 C Duumlnyanyacuten Her YerindemdashYoumlreler
                                                                • F2 Genithorn Karakterler Ve Ccedilokbaytlyacute Karakterler
                                                                • F3 Uumlccedilluuml Karakterler
                                                                • F4 Zaman Fonksiyonlaryacute
                                                                • F5 Standart Bathornlyacutek Dosyalaryacute
                                                                • F6 Ccedilevirme Syacutenyacuterlaryacute
                                                                  • EK G SECcedilYacuteLMYacuteTHORN PROBLEMLERE YANITLAR
                                                                  • EK H TUumlRKCcedilE-YacuteNGYacuteLYacuteZCE VE YacuteNGYacuteLYacuteZCE-TUumlRKCcedilE TERYacuteMLER SOumlZLUumlETHUuml
                                                                    • H1 Tuumlrkccedile-Yacutengilizce Soumlzluumlk
                                                                    • H2 Yacutengilizce-Tuumlrkccedile Soumlzluumlk
                                                                      • BYacuteBLYacuteYOGRAFYA
                                                                      • DYacuteZYacuteN
Page 3: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama

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
              • BOumlLUumlM 3 GOumlSTERGELER VE BYacuteT YacuteTHORNLEME
                • 31 Goumlsterge Deethithornkenleri Ve Yacutethornlemleri
                  • 311 amp Ve Yacutethornleccedilleri
                  • 312 Goumlsterge Deethithornkenleri Bildirimleri
                  • 313 Goumlsterge Aritmetiethi
                    • 32 Goumlstergeler Ve Diziler
                    • 33 Karakter Dizileri
                    • 34 Bitsel Yacutethornleccediller
                    • 35 Yacutethornleccedil Oumlnceliethi Ve Birlethornme
                    • Problemler
                      • BOumlLUumlM 4 FONKSYacuteYONLAR VE PROGRAM YAPISI
                        • 41 Fonksiyon Tanyacutemlama
                        • 42 Fonksiyon Ccedilaethryacutelaryacute
                          • 421 Deether Yacutele Ccedilaethryacute
                          • 422 Referans Yacutele Ccedilaethryacute
                          • 423 main Fonksiyonunun Parametreleri
                            • 43 Bellek Syacutenyacuteflaryacute
                              • 431 auto Deethithornkenler
                              • 432 register Deethithornkenler
                              • 433 static Deethithornkenler Ve Fonksiyonlar
                              • 434 Fonksiyonlar Ve extern Deethithornkenler
                              • 435 Yacutelkleme
                                • 44 Oumlzccedilaethryacute
                                • 45 Fonksiyonlara Goumlstergeler
                                • 46 Bir Oumlrnekmdash8 Vezir Problemi
                                • Problemler
                                  • BOumlLUumlM 5 TUumlRETYacuteLMYacuteTHORN TYacutePLER VE VERYacute YAPILARI
                                    • 51 Sayyacutem Tipleri
                                    • 52 Yapyacutelar
                                    • 53 Yeni Tip Tanyacutemlama
                                    • 54 sizeof Yacutethornleci
                                    • 55 Birlikler
                                    • 56 Alanlar
                                    • 57 Bellek Ayyacuterma
                                    • 58 Karmathornyacutek Tipler
                                      • 581 Dizi Dizileri
                                      • 582 Dizilere Goumlstergeler
                                      • 583 Goumlsterge Dizileri
                                      • 584 Goumlstergelere Goumlstergeler
                                        • 59 Bir OumlrnekmdashDosya Syacuteralama
                                        • Problemler
                                          • BOumlLUumlM 6 OumlNYacuteTHORNLEMCYacute
                                            • 61 define Ve undef Emirleri
                                            • 62 include Emri
                                            • 63 Kothornullu Derleme
                                            • 64 Diether Emirler
                                            • 65 Oumlnceden Tanyacutemlanmyacutethorn Yacutesimler
                                            • 66 Bir Oumlrnekmdashctypeh Bathornlyacutek Dosyasyacute
                                            • Problemler
                                              • BOumlLUumlM 7 DOSYALAR VE GYacuteRDYacuteCcedilIKTI
                                                • 71 Dosya Esaslaryacute
                                                • 72 Dosya ErithornimimdashBathornka Youmlntemler
                                                • 73 Rastgele Erithornim
                                                • 74 Dosyalarla Yacutelgili Bathornka Bilgiler
                                                • 75 Sistem Yacutele Yacutelgili Fonksiyonlar
                                                • 76 Dosya Tanyacutemlayyacutecyacutelaryacute Ve Yacutelgili Fonksiyonlar
                                                • 77 Bir OumlrnekmdashOumlethrenci Veritabanyacute
                                                • Problemler
                                                  • EK A KARAKTER KODLARI CcedilYacuteZELGESYacute
                                                  • EK B MICROSOFT C DERLEYYacuteCYacuteSYacute HAKKINDA TEMEL BYacuteLGYacuteLER
                                                    • B1 Bellek Modelleri
                                                    • B1 QC Kuumltuumlphanesi
                                                    • B3 CL Eniyilethorntirici Derleyicisi
                                                      • EK C MICROSOFT CODEVIEW HATA DUumlZELTYacuteCYacuteSYacuteNE GENEL BYacuteR BAKITHORN
                                                      • EK D MICROSOFT LIB VE NMAKE YARDIMCI PROGRAMLARINA GENEL BYacuteR BAKITHORN
                                                        • D1 LIB Yardyacutemcyacute Programyacute
                                                        • D2 NMAKE Yardyacutemcyacute Programyacute
                                                          • EK E DYacuteLLERARASI CcedilAETHRILAR
                                                            • E1 Birlethorntirici Yacutele Baethlayyacutecyacutenyacuten Kullanyacutelmasyacute
                                                            • E2 Satyacutericcedili Birlethorntiricisinin Kullanyacutelmasyacute
                                                            • E3 Bir OumlrnekmdashDisket Saklama
                                                              • EK F STANDART C PROGRAMLAMA DYacuteLYacuteNYacuteN DYacuteETHER OumlZELLYacuteKLERYacute
                                                                • F1 C Duumlnyanyacuten Her YerindemdashYoumlreler
                                                                • F2 Genithorn Karakterler Ve Ccedilokbaytlyacute Karakterler
                                                                • F3 Uumlccedilluuml Karakterler
                                                                • F4 Zaman Fonksiyonlaryacute
                                                                • F5 Standart Bathornlyacutek Dosyalaryacute
                                                                • F6 Ccedilevirme Syacutenyacuterlaryacute
                                                                  • EK G SECcedilYacuteLMYacuteTHORN PROBLEMLERE YANITLAR
                                                                  • EK H TUumlRKCcedilE-YacuteNGYacuteLYacuteZCE VE YacuteNGYacuteLYacuteZCE-TUumlRKCcedilE TERYacuteMLER SOumlZLUumlETHUuml
                                                                    • H1 Tuumlrkccedile-Yacutengilizce Soumlzluumlk
                                                                    • H2 Yacutengilizce-Tuumlrkccedile Soumlzluumlk
                                                                      • BYacuteBLYacuteYOGRAFYA
                                                                      • DYacuteZYacuteN
Page 4: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama

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
              • BOumlLUumlM 3 GOumlSTERGELER VE BYacuteT YacuteTHORNLEME
                • 31 Goumlsterge Deethithornkenleri Ve Yacutethornlemleri
                  • 311 amp Ve Yacutethornleccedilleri
                  • 312 Goumlsterge Deethithornkenleri Bildirimleri
                  • 313 Goumlsterge Aritmetiethi
                    • 32 Goumlstergeler Ve Diziler
                    • 33 Karakter Dizileri
                    • 34 Bitsel Yacutethornleccediller
                    • 35 Yacutethornleccedil Oumlnceliethi Ve Birlethornme
                    • Problemler
                      • BOumlLUumlM 4 FONKSYacuteYONLAR VE PROGRAM YAPISI
                        • 41 Fonksiyon Tanyacutemlama
                        • 42 Fonksiyon Ccedilaethryacutelaryacute
                          • 421 Deether Yacutele Ccedilaethryacute
                          • 422 Referans Yacutele Ccedilaethryacute
                          • 423 main Fonksiyonunun Parametreleri
                            • 43 Bellek Syacutenyacuteflaryacute
                              • 431 auto Deethithornkenler
                              • 432 register Deethithornkenler
                              • 433 static Deethithornkenler Ve Fonksiyonlar
                              • 434 Fonksiyonlar Ve extern Deethithornkenler
                              • 435 Yacutelkleme
                                • 44 Oumlzccedilaethryacute
                                • 45 Fonksiyonlara Goumlstergeler
                                • 46 Bir Oumlrnekmdash8 Vezir Problemi
                                • Problemler
                                  • BOumlLUumlM 5 TUumlRETYacuteLMYacuteTHORN TYacutePLER VE VERYacute YAPILARI
                                    • 51 Sayyacutem Tipleri
                                    • 52 Yapyacutelar
                                    • 53 Yeni Tip Tanyacutemlama
                                    • 54 sizeof Yacutethornleci
                                    • 55 Birlikler
                                    • 56 Alanlar
                                    • 57 Bellek Ayyacuterma
                                    • 58 Karmathornyacutek Tipler
                                      • 581 Dizi Dizileri
                                      • 582 Dizilere Goumlstergeler
                                      • 583 Goumlsterge Dizileri
                                      • 584 Goumlstergelere Goumlstergeler
                                        • 59 Bir OumlrnekmdashDosya Syacuteralama
                                        • Problemler
                                          • BOumlLUumlM 6 OumlNYacuteTHORNLEMCYacute
                                            • 61 define Ve undef Emirleri
                                            • 62 include Emri
                                            • 63 Kothornullu Derleme
                                            • 64 Diether Emirler
                                            • 65 Oumlnceden Tanyacutemlanmyacutethorn Yacutesimler
                                            • 66 Bir Oumlrnekmdashctypeh Bathornlyacutek Dosyasyacute
                                            • Problemler
                                              • BOumlLUumlM 7 DOSYALAR VE GYacuteRDYacuteCcedilIKTI
                                                • 71 Dosya Esaslaryacute
                                                • 72 Dosya ErithornimimdashBathornka Youmlntemler
                                                • 73 Rastgele Erithornim
                                                • 74 Dosyalarla Yacutelgili Bathornka Bilgiler
                                                • 75 Sistem Yacutele Yacutelgili Fonksiyonlar
                                                • 76 Dosya Tanyacutemlayyacutecyacutelaryacute Ve Yacutelgili Fonksiyonlar
                                                • 77 Bir OumlrnekmdashOumlethrenci Veritabanyacute
                                                • Problemler
                                                  • EK A KARAKTER KODLARI CcedilYacuteZELGESYacute
                                                  • EK B MICROSOFT C DERLEYYacuteCYacuteSYacute HAKKINDA TEMEL BYacuteLGYacuteLER
                                                    • B1 Bellek Modelleri
                                                    • B1 QC Kuumltuumlphanesi
                                                    • B3 CL Eniyilethorntirici Derleyicisi
                                                      • EK C MICROSOFT CODEVIEW HATA DUumlZELTYacuteCYacuteSYacuteNE GENEL BYacuteR BAKITHORN
                                                      • EK D MICROSOFT LIB VE NMAKE YARDIMCI PROGRAMLARINA GENEL BYacuteR BAKITHORN
                                                        • D1 LIB Yardyacutemcyacute Programyacute
                                                        • D2 NMAKE Yardyacutemcyacute Programyacute
                                                          • EK E DYacuteLLERARASI CcedilAETHRILAR
                                                            • E1 Birlethorntirici Yacutele Baethlayyacutecyacutenyacuten Kullanyacutelmasyacute
                                                            • E2 Satyacutericcedili Birlethorntiricisinin Kullanyacutelmasyacute
                                                            • E3 Bir OumlrnekmdashDisket Saklama
                                                              • EK F STANDART C PROGRAMLAMA DYacuteLYacuteNYacuteN DYacuteETHER OumlZELLYacuteKLERYacute
                                                                • F1 C Duumlnyanyacuten Her YerindemdashYoumlreler
                                                                • F2 Genithorn Karakterler Ve Ccedilokbaytlyacute Karakterler
                                                                • F3 Uumlccedilluuml Karakterler
                                                                • F4 Zaman Fonksiyonlaryacute
                                                                • F5 Standart Bathornlyacutek Dosyalaryacute
                                                                • F6 Ccedilevirme Syacutenyacuterlaryacute
                                                                  • EK G SECcedilYacuteLMYacuteTHORN PROBLEMLERE YANITLAR
                                                                  • EK H TUumlRKCcedilE-YacuteNGYacuteLYacuteZCE VE YacuteNGYacuteLYacuteZCE-TUumlRKCcedilE TERYacuteMLER SOumlZLUumlETHUuml
                                                                    • H1 Tuumlrkccedile-Yacutengilizce Soumlzluumlk
                                                                    • H2 Yacutengilizce-Tuumlrkccedile Soumlzluumlk
                                                                      • BYacuteBLYacuteYOGRAFYA
                                                                      • DYacuteZYacuteN
Page 5: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama

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
              • BOumlLUumlM 3 GOumlSTERGELER VE BYacuteT YacuteTHORNLEME
                • 31 Goumlsterge Deethithornkenleri Ve Yacutethornlemleri
                  • 311 amp Ve Yacutethornleccedilleri
                  • 312 Goumlsterge Deethithornkenleri Bildirimleri
                  • 313 Goumlsterge Aritmetiethi
                    • 32 Goumlstergeler Ve Diziler
                    • 33 Karakter Dizileri
                    • 34 Bitsel Yacutethornleccediller
                    • 35 Yacutethornleccedil Oumlnceliethi Ve Birlethornme
                    • Problemler
                      • BOumlLUumlM 4 FONKSYacuteYONLAR VE PROGRAM YAPISI
                        • 41 Fonksiyon Tanyacutemlama
                        • 42 Fonksiyon Ccedilaethryacutelaryacute
                          • 421 Deether Yacutele Ccedilaethryacute
                          • 422 Referans Yacutele Ccedilaethryacute
                          • 423 main Fonksiyonunun Parametreleri
                            • 43 Bellek Syacutenyacuteflaryacute
                              • 431 auto Deethithornkenler
                              • 432 register Deethithornkenler
                              • 433 static Deethithornkenler Ve Fonksiyonlar
                              • 434 Fonksiyonlar Ve extern Deethithornkenler
                              • 435 Yacutelkleme
                                • 44 Oumlzccedilaethryacute
                                • 45 Fonksiyonlara Goumlstergeler
                                • 46 Bir Oumlrnekmdash8 Vezir Problemi
                                • Problemler
                                  • BOumlLUumlM 5 TUumlRETYacuteLMYacuteTHORN TYacutePLER VE VERYacute YAPILARI
                                    • 51 Sayyacutem Tipleri
                                    • 52 Yapyacutelar
                                    • 53 Yeni Tip Tanyacutemlama
                                    • 54 sizeof Yacutethornleci
                                    • 55 Birlikler
                                    • 56 Alanlar
                                    • 57 Bellek Ayyacuterma
                                    • 58 Karmathornyacutek Tipler
                                      • 581 Dizi Dizileri
                                      • 582 Dizilere Goumlstergeler
                                      • 583 Goumlsterge Dizileri
                                      • 584 Goumlstergelere Goumlstergeler
                                        • 59 Bir OumlrnekmdashDosya Syacuteralama
                                        • Problemler
                                          • BOumlLUumlM 6 OumlNYacuteTHORNLEMCYacute
                                            • 61 define Ve undef Emirleri
                                            • 62 include Emri
                                            • 63 Kothornullu Derleme
                                            • 64 Diether Emirler
                                            • 65 Oumlnceden Tanyacutemlanmyacutethorn Yacutesimler
                                            • 66 Bir Oumlrnekmdashctypeh Bathornlyacutek Dosyasyacute
                                            • Problemler
                                              • BOumlLUumlM 7 DOSYALAR VE GYacuteRDYacuteCcedilIKTI
                                                • 71 Dosya Esaslaryacute
                                                • 72 Dosya ErithornimimdashBathornka Youmlntemler
                                                • 73 Rastgele Erithornim
                                                • 74 Dosyalarla Yacutelgili Bathornka Bilgiler
                                                • 75 Sistem Yacutele Yacutelgili Fonksiyonlar
                                                • 76 Dosya Tanyacutemlayyacutecyacutelaryacute Ve Yacutelgili Fonksiyonlar
                                                • 77 Bir OumlrnekmdashOumlethrenci Veritabanyacute
                                                • Problemler
                                                  • EK A KARAKTER KODLARI CcedilYacuteZELGESYacute
                                                  • EK B MICROSOFT C DERLEYYacuteCYacuteSYacute HAKKINDA TEMEL BYacuteLGYacuteLER
                                                    • B1 Bellek Modelleri
                                                    • B1 QC Kuumltuumlphanesi
                                                    • B3 CL Eniyilethorntirici Derleyicisi
                                                      • EK C MICROSOFT CODEVIEW HATA DUumlZELTYacuteCYacuteSYacuteNE GENEL BYacuteR BAKITHORN
                                                      • EK D MICROSOFT LIB VE NMAKE YARDIMCI PROGRAMLARINA GENEL BYacuteR BAKITHORN
                                                        • D1 LIB Yardyacutemcyacute Programyacute
                                                        • D2 NMAKE Yardyacutemcyacute Programyacute
                                                          • EK E DYacuteLLERARASI CcedilAETHRILAR
                                                            • E1 Birlethorntirici Yacutele Baethlayyacutecyacutenyacuten Kullanyacutelmasyacute
                                                            • E2 Satyacutericcedili Birlethorntiricisinin Kullanyacutelmasyacute
                                                            • E3 Bir OumlrnekmdashDisket Saklama
                                                              • EK F STANDART C PROGRAMLAMA DYacuteLYacuteNYacuteN DYacuteETHER OumlZELLYacuteKLERYacute
                                                                • F1 C Duumlnyanyacuten Her YerindemdashYoumlreler
                                                                • F2 Genithorn Karakterler Ve Ccedilokbaytlyacute Karakterler
                                                                • F3 Uumlccedilluuml Karakterler
                                                                • F4 Zaman Fonksiyonlaryacute
                                                                • F5 Standart Bathornlyacutek Dosyalaryacute
                                                                • F6 Ccedilevirme Syacutenyacuterlaryacute
                                                                  • EK G SECcedilYacuteLMYacuteTHORN PROBLEMLERE YANITLAR
                                                                  • EK H TUumlRKCcedilE-YacuteNGYacuteLYacuteZCE VE YacuteNGYacuteLYacuteZCE-TUumlRKCcedilE TERYacuteMLER SOumlZLUumlETHUuml
                                                                    • H1 Tuumlrkccedile-Yacutengilizce Soumlzluumlk
                                                                    • H2 Yacutengilizce-Tuumlrkccedile Soumlzluumlk
                                                                      • BYacuteBLYacuteYOGRAFYA
                                                                      • DYacuteZYacuteN
Page 6: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 7: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 8: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 9: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 10: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 11: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 12: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 13: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 14: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 15: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 16: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 17: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 18: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 19: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 20: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 21: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 22: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 23: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 24: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 25: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 26: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 27: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 28: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 29: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 30: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 31: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 32: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 33: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 34: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 35: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 36: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 37: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 38: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 39: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 40: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 41: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 42: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 43: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 44: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 45: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 46: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 47: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 48: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 49: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 50: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 51: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 52: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 53: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 54: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 55: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 56: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 57: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 58: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 59: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 60: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 61: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 62: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 63: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 64: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 65: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 66: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 67: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 68: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 69: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 70: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 71: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 72: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 73: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 74: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 75: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 76: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 77: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 78: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 79: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 80: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 81: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 82: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 83: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 84: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 85: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 86: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 87: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 88: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 89: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 90: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 91: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 92: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 93: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 94: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 95: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 96: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 97: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 98: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 99: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 100: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 101: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 102: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 103: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 104: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 105: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 106: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 107: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 108: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 109: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 110: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 111: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 112: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 113: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 114: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 115: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 116: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 117: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 118: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 119: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 120: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 121: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 122: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 123: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 124: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 125: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 126: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 127: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 128: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 129: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 130: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 131: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 132: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 133: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 134: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 135: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 136: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 137: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 138: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 139: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 140: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 141: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 142: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 143: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 144: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 145: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 146: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 147: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 148: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 149: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 150: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 151: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 152: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 153: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 154: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 155: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 156: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 157: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 158: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 159: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 160: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 161: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 162: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 163: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 164: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 165: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 166: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 167: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 168: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 169: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 170: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 171: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 172: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 173: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 174: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 175: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 176: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 177: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 178: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 179: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 180: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 181: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 182: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 183: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 184: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 185: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 186: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 187: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 188: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 189: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 190: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 191: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 192: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 193: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 194: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 195: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 196: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 197: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 198: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 199: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 200: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 201: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 202: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 203: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 204: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 205: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 206: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 207: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 208: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 209: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 210: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 211: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 212: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 213: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 214: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 215: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 216: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 217: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 218: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 219: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 220: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 221: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 222: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 223: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 224: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 225: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 226: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 227: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 228: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 229: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 230: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 231: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 232: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 233: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 234: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama
Page 235: Standart C Programlama Dili - Kitabxana · 2017. 1. 26. · C programlama dili, günümüzde en yaygın kullanılan dillerden biridir. C dili, COBOL, FORTRAN, PL/I gibi eski programlama