C++ Türkçe Kitap

February 19, 2017 | Author: api-3720427 | Category: N/A
Share Embed Donate


Short Description

Download C++ Türkçe Kitap...

Description

Programlamaya Giri³ Ders Notlar

H. Turgut Uyar

“ubat 2004

ii

Önsöz

(C) 2001-2004, H. Turgut Uyar Bu notlar, stanbul Teknik Üniversitesi'nde verilen Introduction to Scientic and Engineering Computation dersi için Bilgisayar Mühendisli§i Bölümü ö§retim görevlisi H. Turgut Uyar tarafndan hazrlanm³tr. Yazarnn açkça belirtilmesi ko³uluyla e§itim amaçl kullanlabilir ve da§tlabilir. Di§er her türlü kullanm için yazarndan izin alnmaldr.

Sürüm: 0.99.5 Son düzenleme 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 de§il, ayn zamanda temel saysal yöntemleri ve sralama algoritmalar gibi skça kullanlan programlama tekniklerini de göstermektir. Bu amaçla uygulamalarda daha çok saysal yöntemler üzerine örnekler seçilmeye çal³lm³tr. Bu örneklerin ço§u Prof. Dr. Nadir Yücel'in Saysal Analiz Algoritmalar kitabndan uyarlanm³tr. Notlarn hazrlanmasnda yeni standartlara uyumu kolayla³trmas açsndan C++ dilinin getirdi§i baz yeniliklerden yararlanlm³tr. Metin içinde yeri geldikçe, C++ dilinde geçerli olup C dilinin izin vermedi§i özellikler belirtilmi³tir. Programlarn ekran çktlarnda kullancnn yazd§ de§erler italik olarak i³aretlenmi³tir. Örnek programlar ve ders için hazrlanan sunumlar (ngilizce) yukarda belirtilen web sayfasnda bulunabilir.

iii

iv

çindekiler

1 Giri³

1

1.1

Veriler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

1.1.1

Taban Tipler

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

1.1.2

Kaytlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

1.1.3

Diziler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

1.2

Algoritmalar 1.2.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

Algoritmalarn Kar³la³trlmas . . . . . . . . . . . . . . . . . . . . . . .

11

1.3

Blok Yapl Programlama

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

1.4

Soyutlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

1.5

Giri³ / Çk³ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

1.6

Program Geli³tirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

1.6.1

Programlarn De§erlendirilmesi . . . . . . . . . . . . . . . . . . . . . . .

23

1.6.2

Programlarn Çal³trlmas

. . . . . . . . . . . . . . . . . . . . . . . . .

24

1.6.3

Kitaplklar

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

1.6.4

Standartlar

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

1.6.5

Derleme A³amalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

2 C Diline Giri³

29

2.1

simler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

2.2

De§erler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

2.3

De§i³kenler

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

2.4

Veri Tipleri

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

2.5

De§i³mezler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

2.6

Aritmetik Deyimler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

2.7

Tip Dönü³ümleri

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

2.8

Artrma / Azaltma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

2.9

Matematik Kitapl§

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

2.10 Giri³ / Çk³ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

v

vi

ÇINDEKILER

3 Ak³ Denetimi 3.1

3.2

45

Ko³ul Deyimleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

3.1.1

Kar³la³trma ³lemleri . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

3.1.2

Mantksal ³lemler

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50

Seçim 3.2.1

Ko³ullu ³leç

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

3.3

Çoklu Seçim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

3.4

Ko³ul Denetiminde Yineleme

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

59

3.5

Döngü Denetimi

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

3.6

Sayaç Denetiminde Yineleme

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 Türetilmi³ Veri Tipleri

63

73

4.1

Numaralandrma

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

4.2

Yaplar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

5 Diziler

85

5.1

Tek Boyutlu Diziler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

5.2

Katarlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

5.3

Katar Kitapl§ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

92

5.4

Çok Boyutlu Diziler

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

94

5.5

Ba³vurular

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

6 Fonksiyonlar

103

6.1

Fonksiyon Bildirimi ve Tanm . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

6.2

Parametre Aktarm

6.3

Yerel De§i³kenler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

6.4

Genel De§i³kenler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

6.5

Ba³vuru Aktarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

6.6

Giri³ Parametreleri Üzerinden De§er Döndürme . . . . . . . . . . . . . . . . . . 116

6.7

Dizilerin Fonksiyonlara Aktarlmas . . . . . . . . . . . . . . . . . . . . . . . . . 117

6.8

E³ simli Fonksiyonlar

6.9

Varsaylan Parametreler

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

vii

ÇINDEKILER

7 ³aretçiler

127

7.1

³aretçi Tipinden De§i³kenler

. . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

7.2

Bellek Yönetimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

7.3

³aretçi - Dizi li³kisi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

7.4

³aretçi Tipinden Parametreler

7.5

Statik De§i³kenler

7.6

Adres Aktarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

. . . . . . . . . . . . . . . . . . . . . . . . . . . 133

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

8 Giri³-Çk³

141

8.1

Çk³ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

8.2

Giri³ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

8.3

Ana Fonksiyona Parametre Aktarma . . . . . . . . . . . . . . . . . . . . . . . . 146

8.4

Dosyalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 8.4.1

Dosya Açma - Kapama . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

8.4.2

Dosyada Okuma-Yazma

. . . . . . . . . . . . . . . . . . . . . . . . . . . 148

8.5

Standart Giri³ / Çk³ Birimleri . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

8.6

Hata letileri

8.7

Katarlar ile Giri³-Çk³ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

8.8

kili Dosyalar

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

9 Öni³lemci

153

9.1

Makrolar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

9.2

Projeler

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

10 Ba§lantl Listeler

163

10.1 Yaplara ³aretçiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

11 Rekürsiyon

171

A Simgelerin Kodlanmas

177

B Unix'de Program Geli³tirme

179

B.1

Yardmc Belgeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

B.2

Derleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

B.3

Editörler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

B.4

Hata Ayklayclar

B.5

Ba³arm nceleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

ÇINDEKILER

viii

Bölüm 1 Giri³

Bir problemi çözmek üzere bir bilgisayar program yazarken iki temel soruna çözüm getirmek gerekir:

Problemin nasl temsil edilece§i. Bilgisayarlar temelde saylar üzerinde i³lem yapmak üzere tasarlanm³ makinalardr; dolaysyla tandklar varlk yelpazesi fazla geni³ de§ildir. Örne§in Türkiye'deki karayollaryla ilgili bir program yazlacaksa ³ehirlerin ve aralarndaki yollarn bir ³ekilde temsil edilmesi gerekir çünkü bilgisayarn ³ehir, yol gibi kavramlar yoktur. Bir ³ehri temsil etmek için ³ehrin ad, enlemi ve boylam kullanlabilir. Bir yolun temsili içinse farkl seçenekler dü³ünülebilir:



Yolun düz oldu§unu varsayarak bir do§ruyla göstermek (“ekil 1.1a). Bu durumda yalnzca ba³langç ve biti³ ³ehirlerini (yani enlem, boylam ve isimlerini) bilmek yeterli olacaktr. Bu yöntem i³lemleri çok basitle³tirmekle birlikte gerçek durumdan büyük ölçüde sapmaya neden olur.



Yolu ucuca eklenmi³ do§ru parçalaryla göstermek (“ekil 1.1b). “ekilde stanbulAnkara yolu iki, stanbul-zmir yolu dört, Ankara-zmir yolu üç do§ru parçasndan olu³maktadr. Ancak bu yöntem daha zordur ve yolu ne kadar ayrntl temsil etmek isterseniz o kadar fazla do§ru parças kullanmanz gerekir.

Problemi olu³turan varlklarn nasl temsil edileceklerinin belirlenmesi, problem için bir model olu³turulmas anlamna gelir. Problemin çözümünde ilk ve en önemli adm do§ru

ve yeterli ayrntda bir model olu³turmaktr. Yukardaki örnekten de görülebilece§i gibi, çözece§iniz problemi nasl modelledi§iniz son derece önemlidir, çünkü çözdü§ünüz ³ey problemin kendisi de§il, sizin o problemi temsil etmek üzere tasarlad§nz modeldir. Modeliniz problemden uzaksa siz ne kadar iyi bir çözüm uygularsanz uygulayn elde edece§iniz sonuç anlamsz olur. Di§er yandan, modelin ne kadar ayrntl olmas gerekti§i, çözmek istedi§iniz problemin gereksinimleriyle belirlenir. Gerekenden daha ayrntl bir model hazrlarsanz belki daha iyi bir sonuç elde edersiniz ama o daha iyi sonuca ula³mak için harcamanz gerekecek ek çaba ya da çözümüzün gerçekleme maliyeti aradaki farka de§meyebilir. Yine yukardaki 1

2

örnekle sürdürürsek, stanbul-Ankara karayolunun 274. kilometresi gibi bilgilerden söz edecekseniz yolu do§ru parçalaryla modellemeniz gerekecektir çünkü gerçek ya³amda bu nokta büyük olaslkla o iki ³ehri birle³tiren çizginin üzerinde bir yere dü³meyecektir. Ancak yollarn yalnzca uzunluklaryla ilgileniyorsanz do§rularla modellemeniz yeterlidir; bu durumda da do§ru parçalaryla modellemek yolun uzunlu§unun bulunmasnda zorluk çkaracaktr.

Istanbul

Istanbul

Ankara

Izmir

Ankara

Izmir

(a)

(b)

“ekil 1.1: Karayollarnn gösterilmesi.

Çözümün nasl ifade edilece§i. Bir problem için dü³ündü§ünüz çözümü ba³ka birine (insan ya da bilgisayar) anlatabilmeniz gerekir. Adm adm hangi i³lemlerin yaplaca§nn açklanmas ³eklinde anlatlan bir çözüme algoritma ad verilir. Algoritmalara günlük ya³amdan skça verilen bir örnek yemek tarieridir. A³a§da, bezelyeli Jamaika pilav yapmak için nternet'ten alnm³ bir tarif algoritma biçiminde yazlm³tr: 1. 1 1/2 kutu bezelyeyi 4-5 ncan suya koy. 2. 1/4 kutu hindistan cevizi sütü, 1 tutam kekik ve a§z tadna göre tuz ve biber ekle. 3. Bezelyeler yumu³ayncaya kadar ha³la. 4. Bir so§ann dibini ez ve 2 ncan pirinç, 1/4 kutu hindistan cevizi sütü ve 2 tutam kekik ile birlikte suya ekle. 5. Pirincin üstünden 2 cm kadar su kalacak ³ekilde fazla suyu al. 6. 5 dakika kaynat. 7. Pirinç yumu³ayncaya kadar pi³irmeye devam et. Algoritmann bir bilgisayar tarafndan yürütülebilmesi için iki önemli özellik sa§lanmaldr:



Her admda ne yaplaca§ açk olarak belli olmal, hiçbir ³ekilde yorum gerektirmemelidir. Yukardaki örnek bu bakmdan bir algoritma saylamaz çünkü pek çok admda ne yaplaca§ yoruma braklm³tr. Sözgelimi, 4-5 bardak, a§z tadna göre, bezelyeler yumu³ayncaya kadar gibi deyimler yeterince kesin de§ildir.



Sonlu sayda admda ya çözüm bulunmal ya da bulunamad§ bildirilmelidir.

3

Giri³

1.1

Veriler

Modelinizde kulland§nz büyüklükler programnzn verilerini olu³turur. Her büyüklük programda bir de§i³ken ile temsil edilir. De§i³ken aslnda o büyüklü§e verilmi³ simgesel bir isimden ba³ka bir ³ey de§ildir. De§i³kenler, programn i³leyi³i srasnda de§erler alrlar. De§i³kenlerin bellekte tutulduklar gözönüne alnrsa, de§i³ken bir bellek gözünün ad, de§er ise bu gözün içeri§idir. Örne§in, bir ³ehri modellemek için üç büyüklük öngörmü³tük: isim, enlem ve boylam. Her büyüklü§e bir de§i³ken kar³ dü³ürmemiz gerekti§inden isim bilgisini ve boylam bilgisini

boylam

isim, enlem bilgisini enlem

de§i³kenleriyle temsil etti§imizi varsayalm. Bu durumda temsil

