Programlamaya Giri³ Ders Notlar. H. Turgut Uyar
|
|
|
- Süleyman Yavaş
- 10 yıl önce
- İzleme sayısı:
Transkript
1 Programlamaya Giri³ Ders Notlar H. Turgut Uyar ubat 2004
2 ii
3 Önsöz (C) , H. Turgut Uyar Bunotlar, stanbultekniküniversitesi'ndeverilenintroductiontoscienticandengineering Computation tarafndan hazrlanm³tr. dersi için Bilgisayar Yazarnn Mühendisli i açkça belirtilmesi Bölümü ko³uluyla ö retim e itim görevlisi amaçl H. Turgut kullanlabilir Uyar ve da tlabilir. Di er her türlü kullanm için yazarndan izin alnmaldr. Sürüm: Son düzenleme Web sayfas: tarihi: 5 ubat Bu manda dersin temel amac, saysal ö renciye yöntemleri yalnzca ve sralama programlamay algoritmalar ya da gibi C dilini skça ö retmek kullanlan de il, programlama ayn za- tekniklerini örnekler seçilmeye de göstermektir. çal³lm³tr. Bu Bu amaçla örneklerin uygulamalarda ço u Prof. daha Dr. Nadir çok saysal Yücel'in yöntemler Saysal üzerine Algoritmalar kitabndan uyarlanm³tr. Analiz Notlarn tirdi i baz hazrlanmasnda yeniliklerden yararlanlm³tr. yeni standartlara Metin uyumu içinde kolayla³trmas yeri geldikçe, açsndan C++ dilinde C++ geçerli dilinin olup ge- C dilinin izin vermedi i özellikler belirtilmi³tir. Programlarn ekran çktlarnda kullancnn yazd de erler italik olarak i³aretlenmi³tir. Örnek snda bulunabilir. programlar ve ders için hazrlanan sunumlar ( ngilizce) yukarda belirtilen web sayfa- iii
4 iv
5 çindekiler 1 Giri³ Veriler Taban Tipler Kaytlar Diziler Algoritmalar Algoritmalarn Kar³la³trlmas Blok Yapl Programlama Soyutlama Giri³ / Çk³ Program Geli³tirme Programlarn De erlendirilmesi Programlarn Çal³trlmas Kitaplklar Standartlar Derleme A³amalar C Diline Giri³ simler De erler De i³kenler Veri Tipleri De i³mezler Aritmetik Deyimler Tip Dönü³ümleri Artrma / Azaltma Matematik Kitapl Giri³ / Çk³ v
6 ÇINDEKILER 3 Ak³ Denetimi Ko³ul Deyimleri Kar³la³trma ³lemleri Mantksal ³lemler Seçim Ko³ullu ³leç Çoklu Seçim Ko³ul Denetiminde Yineleme Döngü Denetimi Sayaç Denetiminde Yineleme Türetilmi³ Veri Tipleri Numaralandrma Yaplar Diziler Tek Boyutlu Diziler Katarlar Katar Kitapl Çok Boyutlu Diziler Ba³vurular Fonksiyonlar Fonksiyon Bildirimi ve Tanm Parametre Aktarm Yerel De i³kenler Genel De i³kenler Ba³vuru Aktarm Giri³ Parametreleri Üzerinden De er Döndürme Dizilerin Fonksiyonlara Aktarlmas E³ simli Fonksiyonlar Varsaylan Parametreler vi
7 vii ÇINDEKILER 7 ³aretçiler ³aretçi Tipinden De i³kenler Bellek Yönetimi ³aretçi - Dizi li³kisi ³aretçi Tipinden Parametreler Statik De i³kenler Adres Aktarm Giri³-Çk³ Çk³ Giri³ Ana Fonksiyona Parametre Aktarma Dosyalar Dosya Açma - Kapama Dosyada Okuma-Yazma Standart Giri³ / Çk³ Birimleri Hata letileri Katarlar ile Giri³-Çk³ kili Dosyalar Öni³lemci Makrolar Projeler Ba lantl Listeler Yaplara ³aretçiler 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 B.4 Hata Ayklayclar 182 B.5 Ba³arm nceleme
8 ÇINDEKILER viii
9 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 dolaysyla tandklar temelde varlk saylar yelpazesi üzerinde fazla i³lem geni³ yapmak de ildir. üzere Örne in tasarlanm³ Türkiye'deki makinalardr; laryla ilgili bir program yazlacaksa ³ehirlerin ve aralarndaki yollarn bir ³ekilde karayol- 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 temsil seçenekler dü³ünülebilir: farkl Yolun yalnzca düz ba³langç oldu unu ve varsayarak biti³ ³ehirlerini bir do ruyla (yani enlem, göstermek boylam ( ekil ve 1.1a). isimlerini) Bu durumda yeterli olacaktr. Bu yöntem i³lemleri çok basitle³tirmekle birlikte gerçek durumdan bilmek büyük ölçüde sapmaya neden olur. Yolu Ankarayoluiki, stanbul- zmiryoludört,ankara- zmiryoluüçdo ruparçasndan ucuca eklenmi³ do ru parçalaryla göstermek ( ekil 1.1b). ekilde stanbulolu³maktadr. isterseniz o kadar Ancak fazla bu do ru yöntem parças daha zordur kullanmanz ve yolu gerekir. ne kadar ayrntl temsil etmek Problemi olu³turan varlklarn nasl temsil edileceklerinin belirlenmesi, problem için bir model ve yeterli olu³turulmas ayrntda bir anlamna model olu³turmaktr. gelir. Problemin Yukardaki çözümünde örnekten ilk ve en de önemli görülebilece i adm do ru çözece iniz problemi nasl modelledi iniz son derece önemlidir, çünkü çözdü ünüz gibi, problemin kendisi de il, sizin o problemi temsil etmek üzere tasarlad nz modeldir. ³ey Modeliniz edece iniz problemden sonuç anlamsz uzaksa olur. siz ne kadar iyi bir çözüm uygularsanz uygulayn elde Di er gereksinimleriylebelirlenir.gerekendendahaayrntlbirmodelhazrlarsanzbelkidaha yandan, modelin ne kadar ayrntl olmas gerekti i, çözmek istedi iniz problemin iyi çaba bir ya sonuç da çözümüzün elde edersiniz gerçekleme ama o daha maliyeti iyi sonuca aradaki ula³mak farka de meyebilir. için harcamanz Yine gerekecek yukardaki ek 1
10 2 örneklesürdürürsek, stanbul-ankarakarayolunun274.kilometresi edecekseniz yolu do ru parçalaryla modellemeniz gerekecektir çünkü gibibilgilerdensöz bu nokta büyük olaslkla o iki ³ehri birle³tiren çizginin üzerinde bir yere gerçek dü³meyecektir. ya³amda Ancak dir; bu yollarn durumda yalnzca da do ru uzunluklaryla parçalaryla ilgileniyorsanz modellemek yolun do rularla uzunlu unun modellemeniz bulunmasnda yeterli- zorluk çkaracaktr. Istanbul Istanbul Ankara Ankara Izmir Izmir Çözümün nasl ifade edilece i. (a) (b) ekil 1.1: Karayollarnn gösterilmesi. Bir meniz problem gerekir. için Adm dü³ündü ünüz adm hangi çözümü i³lemlerin ba³ka yaplaca nn birine (insan açklanmas ya da bilgisayar) ³eklinde anlatabil- bir çözüme anlatlan algoritma yemektarieridir.a³a da,bezelyelijamaikapilavyapmakiçin nternet'tenalnm³bir ad verilir. Algoritmalara günlük ya³amdan skça verilen bir örnek tarif algoritma biçiminde yazlm³tr: /2 kutu bezelyeyi 4-5 ncan suya koy. 2. 1/4kutuhindistancevizisütü,1tutamkekikvea ztadnagöretuzvebiberekle. 3. Bezelyeler yumu³ayncaya kadar ha³la. 4. Bir kekik so ann ile birlikte dibini suya ez ve ekle. 2 ncan pirinç, 1/4 kutu hindistan cevizi sütü ve 2 tutam 5. Pirincin üstünden 2 cm kadar su kalacak ³ekilde fazla suyu al dakika kaynat. 7. Pirinç yumu³ayncaya kadar pi³irmeye devam et. Algoritmann ldr: bir bilgisayar tarafndan yürütülebilmesi için iki önemli özellik sa lanma- Her memelidir. admda Yukardaki ne yaplaca örnek açk bu olarak bakmdan belli bir olmal, algoritma hiçbir saylamaz ³ekilde yorum çünkü gerektir- admda ne yaplaca yoruma braklm³tr. Sözgelimi, 4-5 bardak, a z pek tadna çok göre, bezelyeler yumu³ayncaya kadar gibi deyimler yeterince kesin de ildir. Sonlu sayda admda ya çözüm bulunmal ya da bulunamad bildirilmelidir.
11 3 Giri³ 1.1 Veriler Modelinizde ramda bir kulland nz büyüklükler programnzn verilerini olu³turur. Her büyüklük prog- de i³ken ba³ka bir ³ey de ildir. ile temsil De i³kenler, edilir. De i³ken programn aslnda i³leyi³i o srasnda büyüklü e verilmi³ simgesel bir isimden de erler bellekte tutulduklar gözönüne alnrsa, de i³ken bir bellek gözünün ad, alrlar. de er De i³kenlerin içeri idir. ise bu gözün Örne in, yüklü e bir bir de i³ken ³ehri modellemek kar³ dü³ürmemiz için üç büyüklük gerekti inden öngörmü³tük: isim bilgisini isim, isim, enlem enlem ve boylam. bilgisini Her bü- enlem ve boylam bilgisini boylam etti imiz³ehregörebude i³kenlereuygunde erlervermemizgerekir.sözgelimi, stanbul³ehrini temsil etmek için isim de i³kenine stanbul, enlem de i³kenine 41, boylam de i³kenleriyle temsil etti imizi varsayalm. Bu durumda temsil 29 de erleri verilmelidir ( ekil 1.2). de i³kenine 1 isim enlem boylam "Istanbul" ekil 1.2: ehri temsil eden de i³kenler ve örnek de erler. Birde i³kenebirde erverilmesii³lemine atama denirvesolabakanbiroki³aretiylegösterilir: enlem Atama i³aretinin sol tarafna bir de i³ken ad, sa tarafna bir deyim Deyim, bir de er üreten bir hesaplama olarak tanmlanabilir. Bir deyim, tek bir de er ya yazlr. de i³ken olabilece i gibi, bunlarn i³lemler ile çe³itli ³ekillerde ba lanmalarndan da olu³abilir: da bir 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 Atama i³lemi bir matematiksel e³itlik de ildir. Örne in 41 enlem yoktur. Benzer ³ekilde, atamasnn bir anlam i i + 1 atamas, i artrlmas demektir; yani de eri bu i³lemden önce de i³keninin 5 ise, i³lemden de erinin sonra o anki 6 olur. de erine Oysa, göre bu bir bir e³itlik olsayd yanl³ olurdu (0= 1). Örnek. Takas Programlarda mektir. Sözgelimi, 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 den sonra de i³keninin de eri 154 ise bu i³lem- say1 de i³keninin 154, say2 de i³keninin de 32 de erini almas istenir( ekil 1.3). 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 enlemleri ve bat boylamlar negatif saylarla gösterilirse örne in New York ³ehrinden söz edildi inde isim de i³keni New York, boylam de i³keni -74, enlem de i³keni 40 de erini almaldr. 2 Bu i³lem için programlama dilleri genelde= ya da := i³aretini kullanrlar.
12 Veriler 4 sayi1 32 sayi2 154 (a) Önce sayi1 154 sayi2 32 say1 say2 say2 say1 (b) Sonra ekil 1.3: Takas i³lemi. Birinci atama i³leminden ( ekil 1.4a) sonra say1 de i³keni 154 de erini alr, say2 ninde ise bir de i³iklik olmaz. kinci atama i³lemi ( ekil 1.4b) ise de i³ke- say2 de i³kenine say1 de i³keninin o anki de erini atad ndan say2 her iki de i³ken de 154 de erini alm³ olur ( ekil de i³kenine 1.4c). yine 154 de eri atanr ve sonuçta sayi1 sayi (a) sayi1 154 sayi2 154 (b) sayi1 154 sayi2 154 (c) ekil 1.4: Takas i³lemi çözümü (hatal). kiatamai³lemininyetersizoldu ugörülmektedir.yaplmasgereken,de i³kenlerinde erlerini yitirmemek için, bir de i³kenin de erini ba³ka bir de i³kende yedeklemektir: ara say1 say1 say2 say2 ara
13 5 Giri³ Birinciatama( ekil1.5a)sonucunda arade i³keni32de erinialr. kinciatamada( ekil1.5b) say1 de i³kenine 154, üçüncü atama ( ekil 1.5c) sonucunda da say2 atanr( ekil 1.5d). Bu atamalardan sonra de i³kenine 32 de eri ara yoktur. de i³keninin de erinin ne oldu unun bir önemi sayi1 sayi2 ara xxx (a) sayi1 sayi2 ara (b) sayi1 sayi2 ara (c) sayi1 sayi2 ara (d) ekil 1.5: Takas i³lemi çözümü (do ru). De i³kenlerin,temsilettiklerivarl agöre,bir programcnn de i³kenin hangi veri tipinden oldu unu tiplerivardr.bazprogramlamayakla³mlarnda de i³kenin tipi, içinde kullanld ba lamdan kestirilmeye belirtmesi çal³lr. ³art ko³ulurken, bazlarnda Taban Tipler En sk kullanlan de i³ken tipi saylardr. Örnekteki enlem ve boylam birer tamsay ya da kesirli say olarak seçilebilir. Ço u programda gerekecek de i³kenleri temel duruma veri tipleri göre ³unlardr: tamsay Bir uzunlu u, insann bir do um i³lemin yl, kaç soyadndaki kere yapld n harf sayan says, sayaç boyunun gibi bilgiler. santimetre cinsinden kesirli say lamas, Bir insann bir saynn boyunun karekökü metre cinsinden gibi bilgiler. uzunlu u, iki snavdan alnan notlarn orta-
14 Veriler 6 mantksal Bir büyük ö rencinin olup olmad, bir dersten kullancnn ba³arl bast olup tu³un olmad, bir rakam bir insann tu³u olup onsekiz olmad ya³ndan bilgiler. Bu tipten de i³kenler gibi Do ru ya da Yanl³ de erini alabilirler. 3 simge Birinin adnn ba³ har, programn çal³mas srasnda Devam etmek istiyor musunuz ve yl arasna (E/H)? hangi sorusuna i³aretin kar³lk konaca (nokta, hangi tu³a tire, bast, bölü, bir vs.) tarih gibi bilgisinde bilgiler. Simgeler gün, ay ço unlukla yaplmas gereken tek trnak önemli i³aretleri bir nokta, içinde rakamlar yazlrlar: ile rakamlar 'E', '?', '4' gösteren gibi. Burada i³aretleri ayrm birinekar³trmamaktr.örne in5rakamile'5'simgesifarklbüyüklüklerdir(bkz. bir- Ek A). katar Bir temsil insann edilmeye ad, uygundur. do du u ³ehir, Katarlar bir kitabn ço unlukla ISBN çift numaras trnak içinde gibi bilgiler yazlrlar: katarlarla nis Ritchie, gibi. Bir büyüklük bütünüyle rakamlardan olu³sa Den- baz durumlarda say yerine katarla göstermek daha uygun olabilir. Bir de i³kenin bile ancak Örne in, üzerinde stanbul aritmetik Teknik bir Üniversitesi'nde i³lem yaplacaksa ö renci say numaralar tipinden olmas dokuz anlaml haneli tamsaylardr olur. ö renci numaralar ancak bunlar üzerinde tamsay aritmetik olarak i³lem temsil yapmak etmenin gerekmeyecektir(iki bir anlam yoktur ö rencinin numaralarn toplamak ya da çarpmak çünkü gibi) Kaytlar Birden ten ya da fazla farkl büyüklü ü tiplerden ortak olabilir. bir tip Örne in altnda bir toplarlar. ³ehri temsil Burada etmek gruplanan üzere kullanlan büyüklükler üç büyüklük ayn tip- (³ehrin ismi, enlemi ve boylam) birle³tirilerek ³ehirleri gösterecek bir kent labilir. Bu veri tipinin biri bir katar (³ehir ismi), di er ikisi de birer kesirli veri say tipi olan olu³turu- ve boylam) üç alan olacaktr ( ekil 1.6a). Bu tipten diyelim bir (enlem ba³kent d nda, de i³kenin alanlarna eri³mek için de i³keni tanmlan- ba³kent kentinin ismi, ba³kent gibi deyi³ler kullanlmaldr. Bu amaçla ço unlukla noktal gösterilimden yararlanlr; kentinin enlemi örne in ba³kent de i³kenininisim alannaankara de eriniatamakiçinba³kent.isim Ankara yazlr ( ekil 1.6b). Kaytlar (katar), uzunlu u alan olarak (tamsay) ba³ka kaytlar ve ba³langç da içerebilirler. ve biti³ kentleri Örne in, bilgileri bir yolu kullanlabilir temsil için yolun ( ekil kodu Eri³im, tek düzeyli kaytlara benzer ³ekilde yaplr 1.7). (tem.son_kent.isim Ankara ve tem.kod E-6 gibi) Diziler Ayn dizinin tipten bütünü varlklardan tek bir de i³ken olu³an bir olarak grubu de erlendirilir. tek bir çat altna Örne in toplamak 50 ö rencili için kullanlrlar. bir snfta Bir snavdan alnan notlar i³lenece inde, her bir ö rencinin notunu göstermek üzere not1, not2, bir, not50 gibi ayr ayr 50 tamsay de i³ken tanmlanaca na, notlar adnda 50 elemanl 3 Bu de erler örneklerde D ve Y ³eklinde ksaltlacaktr.
15 7 Giri³ kent kent baskent isim isim "Ankara" enlem enlem boylam boylam (a) (b) ekil 1.6: Kayt tipinden de i³ken örne i. yol tem kod uzunluk ilk_kent isim son_kent isim enlem enlem boylam boylam ekil 1.7: çiçe kaytlar tipinden de i³ken örne i.
16 Veriler 8 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 ekil 1.8: Dizi tipinden de i³ken örne i. Elemanlar gerekir. Sözgelimi, üzerinde 22. i³lem ö rencinin yapmak ald için dizinin not 95 kaçnc ise yaplacak elemanndan atama söz etti inizi söylemeniz notlar gösterilir ³eklinde 4. Katarlar eleman bir ço u simge programlama olan bir dizidir. dilinde Sözgelimi, simge dizileri birinin olarak ad ve görülürler; soyad yani bir katar her bir adsoyad kende tutulacaksa, bu de i³ken simge dizisi tipinden olacaktr ( ekil 1.9). Örnekte isimli bir de i³- adsoyad büyüklü ünün de eri 'D', 1 adsoyad 7 büyüklü ünün de eri ' ' (bo³luk) simgesidir. adsoyad D e n n i s R i ekil 1.9: Katar tipinden de i³ken örne i. Dizilerle üzere bir kaytlar dizi kullanabiliriz birlikte de kullanlabilir. Sözgelimi, bir saynn asal çarpanlarn temsil etmek (6776 = gösterir, her bir asal çarpan da bir taban ve bir üs ). Dizinin her bir eleman bir asal çarpan 2 edilir( ekil 1.10). Elemanlara eri³im daha önce belirtilen de erinden kurallarda olu³tu u görüldü ü için bir gibi kaytla olacaktr: temsil ç arpanlar 2.taban 7 carpanlar taban 2 taban 7 taban üs 3 üs 1 üs 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.
17 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 neklerinde ³u simgeler göstermek kullanlr: için skça kullanlan yöntemlerden biri ak³ çizenekleridir. Ak³ çize- 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³kenardörtgen:Kararnoktalarngösterir. çineyazlansorununyantnndo ruyada yanl³ olmasna göre farkl bir yöne gidilmesini sa lar. Paralelkenar: Giri³/çk³ i³lemlerini gösterir. Algoritmann nan ba³la komutuyla tamam belirtilmi³se ba³lar ve dur ak³ komutuyla çizene i kö³eleri biter. Algoritmann yuvarlatlm³ tamam kutular de il, içinde yalnzca bulu- ilgilenilen varlak ile sona bir parças erer. Ak³ belirtilmek çizene inin isteniyorsa büyümesi çizenek ve topluca bo³ bir görülmesinin yuvarlak ile zorla³mas ba³lar ve durumunda bo³ bir yu- ak³ parçann çizene i hangi parçalarnn parçaya nereden ba³ndaki ba land ve sonundaki belirtilebilir. yuvarlaklarn içine etiketler yazarak hangi Algoritmalarn kullanlabilir. Tablonun örnek de erler her bir üzerinde satr algoritmann i³leyi³lerini daha bir admna kolay izleyebilmek kar³ dü³er amacyla ve o admda tablolar ³itli de i³kenlerin ya da deyimlerin aldklar de erlerin görülmesini sa lar; yani de i³kenler çedeyimler tablonun sütunlarn olu³turur. ve Örnek. En Büyük Eleman Bulma Bir en yüksek dizinin notun en büyük bulunmas elemann örne i bulma üzerinde algoritmasn, inceleyelim. 50 ö rencili Bu i³i bir yapacak snfta bir bir snavdan algoritma alnan yazlabilir: ³öyle 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 yüksek not ö rencinin olarak seç. notu ³u ana kadarki en yüksek nottan büyükse bu yeni notu en 4. Sray bir sonraki ö renciye geçir ve 2. adma dön. 5. En yüksek notu bildir.
18 Algoritmalar 10 Daha ö rencilerin çok gündelik notlarn dil 50 kullanlarak elemanl bir yazlm³ tamsay bu dizisi(bu algoritmay de i³kene biçimsel olarak ifade edebilmek için notlar kadar bulunmu³ en yüksek notu bir adn verelim), o ana tamsay(max kaçnc ö renci oldu unu tutmak için bir sayaç de i³keni diyelim) ile ve sradaki ö rencinin (i de i³keni) tanmlarsak: 1. max notlar 1, i 2 2. i 50 ise 3. adma, de ilse 5. adma git. 3. notlar i > max ise max notlar i 4. i i + 1 ve 2. adma dön. 5. en yüksek not: max Yukarda yerine 6 elemanl verilen algoritma bir dizide örne inin en büyük ak³ elemann çizene i bulunmas ekil 1.11'de algoritmasnn görüldü ü i³leyi³i gibidir. Tablo 50 eleman verilmi³tir(notlarnsrasyla43,74,65,58,82,37olduklarvarsaylm³tr,sürmeko³ulu 1.1'de i 6 ³eklinde de i³melidir). basla max notlar 1 i 2 i 50 Y D notlar i > max Y D max notlar i bas: max dur 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
19 11 Giri³ max i i 6 notlar i > max 43 2 (2 6) D (74 > 43) 74 3 (3 6) (65 74) 4 (4 6) Y (58 < 74) 5 (5 < 6) D (82 > 74) 82 6 D (6 = 6) Y (37 < 82) 7 Y (7 > 6) Tablo 1.1: En büyük eleman bulma algoritmasnn örnek de erlerle i³leyi³i. say nizde sizin oyun söyledi inizden sona erecektir. büyükse Bu oyunu büyük, oynarken küçükse nasl bir küçük algoritma diyecek, kullanrsnz? do ru sayy söyledi i- Kararla³trd nz snr de erlerinden küçük olann taban, büyük olann tavan isimli birer de i³kenilegösterelim.ayrca,biriarkada³nzntuttu usayytemsiledecek(tutulan di eriyse sizin söyledi iniz sayy temsil edecek isimli), (söylenen kullanalm. isimli) iki tamsay de i³ken daha Algoritma 1. Alt snrdan ba³la, bulana kadar birer artrarak ilerle. 1. söylenen taban 2. söylenen = tutulan ise buldun, dur 3. söylenen söylenen + 1 ve 2. adma dön Algoritma 2. anki aral n Deneme üst ksmna, aral nn küçük ortasndaki derse alt sayy ksmna söyle. daralt. Büyük Bu derse algoritmay deneme gerçeklemek aral n ³u 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 adma dön. ve Bu unuvearkada³nzn19saysntuttu unuvarsayarsak,herturdade i³kenlerinaldklar algoritmann ak³ çizene i ekil 1.12'de verilmi³tir. Alt snrn 1, üst snrn 63 oldude erler Tablo 1.2'de görüldü ü gibi olacaktr 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:
20 Algoritmalar 12 basla alt taban üst tavan söylenen (alt + üst) / 2 söylenen = tutulan D Y bas: söylenen Y söylenen > tutulan D dur alt söylenen + 1 üst söylenen - 1 ekil 1.12: Say tahmin etme algoritmasnn ak³ çizene i. alt üst söylenen 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.
21 13 Giri³ 1. Hzlar: için incelenir: Hangi algoritma çözümü daha çabuk buluyor? Bu sorunun yant da iki durum (a) en kötü durumda (b) ortalama durumda Saybulmaiçinverilenyukardakiikialgoritmaybubakmdankar³la³trrsak,birincialgoritmann bulaca görülür. örnek de erlerle Oysa ikinci sayy algoritma en kötü sayy durumda en kötü 63, ortalama durumda durumda 6, ortalama 32 denemede 5.09 denemede bulur. durumda 2. Harcadklar yer: Hangi algoritma bellekte daha fazla yer kullanyor? Say landklarna bulma algoritmalarnda ek olarak iki de i³ken gördü ümüz daha gerektirmektedir. gibi, ikinci algoritma birinci algoritmann kul- Günümüzde yer ölçütünün bilgisayarlarn önemi göreli olarak kapasiteleri azalm³tr. eskiye Yine oranla de projenin çok yükselmi³ boyutuna oldu u ve çal³lan için harcanlan yeteneklerine göre algoritma geli³tirirken hzn yansra harcanacak yerin de gözönüne alnmas ortamn gerekebilir. Algoritmalarn sudur. Bu dalda hzlarnn geli³tirilmi³ ve harcadklar bulunan karma³klk yerlerin incelenmesi kuram, benzer algoritma problemlerin analizi dalnn çözümü konu- önerilen algoritmalarn kar³la³trlmasnda ba³vurulan en önemli araçtr. için 1.3 Blok Yapl Programlama Blok yapl programlamann temelinde blok olu³turdu u gruptur. Her algoritma birbirlerine kavram çe³itli yatar. ³ekillerde Blok, ba lanm³ birbiriyle bloklardan ili³kili komutlarn Bloklar ba lamann üç yolu vardr: olu³ur. Sra Bloklarn yaps, komutlarn yukardan yazl³ a³a ya sralarnn do ru yazldklar önemli oldu unu srayla vurgular. yürütülürler Bölüm ( ekil 1.1'de 1.13a). görülen Sra takas varlacak örne i sonuçlar için verilen yanl³ do ru olabilir. çözümde yaplan üç atama i³leminin sralar de i³tirilirse Seçim do ruysa Bir ko³ulun bir blok, do ru yanl³sa olup olmamasna ba³ka bir blok göre yürütülür farkl bir ( ekil blo un 1.13b). yürütülmesidir. ki bloktan Yani herhangi ko³ul biri bir yap bo³ olabilir, kurulabilir. yani ko³ul do ruysa ³u blo u yürüt, yanl³sa hiçbir ³ey yapma ³eklinde Yineleme Ak³ çizene inden Belirli bir ko³ul ( ekil sa land 1.13c) görülebilece i sürece (ya da gibi, sa lanana bu yapdan kadar) çklabilmesi bir blok yinelenebilir. ko³ulu de i³tiren bir komut içermesi gerekir, aksi durumda ko³ul ba³langçta için do ruysa blo un hep bir di er do ru özellik olaca ndan de, ko³ul yapdan ba³langçta çklamayacaktr. yanl³sa blo un Yine hiç ak³ yürütülmeyece idir. çizene inden görülebilecek gulamalarda blok ko³uldan önce de yer alabilir ( ekil 1.12 böyle bir örnektir); Baz böyle uy- durumlarda ko³ul ba³tan yanl³ olsa bile blok en az bir kere yürütülür.
22 Soyutlama 14 blok1 D kosul Y kosul Y blok2 blok1 blok2 D blok (a) (b) (c) ekil 1.13: Temel yaplarn ak³ çizenekleri. Bu blo un yaplarn çk³ öbür ortak blo un bir özelli i, giri³ine hepsinin ba lanabilir; bir giri³ ba³ka ve bir bir çk³larnn deyi³le, bloklar olmasdr. ardarda Böylelikle eklenebilir. bir Ayrca, bir blo un içinde ba³ka bir blok yer alabilir. ekil 1.12'de söylenen > tutulan ³uluyla belirlenen seçim yaps, kosöylenen = tutulan bir alt bile³eni durumundadr. ko³uluyla belirlenen yineleme yapsnn Bir alan programn dallanma okunmasn komutlardr. ve imdiye anla³lmasn kadar en yazd mz çok zorla³tran baz algoritmalarda etkenlerden biri geçen programda n. adma yer git tipi komutlar için -programlama dillerinde genellikle goto bulunmas gerekti i dü³ünülebilir (özellikle yineleme yaplar için). olarak Ancak adlandrlanblok yapl bir komut ramlamada yineleme için özel yaplar vardr ve prog- goto komutunun kullanlmamas özendirilir Soyutlama Programlamann temel düzeneklerinden biri soyutlama paca i³in daha küçük ve birbirinden olabildi ince ba msz kavramdr. alt-i³lere Soyutlama, bölünmesidir. programn Alt-i³ler ya- de, benzer ³ekilde, yapacaklarn alt-alt-i³lere bölebilirler ( ekil 1.14). Bu tip tasarma yukardan a³a ya tasarm ad verilir. Her i³ bir 6 yordam alt-i³leri gerçekleyen (C yordamlar dilindeki adyla ba³latmak fonksiyon) ve bunlar tarafndan arasnda gerçeklenir. e³güdümü Ana-yordamn sa lamaktr. Bir görevi, yordam, kulland alt-yordamlarn nasl çal³tklaryla de il, yalnzca sonuçlaryla ilgilenir. üst- Soyutlamann kazandrdklar ³öyle özetlenebilir: Bir i³i gerçekleyen yordam yazlrken, kulland alt-yordamlarn ayrntlaryla u ra³l- maz;alt-yordamndo ruçal³t varsaylarakyordamnkendii³ineyo unla³labilir.böy- 5 Bu konuyla ilgili olarak, Edsger W. Dijkstra'nn Go To Statement Considered Harmful ba³lkl klasik makalesini adresinde bulabilirsiniz. 6 Bu konuyla ilgili olarak, Niklaus Wirth'ün Program Development by Stepwise Renement ba³lkl klasik makalesini adresinde bulabilirsiniz.
23 15 Giri³ ana-is alt-is-1 alt-is-2 alt-is-3 alt-is-1a alt-is-3a alt-is-3b ekil 1.14: Ana i³in alt i³lere bölünmesi. lelikle lebilir sorunlarla büyük ve çözülmesi u ra³lr ve zor bunlar olan bir daha sorunla sonra u ra³mak biraraya getirilir. yerine, her biri küçük ve çözü- Programn undan bir bakm alt-yordamda kolayla³r. bir Alt-yordamlarn de i³iklik yapld nda çal³malar bunu birbirlerinden kullanan üst-yordam ba msz olduyordamla olan etkile³im de i³medi i sürece) de i³iklikten etkilenmez. (üst- Yordamlarolabildi incegenelamaçlyazlmaldr.sözgelimibiryordamni³ib L105Edersini alan i³i herhangi ö rencilerin bir dizinin ylsonu en snav büyü ünü notlarnn bulmak en büyü ünü olarak bulmak tanmlanan ³eklinde bir yordam tanmlanabilir. geli³tirmek Oysa bu yordam kullanrken hangi dizinin en büyü ünün bulunmasnn istendi i belirtmek daha ve etkin mn bir çal³ma biçimidir. Bu durumda hangi dizi üzerinde i³lem yaplaca bilgisi yorda- giri³ parametresi olur. Yordam, çal³mas sonucu üretti i de eri çk³ parametresi döndürür. Örnekteki yordam kullanlrken giri³ parametresi olarak B L105E dersini alan olarak rencilerin ylsonu snav notlar verilirse snavda alnan en yüksek not, Los Angeles Lakers ö - basketbol oyuncusunun takmnn ayakkab oyuncularnn numaras çk³ ayakkab parametresi numaralar olur. belirtilirse takmn en büyük ayakl Ö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:
24 Soyutlama = 2 * 3 * 3 * 7 * 7 * 11= 2 * 3 * 7 * = 3 * 3 * 3 * 5 * 7= 3 * 5 1 * ortak çarpanlar: 3 * en büyük ortak bölen: asal ve çarpanlarna 2. admlar için ayrlacak herhangi say bir bu sayy yordama asal parametre çarpanlarna olarak ayran yollanabilir. bir yordam Benzer yazlabilir ³ekilde, ve 3. çarpanlardan admdaki ortak en büyük çarpanlarn ortak bölenin bulunmas hesaplanmas i³i de bir i³lemleri alt-yordama için alt-yordam verilebilir. kullanmann 4. admda ortak bir anlam yoktur, ana yordama brakmak daha yerinde olur. Böylece ekil 1.15'deki yap fazla taya çkar. Örnek saylar üzerinde yordamlarn hangi giri³ ve çk³ parametreleriyle çal³tklar or- 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 2. sayinin çarpanlari ortak çarpanlari bul ortak çarpanlar ekil 1.15: En büyük ortak bölen hesaplama algoritmasnn yukardan a³a ya tasarm. Asal çarpanlarna çarpanlara ayrma ayrma i³inin algoritmasnda bir alt-i³i olarak görülen dü³ünülerek bir sonraki bir ba³ka asal sayy yordama bulma braklabilir. i³i de asal yordam kendisine parametre olarak gönderilen saydan bir sonraki asal sayy bularak sonucu Bu geri ba³ka yollayacaktr. bir yordamdan Benzer yararlanmak ³ekilde bu isteyebilir. yordam da Bu bir örnek saynn için asal verilen olup olmad n yordamlar snamak gerçekleyecek üzere algoritmalar bölümün sonundaki uygulamada verilmi³tir. Örnek. Euclides Algoritmas Yukarda ayrmann verilen zorlu udur. algoritmann Bilinen en en eski önemli algoritma sorunu, örneklerinden özellikle büyük biri olan saylar Euclides asal çarpanlarna ikisaynnenbüyükortakbölenininçarpanlaraayrmadanhzlbiçimdehesaplanmasnsa lar. algoritmas, En büyük ortak böleni bulunacak saylardan büyük olanna a, küçük olanna b dersek:
25 17 Giri³ 9702 en büyük ortak bölen hesapla 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 + r 1 ³eklinde yazlabilir. Burada r 1 = 0 ise iki saynn en büyük ortak böleni b'dir. De ilse a ile b saylarnn en büyük ortak böleni b ile r Dolaysyla, bölümden kalan 0 olana kadar a³a daki 1 saylarnn e³itlikler en yazlabilir: büyük ortak bölenine e³ittir. b = q 2 r 1 + r 2 r 1 = q 3 r 2 + r 3... r n 2 = q n r n 1 + r n r n 1 = q n+1 r n + r n+1 (r n+1 = 0) Budurumda aile b'ninenbüyükortakböleni r n 'dir.yine a = 9702, b = 945örne inialrsak: 9702 = = = = Her denklem için en büyük ortak böleni alnacak saylardan büyük olann a, küçük olann b de i³keninde, bu ikisinin bölümünden kalan de eri de r de i³keninde tutarsak(kalan i³lemi% i³aretiyle gösterilsin), bu algoritma bir yineleme yapsyla gerçeklenebilir. Bir bölme i³leminde
26 Soyutlama 18 her zaman kalan, bölenden küçük olaca için her yinelemede a de i³keni b'nin, b de r'nin de erini alarak ilerlenir ve de i³keni b 0 oldu unda en büyük ortak bölen a edilmi³ olur. Bu algoritmann ak³ çizene i ekil 1.17'de, örnek de erlerle i³leyi³i de i³keninde Tablo 1.3'de elde verilmi³tir. 7 D a sayi1 b sayi2 sayi1 > sayi2 Y 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 b r Tablo 1.3: Euclides algoritmasnn örnek de erlerle i³leyi³i. Uygulama: Algoritmalar Örnek. Asal Çarpanlarn Bulunmas Herhangibirsaynnasalçarpanlarnaayrlmasiçinkullanlabilecekbiralgoritma ekil1.18'de verilmi³tir. Bu algoritmada x asal çarpanlarna ayrlacak sayy, c çarpan olup olmad o anda 7 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.
27 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 kisaynnçarpanlarndanenbüyükortakböleninçarpanlarnbulmai³iniyapacakyordamn algoritmas rn küçükten geli³tirilirken, büyü e do ru asal sral çarpanlara olduklar ayrma varsaylabilir. yordamnn Bu varsayma çal³ma ³ekli gören nedeniyle çal³an algoritma çarpanla- ekil 1.19'da verilmi³tir. Bu algoritmada carpanlar1 birinci saynn asal çarpanlar dizisini, carpanlar2 ikinci saynn asal say çarpanlar dizisini, c1 nn, birinci saynn sradaki asal çarpa- c2 için de srasyla de ikinci saynn sradaki asal çarpann gösterir. Her iki dizinin elemanlarna eri³mek i1 ve i2 Tablo 1.5'de verilmi³tir. sayaç de i³kenleri kullanlm³tr. Örnek dizilerle algoritmann i³leyi³i
28 Soyutlama 20 x c x > 1 x % c = 0 carpan u D (945 > 1) Y (945 mod 2 = 1) 3 D (945 > 1) D (945 mod 3 = 0) 3 0 D (945 mod 3 = 0) D (315 mod 3 = 0) D (105 mod 3 = 0) 3 35 Y (35 mod 3 = 2) 5 D (35 > 1) D (35 mod 5 = 0) 5 0 D (35 mod 5 = 0) 1 7 Y (7 mod 5 = 2) 7 D (7 > 1) D (7 mod 7 = 0) 7 0 D (7 mod 7 = 0) 1 1 Y (1 mod 7 = 1) 11 Y (1 = 1) Tablo 1.4: Asal çarpanlarna ayrma algoritmasnn i³leyi³i. c1 c2 taban us carpan < = 3 2 < > = 7 1 < Tablo 1.5: Ortak çarpanlar bulma algoritmasnn i³leyi³i.
29 21 Giri³ c1 carpanlar1 1, c2 carpanlar2 1 i1 1, i2 1 c1 ve c2 bos değil Y 1 D c1.taban < c2.taban D i1 i1 + 1 c1 carpanlar1 i1 Y c1.taban > c2.taban D i2 i2 + 1 c2 carpanlar2 i2 Y D c1.us < c2.us Y c1 bir carpandir c2 bir carpandir i1 i1 + 1, i2 i2 + 1 c1 carpanlar1 i1, c2 carpanlar2 i2 ekil 1.19: Ortak çarpanlar bulma algoritmas.
30 Giri³ / Çk³ Giri³ / Çk³ Bir rn programlama desteklemenin dilinin d³nda kullanlabilir baz gereklilikler olmas de için yerine dilde getirilmelidir: blok yapl programlamann kavramla- Giri³ l³ma Bir program srasnda her bir seferinde ³ekilde ö renmesi ayn veri gerekir. de erleri Bunun üzerinde en sk çal³maz, kar³la³lan i³leyece i yöntemi verileri verileri ça- program ortamdan kullanan ö renmek(sözgelimi ki³iye sormak odann olmakla scakl n birlikte ölçen verileri bir duyargadan bir dosyadan almak) okumak gibi ya seçeneklerdebulunabilir.programlamadilleriningirdikomutlargiri³birimlerindenaldklar da de erleri tu³takmdr. de i³kenlere aktarrlar. Aksi belirtilmedikçe standart giri³ birimi kullancnn Çk³ En Program, sk görülen verilerin yöntem i³lenmesi sonucun sonucu kullancnn elde etti i ekranna sonuçlar yazlmasdr bir ³ekilde ama de erlendirmelidir. gibi sonuçlarn bir dosyaya yazlmas ya da ortama gönderilmesi(oda scakl n giri³te denetleyen oldu u komutlar, klimaya de i³ken bir sinyal de erlerini yollanmas istenen gibi) çk³ sözkonusu birimine olabilir. yönlendirirler. Programlama Aksi belirtilmedikçe dillerinin çkt standart çk³ birimi kullancnn ekrandr. Programn parçasdr. Ancak, çal³mas hatalarn srasnda daha kar³la³lan kolay farkedilmelerini hata durumlarnn sa lamak bildirilmesi amacyla, de bu çktnn iletilerin bir normal yönlendirilir. çkt iletilerinden Aksi belirtilmedikçe ayrlabilmeleri bu birim istenir. -standart Bu nedenle, çk³ta hata oldu u iletileri gibihata kullancnn birimine ekrandr. Bu mesi, notlarda i³lenmesi, i³lenecek sonuçlarn örnek gösterilmesi. programlarda Bu çal³ma tip programlara hep ayn ³ekilde olacaktr: verilerin giril- konsol program, komut satr program ya da metin kipi olaya dayanan bir mantkla program çal³rlar. gibi Program adlar verilir. çal³maya Grak ba³lad nda arayüzle çal³an kullancyla programlar ileti³imi ise için ncnn gerekli bir edimde arayüzü bulunmasn kurar (pencere bekler. çizer, Kullancnn menü olu³turur, edimine dü me göre ilgili koyar, yordamlar v.b.) ve sonra çal³trr. kulla- 1.6 Program Geli³tirme Bir programn geli³tirilmesi çe³itli a³amalardan olu³ur: Tasarm masna, Bu a³amada hangi programlama yazlacak program dilinin kullanlaca na, ka t üzerinde kullancyla tasarlanr. Yani nasl programn bilgi al³veri³inde algorit- bulunulaca na, ramn hem geli³tirilmesinde ksacas neyin hem nasl de yaplaca na bakmnda büyük karar verilir. kolaylklar Dikkatli sa lar. bir tasarm, prog- Kodlama liyleyazlr.bununsonucundayazlmn Bu a³amada program tasarm srasnda verilen kararlara göre bir programlama di- kaynak kodu ortamnda olu³turmak için olu³ur. 8 Kaynakkodunubilgisayar editör ad verilen yazlmlar kullanlr. 8 Metinde bunda sonra geçen kod sözcü ü aksi belirtilmedikçe kaynak koduna kar³ dü³ecektir.
31 23 Giri³ Snama medi ine,beklendi igibidavranpdavranmad nabaklr.bui³leminetkinli igözönüne Bu a³amada program çal³trlarak çe³itli senaryolar için do ru sonuçlar üretip üret- alnansenaryolarngerçekteolu³abilecekdurumlarnnekadarnörttü üyleba lantldr. Hata Ayklama gereklidüzeltmeleryaplr.programlarnilkyazldklar³ekliyledo ruolmalarneredeyse Bu a³amada snama a³amasnda bulunan hatalarn nedenleri belirlenerek olanakszdr. larda bile bütün Hatta hatalarn üstüne bulunup çok çal³lm³, düzeltilmi³ pek çok olmas hatas son bulunup derece düzeltilmi³ dü³ük bir olaslktr. program- Ayrca hiçbir program programlara hiçbir yeni zaman yetenekler tam olarak eklendikçe hatasz yeni olmayacaktr. hatalar olu³aca ndan Hata ayklama a³a i³lemine yukar yardmc olmak üzere hata ayklayc ad verilen yazlmlar kullanlr. Programlarda iki tür hata sözkonusu olabilir: 1. Yazm rallarna hatalar: uymuyordur. Programcnn yazd baz komutlar kulland programlama dilinin ku- 2. Mantk l³trlmasnda hatalar: sorun Programcnn çkar. Sözgelimi yazd bir kod tamsayy dilin kurallar ba³ka bir açsndan tamsay do rudur de i³kene ama bölmek ça- 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 Programlarn De erlendirilmesi Bu ne kadar a³amalar iyi bir sonucunda program ortaya oldu unun çkan de erlendirilmesinde bir programn iyi bir ³u program ölçütlere olup ba³vurulur: olmad nn, ya da Etkinlik ne kadar Bu konu hzl algoritmalarn çal³yor? Düzgün kar³la³trlmalarnda kullanlabilmesi için kullanlan ne kadar ölçütlerle sistem kayna ayndr. gerekiyor Program (hangi i³lemci, ne kadar bellek, ne kadar disk, v.b.?). Sa lamlk kendisine Program, bir yl kullancnn bilgisi soruldu unda yapaca kullanm kullanc hatalarna yanl³lkla kar³ (ya da dayankl kötü niyetle) m? Sözgelimi, yazarsa ne oluyor? bir isim Ta³nabilirlik ve ba³ka bir Program, i³letim sistemi üzerinde üzerinde fazla de i³iklik çal³acak yaplmas hale getirilebiliyor gerekmeden, mu? ba³ka bir donanm Anla³labilirlik geçtikten sonra Ba³ka kendiniz biri program bakt nzda okudu unda anlayabilecek anlayabilecek misiniz? mi? Hatta üstünden bir süre Bakm kolayl kolay m? Programdahataoldu undahatannkayna nnbelirlenmesivedüzeltilmesi Geli³tirilebilirlik lemelerin yaplmas Program kolay yeni m? yeteneklerin eklenmesiyle geli³tirilmeye açk m? Bu tip ek-
32 Program Geli³tirme 24 Geli³tirme çe³itli yöntemler a³amalarnda geli³tirilmi³tir. daha az Bu sorunla yöntemlerin kar³la³mak temel ve fark, daha problemin kaliteli yazlmlar nasl modellenece ine üretmek için ili³kin yöntemler yakla³mlardr. çe³itli alanlarda Blok yaygn yapl yakla³m, olarak kullanlmaktadr. nesneye dayal yakla³m, Seçti iniz fonksiyonel programlama yakla³m dili hangi gibi programlama nesneye dayal, yakla³mn Haskell diliyse kullanaca nz fonksiyonel dillerdir. da belirler. C++ Sözgelimi dili hem C blok dili yapl blok yapl, hem de Java nesneye dili dayal özellikler gösteren karma bir dildir Programlarn Çal³trlmas Bilgisayarlarn gisayardan bilgisayara çal³tracaklar ve i³letim programlarn sisteminden belli i³letim bir sistemine biçimi olmas göre zorunludur. farkllklar gösterir. Bu biçim, Sözgelimi, bil- bir i³istasyonunda bir ki³isel bilgisayar Solaris üzerinde i³letim sisteminde Windows i³letim çal³maz. sisteminde Hatta, yine çal³an ayn bir ki³isel program, bilgisayar Sun marka rinde Linux i³letim sisteminde de çal³maz. Programlarn bu çal³trlabilir biçimine üze- makina kodu biçimoldu undanprogramclarprogramlardo rudanbukodileyazmazlar. nsannanlamas ad verilir. Makina kodu, insanlarn anlamas ve üzerinde çal³mas son derece zor bir daha yardmc kolay yazlmlar (insan diline aracl yla daha yakn) makina yüksek koduna düzeyli çevirir ve bir çal³trrlar. dil ile kaynak kodunu olu³turup Kaynak çekle³tirilebilir: kodunun makina koduna çevrilmesi ve çal³trlmas i³lemi üç farkl yakla³mla ger- Yorumlama Programn komutlar bir tarafndan teker teker kodunaçevrilirveçal³trlr.yaniyorumlayc,öncebirincikomutuokur,makinakoduna okunur, makina çevirir çal³masnda ve çal³trr. çevirme Sonra i³lemi ikinci yeniden komutu yaplr. alr Herhangi ve ayn i³lemleri bir komutun yapar. çevrilmesinde Programn her da çal³trlmasnda bir hatayla kar³la³t nda bunu kullancya bildirir ve çal³may ya durdurur. Basic, Perl, Tcl gibi diller genellikle yorumlayclar aracl yla kullanlrlar. Derleme Program bir derleyici tarafndan bir bütün halinde rilerek bir çal³trlabilir dosya olu³turulur. Bu dosya daha okunur sonra ve istendi i makina zaman koduna çal³trlr, çev- yalnzca yani bir çevirme kere yaplr. ile çal³trma Herhangi i³lemleri bir komutta birbirinden hata varsa ayrlr. çevirme Böylelikle i³lemi tamamlanmaz, çevirme i³lemi yaniçal³trlabilirkodunolu³masiçinhiçbiryazmhatasolmamasgerekir;ancakprogramdahasonraçal³trlrkençal³ma-zamanhatalarylakar³la³labilir.fortran,pascal, C gibi diller genelde derleyicilerle kullanlrlar. Karma sanal Hem bir derleme bilgisayarn hem makina de yorumlama koduna (bytecode) tekni i kullanlr. çevrilir Bu ve daha tip çal³mada sonra bu sanal kaynak bilgisayar kodu yazlm³ gerçekleyen bir kaynak bir program kodu önce yardmyla Java derleyicisinden yorumlanarak geçirilerek çal³trlr. Java Örne in sanal makinasnn Java dilinde (Java nay gerçekleyen Virtual Machine bir Java - JVM) çal³ma makina ortam(java koduna Runtime dönü³türülür; Environmentsonra da JRE) bu sanal yardmyla maki- çal³trlr. Yorumlama d ndan hz yönteminde dü³üktür. Ayrca kodun yorumlayc okunmas ve yalnzca çevrilmesi kar³la³t programn ilk hatay çal³mas rapor srasnda edebilir. yapl- Bu
33 25 Giri³ hata bilir. düzeltildi inde Oysa derleyici kaynak sonraki kodundaki çal³mada bütün da program hatalar ancak bulabilir. bir sonraki Buna kar³lk hataya kadar hata ayklama ilerleye- i³lemi nedeniyle yorumlayclarla daha esnek bir daha çal³ma kolaydr. ortam Ayrca sa lanr. derleyicilerle Son yllarda gelen iki baz yöntemin snrlamalarn üstün yanlarn kalkmas birle³tiren karma diller (Java ve Python gibi) öne çkmaya ba³lam³lardr Kitaplklar Bir larn programcya hantalla³malarna gerekebilecek neden olur. her ³eyi C dili programlama bu nedenle dilinin oldukça içine küçük almak bir o dil dili olarak i³leyecek tasarlanm³tr. araç- yer almaz; Örne in sözgelimi basit karekök aritmetik alma i³lemlerin i³lemi için ötesindeki bir C komutu matematik yoktur. i³lemleri Bununla dilin birlikte, tanm pek içinde programcnn bu tip i³lemlere gereksinim duyacaklar da açktr. Böyle bir durumda programc, çok tip i³lemler isterse için karekök kendi kodlarn alma i³lemini yazmasnn yapacak önemli kodu sakncalar kendisi yazabilir. vardr: Ancak programcnn bu 1. Her programcnn ayn i³leri yapan kodlar yazmas büyük zaman kaybna yol açar. 2. Programcnnyazaca kodhatalolabilir,yaniyanl³sonuçüretebilir.yadado rusonuç üretse ya da sistem bile, yeterince kayna etkin harcayabilir. olmayabilir, yani i³lemi yapmak için gere inden fazla zaman Hem cya gerekebilecek dilin tanmn i³lemler(yordamlar) küçük tutmak hem de bu sakncalar giderebilmek için, ço u program- kitaplk karekökünü almak isteyen bir programc matematik ad verilen kitapl ndaki ar³ivlerde toplanm³tr. Bir saynn sqrt lir. Kitapl n kullanlmas yukarda sözü geçen sakncalar giderir, yani yordamn programcya kullanabi- kazandrd gibi, do ru ve etkin çal³t snanm³ oldu undan dikkatini programn di er zaman smlarna yo unla³trma frsat verir. k Standartlar C ortamlardaki dilinin geli³tirilmesinde araçlar arasnda gözetilen bir standart ana hedeerden olmas gerekti i biri ta³nabilirlikti. açktr. C dilinde Bunun yaplan için de i³ik dartla³ma çal³malar sonucunda olu³an ANSI C standard, hem C dilinin kurallarn belirler, stan- hem lklarda de bir yer C alacak geli³tirme yordamlar ortamnda tanmlar. bulunmas Uluslararas zorunlu Standartlar olan standart Organizasyonu'nun kitaplklar ve bu kitap- C++ dili için hazrlad ISO-C++ standard da son yllarda yazlm³ bütün C/C++ (ISO) tirme ortamlar için en temel kaynaklardan birini olu³turmaktadr. geli³- Di er sndaki önemli ba lantlar bir standart belirler. olan Örne in POSIX dosya standard silmek, ise dosya programlama ad de i³tirmek, dili ile i³letim sistemdeki sistemi ba³ka ara- bir programla haberle³mek gibi i³lemler için gereken yordamlar bu standartta yer alrlar. Yine sa lanamam³tr. de skça gereksinim Örne in duyulan grak bir bütün arayüze i³lemler sahip için uygulamalardaki bütün kitaplklarda grak i³lemlerini bir standart yapacak henüz kitaplklarstandartla³trlmam³oldu undançe³itlirmavekurumlarbui³lemleriyapanfarkl
34 Program Geli³tirme 26 kitaplklar lamyla ta³nabilir geli³tirmi³lerdir. olmamakta, Dolaysyla yalnzca bu bu kitaplklar kitapl n kullanlarak destekledi i yazlan ortamlara programlar ta³nabilmektedir. tam an- do ru Son araçlar zamanlarda seçildi inde farkl bu i³letim sorunun sistemlerinde da üstesinden çal³abilen gelinebilmektedir. grak kitaplklar yaygnla³t için Derleme A³amalar Kaynakkoddanüretilecekolançal³trlabilirmakinakodundahemprogramcnnkendiyazd yordamlarn, bulunmas gerekir. hem de Bu yararland nedenle, kaynak kitaplk kodunun yordamlarnn makina koduna makina çevrilmesi koduna çevrilmi³ iki a³amada hallerinin çekle³ir ( ekil 1.20): ger- derleme baglama kaynak kodu ara kod çalistirilabilir kod kitapliklar ekil 1.20: Tek kaynak kodlu projelerin derleme a³amalar. Derleme lka³amadakaynakkoduderlenerekbir ara yazd yordamlarn makina kodu kar³lklarn içeren kodadönü³türülür.bukod,kullancnn kullanm³ oldu u kitaplk yordamlarn içermedi inden bir dosyadr. henüz çal³trlabilir Ancak, programcnn de ildir. durumda Ba lama ba lantlar kinci kurulur a³amada ve ara çal³trlabilir kod ile programcnn dosya üretilir. kulland Sözgelimi, kitaplk programc yordamlar karekök arasnda için matematik kitapl ndaki bir yordam kullandysa, alma ba layc damnn kullanld yerlerde gerekli düzenlemeleri yapar. ara kodda karekök yor- 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 durumde erlerinikendinizçkarn.altsnrn1,üstsnrn2 n -1³eklindeverildi igenel 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.
35 27 Giri³ 4. Euclides algoritmasnda iki saydan büyük olannn hangisi oldu una baklmakszn a de i³kenine say1, b de i³kenine say2 varsayalm. Ba³langçta de erleri atanarak yineleme yapsna girildi ini say1 > say2 ya da say1 < say2 goritma do ru sonuç üretir mi? olmas durumlarnda al- 5. Çarpanlara çarpanlarn ayrarak bulma en yordamnn küçük ortak ak³ kat çizene ini hesaplamak çizin için ve gereken örnek de erler en küçük üzerinde ortak katn i³leyece ini gösteren tabloyu olu³turun. nasl
36 Program Geli³tirme 28
37 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: Alan: ekil 2.1: Örnek 1 ekran çkts. Örnek üzerinde bir C programnn baz temel özelliklerini görelim: Açklamalar büyük yarar Anla³labilirli iartrmakiçinkoduniçindegerekliyerlereaçklamalaryazmakta nld kod parçalarnn vardr. Özellikle açklanmas kolayca gerekir. anla³lmayacak Açklamalar programlama derleyici tekniklerinin tarafndan gözard kulla- edilir, kilde yazlabilir: yani programn i³leyi³lerine hiçbir etkileri yoktur. Kodun içine açklama iki ³e- Birinci nur. Bu yöntemde, ³ekildeki açklamalar açklamann birden ba³na fazla bölü-yldz, satr sürebilir. sonuna yldz-bölü Örnekteki simgeleri birinci açklama birinci satrdaki lk C programm sözcükleriyle ba³lar ve üçüncü satrdaki ko- alann bir açklamann hesaplar. içinde sözcükleriyle ikinci bir açklama biter. Bu olamaz. tip açklamalar çiçe açklamalar içiçe yazlamaz, ³u ³ekilde yani yap olu³turur: bir...a... /*...b... /*...c... */...d... */...e... 29
38 30 Örnek 1 Bir dairenin çevresini ve alann hesaplayan program. /* lk C programm. * * * * Yarçap verilen bir dairenin çevresini ve alann hesaplar. */ #include <iostream> #include <stdlib.h> using namespace std; #define PI 3.14 int main(void) { float radius; float circum, area; cout << "Yarçap yaznz: "; cin >> radius; circum = 2 * PI * radius; area = PI * radius * radius; cout << "Çevresi: " << circum << endl; cout << "Alan: " << area << endl; return EXIT_SUCCESS; // cout,cin,endl için // EXIT_SUCCESS için
39 31 C Diline Giri³ Bu yapda birinci /* ile açklama ba³lar. Açklamann içinde görülen ikinci /* zard edilir ve gelen ilk gö- */ açklamay sona erdirir; yani açklamay b ve c olu³turur. Bundan sonra gelen bölüm bölgeleri (d lece inden hataya yol açar. bölgesi) normal C kodu gibi de erlendiri- açklamalar kinci yöntemde, için bu açklama yöntem çift daha bölü kullan³ldr. ile ba³lar ve Örnekteki satrn sonuna ikinci kadar açklama sürer. be³inci 1 Ksa satrdakicout,cin,endl satrdaki için sözcüklerindenolu³ur.üçüncüaçklamadaaltnc EXIT_SUCCESS için sözcüklerini kapsar. Komutlar tarafndan Cdilindekomutlarnoktalvirgülilesonaerer.Pe³pe³ebirdenfazlabo³lukderleyici ba³layp sona tek ermesi bo³luk zorunlulu u olarak de erlendirilir; yoktur. Yani dolaysyla bir komutun bir satr içinde cout << Alan: << area << endl; komutu cout << Alan: << area << endl; biçiminde ya da cout << Alan: << area << endl; biçiminde yazlabilirdi. C dilinde komutlarn noktal virgül ile sona ermesi ve fazla bo³luklar ile satr geçi³lerinin Gelenek öneminin bu konuda olmamas bir düzene nedeniyle uyulmazsa komutlar kodun satrlara okunmas istendi i ve anla³lmas ³ekilde yerle³tirilebilir.ancak Okunabilirli i artrmak amacyla alt-bloklar bir miktar içeriden ba³latlrlar son derece zorla³r. (girintileme). fonksiyon Böylece blo undaki ayn düzeydeki(ayn bütün komutlar blo a satr ait) ba³ndan komutlar dört ayn harf hizadan içeriden ba³larlar. ba³lamaktadr. Örnekte Özellikle seçimin içindeki içiçe yaplarn seçim gibi) kullanld bloklar hiyerar³ik durumlarda bir (seçimin ³ekilde girintilemek içindeki yinelemenin büyük önem içindeki ta³r. Atama Atama i³lemi e³it i³aretiyle yaplr. Örnekteki circum = 2 * PI * radius; komutu bir atama komutudur, 2 * PI * radius deyiminin sonucunu circum nine atar. de i³ke- 2 1 Bu açklama yöntemi C++ ile getirilmi³ bir yeniliktir, C dilinde geçerli de ildir. 2 Tek atama komutuyla birden çok de i³kene ayn de er atanabilir. Örne in a = b = c = 24; komutu a, b ve c de i³kenlerinin üçüne de 24 de erini atar. Bu i³lem sa dan sola do ru gerçekle³tirilen pe³pe³e atamalar ³eklinde dü³ünülebilir: c = 24; b = c; a = b;
40 simler 32 Fonksiyonlar rilir. Ana Blok i³i yapan yapl fonksiyonun programlamadaki ad yordamlar C dilinde fonksiyonlar ile gerçekle³ti- main ana i³ten ba³lanaca için her programn olarak bir ve verilmelidir. yalnz bir Programn yürütülmesine main zorunludur. fonksiyonu bulunmas C süslü-ayraç dilinde bir ile fonksiyonun ba³lar ve kapa-süslü-ayraç içerdi i komutlar ile sona bir blok erer. olarak Bu notlardaki de erlendirilir. ço u örnekte Bloklar aç- main fonksiyonu ³u ³ablona uyacaktr: int main(void) {... return EXIT_SUCCESS; #include <iostream> Ba³lk dosyalar kullanld zaman Kitaplklarda derleyiciye tanmlanm³ bunlarla ilgili olan bilgileri fonksiyonlar, nerede birimler bulabilece ini ya da söylemek büyüklükler rekir. Bu bilgilerin yer ald ba³lk dosyalar program ba³nda ge- #include belirtilir. Örne in komutuyla cout birimi iostream ramda ba³lk dosyasnda bulundu undan örnek prog- komutuyeralmaktadr. 3 Benzer³ekilde, EXIT_SUCCESSsözcü ününkullanlabilmesiiçin stdlib.h dosyas içerilmelidir. Birkitaplktanyararlanaca nzzamangereklibilgilerinhangiba³lkdosyalarndayerald n Bölüm bilmeniz 1.6.4) bunlarn gerekir. ba³lk Temel dosyalarn fonksiyonlar ço u standartlarda C/C++ kitabnda belirlenmi³ bulabilirsiniz. oldu undan Standartlara (bkz. belgelerine girmemi³ ba³vurmalsnz. fonksiyonlar içinse kulland nz derleyici ve kitaplklarn yardmc simler Programlardaki gerekir: de i³ken, fonksiyon gibi varlklara verilen isimlerin baz kurallara uymalar simler, kurala göre ngilizce pi, weight, büyük ve küçük harer, rakamlar ve altçizgi i³aretinden olu³abilir. Bu weight1 ve weight_1 geçerli isimlerdir, ancak π, a rlk ve weight-1 geçerli isimler de ildir. smin ilk simgesi bir rakam olamaz. Bu kurala göre 2weight geçerli bir isim de ildir. 3 C standardnda ba³lk dosyalarna.h uzants verilir. C++ standardnda ise baz ba³lk dosyalarnn uzants bulunmayabilir. Örnekteki iostream ba³lk dosyas C++ ile tanmlanm³ yeni ba³lk dosyalarna bir örnektir. 4 Unix i³letim sistemlerinde yardmc belgeler ile ilgili bilgi için bkz. Ek B.1.
41 33 C Diline Giri³ smin yan iki en ismin az ilk farkl 31 olaca simgesi kesindir anlamldr. ama Ba³ka aynlarsa bir derleyici deyi³le, bu ilk iki 31 ismin simgesi farkl ayn olmadolma- na karar verebilir. Örne in population_increase_between_years_2000_and_2001 ile population_increase_between_years_2001_and_2002 ilk 31'er simgeleri ayn oldu undan baz derleyiciler bu ikisinin isimli ayn iki de i³ken de i³ken tanmlanrsa karar verebilir. olduklarna simlerdebüyük-küçükharfayrmvardr.yani weight1, Weight1, WEIGHT1ve weight1 isimlerinin hepsi geçerli olmakla birlikte hepsi birbirinden farkldr. C dilinin sözcükleri isim olarak seçilemez. Yani örne in int, main, void, return isimler de ildir. Kitaplklardan alnan fonksiyon ya da di er varlklarn isimleri geçerli isimler arasnda de ildir. Sözgelimi, istenirse sakl cout bu durumda çkt için kullanlan isimli bir de i³ken kullanlabilir ancak cout kitaplk biriminden artk yararlanlamaz. Büyük cyla isim projelerde uzaylarndan isim çak³malar yararlanlr. sorun Bu kitaptaki yaratmaya örnekler ba³lar. küçük Bu durumu boyutta düzeltmek olduklar ama- bu sorunlar gözard edilecek ve standart isim uzaynn kullanld n belirtmek üzere için programn ba³nda using namespace std; bildirimi yaplacaktr. Bu bildirim cin, cout ve endl kullanlmazsa bu de erlere eri³im için ba³larna de erlerine kolay eri³imi sa lar; std:: eklemek gerekir: std::cin >> radius; std::cout << Area: <<... << std::endl; simlerin seçiminde ço u programcnn uydu u baz gelenekler vardr: De i³ken ya da altçizgi ve fonksiyon i³aretiyle isimleri ba³lamaz. küçük harerle ba³lar. Ba³ka bir deyi³le, büyük harer De i³ken bir isim verilir. ve fonksiyonlara Sözgelimi bir gösterdikleri insann a rl bilgiye bilgisini ya da yaptklar tutacak i³e bir uygun de i³kene dü³en, anlaml x4szb anlamsz ya da gibi height gibi yanltc isimler verilmez. Anlaml lir. Bu durumda isimler verilmek ya ismi olu³turan istendi inde iki bazen sözcük birden bir altçizgi fazla i³aretiyle sözcü e gereksinim birle³tirilir duyulabi- birth_month) ya da ikinci sözcük büyük hare ba³lar (örne in birthmonth). (örne in Gelenek 2.2 De erler Tamsaylarndo algösterilimlerionludüzendedir,ancakistenirsesekizliyadaonaltldüzende de ba³layan gösterilebilirler. saylarn sekizli, Örnekte 0x ile 2 says ba³layanlarn onlu gösterilimde onaltl düzende yazlm³ olduklar bir tamsaydr. varsaylr. 0 Buna rakamyla 59 says sekizli düzende 073, onaltl düzende 0x3b olarak yazlr. göre,
42 De i³kenler 34 Kesirli (mantis saylarn * 10 do al gösterilimi noktal gösterilimdir, ancak istenirse bilimsel gösterilim sirli saydr. Saynn ) de kullanlabilir. Örnekte 3.14 says noktal gösterilimde yazlm³ bir ke- us olarak de erlendirilir. yazl³nda Buna göre, E 3.14 simgesi says geçiyorsa bilimsel gösterilimde bu simgenin 314E-2 öncesi (314 mantis, * 10 sonras üs yazlabilir. ) olarak 2 Simgeler katardr; yalnzca tek, katarlar A harnden çift trnak söz edilmek i³aretleri isteniyorsa'a' arasnda yazlrlar. ³eklinde Örnekte yazlr. Katar Alan: içinde de eri yazlan bir her olarak bo³lu un de il, be³ önemi bo³luk vardr, olarak yani de erlendirilir. sözgelimi pe³pe³e Örne in be³ Alan bo³luk : brakld nda katarnda Alan bu bir sözcü ü bo³luk ile iki nokta üstüste i³areti arasnda be³ bo³luk bulunacaktr. 2.3 De i³kenler C de i³kenin dilinde, tanmlanmas bir de i³kene gerekir. bir de er Tanmlama vermeden i³lemi, ya da bellekte de erini gerekti i bir hesapta kadar kullanmadan yerin bu de i³ken önce için ba³ka ayrlmasn i³lerde kullanmaz. sa lar; böylece sistem, bellekte ayrlan bu yeri bu de i³ken için kullanr ve Tanmlama, de i³kenin tipinin ve adnn belirtilmesinden olu³ur. Örnekte float radius; tanmderleyiciye radius adndabirde i³kenoldu unuvebirkesirlisaytutaca nbelirtmeye yarar. Ayn tipten olan de i³kenler ayn tanmn içinde yer alabilirler. Örnekteki float circum, area; tanm, her ikisi de birer kesirli say olan, circum ve area adnda iki de i³ken kullanaca mz anlamna gelir. Örnekteki tanmlar istenirse float radius; float circum; float area; ³eklinde ayrlarak ya da float radius, circum, area; ³eklinde birle³tirilerek de yazlabilirdi. Tanm srasnda istenirse de i³kene ba³langç de eri de verilebilir: float radius, circum = 0.0, area = 0.0;
43 Gelenek 35 C Diline Giri³ Bu durumda tanm srasnda circum ve area de i³kenlerinin her ikisine de 0.0 de eri verilir, radius de i³kenine bir ba³langç de eri verilmez. De i³kenlere de i³ken rasgele ba³langç bir de er de eri alabilir atanmas ve programcnn yararl bir dikkatsiz al³kanlktr. davranmas Ba³langç durumunda de eri atanmazsa de er yanl³lkla hesaplarda kullanlabilir ve istenmeyen sonuçlara yol açabilir. bu rasgele Genelde bir blok içindeki de i³ken tanmlar ile komutlar birbirlerinden ayrlr, yani kullan- Gelenek lacak ve komutlarn bütün de i³kenlerin ba³lad yerin tanmlar kolayca bittikten görülmesini sonra sa lamak komutlar amacyla ba³lar. 5 Tanmlarn tanmlar ile sona komutlar erdi i arasnda bir satr bo³luk braklr. 2.4 Veri Tipleri C dilinde tanmlanan taban veri tipleri ³unlardr (bkz. Bölüm 1.1.1): tamsay int sakl sözcü üyle belirtilir. Bu veri tipi short ve long rek ksa tamsay belirteçleriyle geli³tirile- (short int) ve uzun tamsay (long Aksi belirtilmedikçe tamsay tiplerinin i³aretli olduklar int) varsaylr, tipleri yani olu³turulabilir. hem de negatif de erler alabilirler. De i³ken yalnzca pozitif saylardan(0 hem da pozitif lir) de er alacaksa i³aretsiz olarak tanmlamak için olabi- unsigned lir. Ksacas, 6 adet tamsay tipi vardr: int, sözcü ü kullanlabi- short int, long int, unsigned int, unsigned short int ve unsigned long int. kesirli say float nirse çifte sakl duyarllkl sözcü üyle (double) belirtilir. ya Say da uzun daha çifte yüksek duyarllkl duyarllkla gösterilmek iste- (long kullanlabilir. double) tipleri simge char de erler sakl alrlar sözcü üyle (bkz. Ek belirtilir. A). Örne in Simgeler 'A' kullanlan har ASCII kodlamadaki kodlamasnda sralarna 65. srada göre oldu undan 'A' simgesinin say de eri 65'tir. mantksal bool sakl sözcü üyle belirtilir. Bu tipten de i³kenler true ya da false alabilirler. de erini 6 Bir son de i³kenin derece önemlidir. tanmlanaca Bu nedenle veri tipi, bir de i³kenin o de i³kenin veri alabilece i tipine karar de er verirken aral n o veri belirledi inden verdi i de er aral na dikkat etmek gerekir. Sözgelimi tipinin izin short int ile arasndaki saylarn gösterilebilmesine olanak veriyorsa ve veri sizin tipi tanmlayaca nz yalnzca de i³kenin malsnz. Bir veri de erini tipinin boyu almas sözkonusu olabilecekse de i³keninizi bu tipten tanmlama- sizeof bu boy kadar yer kaplar (sekizli cinsinden). i³lemi yardmyla belirlenebilir. Her de i³ken bellekte Ksa i³aretli tamsay hem de veri i³aretsiz tipinin ksa boyunun tamsaylar 2 sekizli için yani geçerlidir. 16 bit Bu oldu unu durumda varsayalm. i³aretsiz Bu ksa boy tamsay hem cinsinden tanmlanan bir de i³kenin alabilece i en küçük de er 0, en büyük de er ise yani olacaktr. 5 C++ dilinde komutlar ba³ladktan sonra da de i³ken tanmlanabilir. C dilinde buna izin verilmez. 6 C dilinde mantksal verileri temsil edecek özel bir veri tipi yoktur, bu tip C++ dilinde getirilmi³tir; yani bool, true ve false sözcükleri geçerli C sözcükleri de ildir.
44 De i³mezler De i³mezler Programda ler. Örnekteki kullanlan baz bilgiler de programn farkl çal³malar arasnda de er de i³tirmez- PI büyüklüklerdir. De i³mezlerin says ve dairenin bazlarna çevresinin isim vermek hesaplanmasnda birtakm kolaylklar kullanlan sa lar: 2 says bu tipten Anla³lrl artrr. Programn içinde 3.14 yazmak yerine PI birinin bu saynn neye kar³ dü³tü ünü daha kolay anlamasn yazmak sa lar. program okuyan De i³tirmek erinin yetersiz kolay kald na olur. Diyelim ve programn de erinin geli³tirilmesinin daha uygun oldu una ileri a³amalarnda karar verirsek 3.14 kod deiçinde saylarnn tek bir yerine noktada de i³tirmek yazmamz yeterli gerekir. olur. Daha Öbür da kötüsü, türlü, kodun kodun içindeki içindeki bütün ba³ka 3.14 yüklükleri gösteren 3.14 de erlerinin de geçmesi olasl dr. Bu durumda bütün 3.14 bü- de erlerini tek tek inceleyerek de i³tirilip de i³tirilmeyece ine karar vermek gerekir. De i³mezler iki ³ekilde tanmlanabilirler: 1. #define Örnekte yaplan bildirimiyle 3.14 saysna tanmlama. Bu yöntem bir de ere bir isim vermekte kullanlr. PI kodiçinde ismini vermektir. Bu bildirimin sonucu, programcnn PI tantlan de i³mezlere geçenheryerekendisinin3.14de eriniyazm³olmasylaayndr.bu³ekilde gelenek olarak tamam büyük harerden olu³an isimler verilir. Bu bildirim yönteminde de i³mezlerin tipleri ayrca belirtilmez. Tamsay de i³mezler int tipine s myorlarsa long int varsaylrlar. De erlerinin sonuna l ya da L eklenirse long, hareri u ya da U eklenirse unsigned belirteci seçilmi³ olur. #define MAXSHORT 0x7FFF #define MAXUSHORT 65535U Kesirli de i³mezlerin de erlerinin sonuna f ya da F eklenmemi³se double duklar varsaylr. tipinden ol- l ya da L eklenirse long double tipinden olurlar. #define EULER F #define PERCENT 1E-2 2. De i³ken tanmna benzer ³ekilde ancak veri tipinin önüne const tanmlama. Böylece de eri de i³tirilemeyen bir de i³ken tanmlanm³ niteleyicisi olur. Bu koyarak tanmlanan de i³mezlere büyük harerden olu³an isimler verilmez. Örnekteki ³ekilde PI mezinin bu yöntemle tanm ³öyle olurdu: de i³- const float pi = 3.14; Herikitanmdadade i³mezolarakbildirilmi³birbüyüklü ede eratanmayaçal³rsaderleyici hata verir. 7 7 C dili const ile tanmlanm³ de i³mezlerin de erlerinin de i³tirilebilmesine izin verir. Bu tipten bir de i³kene atama yaplmak istendi inde derleyici hata de il, yalnzca bir uyar üretecektir.
45 37 C Diline Giri³ 2.6 Aritmetik Deyimler Aritmetik deyimlerde kullanlabilecek i³lemler ³unlardr: Toplama: + i³leciyle gerçeklenir. Çkartma: - i³leciyle gerçeklenir. Çarpma: * i³leciyle gerçeklenir. Bölme: / i³leciyle gerçeklenir. Kalan: % tanml de ildir. i³leciyle gerçeklenir. Yalnzca iki tamsay arasnda yaplabilir, kesirli saylarda Bunlarn alabilirler yansra (bkz. Bölüm matematik 2.9). kitapl nda yer alan fonksiyonlar da aritmetik deyimlerde yer Komutlarn okunurlu unu artrmak amacyla C programclarnn uyduklar geleneklerden biri Gelenek de, yer e³it alan i³aretinin i³leçlerin öncesinde (örnekte ve sonrasnda birer bo³luk brakmaktr. Benzer ³ekilde, deyimlerde + simgesi) önce ve sonralarnda da birer bo³luk braklr. C'de Yüksek deyimlerin öncelikliden hesaplanmasnda alçak öncelikliye izlenen do ru öncelik öncelik sras, gruplar matematikten ³öyledir: al³k olunan sradr. 1. Ayraç içindeki deyimler 2. Say i³areti belirten + ve - i³lemleri, artrma, azaltma 3. Çarpma, bölme, kalan 4. Toplama, çkarma E³it öncelik gruplar kendi içlerinde soldan sa a do ru de erlendirilirler. Örnek. a + b + c + d + e 5 aritmetik deyimi C'de (a + b + c + d + e) / 5 ³eklinde yazlmaldr. Ayraçlar kullanlmazsa ortaya çkan a + b + c + d + e / 5
46 Tip Dönü³ümleri 38 C deyimi aritmetik deyimine kar³ dü³er. Örnek. p * r % q + w / x - y deyimi ³u srayla hesaplanr: t1: p * r t2: t1 % q t3: w / x t4: t2 + t3 t5: t4 - y a + b + c + d + e Tip Dönü³ümleri ³lemegirensaylarnherikisidetamsayisesonuçdatamsayolur.Saylardanherhangibirinin kesirlisayolmasdurumundasonuçdakesirlisayolacaktr.budurumbölmei³lemindedikkat edilmesi olacaktr, gere ini yani sonucun do urur. varsa Bölme kesir i³lemine ksm atlacaktr. giren her iki Örne in say da tamsay ise sonuç da tamsay 14 / 4 de il3olacaktr. ³lemegirenherikisaydatamsayisevesonucunkesirksmnnyitirilmemesi deyiminin sonucu 3.5 isteniyorsa için çözüm ³u saylardan yazl³larla en sa lanabilir: az birinin kesirli say olmasn sa lamak gerekir. Yukardaki örnek 14.0 / 4 14 / / 4.0 Bir bölme i³lemine giren iki de i³kenin ikisinin de tamsay tipinden olmas durumunda sonuç yine tamsay olacaktr. Örne in int num1 = 14, num2 = 4; float quotient; quotient = num1 / num2; mak i³lemlerisonucui için quotientde i³keni3.0de erinialr. ³lemindo ruolarakyaplmasnsa la- num1 ve num2 i³leme de i³kenlerinden en az birinin kesirli say tipine çevrilmesi gerekir. Bu tip zorlama tenentipinadnnyazlmasylayaplr.yukardakiörne indo ruçal³masiçin³ukomutlardan ad verilir ve bir deyimin ba³na ayraç içinde deyimin sonucunun almas is- herhangi biri kullanlabilir:
47 39 C Diline Giri³ quotient = (float) num1 / num2; quotient = num1 / (float) num2; quotient = (float) num1 / (float) num2; Birinci komutta yalnzca num1 de i³keni, ikinci komutta yalnzca num2 de i³keni, üçüncü komutta ise her ikisi birden kesirli sayya çevrilmektedir. Buna kar³lk quotient = (float) (num1 / num2); komutu ise önce bölmeyi sonra tip zorlamasn yapaca ndan quotient de erini atar. de i³kenine yine 3.0 Genelolarak,biri³lemegirensaylarfarkltiptense,bunlarnortakbirtipeçevrilmelerigerekir. Dar bir toplama tipten geni³ i³leminin tipe i³lenenlerinden geçi³ i³lemleri derleyici biri tamsay tarafndan di eri kesirli otomatik say olarak ise tamsay yaplr. olan Örne in, sayya çevrilir ve toplama yaplr. A³a daki örnekte toplama i³leminin ikinci i³leneni kesirli say oldu undan toplamadan önce kesirli num1 de i³keni kesirli sayya çevrilecektir: int num1 = 14; float sum; sum = num ; Geni³ tipten dar tipe geçi³ler ise bilgi yitirilmesine neden olabilirler. Örne in kesirli say tipinden bir de i³kenin tamsay tipinden bir de i³kene atanmas srasnda saynn kesir ksm yitirilebilir: int num1; float num2 = ; num1 = num2; Derleyiciler bu gibi durumlarda genelde hata de il yalnzca uyar üretirler. 2.8 Artrma / Azaltma Bir atamann sa tarafndaki deyim, atamann sol tarafndaki de i³keni içeriyorsa, yani de i³ken = de i³ken deyim; ( herhangi bir i³lem simgesi olabilir) ³eklindeyse bu komut de i³ken = deyim;
48 Matematik Kitapl 40 ³eklinde ksaltlabilir. Örne in: a += 5; // a = a + 5; /= 2; // / 2; a *= c + d; // a = a * (c + d); Buna labilir: göre, bir de i³kenin de erini artrmak ya da azaltmak için a³a daki komutlar kullan- a = a + 1; a += 1; a = a - 1; a -= 1; Ancak larndan artrma C'de bunlar ve azaltma için özel i³lemleri i³leçler programlarda tanmlanm³tr. skça gereksinim duyulan i³lemlerden olduk- ++ de i³keninde erini1artrr; i³leci, önüne ya da arkasna yazld -- Her iki i³leç de yalnzca tamsay i³leciyseönüneyadaarkasnayazld i³lecinde erini1azaltr. önüne mi arkasna m yazld nn veri bir tipleri önemi ile yoktur: çal³rlar ve basit kullanmda i³lecin de i³kenin 8 a++; a--; ++a; --a; 2.9 Matematik Kitapl ANSI fonksiyonlar standard, belirler. bir C Bu derleme fonksiyonlarn ortamnn kullanlabilmesi matematik kitapl nda için programlarn bulunmas ba³nda zorunlu olan math.h ba³lk dosyasnn alnmas gerekir. Matematik siyonlardaki kitapl nn en sk kullanlan fonksiyonlar Tablo 2.1'de verilmi³tir. Bütün bu fonk- x ve y giri³ parametreleri double tipindendir ve çk³ parametresi de double tipinden olacaktr. 8 Artrma ve azaltma i³lemleri ba³ka i³lemlerle birlikte kullanlabilir. Sözgelimi bir artrma i³lemiyle bir atama i³lemi ayn komut içerisinde yaplabilir. Böyle durumlarda artrma/azaltma i³lecinin de i³ken adnn önüne ya da arkasna yazlmas önem kazanr. Önüne yazld nda önce artrma, sonra atama yaplacaktr. Arkasna yazld ndaysa önce atama, sonra artrma yaplr. Yani komutu y = ++x; x++; y = x; koduna kar³ dü³erken komutu y = x++;
49 41 C Diline Giri³ Ad ³levi sin(x) cos(x) tan(x) trigonometrik fonksiyonlar asin(x) acos(x) atan(x) ters trigonometrik fonksiyonlar sinh(x) cosh(x) tanh(x) hiperbolik trigonometrik fonksiyonlar exp(x) e log(x) log10(x) x e ve 10 tabannda logaritma fonksiyonlar pow(x,y) sqrt(x) floor(x) ceil(x) fabs(x) x y x alt ve üst snr fonksiyonlar: x x x Tablo 2.1: Matematik kitapl fonksiyonlar. Trigonometrik fonksiyonlarda giri³ parametresi derece de il radyan cinsinden verilmelidir; örne in sin(30) deyimi 0.5 de il de erini üretir. 30 derecenin sinüsünü almak için sin(30* /180) ya da sin( /6) deyimini yazmak gerekir. Alt snadikkatedilmelidir.altsnrfonksiyonuherzamanosaydandahaküçükolanilktamsayy, ve üst snr fonksiyonlarnn çal³masnda giri³ parametresinin pozitif ya da negatif olma- üst snr fonksiyonu ise o saydan daha büyük olan ilk tamsayy verir. floor(3.1) 3, floor(-3.1) -4 ceil(3.1) 4, ceil(-3.1) -3 Tamsaylar için de tamsay giri³ parametresi alan ve tamsay çk³ parametresi üreten abs isimli bir mutlak de er fonksiyonu vardr Giri³ / Çk³ C Bölüm dilinde 1.5). kullancyla Girdiler ileti³imi sa layan i³lemler giri³/çk³ birimleri üzerinden yaplr (bkz. cin biriminden alnrken, çktlar cout, hatalar da cerr gönderilir. biriminebirimine Örnekteki 9 cin >> radius; y = x; x++; koduna kar³ dü³er. 9 C dilinde cin, cout ve cerr birimleri yoktur, bunlarn yerine standart girdi/çkt kitapl ndaki fonksiyonlarn kullanlmas gerekir (bkz. Ek 8).
50 Giri³ / Çk³ 42 komutu sonucunda radius Birden fazla de i³ken birlikte de i³keni okunmak kullancnn isteniyorsa tu³takmndan bunlar birbiri ardna yazd >> saynn i³aretleriyle de erini belirtilebilir. alr. num1, ikinci Sözgelimi, saynn iki de eriyse tane say de eri okunacak ve kullancnn yazd birinci saynn de eri num2 de i³kenine aktarlacaksa: cout << Saylar yaznz: ; cin >> num1 >> num2; gibi bo³luk bir brakmas program parças gerekir. kullanlabilir. Bu örnekte kullancnn saylar yazarken aralarnda bir Çk³ yimlerin birimlerine de erleri katarlar görüntülenir. ya da Örnekteki deyimler gönderilebilir. Katarlar olduklar gibi yazlrken de- cout << Alan: << area << endl; komutu ekrana önce Alan: katarn, daha sonra area de i³keninin de erini yazar ve yeni satra geçer. Programda circum ve area de i³kenleri tanmlanmadan ve atama komutlar 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 ö retilecektir. Basit hatalarda derleyicinin hangi mesajlar üretti i gözlenecektir. 10 Örnek 2. Formül Hesab y = e formülünde πx x de erini kullancdan alarak y bir program yazlmas isteniyor. de erini hesaplayan ve ekrana yazdran Örnekte verilen program yazn, derleyin ve çal³trn. x y'nin ald de eri gözleyin. için de erini verdi inizde PI de i³mezinin tanmn 3.14 yerine olarak verin ve ayn x de eri gözleyin. de erinde y'nin ald De i³ken tanmlarnn yapld 10 Unix i³letim sistemlerinde derleme a³amalar ile ilgili bilgi için bkz. Ek B.2.
51 43 C Diline Giri³ Örnek 2 y = e πx formülünü hesaplayan program. #include <iostream> #include <stdlib.h> #include <math.h> using namespace std; #define PI 3.14 int main(void) { float x, y; cout << "x: "; cin >> x; y = exp(-pi * x); cout << "y: " << y << endl; return EXIT_SUCCESS; // cout,cin.endl // EXIT_SUCCESS // exp float x, y; satrndaki 'x' harni 'X' ile de i³tirin ve derleme sonucunda olu³an hatay gözleyin. Örnekteki cin >> x; satrnn ardna PI = ; komutunu ekleyin ve derleme sonucunda olu³an hatay gözleyin. Bir önceki admda yapt nz de i³ikli i silmeden, örnekte PI de i³mezinin tanmland #define satrn silin ve float x, y; satrnn ardna const float PI = 3.14; de i³mez tanmn ekleyin. Derleme sonucunda olu³an hatay gözleyin. Ba³taki #include <math.h> satrn silin ve derleme sonucunda olu³an hatay gözleyin.
52 Giri³ / Çk³ 44 Sorular 1. Çal³t nz geli³tirme ortamnda int tabanl veri tiplerinin de er aralklarn belirleyin ve bu aralklar d³nda bir de er atand nda nasl bir sonuç elde edildi ini gözleyin. 2. A³a daki deyimlerin sonuçlarn bulun: % 3 * 5 45 / (4 + 7) / 2 3. A³a daki aritmetik deyimleri gerçekleyen C deyimlerini yazn: k 1 ef g 2ab cd h x(y + z) 4. A³a daki C deyimlerinin gerçekledi i aritmetik deyimleri yazn: a + 3 * b - (c + d) / 2 * y;
53 Bölüm 3 Ak³ Denetimi Bu bölümde blok yapl programlamada gereken seçim ve yineleme yaplarnn C dilinde nasl gerçeklendikleri üzerinde durulacaktr. Örnek 3. kinci Derece Denklem Kökleri kinci dereceden (ax 2 + bx + c = 0 ³eklinde) bir denklemin köklerinin yerlerini belirleyen bir program yazlmas isteniyor. Diskriminantn b 2 4ac ³eklinde tanmland n ve köklerin x 1,2 = b ± b 2 4ac 2a formülüne göre hesaplanaca n gözönünde bulundurarak, program denklemin katsaylarn kullancdan aldktan sonra a³a daki i³lemleri gerçekle³tirecektir: Denklemin gerçel kökü yoksa (diskriminant negatifse) bu durum kullancya bildirilir. Denklemin kökleri çak³ksa(diskriminant sfrsa) bu durumu kök de eriyle birlikte kullancya bildirilir. Denklemin iki farkl gerçel kökü varsa (diskriminant pozitifse) bunlar hesaplanarak ekrana çkartlr. Programn örnek bir çal³masnn ekran çkts ekil 3.1'de verilmi³tir a, b ve c katsaylarn yaznz: ve noktalarnda iki gerçel kökü var. ekil 3.1: Örnek 3 ekran çkts. 45
54 46 Örnek 3 kinci dereceden bir denklemin köklerini bulan program. #include <iostream> #include <stdlib.h> #include <math.h> using namespace std; int main(void) { float a, b, c; float disc; float x1, x2; // cout,cin,endl // EXIT_SUCCESS // sqrt cout << "a, b ve c katsaylarn yaznz: "; cin >> a >> b >> c; disc = b * b - 4 * a * c; if (disc < 0) cout << "Gerçel kök yok." << endl; else { 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; return EXIT_SUCCESS;
55 47 Ak³ Denetimi 3.1 Ko³ul Deyimleri Blok sinin yapl sa lanmas programlamadaki gerekti i görülmü³tü seçim ve (bkz. yineleme Bölüm yaplarnda 1.3). Ko³ullar, bir ko³ula ko³ul göre deyimleriyle bir karar verilmelirler. C dilinde bir ko³ul deyimi, iki saysal büyüklü ün (aritmetik deyimin) kar³la³trlmas gösteri- ile gibi olu³turulur mantksal de erler ve mantksal de saylarla bir de er temsil (do ru edilirler; ya da yanl³ yanl³) de eri üretir. 0, do ru Di er de eriyse bütün veri 1 saysyla tipleri gösterilir Kar³la³trma ³lemleri ki say de eri arasnda ³u kar³la³trma i³lemleri yaplabilir: E³itlik: farklysa ==i³leciylegerçeklenir. ³lecinsolundakide erlesa ndakide eraynysado ru, yanl³ sonucunu üretir. Farkllk:!= erle sa ndaki i³leciyle de er gerçeklenir. farklysa do ru, E³itlik aynysa kar³la³trmasnn yanl³ sonucunu tersidir. üretir. ³lecin solundaki de- Küçüklük: < do ru, küçük i³leciyle de ilse yanl³ gerçeklenir. sonucunu ³lecin üretir. solundaki de er sa ndaki de erden küçükse Büyüklük: > do ru, büyük i³leciyle de ilse yanl³ gerçeklenir. sonucunu ³lecin üretir. solundaki de er sa ndaki de erden büyükse cinsolundakide ersa ndakide erdenküçükveyae³itsedo ru,büyükseyanl³sonucunu Küçüklükveyae³itlik: <=i³leciylegerçeklenir.büyüklükkar³la³trmasnntersidir. ³le- üretir. Büyüklükveyae³itlik: cinsolundakide ersa ndakide erdenbüyükveyae³itsedo ru,küçükseyanl³sonucunu >=i³leciylegerçeklenir.küçüklükkar³la³trmasnntersidir. ³le- üretir. Örnekler Yl 4'e kalansz bölünebiliyor mu? (year % 4) == 0 Ya³ 18'den büyük ya da e³it mi? age >= 18 Kar³la³trma i³lemleri tam ya da kesirli saylarn kar³la³trlmasnda kullanlabilece i gibi, harerin abecedeki sralarna göre kar³la³trlmasnda da kullanlabilir. Sözgelimi 'm' < 'u'
56 Ko³ul Deyimleri 48 ko³ul deyimi do ru de erini üretir. Ancak bu i³lem yalnzca ngilizce harer arasnda do ru sonuç üretecektir. Ayrca, büyük-küçük harf kar³la³trmalarnda da abece srasndan farkl sonuçlar çkabilir. Örne in ³u ko³ul deyimi do ru de erini üretir: 'Z' < 'a' Bunedenlerle,simgelerinkar³la³trlmasyalnzca ngilizcehareriçinveikisidebüyükyada ikisi katarlar de küçük abece harerin srasna göre kar³la³trlmasnda kar³la³trlamaz, kullanlmaldr. yani a³a daki 1 komut Ayrca, geçerli kar³la³trma de ildir i³leçleriyle da yanl³ sonucunu üretmez, derleyicinin hata vermesine neden olur): (do ru ya dennis < ken Kesirli lar bilgisayarlarda saylarn e³itlik tam açsndan olarak temsil kar³la³trlmasnda edilemeyebileceklerinden da dikkatli bunlar olunmas arasnda gerekir. e³itlik Kesirli kar³la³trmas say- küçük bir yapmak say olup hatal olmad na sonuçlar bakmak do urabilir. daha Genellikle emin bir yöntemdir. farklarnn mutlak Örne in de erinin yeterince f1 == f2 yerine a³a daki gibi bir ko³ul yazlabilir: fabs(f1 - f2) < 1E Mantksal ³lemler Baz maz. durumlarda Örne in bir insann tek bir kar³la³trma ya³nn 18 ile i³lemi 65 arasnda bütün olup ko³ul olmad n deyimini snamak olu³turmak istiyorsanz, için yeterli bunu ol- tek bir kar³la³trma i³lemiyle yapamazsnz (18 <= x < 65 durumlarda, kar³la³trma i³lemleri mantksal i³lemlerle ba lanarak gibi bir karma³k deyim yazlamaz). ko³ul deyimleri Böyle üretilebilir. Üç tane mantksal i³lem vardr: DE L i³lemi:! ruysa yanl³, yanl³sa i³leciyle do ru gerçeklenir. de erini üretir Önüne (bkz. yazld Tablo ko³ul 3.1). deyimini de iller, yani do - ko³ul!(ko³ul) do ru yanl³ yanl³ do ru Tablo 3.1: De il i³lemi do ruluk tablosu. Örnek Ya³ 18'den küçük de il:!(age < 18)
57 49 Ak³ Denetimi ko³ul1 ko³ul2 (ko³ul1) && (ko³ul2) do ru do ru do ru do ru yanl³ yanl³ yanl³ do ru yanl³ yanl³ yanl³ yanl³ Tablo 3.2: VE i³leminin do ruluk tablosu. VE i³lemi: && yanl³sa yanl³ i³leciyle de erini gerçeklenir. üretir (bkz. Ba lad Tablo 3.2). ko³ullarn hepsi do ruysa do ru, en az biri Örnek Ya³ 18'den büyük veya e³it ve 65'den küçük: (age >= 18) && (age < 65) VEYA i³lemi: biri do ruysa do ru i³leciyle de erini gerçeklenir. üretir (bkz. Ba lad Tablo 3.3). ko³ullarn hepsi yanl³sa yanl³, en az 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 kalansz Bir yln bölünen) artk yl yllar olup d³ndaki olmad n yllar belirleyen 4 saysna ko³ul kalansz deyimi. bölünüyorlarsa Sonu 00 ile artk biten yl (100'e lar. Sonu 00 ile bitenler ise 400 saysna kalansz bölünüyorlarsa artk yldrlar. Bunlarn olur- d³nda yldr ama kalan 1997, yllar 2001, artk 1900 yl ve de ildir yllar Sözgelimi, artk yl 1996, de ildir. 2000, 2004 ve 2400 yllar artk ((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.
58 Seçim 50 (year % 400 == 0) (year % 4 == 0) && (year % 100!= 0) biçiminde de yazlabilirdi Seçim C dilinde seçim yaplar, if/else bloklaryla gerçeklenir. Verilen ko³ul deyimi do ru de erini alyorsa if 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 bir blok); de ilse de i³kenininde eri0iseçak³kköklerleilgilii³lemleryaplr(ikikomuttanolu³an olu³an bir blok). farkl iki gerçel kök bulunmas durumundaki i³lemler yaplr (üç komuttan 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) deyiminde (year % 4 == 0) ko³ulu yanl³ de erini verirse deyimin geri kalanna baklmaya gerek kalmayaca- ndan (year % 100!= 0) ko³ulu snanmaz. Benzer ³ekilde (year % 4 == 0) (year % 100!= 0) deyiminde (year % 4 == 0) ko³ulu do ru de erini verirse yine ikinci ko³ul snanmaz.
59 51 Ak³ Denetimi ³eklinde olabilir. Bu durumda ko³ul do ruysa blok yürütülür, de ilse hiçbir ³ey yaplmaz. Bir Örnekteki blok tek d³ bir seçim komuttan yapsnda olu³uyorsa dikkat blo un edilirse süslü ko³ulun ayraçlar do ru ile olmas snrlanmas durumunda zorunlu yürütülecek de ildir. 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 içermesine yazl³ çok ³ekline dikkat uyulur. etmek gerekir. Ancak bu Di er durumda bir gelenek süslü ayraç de, ko³ulun kullanlmayan do ru ya blo un da yanl³ tek komut sna göre yürütülecek bloklardan biri di erine göre çok ksaysa, ksa olan blok üste gelecek olma- (ko³ulun uyulmam³ do ru olsayd olmas d³ durumunda seçim yaps yürütülecek) ³u ³ekilde yazlabilirdi: ³ekilde düzenlenmesidir. Örnekte bu gelene e 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;
60 D KKAT Seçim 52 ³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. Girintilenmeden 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 else'in kendinden önce gelen son if ko³uluna ba land dr, yani örnekte blok2, ko³ul1 do ru ve ko³ul2 yanl³sa yürütülür. Do ru bir girintilemeyle yazlrsa if (ko³ul1) if (ko³ul2) blok1; else blok2; Yine do rudur. de kar³kl a neden olmamas için böyle durumlarda süslü ayraçlar kullanmak daha Herhangi l³, 0'dan bir farkl aritmetik ise do ru deyim oldu u ko³ul varsaylr. de eri olarak Buna de erlendirilebilir; göre, sözgelimi 8 - deyimin 2 deyimi sonucu do ru, 0 8 ise - 2 yandeyimiyse 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 == * 4 yerine = i³areti kullanlmasdr. age = 12; if (age = 18) blok1; else blok2; Yukardaki di inden programda ko³ulun snanmas srasnda e³itlik i³lemi de il atama i³lemi belirtil- age için do ru saylarak de i³kenine 18 atanr, deyimin de eri 18 olarak bulunur ve 0'dan farkl oldu u blok1 yürütülür. Oysa == simgesi kullanlsayd age de i³mez ve de i³keninin de eri blok2 yürütülürdü.
61 53 Ak³ Denetimi 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 ³lemivei³lenenlerikullancnnbelirtti ihesaplamayyaparaksonucuekranayazanbirprogram yazlmas isteniyor. Programn örnek bir çal³masnn ekran çkts ekil 3.2'de verilmi³tir. ³lemi yaznz: 18 / 5 18/5 i³leminin sonucu: Çoklu Seçim ekil 3.2: Örnek 4 ekran çkts. 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 kodu ³u tip bir ³ey olurdu: if (op == '+') {... else {
62 Çoklu Seçim 54 Örnek 4 Kullancnn belirtti i i³lemi yapan program. #include <iostream> #include <stdlib.h> using namespace std; int main(void) { int num1, num2, result; char op; // cin,cout,endl // EXIT_SUCCESS cout << " ³lemi yaznz: "; cin >> 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 << "Böyle bir i³lem yok." << endl; return EXIT_FAILURE; cout << num1 << op << num2 << " i³leminin sonucu: " << result << endl; return EXIT_SUCCESS;
63 55 Ak³ Denetimi if (op == '-') {... else { if (op == '*') {... Seçim bloklarnn tek bir komut olarak de erlendirilmesi çoklu kar³la³trmalarda da daha kolay bir yazm olana sa lar. Buna göre, yukardaki çoklu kar³la³trma yaps ³u ³ekilde de yazlabilir: if (op == '+')... else if (op == '-')... else if (op == '*')... switch komutu bu tip kar³la³trmalar için daha okunakl bir yap sunar: switch (deyim) { case de er_1: blok_1; break; case de er_2: blok_2; break;... case de er_n: blok_n; break; default: blok; break; Bu la³trlr komutun ve e³itse ak³ çizene i buna ili³kin ekil blok 3.3'de yürütülür görüldü ü ve gibidir. Deyim, önce birinci de erle kar³- break komutuyla switch çklr. Birinci de ere e³it de ilse ikinci de erle kar³la³trlr. Kar³la³trmalarn yapsnn hiçbiri d³na de ilse do ru default blo u yürütülür ve switch sona erer. Her switch yapsnda bir default bulunmas zorunlu de ildir. blo u Burada ³la³trld dr. dikkat edilmesi Yani, kar³la³trlacak gereken bir nokta, de erlerin deyimin yazld di er deyimlerde bir deyimle de i³kenler de il, bir de erle yer alamaz. kar- Örne in a³a daki yazmda deyim yazl³ geçerlidir ancak de erin yazl³ geçerli de ildir: switch (5 * x) {... case y:......
64 Çoklu Seçim 56 case 1 D blok 1 break Y case 2 D blok 2 break Y case n D blok n break Y default blok ekil 3.3: switch komutunun ak³ çizene i.
65 57 Ak³ Denetimi Kar³la³trlan deyim ve de erler yalnzca tamsay ve simge tipinden olabilir (örnekte simge tipinden de erlerle kar³la³trma yaplm³tr). Örne in a³a daki yazmlar geçerli de ildir: switch (name) {... case Dennis: switch (x) {... case 8.2: Yine dr. Bu dikkat yazmda, edilmesi deyimin gereken de erden bir nokta, küçük kar³la³trmann ya da büyük olup yalnzca olmad e³itlik ya üzerinden da di er yapld - bir mantksal deyimin do rulu u belirtilemez. Ayrca, yazmdan görülebilece i gibi, herhangi switch yaplarnda bloklar süslü ayraçlar içine alnmaz. C programlarnda skça yaplan hatalardan biri bloklardaki break Örne in birinci blo un sonuna konmas gereken komutlarnn unutulmasdr. break komutu unutulursa switch ekil 3.4'de görüldü ü gibi çal³r. Birinci kar³la³trma i³lemi ba³arsz olursa bir sorun komutu ama ba³arl olursa çkmaz blok 1 yürütüldükten sonra blok 2 de yürütülür ve break ile switch sonlanr. Yani, ba³arl olan ilk kar³la³trmadan ba³lanarak break gelen bütün bloklar yürütülür. komutu görülene kadar Örnekprogramdakihiçbir 3 break toplama, sonra çkartma, çarpma, komutukonmam³olsai³lemintoplamaoldu udurumdaönce kalan i³lemi geçerli olur), ayrca da bölme ve son olarak da kalan i³lemi yaplr (yani yalnzca Böyle bir i³lem yok. görüntülenmeden programdan çklr. ³lem çkartma oldu unda denilerek toplama ksm herhangi atlanr, bir sonuç deminki gibi devam eder. gerisi Uygulama: Seçim Yaplar Bu uygulamada Windows ortamnda bir tümle³ik geli³tirme ortam (Visual C++ ya da Dev- C++) tantlacaktr. Hata ayklaycda adm adm ilerleme ve de i³ken de erlerinin gözlenmesi gösterilecektir. Örnek 5. Birim Dönü³ümü Bu örnekte ngiliz uzunluk ve scaklk ölçü birimlerinin metrik birimlere dönü³ümünü yapan bir program yazlacaktr. inch biriminden verilen bir uzunlu u santimetre birimine çevirmek için 3 Bu davran³, baz durumlarda yararl yönde de kullanlabilir (bkz. Örnek 10).
66 Çoklu Seçim 58 case 1 D blok 1 Y case 2 D blok 2 break Y case n D blok n break Y default blok ekil 3.4: switch komutunda break kullanlmazsa olu³an ak³ çizene i.
67 59 Ak³ Denetimi 1 inch = 2.54 cm e³itli i ve Fahrenheit biriminde verilen bir sckl Celcius birimine çevirmek için de formülü kullanlacaktr. C = 5 (F 32) 9 Verilen örnek program yazn, çal³trn, birkaç de er için deneyin case 1 blo unun sonundaki break komutunu silin ve program çal³trarak her iki dönü- ³üme de birer örnek deneyin cm->inch ve c->f dönü³ümlerini yapmak üzere kodunuzu geli³tirin 1f t = 12inch e³itli ini kullanarak ft cinsinden verilmi³ bir uzunlu u mt cinsine çevirecek eklemeyi yapn mt->ft dönü³ümünü yapacak eklemeyi yapn Örnek 6. Euclides Algoritmas ki saynn en büyük ortak bölenini Euclides algoritmasn kullanarak bulan bir program yazlmas isteniyor. Bu algoritmaya ili³kin ak³ çizene i ekil 1.17'de, programn örnek bir çal³masnn ekran çkts ekil 3.5'de verilmi³tir. Saylar yaznz: ve 945 saylarnn en büyük ortak böleni: 63 ekil 3.5: Örnek 6 ekran çkts. 3.4 Ko³ul Denetiminde Yineleme C dilinde temel yineleme yaplar while sözcü üyle kurulur: while (ko³ul) { blok;
68 Ko³ul Denetiminde Yineleme 60 Örnek 5 ngiliz-metrik birim dönü³ümü yapan program. #include <iostream> #include <stdlib.h> using namespace std; int main(void) { int choice; float inch, cm, f, c; cout << "1. inch-cm" << endl; cout << "2. f-c" << endl; cout << "3. Çk³" << endl; cout << "Seçiminiz: "; cin >> choice; // 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 << "Böyle bir i³lem yok." << endl; return EXIT_FAILURE; return EXIT_SUCCESS;
69 61 Ak³ Denetimi Örnek 6 ki saynn en büyük ortak bölenini bulan program. #include <iostream> #include <stdlib.h> using namespace std; int main(void) { int num1, num2; int a, b, r = 1; cout << "Saylar yaznz: "; cin >> num1 >> num2; a = num1 > num2? num1 : num2; b = num1 > num2? num2 : num1; // cin,cout,endl // EXIT_SUCCESS while (b > 0) { r = a % b; a = b; b = r; cout << num1 << " ve " << num2 << " saylarnn en büyük ortak böleni: " << a << endl; return EXIT_SUCCESS;
70 Gelenek Döngü Denetimi 62 Örnekteki while blo u b unda sona erecektir. Bu de i³keninin örnekte algoritmann de eri 0'dan do as büyük gere i oldu u bu de i³ken sürece yinelenecek, eninde sonunda 0 oldude erini alacaktr; ancak yineleme yaplar kurarken döngünün her durumda mutlaka sonlanmasnn sa lanmasna özellikle dikkat edilmelidir. 0 Benzer bir di er yineleme yaps ise do-while sözcükleriyle kurulabilir: do { blok; while (ko³ul); Bu yapnn while yapsndan en önemli fark, ko³ulun do ru olup olmamasna baklmakszn blo un en az bir kere yürütülmesidir. Örnekteki yineleme bölümü ³u ³ekilde de yazlabilirdi: do { r = a % b; a = b; b = r; while (b > 0); Ba³langçta num1 ve num2 de i³kenlerinden birinin 0 olmas durumunda b alrd. lk örnekte ko³ul sa lanmayaca için en büyük ortak bölen 1 olarak de i³keni bildirilirdi; 0 de erini örnekte ise sfra bölme yapmaya kalklaca ndan bir çal³ma zaman hatas olu³urdu. Her ikinci kadar ne while ile kurulan yaplar ve do-while düzenlenebilseler de, yineleme yaps kurmak ile için kurulan genelde yaplar birbirlerinin e³i olacak ³ekilde while kullanlmas önerilir. 3.5 Döngü Denetimi Yineleme yaplarnda kullanlan di er bir yöntemse, döngüyü bir sonsuz döngü olarak kurup döngüden çkma durumu olu³tu unda break komutunu kullanmaktr: 4 while (true) {... if (<çkma ko³ulu sa lanyor >) break;... // çkma ko³ulu sa lanmad zaman yaplacaklar Çokluseçim(switch)yapsndaoldu ugibiburadada break çk³ sa lar. Ancak örnekte görüldü ü gibi içinden çklan yap komutuiçindebulunulanyapdan if de il while yapsdr. Yani, break komutu switch, while, do-while ve birazdan görece imiz for yaplarndan çkartr, if yapsndan çkartmaz. çkartr çiçedöngülerkullanld nda,beklenebilece igibi, ve bir üstteki döngünün sradaki komutundan breakkomutuyalnzcaeniçtekidöngüden devam edilmesini sa lar: 4 Bu tür bir yap Örnek 10'da görülebilir.
71 63 Ak³ Denetimi while (true) {... while (true) {... if (<çkma ko³ulu sa lanyor >) break; // üstteki break komutu sonucunda buraya gelinir Döngülerde ak³ denetimine yönelik di er bir komut ise continue komutudur. Bu komut döngünün geri kalan ksmnn atlanarak döngü ba³na gidilmesini sa lar: i = 0; while (i < 50) { i++;... if (<ko³ul>) {... continue;... Bu örnekte if ile belirtilen ko³ul sa lanyorsa birtakm i³lemlerin gerçekle³tirilmesinden sonra döngünün ba³na dönülür. Yani if blo undan sonra gelen komutlar atlanarak i de i³keninin bir sonraki de erinden i³lemler sürdürülür. Örnek 7. Yinelemeli Yaz-Tura At³ Kullancnn verdi i say kadar yaz-tura atarak yaz ve turalarn kaçar kere geldi ini sayan ve sonuçlar ekrana çkartan bir program yazlmas isteniyor. Bu programa ili³kin ak³ çizene i ekil 3.6'da, programn örnek bir çal³masnn ekran çkts ekil 3.7'de verilmi³tir. 3.6 Sayaç Denetiminde Yineleme Örnekte yaz-tura simülasyonunun kullancnn belirtece i sayda yinelenmesi isteniyor. Bir blo un belli sayda yinelenmesi istendi inde kullanlabilecek en uygun yap for yapsdr. Bir sayacn denetiminde yineleme yapmak için ³unlarn belirtilmesi gerekir: Sayacn ba³langç de eri: Örnekte bu de er 1'dir. Kaça kadar saylaca : Örnekte bu de er kullancdan alnan saynn tutuldu u count de i³keniyle belirlenir.
72 Sayaç Denetiminde Yineleme 64 basla oku: count i 1 heads 0 tails 0 i count Y D bas: heads bas: tails Tura at Yazi dur bas: "Tura" bas: "Yazi" heads heads + 1 tails tails + 1 i i + 1 ekil 3.6: Yinelemeli yaz-tura at³nn simülasyonu. Kaç kere atlacak? 7 Yaz Tura Tura Yaz Yaz Yaz Yaz Tura says: 2, Yüzdesi: % Yaz says: 5, Yüzdesi: % ekil 3.7: Örnek 7 ekran çkts.
73 65 Ak³ Denetimi Örnek 7 Yinelemeli yaz-tura at³ simülasyonu yapan program. #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; int main(void) { int count, i; float number; int heads = 0, tails = 0; // cin,cout,endl // EXIT_SUCCESS,srand,rand,RAND_MAX // time cout << "Kaç kere atlacak? "; cin >> count; srand(time(null)); for (i = 1; i <= count; i++) { number = (float) rand() / RAND_MAX; if (number < 0.5) { cout << "Tura" << endl; heads++; else { cout << "Yaz" << endl; tails++; cout << " Tura says: " << heads << ", Yüzdesi: %" << * heads / count << endl; cout << " Yaz says: " << tails << ", Yüzdesi: %" << * tails / count << endl; return EXIT_SUCCESS;
74 Sayaç Denetiminde Yineleme 66 Kaçar kaçar saylaca : Örnekte sayacn birer birer artrlaca belirtilmi³tir. for de eri yaps atamas, bu üç ikinci belirtimin olarak ayn hangi anda ko³ul yaplmasna sa land sürece olanak devam sa lar. edilece i Ay içinde ve önce son olarak ba³langç sayacn nasl artrlaca belirtilir. da for (i = 1; i <= count; i++) komutu ³öyle okunabilir: i de i³kenine 1 de erini ver ve bu de i³kenin de eri count de i³keninin de erinden küçükveyae³itoldu usüreceblo uheryürütü³ündensonra i de i³kenininde erini 1 artr. for döngüleri while döngüleri ³eklinde de yazlabilirler: for (ba³langç_atamas; sürme_ko³ulu; artrma_komutu) { blok; döngüsü ba³langç_atamas; while (sürme_ko³ulu) { blok; artrma_komutu; döngüsüne e³de erlidir. Yine de sayaç denetiminde yinelemeler için for, ko³ul denetiminde yinelemeler için while kullanmak anla³lrlk açsndan daha do rudur. Bu yapyla ilgili olarak baz noktalara dikkat etmek gerekir: Döngü, nün arkasndan belirtilen gelen ko³ul komutla sa lanmad sürdürülür. zaman Örnekte sonlanr ve programn yürütülmesi döngü- i de i³keninin de eri count de i³keninin de erinden büyük oldu u zaman döngü sona erer. Artrma i³lemi döngü gövdesi yürütüldükten sonra yaplr. Örnekte döngünün gövdesi i de i³keninin 1, 2,..., count de erleri için yinelenir, 1 de eri atlanmaz. Verilen ba³langç de eri döngü ko³ulunu sa lamyorsa döngünün gövdesi hiç yürütülmez. Örne in for (i = 1; i == 10; i++)
75 67 Ak³ Denetimi döngüsünde ndan) döngüye ba³langç hiç girilmez. de eri sürme ko³ulunu sa lamad ndan (1== 10 do ru olmad- Artm kullanlabilir. miktar için artrma i³leci kullanlmas zorunlu de ildir, herhangi bir C deyimi for (i = 1; i < count; i = i + 3) döngüsü 1, 4, 7, 10, 13,... ³eklinde sayarken for (i = 1; i < count; i = i * 2) döngüsü 1, 2, 4, 8, 16,... ³eklinde sayar. Rasgele Saylar Yaz-tura saynn 0.5'den at³n küçük temsil olmas etmek durumunu için en kolay bir yol sonuca 0 ile (diyelim 1 arasnda tura), bir rasgele e³it ya say da büyük üretmek olmasn ve bu da di er sonuca (bu durumda yaz) atamaktr. C standart kitapl ndaki rand fonksiyonu 0 ile RAND_MAX arasnda bir rasgele tamsay üretir. RAND_MAX bilir. standart kitaplkta tanmlanm³ bir de erdir ve sistemden sisteme farkllk göstere- rand fonksiyonundan gelen say RAND_MAX kesirli say elde edilir. Rasgele saylarn kullanmnda de erine daha bölünürse çok 1 ile bir 0 ile üst 1 arasnda snr arasnda bir rasgele alacak bir rasgele tamsayya gereksinim duyulur. Bu üst snr de er max ile gösterilirse 1 + rand() % max deyimi istenen türden bir say üretir (Neden?). Rasgele ydan üretilir. saylar, Bu bir serinin seri olarak ba³layabilmesi üretilirler; için yani ilk her sayy rasgele üretmekte say seride kullanlacak bir önceki bir rasgele ba³langç sa- de eri (tohum) verilmesi gerekir. srand tohumla ba³lanrsa ayn seri üretilir. Her serinin fonksiyonu programn bu tohumun çal³masndaki belirtilmesini bir senaryoya sa lar. Ayn ³lk dü³tü ü dü³ünülürse istendi i zaman ayn senaryoyu üretebilmek programn hatalarnn karayklanmas açsndan yararldr. Her gerekir. defasnda Standart farkl kitaplktaki bir tohumla ba³lamak için tohumun da her defasnda farkl verilmesi time saniyelerin saysn verdi inden her ça rl³nda fonksiyonu, farkl 1 Ocak bir tohum 1970 tarihinden üretebilir. Bu o ana fonksiyona kadar geçen NULL giri³ parametresini göndermek yeterlidir. Uygulama: Döngüler Bu uygulamada Unix bir hata ayklayc (ddd) tantlacaktr. Hata ayklaycda adm adm ilerleme ve de i³ken de erlerinin gözlenmesi gösterilecektir.
76 Sayaç Denetiminde Yineleme 68 Örnek 8. Seri Toplam Bu uygulamada görülecek programlarda, e x fonksiyonunun hesaplanmas için a³a daki seri toplamndan yararlanlacaktr: f(x) = i=0 x i i! = 1 + x + x2 2! + x3 3! + x4 4! + Birinci terimde programda gerekecek faktöryel (Örnek 8) de erinin içiçe iki hesaplanmasn döngü vardr. çerideki sa lar. D³ döngü döngüyse o anda her i³lenmekte yineleni³inde olan serinin hatadan o küçük anki terimi oldu unda hesaplayarak de erin istenen toplama duyarllkta ekler. Hesaplanan hesapland na terim kullancnn karar verilerek belirtti i ekrana çkartlr. sonuç Örnek 8 e deyimini genel terimden giderek hesaplayan program. x #include <iostream> #include <stdlib.h> #include <math.h> using namespace std; int main(void) { float x, error, term, result = 1.0; int i = 1, f; float fact; cout << "x: "; cin >> x; cout << "Hata: "; cin >> error; // cin,cout,endl // EXIT_SUCCESS // pow term = error + 1; while (term > error) { fact = 1.0; for (f = 2; f <= i; f++) fact = fact * f; term = pow(x, i) / fact; result = result + term; i++; cout << "Sonuç: " << result << endl; return EXIT_SUCCESS;
77 69 Ak³ Denetimi kinci programdaysa (Örnek 9) ayn i³lemin nasl daha etkin (daha az hesap yüküyle) yaplabilece i görülecektir. Serinin genel teriminin a i = xi i! elemann kendisinden önceki elemana bölümü oldu u gözönüne alnd nda dizide bir a i a i 1 = x i kendisinden önceki terimin olarak hesaplanabilir. Yani her terim, x üs alma ve faktöryel hesaplama ile i³lemlerine çarplp i'ye gerek bölünmesiyle kalmaz ve bulunabilir. seri toplam Böylece çok daha her hzl admda edilir. elde Örnek 9 e deyimini bir önceki terimden giderek hesaplayan program. x #include <iostream> #include <stdlib.h> using namespace std; int main(void) { float x, error, term, result = 1.0; int i = 1; cout << "x: "; cin >> x; cout << "Hata: "; cin >> error; term = 1; while (term > error) { term = term * x / i; result = result + term; i++; cout << "Hata: " << result << endl; return EXIT_SUCCESS; Her iki program da yazarak çal³trn. Ta³ma durumunun gözlenmesi // cin,cout,endl // EXIT_SUCCESS Sorular 1. (x % 3 == 2) && (x > 4)!(x % 3 == 2) && (x < 6) mantksal deyimini (a) do ru yapacak bir x de eri verin. (b) yanl³ yapacak bir x de eri verin.
78 Sayaç Denetiminde Yineleme 70 (c) x i³aretsiz bir tamsay ise, x'in hangi de erleri için bu deyim do ru de erini alr? 2. A³a da verilen program parças için x saymyla de i³kenlerin alacaklar de erleri de i³keninin izlemek üzere ba³langç bir çizelge de erinin olu³turun. 115 oldu u Ak³ varzene ini çizin. çi- i = -1; while (x >= 1) { i++; y[i] = x % 8; x = x / 8; for (j = i; j >= 0; j--) cout << y[j]; 3. xve msaylararalarndaasalsa xsaysnn msaysnagöreevri i rsays, xr = 1 mod m e³itli ini sa layan saydr (r < m). Örne in, x = 5 ve m = 7 ise r = 3 kullancdan ald olur. Buna göre, x ve m saylarna göre r program yazn. de erini hesaplayan ve ekrana çkartan bir x = 8, m = 11 de erleri bir çizelge halinde gösterin. de erleri için programnzdaki de i³kenlerin alacaklar 4. Kusursuz Örne in, bir say, kendisinden küçük bütün çarpanlarnn toplamna e³it olan saydr. 28 = ekrana döken bir program yazn. 14. Buna göre, ilk say içindeki kusursuz saylar 5. nsan bedeninin alann hesaplamakta kullanlabilecek iki formül a³a da verilmi³tir. DuBois formülü: bsa = h w Boyde formülü: 4 bsa = h 0.3 w ( log w) Herikiformüldede hde i³kenicmcinsindenboyuve bsade i³kenide 4 m alann gösterirken, cinsindenbeden 2 w g cinsinden gösterir. DuBois de i³keni formülü kütleyi yeti³kinlerde DuBois formülünde iyi sonuç kg, verirken, Boyde çocuklarda formülündeyse formülle elde edilen alan de eri 0.6'dan küçükse) çok hatal olabilmektedir. Buna göre, (bu boy yukarda ve kütlesini anlatlan kullancdan ölçütlere göre ald hesaplayarak bir insann ekrana (yeti³kin çkaran ya bir da program çocuk) beden yazn. alann 6. A³a da verilen Pascal üçgeni için i. satr j. verilen formülle hesaplanr: sütundaki de er (binom katsays) yanda { j = 0 j = i binom i,j = binom i 1,j 1 + binom i 1,j aksi durumda Buna göre, üçgenin ilk 30 satrn hesaplayp ekrana çkartacak bir program yazn. 7. A³a daki seri toplam hesaplanmak isteniyor:
79 71 Ak³ Denetimi n ( 1) i x i (2i)! = x0 0! x1 2! + x2 4! x3 6! + x4 8! x5 10! +... i=0 (a) Bu serinin i. eleman a i ise, a i+1 /a i oran nedir? (b) Bu bilgiyi kullanarak, serinin toplamn hesaplayan bir program yazn (x ve n erleri kullancdan alnacaktr). de- 8. Rasgele ylarnüretilmeolaslklarnbozarm?sözgelimi, say üretirken kalan i³lecini(%) kullanarak RAND_MAX'nde erinin32767oldu unu sayy belli bir aral a indirgemek sa- varsayarak e³it midir? De ilse, 1 ile 6 arasnda daha iyi üretece iniz bir yöntem önerebilir rasgele sayda misiniz? bu alt saynn gelme olaslklar
80 Sayaç Denetiminde Yineleme 72
81 Bölüm 4 Türetilmi³ Veri Tipleri Bu Bölüm bölümde 1.1.2) programcnn nasl türetebilece i var olan üzerinde veri tiplerinden durulacaktr. kendi veri tiplerini(sözgelimi kaytlar, bkz. C olan dilinin veri tiplerine programcya yeni isimler kendi veri verilebilmesidir. tiplerini tanmlayabilmesi Bunun için için sundu u temel olanak, var typedef veri_tipi yeni_isim; komutu kullanlr. Bunun sonucunda veri_tipi isimli tipe yeni_isim verilmi³ olur. adnda bir isim daha Örne in tamsay olaca bir ö rencinin varsaymyla, snav notlar ö renci i³lenmek notu tipinden isteniyor bilgileri olsun. Notlarn temsil etmek 0 ile 100 üzere arasnda bir veri birer tanmlanabilir: tipi 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; gibibirkomutyazlabilir. stenirseaslveritipiismininkullanlmasndadabirsakncayoktur, 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
82 74 De i³tirmek rümlerde ö renci kolay notlarnn olur: Programn kesirli olabilece i geli³tirilmesinin durumu ileri ortaya a³amalarnda çkarsa yalnzca ya da sonraki veri tipine sü- isim verme komutunun typedef float score_t; biçiminde renci notuna de i³tirilmesi kar³lk gelen yeterli olur. Veri tipi tanm olmasa bütün kodun taranarak ö - int veri tiplerini bulup de i³tirmek gerekir. Bu da baz int sözcüklerinin rna göre büyük de i³mesi, zorluklar bazlarnn çkarabilir. de i³memesi anlamna gelir ve programn boyutla- Örnek 10. Barbut Barbut oyununun kurallar ³öyledir: 1 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 olana kadar ayn zar toplam atmaya veren devam zarlar eder. bir daha atana kadar ya da att zarlarn toplam 7 Ayn toplam bir daha atarsa oyuncu kazanr. Att zarlarn toplam 7 olursa oyuncu kaybeder. Verilen örnek, bu oyunu simüle eden bir programdr. Bu örne in ilginç bir yönü switch nnbazdurumlarndakastlolarak yaps- break her bir grup için yaplacak i³lemlerin bir kere kullanlmamasdr.böylelikledurumlargruplanarak çal³masnn ekran çkts ekil 4.1'de verilmi³tir. belirtilmesi sa lanm³tr. Programn örnek bir Zarlar: = 5 Say: 5 Zarlar: = 6 Zarlar: = 10 Zarlar: = 11 Zarlar: = 5 Oyuncu kazanr. 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.
83 75 Türetilmi³ Veri Tipleri Örnek 10 Barbut oyununu simüle eden program. #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; // cin,cout,endl // EXIT_SUCCESS,srand,rand // time 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 << "Zarlar: " << die1 << " + " << die2 << " = " << sum << endl; switch (sum) { case 7: case 11: game_status = PLAYER_WINS; break; case 2: case 3: case 12: game_status = PLAYER_LOSES; break; default: game_status = GAME_CONTINUES; point = sum; cout << "Say: " << point << endl; break; while (game_status == GAME_CONTINUES) { die1 = 1 + rand() % 6; die2 = 1 + rand() % 6; sum = die1 + die2; cout << "Zarlar: " << die1 << " + " << die2 << " = " << sum << endl; if (sum == point) game_status = PLAYER_WINS; else { if (sum == 7) game_status = PLAYER_LOSES; if (game_status == PLAYER_WINS) cout << "Oyuncu kazanr." << endl; else cout << "Oyuncu kaybeder." << endl;
84 Numaralandrma Numaralandrma Örnekte hangidurumdaoldu uizlenebilir.örne inkodumuzdaoyunundurumunugösteren oyunun içinde bulunabilece i çe³itli durumlara birer say de eri atanarak oyunun o an game_status de i³keninin ve 2 olmas da de erinin oyuncunun 0 olmas kaybetmesine oyunun sürüyor kar³lk olmasna, dü³ürülebilir. 1 olmas Burada oyuncunun 0, 1 ve 2 kazanmasna özel bir anlamlar yoktur, herhangi üç farkl de er de ayn i³levi görür. de erlerinin Okunulurlu u artrmak amacyla bu saylara birer isim vermek yararl olur. Öyleyse #define GAME_CONTINUES 0 #define PLAYER_WINS 1 #define PLAYER_LOSES 2 ³eklinde de i³mez tanmlar yaplarak kodun içinde saylar yerine isimler yazlabilir. Bu tip, birbiriyle ilintili birden fazla de i³mezi birlikte tanmlamak için numaralandrma yöntemi kullanlabilir. enum { GAME_CONTINUES, PLAYER_WINS, PLAYER_LOSES ; komutu yukarda yazlm³ olan üç #define süslü ayraçlar içinde yazlan de i³mezlerden komutuyla ilkine 0, ayn sonrakine etkiyi yaratr. 1, sonrakine Aksi belirtilmedikçe, de er verilir. Programc isterse ba³ka de erler belirtebilir ancak bizim örne imizde 2 vs. -demin ³eklinde söylendi i gibi- de erlerin, farkl olduklar sürece, ne olduklarnn bir önemi yoktur: de enum { GAME_CONTINUES = 58, PLAYER_WINS = 17, PLAYER_LOSES = 154 ; Herhangi bir de i³meze de er verilirse onu izleyen de i³mezlerin de erleri birer artarak devam eder: enum { JANUARY = 1, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER ; Numaralandrma ile olu³turulmu³ bir de i³mezler kümesine de topluca bir isim verilerek yeni bir veri tipi olu³turulabilir: enum künye { de i³mez_tanmlar ; Bu komutun sonucunda enum künye tanmlanabilir. Örnekte önce bu ³ekilde isimli yeni bir veri tipi olu³ur ve bu tipten de i³kenler enum status_e da bu tipe isimli bir tip olu³turulmu³, daha sonra typedef iki yeni isim de kullanlabilir, komutuyla yani yeni örnekteki bir isim verilmi³tir. Bu tipten de i³ken tanmlarken her status_t game_status = GAME_CONTINUES;
85 77 Türetilmi³ Veri Tipleri komutu enum status_e game_status = GAME_CONTINUES; komutuyla e³de erlidir. Düzenli bir çal³ma için 2 ralandrmayla belirlenen numaralandrma de i³mezler kümesinden tipinden de er tanmlanan almas de i³kenlerin gerekir. Sözgelimi yalnzca örne imizde o numa- tanmlanan game_status de i³keni GAME_CONTINUES, PLAYER_WINS ve PLAYER_LOSES herhangi bir de er alamamaldr. Ancak C dili böyle bir kstlama getirmez, yani d³nda game_status = 25; gibi anlamsz olacak bir atama C dilinin kurallarna göre yasak de ildir. Örnek 11. Paralel Direnç E³de eri Dirençlerin paralel e³de eri a³a daki formülle hesaplanabilir: 1 1 R R R n Buna tan bir göre, program kullancdan yazlmas ald isteniyor. dirençlerin Kullancnn paralel e³de erini kaç tane direnç hesaplayarak de eri sonucu girece i ekrana ba³tan çkar- olmad için bu döngü belli for yapsyla de il while suz döngüden çkabilmek için kullancnn bir ³ekilde yapsyla bunu kurulmaya belirtmesine daha olanak uygundur. verilmelidir. Son- Bu Kullanc programda bu de eri uygulanan girerek yöntem, ba³ka direnç özel bir de eri de eri(örne in yazmayaca n 0) bitirme belirtebilir. i³areti Sonlandrma olarak seçmektir. nin uygun seçilmesi gerekir; geçerli direnç de erleri sonlandrma de eri olmaya uygun de ildir. de eri- Programn örnek bir çal³masnn ekran çkts ekil 4.2'de verilmi³tir. Bu gun³ekildetoplamaeklenmelerininardndanunutulmalardr.yaniileridekullancnngirmi³ programn çal³masnda dikkat çekici bir nokta, kullancnn yazd direnç de erlerinin uy- oldu u programn de erlerle amac bir açsndan i³lem yaplmak bu durum istense bir saknca bunlar do urmaz bir ³ekilde ancak ula³labilir ba³ka olmayacaklardr. problemlerde farkl Bu yaplar kullanmak gerekebilir. 2 C dilinde mantksal bir veri tipi ve true, false de erleri bulunmad daha önce söylenmi³ti. Ancak, do ru ve yanl³ büyüklükleri programlarda skça gereksinim duyulan de erler olduklarndan C programlarnda genellikle bunlar genellikle programn ba³nda de i³mez olarak tanmlanrlar. #define TRUE 1 #define FALSE 0 Daha sk kullanlan bir yöntemse bunlar bir numaralandrma içinde tanmlayarak olu³acak veri tipine yeni bir isim vermektir. enum bool_e { FALSE, TRUE ; typedef enum bool_e bool_t; Böylelikle C++ dilinde oldu u gibi mantksal bir veri tipi tanmlanm³ olur ve bu tipten de i³kenler kullanlabilir.
86 Numaralandrma 78 Örnek 11 Paralel direnç e³de eri hesaplayan program. #include <iostream> #include <stdlib.h> using namespace std; struct rational_s { int nom; int denom; ; typedef struct rational_s rational_t; int main(void) { int res_value; rational_t equiv = { 0, 1 ; int a, b, r; int i = 0; // cin,cout,endl // EXIT_SUCCESS while (true) { i++; cout << "R" << i << " (bittiyse 0): "; cin >> res_value; if (res_value == 0) break; equiv.nom = equiv.nom * res_value + equiv.denom; equiv.denom = equiv.denom * res_value; // kesiri basitle³tir a equiv.nom; b = equiv.denom; while (b > 0) { r a % b; a b; b = r; equiv.nom = equiv.nom / a; equiv.denom = equiv.denom / a; if (equiv.nom!= 0) cout << "E³de er direnç: " << equiv.denom << / << equiv.nom << " = " << (float) equiv.denom / equiv.nom << endl; else cout << "Hatal i³lem." << endl; return EXIT_SUCCESS;
87 79 Türetilmi³ Veri Tipleri R1 (bittiyse 0): 5 R2 (bittiyse 0): 8 R3 (bittiyse 0): 11 R4 (bittiyse 0): 4 R5 (bittiyse 0): 0 E³de er direnç: 440/293 = ekil 4.2: Örnek 11 ekran çkts. 4.2 Yaplar Kayt tiplerinin özelliklerinden Bölüm 1.1.2'de söz edilmi³ti. C dilinde kaytlara yap ad verilir ve ³öyle tanmlanrlar: struct künye { alan_tanmlar; ; Yap tanmnn sonucunda struct künye ler tanmlanabilir. Alan tanmlar de i³ken isimli tanmlarna yeni bir benzer veri tipi ³ekilde olu³ur yaplr ve bu tipten ancak de i³ken- tanm de ildirler. De i³ken tanmlarnn bellekte ilgili de i³ken için yer ayrlmasna neden de i³ken du u görülmü³tü, oysa tip tanm bellekte yer ayrlmasna neden olmaz. Yer ayrlmas ancak ol- bu yap tipinden bir de i³ken tanmland nda gerçekle³ir. Örnekte ksmn gösteren rasyonel saylar göstermek üzere iki alan olan bir yap kullanlm³tr: saynn pay nom iki alan da tamsay tipindendir. ve payda ksmn Tip tanm gösteren sonucunda denom. artk Rasyonel saylarn tanm gere i her struct rational_s adnda bir veri tipi olu³mu³tur. Kullanm kolayl açsndan bu veri tipine typedef yeni bir isim verilmi³tir. komutuyla Yap tipinden de i³ken tanmlanrken 3 istenirse künyeli isim, istenirse typedef isim kullanlabilir ve de i³kenin alanlarna süslü ayraçlar içinde ba³langç de erleri ile verilen verilebilir. yeni A³a dakiikikomutayni³iyaparlar,yani res veequiv yapsnda olan iki de i³ken tanmlarlar ve isimlerinde,herbiribirerrasyonelsay equiv de i³keninin nom alanna 0, denom ba³langç de erini verirler ( ekil 4.3): alanna 1 3 Tipin tanmlanmas ve yeni isim verilmesi i³lemleri istenirse tek komutta birle³tirilebilir: typedef struct rational_s { int nom, denom; rational_t; Birle³tirilmi³ tanmlamada istenirse tipin künyesi de belirtilmeyebilir, yani yukardaki örnekte rational_s sözcü ü yazlmasa da olurdu. Yine de ço unlukla önerilen yöntem, belirtilmeleri zorunlu olmasa da künyeleri yazmaktr. Bu yazl³ numaralandrmalar için de geçerlidir.
88 Yaplar 80 rational_t res, equiv = { 0, 1 ; struct rational_s res, equiv = { 0, 1 ; res nom equiv nom 0 denom denom ekil 4.3: Yap tipinden de i³ken tanmlama. Bu için, de i³kenlerin daha önce görüldü ü her biri, yapda gibi, noktal belirtilen gösterilim alanlar barndrr. kullanlr, Alanlar yani de i³kenin üzerinde adndan i³lem yapmak nokta i³aretiyle alann ad belirtilir. Bu durumda, e³de er direnç de erini tutan de i³kenin sonra payda ksmyla bir i³lem yaplacaksa equiv.denom yazlr. Yaplarn numaralandrma alanlar tipinden skalar tiplerden de tanmlanabilir: tanmlanabilece i gibi, ba³ka yap tiplerinden ya da tipli enum month_e { JANUARY = 1, FEBRUARY,..., DECEMBER ; typedef enum month_e month_t; struct date_s { int day; month_t month; int year; ; typedef struct date_s date_t; struct academic_year_s { date_t begin, end; ; typedef struct academic_year_s academic_year_t; tanmlar lanr: ekil 4.4'de görülen yapy olu³turur. Alanlara eri³im yine noktal gösterilimle sa - 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 de i³kenin yap tipinden bütün alan de i³kenler de erleri arasnda var³ de i³kenin atama i³lemi ayn isimli yaplabilir. alanlarna Atama atanr. sonucunda Bu gösterilim kaynak bütün alt alanlarn tek tek atanmas zorunlulu unu giderir, yani 1
89 81 Türetilmi³ Veri Tipleri academic_year_t year_2001_2002 begin day end day month month year year equiv.nom = res.nom; equiv.denom = res.denom; ³eklinde atama yapmak yerine yalnzca equiv = res; yazlabilir. Uygulama: Yaplar ekil 4.4: Yap içinde yap kullanma. Örnek 12. Noktann Daireye Göre Konumu Koordinatlarn yine kullancdan kullancdan ald bir dairenin ald bir içinde noktann, mi, d³nda merkez m, noktasnn üzerinde koordinatlar mi oldu unu ile belirleyerek yarçapn sonucu ekrana çkaracak bir program yazlmas isteniyor. Noktann koordinatlar x merkezinin koordinatlar ve y, daire x c ve y c, dairenin yarçap r ile gösterilirse: (x xc ) 2 + (y y c ) 2 < r ise nokta dairenin içinde (x xc ) 2 + (y y c ) 2 > r ise nokta dairenin d³nda (x xc ) 2 + (y y c ) 2 = r ise nokta dairenin üzerindedir. Program yazarak çal³trn. Merkeznoktasnnkoordinatlarn(2.1,5.664),yarçapn3.2,aranannoktannkoordinatlarn(5.3,5.664) Hatalysa neden hataldr olarak verin. ve nasl Bu nokta düzeltilebilir? dairenin neresindedir? Program ne çkt veriyor?
90 Yaplar 82 Örnek 12 Noktann daireye göre konumunu bulan program. #include <iostream> #include <stdlib.h> using namespace std; typedef struct point_s { float x, y; point_t; typedef struct circle_s { point_t center; float radius; circle_t; int main(void) { circle_t circle1; point_t point1; float p, deltax, deltay; // cout,cin,endl // EXIT_SUCCESS cout << "Daire merkezinin koordinatlarn yazn (x y): "; cin >> circle1.center.x >> circle1.center.y; cout << "Dairenin yarçapn yazn: "; cin >> circle1.radius; cout << "Noktann koordinatlarn yazn (x y): "; cin >> point1.x >> point1.y; deltax point1.x circle1.center.x; deltay = point1.y - circle1.center.y; p = deltax * deltax + deltay * deltay; if (p < circle1.radius * circle1.radius) cout << "Nokta dairenin içinde." << endl; else { if (p > circle1.radius * circle1.radius) cout << "Nokta dairenin d³nda." << endl; else cout << "Nokta dairenen üzerinde." << endl; return EXIT_SUCCESS;
91 83 Türetilmi³ Veri Tipleri Bir daireye noktann göre ba³ka konumunun noktalarn belirtilmesinden da konumlarn sonra sorabilmesi programdan için çkmadan programda kullancnn gerekli de iayn ³iklikleri yapn. Merkez lerini belirleyen koordinatlar bir program ve yarçaplar yazn. kullancdan alnan iki dairenin kesi³ip kesi³medik- Sorular 1. Örnek 11'da equiv de i³ken tanmlama komutu de i³kenine farkl bir ba³langç de eri verilebilir miydi? Örne in rational_t res, equiv = { 0, 0 ; ³eklinde olsayd program do ru çal³r myd? 2. Ayn Gerekiyorsa örnekte programda kullanc ilk dazeltmeler direnç de eri yapn. olarak 0 verirse programn davran³ nasl olur? 3. Örnek kazanma 10'da olasl uygulamas ile kaybetme yaplan olasl barbut ayn oyunu mdr? adil bir oyun mudur? Yani oyuncunun
92 Yaplar 84
93 Bölüm 5 Diziler Bu bölümde programlamada skça gereken dizi tiplerinin (bkz. Bölüm 1.1.3) C dilinde nasl kullanlaca üzerinde durulacaktr. Örnek 13. statistik Hesaplar Kullancdan sapmasn hesaplayan ald snav bir notlarnn program yazlmas ortalamasn, isteniyor. varyansn, Programn standart örnek sapmasn bir çal³mas ve mutlak kil 5.1'de verilmi³tir. e- Ö renci says n, i. ö rencinin notu s sapma i, ortalama m, varyans v, standart sapma sd, mutlak ad ile gösterilirse: ni=1 s i m = n ni=1 (s i m) 2 v = n 1 sd = v ni=1 s i m ad = n Bu problemde dört döngü i³lemi görülebilir: 1. Kullancnn girdi i notlar okumak için bir döngü. 2. Ortalama likteki için gereken, notlarn toplamn hesaplamakta kullanlan döngü (birinci e³it- i³aretine kar³ dü³er). 3. Varyansvestandartsapmaiçingereken,herbirnotunortalamaylafarklarnnkarelerinin toplamn hesaplamakta kullanlan döngü (ikinci e³itlikteki i³aretine kar³ dü³er). 4. Mutlak toplamnhesaplamaktakullanlandöngü(dördüncüe³itlikteki sapma için gereken, her bir notun ortalamayla farklarnn mutlak de erlerinin i³aretinekar³dü³er). 85
94 86 Örnek 13 Çe³itli istatistik hesaplar yapan program. #include <iostream> #include <stdlib.h> #include <math.h> using namespace std; #define MAXSTUDENTS 100 // cin,cout,endl // EXIT_SUCCESS // fabs,sqrt int main(void) { int score[maxstudents]; int no_students = 0; float mean, variance, std_dev, abs_dev; float total = 0.0, sqr_total = 0.0, abs_total = 0.0; int i = 0; cout << "Kaç ö renci var? "; cin >> no_students; for (i = 0; i < no_students; i++) { cout << i + 1 << ". ö rencinin notu: "; cin >> score[i]; total = total + score[i]; mean = total / no_students; for (i = 0; i < no_students; i++) { sqr_total = sqr_total + (score[i] - mean) * (score[i] - mean); abs_total = abs_total + fabs(score[i] - mean); variance = sqr_total / (no_students - 1); std_dev = sqrt(variance); abs_dev = abs_total / no_students; cout << "Ortalama: " << mean << endl; cout << "Varyans: " << variance << endl; cout << "Standart sapma: " << std_dev << endl; cout << "Mutlak sapma: " << abs_dev << endl; return EXIT_SUCCESS;
95 87 Diziler Kaç ö renci var? 5 1. ö rencinin notu: ö rencinin notu: ö rencinin notu: ö rencinin notu: ö rencinin notu: 71 Ortalama: 71.2 Varyans: Standart sapma: Mutlak sapma: ekil 5.1: Örnek 13 ekran çkts Buradabirinciveikincidöngülertekbirdöngüdebirle³tirilebilir,kullancnotlargirdikçebunlar döngülerde toplama her eklenebilir. bir notun Ancak ortalamayla üçüncü farkna ve dördüncü gereksinim döngüler vardr bu ve döngüye bu ortalama eklenemez, ancak çünkü birinci o döngü den ve sona her yinelemede erdi inde elde ayn edilmektedir. ö renci notu Döngü üzerinde sayac i³lem ayn yapld ndan snr de erleri üçüncü arasnda ve de i³ti in- döngüler de kendi aralarnda tek bir döngüde birle³tirilebilirler. dördüncü Örnek lard. Oysa 11'da bu kullancnn örnekte ö renci girdi i notlarnn direnç de erleri birinci toplama döngünün eklendikten çk³nda hemen unutulmamas sonra yitiriliyor- çünkü ikinci döngüde de bunlar gerekecektir. Yani bu notlarn bir yerde tutulmas gerekir, Ayn tipten çok sayda eleman bulunan de i³kenler için en uygun yapnn diziler oldu u gerekir. lüm 1.1.3'de görülmü³tü. Örne imizde de ö renci notlar bir dizi olarak temsil edilmektedir. Bö- 5.1 Tek Boyutlu Diziler Dizi tanmnn yazm veri_tipi dizi_ad[dizi_boyu]; ³eklindedir. Burada dizi_ad dizi tipinden tanmlanan de i³kenin adn, dizi_boyu bu dizide kaç eleman bulundu unu, veri_tipi ise her bir elemann hangi tipten oldu unu belirtir. Örnekte int score[maxstudents]; komutu, her biri tamsay tipinden MAXSTUDENTS elemanl, score dizi için bellekte birbirini izleyecek ³ekilde adnda bir dizi tanmlar. Bu MAXSTUDENTS * sizeof(int) sekizli yer ayrlr. Di er in: de i³kenlerde oldu u gibi, dizilere de tanm srasnda ba³langç de eri verilebilir. Örne-
96 Tek Boyutlu Diziler 88 int score[4] = { 85, 73, 91, 66 ; tanm4elemanlbirdizitanmlarveelemanlarasrasyla85,73,91ve66de erleriniatar.özel bir durum olarak, bütün diziye 0 ba³langç de eri verilmek isteniyorsa ³u komut kullanlabilir: int score[50] = { 0 ; Derleyicinin snda dizinin dizi kaç için elemannn bellekte olaca ne kadar belli yer olmaldr. ayrlaca n Bunun bilmesi için iki gerekir, yöntem yani kullanlabilir: derleme a³ama- açk belirtim rda da örnekleri Dizinin görülen kaç eleman yöntemdir. oldu unun Boy olarak tanm de i³mez srasnda bir açk de er olarak vermek belirtildi i, zorunludur. yuka- Örnekte snftaki ö renci says no_students de i³keniyle gösterilmektedir, yani dizinin no_students eleman olmas gerekli ve yeterlidir. Ancak no_students erinin ne olaca programn çal³mas srasnda belirlendi inden derleyici de i³keninin bu de eri dizi deboyu olarak kullanamaz, yani int score[no_students]; ³eklinde yalnzca bir saylar dizi ve tanm de i³mezler yaplamaz. yer alabilir, Ba³ka bir de i³kenler deyi³le, dizi yer boyu alamaz. için Bu yazlacak durumda, deyimde nin kaç eleman olaca ba³tan bilinmiyorsa gerekebilecek en büyük eleman says dizi- olarak belirtilmelidir. Örnekteki boy MAXSTUDENTS belirtilen say, bir yandan gereksiz bellek kullanmna de i³mezi yol açabilir, bu i³levi di er görmektedir. yandan da Burada ramn bir kstlamas haline gelir. Örnek programn yapt i³in açklamasn ³u ³ekilde prog- düzeltmek gerekir: Bu program, en fazla 100 ö rencili bir varyansn ve standart ile mutlak sapmalarn snfta, ö renci hesaplar. notlarnn ortalamasn, örtülü belirtim tur, yani Diziye ba³langç de eri verilirse eleman saysn belirtmek zorunlulu u yok- int score[] = { 85, 73, 91, 66 ; tanmdadörtelemanlbirtamsaydizisitanmlarvesöylenenba³langçde erlerini Bu durumda derleyici ba³langç de eri olarak verilen dizideki eleman saysn sayarak atar. boyu bir sakncas kendisi belirler. yoktur, Dizideki ancak artmas eleman olasl says ileride varsa artmayacaksa yine gerekebilecek bu yazm en büyük kullanmann saysnn dizi tanmnda açk olarak belirtilmesi gerekir çünkü aksi durumda sonradan eleman gelen elemanlar için yer ayrlmam³ olur. Dizinin mek gerekir. bir eleman Bu belirtim üzerinde de i³lem dizi adnn yapmak yannda için o elemann elemann sra kaçnc numarasnn eleman oldu unu kö³eli ayraçlar belirt- içine yazlmasyla yaplr, yani score[i], score dizisinin i. eleman anlamna gelir. Bu yazm
97 89 Diziler dizi ³eli ayraçlar tanmndaki içine yazmla yazlan ayn say olmakla dizinin tutabilece i birlikte anlam eleman olarak saysn tamamyla gösterirken farkldr: burada tanmda kaçnc köeleman üzerinde i³lem yapld n gösterir. Cdilindedizilerinilkelemannnsranumarasherzaman0'dr;yaniilkelemannsranumaras 0, bir ikinci dizinin elemann son elemannn sra numaras sra numaras 1 olacak n ³ekilde - 1 olur. ilerler Bu ( ekil özellik 5.2a). nedeniyle Bu durumda n elemanl n üzerinde i³lem yapacak tipik bir C döngüsü elemanl bir dizi for (i = 0; i < n; i++) ³eklinde ba³lar. lk elemann sra numaras 0 oldu undan for eleman ile i³lem yaplr. Son i³lem de n - 1 sra numaral elemanla blo una yaplr, ilk giri³te döngü dizinin sayac ilk n kullanlan de erini eleman ald nda says döngüden arasndaki çklr. ayrma Burada dikkat dizinin edilmelidir. tanmda Örnekte belirtilen tanmda boyuyla belirtilen gerçekten boy MAXSTUDENTS olsa da döngü 0. elemandan MAXSTUDENTS - geçerli elemann sra numaras 1. elemana kadar gitmez çünkü son no_students - 1 olacaktr: for (i = 0; i < no_students; i++) score MAXSTUDENTS-1 (a) score MAXSTUDENTS (b) ekil 5.2: Dizi elemanlarnn sra numaralar. Derleyici bir dizinin dizilerin n. ya da elemanlarna daha sonraki eri³imde elemanlarna dizi snrlarnn eri³ilmeye denetimini kalklrsa hata yapmaz; vermez. yani Dizi n elemanl rndan ta³mamak programcnn sorumlulu undadr. Dizi snrndan ta³acak bir sra numaras snrla- verilirse lunursa o bellekte de erle ilk i³lem elemandan yaplmaya ba³lanarak çal³lr( ekil istenen 5.2b). sayda Böyle eleman bir eri³im kadar çal³ma ilerlenip annda orada ne iki bu- soruna yol açabilir: tür 1. Gelinen ba³kabirde i³keninde eriistenmedende i³tirilmi³olurveprogramnçal³masüzerinde bellek gözü, ba³ka bir de i³ken için ayrlm³ bir bölgeye dü³ebilir. Bu durumda, beklenmedik etkiler yaratabilir. 2. Eri³ilmek Bu durumda istenen bir bellek bölgesi kullancnn izni olan bölgeler d³nda bir yere dü³ebilir. bellek hatas olu³ur.
98 Tek Boyutlu Diziler 90 Örnek 14. Tümce Tersine Çevirme Kullancnn yazd tümceyi tersine çevirerek ekrana çkartan bir program yazlmas isteniyor. Programn örnek bir çal³mas ekil 5.3'de verilmi³tir. Tümce: Deneme bir... Tersi:... rib emened Örnek 14 Tümceyi tersine çeviren program. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> using namespace std; #define MAXLENGTH 80 int main(void) { char sentence[maxlength]; int len, i; char tmp; ekil 5.3: Örnek 14 ekran çkts. // cin,cout,endl // EXIT_SUCCESS // gets // strlen cout << "Tümce: "; gets(sentence); len = strlen(sentence); for (i = 0; i < len / 2; i++) { tmp = sentence[i]; sentence[i] = sentence[len i]; sentence[len i] = tmp; cout << "Tersi: " << sentence << endl; return EXIT_SUCCESS; Örnek ritmasn program, kullanr. ba³tan Yani ve ilk sondan simgeyle ayn son srada simge, olan ikinci simgelerin simgeyle yerlerinin sondan bir takas önceki edilmesi simge algo- takas edilir. Bu algoritmann do ru çal³mas için takasn katarn ortasna kadar sürmesi v.b. katar ortasn geçmemesi gerekir. (Neden?) ve
99 91 Diziler 5.2 Katarlar C dilinde katarlar birer simge dizisi olarak de erlendirilir ve sonlarna konan '\0' simgesiyle sonlandrlrlar. Bu nedenle katar için bellekte ayrlmas gereken yer, katarn içerdi i simge saysnn bir fazlasdr. Örnekteki char sentence[maxlength]; tanm, her biri simge tipinden, 80 elemanl, sentence lardan biri '\0' simgesi için kullanlaca ndan kullancnn adnda yazaca bir katar tümce olu³turur. en fazla Bu 79 eleman- uzunlu unda olabilir. simge Katar belirtilebilir.tanmlananboyunkatariçingerekenyeriayrmasnadikkatedilmelidir. stenirse tipinden bir de i³kenin tanmlanmas srasnda çift trnaklar içinde ba³langç de eri boyut ayn i³i belirtilmeyebilir; görürler ( ekil 5.4a): bu durumda derleyici gerekli yeri kendisi ayrr. A³a daki iki tanm char sentence[15] = Deneme bir...; char sentence[] = Deneme bir...; sentence D e n e m e b i r... \ (a) sentence D e n \ (b) ekil 5.4: Katarlara ba³langç de eri atanmas. Tam konusu gerekti i olabilecekse kadar gerekebilecek yer ayrmak riskli maksimum bir davran³tr. alan gözönüne Programn alnmal içinde ve katarn tanm uzamas srasnda söz- boy belirtilmelidir. bu char sentence[maxlength] = Deneme bir...; komutu MAXLENGTH simgelik yer ayrr ancak yalnzca ilk 15 simgeyi doldurur ( ekil 5.4b). Katarlarn elemann, yani elemanlarna katarn ilk dizilerde simgesinin oldu u sra numaras gibi teker 0 teker olacaktr. eri³ilebilir. Son elemann Dizilerde sra oldu u numaras gibi, ilk ayrlan yerin bir eksi idir. Yukardaki örnekte da sentence[0] eleman'd', sentence[6] ' ', eleman sentence[13] eleman '.', sentence[14] eleman '\0' de erlerini alrlar.
100 Katar Kitapl 92 Katar tipinden de i³kenlerin cout sorun olmazken, birimi yardmyla çktya gönderilmelerinde herhangi bir cin simgesi varsa, ile girdi a³amasnda sorun çkabilir. Kullancnn yazd katarda bo³luk cin kadarolanbölümüde i³keneaktaracaktr.örnektebuamaçlakatarngirdii³lemi birimi birden fazla de i³kenin girildi ini dü³ünerek yalnzca ilk bo³lu a gets fonksiyonuyla gerçekle³tirilmi³tir. kitaplk 1 Bu komutun yerine cin >> sentence; komutu kullanlm³ olsayd programn çal³mas ekil 5.5'de görüldü ü gibi olurdu. Tümce: Deneme bir... Tersi: emened 5.3 Katar Kitapl ekil 5.5: Örnek 14 hatal ekran çkts. Katarlar mak için birer katar dizi kitapl ndaki olduklarndan fonksiyonlarn katarlar arasnda kullanlmas atama gerekir. yapmak Örnek ya da katarlar programda, kar³la³tr- uzunlu unu belirlemek üzere bu kitaplktaki katarn strlen fonksiyonundan yararlanlm³tr. Katar leçler kullanlrsa tipinden iki beklenmedik de i³kenin birbirine sonuçlar atanmas do urabilir. ya Ba³ka da kar³la³trlmas bir deyi³le, atama i³lemleri için standart i³- str1 = str2; ya da kar³la³trma için if (str1 == str2) gibi yaplar kullanlmaz. Katarlar üzerinde skça 2 fonksiyonlarn kullanlabilmesi kullanlan için programlarn temel i³lemler ba³nda için bir katar kitapl tanmlanm³tr. Bu string.h gerekir. ba³lk dosyasnn alnmas Katar kitapl nn en sk kullanlan fonksiyonlar Tablo 5.1'de verilmi³tir. Katar uzunlu u fonksiyonu sondaki '\0' simgesini gözönüne almaz. strlen(computer) 8 1 Güvenlik nedenleriyle gets kitaplk fonksiyonunun kullanlmas tehlikelidir. Bu komutun yerine fgets fonksiyonunun kullanlmas önerilir (bkz. Bölüm 8). 2 Daha ayrntl açklama için bkz. Bölüm.7.3.
101 93 Diziler Ad ³levi strlen(s) katar uzunlu u strcopy(dest,src) strncpy(dest,src,n) katar kopyalama strcmp(s1,s2) strncmp(s1,s2,n) katar kar³la³trma strcat(dest,src) strncat(dest,src,n) katar biti³tirme Tablo 5.1: Katar kitapl fonksiyonlar. Katar olan katarn kopyalama üstüne fonksiyonlar yazarlar. Biti³tirme ikinci giri³ fonksiyonlarysa parametresi olan ikinci katar, giri³ birinci parametresi giri³ parametresi birincigiri³parametresiolankatarnardnaeklerler.herikifonksiyongrubudasonuçkatarnn olan katar, sonuna konmas gereken '\0' simgesini kendileri koyarlar. Katar Sözgelimi i³lemi yapan fonksiyonlarn bazlarnda uzunluk denetimi yaplr, bazlarnda yaplmaz. strcpy fonksiyonu src katarnn de erini dest katarnn üstüne yazarken, strncpy fonksiyonu da ayn i³levi görür, ancak en fazla n denetimi yapan fonksiyonlarn kullanlmas önerilir. simgeyi kopyalar. Güvenlik açsndan uzunluk Katar kar³la³trma fonksiyonlar giri³ parametresi olan 3 rallarna göre sözlük sras kar³la³trmas yaparlar. ki katar katarlar e³itse arasnda 0, birinci ngilizce katar dilinin ikinciden ku- önce geliyorsa -1, sonra geliyorsa 1 de erini döndürürler. strcmp(abc, ad) -1 strcmp(abcd, abc) 1 strncmp(abcd, abcde, 4) 0 Kopyalama yeterli uzunlukta ve biti³tirme olmasnn fonksiyonlarnda sa lanmasdr. dikkat Örne in, edilmesi a³a daki gereken program bir nokta, parças hedef hataya katarn açabilir: yol char author1[] = Brian, author2[] = Dennis;... strcpy(author1, author2); Derleyici author1 katarna 6 simgelik, author2 sonra katarnaysa 7 simgelik yer ayracaktr. Daha author1 katarnn üstüne author2 katar yazlmaya kalkld nda author1 yeterli yer olmad için bu de i³kenin snrlarndan ta³lr. Benzer ³ekilde, biti³tirme katarnda lerinde de hedef katar için iki asl katarn toplam uzunluklarn tutmaya yetecek kadar i³lem- ayrlm³ olmaldr. yer 3 Uzunluk denetimi yapmayan katar fonksiyonlar tampon ta³rma ad verilen saldrlara yol açan kaynaklar arasnda en büyük yeri tutar.
102 Çok Boyutlu Diziler 94 Uygulama: Tek Boyutlu Diziler Örnek 15. Polinom Hesab p(x) = a n x n + a n 1 x n a 1 x + a 0 ³eklinde yazlan n. dereceden bir polinomda verilen bir x de eri için p(x)'in hesaplanmas n(n+1) 2 adet çarpma ve n bu say azaltlabilir. adet toplama i³lemi gerektirir. çiçe çarpma ve toplama yöntemiyle Polinomu ³u ³ekilde yeniden yazalm: p(x) = (((a n x + a n 1 )x + a n 2 )x + + a 1 )x + a 0 Ohaldebir bde eri,ba³langçta b = a n ve i.admda b = bx+a n i olacak³ekildehesaplanarek gidilirse a 0 katsaysnndatoplanmasylaeldeedilecek bde erihesaplanmakistenen p(x)de eri olur. Yaplmas gereken i³lem says da n çarpma ve n toplamaya iner. Çkts verilen program kullanarak p(x) = 13x 7 9x x 4 4x 3 + 3x + 5 polinomunun p(4), p(2.5) ve p(19) de erlerini hesaplatn. Örnek 16. Matris Çarpm Bu bölümde üzerinde çal³lacak program, boyutlar ve elemanlar kullancdan alnan iki matrisiçarparaksonucuekranaçkartr.programnörnekbirçal³masnnekrançkts ekil5.6'da verilmi³tir. 5.4 Çok Boyutlu Diziler Çok boyutlu bir dizi tanmlanmasnda her boyut ayr bir kö³eli ayraç çifti içinde belirtilir. Örnekteki int left[maxsize][maxsize]; komutu, 30 satrl ve 30 sütunlu 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 sürdürülebilirdi: int m[30][20][7][12];
103 95 Diziler Örnek 15 Polinom de eri hesaplayan fonksiyon. #include <iostream> #include <stdlib.h> using namespace std; #define MAXDEGREE 50 int main(void) { float a[maxdegree]; float x, b; int n, i; char response = 'E'; cout << "Polinomun derecesi: "; cin >> n; cout << "Katsaylar: " << endl; for (i = n; i >= 0; i--) { cout << "a" << i << ": "; cin >> a[i]; // cin,cout,endl // EXIT_SUCCESS while (true) { cout << "x: "; cin >> x; b = a[n]; for (i = n - 1; i >= 0; i--) b = b * x + a[i]; cout << "p(x): " << b << endl; cout << "Devam etmek istiyor musunuz (E/H)? "; cin >> response; if ((response == 'H') (response == 'h')) break; return EXIT_SUCCESS;
104 Çok Boyutlu Diziler 96 Sol matrisin satr says: 5 Sol matrisin sütun says: 3 Sa matrisin sütun says: 4 Sol matris: [1,1]: 2 [1,2]: 7 [1,3]: -1 [2,1]: 3 [2,2]: 5 [2,3]: 2 [3,1]: 0 [3,2]: 4 [3,3]: 1 [4,1]: 9 [4,2]: 0 [4,3]: -3 [5,1]: 4 [5,2]: 7 [5,3]: 2 Sa matris: [1,1]: 0 [1,2]: 5 [1,3]: 2 [1,4]: -4 [2,1]: 1 [2,2]: 7 [2,3]: 3 [2,4]: 2 [3,1]: 5 [3,2]: 2 [3,3]: 0 [3,4]: -1 Çarpm sonucu: ekil 5.6: Örnek 16 ekran çkts.
105 97 Diziler Örnek 16 ki matrisi çarpan program. #include <iostream> #include <stdlib.h> using namespace std; #define MAXSIZE 30 // cin,cout,endl // EXIT_SUCCESS int main(void) { int left[maxsize][maxsize], right[maxsize][maxsize]; int product[maxsize][maxsize] = { 0 ; int rl, cl, cr; int &rr = cl; int i, j, k; cout << "Sol matrisin satr says: "; cin >> rl; cout << "Sol matrisin sütun says: "; cin >> cl; cout << "Sa matrisin sütun says: "; cin >> cr; cout << "Sol matris: " << endl; for (i = 0; i < rl; i++) { for (j = 0; j < cl; j++) { cout << " [" << i + 1 << "," << j + 1<< "]: "; cin >> left[i][j]; cout << "Sa matris: " << endl; for (j = 0; j < rr; j++) { for (k = 0; k < cr; k++) { cout << " [" << j + 1 << "," << k + 1 << "]: "; cin >> right[j][k]; for (i = 0; i < rl; i++) { for (j = 0; j < cr; j++) { for (k = 0; k < cl; k++) product[i][j] = product[i][j] + left[i][k] * right[k][j]; cout << "Çarpm sonucu:" << endl; for (i = 0; i < rl; i++) { for (k = 0; k < cr; k++) cout << "\t" << product[i][k]; cout << endl;
106 Ba³vurular 98 Bu i³lem sonucunda da bellekte 30*20*7*12=50400 tamsay tutacak kadar yer ayrlr. Tek boyutlu dizilerde oldu u gibi, çok boyutlu dizilerde de ba³langç de eri verilebilir. Bunun için her bir boyutun kendi içinde süslü ayraçlar içine alnmas gerekir: int m[2][3] = { { 1, 2, 1, { 3, 5, 1 ; [ ] tanm m = matrisini olu³turur. Tek boyutlu dizilerdekine benzer ³ekilde { ba³langç bütün boyutlarn de eri bütün belirtilmesi elemanlara zorunludur. 0 ba³langç Sözgelimi de erini bir atar. isim Çok dizisi boyutlu olu³turulmak dizilerde isteniyorsa ilki d³nda char names[][] = { Dennis, Brian, Ken ; tanmlamas derleyicinin hata vermesine neden olur. Birinci boyut d³ndakiler belirtilerek yazlrsa char names[][10] = { Dennis, Brian, Ken ; her olur. bir Yani eleman derleyici en fazla isim 10 dizisinin simge uzunlu unda eleman saysn olabilen sayar 3 ancak elemanl belirtilen bir katar ba³langç dizisi tanmlanm³ uzunluklarn hesaplamaya çal³maz. Yine de belirtilen uzunluktan daha uzun bir katarlarnn katar yazlrsa (diyelim 15 uzunluklu) derleyici bir hata üretebilir. ba³langç 5.5 Ba³vurular Ba³vurular, says ile sa ayn matrisin de i³kene sütun ikinci saylarnn bir isim ayn verilmesini olmas zorunlulu u sa larlar. 4 nedeniyle Örnekte sol bu bilgiyi matrisin tek satr de i³kenle temsil etmek yeterli görülmü³ ve bir cl anla³lrl artrmak amacyla de i³keni tanmlanm³tr. Ancak döngülerde rr de i³keninin de tanmlanmasnn yararl olaca dü³ünülerek rr de i³keninin cl bulunurlar ve dolaysyla de i³kenine birinde ba³vurmas yaplan de i³iklik sa lanm³tr. do rudan Bu iki do ruya de i³ken di erini bellekte etkiler. ayn gözde Örnekte rr durumda de i³keni ba³vuru olmak yerine ikinci bir de i³ken olarak da tanmlanabilirdi. Bu cl de i³kenikullancdanokunduktansonra rr = cl dürülebilirdi. Bu yakla³mda, iki de i³ken birbirinden ayrlm³ ³eklindebiratamaylai³lemsür- di erini etkilemezdi, ancak programda boyut de i³kenleri üzerinde olaca bir için de i³iklik birindeki olmad de i³iklik bir sorun çkmazd. Tek fark, gereksiz yere ikinci bir de i³ken tanmlanm³ olmas olurdu. için 4 Ba³vurular, C++ ile gelmi³ bir yeniliktir, C dilinde yoktur.
107 99 Diziler Uygulama: Matrisler Örnek 17. Gauss Eliminasyon Yöntemi ax = b ³eklinde yazlan n bilinmeyenli bir lineer denklem takmnda a katsay matrisini, b de i³mezler vektörünü ve x a³amaldr: çözüm vektörünü gösterir. Bu denklem takmnn çözümü iki 1. a matrisi baz dönü³ümlerle bir üçgen matris haline getirilir. Bunun için önce sistemin i = 2, 3,..., n.denklemlerinden x 1 yokedilir(birincidenklem a a i1 dençkarlr).benzer³ekilde, ileçarplp i.denklem- i = 3, 4,..., n.denklemlerden x Birincidenkleminbirincielemanolan 11 2 yokedilerekdevamedilir. a 11 'epivotadverilirve x leme geçildi inde 1 yokedilipikincidenk- a sfrdan farkl olmas 22 gerekti i eleman açktr. pivot olur. Yöntemin çal³abilmesi için bütün pivotlarn 2. x n de eri n. denklemden do rudan hesaplanr. Bu de er n nursa 1. denklemde yerine ko- x de erler n 1 hesaplanabilir. bulunurveböylecegeriyedo ruyerinekoymai³lemleriylebütünbilinmeyen Denklem takm ³u ³ekilde verilmi³ olsun: x 1 + x 2 = 3.5 x 1 x 2 + 5x 3 = 11 2x 1 x 2 + x 3 = 3.3 a matrisi ve b vektörünün de erlerini adm adm izlersek: ba³langçta: a = b = x 1 'in yok edilmesinden sonra: a = b = x 2 'nin yok edilmesinden sonra: a = Sondenklemden x 3 = 2.3eldeedilir.Bude erikincidenklemdeyerinekonursa: 2x 2 + 5x 3 = 7.5 denkleminden x 2 = 2 ve bu de er birinci denklemde yerine konursa x 1 + x 2 = 3.5 minden denkle- x 1 = 1.5 bulunur. Gauss eliminasyon yöntemini kullanarak n Örnek 17'da verilmi³tir. bilinmeyenli bir denklem takmn çözen program b =
108 Ba³vurular 100 Örnek 17 Gauss eliminasyon yöntemiyle denklem takm çözen program. #include <iostream> #include <stdlib.h> using namespace std; #define MAXEQUATIONS 5 // cin,cout,endl // EXIT_SUCCESS int main(void) { float a[maxequations][maxequations], b[maxequations]; float x[maxequations]; float pivot, f; int n; int i, j, k; cout << "Denklem says: "; cin >> n; for (i = 0; i < n; i++) { cout << "Denklem " << i + 1 << ": "; for (j = 0; j < n; j++) { cin >> a[i][j]; cin >> b[i]; for (j = 0; j < n - 1; j++) { pivot = a[j][j]; for (i = j + 1; i < n; i++) { f = a[i][j] / pivot; for (k = j + 1; k < n; k++) a[i][k] = a[i][k] - f * a[j][k]; b[i] = b[i] - f * b[j]; x[n-1] = b[n-1] / a[n-1][n-1]; for (i = n - 2; i >= 0; i--) { f = b[i]; for (k = i + 1; k < n; k++) f = f - a[i][k] * x[k]; x[i] = f / a[i][i]; for (i = 0; i < n; i++) cout << "x" << i + 1 << ": " << x[i] << endl; return EXIT_SUCCESS;
109 101 Diziler Sorular 1. Kullancnn rin önünde ve girdi i arkasnda bir tümcedeki bo³luk oldu u sözcük varsaylacaktr. saysn sayan Ancak bir program sözcük arasnda yazn. Sözcükle- saydabo³lukolabilece igibitümceninba³ndavesonundadaistendi ikadarbo³lukolabilir. Örnek olarak kullanc the world is not enough istendi i cesini girerse programn çkts 5 olacaktr. tüm- 2. Eratosthenes çkartan bir fonksiyon kalburu yöntemini yazn. kullanarak ilk say içindeki asal saylar ekrana 3. Kullancdan kullanc alnan saysn bir girerse sayy yaz program olarak ekrana ekrana Yirmibirbinüçyüzellibe³ çkartan bir program yazn. yazacaktr. Örne in 4. Kullancnn yazn. Örne in verdi i kullanc sayy 523 Roma saysn rakamlarna girerse ekrana çevirerek DXXIII ekrana katar çkartan çkarlmaldr. bir program 5. Verilen kullanc bir tarihin haftann tarihini hangi girerse gününe ekrana geldi ini Sal katar bulan çkarlmaldr. bir program yazn. Örne in 6. Kullancdan alnan iki tarih arasnda geçen gün saysn hesaplayan bir program yazn. 7. Kullancdan ald bir tarihin haftann hangi gününe geldi ini bulan bir program yazn.
110 Ba³vurular 102
111 Bölüm 6 Fonksiyonlar u ana kadar yaplan örneklerde bütün i³lemler tek bir fonksiyonda (main çekle³tiriliyordu. Gereken yerlerde kitaplk fonksiyonlarndan yararlanlmakla fonksiyonu) birlikte, kendi ger- yazd mz ramnn öneminden kod tek bir Bölüm fonksiyonla 1.4'de snrlyd. söz edilmi³, Oysa i³leri blok alt-i³lere, yapl programlamada alt-i³leri alt-alt-i³lere soyutlama bölerek kav- yazlan rülmü³tü. programlarn Bu bölümde hem de programcnn geli³tirme hem kendi de bakm fonksiyonlarn a³amalarnda nasl sa layaca yazaca n inceleyece iz. kolaylklar gö- C belirleyen dilinde her giri³ i³ parametreleri ya da alt-i³ bir alrlar fonksiyon ve i³lemin tarafndan sonucuna gerçeklenir. göre Fonksiyonlar yapacaklar i³i bir Yani giri³ parametrelerinin says birden fazla olabilir ancak çk³ çk³ parametresi parametresi en üretirler. tanedir. imdiye kadar kullanlan kitaplk fonksiyonlarnn bazlarna parametreleri açsndan fazla bir bakarsak: metresi sqrt: Kesirli üretir. say tipinden bir giri³ parametresi alr, kesirli say tipinden bir çk³ para- pow: parametresi kisi de üretir. kesirli say tipinden iki giri³ parametresi alr, kesirli say tipinden bir çk³ strlen: üretir. Katar tipinden bir giri³ parametresi alr, tamsay tipinden bir çk³ parametresi rand: Giri³ parametresi almaz, tamsay tipinden bir çk³ parametresi üretir. srand: ³aretsiz tamsay tipinden bir giri³ parametresi alr, çk³ parametresi üretmez. Bir fonksiyonun bir alt-i³ini yaptrmak üzere ba³ka bir fonksiyonu kullanmasna fonksiyon ça rs ad verilir. Örnek 7'da, main fonksiyonu, for blo unun ilk komutunda rand nunu ça rmaktadr. Fonksiyon ça rsnda üst fonksiyona fonksiyo- fonksiyon, alt fonksiyona da ça rlan fonksiyon denir, yani örnekte main fonksiyonu ça ran, rand fonksiyondur. Fonksiyon ça rsnn sona ermesinden sonra ça ran fonksiyonda fonksiyonuysa ak³ bir ça rlan komutla devam eder. sonraki Ça ranfonksiyonça rlanfonksiyonagiri³parametrelerinigönderir,ça rlanfonksiyonsaüretti i sonucu ça ran fonksiyona döndürür. Döndürülen de er ça ran fonksiyonda bir de i³kene 103
112 104 atanabilece i parametresi olarak ya da da bir gönderilebilir. deyimde kullanlabilece i gibi, do rudan ba³ka bir fonksiyona giri³ 1 Örnekte time fonksiyonunun döndürdü ü de er, srand fonksiyonuna parametre olarak gönderilmi³tir: number rand(); number = rand() % 6; srand(time(null)); // do rudan atama // deyimde kullanma // ba³ka fonksiyona gönderme Çk³ parametrelerinin kullanmnda tip uyumuna dikkat edilmelidir. Sözgelimi, rand yonu tamsay tipinden bir de er döndürdü üne göre fonksi- number olmaldr, katar tipinden olamaz. de i³keni de tamsay tipinden mine sokulacaksa bu de erin tamsay 2 Benzer tipinden ³ekilde, olmasna bir fonksiyondan dikkat etmek gelen gerekir. bir de er kalan i³le- Giri³ rlan parametrelerinin fonksiyonun parametreleri aktarm için bekleme ça ran ³ekli fonksiyondaki uyumlu olmaldr. parametreleri Bu uyumluluk yollama ³ekliyle ³u ³ekilde ça - tanmlanabilir: 1. Ça rlan fonksiyon kaç parametre bekliyorsa ça ran fonksiyon o sayda parametre yollamaldr. 2. Ça rlan fonksiyon her bir sradaki giri³ parametresinin tipinin ne olmasn bekliyorsa ça ran fonksiyon bu tipe uyumlu bir de er göndermelidir. Örne in pow (ya da tamsay) fonksiyonu de eri yollanmaldr. iki tane kesirli Bir, say üç bekliyorsa ya da daha bu fazla fonksiyona de er yollanmas, iki tane kesirli hiç de er say yollanmamas, açar. yollanan iki de erin say d³nda bir tipten (sözgelimi katar) olmas hataya yol Örnek 18. Asal Çarpanlara Ayrma Kullancnn niyor. Gerekli girdi i algoritmann bir saynn ak³ asal çizene i çarpanlarn ekil 1.18'de, ekrana örnek döken bir bir çal³masnn program yazlmas ekran çkts iste- ekil ylarn 6.1'de bulunmasna verilmi³tir. gerek Programda duyulacaktr. bir saynn Soyutlama asal olup ilkesine olmad nn göre bu snanmasna i³lemler fonksiyonlarla ve asal sa- gerçekle³tirilecek, kullancnn verdi i ana sayy fonksiyon, bölüp asal bölmediklerini saylar bulan snayacaktr. fonksiyondan Örnekte srayla ald asal saylarn is_prime kendisine gönderilen bir saynn asal olup olmad n belirleyerek geriye asalsa do ru, fonksiyonu yanl³ mantksal de erini yollar. de ilse next_prime büyük olan ilk asal sayy bularak kendisini ça ran fonksiyonu fonksiyona ise kendisine döndürür. gönderilen saydan daha 1 Aslnda bu durumlarn hepsi deyimde kullanma olarak de erlendirilebilir. 2 Eski C derleyicileri bu tip denetimlerde fazlasyla gev³ek davranabilmektedir. Bu durum programcnn hata yapmasna zemin hazrlar.
113 105 Fonksiyonlar Örnek 18 Bir sayy asal çarpanlarna ayran program. #include <iostream> #include <stdlib.h> using namespace std; int next_prime(int prime); int main(void) { int number, factor = 2; cout << "Sayy yaznz: "; cin >> number; while (number > 1) { while (number % factor == 0) { cout << factor << " "; number = number / factor; factor = next_prime(factor); cout << endl; return EXIT_SUCCESS; bool is_prime(int cand) { int count; // 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; int next_prime(int prime) { int cand = (prime == 2)? 3 : prime + 2; while (!is_prime(cand)) cand += 2; return cand;
114 Fonksiyon Bildirimi ve Tanm 106 Sayy yaznz: ekil 6.1: Örnek 18 ekran çkts. 6.1 Fonksiyon Bildirimi ve Tanm Bir fonksiyon iki bile³enden olu³ur: Fonksiyonun Soyutlamadaki ba³l, kar³l yla fonksiyonun fonksiyonun adn NE ve giri³/çk³ yapt n anlatr. parametrelerini Fonksiyon belirtmeye ba³l nn yarar. tilmesi i³lemine fonksiyonun belir- bildirimi yaplr. Bildirim komutunun yazm ³u denir ³ekildedir: ve ba³l n sonuna bir noktal virgül konarak çk³_parametresi_tipi fonksiyon_ad(giri³_parametresi_listesi); Örnekte next_prime fonksiyonu için yaplan int next_prime(int prime); bildirimine göre, next_prime yine tamsay tipinden bir çk³ fonksiyonu parametresi tamsay döndürür. tipinden bir giri³ parametresi alr ve Çk³ ri³ parametresi parametresi listesiyse herhangi birbirinden bir skalar virgülle ya da bile³ke ayrlm³ tipten olabilir ancak dizi olamaz. Gi- veri_tipi de i³ken_ad ³eklindedir. Çk³ parametresi döndürmeyen fonksiyonlarn çk³ parametresi tipi çiftleri void sakl listesi sözcü üyle parametresine belirtilir. de Benzer ³ekilde, giri³ parametresi almayan fonksiyonlarn giri³ void mzbazkitaplkfonksiyonlarnnsistemde³öylebildirilmi³olmalargerekti igörülebilir: yazlr. Bu bilgileri gözönünde bulundurarsak, kulland - double sqrt(double x); double pow(double x, double y); int rand(void); void srand(unsigned int seed); Giri³ cak ayn parametresi tipten de i³kenler listesindeki gruplanamaz. de i³kenlerin Sözgelimi yazm de i³ken a³a daki tanm bildirim yazmna hataldr: benzer an- double pow(double x, y); Fonksiyon parametresi bildirimi, tipinden derleyiciye de er üreten giri³ belirtilen parametresi isimde listesi bir tipinden fonksiyon de i³kenler oldu ununun alan bildirilmesini ve çk³ uyumlu sa lar. olup olmadklarn Böylelikle derleyici denetleyebilir. bu fonksiyon Çal³ma ça rsn annda gördü ü fonksiyon yerde ça rsna parametrelerin inde uygun yere gidilmesini sa layacak ba lantlar kurmak derleyicinin de il ba laycnn gelindigörevidir.
115 107 Fonksiyonlar yonun Fonksiyonun i³ini NASIL gövdesi, yapt n fonksiyonun anlatr. yapaca Bir fonksiyonun i³leri belirten bütününün, bloktan yani olu³ur, giri³/çk³ yani fonksimetrelerinin yansra gövdesinin de belirtildi i yere fonksiyonun para- tanm denir. Örnekte is_prime fonksiyonu, main fonksiyonunun bitiminden sonra, next_prime fonksiyonu da is_prime fonksiyonunun bitiminden sonra tanmlanm³tr. Ça rlan fonksiyon üretti i de eri ça ran fonksiyona return rür. komutu yardmyla döndü- return tipineuyguntiptenbirde erüretmelidir.örnekte sakl sözcü ünden sonra yazlan deyim fonksiyonun ba³l nda belirtilen veri is_prime tanmlanm³tr ve fonksiyonun çe³itli noktalarnda fonksiyonumantksaltipten false ya da true mektedir. de erlerini döndür- next_prime de eri tutan de i³ken de fonksiyonuysa (cand) tamsay tamsay tipindendir. tipinden tanmlanm³tr ve döndürdü ü Bir ran fonksiyon fonksiyondan ça rsnn önce yaplabilmesi yaplmaldr. için Örnekte ça rlan fonksiyonun ya bildirimi ya da tanm çamain fonksiyonu next_prime fonksiyonunu, next_prime fonksiyonu da is_prime fonksiyonunu ça rr. Birinci ça r, next_prime nununbildirimi mainfonksiyonununtanmba³lamadanyapld ndanba³arlolur. kinciça - fonksiyo- rysa is_prime fonksiyonu next_prime Ancak örne in fonksiyonundan önce tanmland ndan ba³arl olur. main fonksiyonu is_prime fonksiyonunu ça ramaz çünkü öncesinde is_prime fonksiyonunun ne tanm ne de bildirimi vardr. Kendi fonksiyonlarn yazd nz bildirimlerinin fonksiyonlarda daha oldu u önceden gibi, yaplm³ kitaplk fonksiyonlarn olmas gerekir. da Bu ça rabilmeniz bildirimler kullandiçin bu nz ba³lk derleyiciyle dosyasn belirtmeniz gelen ba³lk zorunlulu u dosyalarnda da yer buradan alr; bir do ar. kitaplk fonksiyonunu kulland nzda 6.2 Parametre Aktarm Giri³ yonun parametrelerinin ba³l nda belirtilen aktarmnda liste uyumlu fonksiyon olmaldr. ça rsnda Ça rda belirtilen yazlan parametre her de er, listesiyle ça rlan fonksisiyonun ba³l nda ayn srada yazlm³ de i³kene atanr. Bu parametre aktarm yöntemine fonk- de er aktarm ad verilir. Örnekteki birinci fonksiyon ça rsnda: factor = next_prime(factor); main fonksiyonundaki factor de i³keninin de eri next_prime olan fonksiyonunun giri³ parametresi prime de i³kenine atanr. Dönü³te de next_prime fonksiyonunun return yollad komutuyla geri cand de i³keninin de eri main fonksiyonundaki factor nun bir döngü içinde ça rld gözönüne alnarak, parametre olarak de i³kenine ilk ça rda atanr. 2 Fonksiyo- gönderilece i ve 3 de erinin dönece i, ikinci ça rda 3 de erinin gönderilece i ve 5 de erinin dönece i, ileriki ça rlarda 5, 7, 11,... de erlerinin gönderilece i görülebilir. Benzer de erinin ikinci fonksiyon ça rsnda ³ekilde, next_prime fonksiyonundaki cand de i³keninin de eri is_prime fonksiyonunun giri³ parametresi olan cand de i³kenine atanr. Tipi daki uygun ça rlar oldu u geçerlidir: sürece parametre olarak herhangi bir deyim belirtilebilir. Sözgelimi a³a -
116 Yerel De i³kenler 108 main number 6468 factor 2 next_prime prime cand is_prime cand count ekil 6.2: Parametre aktarm örne i - 1. adm. is_prime(13) is_prime(cand + 1) Benzer ³ekilde, geri döndürülecek de er için uyumlu tipten de er üreten bir deyim yazlabilir: return cand + 2; 6.3 Yerel De i³kenler Parametreaktarmanlatlrkenmain fonksiyonundaki factor de i³kenininde eri next_prime fonksiyonunun giri³ parametresi olan prime de i³kenine, next_prime fonksiyonundaki cand de i³keninin de eri is_prime fonksiyonunun giri³ parametresi olan cand sözler kullanld. Buradan da görülebilece i gibi, de i³kenler içinde tanmlandklar de i³kenine fonksiyon gibi ile birlikte de erlendirilirler ve yalnzca bu fonksiyon içinde geçerlidirler. main daki fonksiyonun- factor de i³keni ile next_prime fonksiyonundaki prime bellekte farkl yerlerde bulunurlar; dolaysyla, birinde yaplan de i³keni de i³iklik farkl di erini de i³kenlerdir, De i³ken adlarnn ayn olmasnn da bir önemi yoktur: etkilemez. next_prime fonksiyonundaki cand de i³keniyle is_prime fonksiyonundaki cand de i³keni de farkl de i³kenlerdir. Örnekte ilk fonksiyon ça rlar ³öyle gerçekle³ir. main fonksiyonunda factor langçta atanm³ olan 2 de eri de i³kenine ba³- next_prime fonksiyonunun prime kenine aktarlr ( ekil 6.2). adl giri³ parametre de i³- next_prime fonksiyonunda cand de er asal olup olunmad nn belirlenmesi için de i³keni 3 de erini alr ve bu is_prime fonksiyonunun cand metre de i³kenine aktarlr( ekil 6.3). adl giri³ para- is_prime fonksiyonunda count ancak döngü ko³ulu ba³tan sa lanmad ndan döngüden çklarak de i³keni 3 de erini alr next_prime fonksiyonuna true de eri döndürülür ( ekil 6.4). Bu de er!is_prime(cand) cunu üretmesine neden oldu undan döngüden çklr ve ko³ul deyiminin yanl³ sonu- main fonksiyonuna cand o anki de eri, yani 3 döndürülür. Bu de er de de i³keninin main fonksiyonundaki factor ( ekil 6.5) de i³kenine atanr Fonksiyonun fonksiyonun parametre olarak ald ya da fonksiyon gövdesinde tanmlanan de i³kenlere o yerel de i³kenleri ad verilir ve bunlarn tanm bölgesi tanmlandklar fonksiyonla
117 109 Fonksiyonlar main number 6468 factor 2 prime cand next_prime 2 3 cand count is_prime ekil 6.3: Parametre aktarm örne i - 2. adm. main number 6468 factor 2 prime cand!is_prime(cand) next_prime 2 3 cand count true is_prime 3 3 ekil 6.4: Parametre aktarm örne i - 3. adm. main number 6468 factor 2 prime cand next_prime 2 3 cand count is_prime 3 3 ekil 6.5: Parametre aktarm örne i - 4. adm.
118 Genel De i³kenler 110 snrlanr. Örnekteki bütün fonksiyonlarn iki³er (main: number ve factor, is_prime: cand ve count, next_prime: prime tanmlad de i³kenler de geçersiz ve cand) hale gelir. yerel Ba³ka de i³keni bir deyi³le, vardr. Fonksiyonun de i³kenlere tanm sona ermesiyle d³ndaeri³ilemez.yanisözgelimi bölgeleri main fonksiyonunumber vefactor kullanamaz. d³ndakalande i³kenleri D KKAT 6.4 Genel De i³kenler Baz i³kenlere durumlarda birden fazla fonksiyonun ayn de i³keni kullanabilmeleri istenir. Bu tip degenel Genel de i³kenler de i³ken bütün fonksiyonlarn ad verilir ve tanmlarndan tanm bölgeleri önce bütün tanmlanrlar. fonksiyonlar olarak belirlenir. Genel L KLER N de i³kenlere SONUCUNDA örnek vermek OLU ACAK için programda PROGRAM baz de i³iklikler Y B R PROGRAM yaplabilir. OLMAYACAK- BU DE K- TIR. CIYLAVER LM T R. BU ÖRNEK YALNIZCA next_primeve GENEL is_primefonksiyonlaraslnda DE KEN KULLANIMINI candde i³keniniparametre olarak aktarmak yerine ortak bir bellek gözünde payla³abilirler. Bu durumda is_prime AÇIKLAMAK AMAfonksiyonunun i³levi bu de i³kenin de erinin asal olup olmad n belirlemek, next_prime fonksiyonunun olarak dü³ünülebilir. i³leviyse Benzer bu de i³kenin ³ekilde, ana de erini fonksiyon kendisinden da çarpan büyük aday olan ilk asal sayy sayya parametre ilerletmek tarmyla almak yerine ayn genel de i³kende eri³erek ö renebilir. De i³iklikler sonucu olu³an ak- program Örnek 19'de verilmi³tir. Bir çal³mas fonksiyon boyunca bir genel yerel de i³ken de i³kenle genel ayn de i³keni isimde bir ezer. yerel Diyelim de i³ken tanmlarsa o fonksiyonun is_prime fonksiyonu int count, cand; ³eklinde bir de i³ken tanm yapm³ olsayd, genel olan cand yerel olan de i³keninin yannda bir de cand de i³keni olu³urdu ve is_prime fonksiyonunun içindeyken genel olan cand de i³kenine ula³lamazd. Genel ramn de i³kenler anla³lrl n parametre azalttklar aktarm ve fonksiyonlar yerine kullanlabilecek birbirlerine bir ba ml yöntem kldklar olmakla için birlikte gerekmedikçe progsiyonda kullanlmamalar de i³iklik yapld önerilir. zaman Soyutlamann bunu ça ran kazandrdklarndan fonksiyonlarn de i³iklikten birinin ileride etkilenmemesi bir fonk- oldu u likler di er söylenmi³ti; fonksiyonlar oysa fonksiyonlarn etkileyebilir. de i³ken payla³rlarsa bir fonksiyonda yaplan de i³ik- 6.5 Ba³vuru Aktarm De er kendisine aktarm giri³ parametresi yöntemiyle olarak parametre gönderilen aktarlmas iki tamsay baz de i³kenin i³lemlerde de erlerini yeterli olmaz. takas Sözgelimi, fonksiyonun Örnek 20'daki gibi yazld n dü³ünelim. eden bir Bu program çal³trld nda ekran çkts ³u ³ekilde olur:
119 111 Fonksiyonlar Örnek 19 Genel de i³ken kullanarak bir sayy asal çarpanlarna ayran program. #include <iostream> #include <stdlib.h> using namespace std; int cand = 2; void next_prime(void); int main(void) { int number; cout << "Sayy yaznz: "; cin >> number; while (number > 1) { while (number % cand == 0) { cout << cand << " "; number = number / cand; next_prime(); cout << endl; return EXIT_SUCCESS; bool is_prime(void) { int count; // 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; void next_prime(void) { cand = (cand == 2)? 3 : cand + 2; while (!is_prime()) cand += 2;
120 Ba³vuru Aktarm 112 Örnek 20 ki sayy takas eden fonksiyon ve kullanm (hatal). #include <iostream> #include <stdlib.h> using namespace std; void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; int main(void) { int m = 32, n = 154; cout << m << " " << n << endl; swap(m, n); cout << m << " " << n << endl; return EXIT_SUCCESS; // cin,cout,endl // EXIT_SUCCESS
121 113 Fonksiyonlar swap x 32 y tmp 154 xxx main m 32 n 154 (a) swap x 154 y tmp 32 xxx main m 32 n ekil 6.6: Takas fonksiyonunda parametre aktarm. Programn neden istendi i gibi çal³mad n inceleyelim: main fonksiyonundaki m de i³keninin de eriswap fonksiyonundakix de i³kenine, n de i³kenininde eride y kil 6.6a). de i³kenineaktarlr( e- swap x ve y yondaki de i³kenlerinin de erleri takas edilir ancak ça ran fonksi- m ve n eski de erlerini de i³kenleri koruyor olurlar bu takastan ( ekil 6.6b). etkilenmezler ve fonksiyon ça rsndan dönüldü ünde Bu tipinden sorunun tanmlamaktr çözümü için (bkz. yaplmas Bölüm gereken, 5.5). Böylelikle ça rlan fonksiyonda ça rlan fonksiyonun girdi parametrelerini girdi parametresi, ba³vuru ça ran yaplan de i³iklikler fonksiyonun ça ran gönderdi i fonksiyondaki parametreye de i³keni verilmi³ do rudan ikinci bir etkiler: isim haline Bu parametre gelir ve üstünde yöntemine aktarm ba³vuru aktarm termek üzere yaplmas gereken ad tek verilir. ³ey ça rlan Bir parametrenin fonksiyondaki ba³vuru girdi olarak parametre aktarld n de i³keninin gös- adnn ba³na & simgesi koymaktr. Yani örnekteki tek de i³iklik swap satrnn ³u ³ekle getirilmesi olacaktr: fonksiyonunun ba³lk void swap(int &x, int &y) Uygulama: Fonksiyonlar Örnek 21. Kombinasyon Hesab Bu örnekte C m n = m! n!(m n)! de erinin hesaplanmas istenmektedir. (b)
122 Ba³vuru Aktarm 114 Örnek 21 Kombinasyon hesab (yava³). #include <iostream.h> #include <stdlib.h> using namespace std; int combin(int a, int b); int fact(int x); int main(void) { int n, r; // cout,cin // EXIT_SUCCESS cout << "n ve r de erlerini yaznz: "; cin >> n >> r; cout << combin(n, r) << endl; return EXIT_SUCCESS; int combin(int a, int b) { int f1, f2, f3; f1 = fact(a); f2 = fact(b); f3 = fact(a - b); return f1 / (f2 * f3); int fact(int x) { int fx = 1; int i; for (i = 2; i <= x; i++) fx = fx * i; return fx;
123 115 Fonksiyonlar Örnek 22 Kombinasyon hesab (hzl). #include <iostream.h> #include <stdlib.h> using namespace std; int combin(int a, int b); int main(void) { int n, r; // cout,cin // EXIT_SUCCESS cout << "n ve r de?erlerini yaz?n?z: "; cin >> n >> r; cout << combin(n, r) << endl; return EXIT_SUCCESS; int combin(int a, int b) { int f1 = 1, f2, f3; int first = b, second = a - b; int i; if (b > a - b) { first = a - b; second = b; for (i = 2; i <= first; i++) f1 = f1 * i; f2 = f1; for (i = first + 1; i <= second; i++) f2 = f2 * i; f3 = f2; for (i = second + 1; i <= a; i++) f3 = f3 * i; return f1 / (f2 * f3);
124 Giri³ Parametreleri Üzerinden De er Döndürme 116 Örnek 23. En Büyük Ortak Bölen Bulma Bölüm bir program 1.4'de yazlmas anlatlan algoritmalar isteniyor. Bunun kullanarak için Örnek iki saynn 18'de en bir büyük sayy ortak asal çarpanlarna bölenini hesaplayan programn benzeri bir fonksiyon (factorize) olarak yazlacak ve bu fonksiyon kendisine ayran rametre olarak gönderilen saynn asal çarpanlarn bir dizide olu³turacaktr. Fonksiyon yine pa- ayn örnekte yazlm³ olan next_prime ve is_prime dan kullanacaktr. Asal çarpan dizilerinden en büyük ortak fonksiyonlarn bölenin asal hiçbir çarpanlarn de i³iklik bulmak olma- üzere gcd_factors en büyük ortak böleni fonksiyonu ana fonksiyon kullanlacak, kendisi bu hesaplayacaktr. fonksiyonun olu³turdu u çarpanlar dizisinden Örnek 23 ki saynn en büyük ortak bölenini bulan program (ana fonksiyon). 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, factors3, n3); for (i = 0; i < n3; i++) gcd = gcd * (long int) pow((double) factors3[i].base, (double) factors3[i].power); cout << "En büyük ortak bölen: " << gcd << endl; return EXIT_SUCCESS; 6.6 Giri³ Parametreleri Üzerinden De er Döndürme Asal çarpanlara ayrma i³ini yapan factorize larna ayrlacak say, çk³ parametresinin de çarpanlar fonksiyonunun dizisi olmas giri³ parametresinin gerekti i görülmü³tü. çarpan- Burada iki sorunla kar³la³lr: 1. C dilinde çk³ parametresi olarak geriye dizi döndürülemez. 2. Dizinin unu da elemanlarn döndürmek gerekir. döndürmek Oysa yeterli C fonksiyonlar de ildir, dizide ça ran kaç fonksiyona tane geçerli birden eleman fazla de er oldudöndüremez.
125 117 Fonksiyonlar Birden i³iklik fazla yapma de erin yöntemiyle döndürülmesi ana fonksiyona gerekti i aktarlabilir. durumlarda Buna bu de erler göre, giri³ parametrelerinde defactorize i³levi ³öyle açklanabilir: fonksiyonunun Birinci metresi giri³ olan parametresi dizide olu³turur olarak ve gönderilen bu dizinin saynn kaç eleman çarpanlarn oldu unu ikinci üçüncü giri³ para- parametresine yazar. Geriye bir de er döndürmez. giri³ Buna göre koddaki factorize(number1, factors1, n1); fonksiyon ça rsnn i³levi: number1 saysn asal çarpanlarna ayr, sonuçlar factors1 dizisinde olu³tur ve bu dizideki geçerli eleman saysn n1 de i³kenine yaz. 6.7 Dizilerin Fonksiyonlara Aktarlmas Bir adnn giri³ ardna parametresinin boyut belirtmeden dizi tipinden kö³eli oldu unun ayraçlar belirtilmesi konur. Dizi için de i³kenlerinin fonksiyon ba³l nda giri³ parametresi de i³ken olarak olmalardr. aktarmlarnda Yani dizi en elemanlar önemli özellik, de i³tirilmek aksi belirtilmedikçe isteniyorsa dizi dizi de i³keninin elemanlarnn ad de i³tirilebilir yazlr, ba³vuru aktarm kullanlmaz (de i³ken adnn ba³na oldu u gibi & elemanlarnn de er i³areti konmaz). 3 Aksine, dizi de i³tirmemesi resi tanm isteniyorsa önlem almak gerekir. Bu amaçla giri³ paramet- const sakl sözcü üyle ba³latlr. Örnekte sonuçlarn olu³tu u factors1 dizisi ve n1 i³kenleri oldu una dikkat edilmelidir. Fonksiyon ça rsndan de i³keninin önce ana bu de i³kenlerde fonksiyonun yerel herhangi deanlaml olmalar bir beklenmektedir. de er yer almazken Bu nedenle, ça rdan yukarda dönüldükten belirtilen sonra yazm anlaml kurallarna de erlerle göre, doldurulmu³ factorize fonksiyonunun ba³l ³öyle olmaldr: void factorize(int number, factor_t factors[], int &n) biçimindedir. Bu fonksiyonun tam çkts Örnek 24'de verilmi³tir. Ortak birasalçarpandizisiolu³turacaktr.dizilerinelemansaylardaparametreolarakgönderilmesi çarpanlar bulan fonksiyon ise iki tane asal çarpan dizisi alacak ve ortak çarpanlardan gerekti i göre için her çarpan dizisi, bir eleman dizisi ve bir eleman says ile gösterilecektir. Buna gcd_factors fonksiyonunun i³levi ³u ³ekilde yazlabilir: 3 Bunun nedeni Bölüm 7'de açklanacaktr.
126 Dizilerin Fonksiyonlara Aktarlmas 118 Örnek 24 ki saynn en büyük ortak bölenini bulan program (asal çarpanlara ayrma fonksiyonu). void factorize(int x, factor_t factors[], int &n) { int factor = 2; 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); Birinci eleman parametrede olan çarpan dizisiyle, verilen çarpanlar üçüncü parametrede içeren ve ikinci verilen parametrede çarpanlar verilen içeren ve sayda düncüparametredeverilensaydaelemanolançarpandizilerindenortakçarpanlar dör- bulur. dizinin Bu eleman dizinin saysn elemanlarn altnc parametreye be³inci parametrede yazar. Geriye verilen bir dizide de er olu³turur döndürmez. ve bu Bu aslnda fonksiyonda çkt parametresi ilk dört parametre olup kstlamalar gerçek anlamda nedeniyle giri³ giri³ parametresiyken parametresi olarak son gönderilen iki parametre erlerdir Yani ilk dört parametre de i³meyecek, son iki parametre de i³ecektir. Buna göre degcd_factors fonksiyonunun ba³l ³öyle olmaldr: void gcd_factors(const factor_t factors1[], int n1, const factor_t factors2[], int n2, factor_t factors[], int &n); Burada const sözcüklerinin kullanlmamas programn do ru çal³masna etki etmez, yalnzca programcnn aslnda de i³memesi gereken bir de eri yanl³lkla de i³tirmesine engel olmak için konmu³tur. Fonksiyonun tanm Örnek 25'de verilmi³tir. Uygulama: Dizilerin Fonksiyonlara Aktarlmas Bu uygulamada proler kullanm gösterilecektir (gprof).
127 119 Fonksiyonlar Örnek 25 ki saynn en büyük ortak bölenini bulan program (ortak çarpanlar bulma fonksiyonu). void gcd_factors(const factor_t factors1[], int n1, const factor_t factors2[], int n2, factor_t factors[], int &n) { int i1 = 0, i2 = 0; 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++;
128 Dizilerin Fonksiyonlara Aktarlmas 120 Örnek 26. Newton-Raphson Yöntemiyle Polinom Kökü Bulunmas Bir f(x) fonksiyonunun kökü, f(x) = 0 ko³ulunu sa layan x de eridir. Bu de ere x dersek f(x) fonksiyonunun x civarnda Taylor açlmnn ilk iki terimi ³öyle yazlabilir f(x) = f(x i ) + (x x i )f (x i ) Bu de er 0 olmas gerekti inden denklem f(x i ) + (x x i )f (x i ) = 0 ³ekline getirilebilir ve buradan da x = x i f(x i) f (x i ) yazlabilir. Bu formülde x yerine x temiyle hesaplanabilir. Yani her admda i+1 konursa, o admdaki fonksiyonun kökü ard³l yerine koyma yön- x de eri formüldeki x konarak bir sonraki admda kullanlacak i de erinin yerine x de eri hesaplanr. Bu yöntemin p(x) = a n x n + a n 1 x n a 1 x + a uyguland n varsayalm. O halde yineleme formülü 0 ³eklinde n. dereceden bir polinoma x i+1 = x i p(x i) p (x i ) olacaktr. Bir polinomun hesaplanmasnn içiçe çarpma ve toplama yöntemiyle nasl hzlandrlaca Örnek 15'de görülmü³tü. O örnekteki bde erleri bir dizide tutularak hesaplanrsa: b n = a n b n 1 = b n x i + a n 1 b 0 = b 1 x i + a 0 Bu durumda, p (x) polinomu ³u ³ekilde yazlabilir (Neden?): p (x) = b n x n 1 + b n 1 x n b 2 x + b 1 Bu da bir polinom oldu undan, hesabnda yine içiçe çarpmlar yöntemi kullanlabilir: c n = b n c n 1 = c n x i + b n 1 c 1 = c 2 x i + b 1 Bu yöntemi kullanarak katsaylarn kullancnn girdi i bir polinomun köklerini hesaplayan program Örnek 26'de verilmi³tir.
129 121 Fonksiyonlar Örnek 26 Polinom kökü hesaplayan fonksiyon. #include <iostream> #include <stdlib.h> #include <math.h> using namespace std; #define MAXDEGREE 50 // cin,cout,endl // EXIT_SUCCESS // fabs float newton_raphson(float x, const float a[], int n); int main(void) { float a[maxdegree]; int n, i; float xi, xj, error; cout << "Polinomun derecesi: "; cin >> n; for (i = n; i >= 0; i--) { cout << "a" << i << ": "; cin >> a[i]; cout << "Hata: "; cin >> error; cout << "x0: "; cin >> xi; while (true) { xj = newton_raphson(xi, a, n); if (fabs(xj - xi) < error) break; xi = xj; cout << "Kök: " << xj << endl; return EXIT_SUCCESS; float newton_raphson(float x, const float a[], int n) { float b[maxdegree], c[maxdegree]; float xn; int i; b[n] = a[n]; c[n] = b[n]; for (i = n - 1; i > 0; i--) { b[i] = b[i+1] * x + a[i]; c[i] = c[i+1] * x + b[i]; b[0] = b[1] * x + a[0]; xn = x - b[0] / c[1]; return xn;
130 E³ simli Fonksiyonlar 122 Bu program kullanarak p(x) = 13x 7 9x x 4 4x 3 + 3x + 5 polinomunun kökünü x 0 = 1 de erinden ba³layarak, hatadan daha küçük olacak ³ekilde bulun. 6.8 E³ simli Fonksiyonlar C++ ayn olmas dilinde bir giri³ sorun parametre yaratmaz. listeleri farkl oldu u sürece birden fazla fonksiyonun isimlerinin isimlerin ayn olmasna izin verilmese 4 Örne in, iki tamsayy iki giri³ parametresini takas edecek takas fonksiyona eden fonksiyonlarda kesirli sayy takas edecek fonksiyona swap_float, iki katar takas edecek fonksiyona swap_int, iki swap_str gibi da isimler vermek gerekir. Oysa giri³ parametreleri farkl tiplerden oldu u için üç fonksiyona swap ad verilebilir: void swap(int &x, int &y) { int tmp; tmp = x; x = y; y = tmp; void swap(float &x, float &y) { float tmp; tmp = x; x = y; y = tmp; void swap(char s1[], char s2[]) { char tmp[maxsize]; strcpy(tmp, s1); strcpy(s1, s2); strcpy(s2, tmp); 4 C dilinde ayn isimde birden fazla fonksiyon olamaz.
131 123 Fonksiyonlar 6.9 Varsaylan Parametreler Fonksiyonlar Varsaylan de er tanmlanrken giri³ parametresi istenirse listesinde baz giri³ ilgili parametrelerine de i³kenden sonra varsaylan atama de erler komutunda verilebilir. gibi yazlr. Bu durumda, ça ran fonksiyon o parametre için bir de er göndermezse varsaylan oldu u de er kullanlr. Örne in Normal durumda bir katar simge içinde katarn bir simgenin ba³ndan kaçnc ba³lanarak srada oldu unu aranr ve belirten simgeye bir ilk fonksiyon raslanlan yazalm. belirlenir. Sözgelimi Dennis Ritchie katarnda'e' simgesinin sranumaras 1'dir.Ancak konum de bir noktadan ileriye do ru arama yapmak istenebilir. Ayn örnek üzerinde ayn simge bazen numdan ba³lanarak aranrsa sonuç 13 olacaktr. Bu durumda, yazlacak fonksiyonun ba³l 4. ko- ³öyle olur: int find_char(char s[], char c, int start); Üçüncü parametrenin ço u zaman kullanlmayaca ndan programclar gerek duymadklar bir parametreyi göndermek zorunda brakmak yerine varsaylan de er kullanmak daha esnek bir çözümdür: int find_char(char s[], char c, int start = 0) { int index = -1, i; for (i = start; s[i]!= '\0'; i++) { if (s[i] == c) { index = i; break; return index; Örnekte start parametresine 0 varsaylan de eri verilir. Böylelikle bu de i³ken, fonksiyon ça rlrken belirtilmezse 0 de erini, belirtilirse verilen de eri alr. lk iki parametrenin ça rda belirtilmesi zorunludur; yani fonksiyon iki ya da üç parametreyle ça rlabilir: find_char(dennis Ritchie, 'e') // 1 find_char(dennis Ritchie, 'e', 4) // 13 Sorular 1. Kendisine parametre olarak gönderilen bir katarda, yine kendisine parametre olarak gönderilen bir simgenin ilk ve son pozisyonlar arasnda kaç simge oldu unu bularak sonucu döndüren bir fonksiyon yazn. Sözgelimi, giri³ katar
132 Varsaylan Parametreler 124 the world is not enough ve giri³ simgesi 'o' ise, fonksiyon 13 de erini döndürmelidir (rld is not en). 2. Bir geçirilmek katardaki isteniyor. bir simgenin Örne in yerine o simgenin katarnda bulundu u '-' simgesi her noktadayerine '/' ba³ka simgesi bir simge caksa 2002/04/10 katar elde edilecektir. kona- (a) Bu i³lemi gerçekle³tiren bir fonksiyon yazn. (b) fonksiyonu Verilen örnek kullanan tarih üzerinde bir ana bu fonksiyon i³lemi gerçekle³tirmek yazn. üzere(a) ³kknda yazd nz 3. kitamsaydizisindekiortakelemanlarnsaysbulunmakisteniyor.örne inbirincidizi 21 15). 10 Örnekten , de ikinci görülebilece i dizi 10 7 gibi, 1 13 dizilerin 15 8 ise ayn ortak sayda elemanlarn elemanlar says bulunmas 3'tür (10, zorunlu 13, de ildir. Bunun için: (a) yonun Bir saynn giri³ bir parametreleri dizide bulunup dizi, bulunmad n dizinin boyu ve snayan aranan bir say fonksiyon olmaldr. yazn. Geriye Fonksi- dizide varsa 1, yoksa 0 de eri döndürülmelidir. say (b) belirleyen Yukarda yazd nz bir fonksiyon fonksiyonu yazn. Fonksiyonun kullanarak, giri³ iki dizideki parametreleri ortak her elemanlarn iki dizinin saysn leri ve boylar olmaldr. Fonksiyon geriye ortak elemanlarn saysn döndürmelidir. kendi- (c) ald Yukarda iki dizinin yazd nz ortak fonksiyonlar eleman saysn kullanarak, bularak boyunu ekrana ve çkartan elemanlarn bir ana kullancdan (main) yazn. fonksiyon 4. Bir dizinin kipi, dizide en çok yinelenen elemandr. Sözgelimi dizisinin kipi 66'dr. Buna göre, bir snavdaki ö renci notlarnn kipi bulunmak isteniyor. (a) Bir dizinin en büyük elemannn dizideki srasn döndüren bir fonksiyon yazn. (b) siyon Yukarda yazn. yazd nz (Yol gösterme: fonksiyonu Elemanlar kullanarak ilgili bir notun dizinin kaç kere kipini geçti ini döndüren gösteren bir fonk- elemanl bir tamsay dizisi kullann. Örne in counts[55], kaç ö rencinin 55 ald n 101 göstersin.) (c) ncdan Yukarda alarak yazd nz notlarn fonksiyonlar kipini bulan kullanarak, ve ekrana ö renci çkartan saysn bir ana ve fonksiyon notlarn (main) kulla- yazn. 5. Polar sistemde düzlemde bir nokta kutuptan olan uzakl n belirten r yapt ve kutup eksenine θ de erleriyle belirtilir. Ayn noktann kartezyen sistemdeki koordinatlar x ve y ise x = r cosθ ve y = r sinθ e³itlikleri geçerlidir. (a) yazn. Noktann polar ve kartezyen koordinatlarn temsil etmek üzere birer kayt tanm
133 125 Fonksiyonlar (b) lar Yukardayazd nzkayttanmlarnkullanarak,parametreolarakbirnoktannpo- yazn. koordinatlarn alan ve geriye kartezyen koordinatlarn döndüren bir fonksiyon (c) bir Kayt fonksiyon yaplar yazn. kullanmadan polar koordinatlar kartezyen koordinatlara çevirecek (d) (b) ve (c) ³klarnda yazd nz fonksiyonlarn kullanmlarna birer örnek verin.
134 Varsaylan Parametreler 126
135 Bölüm 7 ³aretçiler uanakadaryaplanörneklerdeskalar,bile³keyadavektöreltiptenolsun,bütünde i³kenlerin bellekte lanrsa bu kaplayacaklar diziye bellekte alan 100 ba³tan adet tamsayy belliydi. Sözgelimi, tutacak kadar 100 yer elemanl ayrlaca bir tamsay derleme dizisi a³amasnda tanm- biliniyordu. Bu tip de i³kenlere statik de i³ken bellek alan program çal³maya ba³lad nda ayrlr ad ve verilir. programn Statik sonuna bir de i³kenin kadar braklmaz. saklanaca durumun baz sakncalar vardr: Bu Statik belli de ilse dizilerde gerekebilecek görüldü ü en gibi(bkz. büyük miktarda Bölüm 5), yer dizinin ayrlmak eleman zorunda says kalnr. derleme Örne in, a³amasnda i³ik snardaki ö rencilerin notlarn tutmak üzere bir tamsay dizisi tanmlanacak deolsun. (diyelim Bu 100) durumda dizi bu bir boyutta snftaki açlmaldr. maksimum Verilen ö renci says bu boyut konusunda hem programn bir varsaym bir yapp lamas olacak, hem de ö renci says bunun altnda kald zamanlarda gereksiz bellek snr- harcanmasna yol açacaktr. Programnzda t nz bilgisayarda kullanmak bulunmayabilir. istedi iniz Di er de i³kenlerin yandan, kaplayaca bu de i³kenlerin toplam hepsine bellek birden alan çal³- anda gereksinim duymuyor olabilirsiniz, yani bir de i³ken için ayrlan yerin programn ayn bütün kullanlmaya i³leyi³i ba³lyor boyunca ve tutulmas bir noktadan gerekli sonra olmayabilir. da kullanlmyor Sözgelimi olabilir. bir dizi Böyle belli bir bir durumda noktada diziye programn gerekli toplam oldu u bellek zaman gereksinimlerini yer ayrmak, i³i azaltr. bittikten sonra da ayrlan yeri geri vermek ³aretçiler, sa larlar. Böylelikle bellekte kaplanacak gerekti i zaman yerin derleme gerekti i srasnda kadar yer de il almak çal³ma ve gerek srasnda kalmad belirlenmesini da geri vermek olanakl hale gelir. Bir ³ekilde kullanlan de i³kenlere zaman dinamik verilir.dinamikde i³kenlerinzorlu u,bellekalanlarnnyönetimiprogramcyabrakld ndan ad programlarn en sk hata yaplan bölümleri olmalardr. ³aretçi, o bellek bir gözünün bellek adresini gözüne i³aret tutmasdr. eden Ba³ka bir de i³kendir. bir deyi³le, Bunun i³aretçi anlam, de i³keninin i³aretçi de eri, de i³keninin gözünün adresidir. Dolaysyla, bir i³aretçi için iki de erden söz edilebilir: bellek 127
136 128 kendi de eri: i³aret edilen bellek gözünün adresi i³aret etti i de er: i³aret edilen bellek gözünün içeri i ekil gösterilmi³tir. 7.1a'da i³aretçi Burada de i³keniyle i³aret edilen bellek gözü arasndaki ili³ki simgesel olarak p de i³keni, içinde 422 kil 7.1b, ayn durumun örnek adres de erleriyle yazan nasl bir sa land n bellek gözüne gösterir. i³aret etmektedir. e- 422 zl oldu u bellek gözünün adresinin de erinin ya oldu u varsaymyla, p de i³keninin 8000 ta³d görülür. Adres de erlerinin (bu örnekteki de erini 8000 lendirmez, bunlar i³letim sistemi belirler. Programc adres says) de erlerinin ne olduklar ne olaca programcy konusunda ilgi- bir varsaymda bulunamaz. p p (a) ekil 7.1: ³aretçi tipinden de i³kenler. ³aretçinin i³aret etti i bellek gözünün içeri inin okunmas için * örnekte i³leci kullanlr. ekildeki p deyiminin de eri 8000, *p i³aretçinin kendisiyle mi, yoksa i³aret deyiminin etti i alanla de eriyse m i³lem 422'dir. yapld na ³aretçilerle dikkat i³lem edilmelidir. yaparken, Örne in p++ komutu p neden olur. Oysa i³aretçisinin bir sonraki (diyelim 8001) bellek gözüne i³aret etmesine 422 de erinin bir artrlmas isteniyorsa (*p)++ komutu kullanlmaldr. ³aretçilerle ilgili i³lemlerde kullanlan di er bir i³leç de & i³lecidir. Adres i³leci bu i³leç, bir de i³kenin adresinin ö renilmesini sa lar. Örnekte ad verilen p oldu undan de i³keninin adresi &p deyiminin de eri 12000'dir. Örnekteki de erleri toparlarsak: &p: p: 8000 *p: 422 ³aretçi de i³kenleri için NULL retçinin geçerli bir bellek gözüne adnda i³aret özel etmiyor bir de er oldu udur. tanmlanr. Dolaysyla, Bu de erin de eri anlam, o i³a- NULL i³aretçi de i³keninin olan bir * ama çal³ma annda bellek i³leciyle hatasna içeri inin yol açacak okunmaya bir programlama çal³lmas derleyicinin hatasdr. farkedemeyece i Örnek 27. Dinamik Diziler Bubölümdekiprogram,Örnek13'deyazlanistatistikprogramnnaynsdr.Dolaysylaekran çkts ekil 5.1'de verilenle ayndr. Programn i³leyi³indeki tek fark, statik diziler yerine di- (b)
137 129 ³aretçiler score NULL ekil 7.2: ³aretçi tipinden de i³ken tanmlama. namik diziler kullanlmasdr. Böylece snftaki ö renci says kullancdan ö renildikten sonra, tam gerekti i kadar eleman tutacak bir dizi tanmlanabilmi³tir. 7.1 ³aretçi Tipinden De i³kenler ³aretçiler,de erleribireradres(birtürtamsay)olande i³kenlerdir,di erde i³kentiplerinden bir tanmland nda farklar yoktur. bellekte Dolaysyla, bir adres di er tutmaya de i³kenlerde yetecek oldu u kadar yer gibi, ayrlr. i³aretçi ³aretçinin tipinden kendi bir de i³ken her zaman bir adrestir ama i³aret etti i bellek gözünün nasl yorumlayaca nn belirtilmesi de eri gerekir. Bu nedenle, i³aretçi tanm ³u ³ekilde yazlr: veri_tipi * de i³ken_ad; Bu tanmn anlam, ad verilen de i³kenin bir i³aretçi oldu u ve gösterdi i bellek gözünde belirtilen tipten bir de er bulunaca dr. Buradaki * i³areti, i³aretçinin gösterdi i bellek gözünün içeri i anlamna gelen * i³leciyle kar³trlmamaldr. Örnekteki int *score = NULL; tanm, score de i³keninin tamsay barndran bir bellek gözüne i³aretçi oldu unu belirtir ( ekil 7.2). ³aretçilere ba³langç de eri olarak genellikle NULL atanr. 7.2 Bellek Yönetimi Programda görülmü³tü. kullanlacak Yani i³aretçinin her i³aret türlü bellek edece i bölgesinin bellek alannn kullanlaca da ayrlmas i³ için gerekir. ayrlmas Ayrlacak gerekti i alan tek bir eleman boyunda olabilece i gibi, birden fazla elemandan olu³an bir dizi olarak bu kullanlabilir. Dinamik dizi kullanrken i³aretçi tanmnda belirtilen veri tipi dizinin her bir da elemannn tipi olarak dü³ünülebilir. Yer ayrma i³lemini gerçekle³tiren new olu³an bir bellek alann ayrarak ba³langç i³leci istenen adresini büyüklükte, verir. Yer alma birbirini giri³imi izleyen ba³arszlkla gözlerden sonuçlanrsa, ³ekildedir: örne in bellekte yer kalmadysa, geriye NULL de erini döndürür. Yazm ³u new veri_tipi[eleman_says]
138 Bellek Yönetimi 130 Örnek 27 Örnek 13'in dinamik dizilerle gerçeklenmesi. #include <iostream> #include <stdlib.h> #include <math.h> using namespace std; // cin,cout,endl // EXIT_SUCCESS // fabs,sqrt int main(void) { int *score = NULL; int no_students = 0; float mean, variance, std_dev, abs_dev; float total = 0.0, sqr_total = 0.0, abs_total = 0.0; int i = 0; cout << "Kaç ö renci var? "; cin >> no_students; score = new int[no_students]; for (i = 0; i < no_students; i++) { cout << i + 1 << ". ö rencinin notu: "; cin >> score[i]; total = total + score[i]; mean = total / no_students; for (i = 0; i < no_students; i++) { sqr_total = sqr_total + (score[i] - mean) * (score[i] - mean); abs_total = abs_total + fabs(score[i] - mean); variance = sqr_total / (no_students - 1); std_dev = sqrt(variance); abs_dev = abs_total / no_students; cout << "Ortalama: " << mean << endl; cout << "Varyans: " << variance << endl; cout << "Standart sapma: " << std_dev << endl; cout << "Mutlak sapma: " << abs_dev << endl; delete score; return EXIT_SUCCESS;
139 131 ³aretçiler score no_students*sizeof(int) ekil 7.3: Yer ayrlmasndan sonraki durum. Örnekte ö renci notlarn tutacak dizi için score = new int[no_students]; komutuyla yer alnm³tr. Bu komut sonucunda bellekte no_students * sizeof(int) lk bir alan ayrlr ve bu alann ba³langç adresi kadar- score i³aretçisine atanr ( ekil 7.3). Tek ekil bir 7.1'de elemanlk çizilen durum bölge ayrlacaksa ³u komutlarla eleman yaratlabilir: saysnn belirtilmesine gerek yoktur. Örne in, int *p = NULL; p = new int; *p = 422; // 8000 oldu u varsaylyor Ayrlan yerin geri verilmesi delete bölgeyi geri verir; bölgenin bir ksmn i³leciyle geri vermek gerçeklenir. gibi bir Bu seçenek i³leç, bir yoktur. i³aretçi Bu için nedenle, alnan bütün yalnzca i³aretçinin adn vermek yeterlidir, geri verilecek eleman says yeniden belirtilmez. i³lece Yukarda vermesi benzer yazlan ³ekildedir: her iki (birden fazla eleman ya da bir eleman) yer ayrma i³leminin de geri delete score; delete p; ³aretçi tipinden de i³kenler için her zaman yer ayrlmas zorunlulu u yoktur. Zorunlu olan D KKAT nokta, örneklerde i³aretçilerin oldu u gibi her dinamik zaman olarak geçerli ayrlm³ bellek gözlerine olabilecekleri i³aret gibi, etmeleridir. ba³ka bir Bu i³aretçi bellek de i³keni gözleri tarafndan çizilen durum ayrlm³ ³u komutlarla ve hatta da statik yaratlabilirdi: olarak tanmlanm³ bile olabilirler. Örne in ekil 7.1'de int x = 422; int *p = &x; Bu durumda 422 de erini tutan bellek gözüne programn ba³nda statik olarak yer ayrlr; p i³aretçisi ise bu bellek gözünün adresini ta³r. Önemli olan x ile *p gözünde bulunduklarnn ve birinin de i³mesiyle öbürünün de de i³ece inin de i³kenlerinin gözönünde ayn bulundurulmasdr. Örnekte p de i³keni için yer ayrlmad ndan burann delete bellek de sözkonusu de ildir; böyle bir deneme hataya neden olacaktr. ile geri verilmesi
140 ³aretçi - Dizi li³kisi 132 Bellek yönetimi için new ve delete i³leçleri C++ dilinde getirilmi³ yeniliklerdir. C dilinde ayn i³lemleri yapmak için malloc ve free fonksiyonlarn kullanmak gerekir. Buna göre örnekteki programn ilgili satrlar ³u ³ekilde de i³tirilebilir score = (int *) malloc(no_students * sizeof(int));... free(score); malloc fonksiyonu new açklanabilir: i³leciyle ayn ³ekilde yer ayrr. Aralarndaki yazm farklar ³u ³ekilde 1. new i³lecinde eleman tipi ve says belirtilir, malloc boyunu sekizli cinsinden vermek gerekir. fonksiyonunda ise ayrlacak alann 2. malloc fonksiyonu geriye void * de i³kene atanrken uygun ³ekilde tipinden tip dönü³ümü bir de er yaplmas döndürür gerekir. (ham i³aretçi). Bu de er 3. malloc ve free gerekir. Ayn nedenle, birer fonksiyon kullanlabilmeleri olduklarndan için bir parametrelerinin ba³lk dosyasnn ayraçlar (stdlib.h) içinde yazlmas gerekir. alnmas 7.3 ³aretçi - Dizi li³kisi Statik diziler ile dinamik diziler arasndaki tek fark olu³turulmalarndadr, elemanlara eri³im her ikisinde de ayndr. Yani ³u iki tanm arasnda, bellekte olu³an durum açsndan 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 özelli e dayanr: 1. Statik bir dizinin ad, dizinin ilk elemanna bir i³aretçidir. 2. ³aretçinin ten o say de eri kadar ilerlenerek bir sayyla toplanrsa, gelinen bellek i³aretçinin gözünün gösterdi i adresi elde adresten edilir. i³aret Benzer edilen ³ekilde, tip- çkartma i³leminde bu miktar kadar geriye gidilir. Bu özellikler nedeniyle, i³aretçinin tipi ne olursa olsun, a³a daki deyimler e³de erlidir: p[0] *p p[1] *(p + 1) p[n] *(p + n)
141 133 ³aretçiler Katarlar rin neden da beklendi i birer dizi gibi olduklarndan çal³mayacaklarna katarlar arasndaki tekrar dönelim. atama ekil ve kar³la³trma 7.4'deki yapda gibi i³lemle- str1 ile str2 de i³kenleri kar³la³trlrsa (str1 == ( ). str2), kar³la³trma sonucu yanl³ de eri üretilir str1 str "Dennis Ritchie" "Dennis Ritchie" 9450 ekil 7.4: Katarlarn kar³la³trlmas. Benzer ³ekilde, ayn örnekte str1 = str2 atamas str1 i³aretçisinin str2 de eri almas sonucunu do urur ( ekil 7.5). Bu durum ayn katarn iki farkl i³aretçisiyle kopyasnn olu³masn sa lamad gibi str1 ayn de erinin bulundu u bölge) de katarnn yitirilmesine önceki yol i³aret açar. etti i bellek bölgesinin (Dennis Ritchie Örnek 28. Morse Kodlamas Kullancdan ald bir sözcü ü Morse abecesinde kodlayan bir program yazlmas isteniyor. Programn örnek bir çal³masnn ekran çkts ekil 7.6'da verilmi³tir. 7.4 ³aretçi Tipinden Parametreler Dizilerin fonksiyonlara parametre olarak aktarlmalarnda statik ya da dinamik gösterilimler arasnda bir fark yoktur. Sözgelimi, Örnek 24'de yazlan asal çarpanlarna ayrma fonksiyonunun bildirimi için ³u ikisi e³de erlidir: void factorize(int number, factor_t factors[], int &n); void factorize(int number, factor_t *factors, int &n); str1 str "Dennis Ritchie" "Ken Thompson" 9450 (b) ekil 7.5: Katarlarn atanmas.
142 ³aretçi Tipinden Parametreler 134 Örnek 28 Morse kodlamas yapan program. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> using namespace std; #define MAXLENGTH 80 char *encode(const char *s); int main(void) { char word[maxlength]; char *morse = NULL; // cin,cout,endl // EXIT_SUCCESS // gets // strcat cout << "Sözcü ü yaznz: "; cin >> word; morse = encode(word); cout << "Morse kar³l : " << morse << endl; delete morse; return EXIT_SUCCESS; char *encode(const char *s) { static char encoding[][5] = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "...", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.." ; char *morse = new char[maxlength]; int i; morse[0] = '\0'; for (i = 0; s[i]!= '\0'; i++) { strcat(morse, encoding[s[i] - 'a']); strcat(morse, " "); return morse;
143 135 ³aretçiler Sözcü ü yaznz: istanbul Morse kar³l : ekil 7.6: Örnek 28 ekran çkts. Fonksiyonun gövdesinde bir ba³lk de i³iklik satrnda yapmak bu gerekmez. iki gösterilimden herhangi biri kullanlabilir, fonksiyonun ³aretçiler,dizilerinçktparametresiolarakdöndürülememesikstlamasndaçözerler.Statik bir döndürülemez dizi bir bütün ancak halinde(bütün dizinin ba³na elemanlarnn bir i³aretçi döndürülebilir. kopyas olu³turularak) Örnekte çkt bu özellik parametresi kullanlarak olarak encode fonksiyonu char *encode(const char *s); ³eklindebildirilmi³tir.Bununanlam,bufonksiyonunde i³tirilmeyecekbirkatarald veüretti i katar geri döndürdü üdür. Fonksiyonun gövdesinde tanmlanan morse m³ sözcü ü tutar ve fonksiyon sonunda de i³keni, kodlan- return ile geri döndürülür. Burada önemli olan bir nokta, morse katar için yer ayrma i³ini encode verme i³iniyse fonksiyonunun, geri main fonksiyonunun yapmasdr. Geri verme i³lemi yine encode yaplamaz çünkü katarn i³i henüz sona ermemi³tir. Benzer ³ekilde fonksiyonunca morse de i³keni encode fonksiyonundastatikolarakda(char morse[maxlength] tanmland nda bu bir yerel de i³ken olaca ndan fonksiyonun ³eklinde)tanmlanamazçünküböyle rlm³ olan bellek geri verilir ve sonuç ana fonksiyona aktarlamaz. sona ermesiyle onun için ay- 7.5 Statik De i³kenler Örnekte encode fonksiyonunda tanmlanan encoding nidir, yani fonksiyonun her yaratl³nda bu dizi yeniden dizisi yaratlr, bu fonksiyonun elemanlarna bir de erler yerel de i³ke- ve fonksiyonun sona ermesiyle yok edilir. Bu i³lemin her defasnda tekrar tekrar yaplmas verilir istenmiyorsa, encoding de i³keni genel bir de i³ken olarak tanmlanabilir: char encoding[][5] = {... ; int main(void) {... char *encode(char *word) {...
144 Adres Aktarm 136 Genel de i³ken tanmlamak sözü edilen sakncay giderir ama encoding de i³keninin gereksiz yere main fonksiyonundan da eri³ilebilir hale gelmesine yol açar. Daha düzgün bir çözüm, encoding de i³kenini encode fonksiyonunun içinde statik olarak tanmlanamaktr: static char encoding[][5] = {... ; Böyle yapld nda encoding dizisi genel bir de i³ken gibi sürekli ya³ar ama encode fonksiyonu d³nda kullanlamaz. 7.6 Adres Aktarm Ba³vuru rm yöntemi aktarm kullanlr, yöntemi yani C++ ça rlan dilinde fonksiyona gelmi³ oldu undan de i³kenin C adresi dilinde yollanr. bunun Ça rlan yerine adres fonksiyon akta- bu Böylece adresi de i³iklik i³aretçi tipinden ça ran bir fonksiyondaki de i³kene alr de i³keni ve bu i³aretçinin do rudan gösterdi i etkiler. Buna yerde göre, de i³ikli i Örnek yapar. anlatlan ve düzeltilen 20'da swap fonksiyonu yöntemi Örnek 29'de oldu u gibi de gerçeklenebilirdi: Örnek 29 ki sayy adres aktarmyla takas eden fonksiyon ve kullanm. #include <iostream> #include <stdlib.h> using namespace std; void swap(int *x, int *y) { int tmp; tmp = *x; *x = *y; *y = tmp; int main(void) { int m = 32, n = 154; cout << m << " " << n << endl; swap(&m, &n); cout << m << " " << n << endl; return EXIT_SUCCESS; // cin,cout,endl // EXIT_SUCCESS Bu örnekte x de i³keni tamsayya i³aretçi (yani adres) tipinden bir de i³ken olurdu ve de eri m de i³keninin adresi olurdu. Yani x i³aretçisinin gösterdi i yere yazlan de er m de i³kenine yazlm³ olurdu ( ekil 7.7).
145 137 ³aretçiler swap x 2000 y tmp 2004 xxx main m 32 n (a) swap x 2000 y tmp 2004 xxx main m 154 n (b) ekil 7.7: Takas fonksiyonunda parametre aktarm. Günümüzde giri³ parametrelerinde neredeyse de i³iklik bütün C yapmak geli³tirme istendi inde ortamlarnda adres C++ aktarm yetenekleri yöntemini bulundu undan, artk bir gere i yoktur. Adres aktarm programc hatalarna daha elveri³li oldu undan kullanmann derleyiciniz C++ desteklemiyorsa ya da probleminiz açsndan daha uygunsa kullanmanz ancak önerilir. Uygulama: ³aretçiler Örnek 30. Seçerek Sralama Kullancdan ortade erini bulan ald bir say program kadar ö rencisi yazlmas olan isteniyor. bir snfta Bir dizinin kullancnn ortade eri, girdi i dizi ö renci sraland nda notlarnn dizinin eleman ortasnda olmad ndan yer ortadaki alan de erdir. iki elemann Çift sayda aritmetik eleman ortalamas olan dizilerde ortade er dizinin kabul ortasnda edilir. bir Dizinin rek sralama ortade erini yöntemi, bulmak en basit için sralama öncelikle algoritmalarndan diziyi sralamak gerekir. biridir. Örnekte Bu yöntemde, kullanlan küçükten seçe- büyü e yük eleman do ru bulunur sralama ve yaplaca sondaki elemanla varsaymyla, yeri kar³lkl bu algoritmann de i³tirilir. her Böylece admnda en büyük dizinin eleman en bü- en sona alnr ve dizinin boyu bir azaltlarak i³leme devam edilir. n geçen i³lem elemanl bir dizide sözü n 1 çal³mas ekil 7.8'de kere verilmi³tir. yinelenecektir. Örnek bir dizi üzerinde seçerek sralama algoritmasnn Sralama i³lemini kabarck sralama algoritmas kullanacak ³ekilde düzenleyin.
146 Adres Aktarm 138 Örnek 30 Ö renci notlarnn ortade erini bulan program. #include <iostream> #include <stdlib.h> using namespace std; void selsort(int *numbers, int count); int main(void) { int *score = NULL; float median; int no_students, i; cout << "Ö renci says: "; cin >> no_students; score = new int[no_students]; // cin,cout,endl // EXIT_SUCCESS for (i = 0; i < no_students; i++) { cout << i + 1 << ". ö rencinin notu: "; cin >> score[i]; selsort(score, no_students); median = (no_students % 2 == 1)? score[no_students/2] : (score[no_students/2] + score[no_students/2-1]) / 2.0; cout << "Orta de er: " << median << endl; delete score; return EXIT_SUCCESS; void selsort(int *numbers, int count) { int round, max, i; int tmp; for (round = 0; round < count - 1; round++) { max = 0; for (i = 1; i < count - round; i++) { if (numbers[max] < numbers[i]) max = i; tmp = numbers[max]; numbers[max] = numbers[count round]; numbers[count round] = tmp;
147 139 ³aretçiler ekil 7.8: Seçerek sralama örne i.
148 Adres Aktarm 140 Sorular 1. Sezar³ifrelemesiyönteminde³ifreleneceksözcüktekiherharnyerine( ngilizce)abecede kendisinden Z, X yerine 3 A, sonra Y yerine gelen B, harf Z konur yerine (A C). yerine Buna D, göre B yerine HUNGRY E,..., V sözcü ünün yerine Y, W kar³l yerine KXQJUB olur. (a) olu³an Bildirimi yeni a³a da katar verildi i döndüren ³ekliyle bir fonksiyon bir sözcük yazn: alan ve bunun ³ifrelenmesi sonucu char *caesar(const char s[]); (b) ekrana Kullancdanald birsözcü üyukardakifonksiyonyardmyla³ifreleyenvesonucu yazan bir ana fonksiyon yazn. (c) genelle³tirin (a) ³kknda yazd nz ve (b) ³kknda fonksiyonu yazd nz öteleme fonksiyonu miktar da da uygun bir parametre biçimde olacak düzenleyin. ³ekilde 2. ngilizce'de'q'harndensonraço uzaman'u'hargelir.bunagörekendisineparametre olarak siyon yazn. gönderilen Sözgelimi, katarda'q' fonksiyona harnden you sonra'u' must be har quick geliyorsa'u' katar parametre harni silen olarak bir gelirse fonk- bu geriye fonksiyon bir de er katar döndürmüyor). you must be Bu qick fonksiyonu diye de i³tirmelidir denemek üzere (yeni bir ana bir fonksiyon katar üretmiyor, yazn.
149 Bölüm 8 Giri³-Çk³ Bu bölümde öncelikle giri³-çk³ kitapl ndaki fonksiyonlar kullanarak giri³-çk³ i³lemlerinin nasl yapld gösterilecektir. Daha sonra dosyalar üzerinde okuma-yazma i³lemlerinin nasl yapld anlatlacaktr. 8.1 Çk³ C dilinde cout birimi yoktur. Bunun yerine printf fonksiyonu kullanlr. Bu fonksiyonun yaps ³u ³ekildedir: printf(biçim katar, deyim1, deyim2, deyim3,...); Biçim katarnn temel i³levi yazdrlmas istenen iletileri belirtmektir. Sözgelimi: cout << Merhaba dünya! << endl; komutunun C'deki kar³l ³öyledir: printf(merhaba dünya!\n); Bu görüntülenmektedir.katarnsonundaki örnekte ekrana herhangi bir de i³ken ya da deyim de eri yazdrlmamakta, yalnzca bir ileti '\n' sa lar (C++'daki simgesikatarsonaerdi indealtsatrageçilmesini endl kar³l ). Bir tilmelidir. deyim Her de erinin veri tipinin ekranda kendine gösterilmesi özgü bir isteniyorsa belirteci vardr. bu de erin (bkz. tipi Tablo de biçim 8.1). katarnda belir- Buna göre Örnek 1'de geçen cout << Alan: << area << endl; komutunun kar³l ³u ³ekilde olur: 141
150 Çk³ 142 printf(alan: %f\n, area); Veri Tipi Belirteç Onlu düzende tamsay %d Onlu düzende uzun tamsay %ld Onaltl düzende tamsay %x Noktal gösterilimde kesirli say %f Bilimsel gösterilimde kesirli say %e Simge %c Katar %s Tablo 8.1: Biçim belirteçleri. Çktnn gibi çk³a nasl aktarlr; olu³turulaca n bir belirteç biçim ile kar³la³ld nda katar belirler. Belirteçler deyim listesinde d³nda sradaki kalan bölümler deyim hesaplanarak oldu u listesindeki elde edilen deyimlerin de er say çk³a ve aktarlr. tiplerinin Dolaysyla, birbirini tutmas biçim katarnda gerekir. geçen belirteçler ile deyim Örnek. radius de i³keninin kesirli say tipinden oldu u ve kullancnn giri³ srasnda 2.4 de erini yazd varsaymyla printf(yarçap %f olan dairenin alan: %f\n, radius, 3.14 * radius * radius); fonksiyonunun i³leyi³i ³u ³ekilde olur: Biçim katarnda ilk % önceki bo³luk dahil): i³aretine kadar görülen her simge ekrana çkartlr(belirteçten Yarçap Biçim (önce ve katarndan sonraki bo³luklar sonraki ilk hariç): deyimin de eri kesirli say biçiminde ekrana çkartlr 2.4 Bir sonraki belirtece kadar görülen her simge ekrana çkartlr: olan dairenin alan: Biçim tlr: katarndan sonraki ikinci deyimin de eri kesirli say biçiminde ekrana çkar \n simgesi nedeniyle sonraki satra geçilir. Yüzde rilmesiistendi indeözelbiryazmgerekir.yüzdei³aretiniçkarmakiçin'%%',tersbölüi³aretini ve ters bölü i³aretleri biçim katarnda özel anlam ta³dklarndan bunlarn çk³a gönde- çkarmak içinse '\\' simgeleri kullanlmaldr. Biçim Örne in katar say de i³ken de erlerinin de erlerinin belli bir çk³a uzunlukta gönderilmesinde olmas sa lanabilir. ayrntl denetim %5d ³eklinde olana da belirtilen sa lar. bir iki bo³luk tamsay ve de eri say v.b. be³ ³eklinde haneliyse de erlendirilerek bo³luksuz, dört çk³a haneliyse gönderilir. bir bo³luk Bu yöntem ve say, düzgün üç haneliyse altalta gelmi³ çktlar olu³turmak için yararldr. Kesirli saylarda da noktadan önce ve ³ekilde sonra
151 143 Giri³-Çk³ kaç hane bulundu u belirtilebilir. Sözgelimi %20.12f belirteci saynn toplam 20 hane(nokta dahil) yer tutaca n ve bunun 12 hanesinin noktadan sonra olaca n gösterir. DÜZELT: daha fazla ayrnt 8.2 Giri³ Çk³ biriminde oldu u gibi, C dilinde giri³ için kullanlabilecek cin yerine birimi de yoktur. Bunun scanf fonksiyonu kullanlr. Bu fonksiyonun yaps ³u ³ekildedir: scanf(biçim katar, &de i³ken1, &de i³ken2, &de i³ken3,...); Biçim katar, printf ne olaca n belirler. Kullanlan fonksiyonundakine veri tipi benzer belirteçleri bir i³lev de ayndr. görür ve okunacak de erlerin tipinin Giri³ yaplrken kullancnn yazd de erin alnaca de i³ken scanf fonksiyonunda de er de i³tirece inden fonksiyona bu de i³kenin adresi gönderilir (bkz. Bölüm 7.6). Bu nedenle, scanf fonksiyonuna gönderilen de i³kenlerin adlarnn ba³na adres i³leci olan & Örne in simgesi konur. cin >> radius; komutunun C dilindeki kar³l ³u ³ekildedir: scanf(%d, &radius); Katar tipinden olan de i³kenlerde katarlar bir dizi olduklarndan ve adlar zaten dizinin ilk elemanna bir i³aretçi oldu undan & simgesi kullanlmaz. Sözgelimi, kullancnn yazd sözcü ü katar tipinden bir word de i³kenine almak için a³a daki komut kullanlr: scanf(%s, word); Örnek 31. statistik Hesaplar Bu myla örnekte, gerçeklenecektir. Örnek 13'de Ö renci yaplan notlar ö renci bir notlar dosyadan üzerindeki okunacak, istatistik i³lem sonuçlar hesaplar da dosyalar yine bir yardyaya yazlacaktr. Notlarn hangi dosyadan okunaca ve sonuçlarn hangi dosyaya yazlaca dos- program kullancya çal³trlrken hiçbir ³ey sormayacak, komut satrndan üretti i belirtilecek, hiçbir sonucu böylelikle da ekranda program göstermeyecektir. çal³mas srasnda programn yazl oldu u dosya Bu stat3.cpp dosyann ad ve derleme ile ba lama sonucu olu³an çal³trlabilir stat3 olursa program stat3 notlar.txt sonuclar.txt dosyay, gibi bir ikinci komutla isim(örnekte ça rlmaldr. sonuclar.txt) Burada ilk sonuçlarn belirtilen yazlaca isim (örnekte dosyay notlar.txt) gösterir ve okunacak birinin eksik olmas durumunda program nasl çal³trlmas gerekti ine ili³kin bir kullanm herhangi iletisi görüntüler.
152 Giri³ 144 Örnek 31 yapan program Dosyalar (okuma ile giri³/çk³ bölümü). i³lemleri yaparak ö renci notlar üzerinde istatistik hesaplar #include <iostream> #include <stdio.h> #include <stdlib.h> #include <math.h> using namespace std; #define MAXSTUDENTS 100 // cin,cout,cerr,endl // fopen,fclose,fprintf,fscanf,feof // exit,exit_success,exit_failure // fabs,sqrt int main(int argc, char *argv[]) { int score[maxstudents]; int no_students = 0; float mean, variance, std_dev, abs_dev; float total = 0.0, sqr_total = 0.0, abs_total = 0.0; int i = 0; FILE *infile, *outfile; if (argc!= 3) { cout << "Kullanm: " << argv[0] << " giri³_dosyas çk³_dosyas" << endl; return EXIT_FAILURE; infile = fopen(argv[1], "r"); if (infile == NULL) { cerr << "Giri³ dosyas açlamad." << endl; exit(exit_failure); no_students = 0; while (true) { fscanf(infile, "%d", &score[no_students]); if (feof(infile)) break; total = total + score[no_students]; no_students++; fclose(infile);... return EXIT_SUCCESS;
153 145 Giri³-Çk³ Örnek 32 yapan program Dosyalar (yazma ile giri³/çk³ bölümü). i³lemleri yaparak ö renci notlar üzerinde istatistik hesaplar #include <iostream> #include <stdio.h> #include <stdlib.h> #include <math.h> using namespace std; #define MAXSTUDENTS 100 // cin,cout,cerr,endl // fopen,fclose,fprintf,fscanf,feof // exit,exit_success,exit_failure // fabs,sqrt int main(int argc, char *argv[]) { int score[maxstudents]; int no_students = 0; float mean, variance, std_dev, abs_dev; float total = 0.0, sqr_total = 0.0, abs_total = 0.0; int i = 0; FILE *infile, *outfile;... mean = total / no_students; for (i = 0; i < no_students; i++) { sqr_total = sqr_total + (score[i] - mean) * (score[i] - mean); abs_total = abs_total + fabs(score[i] - mean); variance = sqr_total / (no_students - 1); std_dev = sqrt(variance); abs_dev = abs_total / no_students; outfile = fopen(argv[2], "w"); if (outfile == NULL) { cerr << "Çk³ dosyas açlamad." << endl; exit(exit_failure); fprintf(outfile, "Ö renci says: %d\n", no_students); fprintf(outfile, "Ortalama: %f\n", mean); fprintf(outfile, "Varyans: %f\n", variance); fprintf(outfile, "Standart sapma: %f\n", std_dev); fprintf(outfile, "Mutlak sapma: %f\n", abs_dev); fclose(outfile); return EXIT_SUCCESS;
154 Ana Fonksiyona Parametre Aktarma Ana Fonksiyona Parametre Aktarma Anafonksiyondadi erfonksiyonlargibibirfonksiyonolmaklabirliktegiri³veçk³parametrelerinik³ parametresi aktarm döndürmesi, bakmndan farkllk o fonksiyonun gösterir. ça rlabilmesi Bir fonksiyonun anlamna giri³ parametreleri gelir. Oysa ana almas fonksiyon ve ç- çal³mann ça ran i³letim ba³lad sistemidir, fonksiyon yani ana oldu undan fonksiyonun di er ça rlmas fonksiyonlarca programn ça rlmaz. i³letim Ana sistemince fonksiyonu rütülmeye ba³lanmasna kar³ dü³er. Bu durumda ana fonksiyon giri³ parametrelerini i³letim yü- sisteminden alr, çk³ parametresini de i³letim sistemine döndürür. Ana mü³tü. fonksiyonun Bu parametre çk³ programn parametresinin çal³mas nasl belirtildi i sonucu olu³an ³u ana durumun kadarki i³letim bütün sistemine örneklerde bildirilmesi anlamn ta³r ve ba³ar durumunda görül- return EXIT_SUCCESS; ba³arszlk durumunda return EXIT_FAILURE; komutlaryla belirtilir. Ana relerdir. fonksiyonun Giri³ parametrelerinin giri³ parametreleriyse okunabilmesi kullancnn için ana program fonksiyonun çal³trrken giri³ parametresi belirtti i paramet- listesi int argc, char *argv[] ³eklinde verilir. Burada argc parametre saysn, argv metre dizisinin her bir eleman, ba³lktan da görülebilece i ise gibi, parametre bir katardr. dizisini gösterir. Para- Programn ad da parametreler arasnda sayld ndan parametre says en az 1 olabilir. Yani argc de i³keni program yalnzca stat3 rlrsa 3 de erini alr. Parametre de erleri komutuyla de ça rlrsa 1, yukarda verilen ³ekilde ça - argv örnek üzerinden gidersek: dizisinin elemanlarn olu³tururlar. Yine argv[0] stat3 argv[1] notlar.txt argv[2] = sonuclar.txt Örnekteki if (argc!= 3) komutu mu³tur. programn Parametre do ru saysnn sayda hatal parametreyle oldu u durumda çal³trlp programn çal³trlmad n ekrana bir snamak kullanm için iletisi kon- basp sonlanmasn sa lar. Bütün de erlerin giri³ say parametrelerinin olarak kullanlabilmesi birer katar için oldu una uygun dikkat kitaplk edilmelidir. fonksiyonlaryla Komut satrndan (tamsaylar verilen atoi, kesirli saylar için atof) sayya çevrilmeleri gerekir. için
155 147 Giri³-Çk³ 8.4 Dosyalar Dosyalar tanmlanmaldr.cdilindebude i³kendosyai³aretçisi üzerinde i³lem yapmak için öncelikle dosyay programda olarakadlandrlrve temsil edecek bir de i³ken FILE * tanmlanr. Örnekte biri giri³ dosyasn (infile) di eri de çk³ dosyasn (outfile) tipinden etmek üzere iki dosya i³aretçisi tanmlanm³tr. Dosya i³aretçisi sradaki okuma ya da yazma temsil i³leminin geri do ru dosya hareket üzerinde eder. hangi noktada yaplaca n belirler ve yaplan her i³lemle ileri ya da Dosya Açma - Kapama Bir dosya üzerinde i³lem yapmadan önce ilk yaplmas gereken dosyann açlmasdr. Açma i³lemi bildirimi a³a da verilmi³ olan fopen fonksiyonu yardmyla yaplr: FILE *fopen(const char *path, const char *mode); Fonksiyon ba³l nda görülen path lirtilmesinisa lar. kinciparametreolan parametresi, modeisedosyaüzerindenei³lemyaplmasistendi ini açlacak dosyann sistemdeki tam adnn be- belirtmeye yarar. Bu parametre için verilebilecek örnek de erler ³öyledir: r: dosya yalnzca okunacak (dosya varsa sfrlanmaz, yoksa yaratlmaz) w: dosyaya yalnzca yazlacak (dosya varsa sfrlanr, yoksa yaratlr) r+: maz) dosyada hem okuma hem yazma yaplacak(dosya varsa sfrlanmaz, yoksa yaratl- w+: dosyada hem okuma hem yazma yaplacak (dosya sfrlanr, yoksa yaratlr) a: dosyann sonuna ekleme yaplacak (dosya varsa sfrlanmaz, yoksa yaratlr) Fonksiyon döndürür, dosya ba³l ndan üzerinde da görülebilece i sonraki i³lemlerde gibi bu bu i³aretçi fonksiyon kullanlacaktr. geriye açt dosya için bir i³aretçi Ekleme konumlandrr; kipinde yani açma ilk d³ndaki okuma ya kiplerde da yazma dosya dosyann açma i³lemi ba³ndan dosya yaplr. i³aretçisini dosyann ba³na Dosya a³a da üzerindeki verilmi³ olan i³lemler bittikten sonra da dosyann kapatlmas gerekir. Bu amaçla bildirimi fclose fonksiyonu kullanlr: int fclose(file *stream); Bu fonksiyon parametre olarak verilen dosya i³aretçisinin gösterdi i dosyay kapatr. Ba³arl olursa 0, ba³arsz olursa EOF de erini döndürür.
156 Standart Giri³ / Çk³ Birimleri Dosyada Okuma-Yazma Her lelikle okuma pe³pe³e ya okuma da yazma i³lemleri i³lemi dosyann i³aretçiyi srayla okunulan okunmasn ya da yazlan sa lar miktar (yazma kadar için de ilerletir; benzer böykilde). Okuma-yazma i³lemleri için ³e- fscanf ve fprintf yonlarn kullanmlar fonksiyonlar kullanlabilir. Bu fonksi- scanf ve printf bir dosya i³aretçisi parametresi almalardr. fonksiyonlar ile ayndr; tek farklar ek olarak en ba³a Dosyadan okunmas amacyla ba³ka birimlerde okuma yapmak da istenebilir. Örne in bir satrn bütün halinde gets fonksiyonuna benzer fgets bildirimi ³u ³ekildedir: fonksiyonu kullanlabilir. Bu fonksiyonun char *fgets(char *s, int size, FILE *stream); Bu fonksiyon stream parametresi ile belirtilen dosyadan en fazla size - 1 duklarn simge okur ve oku- s fazla okumaz. parametresi Ba³arsz ile olursa belirtilen NULL, katara ba³arl yazar. olursa Satr sonu ya da dosya sonuna raslarsa daha s de erini döndürür. Güvenlik açsndan gets fonksiyonu yerine bu fonksiyonun kullanlmas önerilir. Dosyadan tek bir simge okumak için fgetc ³u ³ekildedir: fonksiyonu kullanlabilir. Bu fonksiyonun bildirimi int fgetc(file *stream); Bu fonksiyon stream parametresi ile belirlenen dosyadan okudu u olarak geri döndürür. sradaki simgeyi bir tamsay Dosya sonuna gelinip gelinmedi ini ö renmek amacyla feof fonksiyon kendisine parametre olarak gönderilen dosya i³aretçisinin fonksiyonundan ilgili dosyann yararlanlr. sonu olup Bu olmad n snar ve sona gelindiyse do ru de erini döndürür. 8.5 Standart Giri³ / Çk³ Birimleri Standart giri³, çk³ ve hata birimleri de birer dosya gibi davranrlar. Standart giri³ birimi stdin için stdout, adnda standart önceden hata tanmlanm³ için de özel bir de i³kende tutulur. Benzer ³ekilde standart çk³ stderr olursak de i³kenleri tanmlanm³tr. Basit bir örnek verecek printf(biçim katar, deyimler); komutu fprintf(stdout, biçim katar, deyimler); komutuyla ayn anlama gelir. Benzer ³ekilde a³a daki ikisi de giri³ i³lemleri için e³de erlidir: scanf(biçim katar, de i³kenler); fscanf(stdin, biçim katar, de i³kenler);
157 149 Giri³-Çk³ 8.6 Hata letileri Hata lüm 1.5'de iletilerinin söylenmi³ti. standart Bir çk³ C++ iletilerinden programnda ayrlmasnn bu i³lem iletinin yararl bir al³kanlk oldu u Bö- cout de il, cerr yönlendirilmesiyle sa lanabilir. Örnekte dosyalarn açlamamas durumunda görüntülenen birimine tilerde bu i³lem görülebilir: ile- cerr << Giri³ dosyas açlamad. << endl; C dilinde ise cerr birimi olmad ndan ayn i³lem a³a daki komutla gerçekle³tirilmelidir: fprintf(stderr,.giri³ dosyas açlamad.\n); Hata hata olu³tuysa olu³tu unda programlar programn ne yapaca durumdan duruma de i³ebilir. Düzeltilemeyecek bir exit fonksiyonuyla sonlandrlrlar. Bu fonksiyona EXIT_FAILURE de eri gönderilirse programn ba³arsz sonland i³letim sistemine bildirilmi³ olur. Bu i³lemin return masdr; ile return dönmeden ise yalnzca fark hangi ça ran fonksiyondan fonksiyona dönü³ü ça rlrsa sa lar. ça rlsn programn derhal sonlan- Hata iletilerini standartla³trmak amacyla perror sonolu³anhatayagöreuygunbirmesajstandarthatabiriminegönderir.kullanmndagelenek fonksiyonu tanmlanm³tr. Bu fonksiyon olarak hatann hangi fonksiyonda ortaya çkt belirtilir. Örnekte giri³ dosyas açlamad nda cerr birimine yönlendirme yerine perror(main: giri³ dosyas açlamad); komutu bulunamasayd kullanlsayd çal³ma ve annda programn ³öyle bir çal³trlmas ileti görünürdü: srasnda belirtilen giri³ dosyas sistemde main: giri³ dosyas açlamad: No such file or directory 8.7 Katarlar ile Giri³-Çk³ Standart giri³-çk³ kitapl ndaki sprintf ve sscanf ile yaplmasn sa lar. Bu fonksiyonlarn fonksiyonlar ayn i³lemlerin katarlar printf ve scanf rametrelerinin okuma ya da yazma yaplacak katarlar belirtmeleridir. fonksiyonlarndan Örne in farklar, dosyadan ilk pa- satr bütün olarak okuyup, üzerinde belki baz denetlemeler yaptktan sonra de erlerin debir i³kenlere aktarlmas isteniyorsa fscanf teknik kullanlabilir: ile do rudan de i³kenlere aktarmak yerine a³a daki // fp dosyasndan bir satr line katarna oku // ilk de eri x tamsay de i³kenine, // ikinci de eri y kesirli de i³kenine aktar fgets(line, fp);... sscanf(line, %d %f, &x, &y);
158 kili Dosyalar 150 sprintf fonksiyonu da çktnn ekrana baslmadan bir katarda olu³turulmas i³leminde yararl olur. Sözgelimi, x saysn strx katarna çevirmek için a³a daki basit komut kullanlabilir: sprintf(strx, %d, x); 8.8 kili Dosyalar 'b' bayra fread, fwrite, fseek Uygulama: Dosyalar Örnek 33. Graarn Enlemesine Taranmas DÜZELT: YAZILACAK graf tip tanm: struct graph_s { int nodes; int adjacency[maxnodes][maxnodes]; ; typedef struct graph_s graph_t; okuma fonksiyonu bildirimi: void read_matrix(file *fp, graph_t &g); Sorular 1. Biti³iklik matrisini komut satrnda belirtilen bir dosyadan okudu u grafn ba lant matrisini Warshall algoritmas yardmyla hesaplayan bir program yazn.
159 151 Giri³-Çk³ Örnek 33 Bir graf enlemesine tarayan program (ana fonksiyon). int main(int argc, char *argv[]) { FILE *fp; graph_t graph; int vertices[maxnodes]; bool visited[maxnodes]; int start_vertex, next_vertex; int count, index, i; if (argc!= 3) { cerr << "Kullanm: " << argv[0] << " matris_dosyas ba³langç_dü ümü" << endl; return EXIT_FAILURE; fp = fopen(argv[1], "r"); if (fp == NULL) { cerr << "Matris dosyas açlamad." << 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;
160 kili Dosyalar 152 Örnek 34 Bir graf enlemesine tarayan program (matris okuma fonksiyonu). void read_matrix(file *fp, graph_t &g) { int c; int i = 0, j = 0; fscanf(fp, "%d\n", &g.nodes); while (true) { c = fgetc(fp); if (c == EOF) break; if (c == '\n') { i++; j = 0; continue; g.adjacency[i][j] = c - '0'; j++;
161 Bölüm 9 Öni³lemci Bir ve ba lama C kaynak olarak dosyasndan belirtilmi³ti. çal³trlabilir Aslnda kaynak dosya olu³turulmas dosyas, derleyiciye için geçilen verilmeden a³amalar önce derleme öni³lemciden geçirilir. Öni³lemcinin yaptklar ³öyle özetlenebilir: bir de Açklamalar ayklar: /* ile */ arasnda kalan ya da // olan bölümleri koddan siler; yani bu bölümler derleyiciye i³aretinden hiç gitmez. satr sonuna kadar Öni³lemci komutlarn i³ler: # öni³lemci tarafndan i³lenirler. simgesiyle ba³layan komutlar öni³lemci komutlardr ve En sk kullanlan öni³lemci komutlarn yeniden görelim: #dene geçti i De i³mez her yere ya de erini da makro yazar. tanmlamakta Sözgelimi kullanlr. Kodun içinde de i³mezin adnn #define PI 3.14 öni³lemci komutu, kodda PI yazan her yere 3.14 yazarak derleyiciye o haliyle gönderir; yani derleyici PI görmez. sözcü ünü #include Belirtilen dosyay o noktada kodun içine ekler. Sözgelimi #include <stdlib.h> öni³lemci komutu, stdlib.h derleyiciye geldi inde bu dosyann isimli içeri ini dosyay de bularak barndrr. kaynak kodun içine yerle³tirir. Kod 9.1 Makrolar Programn de meyecek içinde küçük skça kod parçalar yinelenmesi makrolar gerekebilecek, yardmyla ancak gerçeklenir. bir fonksiyon Makrolar haline da getirmeye de i³mez tanmlarnabenzer³ekilde de benzer ³ekilde olur, yani #definesözcü üyleyaplrlar. ³leyi³lerideyinede i³meztanmlarna makronun adnn geçti i yere açlm konur. Örnek 13'de geçen sqr_total = sqr_total + (score[i] - mean) * (score[i] - mean); 153
162 Projeler 154 komutunu basitle³tirmek üzere bir deyimin karesini alan #define sqr(x) (x) * (x) makrosunu kullanarak komutu ³u ³ekle getirebiliriz: sqr_total = sqr_total + sqr(score[i] - mean); Bunun sonucunda makro tanmndaki x simgesinin yerine makronun kullandld yerdeki score[i] - mean deyimi konur (programc kendisi bu ³ekilde yazm³ gibi). Bu yerle³tirilmesi i³lem bir sözcük ³eklinde ya yürüdü ünden da sözcük grubunun kullanmna yerine dikkat ba³ka etmek bir sözcük gerekir. ya da Örnekteki sözcük grubunun makro #define sqr(x) x * x ³eklinde tanmlansayd makro açlmyla olu³acak (hatal) kod ³u ³ekilde olurdu: sqr_total = sqr_total + score[i] - mean * score[i] - mean; Örnek 35. Projeler Bir en küçük saynn ortak asal katlarnn çarpanlarnn hesaplanmas ekrana dökülmesini i³lemlerini ve yapan iki saynn bir program en büyük yazlmas ortak isteniyor. bölen ve Programn dosyaya bölünecek, örnek bir kullancyla çal³mas ekil etkile³im 9.1'de ksmn verilmi³tir. yürüten Bu fonksiyon(ayn örnekte kaynak zamanda kodu birden fazla main siyonu) fonk- project.cpp dosyasna (Örnek 35), i³lemleri yapan fonksiyonlar ops.cpp (Örnek 36) konacaklardr. dosyasna Projeler Yazlan zorla³maya programn ba³lar. Binlerce kapsam satrlk büyüdükçe bir kaynak bütün kaynak kodunun kodunun tek bir tek dosyada bir dosyada tutularak toplanmas geli³tirilmesi son derece zordur. Böyle projelerde kaynak kodu farkl dosyalara bölünür. program den fazla kaynak dosyasna bölünmü³ bir proje derlenirken önce her kaynak dosyas ayr Bir- derlenerek ara kodlar olu³turulur, sonra ba layc bu ara kodlar ve varsa kullanlan kitaplklar ayr arasndaki ba lantlar kurarak çal³trlabilir kodu üretir ( ekil 9.3). Derlemesüresiba lamasüresindençokdahauzunoldu undankaynakkodunbu³ekildebölünmesi olu³an çal³trlabilir projelerde herhangi dosyann bir üretilmesi yordamdaki için gereken herhangi zaman bir de i³iklikte da azaltr. bütün Tek bir yordamlarn büyük dosyadan denderlenmeleriveba lanmalargerekir.oysakaynakdosyalarbölünürseyalnzcade i³tirilen yeni- 1 Bu örne in nasl derlenece ini Ek B.2'de görebilirsiniz.
163 155 Öni³lemci Say 1: 0 Say 2: 0 1. Say 1'i de i³tir 2. Say 2'yi de i³tir 3. Say 1'in çarpanlarn göster 4. En büyük ortak bölen bul 5. En küçük ortak kat bul 6. Çk Seçiminiz: 1 Sayy yaznz: 9702 Say 1: 9702 Say 2: 0 1. Say 1'i de i³tir 2. Say 2'yi de i³tir 3. Say 1'in çarpanlarn göster 4. En büyük ortak bölen bul 5. En küçük ortak kat bul 6. Çk Seçiminiz: 2 Sayy yaznz: 945 ekil 9.1: Proje örne i ekran çkts.
164 Projeler 156 Say 1: 9702 Say 2: Say 1'i de i³tir 2. Say 2'yi de i³tir 3. Say 1'in çarpanlarn göster 4. En büyük ortak bölen bul 5. En küçük ortak kat bul 6. Çk Seçiminiz: 3 2^1 3^2 7^2 11^1 Say 1: 9702 Say 2: Say 1'i de i³tir 2. Say 2'yi de i³tir 3. Say 1'in çarpanlarn göster 4. En büyük ortak bölen bul 5. En küçük ortak kat bul 6. Çk Seçiminiz: 4 En büyük ortak bölen: 1323 Say 1: 9702 Say 2: Say 1'i de i³tir 2. Say 2'yi de i³tir 3. Say 1'in çarpanlarn göster 4. En büyük ortak bölen bul 5. En küçük ortak kat bul 6. Çk Seçiminiz: 5 En küçük ortak kat: Say 1: 9702 Say 2: Say 1'i de i³tir 2. Say 2'yi de i³tir 3. Say 1'in çarpanlarn göster 4. En büyük ortak bölen bul 5. En küçük ortak kat bul 6. Çk Seçiminiz: 6
165 157 Öni³lemci Örnek 35 Giri³/çk³ fonksiyonlarn içeren kaynak dosyas. #include <iostream> #include <stdlib.h> #include "ops.h" int main(void) { int num1 = 0, num2 = 0; factor_t factors[maxfactor]; int n, i; int choice; // std::xxx // EXIT_SUCCESS // gcd,lcm,... while (true) { std::cout << "Say 1: " << num1 << std::endl; std::cout << "Say 2: " << num2 << std::endl << std::endl; std::cout << "1. Say 1'i de i³tir" << std::endl; std::cout << "2. Say 2'yi de i³tir" << std::endl; std::cout << "3. Say 1'in çarpanlarn göster" << std::endl; std::cout << "4. En büyük ortak bölen bul" << std::endl; std::cout << "5. En küçük ortak kat bul" << std::endl; std::cout << "6. Çk" << std::endl << std::endl; std::cout << "Seçiminiz: "; 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 büyük ortak bölen: " << gcd(num1, num2) << std::endl; break; case 5: std::cout << "En küçük ortak kat: " << lcm(num1, num2) << std::endl; break; std::cout << std::endl; return EXIT_SUCCESS;
166 Projeler 158 Örnek 36 Hesap fonksiyonlarn içeren kaynak dosyas. #include <math.h> #include "ops.h" #define max(x, y) (x) > (y)? (x) : (y) #define min(x, y) (x) > (y)? (x) : (y) // sqrt,pow // struct factor_s void gcd_factors(const factor_t factors1[], int n1, const factor_t factors2[], int n2, factor_t factors[], int &n); void lcm_factors(const factor_t factors1[], int n1, const factor_t factors2[], int n2, factor_t factors[], int &n); int gcd(int number1, int number2) {... int lcm(int number1, int number2) {... bool is_prime(int cand) {... int next_prime(int prime) {... void factorize(int x, factor_t factors[], int &n) {... void gcd_factors(const factor_t factors1[], int n1, const factor_t factors2[], int n2, factor_t factors[], int &n) {... void lcm_factors(const factor_t factors1[], int n1, const factor_t factors2[], int n2, factor_t factors[], int &n) {
167 159 Öni³lemci derleme baglama kaynak kodu 1 ara kod 1 çalistirilabilir kod kaynak kodu 2 ara kod 2 kaynak kodu n ara kod n kitapliklar ekil 9.3: Birden fazla kaynak kodlu projelerin derleme a³amalar. yordamn kaynak kodlarnn bulundu u yeniden kaynak derlenmelerine dosyas yeniden gerek derlenir kalmaz. ve ba lama i³lemi yaplr; de i³meyen Böyle bir çal³mada, dosyalardan yalnzca birinde main durumda ba lama i³lemi belirsizlik nedeniyle ba³arsz olur. fonksiyonu Ayrca bulunabilece i farkl dosyalardaki açktr; fonksiyonlarn aksi için baz birbirlerini düzenlemeler ça rabilmeleri, yapmak gerekir. dosyalar arasnda de i³ken payla³abilmeleri gibi konular Da tmann lünmelidir. Örnekte yararl oldu u olabilmesi gibi, için kullancyla fonksiyonlar, etkile³imi amaçlarna sa layan(giri³/çk³ göre gruplanarak i³lemlerini dosyalara yapan) bö- fonksiyonlarn bölümleme tekni idir. hesaplamalar yapan fonksiyonlarla ayr dosyalara toplanmas sk kullanlan bir Hesap i³lemlerini yapan factorize, gcd, lcm fonksiyonlar project.cpp dklarndan bu dosyann derlenmesi srasnda sorun çkar. Derlenebilmesi dosyasnda için bu üç bulunmanun bildirimleri dosya ba³na eklenmelidir. Bildirimler elle yazlabilir ancak daha do ru fonksiyo- yöntem, olan ops.cpp içeren bir ba³lk dosyas dosyasn hazrlamak bir kitaplk ve bu gibi ba³lk dü³ünüp dosyasn tanmlad di er dosyann fonksiyonlarn içine almaktr. bildirimlerini lelikle Böy- ops.cpp ve ops.h dosyalar ba³ka projelerde de kullanlabilirler. Örnek projede ops.cpp dosyas için ops.h ba³lk dosyas hazrlanm³ (Örnek 37) ve bu dosya #include ops.h öni³lemci komutuyla her iki kaynak dosyasnn da içine alnm³tr. Burada <> simgeleri yerine klasörde simgeleri aramasn kullanlmas, sa lar. öni³lemcinin ba³lk dosyasn sistem klasörlerinden önce bulunulan Ba³lk lecekleri dosyas, bilgileri ilgili barndrr. kitapl n Bir arayüzüdür; fonksiyon yalnzca ba³ka dosyalardaki o dosya içinde fonksiyonlarn kullanlyorsa gerek ve d³ardan duyabi-
168 Projeler 160 Örnek 37 Hesap fonksiyonlar için ba³lk dosyas. #ifndef OPS_H #define OPS_H #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 fonksiyonlar tarafndan ça rlmayacaksa (örnekteki next_prime ve is_prime gibi) bildirimi ba³lk dosyasna yazlmaz. fonksiyonlar Ba³lk panlar dosyalar, göstermek fonksiyon için kullanlan bildirimlerinin d³nda, tip tanmlar da içerebilirler. Örnekte çar- factor_t tipi project.cpp bir tip oldu undan ba³lk dosyasna alnm³tr. Program bir saynn dosyasnda asal çarpanlarn da gerek listeleme duyulan i³ini yapmayacak olsayd, bu veri tipi ve factorize fonksiyonunun bildirimine project.cpp dosyasnda gerek kalmayaca için ba³lk dosyasna yazlmayabilirlerdi. Bu veri tipi ops.cpp dosyasnda da kullanld ndan bu dosyann da ayn ba³lk dosyasn içermesi gerekir. Benzer fonksiyon ³ekilde, bir saynn de i³mez asal ve çarpanlarn makro tanmlar temsil etmek da ba³lk üzere dosyalarnda statik bir dizi yer tanmlamaktadr. alabilir. Örnekte ana dizinin eleman saysna kendisi karar verebilece i gibi, di er fonksiyonlarla uyum açsndan Bu bilgiyi ba³lk dosyasndan almas daha uygundur. bu Ba³lk dosyalarnda yaplmamas gereken iki önemli i³lem vardr: Fonksiyon gövdeleri yazlmaz. tanmlamak: Bir ba³lk Ba³lk dosyas dosyalarna birden fazla fonksiyonlarn C dosyas tarafndan yalnzca bildirimleri alnabilece inden yazlr, aynfonksiyonunbirdenfazlakeretanmlanmasba lamaa³amasndahatayanedenolur. De i³ken fazla dosya tanmlamak: tarafndan alnma Benzer durumunda ³ekilde, ba³lk ayn dosyasnda isimli genel tanmlanan de i³kenler de i³kenler olarak de erlendirilir ve ba lama hatasna neden olurlar. birden Farkldosyalararasndapayla³lacakgenelde i³kentanmlanmakisteniyorsabude i³ken ba³lk dosyasnda extern normal biçimde tanmlanmaldr. sakl sözcü üyle Örne in, bildirilmeli ba³lk dosyasnda ve C kaynak dosyalarndan birinde extern int counter; linde bildirilebilir ve dosyalardan biri ³ek- int counter; komutuyla tanmlayabilir.
169 161 Öni³lemci Sorular 1. x y z i³lemini gerçekle³tirmek üzere (a) bir if komutu yazn. (b) bir makro tanm yazn. 2. Üç saynn harmonik ortalamas ³öyle tanmlanr: 3 1 x x x 3 (a) Üç saynn harmonik ortalamasn hesaplamak üzere kullanlabilecek harmonic(x, y, z) makrosunun tanmn yaznz. (b) Yazd nz makro b = harmonic(m - 1, n + 3, p); ³eklinde ça rlrsa bu makronun açlm nasl olur?
170 Projeler 162
171 Bölüm 10 Ba lantl Listeler Örnek 38. En Büyük Ortak Bölen Bulma Örnek panlarstatikbirdiziyletemsilediliyordu.buörnektestatikdiziyerinedinamikdizikullanmak 23'de gerçeklendi i ³ekliyle, en büyük ortak bölen bulma programnda bir saynn çar- bellek man says kullanmn belli olduktan etkinle³tirmek sonra gerekti i adna bir kadar i³e yaramaz; yer ayrmaktr, çünkü dinamik oysa bu örnekte dizilerde eleman yaplan, says ele- ancak çarpanlarna ayrma algoritmasnn sona ermesiyle sonra belli olur. Ba lantl tl liste, birbirinin listeler, bu e³i tip dü ümlerden algoritmalarda olu³ur; dizilere her göre dü üm daha tutulmak uygun bir istenen veri yapsdr. bilgileri ta³masnn Bir ba lan- yansra liniyorsa listede sonraki kendisinden dü ümü gösteren sonra gelen alanlar dü üme üzerinden de bir ilerlenerek i³aretçi içerir. bütün Böylece dü ümlere listenin eri³ilebilir. ba³ bi- Listenin Bu yapda, sonunu dizilerin belirtmek aksine, üzere eleman son saysn dü ümün tutmann sonraki gere i alanna yoktur. özel bir de er (NULL) yazlr. Örnek programdr. 38 ayn algoritmalar statik diziler yerine ba lantl listeler üzerinde gerçekleyen bir Örnekteki ba lantl liste yapsnn olu³turulmas için kullanlan yap tanm ³öyledir: struct factor_s { int base, power; struct factor_s *next; ; typedef struct factor_s factor_t; Görüldü ü i³aret eden gibi, bir i³aretçi bir dü ümde alan vardr. asal çarpann Böyle de eri bir yap ve üzerinde üssüne ek i³lem olarak yapmak dü ümün için kendi tek gerekli tipine de i³ken dizinin ilk elemanna i³aret eden bir de i³ken tutmaktr, örnekteki head leri bu amaçla tanmlanm³tr. Listeye ekleme algoritmalarnda kolaylk sa lamas için de i³ken- listenin son dü ümünü bir de (next alannda NULL yazan dü üm) gösteren bir de tail kullanlm³tr. de i³keni Bu ekil tanma 10.1'de göre verilmi³tir. olu³turulan ba lantl listelerde 9702 saysnn çarpanlarnn nasl gösterildi i 163
172 164 Örnek 38 Ba lantl listeler kullanarak en büyük ortak bölen 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; cout << "Saylar yaznz: "; cin >> number1 >> number2; factors1 = factorize(number1); factors2 = factorize(number2); factors3 = gcd_factors(factors1, factors2); for (f = factors3; f!= NULL; f = f->next) gcd = gcd * (long int) pow((double) f->base, (double) f->power); delete_factors(factors1); delete_factors(factors2); delete_factors(factors3); cout << "En büyük ortak bölen: " << gcd << endl; return EXIT_SUCCESS; head tail ekil 10.1: Ba lantl liste örne i.
173 165 Ba lantl Listeler Bu veri yaps kullanld nda bir sayy asal çarpanlarna ayran fonksiyonun giri³ parametresi olarak yalnzca asal çarpanlarna ayrlacak sayy almas ve çk³ parametresi olarak olu³turdu u çarpanlar listesinin ba³langç elemann döndürmesi yeterlidir: factor_t *factorize(int x); Benzer³ekilde,ortakçarpanlarbulmaalgoritmasdaikiçarpanlistesinialarakortakçarpanlar listesini döndürür: factor_t *gcd_factors(factor_t *factors1, factor_t *factors2); Ba lantl leri gerekir. listeler Bu amaçla dinamik tanmlanan olarak olu³turulduklarndan i³leri bitti inde sisteme geri verilme- delete_factors bir listenin bütün dü ümlerini sisteme geri verir. Burada fonksiyonu ilk dü ümüne i³aretçi ald head lecek dü ümün adresini tutarken p i³aretçisi bir sonraki dü ümün i³aretçisi unutulmamasn o anda sa lar. geri veri- fonksiyon ³öyle yazlabilir: Bu void delete_factors(factor_t *head) { factor_t *p = NULL; while (head!= NULL) { p = head->next; delete head; head = p; Örnek programda kullanlan di er fonksiyonlar olan factorize ve gcd_factors fonksiyonlar srasyla Örnek 39 ve Örnek 40'de verilmi³tir Yaplara ³aretçiler Bir yapya i³aret eden bir de i³ken tanmland nda bu yapnn alanlarna eri³mek için -> 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 * daha sonra noktal gösterilimle istenen alann de eri de ile alnabilir: i³aretçinin ba³vurdu u yere eri³ilip (*f).base ikinci gösterilim pek ye lenmez. gibi. Ancak bu Uygulama: Ba lantl Listeler Buörnekte,Örnek30'deyaplanortade erbulmaprogramseçereksralamaalgoritmasyerine araya sokarak sralama algoritmasyla gerçeklenecektir.
174 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;
175 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;
176 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: Bu eklendi inde yöntem statik ondan diziler büyük üzerinde olan bütün gerçeklenmeye elemanlarn uygun bir konum de ildir sa a çünkü kaydrlmalar her yeni gelen gerekir. eleman nekte 18 says dizinin en ba³na eklenece inden üç elemann birden sa a kaydrlmasna neden Ör- olur.oysabualgoritmaba lantllistelerüzerindegerçeklenmeyegayetuygundur.örnek41'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
177 169 Ba lantl Listeler Örnek 41 Ba lantl liste üzerinde araya sokarak sralama program (ana fonksiyon). #include <iostream> #include <stdlib.h> using namespace std; struct node_s { int value; struct node_s *next; ; typedef struct node_s node_t; // cin,cout,endl // EXIT_SUCCESS 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 << "Ö renci says: "; cin >> no_students; score = new int[no_students]; for (i = 0; i < no_students; i++) { cout << i + 1 << ". ö rencinin notu: "; cin >> 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 << "Orta de er: " << median << endl; delete_nodes(head); delete score; return EXIT_SUCCESS;
178 Yaplara ³aretçiler 170 Örnek 42 Ba lantl liste üzerinde araya sokarak sralama program (liste fonksiyonlar). node_t *insert(node_t *head, int v) { node_t *p = head, *newnode = NULL, *last = NULL; newnode = new node_t; newnode->value = v; while ((p!= NULL) && (p->value < v)) { last = p; p = p->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;
179 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 ilkesine dayanyordu. Problemin çözümünün, bu saylarnn örnekte oldu u en büyük gibi, kendisi ortak bölenine cinsinden e³ittir edilmesine ifade rekürsif bir probleme indirgenir. tanm Sürekli ad verilir. indirgemeler Çözülmesi yoluyla istenen çözümü problem, bilinen kendisi bir cinsinden duruma daha (taban küçük rum) ula³lmaya çal³lr. Euclides algoritmasnda taban durum küçük olan saynn 0'a gelmesi du- durumuydu; saylar üzerinde bu durumda en büyük di er ortak say bölen en aranmaya büyük ortak devam bölen ediliyordu. oluyordu. Bu Aksi ilkeyi halde gerçekleyen daha küçük fonksiyon ³u ³ekilde yazlabilir: bir 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
180 Örnek 43. Hanoi Kuleleri Hanoi birincidire egeçirilmi³durumdadr.çapengeni³olandiskenaltta,endarolanenüstteyer kuleleri probleminde 3 adet direk ve 64 adet ortas delik disk vardr. Diskler ba³langçta alr teker ve direkler her disk arasnda kendisinden ta³yarak daha ayn geni³ düzeni çapl bir üçüncü diskin direkte üzerinde olu³turmaktr. durur. Amaç, Burada diskleri kural, teker hiçbirdiskinhiçbira³amadakendisindendarbirdiskinüzerinekonamamasdr. ekil11.1'deüç direk verilmi³tir. ve üç diskli örnek verilmi³tir. Bu örne in çözümünü yapan programn çkts ekil 11.2'de 172 A B C ekil 11.1: Hanoi kuleleri problemi ba³langç durumu. Hanoi n dü³ünmekle kuleleri probleminin ba³layalm. genel Bu disk çözümünü ba³ka olu³turmaya hiçbir diskin en üstüne geni³ konamayaca çapl diskin nasl için ta³nacadiske ba³ka bir direk üzerinden aktarlarak geçemez, bir kerede götürülmelidir. Bunun üçüncü bilmesi için birinci diskte kendisinden ba³ka disk bulunmamal, üçüncü disk de bo³ olmaldr yapla- ( 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 ba³ka bir ve ³ey üçüncü de ildir. admlardaki O halde ta³ma problemimizi i³lemi aslnda 63 disk için ayn problemin çözülmesinden n diskin a dire inden b dire ine c ta³nmas ³eklinde ifade ederek çözümü ³u ³ekilde yazabiliriz: dire i üzerinden Bir diski 1 dire inden 3 dire ine ta³. Bir diski 1 dire inden 2 dire ine ta³. Bir diski 3 dire inden 2 dire ine ta³. Bir diski 1 dire inden 3 dire ine ta³. Bir diski 2 dire inden 1 dire ine ta³. Bir diski 2 dire inden 3 dire ine ta³. Bir diski 1 dire inden 3 dire ine ta³. ekil 11.2: Hanoi kuleleri problemini çözen programn ekran çkts.
181 173 Rekürsiyon A C B ekil 11.3: Hanoi kuleleri problemi (en geni³ diskin ta³nmas). 1. n - 1 diski a dire inden c dire ine b dire i üzerinden ta³. 2. a dire inde kalan diski b dire ine ta³. 3. n - 1 diski c dire inden b dire ine a dire i üzerinden ta³. Her ta³nacak seferinde disk direk saysnn says 0 azald ndan oldu u durumdur, bu algoritma bu durumda sonlanma hiçbir ko³ulunu ³ey yaplmayacaktr. sa lar. Taban O durum, bu problemi çözen program Örnek 43'de görüldü ü gibi yazlabilir. halde Bu diski algoritmann gereksiz yere en bir güzel direkten yanlarndan bir dire e biri, aktartmadan deneme-yanlma bir kerede yöntemiyle çözümü de il, bulmasdr. herhangi bir Uygulama: Rekürsiyon Örnek 44. Çabuk Sralama DÜZELT: YAZILACAK Sorular
182 174 Örnek 43 Hanoi kuleleri problemini çözen program. #include <iostream> #include <stdlib.h> 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; // cin,cout,endl // EXIT_SUCCESS void move(int n, int a, int b, int c) { if (n > 0) { move(n - 1, a, c, b); cout << "Bir diski " << a << " dire inden " << b << " dire ine ta³." << endl; move(n - 1, c, b, a);
183 175 Rekürsiyon Örnek 44 Çabuk sralama algoritmasn gerçekleyen program. #include <iostream> #include <stdlib.h> using namespace std; // cin,cout,endl // EXIT_SUCCESS void quicksort(int arr[], int first, int last); int main(void) { int numbers[] = { 26, 33, 35, 29, 19, 12, 22 ; int i; quicksort(numbers, 0, 6); for (i = 0; i < 7; i++) cout << numbers[i] << endl; return EXIT_SUCCESS; void swap(int &x, int &y) { int tmp; tmp = x; x = y; y = tmp; int partition(int arr[], int first, int last) { int pivotloc = first; int pivot = arr[first]; int i; for (i = first + 1; i <= last; i++) { if (arr[i] < pivot) { pivotloc++; swap(arr[pivotloc], arr[i]); swap(arr[first], arr[pivotloc]); return pivotloc; void quicksort(int arr[], int first, int last) { int pivotloc; if (first < last) { pivotloc = partition(arr, first, last); quicksort(arr, first, pivotloc - 1); quicksort(arr, pivotloc + 1, last);
184 176
185 Ek A Simgelerin Kodlanmas Bilgisayarlarda hangi sayyla gösterilece i di er her ³ey (ya gibi da simgeler tersine, de hangi saylarla saynn gösterilirler. hangi simgeye Bunun kar³ için dü³ece i) hangi simgenin sunda bir uzla³ma olmas gerekir. Bu amaçla tanmlanan kodlamalar, simgelere birer numara konu- verirler. Yaygn kodlama kullanlan oldu undan ilk kodlamalardan 128 farkl simgenin biri ASCII kodlanmasna kodlamasyd olanak ( ekil verir. A.1). lk kodun ASCII, numaras 7 bitlik bir son kodun numaras 127'dir. Bunlardan ilk 32 simge (0-31) ve son simge (127) baslamaz 0, simgelerdir çük ve büyük (satr hareri, sonu, rakamlar, bip sesi v.b.). noktalama Aradaki i³aretleri 95 simgeyse ve tu³takm (32-126) üzerinde ngilizce'nin gördü ünüz bütün kü- türlü özel simgeyi içerir. ASCII kodlamas günümüzde kullanlan bütün kodlamalarn temelini her olu³turur ! " # $ % & ' 40 ( ) * +, -. / : ; < = >? A B C D E F G 72 H I J K L M N O 80 P Q R S T U V W 88 X Y Z [ \ ] ^ _ 96 ` a b c d e f g 104 h i j k l m n o 112 p q r s t u v w 120 x y z { ~ Tablo A.1: ASCII kodlama çizelgesi. ASCII o dilde kodlamas, bulunan farkl ngilizce simgeleri d³nda de kalan içeren abecelerin 8 bitlik kodlamalar harerini içermedi inden, olu³turulmu³tur; her böylelikle dil için 256 farkl simgenin kodlanmasna olanak sa lanm³tr. Bütün bu kodlamalarda ilk 128 simge 177
186 178 ASCII malarn çizelgesinde en bilineni olann ISO8859 aynsdr, standart düzenlemeler ailesinde tanmlananlardr. ikinci 128 simge ISO8859 üzerinde kodlamalarnda yaplr. Bu kodla aras saylar kullanlmaz. da ISO8859-1: Bat Avrupa dilleri (latin1 kodlamas adyla da bilinir) ISO8859-2: Do u Avrupa dilleri ISO8859-9: deyse ayndr, Türkçe yalnzca (latin5 ISO8859-1'deki kodlamas adyla zlandaca da bilinir). harerin ISO yerine Türkçe kodlamasyla harerin neremesiyle olu³turulmu³tur. ki kodlama arasnda de i³en 6 simge ³unlardr: ³. gel- Son gulamalarn yllarda, says farkl çok diller büyük konu³an, bir hzla farkl artt ndan, ülkelerde ya³ayan bütün dillerin insanlarn bütün ortak simgelerini kullandklar içeren uy- kodlamaya geçmek bir zorunluluk halini alm³tr. Bu amaçla geli³tirilen Unicode kodlamas bir (resmi bütün dillerin adyla ISO ), simgelerini içermenin 16 ve 32 bitlik yansra sürümleri daha pek olan çok bir ek kodlamadr. simgenin tanmlanabilmesine Yeryüzünde bilinen de ramlarda olanak büyük verir. Ancak miktarlarda bütünüyle de i³iklik bu kodlamaya gerekecektir. geçmek Bu nedenle, için yaygn yeni kullanlan yazlan uygulamalarda bütün prog- bu kullanm kodlamann süren yaln eski uygulamalarla hali olan UTF-16 uyum ya sorununu da UTF-32 azaltmak kodlamalarna için bir uyulmas geçi³ kodlamas öngörülürken, UTF-8 geli³tirilmi³tir. olarak Bir bir bellek de erin gözünde bilgisayar 240 belle inde says yer bir alyor göze olsun. ham bir Program veri olarak bu gözü yazld bir tamsay dü³ünülebilir. olarak Sözgelimi, dirirse 240 de erini elde eder ve diyelim bu sayy ba³ka bir say ile toplayabilir. ISO de erlen- kodlamasnda göre sralama bir yapmada simge kullanabilir. olarak de erlendiriyorsa ISO kodlamasnda ' ' harni elde bir eder say ve olarak Türkçe de erlendiriyorsa kurallarna bellekte harnieldeederve zlandacakurallarnagöresralamadakullanabilir.ksacas,de er leyece i konulardr. ham haliyle bulunur; nasl anlam verilece i, ne amaçla kullanlaca programn belir-
187 Ek B Unix'de Program Geli³tirme B.1 Yardmc Belgeler Unix i³letim sistemlerinde ço u zaman man fonksiyon alabilirsiniz. Bu komut fonksiyonun ne i³ yapt n ve hangi komutuyla ba³lk o dosyasnda fonksiyonla yer ilgili ald n bilgi söyleyecektir. Örnek: man sqrt. info KDE: Konqueror ya da Alt-F2 #sqrt B.2 Derleme Unix ailesi i³letim sistemlerinde C/C++ dilinde geli³tirme yapmak için en çok GNU C Compiler (gcc) derleyicisi kullanlr. Temel kullanm ³öyledir: gcc kaynak_dosyas -o çal³trlabilir_dosya Kaynak dosyanz bir C++ koduysa g++ kaynak_dosyas -o çal³trlabilir_dosya komutuyla ismi verilen çal³trmanz çal³trlabilir gerekir. dosya olu³turulur. Bu komutun sonucunda kaynak dosya derlenir, ba lanr ve Derleyici ba³lk dosyalarn /usr/include, kitaplk dosyalarnysa /usr/lib arar. Derleyicinin çal³mas baz bayraklar yardmyla denetlenebilir. A³a daki kataloglarnda kaynak dosyasnn adnn main.cpp, hedef dosya adnn main.o, çal³trlabilir dosya örneklerde da adnn main oldu u varsaylrsa: Kaynak dosyay yalnz derlemek istiyorsanz, yani ba lamak istemiyorsanz -c kullanabilirsiniz: bayra n 179
188 Derleme 180 g++ main.cpp -c -o main.o Derleyicinin bütün uyarlarlarn görmek istiyorsanz -Wall bayra n kullanabilirsiniz: g++ main.cpp -Wall -o main Ba³ka kataloglarda da ba³lk dosyas aramasn istiyorsanz -I bilirsiniz: bayra yla bunu belirte- g++ main.cpp -I/usr/X11R6/include -o main Ba³kakataloglardadakitaplkaramasnistiyorsanz -L bayra ylabunubelirtebilirsiniz: g++ main.cpp -I/usr/X11R6/include -L/usr/X11R6/lib -o main Optimizasyon: -O2 Birden üzerinde fazla bir kaynak projenin dosyasndan nasl derlenece ini olu³an bir görelim: projenin derlenmesi birkaç a³amal olur. Örnek 35 project.cpp dosyasn derle (ba lamadan): g++ -c project.cpp -o project.o ops.cpp dosyasn derle (ba lamadan): g++ -c ops.cpp -o ops.o ba la g++ project.o ops.o -o project Kaynak lenmesi ve dosyalarnn ba lama yeterlidir. herhangi birinde bir de i³iklik yaplrsa yalnzca o dosyann yeniden der- Her kolayla³trmak seferinde elle için derleme make arac komutlarn kullanlr. yazmak Bu araç, zahmetli programcnn bir i³ oldu undan yazd, derleme derleme a³amalarn i³lemlerini belirten Makefile isimli bir dosya denetiminde çal³r. Makefile Her hedef için heden nelere ba l oldu u ve nasl olu³turulaca dosyas belirtilir. hedeerden Örnek bir olu³ur. ³öyle yazlabilir: hedef project: project.o ops.o g++ project.o ops.o -o project Bu yazmn anlam, project hedenin project.o ve ops.o turulmas için ikinci satrda yazlan komutun kullanlaca dr. dosyalarna ba l oldu u ve olu³yalarda de i³me olursa (dosyann tarih ve saati hedenkinden 1 yeniyse) Bir heden heden ba l yeniden oldu u olu³turulmas gerekti ine karar verilir. Örnek projedeki di er hedeer de ³öyle yazlabilir: dos- 1 Hede olu³turmakta kullanlacak komutlar satr ba³ndan bir sekme içeriden ba³lamaldr. Bir hede olu³turmakta birden fazla komut kullanlabilir.
189 181 Unix'de Program Geli³tirme project.o: project.cpp g++ -c project.cpp -o project.o ops.o: ops.cpp g++ -c ops.cpp -o ops.o make mezse komutu dosyada çal³trlrken bulunan ilk hangi hedef heden olu³turulmaya olu³turulmasnn çal³lr. Ba³langçta istendi i belirtilir. project.o, Hedef belirtil- ops.o ve project dosyalarnn hiçbirinin olmad n varsayarsak, make project ³öyle olur: komutunun çal³mas 1. project hede olu³turulmaya çal³lr. Bu hedef project.o ve ops.o oldu u için ve bunlar henüz olu³turulmam³ oldu u için srayla bunlar hedeerine olu³turulmaya ba l çal³lr. 2. project.o hede olu³turulmaya çal³lr. Bu hedef project.cpp için olu³turulmasna geçilebilir ve dosyasna ba l oldu u g++ -c project.cpp -o project.o komutu yürütülür. 3. ops.o hede olu³turulmaya çal³lr. Bu hedef ops.cpp dosyasna ba l oldu u için olu³turulmasna geçilebilir ve g++ -c ops.cpp -o ops.o komutu yürütülür. 4. Artk project turulmasna geçilebilir hedenin ve ba l oldu u iki dosya da olu³mu³ oldu undan bu heden olu³- g++ project.o ops.o -o project komutu yürütülür. leride ops.cpp dosyasnda bir de i³iklik yapld n ve make project ünü dü³ünelim: komutunun yürütüldü- 1. project hede olu³turulmaya çal³lr. Bu hedef project.o ve ops.o hedeerine ba l oldu u için önce onlara baklr. 2. project.o hede olu³turulmaya çal³lr. Bu hedef project.cpp cak dosyasna ba ldr an- project.cpp dosyasnn saati project.o yaplmaz. dosyasndan eski oldu u için bir i³lem 3. ops.o hede olu³turulmaya çal³lr. Bu hedef ops.cpp dosyasna ba ldr ve ops.cpp dosyasnn saati ops.o rekti ine karar verilir ve dosyasndan yeni oldu u için heden yeniden olu³turulmas ge-
190 Editörler 182 g++ -c ops.cpp -o ops.o komutu yürütülür. 4. project hedene dönüldü ünde ops.o dosyasnn saati artk project atinden yeni oldu u için bu heden de yeniden olu³turulmas gerekti ine dosyasnn karar verilir sa- ve g++ project.o ops.o -o project komutu yürütülür. Makefile bilir. Örnek dosyalarnda proje için yazlm³ ayrca baz bir de i³mezler tanmlanarak okunulurluk ve esneklik artrla- Makefile lan, kaynak dosyalar d³nda kalan her ³eyi silen Örnek 45'de verilmi³tir. Bu dosya skça kullan- clean hedeni de içermektedir; make clean komutu sizin yazd nz d³nda kalan bütün dosyalarn silinmesi için kullanlr. Örnek 45 Örnek bir Makefile dosyas. CXX=g++ CXXFLAGS=-O2 -Wall -g -pg LDFLAGS=-pg proje: proje.o ops.o $(CXX) $(LDFLAGS) proje.o ops.o -o proje proje.o: proje.cpp $(CXX) $(CXXFLAGS) -c proje.cpp -o proje.o ops.o: ops.cpp $(CXX) $(CXXFLAGS) -c ops.cpp -o ops.o clean: rm -f *.o proje Öni³lemci: cpp B.3 Editörler nedit kate mcedit: yazm renklendirme, ayraç e³le³tirme, makrolar, tab emülasyonu, kendili- inden girintileme B.4 Hata Ayklayclar Çal³trlabilir dosya üzerinde hata ayklama yapacaksanz -g bayra n kullanmalsnz:
191 183 Unix'de Program Geli³tirme g++ main.cpp -g -o main Hata ayklama bilgilerini silmek için -s strip gdb ddd: adm adm çal³trma, de i³ken de erlerini izleme ³aretçilerle sünün bir dosyaya çal³rken yazlmasna yaplan hatalar neden olurlar(core sklkla programn dump). çökmesine Bu bellek ve görüntüsü o anki bellek programnzn görüntü- neden Örnek çöktü üne 39'de ili³kin önemli bilgiler içerir ve hatann nedenini bulmanza yardmc olabilir. if (x % factor == 0) { satrndan sonraki f = new factor_t; komutunu ddd hata ayklaycsnda silerek program önce derleyin Open ve Program çal³trn. komutuyla Program bellek çal³trlabilir hatas vererek dosyay, çökecektir. Open Core Dump... komutuyla yaratlan sonra da core dosyasn açn. Programn çöktü ü anda f->base = factor; satrnda kald n ve f i³aretçisinin de erinin NULL oldu unu göreceksiniz. B.5 Ba³arm nceleme Programnzdakifonksiyonlarnkaçarkereça rldklarnvehangifonksiyondanekadarzaman harcand n derleyicisine ölçmek hem derleme için gprof hem aracn ba lama kullanabilirsiniz. a³amasnda gprof'un kullanlabilmesi için gcc/g++ -pg hangi fonksiyonun kaç kere ça rld n görmek için: bayra verilmelidir. Örnek 23'de g++ -pg lcm.cpp -o lcm komutuyla de erler girilir. program Bu çal³ma derlendikten sonucunda sonra çal³trlr ve en küçük ortak kat hesaplanmak istenen gmon.out isimli bir dosya olu³ur ve gprof lcm gmon.out komutu olu³an örnek programn bir raporun çal³masyla baz bölümleri ilgili bir rapor a³a da üretir. verilmi³tir: ve de erlerinin girilmesiyle % cumulative self self total time seconds seconds calls us/call us/call name is_prime factorize next_prime merge_factors
B A. A = B [(A B) (B A)] (2)
Bölüm 5 KÜMELER CEB R Do a olaylarnn ya da sosyal olaylarn açklanmas için, bazan, matematiksel modelleme yaplr. Bunu yapmak demek, incelenecek olaya etki eden etmenleri içine alan matematiksel formülleri
B02.8 Bölüm Değerlendirmeleri ve Özet
B02.8 Bölüm Değerlendirmeleri ve Özet 57 Yrd. Doç. Dr. Yakup EMÜL, Bilgisayar Programlama Ders Notları (B02) Şimdiye kadar C programlama dilinin, verileri ekrana yazdırma, kullanıcıdan verileri alma, işlemler
C Programlama. C Programlama. Alper Bayrak Abant İzzet Baysal Üniversitesi Bolu
C Programlama Alper Bayrak Abant İzzet Baysal Üniversitesi Bolu 2014 Sunuma Genel Bakış Sunuma Genel Bakış I 1 Akış Çizgeleri Blok Yapılı Programlama Giriş / Çıkış Programların Çalıştırılması Kitaplıklar
Temel Bilgisayar Programlama
BÖLÜM 9: Fonksiyonlara dizi aktarma Fonksiyonlara dizi aktarmak değişken aktarmaya benzer. Örnek olarak verilen öğrenci notlarını ekrana yazan bir program kodlayalım. Fonksiyon prototipi yazılırken, dizinin
Çarpm ve Bölüm Uzaylar
1 Ksm I Çarpm ve Bölüm Uzaylar ÇARPIM UZAYLARI 1 ÇARPIM TOPOLOJ S 2 KARMA P R O B E M L E R 1. A ile B, srasyla, (X, T )X ile (Y, S ) topolojik uzaylarnn birer alt-kümesi olsunlar. (a) (A B) = A B (b)
XIV. Ulusal Antalya Matematk Olmpyat Brnc A³ama Snav Sorular -2009
XIV. Ulusal ntalya Matematk Olmpyat rnc ³ama Snav Sorular -009 c www.sbelian.wordpress.com [email protected] Soru 1. dar açl üçgeninde m() = 45 'dir. 'dan 'ye indirilmi³ dikmenin aya E ve 'den
PROGRAMLAMA TEMELLER. C Program Yap s
PROGRAMLAMA TEMELLER 1 C Program Yap s 2 Aç klama sat r Program kodlar n makine diline çeviren C dili derleyicisi /* ve */ karakterleri aras nda kalan bölümleri ihmal eder. /* Aç klama Sat r */ Sadece
18.702 Cebir II 2008 Bahar
MIT Açk Ders Malzemeleri http://ocw.mit.edu 18.702 Cebir II 2008 Bahar Bu materyallerden alnt yapmak veya Kullanm artlar hakknda bilgi almak için http://ocw.mit.edu/terms ve http://tuba.acikders.org.tr
Bölüm 4 Button 4.1 Button Nedir? Button (dü me), tkinter içinde bir snftr; ba³ka bir deyi³le bir widget'tir. Üstelik, Button, öteki GUI araç çantalarnn hemen hepsinde ayn ad ile var olan standart bir widget'tir.
ÖĞRENME FAALĠYETĠ 7. 7. GELĠġMĠġ ÖZELLĠKLER
ÖĞRENME FAALĠYETĠ 7 AMAÇ ÖĞRENME FAALĠYETĠ 7 Bu faaliyette verilen bilgiler ile hazırlamıģ olduğunuz belgeye uygun baģvuruları (Ġçindekiler Tablosu, Dipnot/sonnot, Ģekil tablosu, resim yazısı vb.) hatasız
A = i IA i = i I A = A = i IA i = {x α((α I) (x A α ))} (7.7) A = (α,β I) (α β) A α A β = (7.8) A A
Bölüm 7 KÜME A LELER 7.1 DAMGALANMI KÜMELER E er inceledi imiz kümelerin says, alfabenin harerinden daha çok de ilse, onlara,b,...,w gibi harerle temsil edebiliriz. E er elimizde albenin harerinden daha
(i) (0,2], (ii) (0,1], (iii) [1,2), (iv) (1,2]
Bölüm 5 KOM ULUKLAR 5.1 KOM ULUKLAR Tanm 5.1.1. (X, T ) bir topolojik uzay ve A ile N kümeleri X uzaynn iki alt-kümesi olsun. E er A T N olacak ³ekilde her hangi bir T T varsa, N kümesine A nn bir kom³ulu
S = {T Y, X S T T, S S} (9.1)
Bölüm 9 ÇARPIM UZAYLARI 9.1 ÇARPIM TOPOLOJ S Bo³ olmayan kümelerden olu³an bo³ olmayan bir ailenin kartezyen çarpmnn da bo³ olmad n, Seçme Aksiyomu [13],[20], [8] ile kabul ediyoruz. imdi verilen aileye
Temel Giriş/Çıkış Fonksiyonları (Devam) Örnek :
Temel Giriş/Çıkış Fonksiyonları (Devam) Örnek : scanf() Fonksiyonu Birçok programda ekrana verilerin yazdırılması yanısıra klavyeden veri okunması gerekebilir. scanf() fonksiyonu klavyeden veri okumak
MAT223 AYRIK MATEMATİK
MAT223 AYRIK MATEMATİK Çizgeler 7. Bölüm Emrah Akyar Anadolu Üniversitesi Fen Fakültesi Matematik Bölümü, ESKİŞEHİR 2014 2015 Öğretim Yılı Çift ve Tek Dereceler Çizgeler Çift ve Tek Dereceler Soru 51 kişinin
Yedi Karat Kullanım Klavuzu. Yedi Karat nedir? Neden Karat?
Yedi Karat Kullanım Klavuzu Yedi Karat nedir? Karat, fiziksel dünya ile iletişim ve etkileşim kurulabilmesini sağlayan, elektronik prototip geliştirme kartıdır. Karat, tek başına çalışabilen interaktif
4 ab sayısı 26 ile tam bölünebildiğine göre, kalanı 0 dır.
BÖLME, BÖLÜNEBİLME A. Bölme İşlemi A, B, C, K doğal sayılar ve B 0 olmak üzere, Bölünen A 75, bölen B 9, bölüm C 8 ve kalan K tür. Yukarıdaki bölme işlemine göre, 1. 9 yani, K B dir. işlemine bölme denir.
Simülasyon Modellemesi
Doç. Dr. Mustafa Yüzükrmz [email protected] Melik³ah Üniversitesi Ders -2: Metod ve Veri Analizi çerik 1 Giri³ Metod Müh.'de Sistematik Yakla³m çerik 1 Giri³ Metod Müh.'de Sistematik Yakla³m
BÖLÜM 7 BİLGİSAYAR UYGULAMALARI - 1
1 BÖLÜM 7 BİLGİSAYAR UYGULAMALARI - 1 Belli bir özelliğe yönelik yapılandırılmış gözlemlerle elde edilen ölçme sonuçları üzerinde bir çok istatistiksel işlem yapılabilmektedir. Bu işlemlerin bir kısmı
Tasarım Raporu. Grup İsmi. Yasemin ÇALIK, Fatih KAÇAK. Kısa Özet
Tasarım Raporu Grup İsmi Yasemin ÇALIK, Fatih KAÇAK Kısa Özet Tasarım raporumuzda öncelikle amacımızı belirledik. Otomasyonumuzun ana taslağını nasıl oluşturduğumuzu ve bu süreçte neler yaptığımıza karar
kili ve Çoklu Kar³la³trmalar
kili ve Çoklu Kar³la³trmalar Birdal eno lu ükrü Acta³ çindekiler 1 Giri³ 2 3 4 5 6 7 Bu bölümde, (2.1) modelinde, H 0 : µ 1 = µ 2 = = µ a = µ (1) ³eklinde ifade edilen sfr hipotezinin reddedilmesi durumunda,
19.8. PROBLEMLER 0.1 PROBLEMLER 0.1. PROBLEMLER a herhangi bir nicelik says ise
0.1. PROBLEMLER 1 19.8. PROBLEMLER // 0.1 PROBLEMLER // 1. a herhangi bir nicelik says ise (i) a + 0 = a, a0 = 0, a 0 = 1 oldu unu gösteriniz. A³a daki kümelerin e³güçlülü ünden nicelik saylar için istenen
K12NET Eğitim Yönetim Sistemi
TEOG SINAVLARININ DEĞERLENDİRİLMESİ Yeni sınav sistemi TEOG, yani Temel Eğitimden Orta Öğretime Geçiş Sınavlarında öğrenciler, 6 dersten sınav olacaktır. Öğrencilere Türkçe, Matematik, T.C. İnkılap Tarihi
Bölüm 2 Programlama Dilleri 2.1 Programlama Dilleri ve C Bölüm ba³l nn aksine, burada programlama dillerinin çok uzun ve ilginç geli³im öykülerine girmeyecek ve onlarn tam snandrmasn yapmak gibi zor bir
Simülasyon Modellemesi
Simülasyon Modellemesi Doç. Dr. Mustafa Yüzükrmz [email protected] Ders -2: Metod ve Veri Analizi Contents 1 Metod Analizi 1 1.1 Giri³.................................. 1 1.2 Metod Müh.'de Sistematik
A = i I{B i : B i S} A = x A{B x A : B x S}
Bölüm 4 TOPOLOJ TABANI 4.1 TOPOLOJ TABANI Tanm 4.1.1. Bir S P(X) ailesi verilsin. S ye ait kümelerin her hangi bir bile³imine e³it olan bütün kümelerin olu³turdu u aileye S nin üretti i (do urdu u) aile
Genel bilgiler Windows gezgini Kes Kopyala Yapıştır komutları. 4 Bilinen Dosya Uzantıları
İÇERİK 2 Dosya ve Klasör İşlemleri 3 Giriş BİLGİ TEKNOLOJİLERİ VE UYGULAMALARI Windows 7 - Devam ÖĞR. GÖR. HASAN ALİ AKYÜREK http://www.hasanakyurek.com Sürümler Sürüm Karşılaştırmaları Masaüstü Görev
f 1 (H ) T f 1 (H ) = T
Bölüm 15 TIKIZLIK 15.1 TIKIZ UZAYLAR 15.1.1 Problemler 1. Her sonlu topolojik uzay tkzdr. 2. Ayrk bir topolojik uzayn tkz olmas için gerekli ve yeterli ko³ul sonlu olmasdr. 3. Ayn bir küme üzerinde S T
ndrgemel Dzler Ders Notlar
ndrgemel Dzler Ders Notlar c wwww.sbelian.wordpress.com Bu ders notunda diziler konusunun bir alt konusu olan First Order Recursions ve Second Order Recursions konular anlatlm³ ve bu konularla alakal örnekler
TEMEL KAVRAMLAR MATEMAT K. 6. a ve b birer do al say r. a 2 b 2 = 19 oldu una göre, a + 2b toplam kaçt r? (YANIT: 28)
TEMEL KAVRAMLAR 6. a ve b birer do al say r. a b = 19 oldu una göre, a + b toplam (YANIT: 8) 1. ( 4) ( 1) 6 1 i leminin sonucu (YANIT: ). ( 6) ( 3) ( 4) ( 17) ( 5) :( 11) leminin sonucu (YANIT: 38) 7.
Simülasyon Modelleme. Contents. 1 Çe³itli Araçlar. Doç. Dr. Mustafa Yüzükrmz [email protected]. Ders -4: Yerle³im Diyagramlar ve Analizler
Simülasyon Modelleme Doç. Dr. Mustafa Yüzükrmz [email protected] Ders -4: Yerle³im Diyagramlar ve Analizler çerik Contents 1 Çe³itli Araçlar 1 1.1 Pareto Analizi.............................
DİKKAT! SORU KİTAPÇIĞINIZIN TÜRÜNÜ "A" OLARAK CEVAP KÂĞIDINA İŞARETLEMEYİ UNUTMAYINIZ. SAYISAL BÖLÜM SAYISAL-2 TESTİ
ALES İlkbahar 007 SAY DİKKAT! SORU KİTAPÇIĞINIZIN TÜRÜNÜ "A" OLARAK CEVAP KÂĞIDINA İŞARETLEMEYİ UNUTMAYINIZ. SAYISAL BÖLÜM SAYISAL- TESTİ Sınavın bu testinden alacağınız standart puan, Sayısal Ağırlıklı
Soru Toplam Puanlama Alnan Puan
..04 No: Ad-Soyad: mza: Soru.. 3. 4. 5. 6. 7. 8. Toplam Puanlama 0 0 0 5 0 0 0 0 00 Alnan Puan 04043006. CEB RSEL TOPOLOJ ARASINAVI CEVAP ANAHTARI ( K NC Ö RET M) Not: Süre 90 Dakika. stedi iniz 7 soruyu
Binary Tree nedir?uygulamas nasl yaplr?
Yazar : Tu çe Kalkavan Web : tugcekalkavan.net [email protected] Bili³im Blo u Binary Tree nedir?uygulamas nasl yaplr? Bu bölümde veri yaplarnda önemli bir konu olan binary tree konusunu anlatmaya
Soyut Matematik Test A
1 Soyut Matematik Test A 1. A³a dakilerden hangisi do rudur? (a) * A B C(C B) A C) (b) A B C(C B) A C) (c) A B C(B C) A C) (d) A B C(B C) A C) (e) A B C(B C) (A C) 2. Her hangi bir A kümeler ailesi üzerinde
ANALOG LABORATUARI İÇİN BAZI GEREKLİ BİLGİLER
ANALOG LABORATUARI İÇİN BAZI GEREKLİ BİLGİLER Şekil-1: BREADBOARD Yukarıda, deneylerde kullandığımız breadboard un şekli görünmektedir. Bu board üzerinde harflerle isimlendirilen satırlar ve numaralarla
İşletim Sisteminin Katmanları
İşletim Sistemi Bilgisayar donanımının doğrudan denetimi ve yönetiminden, temel sistem işlemlerinden ve uygulama yazılımlarını çalıştırmaktan sorumlu olan sistem yazılımıdır. Bütün diğer yazılımların belleğe,
1.Temel Kavramlar 2. ÆÍlemler
1.Temel Kavramlar Abaküs Nedir... 7 Abaküsün Tarihçesi... 9 Abaküsün Faydaları... 12 Abaküsü Tanıyalım... 13 Abaküste Rakamların Gösterili i... 18 Abaküste Parmak Hareketlerinin Gösterili i... 19 2. lemler
ç- çe Tasarmlar Birdal eno lu ükrü Acta³ eno lu & Acta³ statistiksel Deney Tasarm Giri³ ki A³amal ç- çe Üç A³amal ç- çe l A³amal ç- çe
lar Birdal eno lu ükrü çindekiler 1 2 3 4 5 A³amal tasarmlar (hierarchical designs) olarak da bilinen iç-içe tasarmlarda (nested designs), ³u ana kadar gördü ümüz tasarmlardan farkl olarak iki veya ikiden
Olasılık ve İstatistik Dersinin Öğretiminde Deney ve Simülasyon
Olasılık ve İstatistik Dersinin Öğretiminde Deney ve Simülasyon Levent ÖZBEK Fikri ÖZTÜRK Ankara Üniversitesi Fen Fakültesi İstatistik Bölümü Sistem Modelleme ve Simülasyon Laboratuvarı 61 Tandoğan/Ankara
C++ Operatörler (Operators)
C++ Operatörler (Operators) Konular Operatörler o Aritmetiksel (Matematiksel) Operatörler o Karşılaştırma Operatörleri o Mantıksal Operatörler o Atama Operatörleri o Bit Düzeyinde Operatörler o Özel Amaçlı
ÜNİTE 5 KESİKLİ RASSAL DEĞİŞKENLER VE OLASILIK DAĞILIMLARI
ÜNİTE 5 KESİKLİ RASSAL DEĞİŞKENLER VE OLASILIK DAĞILIMLARI 1 Rassal Değişken Bir deney ya da gözlemin şansa bağlı sonucu bir değişkenin aldığı değer olarak düşünülürse, olasılık ve istatistikte böyle bir
BİT ini Kullanarak Bilgiye Ulaşma ve Biçimlendirme (web tarayıcıları, eklentiler, arama motorları, ansiklopediler, çevrimiçi kütüphaneler ve sanal
BİT ini Kullanarak Bilgiye Ulaşma ve Biçimlendirme (web tarayıcıları, eklentiler, arama motorları, ansiklopediler, çevrimiçi kütüphaneler ve sanal müzeler vb.) Bilgi ve iletişim teknolojileri, bilgiye
BÖLÜM 1. stanbul Kültür Üniversitesi. Fonksiyonlar - Özellikleri ve Limit Kavram. ³eklinde tanmlanan fonksiyona Dirichlet fonksiyonu ad verilir.
BÖLÜM 1 0, Q 1. f() = 1, R/Q, Fonksiyonlar - Özellikleri ve Limit Kavram ³eklinde tanmlanan fonksiyona Dirichlet fonksiyonu ad verilir. Buna göre a³a da verilen tanm bölgeleri altnda görüntü cümlelerini
Nesneye Yönelik Programlama-JAVA, Ders sorumlusu Yrd.Doç.Dr.Hilmi KU ÇU
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 13/11/2009 devam Dokümantasyon & Aç klamalar Üç türlü yöntem vard r: // Bu i aret sat r sonuna kadar olan tüm ifadeyi aç
DENEY 2: PROTOBOARD TANITIMI VE DEVRE KURMA
A. DENEYİN AMACI : Protoboard kullanımını öğrenmek ve protoboard üzerinde basit direnç devreleri kurmak. B. KULLANILACAK ARAÇ VE MALZEMELER : 1. DC güç kaynağı, 2. Multimetre, 3. Protoboard, 4. Değişik
Örnek...6 : Yandaki bölme işleminde A ve n birer doğal sayıdır. A nın alabileceği en küçük ve en bü yük değerleri bulunu z.
MODÜLER ARİTMETİK ( BÖLME BÖLÜNEBİLME KURALLARI ÖKLİT ALGORİTMASI DEĞERLENDİRME ) BÖLME İŞLEMİ VE ÖZELLİKLERİ A, B, C, K doğal sayılar ve B olmak üzere, BÖLÜNEN A B C BÖLEN BÖLÜM Örnek...5 : A, B, C birbirinden
MC 311/ANAL Z III ARA SINAV I ÇÖZÜMLER
MC 311/ANAL Z III ARA SINAV I ÇÖZÜMLER (1) A³a daki her bir önermenin do ru mu yanl³ m oldu unu belirleyiniz. Do ruysa, gerekçe gösteriniz; yanl³sa, bir kar³-örnek veriniz. (a) (a n ) n N dizisi yaknsak
15.01.2016 SENATO 2016/1-IV
15.01.2016 SENATO 2016/1-IV BİTLİS EREN ÜNİVERSİTESİ ÖĞRENCİ İŞLEMLERİ YÖNERGESİ BİRİNCİ BÖLÜM Amaç, Kapsam, Dayanak ve Tanımlar Amaç MADDE 1 (1) Bu Yönergenin amacı, öğrenci işlemlerine ilişkin usul ve
Tan mlar: Ürün tan mlar, Kategori tan mlar, Ödeme seçenekleri, Salon yerle im düzeni tan mlar n n yap lmas n sa lar.
BiberPOS Ana Menüsü: Sipari Al: Sipari alma ve ödeme i lemleri yap l r Kapat: Program kapat r. Tan mlar: Ürün tan mlar, Kategori tan mlar, Ödeme seçenekleri, Salon yerle im düzeni tan mlar n n yap lmas
Bilgisayar Uygulamaları PSİ105
Bilgisayar Uygulamaları PSİ105 Yrd.Doç.Dr. Serdar YILMAZ Kaynak: Marmara Üniversitesi Teknik Eğitim Fakültesi Bilgisayar Kursu Ders Notları, Kasım 2007 1 2 3 4 5 6 7 8 9 10 11 12 Başlat Düğmesi Bilgisayarınızı
İTÜ GELİŞTİRME VAKFI ÖZEL Dr. NATUK BİRKAN İLKOKULU VE ORTAOKULU. OkulNET Kullanım Kılavuzu
İTÜ GELİŞTİRME VAKFI ÖZEL Dr. NATUK BİRKAN İLKOKULU VE ORTAOKULU OkulNET Kullanım Kılavuzu EKİM 2012 1 İçindekiler GİRİŞ...3 ANASAYFA...3 EĞİTİM...4 SINAVLAR...6 ŞUBEM...9 KİŞİSEL BİLGİLER...10 AJANDA...10
T.C. EGE ÜNİVERSİTESİ URLA DENİZCİLİK MESLEK YÜKSEKOKULU STAJ YÖNERGESİ
T.C. EGE ÜNİVERSİTESİ URLA DENİZCİLİK MESLEK YÜKSEKOKULU STAJ YÖNERGESİ Amaç Madde 1: Bu yönergenin amacı; Ege Üniversitesi Urla Denizcilik Meslek Yüksekokulu nda öğrenim gören öğrencilerin eğitim-öğretim
OYUN GELİŞTİRME AŞAMALARI-I. Oyununuzun senaryosunu kısaca tanıtınız/ amacınıda belirtiniz:
OYUN GELİŞTİRME AŞAMALARI-I Oyununuzun senaryosunu kısaca tanıtınız/ amacınıda belirtiniz: Oyunumuz nesnelerin sürükle bırak özelliği ile kendi İngilizce isimlerinin üzerlerine bırakılmasını esas almaktadır.
PROJE RAPORU TANJANT Q_MATR S
PROJE RAPORU TANJANT Q_MATR S 1 Ç NDEK LER Ç NDEK LER çindekiler 1 G R 3 1.1 Projenin Amac............................ 3 YÖNTEM 3.1 Fibonacci Saylar........................... 3. Altn Oran ve Altn Matris.....................
Com Donatı v5 Kurulum ve Hata Çözümleri İçindekiler
Com Donatı v5 Kurulum ve Hata Çözümleri İçindekiler Com Donatı Kurulum İşlemleri Hasp Driver Kurulumu Hasp Hatası Alıyorum - Unable to Access Sentinel Hasp Run-Time Environment (H0033) - Feature Not Found
OYUN GELİŞTİRME AŞAMALARI-I
OYUN GELİŞTİRME AŞAMALARI-I Oyununuzun senaryosunu kısaca tanıtınız/ amacınıda belirtiniz: Oyun aşamalı bir araba oyunudur.oyuncunun yönlendirmesiyle ilerleyen araç engellerle ve Sorularla oluşturulmuş
Sürücü Gönder. Yönetici Kılavuzu
Sürücü Gönder Yönetici Kılavuzu Ocak 2013 www.lexmark.com Genel Bakış 2 Genel Bakış Sürücü Gönder, belirli bir yazıcı modelinin yazıcı sürücüsünü almanızı sağlar. Uygulama, size yükleme talimatlarını ve
Fizik ve Ölçme. Fizik deneysel gözlemler ve nicel ölçümlere dayanır
Fizik ve Ölçme Fizik deneysel gözlemler ve nicel ölçümlere dayanır Fizik kanunları temel büyüklükler(nicelikler) cinsinden ifade edilir. Mekanikte üç temel büyüklük vardır; bunlar uzunluk(l), zaman(t)
B05.11 Faaliyet Alanı
82 Yrd. Doç. Dr. Yakup EMÜL, Bilgisayar Programlama Ders Notları (B05. C de Fonksiyonlar) Bir tanıtıcının faaliyet alanı, tanıtıcının kod içinde kullanılabileceği program kısmıdır. Örneğin, bir blok içinde
ENF - 102 TEMEL BİLGİSAYAR BİLİMLERİ. 2014 2015 Eğitim/Öğretim Yılı Bahar Dönemi DÖNEM SONU LAB. ÖDEV TESLİM DUYURUSU
ENF - 102 TEMEL BİLGİSAYAR BİLİMLERİ 2014 2015 Eğitim/Öğretim Yılı Bahar Dönemi DÖNEM SONU LAB. ÖDEV TESLİM DUYURUSU İÇİNDEKİLER 1. Ön Bilgi... 1 2. Çalışmaları Kimler Teslim Edecekler?... 1 3. Çalışmalar
BÖLÜM 1. Matematiksel ndüksiyon Prensibi
BÖLÜM 1 Matematiksel ndüksiyon Prensibi Matematiksel indüksiyon prensibini kullanarak a³a daki e³it(siz)liklerin her n N için gerçeklendi ini ispatlaynz. 1. 1 2 + 2 2 + 3 2 + + n 2 = n(n+1)(2n+1) 6 2.
KAPSAMLI İÇERİK SADELEŞTİRİLMİŞ ARAMA MOTORU YENİLİKÇİ BİLGİ İŞLEME TEKNOLOJİSİ PRATİK GÖRÜNTÜLEME ARAÇLARI MOBİL ERİŞİM
BAŞLANGIÇ REHBERİ KAPSAMLI İÇERİK SADELEŞTİRİLMİŞ ARAMA MOTORU YENİLİKÇİ BİLGİ İŞLEME TEKNOLOJİSİ PRATİK GÖRÜNTÜLEME ARAÇLARI MOBİL ERİŞİM LEXPERA Yeni Nesil Hukuk Bilgi Sistemi, hukuki araştırmalarınızı
Şekil 1. Sistem Açılış Sayfası
Sistemin Kullanım Amacı E-Tedarik, Türkiye Petrolleri nin doğrudan alım süreci sırasında firmalardan teklif alma kısmının elektronik ortama aktarılması amacıyla oluşturulmuş bir web tabanlı sistemdir.
x = [x] = [x] β = {y (x,y) β} (8.5) X = {x x X}. x,y X [(x = y) (x y = )]. b(b [x]) b [y] [x] [y] (8.8)
Bölüm 8 DENKL K BA INTILARI 8.1 DENKL K BA INTISI 8.1.1 E³itlik Kavramnn Genelle³mesi Matematikte ve ba³ka bilim dallarnda, birbirlerine e³it olmayan, ama e³itli e benzer niteliklere sahip nesnelerle sk
Bir-Yönlü ANOVA (Tamamen Rasgele Tasarm)
Bir-Yönlü ANOVA (Tamamen Rasgele Tasarm) Birdal eno lu ükrü Acta³ çindekiler 1 Giri³ Giri³ 2 3 4 LS Tahmin Edicilerinin Özellikleri 5 Genel Kareler Toplamnn Parçalan³ ndirgenmi³ Model-Tam Model Yakla³m
BİR SAYININ ÖZÜ VE DÖRT İŞLEM
ÖZEL EGE LİSESİ BİR SAYININ ÖZÜ VE DÖRT İŞLEM HAZIRLAYAN ÖĞRENCİ: Sıla Avar DANIŞMAN ÖĞRETMEN: Gizem Günel İZMİR 2012 İÇİNDEKİLER 1. PROJENİN AMACI.. 3 2. GİRİŞ... 3 3. YÖNTEM. 3 4. ÖN BİLGİLER... 3 5.
Soru Toplam Puanlama Alnan Puan
26.11.2013 No: Ad-Soyad: mza: Soru 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Toplam Puanlama 15 15 15 15 15 15 15 15 15 15 105 Alnan Puan 405024142006.1 CEB RSEL TOPOLOJ ARASINAVI CEVAP ANAHTARI SORULARI (ÖRGÜN Ö
(sf) F C = [(s,f) sf] x [0,1] = (sf)(x) = sf(x)
Bölüm 13 MATEMAT KSEL YAPILAR 13.1 YAPI KAVRAMI Ça da³ Matematik kümeleri, kümeler üzerindeki yaplar, yaplar arasndaki dönü³ümleri inceler. Buraya dek ö e, küme, i³lem, fonksiyon kavramlarn kullandk. Bunlar
BQTEK SMS Asistan. Kullanım Kılavuzu. Doküman Versiyon: 1.0 09.05.2016 BQTEK
Kullanım Kılavuzu Doküman Versiyon: 1.0 09.05.2016 BQTEK İçindekiler İçindekiler... 2 Genel Bilgi... 3 Uygulamanın İndirilmesi... 3 iphone için... 3 Android için... 3 Windows ve Mac için... 3 Uygulamanın
Çevrimiçi paylaşım 3.1. Baskı 1
Çevrimiçi paylaşım 3.1 Baskı 1 2008 Nokia telif hakkıdır. Tüm hakları mahfuzdur. Nokia, Nokia Connecting People ve Nseries, Nokia Corporation'ın ticari veya tescilli ticari markalarıdır. Nokia tune, Nokia
ÖĞRENME FAALĠYETĠ 6 ÖĞRENME FAALĠYETĠ 6. 6. NESNE ĠġLEMLERĠ
ÖĞRENME FAALĠYETĠ 6 AMAÇ ÖĞRENME FAALĠYETĠ 6 Bu faaliyette verilen bilgiler ile belgeye uygun nesne iģlemlerini (Ģekil, resim, grafik, metin kutusu vb.) planlı ve hatasız yapabileceksiniz. ARAġTIRMA Kelime
AKSARAY ÜNİVERSİTESİ. Amaç, Kapsam, Dayanak ve Tanımlar
AKSARAY ÜNİVERSİTESİ ÖNLİSANS VE LİSANS DÜZEYİNDEKİ PROGRAMLAR ARASINDA YATAY GEÇİŞ ESASLARINA İLİŞKİN YÖNERGE Amaç ve Kapsam MADDE 1 BİRİNCİ BÖLÜM Amaç, Kapsam, Dayanak ve Tanımlar Bu Yönergenin amacı,
ISBN Sertifika No: 11748
ISN - 978-0--- Sertifika No: 78 GENEL KOORDİNTÖR: REMZİ ŞHİN KSNKUR REDKTE: REMZİ ŞHİN KSNKUR SERDR DEMİRCİ - SRİ ŞENTÜRK SERVET SVŞ ÇETİN as m Yeri: UMUT MTCILIK - MERTER / STNUL u kitab n tüm bas m ve
Epay, Turkcell MobilÖdeme Altyaps
Turkcell Epay, Turkcell Epay Firmas için geli³tirdi imiz, Turkcell MobilÖdeme Sistemini kullanan platform Deniz Bahadr GÜR M.Onur YALAZI Özgür Web Teknolojileri Günleri, 2010 Anahatlar Turkcell 1 2 Turkcell
BİLGİ TEKNOLOJİLERİ VE İLETİŞİM KURULU KARARI
BİLGİ TEKNOLOJİLERİ VE İLETİŞİM KURULU KARARI Karar Tarihi :22.02.2011 Karar No :2011/DK-10/91 Gündem Konusu :İnternetin Güvenli Kullanımı. KARAR : 5809 sayılı Kanunun 4 üncü 6 ncı ve 50 inci maddeleri
POL NOMLAR. Polinomlar
POL NOMLAR ÜN TE 1. ÜN TE 1. ÜN TE 1. ÜN TE 1. ÜN T POL NOMLAR Polinomlar 1. Kazan m: Gerçek kat say l ve tek de i kenli polinom kavram n örneklerle aç klar, polinomun derecesini, ba kat say s n, sabit
İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 1 DERSİ LAB. ÖDEVİ
İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 1 DERSİ LAB. ÖDEVİ AD SOYAD : TESLİM TARİHİ : OKUL NO : TESLİM SÜRESİ : 1 hafta Ödev No : 6 *********(ilk 4 soru çıktı üzerinde
SİRKÜLER İstanbul, 01.02.2016 Sayı: 2016/01. Konu: E-DEFTER GÖRÜNTÜLEYİCİ PROGRAMI İLE SÖZ KONUSU PROGRAMA İLİŞKİN KULLANIM KILAVUZU YAYINLANMIŞTIR
SİRKÜLER İstanbul, 01.02.2016 Sayı: 2016/01 Konu: E-DEFTER GÖRÜNTÜLEYİCİ PROGRAMI İLE SÖZ KONUSU PROGRAMA İLİŞKİN KULLANIM KILAVUZU YAYINLANMIŞTIR Gelir İdaresi Başkanlığı nın www.edefter.gov.tr internet
ETKİLEŞİMLİ TAHTA KORUMA SİSTEMİ KURULUM
1. Sistem 3 bileşenden oluşur a. Sunucu b. Koruma yazılımı c. Mobil anahtar ETKİLEŞİMLİ TAHTA KORUMA SİSTEMİ KURULUM Sunucu yazılımı: sunucu yazılımı öncelikle yerel ağda et (etkileşimli tahtaların) bağlı
Modem ve Yerel Ağ Kullanım Kılavuzu
Modem ve Yerel Ağ Kullanım Kılavuzu Telif Hakkı 2009 Hewlett-Packard Development Company, L.P. Bu belgede yer alan bilgiler önceden haber verilmeksizin değiştirilebilir. HP ürünleri ve hizmetlerine ilişkin
SÜRE BİLİŞİM TEKNOLOJİLERİ ÜNİTE 1: : BİLGİ VE TEKNOLOJİ DERS SAATİ: 7
7. 30Ekim - 2Kasım 202 6. AFTA 22-23Ekim 202 5. 5-9 Ekim 202 4. 8-2 Ekim 202 3. -5 Ekim 202 EYLÜL 2. 24-28 Eylül 202 EYLÜL. 7-2 Eylül 202 202 203 ÖĞRETİM YILI BİLİŞİM TEKNOLOJİLERİ ÜNİTE : : BİLGİ VE TEKNOLOJİ
BIM BUILDING INFORMATION MODELING YAPI BİLGİ MODELİ
BIM BUILDING INFORMATION MODELING YAPI BİLGİ MODELİ S u n u m ö z e t i 1. Bölüm: Genel tanımlar 2. Bölüm: BIM e gereksinim 3. Bölüm: Birlikte çalışabilirlik ve BIM veri standardı 4. Bölüm: BIM verisi
İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BİLGİSAYAR SİSTEMLERİ LABORATUARI YÜZEY DOLDURMA TEKNİKLERİ
İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BİLGİSAYAR SİSTEMLERİ LABORATUARI YÜZEY DOLDURMA TEKNİKLERİ Deneyde dolu alan tarama dönüşümünün nasıl yapıldığı anlatılacaktır. Dolu alan tarama
Akademik Personel ve Lisansüstü Eğitimi Giriş Sınavı. ALES / Đlkbahar / Sayısal II / 22 Nisan 2007. Matematik Soruları ve Çözümleri
Akademik Personel ve Lisansüstü Eğitimi Giriş Sınavı ALES / Đlkbahar / Sayısal II / Nisan 007 Matematik Soruları ve Çözümleri 1. 3,15 sayısının aşağıdaki sayılardan hangisiyle çarpımının sonucu bir tam
Analiz aşaması sıralayıcı olurusa proje yapımında daha kolay ilerlemek mümkün olacaktır.
Analiz Raporu Kısa Özet Her geçen gün eczanecilik sektörü kendi içerisinde daha da yarışır hale geliyor. Teknolojinin getirdiği kolaylık ile eczane otomasyonu artık elinizin altında. Çoğu eczacılar hastalarına
Gümrük Müsteşarlığından: GÜMRÜK GENEL TEBLİĞİ (ULUSLARARASI ANLAŞMALAR) (SERİ NO: 7)
10 Nisan 2008 PERŞEMBE Resmî Gazete Sayı : 26843 TEBLİĞ Gümrük Müsteşarlığından: GÜMRÜK GENEL TEBLİĞİ (ULUSLARARASI ANLAŞMALAR) (SERİ NO: 7) Amaç MADDE 1 (1) Bu Tebliğin amacı, Türkiye ile Avrupa Topluluğu
SİRKÜLER. 1.5-Adi ortaklığın malları, ortaklığın iştirak halinde mülkiyet konusu varlıklarıdır.
SAYI: 2013/03 KONU: ADİ ORTAKLIK, İŞ ORTAKLIĞI, KONSORSİYUM ANKARA,01.02.2013 SİRKÜLER Gelişen ve büyüyen ekonomilerde şirketler arasındaki ilişkiler de çok boyutlu hale gelmektedir. Bir işin yapılması
SOYUT MATEMAT K DERS NOTLARI. Yrd. Doç. Dr. Hüseyin B LG Ç
SOYUT MATEMAT K DERS NOTLARI Yrd. Doç. Dr. Hüseyin B LG Ç Kahramanmara³ Sütçü mam Üniversitesi FenEdebiyat Fakültesi Matematik Bölümü Eylül 2010 çindekiler 1 Önermeler ve spat Yöntemleri 1 2 Kümeler 13
C/C++ DERS KONULARI. Kaynaklar 1. C Programlama dili, Kemal Yarcı 2. C/C++, Gürcan Banger 3. C ve Siz, Fatih Ekici
1 1. Problem çözme ve algoritmalar 2. Veri Tipleri 3. Döngüler ve Kontrol komutları 4. Diziler ve Karakter dizileri 5. Pointers (İşaretçiler) 6. Fonksiyonlar 7. Structure & Union 8. Dosya Giriş/Çıkış Fonksiyonları
YÜKSEKÖĞRETİM KURUMLARI ENGELLİLER DANIŞMA VE KOORDİNASYON YÖNETMELİĞİ (1) BİRİNCİ BÖLÜM. Amaç, Kapsam, Dayanak ve Tanımlar
YÜKSEKÖĞRETİM KURUMLARI ENGELLİLER DANIŞMA VE KOORDİNASYON YÖNETMELİĞİ (1) BİRİNCİ BÖLÜM Amaç, Kapsam, Dayanak ve Tanımlar Amaç MADDE 1 (Değişik:RG-14/2/2014-28913) (1) Bu Yönetmeliğin amacı; yükseköğrenim
MARMARA ÜNĠVERSĠTESĠ YABANCI DĠL VE TÜRKÇE HAZIRLIK SINIFLARI EĞĠTĠM-ÖĞRETĠM ve SINAV YÖNERGESĠ Senato: 13 Ekim 2009 / 274-11
MARMARA ÜNĠVERSĠTESĠ YABANCI DĠL VE TÜRKÇE HAZIRLIK SINIFLARI EĞĠTĠM-ÖĞRETĠM ve SINAV YÖNERGESĠ Senato: 13 Ekim 2009 / 274-11 Amaç ve kapsam MADDE 1 (1) Bu Yönergenin amacı, Marmara Üniversitesi Yabancı
OPERATÖRLER BÖLÜM 4. 4.1 Giriş. 4.2. Aritmetik Operatörler
BÖLÜM 4. OPERATÖRLER 4.1 Giriş Turbo Pascal programlama dilinde de diğer programlama dillerinde olduğu gibi operatörler, yapılan işlem türüne göre aritmetik, mantıksal ve karşılaştırma operatörleri olmak
Soyut Matematik Test B
1 Soyut Matematik Test B 1. Hangisi tümel (tam, linear) sralama ba ntsdr? (a) Yansmal, antisimetrik, geçi³ken ve örgün olan ba ntdr. (b) Yansmal, simetrik, geçi³ken ve örgün olan ba ntdr. (c) Yansmaz,
LG BİREYSEL AKILLI TELEFON KAMPANYA TAAHHÜTNAMESİ
LG BİREYSEL AKILLI TELEFON KAMPANYA TAAHHÜTNAMESİ Turkcell İletişim Hizmetleri A.Ş. ye; Turkcell İletişim Hizmetleri A.Ş. ( TURKCELL ) tarafından 01.07.2013 tarihinden itibaren düzenlemekte olan LG Bireysel
Karakter katarları ile ilgili fonksiyonlar içerir Yerel kayan noktalı sayılar tanımlanır
stringh floath Karakter katarları ile ilgili fonksiyonlar içerir Yerel kayan noktalı sayılar tanımlanır 32 Sorgulama İfadesi - if Deyimi (5 Hafta) Bu deyim sorgulamanın tek basamakta yapılacağı yerlerde
ARA SINAV II. (1) (x k ) k N, R n içinde yaknsak ve limiti x olan bir dizi olsun. {x} = oldu unu gösteriniz.
MC 411/ANAL Z IV ARA SINAV II ÇÖZÜMLER 1 x k k N, R n içinde yaknsak iti x olan bir dizi olsun. {x} = {x m m k} k=1 Çözüm. Her k N için A k := {x m m k} olsun. x k k N dizisinin iti x oldu undan, A k =
AÖĞRENCİLERİN DİKKATİNE!
KİTPÇIK TÜRÜ T.C. MİLLÎ EĞİTİM BKNLIĞI ÖLÇME, DEĞERLENDİRME VE SINV HİZMETLERİ GENEL MÜDÜRLÜĞÜ 8. SINIF MTEMTİK 016 8. SINIF. DÖNEM MTEMTİK DERSİ MERKEZÎ ORTK SINVI 7 NİSN 016 Saat: 10.10 dı ve Soyadı
Ölçme Bilgisi Ders Notları
1. ÖLÇÜ BİRİMLERİ Ölçme Bilgisi: Sınırlı büyüklükteki yeryüzü parçalarının ölçülmesi, haritasının yapılması ve projelerdeki bilgilerin araziye uygulanması yöntemleri ile bu amaçlarla kullanılacak araç
KAVRAMLAR. Büyüme ve Gelişme. Büyüme. Büyüme ile Gelişme birbirlerinden farklı kavramlardır.
KAVRAMLAR Büyüme ve Gelişme Büyüme ile Gelişme birbirlerinden farklı kavramlardır. Büyüme Büyüme, bedende gerçekleşen ve boy uzamasında olduğu gibi sayısal (nicel) değişikliklerle ifade edilebilecek yapısal
