Professional Documents
Culture Documents
Programlamaya Giriş...
Programlamaya Giriş...
H. Turgut Uyar
ubat 2004
ii
nsz
Srm: 0.99.5
Son dzenleme tarihi: 5 ubat 2004
Web sayfas:
http://www.ce.itu.edu.tr/Members/uyar/c
Bu dersin amac, renciye yalnzca programlamay ya da C dilini retmek deil, ayn zamanda temel saysal yntemleri ve sralama algoritmalar gibi ska kullanlan programlama
tekniklerini de gstermektir. Bu amala uygulamalarda daha ok saysal yntemler zerine
rnekler seilmeye allmtr. Bu rneklerin ou Prof. Dr. Nadir Ycel'in Saysal Analiz
Algoritmalar kitabndan uyarlanmtr.
Notlarn hazrlanmasnda yeni standartlara uyumu kolaylatrmas asndan C++ dilinin getirdii baz yeniliklerden yararlanlmtr. Metin iinde yeri geldike, C++ dilinde geerli olup
C dilinin izin vermedii zellikler belirtilmitir.
Programlarn ekran ktlarnda kullancnn yazd deerler italik olarak iaretlenmitir.
rnek programlar ve ders iin hazrlanan sunumlar (ngilizce) yukarda belirtilen web sayfasnda bulunabilir.
iii
iv
indekiler
1 Giri
1.1
Veriler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.1
Taban Tipler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.2
Kaytlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.3
Diziler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2
Algoritmalar
1.2.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Algoritmalarn Karlatrlmas . . . . . . . . . . . . . . . . . . . . . . .
11
1.3
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1.4
Soyutlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
1.5
Giri / k . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
1.6
Program Gelitirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
1.6.1
Programlarn Deerlendirilmesi . . . . . . . . . . . . . . . . . . . . . . .
23
1.6.2
Programlarn altrlmas
. . . . . . . . . . . . . . . . . . . . . . . . .
24
1.6.3
Kitaplklar
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
1.6.4
Standartlar
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
1.6.5
Derleme Aamalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
2 C Diline Giri
29
2.1
simler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
2.2
Deerler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
2.3
Deikenler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
2.4
Veri Tipleri
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
2.5
Deimezler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
2.6
Aritmetik Deyimler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
2.7
Tip Dnmleri
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
2.8
Artrma / Azaltma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
2.9
Matematik Kitapl
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
41
vi
INDEKILER
3 Ak Denetimi
3.1
3.2
45
Koul Deyimleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
3.1.1
Karlatrma lemleri . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
3.1.2
Mantksal lemler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
Seim
3.2.1
Koullu le
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
3.3
oklu Seim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
3.4
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
3.5
Dng Denetimi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
3.6
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
73
4.1
Numaralandrma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
4.2
Yaplar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
5 Diziler
85
5.1
87
5.2
Katarlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
5.3
Katar Kitapl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
92
5.4
ok Boyutlu Diziler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
5.5
Bavurular
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
6 Fonksiyonlar
103
6.1
6.2
Parametre Aktarm
6.3
6.4
6.5
6.6
6.7
6.8
E simli Fonksiyonlar
6.9
Varsaylan Parametreler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
vii
INDEKILER
7 aretiler
127
7.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.2
7.3
7.4
7.5
Statik Deikenler
7.6
. . . . . . . . . . . . . . . . . . . . . . . . . . . 133
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
8 Giri-k
141
8.1
k . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
8.2
Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
8.3
8.4
Dosyalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
8.4.1
8.4.2
Dosyada Okuma-Yazma
. . . . . . . . . . . . . . . . . . . . . . . . . . . 148
8.5
8.6
Hata letileri
8.7
8.8
kili Dosyalar
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
9 nilemci
153
9.1
Makrolar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
9.2
Projeler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
10 Balantl Listeler
163
11 Rekrsiyon
171
A Simgelerin Kodlanmas
177
179
B.1
B.2
Derleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
B.3
Editrler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
B.4
Hata Ayklayclar
B.5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
INDEKILER
viii
Blm 1
Giri
Bir problemi zmek zere bir bilgisayar program yazarken iki temel soruna zm getirmek
gerekir:
Yolu ucuca eklenmi doru paralaryla gstermek (ekil 1.1b). ekilde stanbulAnkara yolu iki, stanbul-zmir yolu drt, Ankara-zmir yolu doru parasndan
olumaktadr. Ancak bu yntem daha zordur ve yolu ne kadar ayrntl temsil etmek
isterseniz o kadar fazla doru paras kullanmanz gerekir.
Problemi oluturan varlklarn nasl temsil edileceklerinin belirlenmesi, problem iin bir
model oluturulmas anlamna gelir. Problemin zmnde ilk ve en nemli adm doru
Istanbul
Istanbul
Ankara
Izmir
Ankara
Izmir
(a)
(b)
Her admda ne yaplaca ak olarak belli olmal, hibir ekilde yorum gerektirmemelidir. Yukardaki rnek bu bakmdan bir algoritma saylamaz nk pek ok
admda ne yaplaca yoruma braklmtr. Szgelimi, 4-5 bardak, az tadna
gre, bezelyeler yumuayncaya kadar gibi deyimler yeterince kesin deildir.
Giri
1.1
Veriler
Modelinizde kullandnz byklkler programnzn verilerini oluturur. Her byklk programda bir deiken ile temsil edilir. Deiken aslnda o bykle verilmi simgesel bir isimden
baka bir ey deildir. Deikenler, programn ileyii srasnda deerler alrlar. Deikenlerin
bellekte tutulduklar gznne alnrsa, deiken bir bellek gznn ad, deer ise bu gzn
ieriidir.
rnein, bir ehri modellemek iin byklk ngrmtk: isim, enlem ve boylam. Her bykle bir deiken kar drmemiz gerektiinden isim bilgisini
ve boylam bilgisini
boylam
ettiimiz ehre gre bu deikenlere uygun deerler vermemiz gerekir. Szgelimi, stanbul ehrini temsil etmek iin
isim
deikenine stanbul,
1
29 deerleri verilmelidir (ekil 1.2).
isim
enlem
deikenine 41,
enlem
"Istanbul"
boylam
deikenine
boylam
41
29
enlem 41.
Atama iaretinin sol tarafna bir deiken ad, sa tarafna bir deyim yazlr.
Deyim, bir deer reten bir hesaplama olarak tanmlanabilir. Bir deyim, tek bir deer ya da bir
deiken olabilecei gibi, bunlarn ilemler ile eitli ekillerde balanmalarndan da oluabilir:
41:
boylam:
4 * boylam:
enlem + boylam:
artrlmas demektir; yani deeri bu ilemden nce 5 ise, ilemden sonra 6 olur. Oysa, bu bir
eitlik olsayd yanl olurdu (0 = 1).
rnek. Takas
Programlarda ska gerekebilen ilemlerden biri, iki deikenin deerlerini karlkl deitir-
say1 deikeninin deeri 32 ve say2 deikeninin deeri 154 ise bu ilemsay1 deikeninin 154, say2 deikeninin de 32 deerini almas istenir (ekil 1.3).
mektir. Szgelimi,
den sonra
Burada kuzey enlemlerinin ve dou boylamlarnn pozitif saylarla gsterildii varsaylmtr. Gney enlem-
leri ve bat boylamlar negatif saylarla gsterilirse rnein New York ehrinden sz edildiinde
New York,
boylam
deikeni -74,
enlem
isim
deikeni
Veriler
sayi1
sayi2
32
154
(a) nce
sayi1
sayi2
154
32
(b) Sonra
say1 say2
say2 say1
Birinci atama ileminden (ekil 1.4a) sonra
say1
ninde ise bir deiiklik olmaz. kinci atama ilemi (ekil 1.4b) ise
deikeninin o anki deerini atadndan
say2
say2
say2
deike-
deikenine
say1
sayi1
sayi2
32
154
(a)
sayi1
sayi2
154
154
(b)
sayi1
sayi2
154
154
(c)
ara say1
say1 say2
say2 ara
Giri
say1
yoktur.
sayi1
sayi2
32
154
ara
xxx
(a)
sayi1
sayi2
32
154
ara
32
(b)
sayi1
sayi2
154
154
ara
32
(c)
sayi1
154
sayi2
ara
32
32
(d)
1.1.1
Taban Tipler
birer tamsay ya da kesirli say olarak seilebilir. ou programda gerekecek temel veri tipleri
unlardr:
tamsay
Bir insann doum yl, soyadndaki harf says, boyunun santimetre cinsinden
uzunluu, bir ilemin ka kere yapldn sayan saya gibi bilgiler.
kesirli say Bir insann boyunun metre cinsinden uzunluu, iki snavdan alnan notlarn ortalamas, bir saynn karekk gibi bilgiler.
Veriler
mantksal
Bir rencinin bir dersten baarl olup olmad, bir insann onsekiz yandan
byk olup olmad, kullancnn bast tuun bir rakam tuu olup olmad gibi
bilgiler. Bu tipten deikenler
Doru
ya da
Yanl
deerini alabilirler.
simge
musunuz (E/H)?
etmek istiyor
ve yl arasna hangi iaretin konaca (nokta, tire, bl, vs.) gibi bilgiler. Simgeler
ounlukla tek trnak iaretleri iinde yazlrlar: 'E', ' ?', '4' gibi. Burada ayrm
yaplmas gereken nemli bir nokta, rakamlar ile rakamlar gsteren iaretleri birbirine kartrmamaktr. rnein 5 rakam ile '5' simgesi farkl byklklerdir (bkz.
Ek A).
katar
Bir insann ad, doduu ehir, bir kitabn ISBN numaras gibi bilgiler katarlarla
temsil edilmeye uygundur. Katarlar ounlukla ift trnak iinde yazlrlar: Dennis Ritchie, 0-13-110362-8 gibi. Bir byklk btnyle rakamlardan olusa bile
baz durumlarda say yerine katarla gstermek daha uygun olabilir. Bir deikenin
ancak zerinde aritmetik bir ilem yaplacaksa say tipinden olmas anlaml olur.
rnein, stanbul Teknik niversitesi'nde renci numaralar dokuz haneli tamsaylardr ancak bunlar tamsay olarak temsil etmenin bir anlam yoktur nk
renci numaralar zerinde aritmetik ilem yapmak gerekmeyecektir (iki rencinin numaralarn toplamak ya da arpmak gibi).
1.1.2
Kaytlar
Birden fazla bykl ortak bir tip altnda toplarlar. Burada gruplanan byklkler ayn tipten ya da farkl tiplerden olabilir. rnein bir ehri temsil etmek zere kullanlan byklk
(ehrin ismi, enlemi ve boylam) birletirilerek ehirleri gsterecek bir
kent
labilir. Bu veri tipinin biri bir katar (ehir ismi), dier ikisi de birer kesirli say olan (enlem
bakent deikeninin isim alanna Ankara deerini atamak iin bakent.isim Ankara
yazlr (ekil 1.6b).
Kaytlar alan olarak baka kaytlar da ierebilirler. rnein, bir yolu temsil iin yolun kodu
(katar), uzunluu (tamsay) ve balang ve biti kentleri bilgileri kullanlabilir (ekil 1.7).
Eriim, tek dzeyli kaytlara benzer ekilde yaplr (tem.son_kent.isim
tem.kod E-6
1.1.3
Ankara
ve
gibi).
Diziler
Ayn tipten varlklardan oluan bir grubu tek bir at altna toplamak iin kullanlrlar. Bir
dizinin btn tek bir deiken olarak deerlendirilir. rnein 50 rencili bir snfta bir
snavdan alnan notlar ileneceinde, her bir rencinin notunu gstermek zere
, not50
3
Bu deerler rneklerde
ve
eklinde ksaltlacaktr.
notlar
not1, not2,
adnda 50 elemanl
Giri
baskent
kent
kent
isim
isim
enlem
enlem
boylam
boylam
(a)
"Ankara"
(b)
tem
yol
kod
uzunluk
son_kent
ilk_kent
isim
isim
enlem
enlem
boylam
boylam
Veriler
bir tamsay dizisi tanmlanabilir. Ayr ayr deikenler bellekte dank bir yap olutururken
dizinin elemanlar bellekte birbirini izleyen gzlere yerletirilir (ekil 1.8).
not4
not13
not1
not22
notlar
50
Elemanlar zerinde ilem yapmak iin dizinin kanc elemanndan sz ettiinizi sylemeniz
gerekir. Szgelimi, 22. rencinin ald not 95 ise yaplacak atama
4
gsterilir .
notlar22 95
eklinde
Katarlar ou programlama dilinde simge dizileri olarak grlrler; yani bir katar her bir
eleman bir simge olan bir dizidir. Szgelimi, birinin ad ve soyad
adsoyad
kende tutulacaksa, bu deiken simge dizisi tipinden olacaktr (ekil 1.9). rnekte
adsoyad7
adsoyad1
adsoyad
D e n n i s R i ...
1
10
Dizilerle kaytlar birlikte de kullanlabilir. Szgelimi, bir saynn asal arpanlarn temsil etmek
zere bir dizi kullanabiliriz (6776
= 23 71 112 ).
gsterir, her bir asal arpan da bir taban ve bir s deerinden olutuu iin bir kaytla temsil
edilir (ekil 1.10). Elemanlara eriim daha nce belirtilen kurallarda grld gibi olacaktr:
arpanlar2 .taban 7
carpanlar
taban
taban
taban
11
...
...
notlar[22]
gibi.
Giri
rneklerden de grlebilecei gibi, bir dizinin btnyle temsil edilmesi iin dizinin eleman
deerlerinin yansra ka eleman olduu bilgisinin de bir ekilde tutulmas gerekir.
1.2
Algoritmalar
Algoritmalar gstermek iin ska kullanlan yntemlerden biri ak izenekleridir. Ak izeneklerinde u simgeler kullanlr:
Kutu: Bir ilemi gsterir. Kutunun iine ilemi anlatan bir komut yazlr.
Ok: Ak ynn belirtir. Algoritmann bir sonraki admnn hangisi olduunu gsterir.
Ekenar drtgen: Karar noktalarn gsterir. ine yazlan sorunun yantnn doru ya da
yanl olmasna gre farkl bir yne gidilmesini salar.
Algoritmann tamam belirtilmise ak izenei keleri yuvarlatlm kutular iinde bulunan bala komutuyla balar ve dur komutuyla biter. Algoritmann tamam deil, yalnzca
ilgilenilen bir paras belirtilmek isteniyorsa izenek bo bir yuvarlak ile balar ve bo bir yuvarlak ile sona erer. Ak izeneinin bymesi ve topluca grlmesinin zorlamas durumunda
ak izenei paralarnn bandaki ve sonundaki yuvarlaklarn iine etiketler yazarak hangi
parann hangi paraya nereden baland belirtilebilir.
Algoritmalarn rnek deerler zerinde ileyilerini daha kolay izleyebilmek amacyla tablolar
kullanlabilir. Tablonun her bir satr algoritmann bir admna kar der ve o admda eitli deikenlerin ya da deyimlerin aldklar deerlerin grlmesini salar; yani deikenler ve
deyimler tablonun stunlarn oluturur.
1. Dizideki ilk notu en yksek not olarak se ve sray ikinci renciye geir.
2. Srada renci varsa 3. adma, yoksa 5. adma git.
3. Sradaki rencinin notu u ana kadarki en yksek nottan bykse bu yeni notu en
yksek not olarak se.
4. Sray bir sonraki renciye geir ve 2. adma dn.
5. En yksek notu bildir.
10
Algoritmalar
Daha ok gndelik dil kullanlarak yazlm bu algoritmay biimsel olarak ifade edebilmek iin
rencilerin notlarn 50 elemanl bir tamsay dizisi (bu deikene
kadar bulunmu en yksek notu bir tamsay (max deikeni diyelim) ile ve sradaki rencinin
kanc renci olduunu tutmak iin bir saya (i deikeni) tanmlarsak:
1.
max notlar1 , i2
2.
i 50
3.
4.
i i + 1
max notlari
ve 2. adma dn.
5. en yksek not:
max
Yukarda verilen algoritma rneinin ak izenei ekil 1.11'de grld gibidir. 50 eleman
yerine 6 elemanl bir dizide en byk elemann bulunmas algoritmasnn ileyii Tablo 1.1'de
verilmitir (notlarn srasyla 43, 74, 65, 58, 82, 37 olduklar varsaylmtr, srme koulu
i 6
eklinde deimelidir).
basla
max notlar1
i2
i 50
D
notlari > max
Y
bas: max
D
dur
max notlari
ii+1
11
Giri
max
43
74
i
2
3
4
5
6
7
82
D
D
D
D
D
Y
i 6
(2 < 6)
(3 < 6)
(4 < 6)
(5 < 6)
(6 = 6)
(7 > 6)
say sizin sylediinizden bykse byk, kkse kk diyecek, doru sayy sylediinizde oyun sona erecektir. Bu oyunu oynarken nasl bir algoritma kullanrsnz?
Kararlatrdnz snr deerlerinden kk olann
taban,
byk olann
tavan
isimli birer
deiken ile gsterelim. Ayrca, biri arkadanzn tuttuu sayy temsil edecek (tutulan isimli),
dieriyse sizin sylediiniz sayy temsil edecek (sylenen isimli) iki tamsay deiken daha
kullanalm.
Algoritma 1.
1.
sylenen taban
2.
sylenen = tutulan
3.
sylenen sylenen + 1
Algoritma 2.
anki araln st ksmna, kk derse alt ksmna daralt. Bu algoritmay gereklemek
iin o anki deneme aralnn alt ve st snrlarn gsterecek iki yeni deikene (alt ve
st
1.
2.
3.
sylenen = tutulan
4.
ise
st sylenen - 1,
deilse
alt sylenen + 1
ve
2. adma dn.
Bu algoritmann ak izenei ekil 1.12'de verilmitir. Alt snrn 1, st snrn 63 olduunu ve arkadanzn 19 saysn tuttuunu varsayarsak, her turda deikenlerin aldklar
deerler Tablo 1.2'de grld gibi olacaktr.
1.2.1
Algoritmalarn Karlatrlmas
Yukardaki rneklerde grld gibi, ou zaman bir problemi zmenin birden fazla yolu
vardr. Ayn problemi zen iki algoritmadan hangisinin daha iyi olduuna karar vermek zere
algoritmalar iki zelliklerine gre karlatrlrlar:
12
Algoritmalar
basla
alt taban
st tavan
sylenen = tutulan
bas: sylenen
alt sylenen + 1
dur
st sylenen - 1
alt
1
17
19
st
63
31
23
19
sylenen
32
16
24
20
18
19
sylenen = tutulan
Y (32 > 19)
Y (16 < 19)
Y (24 > 19)
Y (20 > 19)
Y (18 < 19)
D (19 = 19)
13
Giri
1. Hzlar: Hangi algoritma zm daha abuk buluyor? Bu sorunun yant da iki durum
iin incelenir:
(a) en kt durumda
(b) ortalama durumda
Say bulma iin verilen yukardaki iki algoritmay bu bakmdan karlatrrsak, birinci algoritmann rnek deerlerle sayy en kt durumda 63, ortalama durumda 32 denemede
bulaca grlr. Oysa ikinci algoritma sayy en kt durumda 6, ortalama durumda
5.09 denemede bulur.
2. Harcadklar yer: Hangi algoritma bellekte daha fazla yer kullanyor?
Say bulma algoritmalarnda grdmz gibi, ikinci algoritma birinci algoritmann kullandklarna ek olarak iki deiken daha gerektirmektedir.
1.3
Blok yapl programlamann temelinde blok kavram yatar. Blok, birbiriyle ilikili komutlarn
oluturduu gruptur. Her algoritma birbirlerine eitli ekillerde balanm bloklardan oluur.
Bloklar balamann yolu vardr:
Sra
Bloklarn yukardan aaya doru yazldklar srayla yrtlrler (ekil 1.13a). Sra
yaps, komutlarn yazl sralarnn nemli olduunu vurgular. Blm 1.1'de grlen
takas rnei iin verilen doru zmde yaplan atama ileminin sralar deitirilirse
varlacak sonular yanl olabilir.
Seim
Bir koulun doru olup olmamasna gre farkl bir bloun yrtlmesidir. Yani koul
doruysa bir blok, yanlsa baka bir blok yrtlr (ekil 1.13b). ki bloktan herhangi
biri bo olabilir, yani koul doruysa u blou yrt, yanlsa hibir ey yapma eklinde
bir yap kurulabilir.
Yineleme
Belirli bir koul saland srece (ya da salanana kadar) bir blok yinelenebilir.
Ak izeneinden (ekil 1.13c) grlebilecei gibi, bu yapdan klabilmesi iin bloun
koulu deitiren bir komut iermesi gerekir, aksi durumda koul balangta doruysa
hep doru olacandan yapdan klamayacaktr. Yine ak izeneinden grlebilecek
bir dier zellik de, koul balangta yanlsa bloun hi yrtlmeyeceidir. Baz uygulamalarda blok kouldan nce de yer alabilir (ekil 1.12 byle bir rnektir); byle
durumlarda koul batan yanl olsa bile blok en az bir kere yrtlr.
14
Soyutlama
D
blok1
blok2
kosul
kosul
blok1
blok2
D
blok
(a)
(b)
(c)
Bu yaplarn ortak bir zellii, hepsinin bir giri ve bir klarnn olmasdr. Bylelikle bir
bloun k br bloun giriine balanabilir; baka bir deyile, bloklar ardarda eklenebilir.
Ayrca, bir bloun iinde baka bir blok yer alabilir. ekil 1.12'de
uluyla belirlenen seim yaps,
sylenen = tutulan
ko-
goto
bulunmas gerektii dnlebilir (zellikle yineleme yaplar iin). Ancak blok yapl programlamada yineleme iin zel yaplar vardr ve
1.4
goto
Soyutlama
Programlamann temel dzeneklerinden biri soyutlama kavramdr. Soyutlama, programn yapaca iin daha kk ve birbirinden olabildiince bamsz alt-ilere blnmesidir. Alt-iler
de, benzer ekilde, yapacaklarn alt-alt-ilere blebilirler (ekil 1.14). Bu tip tasarma yukardan aaya tasarm ad verilir.
Her i bir yordam (C dilindeki adyla fonksiyon ) tarafndan gereklenir. Ana-yordamn grevi,
alt-ileri gerekleyen yordamlar balatmak ve bunlar arasnda egdm salamaktr. Bir styordam, kulland alt-yordamlarn nasl altklaryla deil, yalnzca sonularyla ilgilenir.
Soyutlamann kazandrdklar yle zetlenebilir:
Bir ii gerekleyen yordam yazlrken, kulland alt-yordamlarn ayrntlaryla uralmaz; alt-yordamn doru alt varsaylarak yordamn kendi iine younlalabilir. By-
Bu konuyla ilgili olarak, Edsger W. Dijkstra'nn Go To Statement Considered Harmful balkl klasik
makalesini
http://www.acm.org/classics/oct95/
adresinde bulabilirsiniz.
Bu konuyla ilgili olarak, Niklaus Wirth'n Program Development by Stepwise Renement balkl klasik
makalesini
http://www.acm.org/classics/dec95/
adresinde bulabilirsiniz.
15
Giri
ana-is
alt-is-1
alt-is-2
alt-is-1a
alt-is-3
alt-is-3a
alt-is-3b
lelikle byk ve zlmesi zor olan bir sorunla uramak yerine, her biri kk ve zlebilir sorunlarla uralr ve bunlar daha sonra biraraya getirilir.
Programn bakm kolaylar. Alt-yordamlarn almalar birbirlerinden bamsz olduundan bir alt-yordamda bir deiiklik yapldnda bunu kullanan st-yordam (styordamla olan etkileim deimedii srece) deiiklikten etkilenmez.
Yordamlar olabildiince genel amal yazlmaldr. Szgelimi bir yordamn ii BL105E dersini
alan rencilerin ylsonu snav notlarnn en byn bulmak eklinde tanmlanabilir. Oysa
ii herhangi bir dizinin en byn bulmak olarak tanmlanan bir yordam gelitirmek ve
bu yordam kullanrken hangi dizinin en bynn bulunmasnn istendii belirtmek daha
etkin bir alma biimidir. Bu durumda hangi dizi zerinde ilem yaplaca bilgisi yordamn giri parametresi olur. Yordam, almas sonucu rettii deeri k parametresi olarak
dndrr. rnekteki yordam kullanlrken giri parametresi olarak BL105E dersini alan rencilerin ylsonu snav notlar verilirse snavda alnan en yksek not, Los Angeles Lakers
basketbol takmnn oyuncularnn ayakkab numaralar belirtilirse takmn en byk ayakl
oyuncusunun ayakkab numaras k parametresi olur.
16
Soyutlama
1 * 32 * 72 * 111
1. 9702 = 2 * 3 * 3 * 7 * 7 * 11 = 2
3 * 51 * 71
2. 945 = 3 * 3 * 3 * 5 * 7 = 3
2 * 71
3. ortak arpanlar: 3
1. ve 2. admlar iin herhangi bir sayy asal arpanlarna ayran bir yordam yazlabilir ve
asal arpanlarna ayrlacak say bu yordama parametre olarak yollanabilir. Benzer ekilde,
3. admdaki ortak arpanlarn bulunmas ii de bir alt-yordama verilebilir. 4. admda ortak
arpanlardan en byk ortak blenin hesaplanmas ilemleri iin alt-yordam kullanmann fazla
bir anlam yoktur, ana yordama brakmak daha yerinde olur. Bylece ekil 1.15'deki yap ortaya kar. rnek saylar zerinde yordamlarn hangi giri ve k parametreleriyle altklar
ekil 1.16'da verilmitir.
1. sayi
en byk
ortak blen
hesapla
2. sayi
1. sayinin
arpanlari
2. sayinin
arpanlari
1. sayinin
arpanlari
asal
arpanlara
ayir
ortak
arpanlar
2. sayinin
arpanlari
ortak
arpanlari
bul
ekil 1.15: En byk ortak blen hesaplama algoritmasnn yukardan aaya tasarm.
Asal arpanlara ayrma algoritmasnda grlen bir sonraki asal sayy bulma ii de asal
arpanlarna ayrma iinin bir alt-ii olarak dnlerek bir baka yordama braklabilir. Bu
yordam kendisine parametre olarak gnderilen saydan bir sonraki asal sayy bularak sonucu
geri yollayacaktr. Benzer ekilde bu yordam da bir saynn asal olup olmadn snamak zere
baka bir yordamdan yararlanmak isteyebilir. Bu rnek iin verilen yordamlar gerekleyecek
algoritmalar blmn sonundaki uygulamada verilmitir.
a,
kk olanna
dersek:
17
Giri
9702
en byk
ortak blen
hesapla
945
2 32 72 11
33 5 7
32 7
2 32 72 11
33 5 7
asal
arpanlara
ayir
ortak
arpanlari
bul
ekil 1.16: rnek saylar zerinde en byk ortak blen hesaplama algoritmasnn ileyii.
a = q 1 b + r1
eklinde yazlabilir. Burada
ile
r1 = 0
ile
r1
b'dir.
Deilse
b = q 2 r1 + r2
r1 = q 3 r 2 + r 3
...
rn2 = qn rn1 + rn
rn1 = qn+1 rn + rn+1 (rn+1 = 0)
Bu durumda
ile
b'nin
rn 'dir.
Yine
a = 9702, b = 945
rneini alrsak:
a, kk olann b
r deikeninde tutarsak (kalan ilemi %
Her denklem iin en byk ortak bleni alnacak saylardan byk olann
deikeninde, bu ikisinin blmnden kalan deeri de
iaretiyle gsterilsin), bu algoritma bir yineleme yapsyla gereklenebilir. Bir blme ileminde
18
Soyutlama
r'nin
deikeni
b'nin, b
deikeni
deikeninde elde
edilmi olur. Bu algoritmann ak izenei ekil 1.17'de, rnek deerlerle ileyii Tablo 1.3'de
verilmitir.
a sayi1
b sayi2
a sayi2
b sayi1
b>0
bas: a
ra%b
ab
br
a
9702
945
252
189
b
945
252
189
63
r
252
189
63
0
Uygulama: Algoritmalar
Herhangi bir saynn asal arpanlarna ayrlmas iin kullanlabilecek bir algoritma ekil 1.18'de
verilmitir. Bu algoritmada
Orijinal haliyle algoritmada blmeden kalan ilemi yerine kartma ilemi kullanlyordu. Blmeden kalan
ilemi algoritmann nemli lde hzlanmasn salayan bir deiiklik olarak sonradan getirilmi bir yntemdir.
19
Giri
c2
x>1
x%c=0
D
c bir carpandir
u0
x%c=0
D
uu+1
xx/c
ki saynn arpanlarndan en byk ortak blenin arpanlarn bulma iini yapacak yordamn
algoritmas gelitirilirken, asal arpanlara ayrma yordamnn alma ekli nedeniyle arpanlarn kkten bye doru sral olduklar varsaylabilir. Bu varsayma gren alan algoritma
ekil 1.19'da verilmitir. Bu algoritmada carpanlar1 birinci saynn asal arpanlar dizisini,
carpanlar2 ikinci saynn asal say arpanlar dizisini, c1 birinci saynn sradaki asal arpann, c2 de ikinci saynn sradaki asal arpann gsterir. Her iki dizinin elemanlarna erimek
iin de srasyla i1 ve i2 saya deikenleri kullanlmtr. rnek dizilerle algoritmann ileyii
Tablo 1.5'de verilmitir.
20
Soyutlama
x
945
315
105
35
7
1
2
3
x > 1
D (945 > 1)
D (945 > 1)
D (35 > 1)
(7 > 1)
11
(1 = 1)
Y
D
D
D
D
Y
D
D
Y
D
D
Y
x % c = 0
(945 mod 2 =
(945 mod 3 =
(945 mod 3 =
(315 mod 3 =
(105 mod 3 =
(35 mod 3 =
(35 mod 5 =
(35 mod 5 =
(7 mod 5 =
(7 mod 7 =
(7 mod 7 =
(1 mod 7 =
1)
0)
0)
0)
0)
2)
0)
0)
2)
0)
0)
1)
carpan
0
1
2
3
0
1
0
1
c1
c2
taban
1
2
3
3
2 < 3
11
3= 3
7 > 5
1
7
7= 7
us
carpan
2 < 3
1 < 2
21
Giri
c1 carpanlar11, c2 carpanlar21
i1 1, i2 1
c1 ve c2
bos deil
i1 i1 + 1
c1 carpanlar1i1
i2 i2 + 1
c2 carpanlar2i2
c1 bir carpandir
c2 bir carpandir
i1 i1 + 1, i2 i2 + 1
c1 carpanlar1i1, c2 carpanlar2i2
22
Giri / k
1.5
Giri / k
Bir programlama dilinin kullanlabilir olmas iin dilde blok yapl programlamann kavramlarn desteklemenin dnda baz gereklilikler de yerine getirilmelidir:
Giri
Bir program her seferinde ayn veri deerleri zerinde almaz, ileyecei verileri alma srasnda bir ekilde renmesi gerekir. Bunun en sk karlalan yntemi verileri
program kullanan kiiye sormak olmakla birlikte verileri bir dosyadan okumak ya da
ortamdan renmek (szgelimi odann scakln len bir duyargadan almak) gibi seenekler de bulunabilir. Programlama dillerinin girdi komutlar giri birimlerinden aldklar
deerleri deikenlere aktarrlar. Aksi belirtilmedike standart giri birimi kullancnn
tutakmdr.
k
Program, verilerin ilenmesi sonucu elde ettii sonular bir ekilde deerlendirmelidir.
En sk grlen yntem sonucun kullancnn ekranna yazlmasdr ama girite olduu
gibi sonularn bir dosyaya yazlmas ya da ortama gnderilmesi (oda scakln denetleyen klimaya bir sinyal yollanmas gibi) szkonusu olabilir. Programlama dillerinin kt
komutlar, deiken deerlerini istenen k birimine ynlendirirler. Aksi belirtilmedike
standart k birimi kullancnn ekrandr.
Programn almas srasnda karlalan hata durumlarnn bildirilmesi de ktnn bir
parasdr. Ancak, hatalarn daha kolay farkedilmelerini salamak amacyla, bu iletilerin
normal kt iletilerinden ayrlabilmeleri istenir. Bu nedenle, hata iletileri hata birimine
ynlendirilir. Aksi belirtilmedike bu birim -standart kta olduu gibi- kullancnn
ekrandr.
Bu notlarda ilenecek rnek programlarda alma hep ayn ekilde olacaktr: verilerin girilmesi, ilenmesi, sonularn gsterilmesi. Bu tip programlara konsol program, komut satr
program ya da metin kipi program gibi adlar verilir. Grak arayzle alan programlar ise
olaya dayanan bir mantkla alrlar. Program almaya baladnda kullancyla iletiimi
iin gerekli arayz kurar (pencere izer, men oluturur, dme koyar, v.b.) ve sonra kullancnn bir edimde bulunmasn bekler. Kullancnn edimine gre ilgili yordamlar altrr.
1.6
Program Gelitirme
Tasarm
Kodlama
Bu aamada program tasarm srasnda verilen kararlara gre bir programlama di-
kod
23
Giri
Snama
Bu aamada program altrlarak eitli senaryolar iin doru sonular retip ret-
Hata Ayklama
gerekli dzeltmeler yaplr. Programlarn ilk yazldklar ekliyle doru olmalar neredeyse
olanakszdr. Hatta stne ok allm, pek ok hatas bulunup dzeltilmi programlarda bile btn hatalarn bulunup dzeltilmi olmas son derece dk bir olaslktr.
Ayrca programlara yeni yetenekler eklendike yeni hatalar oluacandan aa yukar
hibir program hibir zaman tam olarak hatasz olmayacaktr. Hata ayklama ilemine
yardmc olmak zere hata ayklayc ad verilen yazlmlar kullanlr.
1. Yazm hatalar: Programcnn yazd baz komutlar kulland programlama dilinin kurallarna uymuyordur.
2. Mantk hatalar: Programcnn yazd kod dilin kurallar asndan dorudur ama altrlmasnda sorun kar. Szgelimi bir tamsayy baka bir tamsay deikene blmek
geerli bir ilemdir ama blen say 0 olursa bu ilem gerekletirilemez. Bu tr hatalara
alma-zaman hatas da denir.
1.6.1
Programlarn Deerlendirilmesi
Bu aamalar sonucunda ortaya kan bir programn iyi bir program olup olmadnn, ya da
ne kadar iyi bir program olduunun deerlendirilmesinde u ltlere bavurulur:
Etkinlik
ne kadar hzl alyor? Dzgn kullanlabilmesi iin ne kadar sistem kayna gerekiyor
(hangi ilemci, ne kadar bellek, ne kadar disk, v.b.?).
Salamlk
kendisine bir yl bilgisi sorulduunda kullanc yanllkla (ya da kt niyetle) bir isim
yazarsa ne oluyor?
Tanabilirlik
Anlalabilirlik
Baka biri program okuduunda anlayabilecek mi? Hatta stnden bir sre
Bakm kolayl
kolay m?
Gelitirilebilirlik
Program Gelitirme
24
Gelitirme aamalarnda daha az sorunla karlamak ve daha kaliteli yazlmlar retmek iin
eitli yntemler gelitirilmitir. Bu yntemlerin temel fark, problemin nasl modelleneceine
ilikin yaklamlardr. Blok yapl yaklam, nesneye dayal yaklam, fonksiyonel yaklam gibi
yntemler eitli alanlarda yaygn olarak kullanlmaktadr. Setiiniz programlama dili hangi
programlama yaklamn kullanacanz da belirler. Szgelimi C dili blok yapl, Java dili
nesneye dayal, Haskell diliyse fonksiyonel dillerdir. C++ dili hem blok yapl hem de nesneye
dayal zellikler gsteren karma bir dildir.
1.6.2
Programlarn altrlmas
Bilgisayarlarn altracaklar programlarn belli bir biimi olmas zorunludur. Bu biim, bilgisayardan bilgisayara ve iletim sisteminden iletim sistemine gre farkllklar gsterir. Szgelimi, bir kiisel bilgisayar zerinde Windows iletim sisteminde alan bir program, Sun marka
bir iistasyonunda Solaris iletim sisteminde almaz. Hatta, yine ayn kiisel bilgisayar zerinde Linux iletim sisteminde de almaz. Programlarn bu altrlabilir biimine makina
kodu ad verilir. Makina kodu, insanlarn anlamas ve zerinde almas son derece zor bir
biim olduundan programclar programlar dorudan bu kod ile yazmazlar. nsann anlamas
daha kolay (insan diline daha yakn) yksek dzeyli bir dil ile kaynak kodunu oluturup
yardmc yazlmlar araclyla makina koduna evirir ve altrrlar.
Kaynak kodunun makina koduna evrilmesi ve altrlmas ilemi farkl yaklamla gerekletirilebilir:
Yorumlama
koduna evrilir ve altrlr. Yani yorumlayc, nce birinci komutu okur, makina koduna
evirir ve altrr. Sonra ikinci komutu alr ve ayn ilemleri yapar. Programn her
almasnda evirme ilemi yeniden yaplr. Herhangi bir komutun evrilmesinde ya
da altrlmasnda bir hatayla karlatnda bunu kullancya bildirir ve almay
durdurur. Basic, Perl, Tcl gibi diller genellikle yorumlayclar araclyla kullanlrlar.
Derleme
Program bir derleyici tarafndan bir btn halinde okunur ve makina koduna ev-
rilerek bir altrlabilir dosya oluturulur. Bu dosya daha sonra istendii zaman altrlr, yani evirme ile altrma ilemleri birbirinden ayrlr. Bylelikle evirme ilemi
yalnzca bir kere yaplr. Herhangi bir komutta hata varsa evirme ilemi tamamlanmaz,
yani altrlabilir kodun olumas iin hibir yazm hatas olmamas gerekir; ancak program daha sonra altrlrken alma-zaman hatalaryla karlalabilir. Fortran, Pascal,
C gibi diller genelde derleyicilerle kullanlrlar.
Karma
Hem derleme hem de yorumlama teknii kullanlr. Bu tip almada kaynak kodu
sanal bir bilgisayarn makina koduna (bytecode) evrilir ve daha sonra bu sanal bilgisayar gerekleyen bir program yardmyla yorumlanarak altrlr. rnein Java dilinde
yazlm bir kaynak kodu nce Java derleyicisinden geirilerek Java sanal makinasnn
(Java Virtual Machine - JVM) makina koduna dntrlr; sonra da bu sanal makinay gerekleyen bir Java alma ortam (Java Runtime Environment - JRE) yardmyla
altrlr.
Yorumlama ynteminde kodun okunmas ve evrilmesi programn almas srasnda yapldndan hz dktr. Ayrca yorumlayc yalnzca karlat ilk hatay rapor edebilir. Bu
25
Giri
hata dzeltildiinde sonraki almada da program ancak bir sonraki hataya kadar ilerleyebilir. Oysa derleyici kaynak kodundaki btn hatalar bulabilir. Buna karlk hata ayklama
ilemi yorumlayclarla daha kolaydr. Ayrca derleyicilerle gelen baz snrlamalarn kalkmas
nedeniyle daha esnek bir alma ortam salanr. Son yllarda iki yntemin stn yanlarn
birletiren karma diller (Java ve Python gibi) ne kmaya balamlardr.
1.6.3
Kitaplklar
Bir programcya gerekebilecek her eyi programlama dilinin iine almak o dili ileyecek aralarn hantallamalarna neden olur. C dili bu nedenle olduka kk bir dil olarak tasarlanmtr. rnein basit aritmetik ilemlerin tesindeki matematik ilemleri dilin tanm iinde
yer almaz; szgelimi karekk alma ilemi iin bir C komutu yoktur. Bununla birlikte, pek ok
programcnn bu tip ilemlere gereksinim duyacaklar da aktr. Byle bir durumda programc, isterse karekk alma ilemini yapacak kodu kendisi yazabilir. Ancak programcnn bu
tip ilemler iin kendi kodlarn yazmasnn nemli sakncalar vardr:
1. Her programcnn ayn ileri yapan kodlar yazmas byk zaman kaybna yol aar.
2. Programcnn yazaca kod hatal olabilir, yani yanl sonu retebilir. Ya da doru sonu
retse bile, yeterince etkin olmayabilir, yani ilemi yapmak iin gereinden fazla zaman
ya da sistem kayna harcayabilir.
Hem dilin tanmn kk tutmak hem de bu sakncalar giderebilmek iin, ou programcya gerekebilecek ilemler (yordamlar) kitaplk ad verilen arivlerde toplanmtr. Bir saynn
karekkn almak isteyen bir programc matematik kitaplndaki
sqrt
yordamn kullanabi-
lir. Kitapln kullanlmas yukarda sz geen sakncalar giderir, yani programcya zaman
kazandrd gibi, doru ve etkin alt snanm olduundan dikkatini programn dier ksmlarna younlatrma frsat verir.
1.6.4
Standartlar
C dilinin gelitirilmesinde gzetilen ana hedeerden biri tanabilirlikti. Bunun iin deiik
ortamlardaki aralar arasnda bir standart olmas gerektii aktr. C dilinde yaplan standartlama almalar sonucunda oluan ANSI C standard, hem C dilinin kurallarn belirler,
hem de bir C gelitirme ortamnda bulunmas zorunlu olan standart kitaplklar ve bu kitaplklarda yer alacak yordamlar tanmlar. Uluslararas Standartlar Organizasyonu'nun (ISO)
C++ dili iin hazrlad ISO-C++ standard da son yllarda yazlm btn C/C++ gelitirme ortamlar iin en temel kaynaklardan birini oluturmaktadr.
Dier nemli bir standart olan POSIX standard ise programlama dili ile iletim sistemi arasndaki balantlar belirler. rnein dosya silmek, dosya ad deitirmek, sistemdeki baka
bir programla haberlemek gibi ilemler iin gereken yordamlar bu standartta yer alrlar.
Yine de ska gereksinim duyulan btn ilemler iin btn kitaplklarda bir standart henz
salanamamtr. rnein grak bir arayze sahip uygulamalardaki grak ilemlerini yapacak
kitaplklar standartlatrlmam olduundan eitli rma ve kurumlar bu ilemleri yapan farkl
26
Program Gelitirme
kitaplklar gelitirmilerdir. Dolaysyla bu kitaplklar kullanlarak yazlan programlar tam anlamyla tanabilir olmamakta, yalnzca bu kitapln destekledii ortamlara tanabilmektedir. Son zamanlarda farkl iletim sistemlerinde alabilen grak kitaplklar yaygnlat iin
doru aralar seildiinde bu sorunun da stesinden gelinebilmektedir.
1.6.5
Derleme Aamalar
Kaynak koddan retilecek olan altrlabilir makina kodunda hem programcnn kendi yazd
yordamlarn, hem de yararland kitaplk yordamlarnn makina koduna evrilmi hallerinin
bulunmas gerekir. Bu nedenle, kaynak kodunun makina koduna evrilmesi iki aamada gerekleir (ekil 1.20):
derleme
kaynak kodu
baglama
ara kod
alistirilabilir kod
kitapliklar
Derleme
lk aamada kaynak kodu derlenerek bir ara koda dntrlr. Bu kod, kullancnn
yazd yordamlarn makina kodu karlklarn ieren bir dosyadr. Ancak, programcnn
kullanm olduu kitaplk yordamlarn iermediinden henz altrlabilir durumda
deildir.
Balama
kinci aamada ara kod ile programcnn kulland kitaplk yordamlar arasnda
Sorular
1. Blm 1.1'de verilen takas ilemi iin yazlan atama komutunun sralarn deitirerek
ne sonular elde edildiini belirleyin. Problemin ka doru zm vardr?
2. Blm 1.2.1'de yaplan algoritma hz karlatrmalarnda verilen en kt ve ortalama
cinsinden hesaplayn.
3. ki saynn en byk ortak blenini hesaplamak iin verilen iki algoritmay, basitlik ve
etkinlik alarndan karlatrn. kiden fazla saynn en byk ortak blenlerini hesaplamak iin bir algoritma gelitirin.
27
Giri
a
say2 deerleri atanarak yineleme yapsna girildiini
say1 > say2 ya da say1 < say2 olmas durumlarnda al-
say1, b
deikenine
varsayalm. Balangta
Program Gelitirme
28
Blm 2
C Diline Giri
Bu blmde deikenler, atama, deyimler, giri-k gibi konularn C dilinde nasl gereklendikleri zerinde durulacaktr.
Aklamalar
byk yarar vardr. zellikle kolayca anlalmayacak programlama tekniklerinin kullanld kod paralarnn aklanmas gerekir. Aklamalar derleyici tarafndan gzard
edilir, yani programn ileyilerine hibir etkileri yoktur. Kodun iine aklama iki ekilde yazlabilir:
Birinci yntemde, aklamann bana bl-yldz, sonuna yldz-bl simgeleri konur. Bu ekildeki aklamalar birden fazla satr srebilir. rnekteki birinci aklama birinci satrdaki lk
alann
hesaplar.
C programm
bir aklamann iinde ikinci bir aklama olamaz. ie aklamalar u ekilde bir
yap oluturur:
30
/* lk C programm.
*
*
*
* Yarap verilen bir dairenin evresini ve alann hesaplar. */
#include <iostream>
#include <stdlib.h>
// cout,cin,endl iin
// EXIT_SUCCESS iin
31
C Diline Giri
Bu yapda birinci
/*
/*
*/
ve
g-
blgeleri
oluturur. Bundan sonra gelen blm (d blgesi) normal C kodu gibi deerlendirileceinden hataya yol aar.
1 Ksa
kinci yntemde, aklama ift bl ile balar ve satrn sonuna kadar srer.
Komutlar
C dilinde komutlar noktal virgl ile sona erer. Pepee birden fazla boluk derleyici
tarafndan tek boluk olarak deerlendirilir; dolaysyla bir komutun bir satr iinde
balayp sona ermesi zorunluluu yoktur. Yani
cout < < Alan: < < area < < endl;
komutu
fonksiyon bloundaki btn komutlar satr bandan drt harf ieriden balamaktadr.
zellikle iie yaplarn kullanld durumlarda (seimin iindeki yinelemenin iindeki
seimin iindeki seim gibi) bloklar hiyerarik bir ekilde girintilemek byk nem tar.
Atama
circum = 2 * PI * radius;
komutu bir atama komutudur,
nine atar.
1
2
2 * PI * radius
deyiminin sonucunu
circum
deike-
Bu aklama yntemi C++ ile getirilmi bir yeniliktir, C dilinde geerli deildir.
Tek atama komutuyla birden ok deikene ayn deer atanabilir. rnein
a = b = c = 24;
komutu
c = 24; b = c; a = b;
32
simler
Fonksiyonlar
main
main
fonksiyonu bulunmas
zorunludur.
C dilinde bir fonksiyonun ierdii komutlar bir blok olarak deerlendirilir. Bloklar assl-ayra ile balar ve kapa-ssl-ayra ile sona erer. Bu notlardaki ou rnekte
main
int main(void)
{
...
return EXIT_SUCCESS;
}
Balk dosyalar
kullanld zaman derleyiciye bunlarla ilgili bilgileri nerede bulabileceini sylemek gerekir. Bu bilgilerin yer ald balk dosyalar program banda
belirtilir. rnein
cout
birimi
iostream
#include
komutuyla
ramda
#include <iostream>
komutu yer almaktadr.
stdlib.h
3 Benzer ekilde,
dosyas ierilmelidir.
Bir kitaplktan yararlanacanz zaman gerekli bilgilerin hangi balk dosyalarnda yer aldn bilmeniz gerekir. Temel fonksiyonlar standartlarda belirlenmi olduundan (bkz.
Blm 1.6.4) bunlarn balk dosyalarn ou C/C++ kitabnda bulabilirsiniz. Standartlara girmemi fonksiyonlar iinse kullandnz derleyici ve kitaplklarn yardmc
belgelerine bavurmalsnz.
2.1
simler
Programlardaki deiken, fonksiyon gibi varlklara verilen isimlerin baz kurallara uymalar
gerekir:
weight-1
ve
weight_1
ve
2weight
.h uzants verilir. C++ standardnda ise baz balk dosyalarnn uzaniostream balk dosyas C++ ile tanmlanm yeni balk dosyalarna bir r-
, arlk
Unix iletim sistemlerinde yardmc belgeler ile ilgili bilgi iin bkz. Ek B.1.
33
C Diline Giri
smin en az ilk 31 simgesi anlamldr. Baka bir deyile, ilk 31 simgesi ayn olmayan iki ismin farkl olaca kesindir ama aynlarsa derleyici bu iki ismin farkl olmad-
population_increase_between_years_2000_and_2001 ile
population_increase_between_years_2001_and_2002 isimli iki deiken tanmlanrsa
ilk 31'er simgeleri ayn olduundan baz derleyiciler bu ikisinin ayn deiken olduklarna
karar verebilir.
geerli
cout
Byk projelerde isim akmalar sorun yaratmaya balar. Bu durumu dzeltmek amacyla isim uzaylarndan yararlanlr. Bu kitaptaki rnekler kk boyutta olduklar iin
bu sorunlar gzard edilecek ve standart isim uzaynn kullanldn belirtmek zere
programn banda
cin, cout
ve
eriimi salar;
Gelenek
Deiken ve fonksiyon isimleri kk harerle balar. Baka bir deyile, byk harer
ya da altizgi iaretiyle balamaz.
height
x4szb
gibi
Anlaml isimler verilmek istendiinde bazen birden fazla szce gereksinim duyulabilir. Bu durumda ya ismi oluturan iki szck bir altizgi iaretiyle birletirilir (rnein
birth_month)
2.2
birthMonth).
Deerler
Tamsaylarn doal gsterilimleri onlu dzendedir, ancak istenirse sekizli ya da onaltl dzende
de gsterilebilirler. rnekte 2 says onlu gsterilimde yazlm bir tamsaydr. 0 rakamyla
balayan saylarn sekizli, 0x ile balayanlarn onaltl dzende olduklar varsaylr. Buna gre,
59 says sekizli dzende 073, onaltl dzende 0x3b olarak yazlr.
34
Deikenler
Kesirli saylarn doal gsterilimi noktal gsterilimdir, ancak istenirse bilimsel gsterilim
(mantis * 10
sirli saydr. Saynn yazlnda E simgesi geiyorsa bu simgenin ncesi mantis, sonras s
olarak deerlendirilir. Buna gre, 3.14 says bilimsel gsterilimde 314E-2 (314 * 10
2 ) olarak
yazlabilir.
Simgeler tek, katarlar ift trnak iaretleri arasnda yazlrlar. rnekte Alan: deeri bir
katardr; yalnzca A harnden sz edilmek isteniyorsa 'A' eklinde yazlr. Katar iinde yazlan
her boluun nemi vardr, yani szgelimi pepee be boluk brakldnda bu bir boluk
olarak deil, be boluk olarak deerlendirilir. rnein Alan
2.3
Deikenler
C dilinde, bir deikene bir deer vermeden ya da deerini bir hesapta kullanmadan nce
deikenin tanmlanmas gerekir. Tanmlama ilemi, bellekte gerektii kadar yerin bu deiken
iin ayrlmasn salar; bylece sistem, bellekte ayrlan bu yeri bu deiken iin kullanr ve
baka ilerde kullanmaz.
Tanmlama, deikenin tipinin ve adnn belirtilmesinden oluur. rnekte
float radius;
tanm derleyiciye
radius adnda bir deiken olduunu ve bir kesirli say tutacan belirtmeye
yarar.
Ayn tipten olan deikenler ayn tanmn iinde yer alabilirler. rnekteki
circum
ve
area
float radius;
float circum;
float area;
eklinde ayrlarak ya da
35
C Diline Giri
radius
Gelenek
circum
ve
area
Deikenlere balang deeri atanmas yararl bir alkanlktr. Balang deeri atanmazsa
deiken rasgele bir deer alabilir ve programcnn dikkatsiz davranmas durumunda bu rasgele
deer yanllkla hesaplarda kullanlabilir ve istenmeyen sonulara yol aabilir.
Genelde bir blok iindeki deiken tanmlar ile komutlar birbirlerinden ayrlr, yani kullan- Gelenek
ve komutlarn balad yerin kolayca grlmesini salamak amacyla tanmlar ile komutlar
arasnda bir satr boluk braklr.
2.4
Veri Tipleri
int sakl szcyle belirtilir. Bu veri tipi short ve long belirteleriyle gelitirilerek ksa tamsay (short int) ve uzun tamsay (long int) tipleri oluturulabilir.
tamsay
Aksi belirtilmedike tamsay tiplerinin iaretli olduklar varsaylr, yani hem pozitif
hem de negatif deerler alabilirler. Deiken yalnzca pozitif saylardan (0 da olabi-
float
ve
double)
tipleri
kullanlabilir.
simge
char
deerler alrlar (bkz. Ek A). rnein 'A' har ASCII kodlamasnda 65. srada
olduundan 'A' simgesinin say deeri 65'tir.
mantksal
bool
alabilirler.
true
ya da
false
deerini
Bir deikenin tanmlanaca veri tipi, o deikenin alabilecei deer araln belirlediinden
son derece nemlidir. Bu nedenle bir deikenin veri tipine karar verirken o veri tipinin izin
verdii deer aralna dikkat etmek gerekir. Szgelimi
short int
sizeof
216 1
5
6
C++ dilinde komutlar baladktan sonra da deiken tanmlanabilir. C dilinde buna izin verilmez.
C dilinde mantksal verileri temsil edecek zel bir veri tipi yoktur, bu tip C++ dilinde getirilmitir; yani
bool, true
ve
false
36
Deimezler
2.5
Deimezler
Programda kullanlan baz bilgiler de programn farkl almalar arasnda deer deitirmezler. rnekteki
PI
PI
Deitirmek kolay olur. Diyelim programn gelitirilmesinin ileri aamalarnda 3.14 deerinin yetersiz kaldna ve 3.14159 deerinin daha uygun olduuna karar verirsek kod
iinde tek bir noktada deitirmek yeterli olur. br trl, kodun iindeki btn 3.14
saylarnn yerine 3.14159 yazmamz gerekir. Daha da kts, kodun iindeki baka byklkleri gsteren 3.14 deerlerinin de gemesi olasldr. Bu durumda btn 3.14
deerlerini tek tek inceleyerek deitirilip deitirilmeyeceine karar vermek gerekir.
1.
#define
tantlan deimezlere gelenek olarak tamam byk harerden oluan isimler verilir.
Bu bildirim ynteminde deimezlerin tipleri ayrca belirtilmez. Tamsay deimezler
int
tipine smyorlarsa
eklenirse
long, u
ya da
long int
eklenirse
unsigned
ya da
hareri
ya da
eklenirse
tipinden ol-
const
niteleyicisi koyarak
PI
dei-
hata verir.
C dili
const
ile tanmlanm deimezlerin deerlerinin deitirilebilmesine izin verir. Bu tipten bir dei-
kene atama yaplmak istendiinde derleyici hata deil, yalnzca bir uyar retecektir.
37
C Diline Giri
2.6
Aritmetik Deyimler
Toplama:
kartma:
arpma:
Blme:
ileciyle gereklenir.
Kalan:
ileciyle gereklenir.
ileciyle gereklenir.
ileciyle gereklenir.
tanml deildir.
Bunlarn yansra matematik kitaplnda yer alan fonksiyonlar da aritmetik deyimlerde yer
alabilirler (bkz. Blm 2.9).
Komutlarn okunurluunu artrmak amacyla C programclarnn uyduklar geleneklerden biri Gelenek
de, eit iaretinin ncesinde ve sonrasnda birer boluk brakmaktr. Benzer ekilde, deyimlerde
yer alan ilelerin (rnekte
C'de deyimlerin hesaplanmasnda izlenen ncelik sras, matematikten alk olunan sradr.
Yksek ncelikliden alak ncelikliye doru ncelik gruplar yledir:
ve
rnek.
a+b+c+d+e
5
aritmetik deyimi C'de
(a + b + c + d + e) / 5
eklinde yazlmaldr. Ayralar kullanlmazsa ortaya kan
a + b + c + d + e / 5
38
Tip Dnmleri
C deyimi
a+b+c+d+
e
5
rnek.
p * r % q + w / x - y
deyimi u srayla hesaplanr:
t1:
t2:
t3:
t4:
t5:
2.7
p * r
t1 % q
w / x
t2 + t3
t4 - y
Tip Dnmleri
leme giren saylarn her ikisi de tamsay ise sonu da tamsay olur. Saylardan herhangi birinin
kesirli say olmas durumunda sonu da kesirli say olacaktr. Bu durum blme ileminde dikkat
edilmesi gereini dourur. Blme ilemine giren her iki say da tamsay ise sonu da tamsay
olacaktr, yani sonucun varsa kesir ksm atlacaktr. rnein
14 / 4
deil 3 olacaktr. leme giren her iki say da tamsay ise ve sonucun kesir ksmnn yitirilmemesi
isteniyorsa saylardan en az birinin kesirli say olmasn salamak gerekir. Yukardaki rnek
iin zm u yazllarla salanabilir:
14.0 / 4
14 / 4.0
14.0 / 4.0
Bir blme ilemine giren iki deikenin ikisinin de tamsay tipinden olmas durumunda sonu
yine tamsay olacaktr. rnein
num1
ve
quotient deikeni 3.0 deerini alr. lemin doru olarak yaplmasn salanum2 deikenlerinden en az birinin kesirli say tipine evrilmesi gerekir. Bu
ileme tip zorlama ad verilir ve bir deyimin bana ayra iinde deyimin sonucunun almas istenen tipin adnn yazlmasyla yaplr. Yukardaki rnein doru almas iin u komutlardan
herhangi biri kullanlabilir:
39
C Diline Giri
num1
num2
deikeni, nc ko-
mutta ise her ikisi birden kesirli sayya evrilmektedir. Buna karlk
quotient
deerini atar.
Genel olarak, bir ileme giren saylar farkl tiptense, bunlarn ortak bir tipe evrilmeleri gerekir.
Dar tipten geni tipe gei ilemleri derleyici tarafndan otomatik olarak yaplr. rnein,
bir toplama ileminin ilenenlerinden biri tamsay dieri kesirli say ise tamsay olan kesirli
sayya evrilir ve toplama yaplr. Aadaki rnekte toplama ileminin ikinci ileneni kesirli
say olduundan toplamadan nce
num1
int num1;
float num2 = 65.717;
num1 = num2;
Derleyiciler bu gibi durumlarda genelde hata deil yalnzca uyar retirler.
2.8
Artrma / Azaltma
Bir atamann sa tarafndaki deyim, atamann sol tarafndaki deikeni ieriyorsa, yani
deiken = deyim;
40
Matematik Kitapl
a += 5;
a /= 2;
a *= c + d;
// a = a + 5;
// a = a / 2;
// a = a * (c + d);
Buna gre, bir deikenin deerini artrmak ya da azaltmak iin aadaki komutlar kullanlabilir:
a = a + 1; a += 1;
a = a - 1; a -= 1;
Ancak artrma ve azaltma ilemleri programlarda ska gereksinim duyulan ilemlerden olduk-
Her iki ile de yalnzca tamsay veri tipleri ile alrlar ve basit kullanmda ilecin deikenin
nne mi arkasna m yazldnn bir nemi yoktur:
a++;
a--;
++a;
--a;
2.9
Matematik Kitapl
ANSI standard, bir C derleme ortamnn matematik kitaplnda bulunmas zorunlu olan
fonksiyonlar belirler. Bu fonksiyonlarn kullanlabilmesi iin programlarn banda
math.h
ve
giri parametreleri
double
double
tipinden olacaktr.
Artrma ve azaltma ilemleri baka ilemlerle birlikte kullanlabilir. Szgelimi bir artrma ilemiyle bir
atama ilemi ayn komut ierisinde yaplabilir. Byle durumlarda artrma/azaltma ilecinin deiken adnn
nne ya da arkasna yazlmas nem kazanr. nne yazldnda nce artrma, sonra atama yaplacaktr.
Arkasna yazldndaysa nce atama, sonra artrma yaplr. Yani
y = ++x;
komutu
x++;
y = x;
koduna kar derken
y = x++;
komutu
41
C Diline Giri
Ad
levi
trigonometrik fonksiyonlar
ters trigonometrik fonksiyonlar
hiperbolik trigonometrik fonksiyonlar
ex
e ve 10
xy
bxc dxe
|x|
Trigonometrik fonksiyonlarda giri parametresi derece deil radyan cinsinden verilmelidir; rnein sin(30) deyimi 0.5 deil -0.988032 deerini retir. 30 derecenin sinsn
sin(30*3.141529/180) ya da sin(3.141529/6) deyimini yazmak gerekir.
almak iin
Alt ve st snr fonksiyonlarnn almasnda giri parametresinin pozitif ya da negatif olmasna dikkat edilmelidir. Alt snr fonksiyonu her zaman o saydan daha kk olan ilk tamsayy,
st snr fonksiyonu ise o saydan daha byk olan ilk tamsayy verir.
floor(3.1) 3, floor(-3.1) -4
ceil(3.1) 4, ceil(-3.1) -3
Tamsaylar iin de tamsay giri parametresi alan ve tamsay k parametresi reten
abs
2.10
Giri / k
C dilinde kullancyla iletiimi salayan ilemler giri/k birimleri zerinden yaplr (bkz.
Blm 1.5). Girdiler
9
gnderilir.
rnekteki
C dilinde
cin, cout ve cerr birimleri yoktur, bunlarn yerine standart girdi/kt kitaplndaki fonksiyon-
42
Giri / k
komutu sonucunda
radius
Birden fazla deiken birlikte okunmak isteniyorsa bunlar birbiri ardna > > iaretleriyle belirtilebilir. Szgelimi, iki tane say deeri okunacak ve kullancnn yazd birinci saynn deeri
num1,
num2
deikenine aktarlacaksa:
cout < < Alan: < < area < < endl;
komutu ekrana nce
cout < < evresi: < < 2 * PI * radius < < endl;
cout < < Alan: < < PI * radius * radius < < endl;
komutlaryla da yaplabilirdi.
10
y = ex
formlnde
y'nin
PI deimezinin tanmn 3.14 yerine 3.14159 olarak verin ve ayn x deerinde y'nin ald
deeri gzleyin.
10
Unix iletim sistemlerinde derleme aamalar ile ilgili bilgi iin bkz. Ek B.2.
43
C Diline Giri
rnek 2 y = ex
#include <iostream>
#include <stdlib.h>
#include <math.h>
// cout,cin.endl
// EXIT_SUCCESS
// exp
float x, y;
satrndaki 'x' harni 'X' ile deitirin ve derleme sonucunda oluan hatay gzleyin.
rnekteki
PI = 3.14159;
komutunu ekleyin ve derleme sonucunda oluan hatay gzleyin.
#define
PI deimezinin tanmland
satrn silin ve
float x, y;
satrnn ardna
Bataki
#include <math.h>
44
Giri / k
Sorular
1. altnz gelitirme ortamnda
int
ve bu aralklar dnda bir deer atandnda nasl bir sonu elde edildiini gzleyin.
2. Aadaki deyimlerin sonularn bulun:
8 + 17 % 3 * 5
45 / (4 + 7) - 5.0 / 2
3. Aadaki aritmetik deyimleri gerekleyen C deyimlerini yazn:
cd efhg
x(y + z)
1
2ab
a + 3 * b - (c + d) / 2 * y;
Blm 3
Ak Denetimi
Bu blmde blok yapl programlamada gereken seim ve yineleme yaplarnn C dilinde nasl
gereklendikleri zerinde durulacaktr.
+ bx + c = 0
x1,2 =
b2 4ac
b2 4ac
2a
Denklemin kkleri akksa (diskriminant sfrsa) bu durumu kk deeriyle birlikte kullancya bildirilir.
Denklemin iki farkl gerel kk varsa (diskriminant pozitifse) bunlar hesaplanarak ekrana kartlr.
45
46
// cout,cin,endl
// EXIT_SUCCESS
// sqrt
47
Ak Denetimi
3.1
Koul Deyimleri
Blok yapl programlamadaki seim ve yineleme yaplarnda bir koula gre bir karar verilmesinin salanmas gerektii grlmt (bkz. Blm 1.3). Koullar, koul deyimleriyle gsterilirler. C dilinde bir koul deyimi, iki saysal bykln (aritmetik deyimin) karlatrlmas
ile oluturulur ve mantksal bir deer (doru ya da yanl) retir. Dier btn veri tipleri
gibi mantksal deerler de saylarla temsil edilirler; yanl deeri 0, doru deeriyse 1 saysyla
gsterilir.
3.1.1
Karlatrma lemleri
Eitlik:
Farkllk: != ileciyle gereklenir. Eitlik karlatrmasnn tersidir. lecin solundaki deerle sandaki deer farklysa doru, aynysa yanl sonucunu retir.
Kklk:
<
Byklk:
>
cin solundaki deer sandaki deerden kk veya eitse doru, bykse yanl sonucunu
retir.
cin solundaki deer sandaki deerden byk veya eitse doru, kkse yanl sonucunu
retir.
rnekler
(year % 4) == 0
age >= 18
Karlatrma ilemleri tam ya da kesirli saylarn karlatrlmasnda kullanlabilecei gibi,
harerin abecedeki sralarna gre karlatrlmasnda da kullanlabilir. Szgelimi
48
Koul Deyimleri
koul deyimi doru deerini retir. Ancak bu ilem yalnzca ngilizce harer arasnda doru
sonu retecektir. Ayrca, byk-kk harf karlatrmalarnda da abece srasndan farkl
sonular kabilir. rnein u koul deyimi doru deerini retir:
katarlar abece srasna gre karlatrlamaz, yani aadaki komut geerli deildir (doru ya
da yanl sonucunu retmez, derleyicinin hata vermesine neden olur):
f1 == f2
yerine aadaki gibi bir koul yazlabilir:
Mantksal lemler
Baz durumlarda tek bir karlatrma ilemi btn koul deyimini oluturmak iin yeterli olmaz. rnein bir insann yann 18 ile 65 arasnda olup olmadn snamak istiyorsanz, bunu
tek bir karlatrma ilemiyle yapamazsnz (18
<= x < 65
DEL ilemi: ! ileciyle gereklenir. nne yazld koul deyimini deiller, yani doruysa yanl, yanlsa doru deerini retir (bkz. Tablo 3.1).
koul
!(koul)
doru
yanl
yanl
doru
rnek
Ya 18'den kk deil:
49
Ak Denetimi
koul1
koul2
doru
doru
doru
doru
yanl
yanl
yanl
doru
yanl
yanl
yanl
yanl
VE ilemi:
&&
rnek
VEYA ilemi:
||
koul1
koul2
(koul1) || (koul2)
doru
doru
doru
doru
yanl
doru
yanl
doru
doru
yanl
yanl
yanl
rnek
rnek
Bir yln artk yl olup olmadn belirleyen koul deyimi. Sonu 00 ile biten (100'e
kalansz blnen) yllar dndaki yllar 4 saysna kalansz blnyorlarsa artk yl olurlar. Sonu 00 ile bitenler ise 400 saysna kalansz blnyorlarsa artk yldrlar. Bunlarn
dnda kalan yllar artk yl deildir. Szgelimi, 1996, 2000, 2004 ve 2400 yllar artk
yldr ama 1997, 2001, 1900 ve 2100 yllar artk yl deildir.
50
Seim
3.2
Seim
if
if/else
else
yrtlr:
if (koul ) {
blok1 ;
} else {
blok2 ;
}
rnekte iie iki seim yaps vardr. teki seim yaps u ekildedir:
if (disc == 0) {
x1 = -b / (2 * a);
cout < < x1 < < noktasnda akan iki kk var. < < endl;
} else {
x1 = (-b + sqrt(disc)) / (2 * a);
x2 = (-b - sqrt(disc)) / (2 * a);
cout < < x1 < < ve < < x2
< < noktalarnda iki gerel kk var. < < endl;
}
Burada
disc deikeninin deeri 0 ise akk kklerle ilgili ilemler yaplr (iki komuttan oluan
bir blok); deilse farkl iki gerel kk bulunmas durumundaki ilemler yaplr ( komuttan
oluan bir blok).
Seim yaplarnda bir
else
if (koul ) {
blok ;
}
2
Birden fazla kouldan oluan mantksal deyimler deerlendirilirken sonu belli olduu zaman deyimin geriye
deyiminde
ndan
(year % 4 == 0)
51
Ak Denetimi
eklinde olabilir. Bu durumda koul doruysa blok yrtlr, deilse hibir ey yaplmaz.
Bir blok tek bir komuttan oluuyorsa bloun ssl ayralar ile snrlanmas zorunlu deildir.
rnekteki d seim yapsnda dikkat edilirse koulun doru olmas durumunda yrtlecek
blokta ssl ayralar kullanlmamtr:
if (disc < 0)
cout < < Gerel kk yok. < < endl;
else {
...
...
...
}
Burada istenseydi birinci blok da ssl ayralarla belirtilebilirdi:
if (disc < 0) {
cout < < Gerel kk yok. < < endl;
} else {
...
...
...
}
Gelenek olarak tek komutlu bloklarda ssl ayralar kullanlmaz, yani rnek programda kul- Gelenek
lanlan yazl ekline uyulur. Ancak bu durumda ssl ayra kullanlmayan bloun tek komut
iermesine ok dikkat etmek gerekir. Dier bir gelenek de, koulun doru ya da yanl olmasna gre yrtlecek bloklardan biri dierine gre ok ksaysa, ksa olan blok ste gelecek
(koulun doru olmas durumunda yrtlecek) ekilde dzenlenmesidir. rnekte bu gelenee
uyulmam olsayd d seim yaps u ekilde yazlabilirdi:
if (disc >= 0) {
...
...
...
} else
cout < < Gerel kk yok. < < endl;
Seim ve ileride grlecek yineleme yaplar bir btn olarak tek bir komut olarak deerlendirilirler. Dolaysyla bir blokta yer alan tek yap baka bir seim ya da yineleme blouysa ssl
ayralarn kullanlmas zorunlu deildir. Yani u blok
if (koul1 ) {
if (koul2 )
blok ;
}
52
Seim
u ekilde de yazlabilir:
if (koul1 )
if (koul2 )
blok ;
Ssl ayralar kullanlmadnda iie
if / else
if (koul1 )
if (koul2 )
blok1 ;
else
blok2 ;
Burada
blok2
koul2
if
blok2 , koul1
else'in
doru ve
if (koul1 )
if (koul2 )
blok1 ;
else
blok2 ;
Yine de karkla neden olmamas iin byle durumlarda ssl ayralar kullanmak daha
dorudur.
DKKAT
Herhangi bir aritmetik deyim koul deeri olarak deerlendirilebilir; deyimin sonucu 0 ise yanl, 0'dan farkl ise doru olduu varsaylr. Buna gre, szgelimi 8 - 2 deyimi doru, 8 - 2 * 4
deyimiyse yanl bir koul olarak deerlendirilir. Bu davran zellikle eitlik karlatrmalarnda hataya yol aabilir. En sk yaplan C hatalarndan biri bir eitlik karlatrmasnda
yerine
==
iareti kullanlmasdr.
age = 12;
...
...
if (age = 18)
blok1 ;
else
blok2 ;
Yukardaki programda koulun snanmas srasnda eitlik ilemi deil atama ilemi belirtildiinden
age
blok2
blok1
yrtlr. Oysa
yrtlrd.
==
simgesi kullanlsayd
age
deikeninin deeri
53
Ak Denetimi
3.2.1
Koullu le
Koullu ile, bir koulun gerekleip gereklememesine gre iki deyimden birini seer.
deyim1
deyim2 ,
yanlsa
deyim3
seilir.
Basit bir rnekle, iki saydan kn semek iin yle bir kod kullanlabilir:
if (x < y)
z = x;
else
z = y;
Ayn ilem koullu ile kullanlarak yle de yazlabilirdi:
z = x < y ? x : y;
Adndan da anlalabilecei gibi, koullu ile bir iletir, yani birtakm byklkler zerinde
bir ilem yapar ve belli bir tipten bir sonu retir. Bir seim yaps deildir, yani programn
aknn nasl devam edecei zerinde bir etki yaratmaz; ak bir sonraki komutla devam eder.
lemi yaznz: 18 / 5
18/5 ileminin sonucu: 3
3.3
oklu Seim
Bir deyimin ok sayda deer iinden hangisini alm olduunu snamak istiyorsak yazacamz
if
kodu uzun ve irkin bir grnm alr. rneimizde yaplacak ilemin hangisi olduunu
if
if (op == '+') {
...
} else {
54
oklu Seim
// cin,cout,endl
// EXIT_SUCCESS
55
Ak Denetimi
if (op == '-') {
...
} else {
if (op == '*') {
...
Seim bloklarnn tek bir komut olarak deerlendirilmesi oklu karlatrmalarda da daha
kolay bir yazm olana salar. Buna gre, yukardaki oklu karlatrma yaps u ekilde de
yazlabilir:
if (op == '+')
...
else if (op == '-')
...
else if (op == '*')
...
switch
switch (deyim ) {
case deer_1 : blok_1 ;
break;
case deer_2 : blok_2 ;
break;
...
case deer_n : blok_n ;
break;
default:
blok ;
break;
}
Bu komutun ak izenei ekil 3.3'de grld gibidir. Deyim, nce birinci deerle karlatrlr ve eitse buna ilikin blok yrtlr ve
break
komutuyla
switch
yapsnn dna
klr. Birinci deere eit deilse ikinci deerle karlatrlr. Karlatrmalarn hibiri doru
deilse
default blou yrtlr ve switch sona erer. Her switch yapsnda bir default blou
switch (5 * x) {
...
case y: ...
...
}
56
oklu Seim
case 1
blok 1
break
blok 2
break
blok n
break
case 2
case n
default blok
ekil 3.3:
switch
57
Ak Denetimi
Karlatrlan deyim ve deerler yalnzca tamsay ve simge tipinden olabilir (rnekte simge
tipinden deerlerle karlatrma yaplmtr). rnein aadaki yazmlar geerli deildir:
switch (name) {
...
case Dennis: ...
...
}
switch (x) {
...
case 8.2: ...
...
}
Yine dikkat edilmesi gereken bir nokta, karlatrmann yalnzca eitlik zerinden yaplddr. Bu yazmda, deyimin deerden kk ya da byk olup olmad ya da dier herhangi
bir mantksal deyimin doruluu belirtilemez. Ayrca, yazmdan grlebilecei gibi,
switch
break
komutu unutulursa
ekil 3.4'de grld gibi alr. Birinci karlatrma ilemi baarsz olursa bir sorun kmaz
ama baarl olursa
blok 1
yrtldkten sonra
blok 2
de yrtlr ve
break
break
ile
switch
toplama, sonra kartma, arpma, blme ve son olarak da kalan ilemi yaplr (yani yalnzca
kalan ilemi geerli olur), ayrca da
grntlenmeden programdan klr. lem kartma olduunda toplama ksm atlanr, gerisi
deminki gibi devam eder.
58
oklu Seim
case 1
blok 1
case 2
D
blok 2
break
blok n
break
case n
default blok
ekil 3.4:
switch
komutunda
break
59
Ak Denetimi
1 inch = 2.54 cm
eitlii ve Fahrenheit biriminde verilen bir sckl Celcius birimine evirmek iin de
5
C = (F 32)
9
forml kullanlacaktr.
case 1 blounun sonundaki break komutunu silin ve program altrarak her iki dnme de birer rnek deneyin
ki saynn en byk ortak blenini Euclides algoritmasn kullanarak bulan bir program yazlmas isteniyor. Bu algoritmaya ilikin ak izenei ekil 1.17'de, programn rnek bir almasnn ekran kts ekil 3.5'de verilmitir.
3.4
while (koul ) {
blok ;
}
while
szcyle kurulur:
60
// cout,cin,endl
// EXIT_SUCCESS,EXIT_FAILURE
switch (choice) {
case 1:
cout << "inch cinsinden uzunluk: ";
cin >> inch;
cm = 2.54 * inch;
cout << cm << " cm" << endl;
break;
case 2:
cout << "f cinsinden scaklk: ";
cin >> f;
c = (f - 32) * 5.0 / 9.0;
cout << c << " C" << endl;
break;
case 3:
return EXIT_SUCCESS;
default:
cout << "Byle bir ilem yok." << endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
61
Ak Denetimi
// cin,cout,endl
// EXIT_SUCCESS
while (b > 0) {
r = a % b;
a = b;
b = r;
}
cout << num1 << " ve " << num2
<< " saylarnn en byk ortak bleni: " << a << endl;
return EXIT_SUCCESS;
62
Dng Denetimi
rnekteki
while
blou
unda sona erecektir. Bu rnekte algoritmann doas gerei bu deiken eninde sonunda 0
deerini alacaktr; ancak yineleme yaplar kurarken dngnn her durumda mutlaka sonlanmasnn salanmasna zellikle dikkat edilmelidir.
Benzer bir dier yineleme yaps ise
do-while
szckleriyle kurulabilir:
do {
blok ;
} while (koul );
Bu yapnn
while
do {
r = a % b;
a = b;
b = r;
} while (b > 0);
Balangta
alrd. lk rnekte koul salanmayaca iin en byk ortak blen 1 olarak bildirilirdi; ikinci
Gelenek
rnekte ise sfra blme yapmaya kalklacandan bir alma zaman hatas oluurdu. Her ne
kadar
while ile kurulan yaplar ve do-while ile kurulan yaplar birbirlerinin ei olacak ekilde
while kullanlmas nerilir.
3.5
Dng Denetimi
Yineleme yaplarnda kullanlan dier bir yntemse, dngy bir sonsuz dng olarak kurup
dngden kma durumu olutuunda
break
komutunu kullanmaktr:
while (true) {
...
if (<kma koulu salanyor >)
break;
...
// kma koulu salanmad zaman yaplacaklar
}
oklu seim (switch) yapsnda olduu gibi burada da
63
Ak Denetimi
while (true) {
...
while (true) {
...
if (<kma koulu salanyor >)
break;
...
}
... // stteki break komutu sonucunda buraya gelinir
}
Dnglerde ak denetimine ynelik dier bir komut ise
i = 0;
while (i < 50) {
i++;
...
if (<koul> ) {
...
continue;
}
...
}
if ile belirtilen koul salanyorsa birtakm ilemlerin gerekletirilmesinden sonra
bana dnlr. Yani if bloundan sonra gelen komutlar atlanarak i deikeninin
Bu rnekte
dngnn
3.6
for
yapsdr. Bir
count
64
basla
oku: count
i1
heads 0
tails 0
i count
D
Tura
at
bas: heads
bas: tails
Yazi
dur
bas: "Tura"
bas: "Yazi"
heads heads + 1
tails tails + 1
ii+1
Ka kere atlacak? 7
Yaz
Tura
Tura
Yaz
Yaz
Yaz
Yaz
Tura says: 2, Yzdesi: %28.5714
Yaz says: 5, Yzdesi: %71.4286
65
Ak Denetimi
// cin,cout,endl
// EXIT_SUCCESS,srand,rand,RAND_MAX
// time
66
for
yaps bu belirtimin ayn anda yaplmasna olanak salar. Ay iinde nce balang
deeri atamas, ikinci olarak hangi koul saland srece devam edilecei ve son olarak da
sayacn nasl artrlaca belirtilir.
for
dngleri
while
balang_atamas ;
while (srme_koulu ) {
blok ;
artrma_komutu ;
}
dngsne edeerlidir. Yine de saya denetiminde yinelemeler iin
yinelemeler iin
while
for,
koul denetiminde
Dng, belirtilen koul salanmad zaman sonlanr ve programn yrtlmesi dngnn arkasndan gelen komutla srdrlr. rnekte
Artrma ilemi dng gvdesi yrtldkten sonra yaplr. rnekte dngnn gvdesi
deikeninin 1, 2, ...,
count
67
Ak Denetimi
dngsnde balang deeri srme koulunu salamadndan (1 == 10 doru olmadndan) dngye hi girilmez.
Artm miktar iin artrma ileci kullanlmas zorunlu deildir, herhangi bir C deyimi
kullanlabilir.
Rasgele Saylar
Yaz-tura atn temsil etmek iin en kolay yol 0 ile 1 arasnda bir rasgele say retmek ve bu
saynn 0.5'den kk olmas durumunu bir sonuca (diyelim tura), eit ya da byk olmasn
da dier sonuca (bu durumda yaz) atamaktr.
kesirli say elde edilir. Rasgele saylarn kullanmnda daha ok 1 ile bir st snr arasnda deer
alacak bir rasgele tamsayya gereksinim duyulur. Bu st snr
max
ile gsterilirse
1 + rand() % max
deyimi istenen trden bir say retir (Neden?).
Rasgele saylar, bir seri olarak retilirler; yani her rasgele say seride bir nceki rasgele saydan retilir. Bu serinin balayabilmesi iin ilk sayy retmekte kullanlacak bir balang
deeri (tohum ) verilmesi gerekir.
srand
tohumla balanrsa ayn seri retilir. Her serinin programn almasndaki bir senaryoya karlk dt dnlrse istendii zaman ayn senaryoyu retebilmek programn hatalarnn
ayklanmas asndan yararldr.
Her defasnda farkl bir tohumla balamak iin tohumun da her defasnda farkl verilmesi
gerekir. Standart kitaplktaki
time
saniyelerin saysn verdiinden her arlnda farkl bir tohum retebilir. Bu fonksiyona
NULL
Uygulama: Dngler
Bu uygulamada Unix bir hata ayklayc (ddd) tantlacaktr. Hata ayklaycda adm adm
ilerleme ve deiken deerlerinin gzlenmesi gsterilecektir.
68
ex
toplamndan yararlanlacaktr:
f (x) =
X
xi
i=0
i!
=1+x+
x2 x3 x4
+
+
+
2!
3!
4!
Birinci programda (rnek 8) iie iki dng vardr. erideki dng o anda ilenmekte olan
terimde gerekecek faktryel deerinin hesaplanmasn salar. D dngyse her yineleniinde
serinin o anki terimi hesaplayarak toplama ekler. Hesaplanan terim kullancnn belirttii
hatadan kk olduunda deerin istenen duyarllkta hesaplandna karar verilerek sonu
ekrana kartlr.
rnek 8 ex
#include <iostream>
#include <stdlib.h>
#include <math.h>
// cin,cout,endl
// EXIT_SUCCESS
// pow
return EXIT_SUCCESS;
69
Ak Denetimi
kinci programdaysa (rnek 9) ayn ilemin nasl daha etkin (daha az hesap ykyle) yaplabilecei grlecektir. Serinin genel teriminin
ai =
ile arplp
i'ye
ai
ai1
xi
i! olduu gznne alndnda dizide bir
= xi olarak hesaplanabilir. Yani her terim,
s alma ve faktryel hesaplama ilemlerine gerek kalmaz ve seri toplam ok daha hzl elde
edilir.
rnek 9 ex
#include <iostream>
#include <stdlib.h>
// cin,cout,endl
// EXIT_SUCCESS
Sorular
1.
deeri verin.
mantksal deyimini
70
(c)
x'in
saymyla deikenlerin alacaklar deerleri izlemek zere bir izelge oluturun. Ak izeneini izin.
i = -1;
while (x >= 1) {
i++;
y[i] = x % 8;
x = x / 8;
}
for (j = i; j >= 0; j--)
cout < < y[j];
3.
4. Kusursuz bir say, kendisinden kk btn arpanlarnn toplamna eit olan saydr.
rnein,
28 = 1 + 2 + 4 + 7 + 14.
g cinsinden gsterir. DuBois forml yetikinlerde iyi sonu verirken, ocuklarda (bu
formlle elde edilen alan deeri 0.6'dan kkse) ok hatal olabilmektedir. Buna gre,
boy ve ktlesini kullancdan ald bir insann (yetikin ya da ocuk) beden alann
yukarda anlatlan ltlere gre hesaplayarak ekrana karan bir program yazn.
6. Aada verilen Pascal geni iin
i.
satr
j.
binomi,j =
1
binomi1,j1 + binomi1,j
j =0j =i
aksi durumda
Buna gre, genin ilk 30 satrn hesaplayp ekrana kartacak bir program yazn.
7. Aadaki seri toplam hesaplanmak isteniyor:
71
Ak Denetimi
n
X
i=0
(a) Bu serinin
i.
(1)i
xi
x0 x1 x2 x3 x4
x5
=
+ ...
(2i)!
0!
2!
4!
6!
8!
10!
eleman
ai
ise,
ai+1 /ai
oran nedir?
de-
varsayarak 1 ile 6 arasnda reteceiniz rasgele sayda bu alt saynn gelme olaslklar
eit midir? Deilse, daha iyi bir yntem nerebilir misiniz?
72
Blm 4
Tretilmi Veri Tipleri
Bu blmde programcnn var olan veri tiplerinden kendi veri tiplerini (szgelimi kaytlar, bkz.
Blm 1.1.2) nasl tretebilecei zerinde durulacaktr.
C dilinin programcya kendi veri tiplerini tanmlayabilmesi iin sunduu temel olanak, var
olan veri tiplerine yeni isimler verilebilmesidir. Bunun iin
veri_tipi
isimli tipe
yeni_isim
verilmi olur.
rnein bir rencinin snav notlar ilenmek isteniyor olsun. Notlarn 0 ile 100 arasnda birer
tamsay olaca varsaymyla, renci notu tipinden bilgileri temsil etmek zere bir veri tipi
tanmlanabilir:
int veri tipine score_t diye yeni bir isim verilmi olur. Daha sonra bu tipten deiken
tanmlamak iin
Anlalrlk artar: Programn kodunu okuyan kii bu veri tipinin temsil ettii bilgiyle
ilgili daha iyi bir kir edinebilir.
73
74
Deitirmek kolay olur: Programn gelitirilmesinin ileri aamalarnda ya da sonraki srmlerde renci notlarnn kesirli olabilecei durumu ortaya karsa yalnzca veri tipine
isim verme komutunun
int
int
szcklerinin deimesi, bazlarnn deimemesi anlamna gelir ve programn boyutlarna gre byk zorluklar karabilir.
Oyuncu ayn toplam veren zarlar bir daha atana kadar ya da att zarlarn toplam 7
olana kadar zar atmaya devam eder.
Verilen rnek, bu oyunu simle eden bir programdr. Bu rnein ilgin bir yn
nn baz durumlarnda kastl olarak
her bir grup iin yaplacak ilemlerin bir kere belirtilmesi salanmtr. Programn rnek bir
almasnn ekran kts ekil 4.1'de verilmitir.
Zarlar: 1 + 4 =
Say: 5
Zarlar: 5 + 1 =
Zarlar: 5 + 5 =
Zarlar: 6 + 5 =
Zarlar: 4 + 1 =
Oyuncu kazanr.
5
6
10
11
5
Bu rnek, H.M. Deitel ve P.J. Deitel'in yazdklar C: How to Program kitabndan uyarlanmtr.
75
// cin,cout,endl
// EXIT_SUCCESS,srand,rand
// time
76
Numaralandrma
4.1
Numaralandrma
rnekte oyunun iinde bulunabilecei eitli durumlara birer say deeri atanarak oyunun o an
hangi durumda olduu izlenebilir. rnein kodumuzda oyunun durumunu gsteren
game_status
#define GAME_CONTINUES 0
#define PLAYER_WINS 1
#define PLAYER_LOSES 2
eklinde deimez tanmlar yaplarak kodun iinde saylar yerine isimler yazlabilir.
Bu tip, birbiriyle ilintili birden fazla deimezi birlikte tanmlamak iin numaralandrma yntemi kullanlabilir.
ssl ayralar iinde yazlan deimezlerden ilkine 0, sonrakine 1, sonrakine 2 vs. eklinde
deer verilir. Programc isterse baka deerler belirtebilir ancak bizim rneimizde -demin de
sylendii gibi- deerlerin, farkl olduklar srece, ne olduklarnn bir nemi yoktur:
enum knye
typedef
77
komutu
Dzenli bir alma iin numaralandrma tipinden tanmlanan deikenlerin yalnzca o numaralandrmayla belirlenen deimezler kmesinden deer almas gerekir. Szgelimi rneimizde
tanmlanan
game_status
deikeni
GAME_CONTINUES, PLAYER_WINS
ve
PLAYER_LOSES
dnda
herhangi bir deer alamamaldr. Ancak C dili byle bir kstlama getirmez, yani
game_status = 25;
gibi anlamsz olacak bir atama C dilinin kurallarna gre yasak deildir.
1
R1
1
R2
1
+ +
1
Rn
Buna gre, kullancdan ald direnlerin paralel edeerini hesaplayarak sonucu ekrana kartan bir program yazlmas isteniyor. Kullancnn ka tane diren deeri girecei batan belli
olmad iin bu dng
for
yapsyla deil
while
suz dngden kabilmek iin kullancnn bir ekilde bunu belirtmesine olanak verilmelidir.
Bu programda uygulanan yntem, zel bir deeri (rnein 0) bitirme iareti olarak semektir.
Kullanc bu deeri girerek baka diren deeri yazmayacan belirtebilir. Sonlandrma deerinin uygun seilmesi gerekir; geerli diren deerleri sonlandrma deeri olmaya uygun deildir.
Programn rnek bir almasnn ekran kts ekil 4.2'de verilmitir.
Bu programn almasnda dikkat ekici bir nokta, kullancnn yazd diren deerlerinin uygun ekilde toplama eklenmelerinin ardndan unutulmalardr. Yani ileride kullancnn girmi
olduu deerlerle bir ilem yaplmak istense bunlar bir ekilde ulalabilir olmayacaklardr. Bu
programn amac asndan bu durum bir saknca dourmaz ancak baka problemlerde farkl
yaplar kullanmak gerekebilir.
true, false
doru ve yanl byklkleri programlarda ska gereksinim duyulan deerler olduklarndan C programlarnda
genellikle bunlar genellikle programn banda deimez olarak tanmlanrlar.
#define TRUE 1
#define FALSE 0
Daha sk kullanlan bir yntemse bunlar bir numaralandrma iinde tanmlayarak oluacak veri tipine yeni bir
isim vermektir.
78
Numaralandrma
// cin,cout,endl
// EXIT_SUCCESS
}
if (equiv.nom != 0)
cout << "Edeer diren: " << equiv.denom
<< " / " << equiv.nom
<< " = " << (float) equiv.denom / equiv.nom << endl;
else
cout << "Hatal ilem." << endl;
return EXIT_SUCCESS;
79
R1 (bittiyse 0): 5
R2 (bittiyse 0): 8
R3 (bittiyse 0): 11
R4 (bittiyse 0): 4
R5 (bittiyse 0): 0
Edeer diren: 440/293 = 1.50171
4.2
Yaplar
Kayt tiplerinin zelliklerinden Blm 1.1.2'de sz edilmiti. C dilinde kaytlara yap ad verilir
ve yle tanmlanrlar:
struct knye {
alan_tanmlar ;
};
Yap tanmnn sonucunda
struct knye
ler tanmlanabilir. Alan tanmlar deiken tanmlarna benzer ekilde yaplr ancak deiken
tanm deildirler. Deiken tanmlarnn bellekte ilgili deiken iin yer ayrlmasna neden olduu grlmt, oysa tip tanm bellekte yer ayrlmasna neden olmaz. Yer ayrlmas ancak
bu yap tipinden bir deiken tanmlandnda gerekleir.
rnekte rasyonel saylar gstermek zere iki alan olan bir yap kullanlmtr: saynn pay
ksmn gsteren
nom
denom.
struct rational_s
adnda bir veri tipi olumutur. Kullanm kolayl asndan bu veri tipine
3
yeni bir isim verilmitir.
typedef komutuyla
typedef
isim kullanlabilir ve deikenin alanlarna ssl ayralar iinde balang deerleri verilebilir.
Aadaki iki komut ayn ii yaparlar, yani
yapsnda olan iki deiken tanmlarlar ve
Tipin tanmlanmas ve yeni isim verilmesi ilemleri istenirse tek komutta birletirilebilir:
rational_s
szc yazlmasa da olurdu. Yine de ounlukla nerilen yntem, belirtilmeleri zorunlu olmasa da knyeleri
yazmaktr. Bu yazl numaralandrmalar iin de geerlidir.
80
Yaplar
equiv
nom
nom
0
denom
denom
equiv.denom
yazlr.
Yaplarn alanlar skalar tiplerden tanmlanabilecei gibi, baka yap tiplerinden ya da tipli
numaralandrma tipinden de tanmlanabilir:
academic_year_t year_2001_2002;
year_2001_2002.end.day = 31;
year_2001_2002.end.month = MAY;
year_2001_2002.end.year = 2002;
Ayn yap tipinden deikenler arasnda atama ilemi yaplabilir. Atama sonucunda kaynak
deikenin btn alan deerleri var deikenin ayn isimli alanlarna atanr. Bu gsterilim
btn alt alanlarn tek tek atanmas zorunluluunu giderir, yani
81
year_2001_2002
academic_year_t
begin
end
day
day
month
month
year
year
equiv.nom = res.nom;
equiv.denom = res.denom;
eklinde atama yapmak yerine yalnzca
equiv = res;
yazlabilir.
Uygulama: Yaplar
rnek 12. Noktann Daireye Gre Konumu
Koordinatlarn kullancdan ald bir noktann, merkez noktasnn koordinatlar ile yarapn
yine kullancdan ald bir dairenin iinde mi, dnda m, zerinde mi olduunu belirleyerek
sonucu ekrana karacak bir program yazlmas isteniyor. Noktann koordinatlar
merkezinin koordinatlar
xc
(x xc )2 + (y yc )2 < r
ve
yc ,
dairenin yarap
(x xc )2 + (y yc )2 = r
daire
(x xc )2 + (y yc )2 > r
x ve y ,
ile gsterilirse:
Merkez noktasnn koordinatlarn (2.1,5.664), yarapn 3.2, aranan noktann koordinatlarn (5.3,5.664) olarak verin. Bu nokta dairenin neresindedir? Program ne kt veriyor?
Hatalysa neden hataldr ve nasl dzeltilebilir?
82
Yaplar
// cout,cin,endl
// EXIT_SUCCESS
83
Merkez koordinatlar ve yaraplar kullancdan alnan iki dairenin kesiip kesimediklerini belirleyen bir program yazn.
Sorular
1. rnek 11'da
equiv
Yaplar
84
Blm 5
Diziler
Bu blmde programlamada ska gereken dizi tiplerinin (bkz. Blm 1.1.3) C dilinde nasl
kullanlaca zerinde durulacaktr.
ad
n, i.
rencinin notu
si ,
ortalama
m,
varyans
v,
standart sapma
sd,
mutlak
ile gsterilirse:
Pn
i=1 si
m =
n
Pn
sd =
m)2
n1
i=1 (si
v =
Pn
ad =
i=1 |si
m|
3. Varyans ve standart sapma iin gereken, her bir notun ortalamayla farklarnn karelerinin
toplamn hesaplamakta kullanlan dng (ikinci eitlikteki
4. Mutlak sapma iin gereken, her bir notun ortalamayla farklarnn mutlak deerlerinin
toplamn hesaplamakta kullanlan dng (drdnc eitlikteki
85
86
// cin,cout,endl
// EXIT_SUCCESS
// fabs,sqrt
87
Diziler
Ka renci var? 5
1. rencinin notu: 65
2. rencinin notu: 82
3. rencinin notu: 45
4. rencinin notu: 93
5. rencinin notu: 71
Ortalama: 71.2
Varyans: 329.2
Standart sapma: 18.1439
Mutlak sapma: 13.04
Burada birinci ve ikinci dngler tek bir dngde birletirilebilir, kullanc notlar girdike bunlar toplama eklenebilir. Ancak nc ve drdnc dngler bu dngye eklenemez, nk o
dnglerde her bir notun ortalamayla farkna gereksinim vardr ve bu ortalama ancak birinci
dng sona erdiinde elde edilmektedir. Dng sayac ayn snr deerleri arasnda deitiinden ve her yinelemede ayn renci notu zerinde ilem yapldndan nc ve drdnc
dngler de kendi aralarnda tek bir dngde birletirilebilirler.
rnek 11'da kullancnn girdii diren deerleri toplama eklendikten hemen sonra yitiriliyorlard. Oysa bu rnekte renci notlarnn birinci dngnn knda unutulmamas gerekir,
nk ikinci dngde de bunlar gerekecektir. Yani bu notlarn bir yerde tutulmas gerekir.
Ayn tipten ok sayda eleman bulunan deikenler iin en uygun yapnn diziler olduu Blm 1.1.3'de grlmt. rneimizde de renci notlar bir dizi olarak temsil edilmektedir.
5.1
ka eleman bulunduunu,
rnekte
int score[MAXSTUDENTS];
komutu, her biri tamsay tipinden
Dier deikenlerde olduu gibi, dizilere de tanm srasnda balang deeri verilebilir. rnein:
88
int score[50] = { 0 };
Derleyicinin dizi iin bellekte ne kadar yer ayrlacan bilmesi gerekir, yani derleme aamasnda dizinin ka elemannn olaca belli olmaldr. Bunun iin iki yntem kullanlabilir:
ak belirtim
rda da rnekleri grlen yntemdir. Boy olarak deimez bir deer vermek zorunludur.
rnekte snftaki renci says
no_students
no_students
no_students
deikeninin de-
int score[no_students];
eklinde bir dizi tanm yaplamaz. Baka bir deyile, dizi boyu iin yazlacak deyimde
yalnzca saylar ve deimezler yer alabilir, deikenler yer alamaz. Bu durumda, dizinin ka eleman olaca batan bilinmiyorsa gerekebilecek en byk eleman says boy
olarak belirtilmelidir. rnekteki
MAXSTUDENTS
belirtilen say, bir yandan gereksiz bellek kullanmna yol aabilir, dier yandan da programn bir kstlamas haline gelir. rnek programn yapt iin aklamasn u ekilde
dzeltmek gerekir:
Bu program, en fazla 100 rencili bir snfta, renci notlarnn ortalamasn,
varyansn ve standart ile mutlak sapmalarn hesaplar.
rtl belirtim
tur, yani
Dizinin bir eleman zerinde ilem yapmak iin o elemann kanc eleman olduunu belirtmek gerekir. Bu belirtim de dizi adnn yannda elemann sra numarasnn keli ayralar
iine yazlmasyla yaplr, yani
89
Diziler
dizi tanmndaki yazmla ayn olmakla birlikte anlam olarak tamamyla farkldr: tanmda keli ayralar iine yazlan say dizinin tutabilecei eleman saysn gsterirken burada kanc
eleman zerinde ilem yapldn gsterir.
C dilinde dizilerin ilk elemannn sra numaras her zaman 0'dr; yani ilk elemann sra numaras
0, ikinci elemann sra numaras 1 olacak ekilde ilerler (ekil 5.2a). Bu durumda n elemanl
bir dizinin son elemannn sra numaras n - 1 olur. Bu zellik nedeniyle
for
eleman ile ilem yaplr. Son ilem de n - 1 sra numaral elemanla yaplr, dng sayac
n deerini aldnda dngden klr. Burada dizinin tanmda belirtilen boyuyla gerekten
kullanlan eleman says arasndaki ayrma dikkat edilmelidir. rnekte tanmda belirtilen boy
MAXSTUDENTS-1
(a)
score
MAXSTUDENTS
(b)
1. Gelinen bellek gz, baka bir deiken iin ayrlm bir blgeye debilir. Bu durumda,
baka bir deikenin deeri istenmeden deitirilmi olur ve programn almas zerinde
beklenmedik etkiler yaratabilir.
2. Eriilmek istenen bellek blgesi kullancnn izni olan blgeler dnda bir yere debilir.
Bu durumda bir bellek hatas oluur.
90
Kullancnn yazd tmceyi tersine evirerek ekrana kartan bir program yazlmas isteniyor.
Programn rnek bir almas ekil 5.3'de verilmitir.
<iostream>
<stdlib.h>
<stdio.h>
<string.h>
//
//
//
//
cin,cout,endl
EXIT_SUCCESS
gets
strlen
rnek program, batan ve sondan ayn srada olan simgelerin yerlerinin takas edilmesi algoritmasn kullanr. Yani ilk simgeyle son simge, ikinci simgeyle sondan bir nceki simge v.b.
takas edilir. Bu algoritmann doru almas iin takasn katarn ortasna kadar srmesi ve
katar ortasn gememesi gerekir. (Neden?)
91
Diziler
5.2
Katarlar
C dilinde katarlar birer simge dizisi olarak deerlendirilir ve sonlarna konan '\0' simgesiyle
sonlandrlrlar. Bu nedenle katar iin bellekte ayrlmas gereken yer, katarn ierdii simge
saysnn bir fazlasdr. rnekteki
char sentence[MAXLENGTH];
tanm, her biri simge tipinden, 80 elemanl,
lardan biri '\0' simgesi iin kullanlacandan kullancnn yazaca tmce en fazla 79 simge
uzunluunda olabilir.
Katar tipinden bir deikenin tanmlanmas srasnda ift trnaklar iinde balang deeri
belirtilebilir. Tanmlanan boyun katar iin gereken yeri ayrmasna dikkat edilmelidir. stenirse
boyut belirtilmeyebilir; bu durumda derleyici gerekli yeri kendisi ayrr. Aadaki iki tanm
ayn ii grrler (ekil 5.4a):
10
11
12
13
14
(a)
sentence
D e n ....... . . . \0
0
11
12
13
14
........
15
79
80
(b)
MAXLENGTH
simgelik yer ayrr ancak yalnzca ilk 15 simgeyi doldurur (ekil 5.4b).
Katarlarn elemanlarna dizilerde olduu gibi teker teker eriilebilir. Dizilerde olduu gibi, ilk
elemann, yani katarn ilk simgesinin sra numaras 0 olacaktr. Son elemann sra numaras da
ayrlan yerin bir eksiidir. Yukardaki rnekte
' ',
sentence[13]
eleman '.',
sentence[14]
92
Katar Kitapl
fonksiyonuyla gerekletirilmitir.
1 Bu komutun yerine
5.3
Katar Kitapl
Katarlar birer dizi olduklarndan katarlar arasnda atama yapmak ya da katarlar karlatrmak iin katar kitaplndaki fonksiyonlarn kullanlmas gerekir. rnek programda, katarn
uzunluunu belirlemek zere bu kitaplktaki
strlen
fonksiyonundan yararlanlmtr.
Katar tipinden iki deikenin birbirine atanmas ya da karlatrlmas ilemleri standart ileler kullanlrsa beklenmedik sonular dourabilir. Baka bir deyile, atama iin
str1 = str2;
ya da karlatrma iin
if (str1 == str2)
gibi yaplar kullanlmaz.
Katarlar zerinde ska kullanlan temel ilemler iin bir katar kitapl tanmlanmtr. Bu
fonksiyonlarn kullanlabilmesi iin programlarn banda
gerekir.
Katar kitaplnn en sk kullanlan fonksiyonlar Tablo 5.1'de verilmitir.
Katar uzunluu fonksiyonu sondaki
'\0'
strlen(computer) 8
1
Gvenlik nedenleriyle
gets
fgets
93
Diziler
Ad
levi
strlen(s)
strcopy(dest,src) strncpy(dest,src,n)
strcmp(s1,s2) strncmp(s1,s2,n)
strcat(dest,src) strncat(dest,src,n)
katar uzunluu
katar kopyalama
katar karlatrma
katar bititirme
Katar kopyalama fonksiyonlar ikinci giri parametresi olan katar, birinci giri parametresi
olan katarn stne yazarlar. Bititirme fonksiyonlarysa ikinci giri parametresi olan katar,
birinci giri parametresi olan katarn ardna eklerler. Her iki fonksiyon grubu da sonu katarnn
sonuna konmas gereken '\0' simgesini kendileri koyarlar.
Katar ilemi yapan fonksiyonlarn bazlarnda uzunluk denetimi yaplr, bazlarnda yaplmaz.
Szgelimi
strcpy
fonksiyonu
src
dest
katarnn deerini
strncpy
Katar karlatrma fonksiyonlar giri parametresi olan katarlar arasnda ngilizce dilinin kurallarna gre szlk sras karlatrmas yaparlar. ki katar eitse 0, birinci katar ikinciden
nce geliyorsa -1, sonra geliyorsa 1 deerini dndrrler.
strcmp(abc, ad)
-1
strcmp(abcd, abc)
strncmp(abcd, abcde, 4)
Kopyalama ve bititirme fonksiyonlarnda dikkat edilmesi gereken bir nokta, hedef katarn
yeterli uzunlukta olmasnn salanmasdr. rnein, aadaki program paras hataya yol
aabilir:
Derleyici
sonra
yeterli yer olmad iin bu deikenin snrlarndan talr. Benzer ekilde, bititirme ilemlerinde de hedef katar iin iki asl katarn toplam uzunluklarn tutmaya yetecek kadar yer
ayrlm olmaldr.
Uzunluk denetimi yapmayan katar fonksiyonlar tampon tarma ad verilen saldrlara yol aan kaynaklar
94
ok Boyutlu Diziler
n.
n(n+1)
adet arpma ve
2
deeri iin
p(x)'in
hesaplanmas
bu say azaltlabilir.
Polinomu u ekilde yeniden yazalm:
O halde bir
gidilirse
olur.
p(4), p(2.5)
ve
p(19)
deerlerini hesaplatn.
5.4
ok Boyutlu Diziler
ok boyutlu bir dizi tanmlanmasnda her boyut ayr bir keli ayra ifti iinde belirtilir.
rnekteki
int left[MAXSIZE][MAXSIZE];
komutu, 30 satrl ve 30 stunlu bir matris tanmlar. Bu matrisin, her biri birer tamsay olan,
30*30=900 eleman olacaktr, yani bellekte 900 tamsay tutacak kadar yer ayrlmasna neden
olur. Daha ok boyutu olan bir dizi tanmlanmak istenseydi boyutlar yanyana srdrlebilirdi:
int m[30][20][7][12];
95
Diziler
// cin,cout,endl
// EXIT_SUCCESS
return EXIT_SUCCESS;
96
ok Boyutlu Diziler
97
Diziler
// cin,cout,endl
// EXIT_SUCCESS
98
Bavurular
int m[2][3] = { { 1, 2, 1 }, { 3, 5, 1 } };
"
tanm
m=
1 2 1
3 5 1
#
matrisini oluturur. Tek boyutlu dizilerdekine benzer ekilde
{ 0 }
balang deeri btn elemanlara 0 balang deerini atar. ok boyutlu dizilerde ilki dnda
btn boyutlarn belirtilmesi zorunludur. Szgelimi bir isim dizisi oluturulmak isteniyorsa
tanmlamas derleyicinin hata vermesine neden olur. Birinci boyut dndakiler belirtilerek
yazlrsa
her bir eleman en fazla 10 simge uzunluunda olabilen 3 elemanl bir katar dizisi tanmlanm
olur. Yani derleyici isim dizisinin eleman saysn sayar ancak belirtilen balang katarlarnn
uzunluklarn hesaplamaya almaz. Yine de belirtilen uzunluktan daha uzun bir balang
katar yazlrsa (diyelim 15 uzunluklu) derleyici bir hata retebilir.
5.5
Bavurular
4 rnekte sol matrisin satr
says ile sa matrisin stun saylarnn ayn olmas zorunluluu nedeniyle bu bilgiyi tek bir
rr
deikeninin
cl
durumda
drlebilirdi. Bu yaklamda, iki deiken birbirinden ayrlm olaca iin birindeki deiiklik
dierini etkilemezdi, ancak programda boyut deikenleri zerinde bir deiiklik olmad iin
bir sorun kmazd. Tek fark, gereksiz yere ikinci bir deiken tanmlanm olmas olurdu.
99
Diziler
Uygulama: Matrisler
1.
a matrisi baz dnmlerle bir gen matris haline getirilir. Bunun iin nce sistemin
i1
i = 2, 3, . . . , n. denklemlerinden x1 yok edilir (birinci denklem aa11
ile arplp i. denklemden karlr). Benzer ekilde, i = 3, 4, . . . , n. denklemlerden x2 yok edilerek devam edilir.
Birinci denklemin birinci eleman olan a11 'e pivot ad verilir ve x1 yok edilip ikinci denkleme geildiinde a22 eleman pivot olur. Yntemin alabilmesi iin btn pivotlarn
sfrdan farkl olmas gerektii aktr.
2.
xn
n. denklemden dorudan hesaplanr. Bu deer n 1. denklemde yerine koxn1 bulunur ve bylece geriye doru yerine koyma ilemleriyle btn bilinmeyen
deeri
nursa
deerler hesaplanabilir.
x1 + x2 = 3.5
x1 x2 + 5x3 = 11
2x1 x2 + x3 = 3.3
a
matrisi ve
balangta:
1 1 0
3.5
a = 1 1 5 b = 11
2 1 1
3.3
x1 'in
x2 'nin
Son denklemden
7.5
1 1 0
3.5
a = 0 2 5 b = 7.5
0 3 1
3.7
1 1
0
3.5
5 b = 7.5
a = 0 2
0 0 6.5
14.95
denkleminden
minden
x1 = 1.5
bulunur.
100
Bavurular
// cin,cout,endl
// EXIT_SUCCESS
return EXIT_SUCCESS;
101
Diziler
Sorular
1. Kullancnn girdii bir tmcedeki szck saysn sayan bir program yazn. Szcklerin nnde ve arkasnda boluk olduu varsaylacaktr. Ancak szck arasnda istendii
sayda boluk olabilecei gibi tmcenin banda ve sonunda da istendii kadar boluk olabilir. rnek olarak kullanc
the
world
is not
enough
tm-
Bavurular
102
Blm 6
Fonksiyonlar
u ana kadar yaplan rneklerde btn ilemler tek bir fonksiyonda (main fonksiyonu) gerekletiriliyordu. Gereken yerlerde kitaplk fonksiyonlarndan yararlanlmakla birlikte, kendi
yazdmz kod tek bir fonksiyonla snrlyd. Oysa blok yapl programlamada soyutlama kavramnn neminden Blm 1.4'de sz edilmi, ileri alt-ilere, alt-ileri alt-alt-ilere blerek
yazlan programlarn hem gelitirme hem de bakm aamalarnda salayaca kolaylklar grlmt. Bu blmde de programcnn kendi fonksiyonlarn nasl yazacan inceleyeceiz.
C dilinde her i ya da alt-i bir fonksiyon tarafndan gereklenir. Fonksiyonlar yapacaklar ii
belirleyen giri parametreleri alrlar ve ilemin sonucuna gre bir k parametresi retirler.
Yani giri parametrelerinin says birden fazla olabilir ancak k parametresi en fazla bir
tanedir. imdiye kadar kullanlan kitaplk fonksiyonlarnn bazlarna parametreleri asndan
bakarsak:
sqrt:
Kesirli say tipinden bir giri parametresi alr, kesirli say tipinden bir k para-
metresi retir.
pow:
kisi de kesirli say tipinden iki giri parametresi alr, kesirli say tipinden bir k
parametresi retir.
strlen:
Katar tipinden bir giri parametresi alr, tamsay tipinden bir k parametresi
retir.
rand:
srand:
aretsiz tamsay tipinden bir giri parametresi alr, k parametresi retmez.
Bir fonksiyonun bir alt-iini yaptrmak zere baka bir fonksiyonu kullanmasna fonksiyon
ars ad verilir. rnek 7'da,
main
fonksiyonu,
for
rand
fonksiyo-
main
fonksiyonu aran,
rand
fonksiyonuysa arlan
fonksiyondur. Fonksiyon arsnn sona ermesinden sonra aran fonksiyonda ak bir sonraki
komutla devam eder.
aran fonksiyon arlan fonksiyona giri parametrelerini gnderir, arlan fonksiyonsa rettii sonucu aran fonksiyona dndrr. Dndrlen deer aran fonksiyonda bir deikene
103
104
atanabilecei ya da bir deyimde kullanlabilecei gibi, dorudan baka bir fonksiyona giri
parametresi olarak da gnderilebilir.
1 rnekte
time
srand
number = rand();
number = rand() % 6;
srand(time(NULL));
// dorudan atama
// deyimde kullanma
// baka fonksiyona gnderme
number
rand
fonksi-
rnein
pow
fonksiyonu iki tane kesirli say bekliyorsa bu fonksiyona iki tane kesirli say
(ya da tamsay) deeri yollanmaldr. Bir, ya da daha fazla deer yollanmas, hi deer
yollanmamas, yollanan iki deerin say dnda bir tipten (szgelimi katar) olmas hataya yol
aar.
Kullancnn girdii bir saynn asal arpanlarn ekrana dken bir program yazlmas isteniyor. Gerekli algoritmann ak izenei ekil 1.18'de, rnek bir almasnn ekran kts
ekil 6.1'de verilmitir. Programda bir saynn asal olup olmadnn snanmasna ve asal saylarn bulunmasna gerek duyulacaktr. Soyutlama ilkesine gre bu ilemler fonksiyonlarla
gerekletirilecek, ana fonksiyon, asal saylar bulan fonksiyondan srayla ald asal saylarn
kullancnn verdii sayy blp blmediklerini snayacaktr. rnekte
is_prime
fonksiyonu
kendisine gnderilen bir saynn asal olup olmadn belirleyerek geriye asalsa doru, deilse
yanl mantksal deerini yollar.
byk olan ilk asal sayy bularak kendisini aran fonksiyona dndrr.
1
2
105
Fonksiyonlar
// cin,cout,endl
// EXIT_SUCCESS
if (cand == 2)
return true;
if (cand % 2 == 0)
return false;
for (count = 3; count * count <= cand; count += 2) {
if (cand % count == 0)
return false;
}
return true;
while (!is_prime(cand))
cand += 2;
return cand;
106
6.1
next_prime
next_prime
veri_tipi deiken_ad
iftleri
void
sakl szcyle belirtilir. Benzer ekilde, giri parametresi almayan fonksiyonlarn giri
listesi parametresine de
void
mz baz kitaplk fonksiyonlarnn sistemde yle bildirilmi olmalar gerektii grlebilir:
107
Fonksiyonlar
Fonksiyonun gvdesi, fonksiyonun yapaca ileri belirten bloktan oluur, yani fonksiyonun iini NASIL yaptn anlatr. Bir fonksiyonun btnnn, yani giri/k parametrelerinin yansra gvdesinin de belirtildii yere fonksiyonun tanm denir. rnekte
next_prime fonksiyonunu,
next_prime fonksiyonu da is_prime fonksiyonunu arr. Birinci ar, next_prime fonksiyonunun bildirimi main fonksiyonunun tanm balamadan yapldndan baarl olur. kinci arysa is_prime fonksiyonu next_prime fonksiyonundan nce tanmlandndan baarl olur.
Ancak rnein main fonksiyonu is_prime fonksiyonunu aramaz nk ncesinde is_prime
ran fonksiyondan nce yaplmaldr. rnekte
main
fonksiyonu
6.2
Parametre Aktarm
Giri parametrelerinin aktarmnda fonksiyon arsnda belirtilen parametre listesiyle fonksiyonun balnda belirtilen liste uyumlu olmaldr. arda yazlan her deer, arlan fonksiyonun balnda ayn srada yazlm deikene atanr. Bu parametre aktarm yntemine
deer aktarm ad verilir. rnekteki birinci fonksiyon arsnda:
factor = next_prime(factor);
main fonksiyonundaki factor deikeninin deeri next_prime fonksiyonunun giri parametresi
olan prime deikenine atanr. Dnte de next_prime fonksiyonunun return komutuyla geri
yollad cand deikeninin deeri main fonksiyonundaki factor deikenine atanr. Fonksiyonun bir dng iinde arld gznne alnarak, parametre olarak ilk arda 2 deerinin
gnderilecei ve 3 deerinin dnecei, ikinci arda 3 deerinin gnderilecei ve 5 deerinin
dnecei, ileriki arlarda 5, 7, 11, ... deerlerinin gnderilecei grlebilir. Benzer ekilde,
ikinci fonksiyon arsnda
deikeninin deeri
is_prime
Tipi uygun olduu srece parametre olarak herhangi bir deyim belirtilebilir. Szgelimi aadaki arlar geerlidir:
108
Yerel Deikenler
number
main
6468
factor
2
prime
cand
cand
count
next_prime
is_prime
is_prime(13)
is_prime(cand + 1)
Benzer ekilde, geri dndrlecek deer iin uyumlu tipten deer reten bir deyim yazlabilir:
return cand + 2;
6.3
Yerel Deikenler
factor
deikeni ile
next_prime
fonksiyonundaki
prime
main
fonksiyonun-
bellekte farkl yerlerde bulunurlar; dolaysyla, birinde yaplan deiiklik dierini etkilemez.
Deiken adlarnn ayn olmasnn da bir nemi yoktur:
deikeniyle
is_prime
fonksiyonundaki
cand
next_prime
fonksiyonundaki
cand
main fonksiyonunda factor deikenine banext_prime fonksiyonunun prime adl giri parametre deikenine aktarlr (ekil 6.2). next_prime fonksiyonunda cand deikeni 3 deerini alr ve bu
deer asal olup olunmadnn belirlenmesi iin is_prime fonksiyonunun cand adl giri parametre deikenine aktarlr (ekil 6.3). is_prime fonksiyonunda count deikeni 3 deerini alr
ancak dng koulu batan salanmadndan dngden klarak next_prime fonksiyonuna
true deeri dndrlr (ekil 6.4). Bu deer !is_prime(cand) koul deyiminin yanl sonucunu retmesine neden olduundan dngden klr ve main fonksiyonuna cand deikeninin
o anki deeri, yani 3 dndrlr. Bu deer de main fonksiyonundaki factor deikenine atanr
(ekil 6.5)
Fonksiyonun parametre olarak ald ya da fonksiyon gvdesinde tanmlanan deikenlere o
fonksiyonun yerel deikenleri ad verilir ve bunlarn tanm blgesi tanmlandklar fonksiyonla
109
Fonksiyonlar
number
main
factor
6468
prime
next_prime
cand
cand
count
is_prime
number
main
factor
6468
prime
next_prime
cand
cand
count
!is_prime(cand)
true
is_prime
number
main
6468
prime
next_prime
is_prime
factor
2
cand
cand
count
110
Genel Deikenler
ve
cand)
number
ve
tanmlad deikenler de geersiz hale gelir. Baka bir deyile, deikenlere tanm blgeleri
dnda eriilemez. Yani szgelimi
kullanamaz.
6.4
Genel Deikenler
Baz durumlarda birden fazla fonksiyonun ayn deikeni kullanabilmeleri istenir. Bu tip deikenlere genel deiken ad verilir ve tanm blgeleri btn fonksiyonlar olarak belirlenir.
Genel deikenler btn fonksiyonlarn tanmlarndan nce tanmlanrlar.
DKKAT
Genel deikenlere rnek vermek iin programda baz deiiklikler yaplabilir. BU DEKLKLERN SONUCUNDA OLUACAK PROGRAM Y BR PROGRAM OLMAYACAKTIR. BU RNEK YALNIZCA GENEL DEKEN KULLANIMINI AIKLAMAK AMA-
CIYLA VERLMTR.
metre olarak aktarmak yerine ortak bir bellek gznde paylaabilirler. Bu durumda
fonksiyonunun ilevi
fonksiyonunun ileviyse bu deikenin deerini kendisinden byk ilk asal sayya ilerletmek
olarak dnlebilir. Benzer ekilde, ana fonksiyon da arpan aday olan sayy parametre aktarmyla almak yerine ayn genel deikende erierek renebilir. Deiiklikler sonucu oluan
program rnek 19'de verilmitir.
Bir fonksiyon bir genel deikenle ayn isimde bir yerel deiken tanmlarsa o fonksiyonun
almas boyunca yerel deiken genel deikeni ezer. Diyelim
is_prime
fonksiyonu
cand
deikeni oluurdu ve
is_prime
cand
cand
deikenine ulalamazd.
Genel deikenler parametre aktarm yerine kullanlabilecek bir yntem olmakla birlikte programn anlalrln azalttklar ve fonksiyonlar birbirlerine baml kldklar iin gerekmedike kullanlmamalar nerilir. Soyutlamann kazandrdklarndan birinin ileride bir fonksiyonda deiiklik yapld zaman bunu aran fonksiyonlarn deiiklikten etkilenmemesi
olduu sylenmiti; oysa fonksiyonlarn deiken paylarlarsa bir fonksiyonda yaplan deiiklikler dier fonksiyonlar etkileyebilir.
6.5
Bavuru Aktarm
Deer aktarm yntemiyle parametre aktarlmas baz ilemlerde yeterli olmaz. Szgelimi,
kendisine giri parametresi olarak gnderilen iki tamsay deikenin deerlerini takas eden bir
fonksiyonun rnek 20'daki gibi yazldn dnelim.
Bu program altrldnda ekran kts u ekilde olur:
111
Fonksiyonlar
rnek 19 Genel deiken kullanarak bir sayy asal arpanlarna ayran program.
#include <iostream>
#include <stdlib.h>
// cin,cout,endl
// EXIT_SUCCESS
bool is_prime(void)
{
int count;
if (cand == 2)
return true;
if (cand % 2 == 0)
return false;
for (count = 3; count * count <= cand; count += 2) {
if (cand % count == 0)
return false;
}
return true;
void next_prime(void)
{
cand = (cand == 2) ? 3 : cand + 2;
while (!is_prime())
cand += 2;
}
112
Bavuru Aktarm
// cin,cout,endl
// EXIT_SUCCESS
tmp = x;
x = y;
y = tmp;
int main(void)
{
int m = 32, n = 154;
113
Fonksiyonlar
x
swap
y
32
m
main
tmp
154
xxx
n
32
154
(a)
x
swap
y
154
m
main
tmp
32
xxx
n
32
154
(b)
32 154
32 154
main fonksiyonundaki m deikeninin
deeri swap fonksiyonundaki x deikenine, n deikeninin deeri de y deikenine aktarlr (ekil 6.6a). swap fonksiyonunda x ve y deikenlerinin deerleri takas edilir ancak aran fonksiyondaki m ve n deikenleri bu takastan etkilenmezler ve fonksiyon arsndan dnldnde
Programn neden istendii gibi almadn inceleyelim:
&
Cnm =
m!
n!(mn)! deerinin hesaplanmas istenmektedir.
swap
fonksiyonunun balk
114
Bavuru Aktarm
// cout,cin
// EXIT_SUCCESS
f1 = fact(a);
f2 = fact(b);
f3 = fact(a - b);
return f1 / (f2 * f3);
int fact(int x)
{
int fx = 1;
int i;
115
Fonksiyonlar
// cout,cin
// EXIT_SUCCESS
116
Blm 1.4'de anlatlan algoritmalar kullanarak iki saynn en byk ortak blenini hesaplayan
bir program yazlmas isteniyor. Bunun iin rnek 18'de bir sayy asal arpanlarna ayran
programn benzeri bir fonksiyon (factorize) olarak yazlacak ve bu fonksiyon kendisine parametre olarak gnderilen saynn asal arpanlarn bir dizide oluturacaktr. Fonksiyon yine
ayn rnekte yazlm olan
next_prime
ve
is_prime
dan kullanacaktr. Asal arpan dizilerinden en byk ortak blenin asal arpanlarn bulmak
zere
gcd_factors
int main(void)
{
int number1, number2;
factor_t factors1[MAXFACTOR], factors2[MAXFACTOR], factors3[MAXFACTOR];
int n1, n2, n3;
long int gcd = 1L;
int i;
cout << "Saylar yaznz: ";
cin >> number1 >> number2;
factorize(number1, factors1, n1);
factorize(number2, factors2, n2);
gcd_factors(factors1, n1, factors2, n2,
for (i = 0; i < n3; i++)
gcd = gcd * (long int) pow((double)
(double)
cout << "En byk ortak blen: " << gcd
return EXIT_SUCCESS;
6.6
factors3, n3);
factors3[i].base,
factors3[i].power);
<< endl;
factorize
larna ayrlacak say, k parametresinin de arpanlar dizisi olmas gerektii grlmt.
Burada iki sorunla karlalr:
117
Fonksiyonlar
Birden fazla deerin dndrlmesi gerektii durumlarda bu deerler giri parametrelerinde deiiklik yapma yntemiyle ana fonksiyona aktarlabilir. Buna gre,
factorize
fonksiyonunun
Birinci giri parametresi olarak gnderilen saynn arpanlarn ikinci giri parametresi olan dizide oluturur ve bu dizinin ka eleman olduunu nc giri
parametresine yazar. Geriye bir deer dndrmez.
6.7
Bir giri parametresinin dizi tipinden olduunun belirtilmesi iin fonksiyon balnda deiken
adnn ardna boyut belirtmeden keli ayralar konur. Dizi deikenlerinin giri parametresi
olarak aktarmlarnda en nemli zellik, aksi belirtilmedike dizi elemanlarnn deitirilebilir
olmalardr. Yani dizi elemanlar deitirilmek isteniyorsa dizi deikeninin ad olduu gibi
yazlr, bavuru aktarm kullanlmaz (deiken adnn bana
&
iareti konmaz).
3 Aksine, dizi
elemanlarnn deer deitirmemesi isteniyorsa nlem almak gerekir. Bu amala giri parametresi tanm
const
factors1
dizisi ve
n1
factorize
gcd_factors
rnek 24
118
ki saynn en byk ortak blenini bulan program (asal arpanlara ayrma fonk-
siyonu).
n = 0;
while (x > 1) {
if (x % factor == 0) {
factors[n].base = factor;
factors[n].power = 0;
while (x % factor == 0) {
factors[n].power++;
x = x / factor;
}
n++;
}
factor = next_prime(factor);
}
Bu fonksiyonda ilk drt parametre gerek anlamda giri parametresiyken son iki parametre
aslnda kt parametresi olup kstlamalar nedeniyle giri parametresi olarak gnderilen deerlerdir Yani ilk drt parametre deimeyecek, son iki parametre deiecektir. Buna gre
gcd_factors
programcnn aslnda deimemesi gereken bir deeri yanllkla deitirmesine engel olmak
iin konmutur. Fonksiyonun tanm rnek 25'de verilmitir.
119
Fonksiyonlar
rnek 25
ki saynn en byk ortak blenini bulan program (ortak arpanlar bulma fonk-
siyonu).
n = 0;
while ((i1 < n1) && (i2 < n2)) {
// iki dizi de bitmedi
if (factors1[i1].base < factors2[i2].base)
i1++;
else if (factors1[i1].base > factors2[i2].base)
i2++;
else {
factors[n].base = factors1[i1].base;
if (factors1[i1].power < factors2[i2].power)
factors[n].power = factors1[i1].power;
else
factors[n].power = factors2[i2].power;
i1++;
i2++;
n++;
}
}
120
dersek
f (xi ) + (x xi )f 0 (xi ) = 0
ekline getirilebilir ve buradan da
x = xi
yazlabilir. Bu formlde
yerine
xi+1
f (xi )
f 0 (xi )
deeri formldeki
xi
deerinin yerine
deeri hesaplanr.
eklinde
n.
xi+1 = xi
p(xi )
p0 (xi )
olacaktr. Bir polinomun hesaplanmasnn iie arpma ve toplama yntemiyle nasl hzlandrlaca rnek 15'de grlmt. O rnekteki
bdeerleri
bn = an
bn1 = bn xi + an1
b0 = b1 xi + a0
Bu durumda,
p0 (x)
cn = bn
cn1 = cn xi + bn1
c1 = c2 xi + b1
Bu yntemi kullanarak katsaylarn kullancnn girdii bir polinomun kklerini hesaplayan
program rnek 26'de verilmitir.
121
Fonksiyonlar
// cin,cout,endl
// EXIT_SUCCESS
// fabs
122
E simli Fonksiyonlar
Bu program kullanarak
x0 = 1
deerinden balayarak,
0.001
ekilde bulun.
6.8
E simli Fonksiyonlar
C++ dilinde giri parametre listeleri farkl olduu srece birden fazla fonksiyonun isimlerinin
ayn olmas bir sorun yaratmaz.
swap_int, iki
kesirli sayy takas edecek fonksiyona swap_float, iki katar takas edecek fonksiyona swap_str
isimlerin ayn olmasna izin verilmese iki tamsayy takas edecek fonksiyona
gibi isimler vermek gerekir. Oysa giri parametreleri farkl tiplerden olduu iin fonksiyona
da
swap
ad verilebilir:
tmp = x;
x = y;
y = tmp;
tmp = x;
x = y;
y = tmp;
}
4
strcpy(tmp, s1);
strcpy(s1, s2);
strcpy(s2, tmp);
123
Fonksiyonlar
6.9
Varsaylan Parametreler
}
rnekte
start
arlrken belirtilmezse 0 deerini, belirtilirse verilen deeri alr. lk iki parametrenin arda
belirtilmesi zorunludur; yani fonksiyon iki ya da parametreyle arlabilir:
// 1
// 13
Sorular
1. Kendisine parametre olarak gnderilen bir katarda, yine kendisine parametre olarak
gnderilen bir simgenin ilk ve son pozisyonlar arasnda ka simge olduunu bularak
sonucu dndren bir fonksiyon yazn. Szgelimi, giri katar
124
Varsaylan Parametreler
'o'
is not en).
2. Bir katardaki bir simgenin yerine -o simgenin bulunduu her noktada- baka bir simge
geirilmek isteniyor. rnein 2002-04-10 katarnda '-' simgesi yerine '/' simgesi konacaksa 2002/04/10 katar elde edilecektir.
(a) Bu ilemi gerekletiren bir fonksiyon yazn.
(b) Verilen rnek tarih zerinde bu ilemi gerekletirmek zere (a) kknda yazdnz
fonksiyonu kullanan bir ana fonksiyon yazn.
3. ki tamsay dizisindeki ortak elemanlarn says bulunmak isteniyor. rnein birinci dizi
21 10 9 13 15, ikinci dizi 10 7 1 13 15 8 ise ortak elemanlarn says 3'tr (10, 13,
15). rnekten de grlebilecei gibi, dizilerin ayn sayda elemanlar bulunmas zorunlu
deildir. Bunun iin:
(a) Bir saynn bir dizide bulunup bulunmadn snayan bir fonksiyon yazn. Fonksiyonun giri parametreleri dizi, dizinin boyu ve aranan say olmaldr. Geriye say
dizide varsa 1, yoksa 0 deeri dndrlmelidir.
(b) Yukarda yazdnz fonksiyonu kullanarak, iki dizideki ortak elemanlarn saysn
belirleyen bir fonksiyon yazn. Fonksiyonun giri parametreleri her iki dizinin kendileri ve boylar olmaldr. Fonksiyon geriye ortak elemanlarn saysn dndrmelidir.
(c) Yukarda yazdnz fonksiyonlar kullanarak, boyunu ve elemanlarn kullancdan
ald iki dizinin ortak eleman saysn bularak ekrana kartan bir ana fonksiyon
(main) yazn.
4. Bir dizinin kipi, dizide en ok yinelenen elemandr. Szgelimi
75 32 45 43 75 66 43 88 66 92 66 27
dizisinin kipi 66'dr. Buna gre, bir snavdaki renci notlarnn kipi bulunmak isteniyor.
(a) Bir dizinin en byk elemannn dizideki srasn dndren bir fonksiyon yazn.
(b) Yukarda yazdnz fonksiyonu kullanarak bir dizinin kipini dndren bir fonksiyon yazn. (Yol gsterme: Elemanlar ilgili notun ka kere getiini gsteren 101
elemanl bir tamsay dizisi kullann. rnein
gstersin.)
(c) Yukarda yazdnz fonksiyonlar kullanarak, renci saysn ve notlarn kullancdan alarak notlarn kipini bulan ve ekrana kartan bir ana fonksiyon (main)
yazn.
5. Polar sistemde dzlemde bir nokta kutuptan olan uzakln belirten
yapt
ise
sistemdeki
r ve kutup eksenine
koordinatlar x ve y
(a) Noktann polar ve kartezyen koordinatlarn temsil etmek zere birer kayt tanm
yazn.
125
Fonksiyonlar
(b) Yukarda yazdnz kayt tanmlarn kullanarak, parametre olarak bir noktann polar koordinatlarn alan ve geriye kartezyen koordinatlarn dndren bir fonksiyon
yazn.
(c) Kayt yaplar kullanmadan polar koordinatlar kartezyen koordinatlara evirecek
bir fonksiyon yazn.
(d) (b) ve (c) klarnda yazdnz fonksiyonlarn kullanmlarna birer rnek verin.
Varsaylan Parametreler
126
Blm 7
aretiler
u ana kadar yaplan rneklerde skalar, bileke ya da vektrel tipten olsun, btn deikenlerin
bellekte kaplayacaklar alan batan belliydi. Szgelimi, 100 elemanl bir tamsay dizisi tanmlanrsa bu diziye bellekte 100 adet tamsayy tutacak kadar yer ayrlaca derleme aamasnda
biliniyordu. Bu tip deikenlere statik deiken ad verilir. Statik bir deikenin saklanaca
bellek alan program almaya baladnda ayrlr ve programn sonuna kadar braklmaz. Bu
durumun baz sakncalar vardr:
Statik dizilerde grld gibi (bkz. Blm 5), dizinin eleman says derleme aamasnda
belli deilse gerekebilecek en byk miktarda yer ayrlmak zorunda kalnr. rnein, deiik snardaki rencilerin notlarn tutmak zere bir tamsay dizisi tanmlanacak
olsun. Bu durumda bir snftaki maksimum renci says konusunda bir varsaym yapp
(diyelim 100) dizi bu boyutta almaldr. Verilen bu boyut hem programn bir snrlamas olacak, hem de renci says bunun altnda kald zamanlarda gereksiz bellek
harcanmasna yol aacaktr.
Programnzda kullanmak istediiniz deikenlerin kaplayaca toplam bellek alan altnz bilgisayarda bulunmayabilir. Dier yandan, bu deikenlerin hepsine birden ayn
anda gereksinim duymuyor olabilirsiniz, yani bir deiken iin ayrlan yerin programn
btn ileyii boyunca tutulmas gerekli olmayabilir. Szgelimi bir dizi belli bir noktada
kullanlmaya balyor ve bir noktadan sonra da kullanlmyor olabilir. Byle bir durumda
diziye gerekli olduu zaman yer ayrmak, ii bittikten sonra da ayrlan yeri geri vermek
programn toplam bellek gereksinimlerini azaltr.
aretiler, bellekte kaplanacak yerin derleme srasnda deil alma srasnda belirlenmesini
salarlar. Bylelikle gerektii zaman gerektii kadar yer almak ve gerek kalmad zaman
da geri vermek olanakl hale gelir. Bir ekilde kullanlan deikenlere dinamik deiken ad
verilir. Dinamik deikenlerin zorluu, bellek alanlarnn ynetimi programcya brakldndan
programlarn en sk hata yaplan blmleri olmalardr.
areti, bir bellek gzne iaret eden bir deikendir. Bunun anlam, iareti deikeninin
o bellek gznn adresini tutmasdr. Baka bir deyile, iareti deikeninin deeri, bellek
gznn adresidir. Dolaysyla, bir iareti iin iki deerden sz edilebilir:
127
128
ekil 7.1a'da iareti deikeniyle iaret edilen bellek gz arasndaki iliki simgesel olarak
gsterilmitir. Burada
deikeni, iinde
422
kil 7.1b, ayn durumun rnek adres deerleriyle nasl salandn gsterir.
zl olduu bellek gznn adresinin
8000
olduu varsaymyla,
8000
422
deikeninin
deerinin ya-
8000
deerini
lendirmez, bunlar iletim sistemi belirler. Programc adres deerlerinin ne olaca konusunda
bir varsaymda bulunamaz.
p
p
422
422
8000
12000
8000
(a)
(b)
deyiminin deeri
8000, *p
deyiminin deeriyse
422'dir.
iaretinin kendisiyle mi, yoksa iaret ettii alanla m ilem yapldna dikkat edilmelidir.
p++
rnein
komutu
422
&
&p:
p:
&p
12000
8000
*p:
422
NULL
retinin geerli bir bellek gzne iaret etmiyor olduudur. Dolaysyla, deeri
iareti deikeninin
NULL
olan bir
ama alma annda bellek hatasna yol aacak bir programlama hatasdr.
129
aretiler
score
NULL
namik diziler kullanlmasdr. Bylece snftaki renci says kullancdan renildikten sonra,
tam gerektii kadar eleman tutacak bir dizi tanmlanabilmitir.
7.1
aretiler, deerleri birer adres (bir tr tamsay) olan deikenlerdir, dier deiken tiplerinden
bir farklar yoktur. Dolaysyla, dier deikenlerde olduu gibi, iareti tipinden bir deiken
tanmlandnda bellekte bir adres tutmaya yetecek kadar yer ayrlr. aretinin kendi deeri
her zaman bir adrestir ama iaret ettii bellek gznn nasl yorumlayacann belirtilmesi
gerekir. Bu nedenle, iareti tanm u ekilde yazlr:
veri_tipi * deiken_ad ;
Bu tanmn anlam, ad verilen deikenin bir iareti olduu ve gsterdii bellek gznde belirtilen tipten bir deer bulunacadr. Buradaki
ierii anlamna gelen
score
7.2
NULL
atanr.
Bellek Ynetimi
Programda kullanlacak her trl bellek blgesinin kullanlaca i iin ayrlmas gerektii
grlmt. Yani iaretinin iaret edecei bellek alannn da ayrlmas gerekir. Ayrlacak bu
alan tek bir eleman boyunda olabilecei gibi, birden fazla elemandan oluan bir dizi olarak da
kullanlabilir. Dinamik dizi kullanrken iareti tanmnda belirtilen veri tipi dizinin her bir
elemannn tipi olarak dnlebilir.
Yer ayrma ilemini gerekletiren
new
oluan bir bellek alann ayrarak balang adresini verir. Yer alma giriimi baarszlkla
sonulanrsa, rnein bellekte yer kalmadysa, geriye NULL deerini dndrr. Yazm u
ekildedir:
130
Bellek Ynetimi
// cin,cout,endl
// EXIT_SUCCESS
// fabs,sqrt
131
aretiler
score
no_students*sizeof(int)
6500
6500
score
no_students * sizeof(int)
kadar-
Tek bir elemanlk blge ayrlacaksa eleman saysnn belirtilmesine gerek yoktur. rnein,
ekil 7.1'de izilen durum u komutlarla yaratlabilir:
int *p = NULL;
p = new int;
*p = 422;
blgeyi geri verir; blgenin bir ksmn geri vermek gibi bir seenek yoktur. Bu nedenle, ilece
yalnzca iaretinin adn vermek yeterlidir, geri verilecek eleman says yeniden belirtilmez.
Yukarda yazlan her iki (birden fazla eleman ya da bir eleman) yer ayrma ileminin de geri
vermesi benzer ekildedir:
delete score;
delete p;
areti tipinden deikenler iin her zaman yer ayrlmas zorunluluu yoktur. Zorunlu olan DKKAT
nokta, iaretilerin her zaman geerli bellek gzlerine iaret etmeleridir. Bu bellek gzleri
rneklerde olduu gibi dinamik olarak ayrlm olabilecekleri gibi, baka bir iareti deikeni
tarafndan ayrlm ve hatta statik olarak tanmlanm bile olabilirler. rnein ekil 7.1'de
izilen durum u komutlarla da yaratlabilirdi:
int x = 422;
int *p = &x;
Bu durumda 422 deerini tutan bellek gzne programn banda statik olarak yer ayrlr;
iaretisi ise bu bellek gznn adresini tar. nemli olan
ile
*p
delete
132
fonksiyonu
new
aklanabilir:
1.
new
malloc
malloc
fonksiyonu geriye
void *
7.3
Statik diziler ile dinamik diziler arasndaki tek fark oluturulmalarndadr, elemanlara eriim
her ikisinde de ayndr. Yani u iki tanm arasnda, bellekte oluan durum asndan bir fark
yoktur:
int p[10];
...
for (i = 0; i < 10; i++)
...p[i]...
...
int *p;
p = new int[10];
...
for (i = 0; i < 10; i++)
...p[i]...
...
delete p;
Statik dizilerle dinamik dizilerin ayn ekilde kullanlabilmeleri iki zellie dayanr:
p[0]
p[1]
p[n]
*p
*(p + 1)
*(p + n)
133
aretiler
Katarlar da birer dizi olduklarndan katarlar arasndaki atama ve karlatrma gibi ilemlerin neden beklendii gibi almayacaklarna tekrar dnelim. ekil 7.4'deki yapda
str2
== str2),
str1
ile
(32006=9450).
str1
3200
"Dennis Ritchie"
3200
str2
9450
"Dennis Ritchie"
9450
str1 = str2
atamas
str1
iaretisinin
str2
iaretisiyle ayn
deeri almas sonucunu dourur (ekil 7.5). Bu durum ayn katarn iki farkl kopyasnn olumasn salamad gibi
str1
7.4
"Dennis Ritchie"
3200
str2
9450
"Ken Thompson"
9450
(b)
134
<iostream>
<stdlib.h>
<stdio.h>
<string.h>
//
//
//
//
cin,cout,endl
EXIT_SUCCESS
gets
strcat
".",
"..-.", "--.",
".-..", "--", "-.",
"...", "-",
"..-",
"--.." };
morse[0] = '\0';
for (i = 0; s[i] != '\0'; i++) {
strcat(morse, encoding[s[i] - 'a']);
strcat(morse, " ");
}
return morse;
135
aretiler
encode
fonksiyonu
morse
return
tanmlandnda bu bir yerel deiken olacandan fonksiyonun sona ermesiyle onun iin ayrlm olan bellek geri verilir ve sonu ana fonksiyona aktarlamaz.
7.5
Statik Deikenler
rnekte
encode
fonksiyonunda tanmlanan
encoding
nidir, yani fonksiyonun her yaratlnda bu dizi yeniden yaratlr, elemanlarna deerler verilir
ve fonksiyonun sona ermesiyle yok edilir. Bu ilemin her defasnda tekrar tekrar yaplmas
istenmiyorsa,
encoding
136
Adres Aktarm
encoding dizisi genel bir deiken gibi srekli yaar ama encode fonksiyonu
dnda kullanlamaz.
7.6
Adres Aktarm
Bavuru aktarm yntemi C++ dilinde gelmi olduundan C dilinde bunun yerine adres aktarm yntemi kullanlr, yani arlan fonksiyona deikenin adresi yollanr. arlan fonksiyon
bu adresi iareti tipinden bir deikene alr ve bu iaretinin gsterdii yerde deiiklii yapar.
Bylece deiiklik aran fonksiyondaki deikeni dorudan etkiler. Buna gre, rnek 20'da
anlatlan ve dzeltilen
swap
// cin,cout,endl
// EXIT_SUCCESS
tmp = *x;
*x = *y;
*y = tmp;
int main(void)
{
int m = 32, n = 154;
Bu rnekte
deikeni tamsayya iareti (yani adres) tipinden bir deiken olurdu ve deeri
deikenine
137
aretiler
x
swap
2000
m
main
tmp
2004
xxx
n
32
2000
154
2004
(a)
x
swap
y
2000
m
main
tmp
2004
xxx
n
154
2000
32
2004
(b)
Uygulama: aretiler
rnek 30. Seerek Sralama
Kullancdan ald say kadar rencisi olan bir snfta kullancnn girdii renci notlarnn
ortadeerini bulan bir program yazlmas isteniyor. Bir dizinin ortadeeri, dizi sralandnda
dizinin ortasnda yer alan deerdir. ift sayda eleman olan dizilerde dizinin ortasnda bir
eleman olmadndan ortadaki iki elemann aritmetik ortalamas ortadeer kabul edilir.
Dizinin ortadeerini bulmak iin ncelikle diziyi sralamak gerekir. rnekte kullanlan seerek sralama yntemi, en basit sralama algoritmalarndan biridir. Bu yntemde, kkten
bye doru sralama yaplaca varsaymyla, bu algoritmann her admnda dizinin en byk eleman bulunur ve sondaki elemanla yeri karlkl deitirilir. Bylece en byk eleman
en sona alnr ve dizinin boyu bir azaltlarak ileme devam edilir.
geen ilem
n1
138
Adres Aktarm
// cin,cout,endl
// EXIT_SUCCESS
delete score;
return EXIT_SUCCESS;
139
aretiler
Adres Aktarm
140
Sorular
1. Sezar ifrelemesi ynteminde ifrelenecek szckteki her harn yerine (ngilizce) abecede
kendisinden 3 sonra gelen harf konur (A yerine D, B yerine E, ..., V yerine Y, W yerine
Z, X yerine A, Y yerine B, Z yerine C). Buna gre HUNGRY szcnn karl
KXQJUB olur.
(a) Bildirimi aada verildii ekliyle bir szck alan ve bunun ifrelenmesi sonucu
oluan yeni katar dndren bir fonksiyon yazn:
Blm 8
Giri-k
8.1
k
C dilinde
cout
printf
yaps u ekildedir:
printf(Merhaba dnya!\n);
Bu rnekte ekrana herhangi bir deiken ya da deyim deeri yazdrlmamakta, yalnzca bir ileti
grntlenmektedir. Katarn sonundaki
salar (C++'daki
endl
karl).
Bir deyim deerinin ekranda gsterilmesi isteniyorsa bu deerin tipi de biim katarnda belirtilmelidir. Her veri tipinin kendine zg bir belirteci vardr. (bkz. Tablo 8.1).
Buna gre rnek 1'de geen
cout < < Alan: < < area < < endl;
komutunun karl u ekilde olur:
141
142
k
Veri Tipi
Belirte
%d
%ld
%x
%f
%e
%c
%s
rnek. radius
2.4
Biim katarndan sonraki ilk deyimin deeri kesirli say biiminde ekrana kartlr
(nce ve sonraki boluklar hari):
2.4
alan:
olan dairenin
Biim katarndan sonraki ikinci deyimin deeri kesirli say biiminde ekrana kartlr:
\n
18.07
Yzde ve ters bl iaretleri biim katarnda zel anlam tadklarndan bunlarn ka gnderilmesi istendiinde zel bir yazm gerekir. Yzde iaretini karmak iin '%%', ters bl iaretini
Biim katar deiken deerlerinin ka gnderilmesinde ayrntl denetim olana da salar.
rnein say deerlerinin belli bir uzunlukta olmas salanabilir. %5d eklinde belirtilen
bir tamsay deeri be haneliyse boluksuz, drt haneliyse bir boluk ve say, haneliyse
iki boluk ve say v.b. eklinde deerlendirilerek ka gnderilir. Bu yntem dzgn ekilde
altalta gelmi ktlar oluturmak iin yararldr. Kesirli saylarda da noktadan nce ve sonra
143
Giri-k
ka hane bulunduu belirtilebilir. Szgelimi %20.12f belirteci saynn toplam 20 hane (nokta
dahil) yer tutacan ve bunun 12 hanesinin noktadan sonra olacan gsterir.
DZELT: daha fazla ayrnt
8.2
Giri
scanf
cin
printf
scanf
fonksiyonunda deer
scanf fonksiyonuna gnderilen deikenlerin adlarnn bana adres ileci olan & simgesi konur.
rnein
scanf(%d, &radius);
Katar tipinden olan deikenlerde katarlar bir dizi olduklarndan ve adlar zaten dizinin ilk elemanna bir iareti olduundan
katar tipinden bir
word
scanf(%s, word);
rnek 31. statistik Hesaplar
Bu rnekte, rnek 13'de yaplan renci notlar zerindeki istatistik hesaplar dosyalar yardmyla gereklenecektir. renci notlar bir dosyadan okunacak, ilem sonular da yine bir dosyaya yazlacaktr. Notlarn hangi dosyadan okunaca ve sonularn hangi dosyaya yazlaca
program altrlrken komut satrndan belirtilecek, bylelikle program almas srasnda
kullancya hibir ey sormayacak, rettii hibir sonucu da ekranda gstermeyecektir. Bu
programn yazl olduu dosya
dosyann ad
stat3
olursa program
notlar.txt)
okunacak
birinin eksik olmas durumunda program nasl altrlmas gerektiine ilikin bir kullanm
iletisi grntler.
144
Giri
rnek 31 Dosyalar ile giri/k ilemleri yaparak renci notlar zerinde istatistik hesaplar
yapan program (okuma blm).
#include
#include
#include
#include
<iostream>
<stdio.h>
<stdlib.h>
<math.h>
//
//
//
//
cin,cout,cerr,endl
fopen,fclose,fprintf,fscanf,feof
exit,EXIT_SUCCESS,EXIT_FAILURE
fabs,sqrt
return EXIT_SUCCESS;
145
Giri-k
rnek 32 Dosyalar ile giri/k ilemleri yaparak renci notlar zerinde istatistik hesaplar
yapan program (yazma blm).
#include
#include
#include
#include
<iostream>
<stdio.h>
<stdlib.h>
<math.h>
//
//
//
//
cin,cout,cerr,endl
fopen,fclose,fprintf,fscanf,feof
exit,EXIT_SUCCESS,EXIT_FAILURE
fabs,sqrt
fclose(outfile);
}
return EXIT_SUCCESS;
146
8.3
Ana fonksiyon da dier fonksiyonlar gibi bir fonksiyon olmakla birlikte giri ve k parametrelerinin aktarm bakmndan farkllk gsterir. Bir fonksiyonun giri parametreleri almas ve k parametresi dndrmesi, o fonksiyonun arlabilmesi anlamna gelir. Oysa ana fonksiyon
almann balad fonksiyon olduundan dier fonksiyonlarca arlmaz. Ana fonksiyonu
aran iletim sistemidir, yani ana fonksiyonun arlmas programn iletim sistemince yrtlmeye balanmasna kar der. Bu durumda ana fonksiyon giri parametrelerini iletim
sisteminden alr, k parametresini de iletim sistemine dndrr.
Ana fonksiyonun k parametresinin nasl belirtildii u ana kadarki btn rneklerde grlmt. Bu parametre programn almas sonucu oluan durumun iletim sistemine bildirilmesi anlamn tar ve baar durumunda
return EXIT_SUCCESS;
baarszlk durumunda
return EXIT_FAILURE;
komutlaryla belirtilir.
Ana fonksiyonun giri parametreleriyse kullancnn program altrrken belirttii parametrelerdir. Giri parametrelerinin okunabilmesi iin ana fonksiyonun giri parametresi listesi
argc
parametre saysn,
argv
metre dizisinin her bir eleman, balktan da grlebilecei gibi, bir katardr.
Programn ad da parametreler arasnda sayldndan parametre says en az 1 olabilir. Yani
argc
stat3
argv
argv[0] = stat3
argv[1] = notlar.txt
argv[2] = sonuclar.txt
rnekteki
if (argc != 3)
komutu programn doru sayda parametreyle altrlp altrlmadn snamak iin konmutur. Parametre saysnn hatal olduu durumda programn ekrana bir kullanm iletisi
basp sonlanmasn salar.
Btn giri parametrelerinin birer katar olduuna dikkat edilmelidir. Komut satrndan verilen
deerlerin say olarak kullanlabilmesi iin uygun kitaplk fonksiyonlaryla (tamsaylar iin
atoi,
atof)
147
Giri-k
8.4
Dosyalar
Dosyalar zerinde ilem yapmak iin ncelikle dosyay programda temsil edecek bir deiken
tanmlanmaldr. C dilinde bu deiken dosya iaretisi olarak adlandrlr ve
FILE * tipinden
tanmlanr. rnekte biri giri dosyasn (infile) dieri de k dosyasn (outfile) temsil
etmek zere iki dosya iaretisi tanmlanmtr. Dosya iaretisi sradaki okuma ya da yazma
ileminin dosya zerinde hangi noktada yaplacan belirler ve yaplan her ilemle ileri ya da
geri doru hareket eder.
8.4.1
Bir dosya zerinde ilem yapmadan nce ilk yaplmas gereken dosyann almasdr. Ama
ilemi bildirimi aada verilmi olan
fopen
path
r :
w :
r+ :
dosyada hem okuma hem yazma yaplacak (dosya varsa sfrlanmaz, yoksa yaratl-
maz)
w+ :
a :
dosyada hem okuma hem yazma yaplacak (dosya sfrlanr, yoksa yaratlr)
Fonksiyon balndan da grlebilecei gibi bu fonksiyon geriye at dosya iin bir iareti
dndrr, dosya zerinde sonraki ilemlerde bu iareti kullanlacaktr.
Ekleme kipinde ama dndaki kiplerde dosya ama ilemi dosya iaretisini dosyann bana
konumlandrr; yani ilk okuma ya da yazma dosyann bandan yaplr.
Dosya zerindeki ilemler bittikten sonra da dosyann kapatlmas gerekir. Bu amala bildirimi
aada verilmi olan
fclose
fonksiyonu kullanlr:
EOF
deerini dndrr.
148
8.4.2
Dosyada Okuma-Yazma
Her okuma ya da yazma ilemi iaretiyi okunulan ya da yazlan miktar kadar ilerletir; bylelikle pepee okuma ilemleri dosyann srayla okunmasn salar (yazma iin de benzer e-
fscanf ve fprintf fonksiyonlar kullanlabilir. Bu fonksiprintf fonksiyonlar ile ayndr; tek farklar ek olarak en baa
scanf
ve
bildirimi u ekildedir:
stream parametresi ile belirtilen dosyadan en fazla size - 1 simge okur ve oku-
s parametresi ile belirtilen katara yazar. Satr sonu ya da dosya sonuna raslarsa daha
NULL, baarl olursa s deerini dndrr. Gvenlik asndan
gets
u ekildedir:
stream parametresi ile belirlenen dosyadan okuduu sradaki simgeyi bir tamsay
feof
fonksiyonundan yararlanlr. Bu
fonksiyon kendisine parametre olarak gnderilen dosya iaretisinin ilgili dosyann sonu olup
olmadn snar ve sona gelindiyse doru deerini dndrr.
8.5
Standart giri, k ve hata birimleri de birer dosya gibi davranrlar. Standart giri birimi
stdin adnda nceden tanmlanm zel bir deikende tutulur. Benzer ekilde standart k
iin stdout, standart hata iin de stderr deikenleri tanmlanmtr. Basit bir rnek verecek
olursak
149
Giri-k
8.6
Hata letileri
Hata iletilerinin standart k iletilerinden ayrlmasnn yararl bir alkanlk olduu Blm 1.5'de sylenmiti. Bir C++ programnda bu ilem iletinin
cout
deil,
cerr
birimine
ynlendirilmesiyle salanabilir. rnekte dosyalarn alamamas durumunda grntlenen iletilerde bu ilem grlebilir:
cerr
exit
EXIT_FAILURE
deeri gnderilirse programn baarsz sonland iletim sistemine bildirilmi olur. Bu ilemin
return
ile dnmeden fark hangi fonksiyondan arlrsa arlsn programn derhal sonlan-
perror
son oluan hataya gre uygun bir mesaj standart hata birimine gnderir. Kullanmnda gelenek
olarak hatann hangi fonksiyonda ortaya kt belirtilir. rnekte giri dosyas alamadnda
cerr
teknik kullanlabilir:
kili Dosyalar
150
sprintf fonksiyonu da ktnn ekrana baslmadan bir katarda oluturulmas ileminde yararl
olur. Szgelimi, x saysn strx katarna evirmek iin aadaki basit komut kullanlabilir:
sprintf(strx, %d, x);
8.8
kili Dosyalar
'b' bayra
fread, fwrite, fseek
Uygulama: Dosyalar
rnek 33. Graarn Enlemesine Taranmas
DZELT: YAZILACAK
graf tip tanm:
struct graph_s {
int nodes;
int adjacency[MAXNODES][MAXNODES];
};
typedef struct graph_s graph_t;
okuma fonksiyonu bildirimi:
Sorular
1. Bitiiklik matrisini komut satrnda belirtilen bir dosyadan okuduu grafn balant matrisini Warshall algoritmas yardmyla hesaplayan bir program yazn.
151
Giri-k
if (argc != 3) {
cerr << "Kullanm: " << argv[0]
<< " matris_dosyas balang_dm" << endl;
return EXIT_FAILURE;
}
fp = fopen(argv[1], "r");
if (fp == NULL) {
cerr << "Matris dosyas alamad." << endl;
exit(EXIT_FAILURE);
}
sscanf(argv[2], "%d", &start_vertex);
read_matrix(fp, graph);
for (i = 0; i < graph.nodes; i++)
visited[i] = false;
vertices[0] = start_vertex;
visited[start_vertex] = true;
count = 1;
index = 0;
while ((index < graph.nodes) && (count < graph.nodes)) {
next_vertex = vertices[index];
for (i = 0; i < graph.nodes; i++) {
if ((graph.adjacency[next_vertex][i] == 1)
&& (!visited[i])) {
vertices[count] = i;
visited[i] = true;
count++;
}
}
index++;
}
for (i = 0; i < graph.nodes; i++)
cout << vertices[i] << endl;
fclose(fp);
return EXIT_SUCCESS;
kili Dosyalar
152
Blm 9
nilemci
Bir C kaynak dosyasndan altrlabilir dosya oluturulmas iin geilen aamalar derleme
ve balama olarak belirtilmiti. Aslnda kaynak dosyas, derleyiciye verilmeden nce bir de
nilemciden geirilir. nilemcinin yaptklar yle zetlenebilir:
Aklamalar ayklar:
/*
ile
*/
arasnda kalan ya da
//
#dene
3.14
yazarak derleyiciye
grmez.
#include
nilemci komutu,
stdlib.h
#include <stdlib.h>
9.1
Makrolar
Programn iinde ska yinelenmesi gerekebilecek, ancak bir fonksiyon haline getirmeye de
demeyecek kk kod paralar makrolar yardmyla gereklenir. Makrolar da deimez tanmlarna benzer ekilde
benzer ekilde olur, yani makronun adnn getii yere alm konur.
rnek 13'de geen
154
Projeler
score[i] - mean
Bu ilem bir szck ya da szck grubunun yerine baka bir szck ya da szck grubunun
yerletirilmesi eklinde yrdnden kullanmna dikkat etmek gerekir. rnekteki makro
#define sqr(x) x * x
eklinde tanmlansayd makro almyla oluacak (hatal) kod u ekilde olurdu:
project.cpp
9.2
ops.cpp
main fonkdosyasna
Projeler
Yazlan programn kapsam bydke btn kaynak kodunun tek bir dosyada toplanmas
zorlamaya balar. Binlerce satrlk bir kaynak kodunun tek bir dosyada tutularak program
gelitirilmesi son derece zordur. Byle projelerde kaynak kodu farkl dosyalara blnr. Birden fazla kaynak dosyasna blnm bir proje derlenirken nce her kaynak dosyas ayr ayr
derlenerek ara kodlar oluturulur, sonra balayc bu ara kodlar ve varsa kullanlan kitaplklar
arasndaki balantlar kurarak altrlabilir kodu retir (ekil 9.3).
Derleme sresi balama sresinden ok daha uzun olduundan kaynak kodun bu ekilde blnmesi altrlabilir dosyann retilmesi iin gereken zaman da azaltr. Tek bir byk dosyadan
oluan projelerde herhangi bir yordamdaki herhangi bir deiiklikte btn yordamlarn yeniden derlenmeleri ve balanmalar gerekir. Oysa kaynak dosyalar blnrse yalnzca deitirilen
155
nilemci
Say 1: 0
Say 2: 0
1.
2.
3.
4.
5.
6.
Seiminiz: 1
Sayy yaznz: 9702
Say 1: 9702
Say 2: 0
1.
2.
3.
4.
5.
6.
Seiminiz: 2
Sayy yaznz: 945
156
Projeler
Say 1: 9702
Say 2: 945
1.
2.
3.
4.
5.
6.
Seiminiz: 3
2^1 3^2 7^2 11^1
Say 1: 9702
Say 2: 945
1.
2.
3.
4.
5.
6.
Seiminiz: 4
En byk ortak blen: 1323
Say 1: 9702
Say 2: 945
1.
2.
3.
4.
5.
6.
Seiminiz: 5
En kk ortak kat: 145530
Say 1: 9702
Say 2: 945
1.
2.
3.
4.
5.
6.
Seiminiz: 6
157
nilemci
// std::xxx
// EXIT_SUCCESS
// gcd,lcm,...
int main(void)
{
int num1 = 0, num2 = 0;
factor_t factors[MAXFACTOR];
int n, i;
int choice;
while (true) {
std::cout << "Say 1: " << num1 << std::endl;
std::cout << "Say 2: " << num2 << std::endl << std::endl;
std::cout << "1. Say 1'i deitir" << std::endl;
std::cout << "2. Say 2'yi deitir" << std::endl;
std::cout << "3. Say 1'in arpanlarn gster" << std::endl;
std::cout << "4. En byk ortak blen bul" << std::endl;
std::cout << "5. En kk ortak kat bul" << std::endl;
std::cout << "6. k" << std::endl << std::endl;
std::cout << "Seiminiz: ";
std::cin >> choice;
if (choice == 6)
exit(EXIT_SUCCESS);
switch (choice) {
case 1:
case 2:
std::cout << "Sayy yaznz: ";
if (choice == 1)
std::cin >> num1;
else
std::cin >> num2;
break;
case 3:
factorize(num1, factors, n);
for (i = 0; i < n; i++)
std::cout << factors[i].base << "^" << factors[i].power << " ";
std::cout << std::endl;
break;
case 4:
std::cout << "En byk ortak blen: " << gcd(num1, num2) << std::endl;
break;
case 5:
std::cout << "En kk ortak kat: " << lcm(num1, num2) << std::endl;
break;
}
std::cout << std::endl;
}
return EXIT_SUCCESS;
158
Projeler
// sqrt,pow
// struct factor_s
n1,
n2,
n1,
n2,
159
nilemci
derleme
baglama
kaynak kodu 1
ara kod 1
kaynak kodu 2
ara kod 2
kaynak kodu n
ara kod n
alistirilabilir kod
kitapliklar
yordamn bulunduu kaynak dosyas yeniden derlenir ve balama ilemi yaplr; deimeyen
kaynak kodlarnn yeniden derlenmelerine gerek kalmaz.
Byle bir almada, dosyalardan yalnzca birinde
durumda balama ilemi belirsizlik nedeniyle baarsz olur. Ayrca farkl dosyalardaki fonksiyonlarn birbirlerini arabilmeleri, dosyalar arasnda deiken paylaabilmeleri gibi konular
iin baz dzenlemeler yapmak gerekir.
Datmann yararl olabilmesi iin fonksiyonlar, amalarna gre gruplanarak dosyalara blnmelidir. rnekte olduu gibi, kullancyla etkileimi salayan (giri/k ilemlerini yapan)
fonksiyonlarn hesaplamalar yapan fonksiyonlarla ayr dosyalara toplanmas sk kullanlan bir
blmleme tekniidir.
Hesap ilemlerini yapan
dklarndan bu dosyann derlenmesi srasnda sorun kar. Derlenebilmesi iin bu fonksiyonun bildirimleri dosya bana eklenmelidir. Bildirimler elle yazlabilir ancak daha doru olan
yntem,
ops.cpp
ieren bir balk dosyas hazrlamak ve bu balk dosyasn dier dosyann iine almaktr. By-
#include ops.h
nilemci komutuyla her iki kaynak dosyasnn da iine alnmtr. Burada
<>
simgeleri yerine
160
Projeler
#define MAXFACTOR 50
struct factor_s {
int base, power;
};
typedef struct factor_s factor_t;
void factorize(int x, factor_t factors[], int &n);
int gcd(int number1, int number2);
int lcm(int number1, int number2);
#endif
next_prime
ve
is_prime
fonksiyonlar
factor_t
tipi
project.cpp
bir tip olduundan balk dosyasna alnmtr. Program bir saynn asal arpanlarn listeleme
iini yapmayacak olsayd, bu veri tipi ve
factorize
fonksiyonunun bildirimine
project.cpp
ops.cpp
balk dosyasnda
161
nilemci
Sorular
1.
x |y z|
(a) bir
if
3
1
x1
1
x2
1
x3
b = harmonic(m - 1, n + 3, p);
eklinde arlrsa bu makronun alm nasl olur?
Projeler
162
Blm 10
Balantl Listeler
struct factor_s {
int base, power;
struct factor_s *next;
};
typedef struct factor_s factor_t;
Grld gibi, bir dmde asal arpann deeri ve ssne ek olarak dmn kendi tipine
iaret eden bir iareti alan vardr. Byle bir yap zerinde ilem yapmak iin tek gerekli
deiken dizinin ilk elemanna iaret eden bir deiken tutmaktr, rnekteki
head
deiken-
leri bu amala tanmlanmtr. Listeye ekleme algoritmalarnda kolaylk salamas iin bir de
listenin son dmn (next alannda
NULL
tail
deikeni
kullanlmtr.
Bu tanma gre oluturulan balantl listelerde 9702 saysnn arpanlarnn nasl gsterildii
ekil 10.1'de verilmitir.
163
164
rnek 38 Balantl listeler kullanarak en byk ortak blen hesaplayan program (ana fonksiyon).
int main(void)
{
int number1, number2;
factor_t *factors1 = NULL, *factors2 = NULL, *factors3 = NULL;
long int gcd = 1L;
factor_t *f = NULL;
tail
head
2
11
165
Balantl Listeler
Bu veri yaps kullanldnda bir sayy asal arpanlarna ayran fonksiyonun giri parametresi
olarak yalnzca asal arpanlarna ayrlacak sayy almas ve k parametresi olarak oluturduu arpanlar listesinin balang elemann dndrmesi yeterlidir:
delete_factors
head
lecek dmn adresini tutarken p iaretisi bir sonraki dmn unutulmamasn salar. Bu
fonksiyon yle yazlabilir:
10.1
Yaplara aretiler
Bir yapya iaret eden bir deiken tanmlandnda bu yapnn alanlarna erimek iin
->
ileci kullanlr. rnekte ortak arpanlardan en byk ortak blenin hesapland dngdeki
f->base yazm buna bir rnektir. Bunun yerine nce * ile iaretinin bavurduu yere eriilip
daha sonra noktal gsterilimle istenen alann deeri de alnabilir: (*f).base gibi. Ancak bu
ikinci gsterilim pek yelenmez.
Yaplara aretiler
166
rnek 39 Balantl listeler kullanarak en byk ortak blen hesaplayan program (asal arpanlara ayrma fonksiyonu).
factor_t *factorize(int x)
{
factor_t *head = NULL, *tail = NULL, *f = NULL;
int factor = 2;
while (x > 1) {
if (x % factor == 0) {
f = new factor_t;
f->base = factor;
f->power = 0;
while (x % factor == 0) {
f->power++;
x = x / factor;
}
f->next = NULL;
if (head == NULL)
head = f;
if (tail != NULL)
tail->next = f;
tail = f;
}
factor = next_prime(factor);
}
return head;
167
Balantl Listeler
rnek 40
Yaplara aretiler
168
45
22
22
18
18
45
45 91
22 45 91
22 45 62 91
Bu yntem statik diziler zerinde gereklenmeye uygun deildir nk her yeni gelen eleman
eklendiinde ondan byk olan btn elemanlarn bir konum saa kaydrlmalar gerekir. rnekte 18 says dizinin en bana ekleneceinden elemann birden saa kaydrlmasna neden
olur. Oysa bu algoritma balantl listeler zerinde gereklenmeye gayet uygundur. rnek 41'de
bir diziyi sral bir balantl listeye eviren program verilmitir.
liste bo
eleman en baa ekleniyor
eleman en sona ekleniyor
eleman arada bir yere ekleniyor
assert
core dump
169
Balantl Listeler
rnek 41 Balantl liste zerinde araya sokarak sralama program (ana fonksiyon).
#include <iostream>
#include <stdlib.h>
// cin,cout,endl
// EXIT_SUCCESS
delete score;
return EXIT_SUCCESS;
Yaplara aretiler
rnek 42 Balantl liste zerinde araya sokarak sralama program (liste fonksiyonlar).
node_t *insert(node_t *head, int v)
{
node_t *p = head, *newnode = NULL, *last = NULL;
170
Blm 11
Rekrsiyon
ki saynn en byk ortak blenini bulmak zere kullandmz Euclides algoritmas, a ile
ile
a % b
ilkesine dayanyordu. Problemin zmnn, bu rnekte olduu gibi, kendisi cinsinden ifade
edilmesine rekrsif tanm ad verilir. zlmesi istenen problem, kendisi cinsinden daha kk
bir probleme indirgenir. Srekli indirgemeler yoluyla zm bilinen bir duruma (taban durum) ulalmaya allr. Euclides algoritmasnda taban durum kk olan saynn 0'a gelmesi
durumuydu; bu durumda dier say en byk ortak blen oluyordu. Aksi halde daha kk
saylar zerinde en byk ortak blen aranmaya devam ediliyordu. Bu ilkeyi gerekleyen bir
fonksiyon u ekilde yazlabilir:
int factorial(int x)
{
if (x == 0)
return 1;
else
return x * factorial(x - 1);
}
Bu iki rnek, C gibi blok yapl dillerde rekrsif gereklenmeye uygun rnekler deildir; nk
yinelemeli olarak gereklendiklerinde daha etkin alrlar. Rekrsif yazm bazen daha gzel
grnse ve matematikteki tanma daha yakn olsa da, baarm asndan dezavantajl olabilir.
171
172
A
B
C
Birinci ve nc admlardaki tama ilemi aslnda 63 disk iin ayn problemin zlmesinden
baka bir ey deildir. O halde problemimizi
Bir
Bir
Bir
Bir
Bir
Bir
Bir
diski
diski
diski
diski
diski
diski
diski
1
1
3
1
2
2
1
direinden
direinden
direinden
direinden
direinden
direinden
direinden
3
2
2
3
1
3
3
direine
direine
direine
direine
direine
direine
direine
ta.
ta.
ta.
ta.
ta.
ta.
ta.
173
Rekrsiyon
A
C
1.
n - 1
2.
3.
n - 1
diski
direinden
direinden
direine
direine ta.
direine
Her seferinde direk says azaldndan bu algoritma sonlanma koulunu salar. Taban durum,
tanacak disk saysnn 0 olduu durumdur, bu durumda hibir ey yaplmayacaktr. O halde
bu problemi zen program rnek 43'de grld gibi yazlabilir.
Bu algoritmann en gzel yanlarndan biri, deneme-yanlma yntemiyle deil, herhangi bir
diski gereksiz yere bir direkten bir diree aktartmadan bir kerede zm bulmasdr.
Uygulama: Rekrsiyon
rnek 44. abuk Sralama
DZELT: YAZILACAK
Sorular
174
// cin,cout,endl
// EXIT_SUCCESS
175
Rekrsiyon
// cin,cout,endl
// EXIT_SUCCESS
quicksort(numbers, 0, 6);
for (i = 0; i < 7; i++)
cout << numbers[i] << endl;
return EXIT_SUCCESS;
tmp = x; x = y; y = tmp;
176
Ek A
Simgelerin Kodlanmas
Bilgisayarlarda dier her ey gibi simgeler de saylarla gsterilirler. Bunun iin hangi simgenin
hangi sayyla gsterilecei (ya da tersine, hangi saynn hangi simgeye kar decei) konusunda bir uzlama olmas gerekir. Bu amala tanmlanan kodlamalar, simgelere birer numara
verirler.
Yaygn kullanlan ilk kodlamalardan biri ASCII kodlamasyd (ekil A.1). ASCII, 7 bitlik bir
kodlama olduundan 128 farkl simgenin kodlanmasna olanak verir. lk kodun numaras 0,
son kodun numaras 127'dir. Bunlardan ilk 32 simge (0-31) ve son simge (127) baslamaz
simgelerdir (satr sonu, bip sesi v.b.). Aradaki 95 simgeyse (32-126) ngilizce'nin btn kk ve byk hareri, rakamlar, noktalama iaretleri ve tutakm zerinde grdnz her
trl zel simgeyi ierir. ASCII kodlamas gnmzde kullanlan btn kodlamalarn temelini
oluturur.
32
40
48
56
64
72
80
88
96
104
112
120
+0
+1
+2
+3
+4
+5
+6
+7
"
&
'
<
>
178
ASCII izelgesinde olann aynsdr, dzenlemeler ikinci 128 simge zerinde yaplr. Bu kodlamalarn en bilineni ISO8859 standart ailesinde tanmlananlardr. ISO8859 kodlamalarnda da
128-159 aras saylar kullanlmaz.
ISO8859-9: Trke (latin5 kodlamas adyla da bilinir). ISO8859-1 kodlamasyla neredeyse ayndr, yalnzca ISO8859-1'deki zlandaca harerin yerine Trke harerin gelmesiyle oluturulmutur. ki kodlama arasnda deien 6 simge unlardr: .
Son yllarda, farkl diller konuan, farkl lkelerde yaayan insanlarn ortak kullandklar uygulamalarn says ok byk bir hzla arttndan, btn dillerin btn simgelerini ieren bir
kodlamaya gemek bir zorunluluk halini almtr. Bu amala gelitirilen Unicode kodlamas
(resmi adyla ISO10646-1), 16 ve 32 bitlik srmleri olan bir kodlamadr. Yeryznde bilinen
btn dillerin simgelerini iermenin yansra daha pek ok ek simgenin tanmlanabilmesine
de olanak verir. Ancak btnyle bu kodlamaya gemek iin yaygn kullanlan btn programlarda byk miktarlarda deiiklik gerekecektir. Bu nedenle, yeni yazlan uygulamalarda
bu kodlamann yaln hali olan UTF-16 ya da UTF-32 kodlamalarna uyulmas ngrlrken,
kullanm sren eski uygulamalarla uyum sorununu azaltmak iin bir gei kodlamas olarak
UTF-8 gelitirilmitir.
Bir deerin bilgisayar belleinde bir gze ham bir veri olarak yazld dnlebilir. Szgelimi,
bir bellek gznde 240 says yer alyor olsun. Program bu gz bir tamsay olarak deerlendirirse 240 deerini elde eder ve diyelim bu sayy baka bir say ile toplayabilir. ISO8859-9
kodlamasnda bir simge olarak deerlendiriyorsa '' harni elde eder ve Trke kurallarna
gre sralama yapmada kullanabilir. ISO8859-1 kodlamasnda bir say olarak deerlendiriyorsa harni elde eder ve zlandaca kurallarna gre sralamada kullanabilir. Ksacas, deer
bellekte ham haliyle bulunur; nasl anlam verilecei, ne amala kullanlaca programn belirleyecei konulardr.
Ek B
Unix'de Program Gelitirme
B.1
Yardmc Belgeler
man fonksiyon
man sqrt.
info
KDE: Konqueror ya da Alt-F2 #sqrt
B.2
Derleme
Unix ailesi iletim sistemlerinde C/C++ dilinde gelitirme yapmak iin en ok GNU C Compiler (gcc) derleyicisi kullanlr. Temel kullanm yledir:
/usr/include,
kitaplk dosyalarnysa
/usr/lib
kataloglarnda
main
main.cpp,
main.o,
olduu varsaylrsa:
-c bayran
180
Derleme
-Wall
bayran kullanabilirsiniz:
-I
bilirsiniz:
Optimizasyon: -O2
Birden fazla kaynak dosyasndan oluan bir projenin derlenmesi birka aamal olur. rnek 35
zerinde bir projenin nasl derleneceini grelim:
project.cpp
bala
Makefile
Makefile
Her hedef iin heden nelere bal olduu ve nasl oluturulaca belirtilir. rnek bir hedef
yle yazlabilir:
project
hedenin
project.o
ve
ops.o
yalarda deime olursa (dosyann tarih ve saati hedenkinden yeniyse) heden yeniden oluturulmas gerektiine karar verilir. rnek projedeki dier hedeer de yle yazlabilir:
Hede oluturmakta kullanlacak komutlar satr bandan bir sekme ieriden balamaldr. Bir hede olu-
181
project.o: project.cpp
g++ -c project.cpp -o project.o
ops.o: ops.cpp
g++ -c ops.cpp -o ops.o
make
project
make project
project.o, ops.o
ve
komutunun almas
yle olur:
1.
project
project.o
ve
ops.o
hedeerine bal
olduu iin ve bunlar henz oluturulmam olduu iin srayla bunlar oluturulmaya
allr.
2.
ops.o hede oluturulmaya allr. Bu hedef ops.cpp dosyasna bal olduu iin oluturulmasna geilebilir ve
project hedenin bal olduu iki dosya da olumu olduundan bu heden olu-
turulmasna geilebilir ve
leride
ops.cpp
make project
komutunun yrtld-
project.o
ops.o
n dnelim:
1.
project
ve
hedeerine bal
project.o hede oluturulmaya allr. Bu hedef project.cpp dosyasna baldr ancak project.cpp dosyasnn saati project.o dosyasndan eski olduu iin bir ilem
yaplmaz.
3.
ops.o
dosyasnn saati
ops.o
ops.cpp
dosyasna baldr ve
ops.cpp
182
Editrler
project
hedene dnldnde
ops.o
project
dosyasnn sa-
atinden yeni olduu iin bu heden de yeniden oluturulmas gerektiine karar verilir
ve
Makefile
Makefile
clean
hedeni de iermektedir;
make clean
komutu sizin yazdnz dnda kalan btn dosyalarn silinmesi iin kullanlr.
rm -f *.o proje
nilemci: cpp
B.3
Editrler
nedit kate mcedit: yazm renklendirme, ayra eletirme, makrolar, tab emlasyonu, kendiliinden girintileme
B.4
Hata Ayklayclar
-g
bayran kullanmalsnz:
183
if (x % factor == 0) {
satrndan sonraki
f = new factor_t;
komutunu silerek program derleyin ve altrn. Program bellek hatas vererek kecektir.
ddd hata ayklaycsnda nce Open Program komutuyla altrlabilir dosyay, sonra da
Open Core Dump... komutuyla yaratlan
core
f->base = factor;
satrnda kaldn ve
B.5
iaretisinin deerinin
NULL
olduunu greceksiniz.
Baarm nceleme
-pg
gmon.out
% cumulative
self self total
time
seconds seconds calls us/call
us/call
95.24
0.20
0.20 70516
2.84
2.84
4.76
0.21
0.01
2 5000.00 105000.00
0.00
0.21
0.00 13127
0.00
15.24
0.00
0.21
0.00
1
0.00
0.00
name
is_prime
factorize
next_prime
merge_factors