etti§imiz ³ehre göre bu de§i³kenlere uygun de§erler vermemiz gerekir. Sözgelimi, stanbul ³ehrini temsil etmek için

isim

de§i³kenine stanbul,

1 29 de§erleri verilmelidir (“ekil 1.2). isim

enlem

de§i³kenine 41,

enlem

"Istanbul"

boylam

de§i³kenine

boylam

41

29

“ekil 1.2: “ehri temsil eden de§i³kenler ve örnek de§erler. Bir de§i³kene bir de§er verilmesi i³lemine atama denir ve sola bakan bir ok i³aretiyle gösterilir:

enlem ← 41.

2

Atama i³aretinin sol tarafna bir de§i³ken ad, sa§ tarafna bir deyim yazlr.

Deyim, bir de§er üreten bir hesaplama olarak tanmlanabilir. Bir deyim, tek bir de§er ya da bir de§i³ken olabilece§i gibi, bunlarn i³lemler ile çe³itli ³ekillerde ba§lanmalarndan da olu³abilir:

• 41:

yalnzca bir de§er

• boylam:

yalnzca bir de§i³ken

• 4 * boylam:

bir de§er ile bir de§i³kenin çarpma i³lemiyle ba§lanmas

• enlem + boylam:

iki de§i³kenin toplama i³lemiyle ba§lanmas

41 ← enlem atamasnn bir anlam i ← i + 1 atamas, i de§i³keninin de§erinin o anki de§erine göre bir

Atama i³lemi bir matematiksel e³itlik de§ildir. Örne§in yoktur. Benzer ³ekilde,

artrlmas demektir; yani de§eri bu i³lemden önce 5 ise, i³lemden sonra 6 olur. Oysa, bu bir e³itlik olsayd yanl³ olurdu (0 = 1).

Örnek. Takas Programlarda skça gerekebilen i³lemlerden biri, iki de§i³kenin de§erlerini kar³lkl de§i³tir-

say1 de§i³keninin de§eri 32 ve say2 de§i³keninin de§eri 154 ise bu i³lemsay1 de§i³keninin 154, say2 de§i³keninin de 32 de§erini almas istenir (“ekil 1.3).

mektir. Sözgelimi, den sonra

Takas i³lemini yapmak üzere ³u atamalarn kullanld§n dü³ünelim:

1

Burada kuzey enlemlerinin ve do§u boylamlarnn pozitif saylarla gösterildi§i varsaylm³tr. Güney enlem-

leri ve bat boylamlar negatif saylarla gösterilirse örne§in New York ³ehrinden söz edildi§inde New York,

2

boylam

de§i³keni -74,

enlem

de§i³keni 40 de§erini almaldr.

Bu i³lem için programlama dilleri genelde = ya da := i³aretini kullanrlar.

isim

de§i³keni

4

Veriler

sayi1

sayi2

32

154

(a) Önce sayi1

sayi2

154

32 (b) Sonra

“ekil 1.3: Takas i³lemi.

say1 ← say2 say2 ← say1 Birinci atama i³leminden (“ekil 1.4a) sonra

say1

de§i³keni 154 de§erini alr,

ninde ise bir de§i³iklik olmaz. kinci atama i³lemi (“ekil 1.4b) ise de§i³keninin o anki de§erini atad§ndan

say2

say2

say2

de§i³ke-

de§i³kenine

say1

de§i³kenine yine 154 de§eri atanr ve sonuçta

her iki de§i³ken de 154 de§erini alm³ olur (“ekil 1.4c).

sayi1

sayi2

32

154

(a) sayi1

sayi2

154

154

(b) sayi1

sayi2

154

154 (c)

“ekil 1.4: Takas i³lemi çözümü (hatal). ki atama i³leminin yetersiz oldu§u görülmektedir. Yaplmas gereken, de§i³kenlerin de§erlerini yitirmemek için, bir de§i³kenin de§erini ba³ka bir de§i³kende yedeklemektir:

ara ← say1 say1 ← say2 say2 ← ara

5

Giri³

ara de§i³keni 32 de§erini alr. kinci atamada (“ekil 1.5b) say2 de§i³kenine 32 de§eri atanr (“ekil 1.5d). Bu atamalardan sonra ara de§i³keninin de§erinin ne oldu§unun bir önemi Birinci atama (“ekil 1.5a) sonucunda

say1

de§i³kenine 154, üçüncü atama (“ekil 1.5c) sonucunda da

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)

“ekil 1.5: Takas i³lemi çözümü (do§ru). De§i³kenlerin, temsil ettikleri varl§a göre, bir tip leri vardr. Baz programlama yakla³mlarnda programcnn de§i³kenin hangi veri tipinden oldu§unu belirtmesi ³art ko³ulurken, bazlarnda de§i³kenin tipi, içinde kullanld§ ba§lamdan kestirilmeye çal³lr.

1.1.1

Taban Tipler

En sk kullanlan de§i³ken tipi saylardr. Örnekteki

enlem ve boylam de§i³kenleri duruma göre

birer tamsay ya da kesirli say olarak seçilebilir. Ço§u programda gerekecek temel veri tipleri ³unlardr:

tamsay

Bir insann do§um yl, soyadndaki harf says, boyunun santimetre cinsinden uzunlu§u, bir i³lemin kaç kere yapld§n sayan sayaç gibi bilgiler.

kesirli say Bir insann boyunun metre cinsinden uzunlu§u, iki snavdan alnan notlarn ortalamas, bir saynn karekökü gibi bilgiler.

6

Veriler

mantksal

Bir ö§rencinin bir dersten ba³arl olup olmad§, bir insann onsekiz ya³ndan büyük olup olmad§, kullancnn bast§ tu³un bir rakam tu³u olup olmad§ gibi bilgiler. Bu tipten de§i³kenler

Do§ru

ya da

Yanl³

3

de§erini alabilirler.

Birinin adnn ba³ har, programn çal³mas srasnda  Devam

simge

musunuz (E/H)?

etmek istiyor

sorusuna kar³lk hangi tu³a bast§, bir tarih bilgisinde gün, ay

ve yl arasna hangi i³aretin konaca§ (nokta, tire, bölü, vs.) gibi bilgiler. Simgeler ço§unlukla tek trnak i³aretleri içinde yazlrlar: 'E', ' ?', '4' gibi. Burada ayrm yaplmas gereken önemli bir nokta, rakamlar ile rakamlar gösteren i³aretleri birbirine kar³trmamaktr. Örne§in 5 rakam ile '5' simgesi farkl büyüklüklerdir (bkz. Ek A). katar

Bir insann ad, do§du§u ³ehir, bir kitabn ISBN numaras gibi bilgiler katarlarla temsil edilmeye uygundur. Katarlar ço§unlukla çift trnak içinde yazlrlar: Dennis Ritchie, 0-13-110362-8 gibi. Bir büyüklük bütünüyle rakamlardan olu³sa bile baz durumlarda say yerine katarla göstermek daha uygun olabilir. Bir de§i³kenin ancak üzerinde aritmetik bir i³lem yaplacaksa say tipinden olmas anlaml olur. Örne§in, stanbul Teknik Üniversitesi'nde ö§renci numaralar dokuz haneli tamsaylardr ancak bunlar tamsay olarak temsil etmenin bir anlam yoktur çünkü ö§renci numaralar üzerinde aritmetik i³lem yapmak gerekmeyecektir (iki ö§rencinin numaralarn toplamak ya da çarpmak gibi).

1.1.2

Kaytlar

Birden fazla büyüklü§ü ortak bir tip altnda toplarlar. Burada gruplanan büyüklükler ayn tipten ya da farkl tiplerden olabilir. Örne§in bir ³ehri temsil etmek üzere kullanlan üç büyüklük (³ehrin ismi, enlemi ve boylam) birle³tirilerek ³ehirleri gösterecek bir

kent

veri tipi olu³turu-

labilir. Bu veri tipinin biri bir katar (³ehir ismi), di§er ikisi de birer kesirli say olan (enlem

ba³kent de§i³keni tanmlanismi, ba³kent kentinin enlemi

ve boylam) üç alan olacaktr (“ekil 1.6a). Bu tipten diyelim bir d§nda, de§i³kenin alanlarna eri³mek için  ba³kent kentinin

gibi deyi³ler kullanlmaldr. Bu amaçla ço§unlukla noktal gösterilimden yararlanlr; örne§in

ba³kent de§i³keninin isim alanna Ankara de§erini atamak için ba³kent.isim ← Ankara yazlr (“ekil 1.6b). Kaytlar alan olarak ba³ka kaytlar da içerebilirler. Örne§in, bir yolu temsil için yolun kodu (katar), uzunlu§u (tamsay) ve ba³langç ve biti³ kentleri bilgileri kullanlabilir (“ekil 1.7). Eri³im, tek düzeyli kaytlara benzer ³ekilde yaplr (tem.son_kent.isim

tem.kod ← E-6 1.1.3

← Ankara

ve

gibi).

Diziler

Ayn tipten varlklardan olu³an bir grubu tek bir çat altna toplamak için kullanlrlar. Bir dizinin bütünü tek bir de§i³ken olarak de§erlendirilir. Örne§in 50 ö§rencili bir snfta bir snavdan alnan notlar i³lenece§inde, her bir ö§rencinin notunu göstermek üzere

· · ·, not50 3

gibi ayr ayr 50 tamsay de§i³ken tanmlanaca§na,

Bu de§erler örneklerde

D

ve

Y

³eklinde ksaltlacaktr.

notlar

not1, not2,

adnda 50 elemanl

7

Giri³

baskent kent

kent isim

isim

enlem

enlem

boylam

boylam

(a)

"Ankara"

(b)

“ekil 1.6: Kayt tipinden de§i³ken örne§i.

tem yol kod

uzunluk son_kent

ilk_kent isim

isim

enlem

enlem

boylam

boylam

“ekil 1.7: çiçe kaytlar tipinden de§i³ken örne§i.

8

Veriler

bir tamsay dizisi tanmlanabilir. Ayr ayr de§i³kenler bellekte da§nk bir yap olu³tururken dizinin elemanlar bellekte birbirini izleyen gözlere yerle³tirilir (“ekil 1.8).

not4

not13

not1

not22

notlar

1

2

3

50

“ekil 1.8: Dizi tipinden de§i³ken örne§i.

Elemanlar üzerinde i³lem yapmak için dizinin kaçnc elemanndan söz etti§inizi söylemeniz gerekir. Sözgelimi, 22. ö§rencinin ald§ not 95 ise yaplacak atama

4 gösterilir .

notlar22 ← 95

³eklinde

Katarlar ço§u programlama dilinde simge dizileri olarak görülürler; yani bir katar her bir eleman bir simge olan bir dizidir. Sözgelimi, birinin ad ve soyad

adsoyad

isimli bir de§i³-

kende tutulacaksa, bu de§i³ken simge dizisi tipinden olacaktr (“ekil 1.9). Örnekte

adsoyad7

büyüklü§ünün de§eri 'D',

adsoyad1

büyüklü§ünün de§eri ' ' (bo³luk) simgesidir.

adsoyad ’D’ ’e’ ’n’ ’n’ ’i’ ’s’ ’ ’ ’R’ ’i’ ... 1

2

3

4

5

6

7

8

9

10

“ekil 1.9: Katar tipinden de§i³ken örne§i.

Dizilerle kaytlar birlikte de kullanlabilir. Sözgelimi, bir saynn asal çarpanlarn temsil etmek üzere bir dizi kullanabiliriz (6776

= 23 ∗ 71 ∗ 112 ).

Dizinin her bir eleman bir asal çarpan

gösterir, her bir asal çarpan da bir taban ve bir üs de§erinden olu³tu§u için bir kaytla temsil edilir (“ekil 1.10). Elemanlara eri³im daha önce belirtilen kurallarda görüldü§ü gibi olacaktr:

ç arpanlar2 .taban ← 7 carpanlar taban

2

taban

7

taban

11

...

üs

3

üs

1

üs

2

...

1

2

3

“ekil 1.10: Kayt dizisi tipinden de§i³ken örne§i.

4

Bu i³lem için programlama dillerinde kö³eli ayraçlar kullanlr:

notlar[22]

gibi.

9

Giri³

Örneklerden de görülebilece§i gibi, bir dizinin bütünüyle temsil edilmesi için dizinin eleman de§erlerinin yansra kaç eleman oldu§u bilgisinin de bir ³ekilde tutulmas gerekir.

1.2

Algoritmalar

Algoritmalar göstermek için skça kullanlan yöntemlerden biri ak³ çizenekleridir. Ak³ çizeneklerinde ³u simgeler kullanlr:



Kutu: Bir i³lemi gösterir. Kutunun içine i³lemi anlatan bir komut yazlr.



Ok: Ak³ yönünü belirtir. Algoritmann bir sonraki admnn hangisi oldu§unu gösterir.



E³kenar dörtgen: Karar noktalarn gösterir. çine yazlan sorunun yantnn do§ru ya da yanl³ olmasna göre farkl bir yöne gidilmesini sa§lar.



Paralelkenar: Giri³/çk³ i³lemlerini gösterir.

Algoritmann tamam belirtilmi³se ak³ çizene§i kö³eleri yuvarlatlm³ kutular içinde bulunan ba³la komutuyla ba³lar ve dur komutuyla biter. Algoritmann tamam de§il, yalnzca ilgilenilen bir parças belirtilmek isteniyorsa çizenek bo³ bir yuvarlak ile ba³lar ve bo³ bir yuvarlak ile sona erer. Ak³ çizene§inin büyümesi ve topluca görülmesinin zorla³mas durumunda ak³ çizene§i parçalarnn ba³ndaki ve sonundaki yuvarlaklarn içine etiketler yazarak hangi parçann hangi parçaya nereden ba§land§ belirtilebilir. Algoritmalarn örnek de§erler üzerinde i³leyi³lerini daha kolay izleyebilmek amacyla tablolar kullanlabilir. Tablonun her bir satr algoritmann bir admna kar³ dü³er ve o admda çe³itli de§i³kenlerin ya da deyimlerin aldklar de§erlerin görülmesini sa§lar; yani de§i³kenler ve deyimler tablonun sütunlarn olu³turur.

Örnek. En Büyük Eleman Bulma Bir dizinin en büyük elemann bulma algoritmasn, 50 ö§rencili bir snfta bir snavdan alnan en yüksek notun bulunmas örne§i üzerinde inceleyelim. Bu i³i yapacak bir algoritma ³öyle yazlabilir:

1. Dizideki ilk notu en yüksek not olarak seç ve sray ikinci ö§renciye geçir. 2. Srada ö§renci varsa 3. adma, yoksa 5. adma git. 3. Sradaki ö§rencinin notu ³u ana kadarki en yüksek nottan büyükse bu yeni notu en yüksek not olarak seç. 4. Sray bir sonraki ö§renciye geçir ve 2. adma dön. 5. En yüksek notu bildir.

10

Algoritmalar

Daha çok gündelik dil kullanlarak yazlm³ bu algoritmay biçimsel olarak ifade edebilmek için ö§rencilerin notlarn 50 elemanl bir tamsay dizisi (bu de§i³kene

notlar adn verelim), o ana

kadar bulunmu³ en yüksek notu bir tamsay (max de§i³keni diyelim) ile ve sradaki ö§rencinin kaçnc ö§renci oldu§unu tutmak için bir sayaç (i de§i³keni) tanmlarsak:

1.

max ← notlar1 , i←2

2.

i ≤ 50

3.

notlari > max

4.

i ← i + 1

ise 3. adma, de§ilse 5. adma git. ise

max ← notlari

ve 2. adma dön.

5. en yüksek not:

max

Yukarda verilen algoritma örne§inin ak³ çizene§i “ekil 1.11'de görüldü§ü gibidir. 50 eleman yerine 6 elemanl bir dizide en büyük elemann bulunmas algoritmasnn i³leyi³i Tablo 1.1'de verilmi³tir (notlarn srasyla 43, 74, 65, 58, 82, 37 olduklar varsaylm³tr, sürme ko³ulu

i ≤ 6

³eklinde de§i³melidir).

basla

max ← notlar1 i←2

i ≤ 50

Y

D notlari > max Y

bas: max D dur max ← notlari

i←i+1

“ekil 1.11: En büyük eleman bulma algoritmasnn ak³ çizene§i.

Örnek. Say Tahmin Etme Arkada³nzn önceden aranzda kar³la³trd§nz iki snr arasnda bir tamsay tuttu§unu ve sizin bu sayy bulmaya çal³t§nz varsayn. Siz bir say söyledi§inizde arkada³nz, tuttu§u

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)

notlari > max D (74 > 43) Y (65 < 74) Y (58 < 74) D (82 > 74) Y (37 < 82)

Tablo 1.1: En büyük eleman bulma algoritmasnn örnek de§erlerle i³leyi³i.

say sizin söyledi§inizden büyükse büyük, küçükse küçük diyecek, do§ru sayy söyledi§inizde oyun sona erecektir. Bu oyunu oynarken nasl bir algoritma kullanrsnz? Kararla³trd§nz snr de§erlerinden küçük olann

taban,

büyük olann

tavan

isimli birer

de§i³ken ile gösterelim. Ayrca, biri arkada³nzn tuttu§u sayy temsil edecek (tutulan isimli),

di§eriyse sizin söyledi§iniz sayy temsil edecek (söylenen isimli) iki tamsay de§i³ken daha kullanalm.

Algoritma 1.

Alt snrdan ba³la, bulana kadar birer artrarak ilerle.

1.

söylenen ← taban

2.

söylenen = tutulan

3.

söylenen ← söylenen + 1

Algoritma 2.

ise buldun, dur ve 2. adma dön

Deneme aral§nn ortasndaki sayy söyle. Büyük derse deneme aral§n ³u

anki aral§n üst ksmna, küçük derse alt ksmna daralt. Bu algoritmay gerçeklemek için o anki deneme aral§nn alt ve üst snrlarn gösterecek iki yeni de§i³kene (alt ve

üst

diyelim) gerek duyulur.

1.

alt ← taban, üst ← tavan

2.

söylenen ← (alt + üst) / 2

3.

söylenen = tutulan

ise buldun, dur

4.

söylenen > tutulan

ise

üst ← söylenen - 1,

de§ilse

alt ← söylenen + 1

ve

2. adma dön. Bu algoritmann ak³ çizene§i “ekil 1.12'de verilmi³tir. Alt snrn 1, üst snrn 63 oldu§unu ve arkada³nzn 19 saysn tuttu§unu varsayarsak, her turda de§i³kenlerin aldklar de§erler Tablo 1.2'de görüldü§ü gibi olacaktr.

1.2.1

Algoritmalarn Kar³la³trlmas

Yukardaki örneklerde görüldü§ü gibi, ço§u zaman bir problemi çözmenin birden fazla yolu vardr. Ayn problemi çözen iki algoritmadan hangisinin daha iyi oldu§una karar vermek üzere algoritmalar iki özelliklerine göre kar³la³trlrlar:

12

Algoritmalar

basla

alt ← taban üst ← tavan

söylenen ← (alt + üst) / 2

söylenen = tutulan

D

bas: söylenen

Y

Y

söylenen > tutulan

alt ← söylenen + 1

D

dur

üst ← söylenen - 1

“ekil 1.12: Say tahmin etme algoritmasnn ak³ çizene§i.

alt 1 17 19

üst 63 31 23 19

söylenen 32 16 24 20 18 19

söylenen = tutulan Y (32 > 19) Y (16 < 19) Y (24 > 19) Y (20 > 19) Y (18 < 19) D (19 = 19)

Tablo 1.2: Say tahmin etme algoritmasnn örnek de§erlerle i³leyi³i.

13

Giri³

1. Hzlar: Hangi algoritma çözümü daha çabuk buluyor? Bu sorunun yant da iki durum için incelenir: (a) en kötü durumda (b) ortalama durumda Say bulma için verilen yukardaki iki algoritmay bu bakmdan kar³la³trrsak, birinci algoritmann örnek de§erlerle sayy en kötü durumda 63, ortalama durumda 32 denemede bulaca§ görülür. Oysa ikinci algoritma sayy en kötü durumda 6, ortalama durumda 5.09 denemede bulur. 2. Harcadklar yer: Hangi algoritma bellekte daha fazla yer kullanyor? Say bulma algoritmalarnda gördü§ümüz gibi, ikinci algoritma birinci algoritmann kullandklarna ek olarak iki de§i³ken daha gerektirmektedir.

Günümüzde bilgisayarlarn kapasiteleri eskiye oranla çok yükselmi³ oldu§u için harcanlan yer ölçütünün önemi göreli olarak azalm³tr. Yine de projenin boyutuna ve çal³lan ortamn yeteneklerine göre algoritma geli³tirirken hzn yansra harcanacak yerin de gözönüne alnmas gerekebilir. Algoritmalarn hzlarnn ve harcadklar yerlerin incelenmesi algoritma analizi dalnn konusudur. Bu dalda geli³tirilmi³ bulunan karma³klk kuram, benzer problemlerin çözümü için önerilen algoritmalarn kar³la³trlmasnda ba³vurulan en önemli araçtr.

1.3

Blok Yapl Programlama

Blok yapl programlamann temelinde blok kavram yatar. Blok, birbiriyle ili³kili komutlarn olu³turdu§u gruptur. Her algoritma birbirlerine çe³itli ³ekillerde ba§lanm³ bloklardan olu³ur. Bloklar ba§lamann üç yolu vardr:

Sra

Bloklarn yukardan a³a§ya do§ru yazldklar srayla yürütülürler (“ekil 1.13a). Sra yaps, komutlarn yazl³ sralarnn önemli oldu§unu vurgular. Bölüm 1.1'de görülen takas örne§i için verilen do§ru çözümde yaplan üç atama i³leminin sralar de§i³tirilirse varlacak sonuçlar yanl³ olabilir.

Seçim

Bir ko³ulun do§ru olup olmamasna göre farkl bir blo§un yürütülmesidir. Yani ko³ul

do§ruysa bir blok, yanl³sa ba³ka bir blok yürütülür (“ekil 1.13b). ki bloktan herhangi biri bo³ olabilir, yani ko³ul do§ruysa ³u blo§u yürüt, yanl³sa hiçbir ³ey yapma ³eklinde bir yap kurulabilir.

Yineleme

Belirli bir ko³ul sa§land§ sürece (ya da sa§lanana kadar) bir blok yinelenebilir.

Ak³ çizene§inden (“ekil 1.13c) görülebilece§i gibi, bu yapdan çklabilmesi için blo§un ko³ulu de§i³tiren bir komut içermesi gerekir, aksi durumda ko³ul ba³langçta do§ruysa hep do§ru olaca§ndan yapdan çklamayacaktr. Yine ak³ çizene§inden görülebilecek bir di§er özellik de, ko³ul ba³langçta yanl³sa blo§un hiç yürütülmeyece§idir. Baz uygulamalarda blok ko³uldan önce de yer alabilir (“ekil 1.12 böyle bir örnektir); böyle durumlarda ko³ul ba³tan yanl³ olsa bile blok en az bir kere yürütülür.

14

Soyutlama

D blok1

blok2

Y

kosul

kosul

blok1

blok2

Y

D blok

(a)

(b)

(c)

“ekil 1.13: Temel yaplarn ak³ çizenekleri.

Bu yaplarn ortak bir özelli§i, hepsinin bir giri³ ve bir çk³larnn olmasdr. Böylelikle bir blo§un çk³ öbür blo§un giri³ine ba§lanabilir; ba³ka bir deyi³le, bloklar ardarda eklenebilir. Ayrca, bir blo§un içinde ba³ka bir blok yer alabilir. “ekil 1.12'de ³uluyla belirlenen seçim yaps,

söylenen = tutulan

söylenen > tutulan

ko-

ko³uluyla belirlenen yineleme yapsnn

bir alt bile³eni durumundadr. Bir programn okunmasn ve anla³lmasn en çok zorla³tran etkenlerden biri programda yer alan dallanma komutlardr. “imdiye kadar yazd§mz baz algoritmalarda geçen n. adma git tipi komutlar için -programlama dillerinde genellikle

goto

olarak adlandrlan- bir komut

bulunmas gerekti§i dü³ünülebilir (özellikle yineleme yaplar için). Ancak blok yapl programlamada yineleme için özel yaplar vardr ve

1.4

goto

5

komutunun kullanlmamas özendirilir.

Soyutlama

Programlamann temel düzeneklerinden biri soyutlama kavramdr. Soyutlama, programn yapaca§ i³in daha küçük ve birbirinden olabildi§ince ba§msz alt-i³lere bölünmesidir. Alt-i³ler de, benzer ³ekilde, yapacaklarn alt-alt-i³lere bölebilirler (“ekil 1.14). Bu tip tasarma yukardan a³a§ya tasarm ad verilir.

6

Her i³ bir yordam (C dilindeki adyla fonksiyon ) tarafndan gerçeklenir. Ana-yordamn görevi, alt-i³leri gerçekleyen yordamlar ba³latmak ve bunlar arasnda e³güdümü sa§lamaktr. Bir üstyordam, kulland§ alt-yordamlarn nasl çal³tklaryla de§il, yalnzca sonuçlaryla ilgilenir. Soyutlamann kazandrdklar ³öyle özetlenebilir:



Bir i³i gerçekleyen yordam yazlrken, kulland§ alt-yordamlarn ayrntlaryla u§ra³lmaz; alt-yordamn do§ru çal³t§ varsaylarak yordamn kendi i³ine yo§unla³labilir. Böy-

5

Bu konuyla ilgili olarak, Edsger W. Dijkstra'nn Go To Statement Considered Harmful ba³lkl klasik

makalesini

6

http://www.acm.org/classics/oct95/

adresinde bulabilirsiniz.

Bu konuyla ilgili olarak, Niklaus Wirth'ün Program Development by Stepwise Renement ba³lkl 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

“ekil 1.14: Ana i³in alt i³lere bölünmesi.

lelikle büyük ve çözülmesi zor olan bir sorunla u§ra³mak yerine, her biri küçük ve çözülebilir sorunlarla u§ra³lr ve bunlar daha sonra biraraya getirilir.



Programn bakm kolayla³r. Alt-yordamlarn çal³malar birbirlerinden ba§msz oldu§undan bir alt-yordamda bir de§i³iklik yapld§nda bunu kullanan üst-yordam (üstyordamla olan etkile³im de§i³medi§i sürece) de§i³iklikten etkilenmez.

Yordamlar olabildi§ince genel amaçl yazlmaldr. Sözgelimi bir yordamn i³i BL105E dersini alan ö§rencilerin ylsonu snav notlarnn en büyü§ünü bulmak ³eklinde tanmlanabilir. Oysa i³i herhangi bir dizinin en büyü§ünü bulmak olarak tanmlanan bir yordam geli³tirmek ve bu yordam kullanrken hangi dizinin en büyü§ünün bulunmasnn istendi§i belirtmek daha etkin bir çal³ma biçimidir. Bu durumda hangi dizi üzerinde i³lem yaplaca§ bilgisi yordamn giri³ parametresi olur. Yordam, çal³mas sonucu üretti§i de§eri çk³ parametresi olarak döndürür. Örnekteki yordam kullanlrken giri³ parametresi olarak BL105E dersini alan ö§rencilerin ylsonu snav notlar verilirse snavda alnan en yüksek not, Los Angeles Lakers basketbol takmnn oyuncularnn ayakkab numaralar belirtilirse takmn en büyük ayakl oyuncusunun ayakkab numaras çk³ parametresi olur.

Örnek. En Büyük Ortak Bölen Bulma ki saynn en büyük ortak bölenini bulma i³i ³u ³ekilde alt i³lere bölünebilir:

1. Birinci sayy asal çarpanlarna ayr. 2. kinci sayy asal çarpanlarna ayr. 3. Saylarn ortak çarpanlarn belirleyerek en büyük ortak bölenin asal çarpanlarn bul. 4. Bir önceki admda belirledi§in asal çarpanlardan en büyük ortak böleni hesapla.

Saylarn 9702 ve 945 olduklar varsaylrsa:

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

4. en büyük ortak bölen: 63

1. ve 2. admlar için 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 i³i de bir alt-yordama verilebilir. 4. admda ortak çarpanlardan en büyük ortak bölenin hesaplanmas i³lemleri için alt-yordam kullanmann fazla bir anlam yoktur, ana yordama brakmak daha yerinde olur. Böylece “ekil 1.15'deki yap ortaya çkar. Örnek saylar üzerinde yordamlarn hangi giri³ ve çk³ parametreleriyle çal³tklar “ekil 1.16'da verilmi³tir.

1. sayi

en büyük ortak bölen 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 büyük ortak bölen hesaplama algoritmasnn yukardan a³a§ya tasarm. Asal çarpanlara ayrma algoritmasnda görülen bir sonraki asal sayy bulma i³i de asal çarpanlarna ayrma i³inin bir alt-i³i olarak dü³ünülerek bir ba³ka yordama braklabilir. Bu yordam kendisine parametre olarak gönderilen saydan bir sonraki asal sayy bularak sonucu geri yollayacaktr. Benzer ³ekilde bu yordam da bir saynn asal olup olmad§n snamak üzere ba³ka bir yordamdan yararlanmak isteyebilir. Bu örnek için verilen yordamlar gerçekleyecek algoritmalar bölümün sonundaki uygulamada verilmi³tir.

Örnek. Euclides Algoritmas Yukarda verilen algoritmann en önemli sorunu, özellikle büyük saylar asal çarpanlarna ayrmann zorlu§udur. Bilinen en eski algoritma örneklerinden biri olan Euclides algoritmas, iki saynn en büyük ortak böleninin çarpanlara ayrmadan hzl biçimde hesaplanmasn sa§lar. En büyük ortak böleni bulunacak saylardan büyük olanna

a,

küçük olanna

b

dersek:

17

Giri³

9702

en büyük ortak bölen 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 büyük ortak bölen hesaplama algoritmasnn i³leyi³i.

a = q 1 b + r1 ³eklinde yazlabilir. Burada ile

b

r1 = 0

ise iki saynn en büyük ortak böleni

saylarnn en büyük ortak böleni

b

ile

r1

b'dir.

De§ilse

a

saylarnn en büyük ortak bölenine e³ittir.

Dolaysyla, bölümden kalan 0 olana kadar a³a§daki e³itlikler yazlabilir:

b = q 2 r1 + r2 r1 = q 3 r 2 + r 3 ... rn−2 = qn rn−1 + rn rn−1 = qn+1 rn + rn+1 (rn+1 = 0) Bu durumda

a

ile

b'nin

en büyük ortak böleni

rn 'dir.

Yine

a = 9702, b = 945

örne§ini alrsak:

9702 = 10 ∗ 945 + 252 945 = 3 ∗ 252 + 189 252 = 1 ∗ 189 + 63 189 = 3 ∗ 63 + 0

a, küçük olann b r de§i³keninde tutarsak (kalan i³lemi %

Her denklem için en büyük ortak böleni alnacak saylardan büyük olann de§i³keninde, bu ikisinin bölümünden kalan de§eri de

i³aretiyle gösterilsin), bu algoritma bir yineleme yapsyla gerçeklenebilir. Bir bölme i³leminde

18

Soyutlama

her zaman kalan, bölenden küçük olaca§ için her yinelemede de

r'nin

de§erini alarak ilerlenir ve

b

a

de§i³keni

0 oldu§unda en büyük ortak bölen

a

b'nin, b

de§i³keni

de§i³keninde elde

edilmi³ olur. Bu algoritmann ak³ çizene§i “ekil 1.17'de, örnek de§erlerle i³leyi³i Tablo 1.3'de verilmi³tir.

7

D

sayi1 > sayi2

Y

a ← sayi1 b ← sayi2

a ← sayi2 b ← sayi1

b>0

Y

D

bas: a

r←a%b a←b b←r

“ekil 1.17: Euclides algoritmasnn ak³ çizene§i.

a 9702 945 252 189

b 945 252 189 63

r 252 189 63 0

Tablo 1.3: Euclides algoritmasnn örnek de§erlerle i³leyi³i.

Uygulama: Algoritmalar

Örnek. Asal Çarpanlarn Bulunmas

Herhangi bir saynn asal çarpanlarna ayrlmas için kullanlabilecek bir algoritma “ekil 1.18'de verilmi³tir. Bu algoritmada

7

x asal çarpanlarna ayrlacak sayy, c çarpan olup olmad§ o anda

Orijinal haliyle algoritmada bölmeden kalan i³lemi yerine çkartma i³lemi kullanlyordu. Bölmeden kalan

i³lemi algoritmann önemli ölçüde hzlanmasn sa§layan bir de§i³iklik olarak sonradan getirilmi³ bir yöntemdir.

19

Giri³

snanmakta olan asal sayy,

u da sradaki çarpann kuvvetini gösterir. 945 says örnek olarak

alnrsa algoritmann i³leyi³i Tablo 1.4'de verilmi³tir.

c←2

x>1

Y

D

x%c=0

Y

D c bir carpandir u←0

x%c=0

Y

D u←u+1 x←x/c

c ← sonraki asal sayi

“ekil 1.18: Bir sayy asal çarpanlarna ayrma algoritmas.

Örnek. Ortak Çarpanlarn Bulunmas

ki saynn çarpanlarndan en büyük ortak bölenin çarpanlarn bulma i³ini yapacak yordamn algoritmas geli³tirilirken, asal çarpanlara ayrma yordamnn çal³ma ³ekli nedeniyle çarpanlarn küçükten büyü§e do§ru sral olduklar varsaylabilir. Bu varsayma gören çal³an algoritma “ekil 1.19'da verilmi³tir. 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 gösterir. Her iki dizinin elemanlarna eri³mek için de srasyla i1 ve i2 sayaç de§i³kenleri kullanlm³tr. Örnek dizilerle algoritmann i³leyi³i Tablo 1.5'de verilmi³tir.

20

Soyutlama

x 945 315 105 35 7 1

2 3

x > 1 D (945 > 1) D (945 > 1)

5

D (35 > 1)

7

D

(7 > 1)

11

Y

(1 = 1)

c

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

u

3

0 1 2 3

5

0 1

7

0 1

Tablo 1.4: Asal çarpanlarna ayrma algoritmasnn i³leyi³i.

c1

c2

taban

1 2

3 3

2 < 3

2

3

2

7

1

11

3= 3

1

7 > 5

1 7

7= 7

5

us

carpan

2 < 3

3

2

1 < 2

7

1

-

Tablo 1.5: Ortak çarpanlar bulma algoritmasnn i³leyi³i.

21

Giri³

c1 ← carpanlar11, c2 ← carpanlar21 i1 ← 1, i2 ← 1

c1 ve c2 bos değil

Y

1

D

c1.taban < c2.taban

D

i1 ← i1 + 1 c1 ← carpanlar1i1

Y

c1.taban > c2.taban

D

i2 ← i2 + 1 c2 ← carpanlar2i2

Y

D

c1.us < c2.us

c1 bir carpandir

Y

c2 bir carpandir

i1 ← i1 + 1, i2 ← i2 + 1 c1 ← carpanlar1i1, c2 ← carpanlar2i2

“ekil 1.19: Ortak çarpanlar bulma algoritmas.

22

Giri³ / Çk³

1.5

Giri³ / Çk³

Bir programlama dilinin kullanlabilir olmas için dilde blok yapl programlamann kavramlarn desteklemenin d³nda baz gereklilikler de yerine getirilmelidir:

Giri³

Bir program her seferinde ayn veri de§erleri üzerinde çal³maz, i³leyece§i verileri çal³ma srasnda bir ³ekilde ö§renmesi gerekir. Bunun en sk kar³la³lan yöntemi verileri program kullanan ki³iye sormak olmakla birlikte verileri bir dosyadan okumak ya da ortamdan ö§renmek (sözgelimi odann scakl§n ölçen bir duyargadan almak) gibi seçenekler de bulunabilir. Programlama dillerinin girdi komutlar giri³ birimlerinden aldklar de§erleri de§i³kenlere aktarrlar. Aksi belirtilmedikçe standart giri³ birimi kullancnn tu³takmdr.

Çk³

Program, verilerin i³lenmesi sonucu elde etti§i sonuçlar bir ³ekilde de§erlendirmelidir.

En sk görülen yöntem sonucun kullancnn ekranna yazlmasdr ama giri³te oldu§u gibi sonuçlarn bir dosyaya yazlmas ya da ortama gönderilmesi (oda scakl§n denetleyen klimaya bir sinyal yollanmas gibi) sözkonusu olabilir. Programlama dillerinin çkt komutlar, de§i³ken de§erlerini istenen çk³ birimine yönlendirirler. Aksi belirtilmedikçe standart çk³ birimi kullancnn ekrandr. Programn çal³mas srasnda kar³la³lan hata durumlarnn bildirilmesi de çktnn bir parçasdr. Ancak, hatalarn daha kolay farkedilmelerini sa§lamak amacyla, bu iletilerin normal çkt iletilerinden ayrlabilmeleri istenir. Bu nedenle, hata iletileri hata birimine yönlendirilir. Aksi belirtilmedikçe bu birim -standart çk³ta oldu§u gibi- kullancnn ekrandr.

Bu notlarda i³lenecek örnek programlarda çal³ma hep ayn ³ekilde olacaktr: verilerin girilmesi, i³lenmesi, sonuçlarn gösterilmesi. Bu tip programlara konsol program, komut satr program ya da metin kipi program gibi adlar verilir. Grak arayüzle çal³an programlar ise olaya dayanan bir mantkla çal³rlar. Program çal³maya ba³lad§nda kullancyla ileti³imi için gerekli arayüzü kurar (pencere çizer, menü olu³turur, dü§me koyar, v.b.) ve sonra kullancnn bir edimde bulunmasn bekler. Kullancnn edimine göre ilgili yordamlar çal³trr.

1.6

Program Geli³tirme

Bir programn geli³tirilmesi çe³itli a³amalardan olu³ur:

Tasarm

Bu a³amada yazlacak program ka§t üzerinde tasarlanr. Yani programn algorit-

masna, hangi programlama dilinin kullanlaca§na, kullancyla nasl bilgi al³veri³inde bulunulaca§na, ksacas neyin nasl yaplaca§na karar verilir. Dikkatli bir tasarm, programn hem geli³tirilmesinde hem de bakmnda büyük kolaylklar sa§lar.

Kodlama

Bu a³amada program tasarm srasnda verilen kararlara göre bir programlama di-

8 Kaynak kodunu bilgisayar

liyle yazlr. Bunun sonucunda yazlmn kaynak kodu olu³ur.

ortamnda olu³turmak için editör ad verilen yazlmlar kullanlr.

8

Metinde bunda sonra geçen

kod

sözcü§ü aksi belirtilmedikçe kaynak koduna kar³ dü³ecektir.

23

Giri³

Snama

Bu a³amada program çal³trlarak çe³itli senaryolar için do§ru sonuçlar üretip üret-

medi§ine, beklendi§i gibi davranp davranmad§na baklr. Bu i³lemin etkinli§i gözönüne alnan senaryolarn gerçekte olu³abilecek durumlarn ne kadarn örttü§üyle ba§lantldr.

Hata Ayklama

Bu a³amada snama a³amasnda bulunan hatalarn nedenleri belirlenerek

gerekli düzeltmeler yaplr. Programlarn ilk yazldklar ³ekliyle do§ru olmalar neredeyse olanakszdr. Hatta üstüne çok çal³lm³, pek çok hatas bulunup düzeltilmi³ programlarda bile bütün hatalarn bulunup düzeltilmi³ olmas son derece dü³ük bir olaslktr. Ayrca programlara yeni yetenekler eklendikçe yeni hatalar olu³aca§ndan a³a§ yukar hiçbir program hiçbir zaman tam olarak hatasz olmayacaktr. Hata ayklama i³lemine yardmc olmak üzere hata ayklayc ad verilen yazlmlar kullanlr.

Programlarda iki tür hata sözkonusu olabilir:

1. Yazm hatalar: Programcnn yazd§ baz komutlar kulland§ programlama dilinin kurallarna uymuyordur. 2. Mantk hatalar: Programcnn yazd§ kod dilin kurallar açsndan do§rudur ama çal³trlmasnda sorun çkar. Sözgelimi bir tamsayy ba³ka bir tamsay de§i³kene bölmek geçerli bir i³lemdir ama bölen say 0 olursa bu i³lem gerçekle³tirilemez. Bu tür hatalara çal³ma-zaman hatas da denir.

1.6.1

Programlarn De§erlendirilmesi

Bu a³amalar sonucunda ortaya çkan bir programn iyi bir program olup olmad§nn, ya da ne kadar iyi bir program oldu§unun de§erlendirilmesinde ³u ölçütlere ba³vurulur:

Etkinlik

Bu konu algoritmalarn kar³la³trlmalarnda kullanlan ölçütlerle ayndr. Program

ne kadar hzl çal³yor? Düzgün kullanlabilmesi için ne kadar sistem kayna§ gerekiyor (hangi i³lemci, ne kadar bellek, ne kadar disk, v.b.?).

Sa§lamlk

Program, kullancnn yapaca§ kullanm hatalarna kar³ dayankl m? Sözgelimi,

kendisine bir yl bilgisi soruldu§unda kullanc yanl³lkla (ya da kötü niyetle) bir isim yazarsa ne oluyor?

Ta³nabilirlik

Program, üzerinde fazla de§i³iklik yaplmas gerekmeden, ba³ka bir donanm

ve ba³ka bir i³letim sistemi üzerinde çal³acak hale getirilebiliyor mu?

Anla³labilirlik

Ba³ka biri program okudu§unda anlayabilecek mi? Hatta üstünden bir süre

geçtikten sonra kendiniz bakt§nzda anlayabilecek misiniz?

Bakm kolayl§

Programda hata oldu§unda hatann kayna§nn belirlenmesi ve düzeltilmesi

kolay m?

Geli³tirilebilirlik

Program yeni yeteneklerin eklenmesiyle geli³tirilmeye açk m? Bu tip ek-

lemelerin yaplmas kolay m?

Program Geli³tirme

24

Geli³tirme a³amalarnda daha az sorunla kar³la³mak ve daha kaliteli yazlmlar üretmek için çe³itli yöntemler geli³tirilmi³tir. Bu yöntemlerin temel fark, problemin nasl modellenece§ine ili³kin yakla³mlardr. Blok yapl yakla³m, nesneye dayal yakla³m, fonksiyonel yakla³m gibi yöntemler çe³itli alanlarda yaygn olarak kullanlmaktadr. Seçti§iniz programlama dili hangi programlama yakla³mn kullanaca§nz da belirler. Sözgelimi C dili blok yapl, Java dili nesneye dayal, Haskell diliyse fonksiyonel dillerdir. C++ dili hem blok yapl hem de nesneye dayal özellikler gösteren karma bir dildir.

1.6.2

Programlarn Çal³trlmas

Bilgisayarlarn çal³tracaklar programlarn belli bir biçimi olmas zorunludur. Bu biçim, bilgisayardan bilgisayara ve i³letim sisteminden i³letim sistemine göre farkllklar gösterir. Sözgelimi, bir ki³isel bilgisayar üzerinde Windows i³letim sisteminde çal³an bir program, Sun marka bir i³istasyonunda Solaris i³letim sisteminde çal³maz. Hatta, yine ayn ki³isel bilgisayar üzerinde Linux i³letim sisteminde de çal³maz. Programlarn bu çal³trlabilir biçimine makina kodu ad verilir. Makina kodu, insanlarn anlamas ve üzerinde çal³mas son derece zor bir

biçim oldu§undan programclar programlar do§rudan bu kod ile yazmazlar. nsann anlamas daha kolay (insan diline daha yakn) yüksek düzeyli bir dil ile kaynak kodunu olu³turup yardmc yazlmlar aracl§yla makina koduna çevirir ve çal³trrlar. Kaynak kodunun makina koduna çevrilmesi ve çal³trlmas i³lemi üç farkl yakla³mla gerçekle³tirilebilir:

Yorumlama

Programn komutlar bir yorumlayc tarafndan teker teker okunur, makina

koduna çevrilir ve çal³trlr. Yani yorumlayc, önce birinci komutu okur, makina koduna çevirir ve çal³trr. Sonra ikinci komutu alr ve ayn i³lemleri yapar. Programn her çal³masnda çevirme i³lemi yeniden yaplr. Herhangi bir komutun çevrilmesinde ya da çal³trlmasnda bir hatayla kar³la³t§nda bunu kullancya bildirir ve çal³may durdurur. Basic, Perl, Tcl gibi diller genellikle yorumlayclar aracl§yla kullanlrlar.

Derleme

Program bir derleyici tarafndan bir bütün halinde okunur ve makina koduna çev-

rilerek bir çal³trlabilir dosya olu³turulur. Bu dosya daha sonra istendi§i zaman çal³trlr, yani çevirme ile çal³trma i³lemleri birbirinden ayrlr. Böylelikle çevirme i³lemi yalnzca bir kere yaplr. Herhangi bir komutta hata varsa çevirme i³lemi tamamlanmaz, yani çal³trlabilir kodun olu³mas için hiçbir yazm hatas olmamas gerekir; ancak program daha sonra çal³trlrken çal³ma-zaman hatalaryla kar³la³labilir. Fortran, Pascal, C gibi diller genelde derleyicilerle kullanlrlar.

Karma

Hem derleme hem de yorumlama tekni§i kullanlr. Bu tip çal³mada kaynak kodu

sanal bir bilgisayarn makina koduna (bytecode) çevrilir ve daha sonra bu sanal bilgisayar gerçekleyen bir program yardmyla yorumlanarak çal³trlr. Örne§in Java dilinde yazlm³ bir kaynak kodu önce Java derleyicisinden geçirilerek Java sanal makinasnn (Java Virtual Machine - JVM) makina koduna dönü³türülür; sonra da bu sanal makinay gerçekleyen bir Java çal³ma ortam (Java Runtime Environment - JRE) yardmyla çal³trlr.

Yorumlama yönteminde kodun okunmas ve çevrilmesi programn çal³mas srasnda yapld§ndan hz dü³üktür. Ayrca yorumlayc yalnzca kar³la³t§ ilk hatay rapor edebilir. Bu

25

Giri³

hata düzeltildi§inde sonraki çal³mada da program ancak bir sonraki hataya kadar ilerleyebilir. Oysa derleyici kaynak kodundaki bütün hatalar bulabilir. Buna kar³lk hata ayklama i³lemi yorumlayclarla daha kolaydr. Ayrca derleyicilerle gelen baz snrlamalarn kalkmas nedeniyle daha esnek bir çal³ma ortam sa§lanr. Son yllarda iki yöntemin üstün yanlarn birle³tiren karma diller (Java ve Python gibi) öne çkmaya ba³lam³lardr.

1.6.3

Kitaplklar

Bir programcya gerekebilecek her ³eyi programlama dilinin içine almak o dili i³leyecek araçlarn hantalla³malarna neden olur. C dili bu nedenle oldukça küçük bir dil olarak tasarlanm³tr. Örne§in basit aritmetik i³lemlerin ötesindeki matematik i³lemleri dilin tanm içinde yer almaz; sözgelimi karekök alma i³lemi için bir C komutu yoktur. Bununla birlikte, pek çok programcnn bu tip i³lemlere gereksinim duyacaklar da açktr. Böyle bir durumda programc, isterse karekök alma i³lemini yapacak kodu kendisi yazabilir. Ancak programcnn bu tip i³lemler için kendi kodlarn yazmasnn önemli sakncalar vardr:

1. Her programcnn ayn i³leri yapan kodlar yazmas büyük zaman kaybna yol açar. 2. Programcnn yazaca§ kod hatal olabilir, yani yanl³ sonuç üretebilir. Ya da do§ru sonuç üretse bile, yeterince etkin olmayabilir, yani i³lemi yapmak için gere§inden fazla zaman ya da sistem kayna§ harcayabilir.

Hem dilin tanmn küçük tutmak hem de bu sakncalar giderebilmek için, ço§u programcya gerekebilecek i³lemler (yordamlar) kitaplk ad verilen ar³ivlerde toplanm³tr. Bir saynn karekökünü almak isteyen bir programc matematik kitapl§ndaki

sqrt

yordamn kullanabi-

lir. Kitapl§n kullanlmas yukarda sözü geçen sakncalar giderir, yani programcya zaman kazandrd§ gibi, do§ru ve etkin çal³t§ snanm³ oldu§undan dikkatini programn di§er ksmlarna yo§unla³trma frsat verir.

1.6.4

Standartlar

C dilinin geli³tirilmesinde gözetilen ana hedeerden biri ta³nabilirlikti. Bunun için de§i³ik ortamlardaki araçlar arasnda bir standart olmas gerekti§i açktr. C dilinde yaplan standartla³ma çal³malar sonucunda olu³an ANSI C standard, hem C dilinin kurallarn belirler, hem de bir C geli³tirme ortamnda bulunmas zorunlu olan standart kitaplklar ve bu kitaplklarda yer alacak yordamlar tanmlar. Uluslararas Standartlar Organizasyonu'nun (ISO) C++ dili için hazrlad§ ISO-C++ standard da son yllarda yazlm³ bütün C/C++ geli³tirme ortamlar için en temel kaynaklardan birini olu³turmaktadr. Di§er önemli bir standart olan POSIX standard ise programlama dili ile i³letim sistemi arasndaki ba§lantlar belirler. Örne§in dosya silmek, dosya ad de§i³tirmek, sistemdeki ba³ka bir programla haberle³mek gibi i³lemler için gereken yordamlar bu standartta yer alrlar. Yine de skça gereksinim duyulan bütün i³lemler için bütün kitaplklarda bir standart henüz sa§lanamam³tr. Örne§in grak bir arayüze sahip uygulamalardaki grak i³lemlerini yapacak kitaplklar standartla³trlmam³ oldu§undan çe³itli rma ve kurumlar bu i³lemleri yapan farkl

26

Program Geli³tirme

kitaplklar geli³tirmi³lerdir. Dolaysyla bu kitaplklar kullanlarak yazlan programlar tam anlamyla ta³nabilir olmamakta, yalnzca bu kitapl§n destekledi§i ortamlara ta³nabilmektedir. Son zamanlarda farkl i³letim sistemlerinde çal³abilen grak kitaplklar yaygnla³t§ için do§ru araçlar seçildi§inde bu sorunun da üstesinden gelinebilmektedir.

1.6.5

Derleme A³amalar

Kaynak koddan üretilecek olan çal³trlabilir 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 a³amada gerçekle³ir (“ekil 1.20):

derleme kaynak kodu

baglama ara kod

çalistirilabilir kod

kitapliklar

“ekil 1.20: Tek kaynak kodlu projelerin derleme a³amalar.

Derleme

lk a³amada kaynak kodu derlenerek bir ara koda dönü³türülür. Bu kod, kullancnn

yazd§ yordamlarn makina kodu kar³lklarn içeren bir dosyadr. Ancak, programcnn kullanm³ oldu§u kitaplk yordamlarn içermedi§inden henüz çal³trlabilir durumda de§ildir.

Ba§lama

kinci a³amada ara kod ile programcnn kulland§ kitaplk yordamlar arasnda

ba§lantlar kurulur ve çal³trlabilir dosya üretilir. Sözgelimi, programc karekök alma için matematik kitapl§ndaki bir yordam kullandysa, ba§layc ara kodda karekök yordamnn kullanld§ yerlerde gerekli düzenlemeleri yapar.

Sorular 1. Bölüm 1.1'de verilen takas i³lemi için yazlan üç atama komutunun sralarn de§i³tirerek ne sonuçlar elde edildi§ini belirleyin. Problemin kaç do§ru çözümü vardr? 2. Bölüm 1.2.1'de yaplan algoritma hz kar³la³trmalarnda verilen en kötü ve ortalama

n - 1 ³eklinde verildi§i genel

durum de§erlerini kendiniz çkarn. Alt snrn 1, üst snrn 2 durumda en kötü ve ortalama de§erleri

n

cinsinden hesaplayn.

3. ki saynn en büyük ortak bölenini hesaplamak için verilen iki algoritmay, basitlik ve etkinlik açlarndan kar³la³trn. kiden fazla saynn en büyük ortak bölenlerini hesaplamak için bir algoritma geli³tirin.

27

Giri³

a say2 de§erleri atanarak yineleme yapsna girildi§ini say1 > say2 ya da say1 < say2 olmas durumlarnda al-

4. Euclides algoritmasnda iki saydan büyük olannn hangisi oldu§una baklmakszn de§i³kenine

say1, b

de§i³kenine

varsayalm. Ba³langçta

goritma do§ru sonuç üretir mi? 5. Çarpanlara ayrarak en küçük ortak kat hesaplamak için gereken en küçük ortak katn çarpanlarn bulma yordamnn ak³ çizene§ini çizin ve örnek de§erler üzerinde nasl i³leyece§ini gösteren tabloyu olu³turun.

Program Geli³tirme

28

Bölüm 2 C Diline Giri³

Bu bölümde de§i³kenler, atama, deyimler, giri³-çk³ gibi konularn C dilinde nasl gerçeklendikleri üzerinde durulacaktr.

Örnek 1. Daire Çevresi ve Alan Yarçapn kullancdan ald§ bir dairenin çevresini ve alann hesaplayarak ekrana yazan bir program yazlmas isteniyor. Programn örnek bir çal³masnn ekran çkts “ekil 2.1'de verilmi³tir.

Yarçap yaznz: 4.01 Çevresi: 25.1828 Alan: 50.4915

“ekil 2.1: Örnek 1 ekran çkts. Örnek üzerinde bir C programnn baz temel özelliklerini görelim:

Açklamalar

Anla³labilirli§i artrmak için kodun içinde gerekli yerlere açklamalar yazmakta

büyük yarar vardr. Özellikle kolayca anla³lmayacak programlama tekniklerinin kullanld§ kod parçalarnn açklanmas gerekir. Açklamalar derleyici tarafndan gözard edilir, yani programn i³leyi³lerine hiçbir etkileri yoktur. Kodun içine açklama iki ³ekilde yazlabilir:



Birinci yöntemde, açklamann ba³na bölü-yldz, sonuna yldz-bölü simgeleri konur. Bu ³ekildeki açklamalar birden fazla satr sürebilir. Örnekteki birinci açklama birinci satrdaki  lk  alann

hesaplar.

C programm

sözcükleriyle ba³lar ve üçüncü satrdaki

sözcükleriyle biter. Bu tip açklamalar içiçe yazlamaz, yani

bir açklamann içinde ikinci bir açklama olamaz. çiçe açklamalar ³u ³ekilde bir yap olu³turur:

...a... /* ...b... /* ...c... */ ...d... */ ...e... 29

30

Örnek 1 Bir dairenin çevresini ve alann hesaplayan program.

/* lk C programm. * * * * Yarçap verilen bir dairenin çevresini ve alann hesaplar. */ #include #include

// cout,cin,endl için // EXIT_SUCCESS için

using namespace std; #define PI 3.14 int main(void) { float radius; float circum, area;

}

cout > radius; circum = 2 * PI * radius; area = PI * radius * radius; cout i³aretleriyle belirtilebilir. Sözgelimi, iki tane say de§eri okunacak ve kullancnn yazd§ birinci saynn de§eri

num1,

ikinci saynn de§eriyse

num2

de§i³kenine aktarlacaksa:

cout < < Saylar yaznz: ; cin > > num1 > > num2; gibi bir program parças kullanlabilir. Bu örnekte kullancnn saylar yazarken aralarnda bir bo³luk brakmas gerekir. Çk³ birimlerine katarlar ya da deyimler gönderilebilir. Katarlar olduklar gibi yazlrken deyimlerin de§erleri görüntülenir. Örnekteki

cout < < Alan:  < < area < < endl; komutu ekrana önce

Alan:  katarn, daha sonra area de§i³keninin de§erini yazar ve yeni circum ve area de§i³kenleri tanmlanmadan ve atama komutlar

satra geçer. Programda

kullanlmadan çkt i³lemleri

cout < < Çevresi:  < < 2 * PI * radius < < endl; cout < < Alan:  < < PI * radius * radius < < endl; komutlaryla da yaplabilirdi.

Uygulama: Geli³tirme Ortam Bu uygulamada basit giri³/çk³ i³lemlerine ve matematik kitapl§nn kullanmna örnek verilmesi istenmektedir. Grak bir editör (kate) tantlacak ve C derleyicisinin nasl kullanlaca§

10

ö§retilecektir. Basit hatalarda derleyicinin hangi mesajlar üretti§i gözlenecektir.

Örnek 2. Formül Hesab

y = e−πx

formülünde

x

de§erini kullancdan alarak

y

de§erini hesaplayan ve ekrana yazdran

bir program yazlmas isteniyor.



Örnekte verilen program yazn, derleyin ve çal³trn.

y'nin

x

için 0.002 de§erini verdi§inizde

ald§ de§eri gözleyin.

• PI de§i³mezinin tanmn 3.14 yerine 3.14159 olarak verin ve ayn x de§erinde y'nin ald§ de§eri gözleyin.

• 10

De§i³ken tanmlarnn yapld§

Unix i³letim sistemlerinde derleme a³amalar ile ilgili bilgi için bkz. Ek B.2.

43

C Diline Giri³

Örnek 2 y = e−πx

formülünü hesaplayan program.

#include #include #include

// cout,cin.endl // EXIT_SUCCESS // exp

using namespace std; #define PI 3.14 int main(void) { float x, y; cout > x; y = exp(-PI * x); cout = 18) && (age < 65) •

VEYA i³lemi:

||

i³leciyle gerçeklenir. Ba§lad§ ko³ullarn hepsi yanl³sa yanl³, en az

biri do§ruysa do§ru de§erini üretir (bkz. Tablo 3.3).

ko³ul1

ko³ul2

(ko³ul1) || (ko³ul2)

do§ru

do§ru

do§ru

do§ru

yanl³

do§ru

yanl³

do§ru

do§ru

yanl³

yanl³

yanl³

Tablo 3.3: VEYA i³leminin do§ruluk tablosu.

Örnek

Ya³ 18'den küçük veya 65'den büyük veya e³it:

(age < 18) || (age >= 65)

Örnek

Bir yln artk yl olup olmad§n belirleyen ko³ul deyimi. Sonu 00 ile biten (100'e

kalansz bölünen) yllar d³ndaki yllar 4 saysna kalansz bölünüyorlarsa artk yl olurlar. Sonu 00 ile bitenler ise 400 saysna kalansz bölünüyorlarsa artk yldrlar. Bunlarn d³nda kalan yllar artk yl de§ildir. Sözgelimi, 1996, 2000, 2004 ve 2400 yllar artk yldr ama 1997, 2001, 1900 ve 2100 yllar artk yl de§ildir.

((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) Ayraçlar kullanlmad§nda mantksal i³leçlerin öncelikleri yüksek öncelikliden ba³layarak DE‡L, VE, VEYA srasyladr. Buna göre yukardaki örnek

(year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0) ya da

1

Aslnda burada kar³la³trlan bu iki simgenen ASCII kodlamasndaki sralardr.

50

Seçim

(year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0) biçiminde de yazlabilirdi.

3.2

2

Seçim

C dilinde seçim yaplar, alyorsa

if

if/else

bloklaryla gerçeklenir. Verilen ko³ul deyimi do§ru de§erini

ile ba³layan blok (blok1), yanl³ de§erini alyorsa

else

ile ba³layan blok (blok2)

yürütülür:

if (ko³ul ) { blok1 ; } else { blok2 ; } Örnekte içiçe iki seçim yaps vardr. çteki seçim yaps ³u ³ekildedir:

if (disc == 0) { x1 = -b / (2 * a); cout < < x1 < <  noktasnda çak³an iki kök var. < < endl; } else { x1 = (-b + sqrt(disc)) / (2 * a); x2 = (-b - sqrt(disc)) / (2 * a); cout < < x1 < <  ve  < < x2 < <  noktalarnda iki gerçel kök var. < < endl; } Burada

disc de§i³keninin de§eri 0 ise çak³k köklerle ilgili i³lemler yaplr (iki komuttan olu³an

bir blok); de§ilse farkl iki gerçel kök bulunmas durumundaki i³lemler yaplr (üç komuttan olu³an bir blok). Seçim yaplarnda bir

else

blo§u bulunmas zorunlu de§ildir, yani yap

if (ko³ul ) { blok ; } 2

Birden fazla ko³uldan olu³an mantksal deyimler de§erlendirilirken sonuç belli oldu§u zaman deyimin geriye

kalan hesaplanmaz. Örne§in

(year % 4 == 0) && (year % 100 != 0) (year % 4 == 0) ko³ulu yanl³ de§erini verirse deyimin (year % 100 != 0) ko³ulu snanmaz. Benzer ³ekilde

deyiminde §ndan

geri kalanna baklmaya gerek kalmayaca-

(year % 4 == 0) || (year % 100 != 0) deyiminde

(year % 4 == 0)

ko³ulu do§ru de§erini verirse yine ikinci ko³ul snanmaz.

51

Ak³ Denetimi

³eklinde olabilir. Bu durumda ko³ul do§ruysa blok yürütülür, de§ilse hiçbir ³ey yaplmaz. Bir blok tek bir komuttan olu³uyorsa blo§un süslü ayraçlar ile snrlanmas zorunlu de§ildir. Örnekteki d³ seçim yapsnda dikkat edilirse ko³ulun do§ru olmas durumunda yürütülecek blokta süslü ayraçlar kullanlmam³tr:

if (disc < 0) cout < < Gerçel kök yok. < < endl; else { ... ... ... } Burada istenseydi birinci blok da süslü ayraçlarla belirtilebilirdi:

if (disc < 0) { cout < < Gerçel kök yok. < < endl; } else { ... ... ... } Gelenek olarak tek komutlu bloklarda süslü ayraçlar kullanlmaz, yani örnek programda kul- Gelenek lanlan yazl³ ³ekline uyulur. Ancak bu durumda süslü ayraç kullanlmayan blo§un tek komut içermesine çok dikkat etmek gerekir. Di§er bir gelenek de, ko³ulun do§ru ya da yanl³ olmasna göre yürütülecek bloklardan biri di§erine göre çok ksaysa, ksa olan blok üste gelecek (ko³ulun do§ru olmas durumunda yürütülecek) ³ekilde düzenlenmesidir. Örnekte bu gelene§e uyulmam³ olsayd d³ seçim yaps ³u ³ekilde yazlabilirdi:

if (disc >= 0) { ... ... ... } else cout < < Gerçel kök yok. < < endl; Seçim ve ileride görülecek yineleme yaplar bir bütün olarak tek bir komut olarak de§erlendirilirler. Dolaysyla bir blokta yer alan tek yap ba³ka bir seçim ya da yineleme blo§uysa süslü ayraçlarn kullanlmas zorunlu de§ildir. Yani ³u blok

if (ko³ul1 ) { if (ko³ul2 ) blok ; }

52

Seçim

³u ³ekilde de yazlabilir:

if (ko³ul1 ) if (ko³ul2 ) blok ; Süslü ayraçlar kullanlmad§nda içiçe

if / else

yaplarnda belirsizlikler olu³abilir. Girinti-

lenmeden yazlm³ ³u örne§e bakalm:

if (ko³ul1 ) if (ko³ul2 ) blok1 ; else blok2 ; Burada

blok2

hangi ko³ul sa§lanmazsa yürütülecektir? C dilinin bu konudaki kural

kendinden önce gelen son

ko³ul2

if

ko³uluna ba§land§dr, yani örnekte

blok2 , ko³ul1

else'in

do§ru ve

yanl³sa yürütülür. Do§ru bir girintilemeyle yazlrsa

if (ko³ul1 ) if (ko³ul2 ) blok1 ; else blok2 ; Yine de kar³kl§a neden olmamas için böyle durumlarda süslü ayraçlar kullanmak daha do§rudur. DKKAT

Herhangi bir aritmetik deyim ko³ul de§eri olarak de§erlendirilebilir; deyimin sonucu 0 ise yanl³, 0'dan farkl ise do§ru oldu§u varsaylr. Buna göre, sözgelimi 8 - 2 deyimi do§ru, 8 - 2 * 4 deyimiyse yanl³ bir ko³ul olarak de§erlendirilir. Bu davran³ özellikle e³itlik kar³la³trmalarnda hataya yol açabilir. En sk yaplan C hatalarndan biri bir e³itlik kar³la³trmasnda yerine

=

==

i³areti kullanlmasdr.

age = 12; ... ... if (age = 18) blok1 ; else blok2 ; Yukardaki programda ko³ulun snanmas srasnda e³itlik i³lemi de§il atama i³lemi belirtildi§inden

age

de§i³kenine 18 atanr, deyimin de§eri 18 olarak bulunur ve 0'dan farkl oldu§u

için do§ru saylarak de§i³mez ve

blok2

blok1

yürütülür. Oysa

yürütülürdü.

==

simgesi kullanlsayd

age

de§i³keninin de§eri

53

Ak³ Denetimi

3.2.1

Ko³ullu ³leç

Ko³ullu i³leç, bir ko³ulun gerçekle³ip gerçekle³memesine göre iki deyimden birini seçer.

deyim1 ? deyim2 : deyim3 Burada öncelikle

deyim1

de§erlendirilir. Sonuç do§ruysa

deyim2 ,

yanl³sa

deyim3

seçilir.

Basit bir örnekle, iki saydan küçü§ünü seçmek için ³öyle bir kod kullanlabilir:

if (x < y) z = x; else z = y; Ayn i³lem ko³ullu i³leç kullanlarak ³öyle de yazlabilirdi:

z = x < y ? x : y; Adndan da anla³labilece§i gibi, ko³ullu i³leç bir i³leçtir, yani birtakm büyüklükler üzerinde bir i³lem yapar ve belli bir tipten bir sonuç üretir. Bir seçim yaps de§ildir, yani programn ak³nn nasl devam edece§i üzerinde bir etki yaratmaz; ak³ bir sonraki komutla devam eder.

Örnek 4. ³lem Seçimi ³lemi ve i³lenenleri kullancnn belirtti§i hesaplamay yaparak sonucu ekrana yazan bir program yazlmas isteniyor. Programn örnek bir çal³masnn ekran çkts “ekil 3.2'de verilmi³tir.

³lemi yaznz: 18 / 5 18/5 i³leminin sonucu: 3

“ekil 3.2: Örnek 4 ekran çkts.

3.3

Çoklu Seçim

Bir deyimin çok sayda de§er içinden hangisini alm³ oldu§unu snamak istiyorsak yazaca§mz

if

kodu uzun ve çirkin bir görünüm alr. Örne§imizde yaplacak i³lemin hangisi oldu§unu

anlamak için yazlacak

if

if (op == '+') { ... } else {

kodu ³u tip bir ³ey olurdu:

54

Çoklu Seçim

Örnek 4 Kullancnn belirtti§i i³lemi yapan program. #include #include

// cin,cout,endl // EXIT_SUCCESS

using namespace std; int main(void) { int num1, num2, result; char op;

}

cout > num1 >> op >> num2; switch (op) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; case '%': result = num1 % num2; break; default: cout = 0; j--) cout < < y[j]; 3.

x ve m saylar aralarnda asalsa x saysnn m saysna göre evri§i r says, xr = 1 mod m e³itli§ini sa§layan saydr (r < m). Örne§in, x = 5 ve m = 7 ise r = 3 olur. Buna göre, kullancdan ald§ x ve m saylarna göre r de§erini hesaplayan ve ekrana çkartan bir program yazn. x = 8, m = 11 de§erleri için programnzdaki de§i³kenlerin alacaklar de§erleri bir çizelge halinde gösterin.

4. Kusursuz bir say, kendisinden küçük bütün çarpanlarnn toplamna e³it olan saydr. Örne§in,

28 = 1 + 2 + 4 + 7 + 14.

Buna göre, ilk 10000 say içindeki kusursuz saylar

ekrana döken bir program yazn. 5. nsan bedeninin alann hesaplamakta kullanlabilecek iki formül a³a§da verilmi³tir. DuBois formülü: Boyde formülü:

bsa = h0.725 ∗ w0.425 ∗ 71.84 ∗ 10−4

bsa = h0.3 ∗ w(0.7285−0.0188 log w) ∗ 3.207 ∗ 10−4

h de§i³keni cm cinsinden boyu ve bsa de§i³keni de m2 cinsinden beden gösterirken, w de§i³keni kütleyi DuBois formülünde kg, Boyde formülündeyse

Her iki formülde de alann

g cinsinden gösterir. DuBois formülü yeti³kinlerde iyi sonuç verirken, çocuklarda (bu formülle elde edilen alan de§eri 0.6'dan küçükse) çok hatal olabilmektedir. Buna göre, boy ve kütlesini kullancdan ald§ bir insann (yeti³kin ya da çocuk) beden alann yukarda anlatlan ölçütlere göre hesaplayarak ekrana çkaran bir program yazn. 6. A³a§da verilen Pascal üçgeni için

i.

satr

j.

sütundaki de§er (binom katsays) yanda

verilen formülle hesaplanr: 0

1

2

3

0

1

1

1

1

2

1

2

1

3

1

3

3

1

4

1

4

6

4

4

(

binomi,j =

1 binomi−1,j−1 + binomi−1,j

j =0∨j =i aksi durumda

1

Buna göre, üçgenin ilk 30 satrn hesaplayp ekrana çkartacak bir program yazn. 7. A³a§daki 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?

(b) Bu bilgiyi kullanarak, serinin toplamn hesaplayan bir program yazn (x ve

n

de-

§erleri kullancdan alnacaktr). 8. Rasgele say üretirken kalan i³lecini (%) kullanarak sayy belli bir aral§a indirgemek saylarn üretilme olaslklarn bozar m? Sözgelimi,

RAND_MAX'n de§erinin 32767 oldu§unu

varsayarak 1 ile 6 arasnda üretece§iniz rasgele sayda bu alt saynn gelme olaslklar e³it midir? De§ilse, daha iyi bir yöntem önerebilir misiniz?

Sayaç Denetiminde Yineleme

72

Bölüm 4 Türetilmi³ Veri Tipleri

Bu bölümde programcnn var olan veri tiplerinden kendi veri tiplerini (sözgelimi kaytlar, bkz. Bölüm 1.1.2) nasl türetebilece§i üzerinde durulacaktr. C dilinin programcya kendi veri tiplerini tanmlayabilmesi için sundu§u temel olanak, var olan veri tiplerine yeni isimler verilebilmesidir. Bunun için

typedef veri_tipi yeni_isim ; komutu kullanlr. Bunun sonucunda

veri_tipi

isimli tipe

yeni_isim

adnda bir isim daha

verilmi³ olur. Örne§in bir ö§rencinin snav notlar i³lenmek isteniyor olsun. Notlarn 0 ile 100 arasnda birer tamsay olaca§ varsaymyla, ö§renci notu tipinden bilgileri temsil etmek üzere bir veri tipi tanmlanabilir:

typedef int score_t; Böylece

int veri tipine score_t diye yeni bir isim verilmi³ olur. Daha sonra bu tipten de§i³ken

tanmlamak için

score_t midterm1, midterm2, final; gibi bir komut yazlabilir. stenirse asl veri tipi isminin kullanlmasnda da bir saknca yoktur, yani

int midterm1, midterm2, final; tanm da geçerlili§ini korur ve bu iki tanm birbirine e³de§erlidir. Bir veri tipine yeni bir isim vermenin yararlar ³öyle açklanabilir:



Anla³lrlk artar: Programn kodunu okuyan ki³i bu veri tipinin temsil etti§i bilgiyle ilgili daha iyi bir kir edinebilir. 73

74



De§i³tirmek kolay olur: Programn geli³tirilmesinin ileri a³amalarnda ya da sonraki sürümlerde ö§renci notlarnn kesirli olabilece§i durumu ortaya çkarsa yalnzca veri tipine isim verme komutunun

typedef float score_t; biçiminde de§i³tirilmesi yeterli olur. Veri tipi tanm olmasa bütün kodun taranarak ö§renci notuna kar³lk gelen

int

veri tiplerini bulup de§i³tirmek gerekir. Bu da baz

int

sözcüklerinin de§i³mesi, bazlarnn de§i³memesi anlamna gelir ve programn boyutlarna göre büyük zorluklar çkarabilir.

Örnek 10. Barbut

1

Barbut oyununun kurallar ³öyledir:



Oyuncu bir çift zar atar.

   •

Att§ zarlarn toplam 7 ya da 11 ise oyuncu kazanr. Att§ zarlarn toplam 2, 3 ya da 12 ise oyuncu kaybeder. Di§er durumlarda att§ zarlarn toplam oyuncunun says olur.

Oyuncu ayn toplam veren zarlar bir daha atana kadar ya da att§ zarlarn toplam 7 olana kadar zar atmaya devam eder.

 

Ayn toplam bir daha atarsa oyuncu kazanr. Att§ zarlarn toplam 7 olursa oyuncu kaybeder.

switch yapsbreak kullanlmamasdr. Böylelikle durumlar gruplanarak

Verilen örnek, bu oyunu simüle eden bir programdr. Bu örne§in ilginç bir yönü nn baz durumlarnda kastl olarak

her bir grup için yaplacak i³lemlerin bir kere belirtilmesi sa§lanm³tr. Programn örnek bir çal³masnn ekran çkts “ekil 4.1'de verilmi³tir.

Zarlar: 1 + 4 = Say: 5 Zarlar: 5 + 1 = Zarlar: 5 + 5 = Zarlar: 6 + 5 = Zarlar: 4 + 1 = Oyuncu kazanr.

5 6 10 11 5

“ekil 4.1: Örnek 10 ekran çkts.

1

Bu örnek, H.M. Deitel ve P.J. Deitel'in yazdklar C: How to Program kitabndan uyarlanm³tr.

75

Türetilmi³ Veri Tipleri

Örnek 10 Barbut oyununu simüle eden program. #include #include #include

// cin,cout,endl // EXIT_SUCCESS,srand,rand // time

using namespace std; enum status_e { GAME_CONTINUES, PLAYER_WINS, PLAYER_LOSES }; typedef enum status_e status_t; int main(void) { int die1, die2, sum, point; status_t game_status = GAME_CONTINUES; srand(time(NULL)); die1 = 1 + rand() % 6; die2 = 1 + rand() % 6; sum = die1 + die2; cout

i³leci kullanlr. Örnekte ortak çarpanlardan en büyük ortak bölenin hesapland§ döngüdeki

f->base yazm buna bir örnektir. Bunun yerine önce * ile i³aretçinin ba³vurdu§u yere eri³ilip daha sonra noktal gösterilimle istenen alann de§eri de alnabilir: (*f).base gibi. Ancak bu ikinci gösterilim pek ye§lenmez.

Uygulama: Ba§lantl Listeler Bu örnekte, Örnek 30'de yaplan ortade§er bulma program seçerek sralama algoritmas yerine araya sokarak sralama algoritmasyla gerçeklenecektir.

Yaplara ³aretçiler

166

Örnek 39 Ba§lantl listeler kullanarak en büyük ortak bölen 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

Ba§lantl Listeler

Örnek 40

Ba§lantl listeler kullanarak en büyük ortak bölen hesaplayan program (ortak

çarpanlar bulma fonksiyonu).

factor_t *gcd_factors(factor_t *factors1, factor_t *factors2) { factor_t *factors = NULL, *head = NULL, *tail = NULL, *p = NULL;

}

while ((factors1 != NULL) && (factors2 != NULL)) { if (factors1->base < factors2->base) factors1 = factors1->next; else if (factors1->base > factors2->base) factors2 = factors2->next; else { factors = new factor_t; factors->base = factors1->base; factors->power = min(factors1->power, factors2->power); factors->next = NULL; if (head == NULL) head = factors; if (tail != NULL) tail->next = factors; tail = factors; factors1 = factors1->next; factors2 = factors2->next; } } return head;

Yaplara ³aretçiler

168

Örnek 41. Araya Sokarak Sralama Araya sokarak sralama algoritmas, temel sralama yöntemlerinden biridir. Bu yöntemde, her yeni gelen eleman o ana kadar gelen elemanlara göre sral olacak ³ekilde yerine yerle³tirilir. Örne§in 45, 22, 91, 18, 62 saylar sralanacaksa ³u ³ekilde ilerlenir:

45 22 22 18 18

45 45 91 22 45 91 22 45 62 91

Bu yöntem statik diziler üzerinde gerçeklenmeye uygun de§ildir çünkü her yeni gelen eleman eklendi§inde ondan büyük olan bütün elemanlarn bir konum sa§a kaydrlmalar gerekir. Örnekte 18 says dizinin en ba³na eklenece§inden üç elemann birden sa§a kaydrlmasna neden olur. Oysa bu algoritma ba§lantl listeler üzerinde gerçeklenmeye gayet uygundur. Örnek 41'de bir diziyi sral bir ba§lantl listeye çeviren program verilmi³tir.



Ekleme i³lemini yapan fonksiyonu ³u durumlar için inceleyin:

   

liste bo³ eleman en ba³a ekleniyor eleman en sona ekleniyor eleman arada bir yere ekleniyor



assert



core dump

169

Ba§lantl Listeler

Örnek 41 Ba§lantl liste üzerinde araya sokarak sralama program (ana fonksiyon). #include #include

// cin,cout,endl // EXIT_SUCCESS

using namespace std; struct node_s { int value; struct node_s *next; }; typedef struct node_s node_t; node_t *insertsort(int *numbers, int count); void delete_nodes(node_t *head); int main(void) { int *score = NULL; node_t *head = NULL, *f = NULL; float median; int no_students, i; cout > no_students; score = new int[no_students]; for (i = 0; i < no_students; i++) { cout score[i]; } head = insertsort(score, no_students); f = head; for (i = 0; i < no_students / 2 - 1; i++) f = f->next; median = (no_students % 2 == 1) ? f->next->value : (f->value + f->next->value) / 2.0; cout next; } newnode->next = p; if (last == NULL) return newnode; last->next = newnode; return head;

node_t *insertsort(int *numbers, int count) { node_t *head = NULL; int i;

}

for (i = 0; i < count; i++) head = insert(head, numbers[i]); return head;

void delete_nodes(node_t *head) { node_t *p = NULL;

}

while (head != NULL) { p = head->next; delete head; head = p; }

170

Bölüm 11 Rekürsiyon

ki saynn en büyük ortak bölenini bulmak üzere kulland§mz Euclides algoritmas,  a ile

b

saylarnn en büyük ortak böleni

b

ile

a % b

saylarnn en büyük ortak bölenine e³ittir

ilkesine dayanyordu. Problemin çözümünün, bu örnekte oldu§u gibi, kendisi cinsinden ifade edilmesine rekürsif tanm ad verilir. Çözülmesi istenen problem, kendisi cinsinden daha küçük bir probleme indirgenir. Sürekli indirgemeler yoluyla çözümü bilinen bir duruma (taban durum) ula³lmaya çal³lr. Euclides algoritmasnda taban durum küçük olan saynn 0'a gelmesi durumuydu; bu durumda di§er say en büyük ortak bölen oluyordu. Aksi halde daha küçük saylar üzerinde en büyük ortak bölen aranmaya devam ediliyordu. Bu ilkeyi gerçekleyen bir fonksiyon ³u ³ekilde yazlabilir:

int gcd(int a, int b) { if (b == 0) return a; else return gcd(b, a % b); } Rekürsiyona en çok verilen örneklerden biri de faktöryel hesaplanmasdr. Rekürsif olarak faktöryel hesaplayan bir fonksiyon ³öyle yazlabilir:

int factorial(int x) { if (x == 0) return 1; else return x * factorial(x - 1); } Bu iki örnek, C gibi blok yapl dillerde rekürsif gerçeklenmeye uygun örnekler de§ildir; çünkü yinelemeli olarak gerçeklendiklerinde daha etkin çal³rlar. Rekürsif yazm bazen daha güzel görünse ve matematikteki tanma daha yakn olsa da, ba³arm açsndan dezavantajl olabilir. 171

172

Örnek 43. Hanoi Kuleleri Hanoi kuleleri probleminde 3 adet direk ve 64 adet ortas delik disk vardr. Diskler ba³langçta birinci dire§e geçirilmi³ durumdadr. Çap en geni³ olan disk en altta, en dar olan en üstte yer alr ve her disk kendisinden daha geni³ çapl bir diskin üzerinde durur. Amaç, diskleri teker teker direkler arasnda ta³yarak ayn düzeni üçüncü direkte olu³turmaktr. Burada kural, hiçbir diskin hiçbir a³amada kendisinden dar bir diskin üzerine konamamasdr. “ekil 11.1'de üç direk ve üç diskli örnek verilmi³tir. Bu örne§in çözümünü yapan programn çkts “ekil 11.2'de verilmi³tir.

A B C

“ekil 11.1: Hanoi kuleleri problemi ba³langç durumu. Hanoi kuleleri probleminin genel çözümünü olu³turmaya en geni³ çapl diskin nasl ta³naca§n dü³ünmekle ba³layalm. Bu disk ba³ka hiçbir diskin üstüne konamayaca§ için üçüncü diske ba³ka bir direk üzerinden aktarlarak geçemez, bir kerede götürülmelidir. Bunun yaplabilmesi için birinci diskte kendisinden ba³ka disk bulunmamal, üçüncü disk de bo³ olmaldr (“ekil 11.3). Bu durumda çözüm üç a³amal olarak görülebilir:

1. Dar 63 diski birinci diskten ikinci diske ta³. 2. En geni³ diski birinci diskten üçüncü diske ta³. 3. Dar 63 diski ikinci diskten üçüncü diske ta³.

Birinci ve üçüncü admlardaki ta³ma i³lemi aslnda 63 disk için ayn problemin çözülmesinden ba³ka bir ³ey de§ildir. O halde problemimizi

n diskin a dire§inden b dire§ine c dire§i üzerinden

ta³nmas ³eklinde ifade ederek çözümü ³u ³ekilde yazabiliriz:

Bir Bir Bir Bir Bir Bir Bir

diski diski diski diski diski diski diski

1 1 3 1 2 2 1

dire§inden dire§inden dire§inden dire§inden dire§inden dire§inden dire§inden

3 2 2 3 1 3 3

dire§ine dire§ine dire§ine dire§ine dire§ine dire§ine dire§ine

ta³. ta³. ta³. ta³. ta³. ta³. ta³.

“ekil 11.2: Hanoi kuleleri problemini çözen programn ekran çkts.

173

Rekürsiyon

A C

B

“ekil 11.3: Hanoi kuleleri problemi (en geni³ diskin ta³nmas).

1.

n - 1

2.

a

3.

n - 1

diski

a

dire§inden

dire§inde kalan diski diski

c

b

dire§inden

c

dire§ine

b

dire§i üzerinden ta³.

dire§ine ta³.

b

dire§ine

a

dire§i üzerinden ta³.

Her seferinde direk says azald§ndan bu algoritma sonlanma ko³ulunu sa§lar. Taban durum, ta³nacak disk saysnn 0 oldu§u durumdur, bu durumda hiçbir ³ey yaplmayacaktr. O halde bu problemi çözen program Örnek 43'de görüldü§ü gibi yazlabilir. Bu algoritmann en güzel yanlarndan biri, deneme-yanlma yöntemiyle de§il, herhangi bir diski gereksiz yere bir direkten bir dire§e aktartmadan bir kerede çözümü bulmasdr.

Uygulama: Rekürsiyon Örnek 44. Çabuk Sralama DÜZELT: YAZILACAK

Sorular

174

Örnek 43 Hanoi kuleleri problemini çözen program. #include #include

// cin,cout,endl // EXIT_SUCCESS

using namespace std; #define DISKS 3 void move(int n, int a, int b, int c); int main(void) { move(DISKS, 1, 3, 2); return EXIT_SUCCESS; } void move(int n, int a, int b, int c) { if (n > 0) { move(n - 1, a, c, b); cout
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF