d programlama dili

726
sürüm: r625, 2013-09-22 D Programlama Dili D programlama dili ile bilgisayar programcılığı Ali Çehreli D.ershane Serisi

Upload: claire-barker

Post on 25-Nov-2015

194 views

Category:

Documents


0 download

DESCRIPTION

D programlama dili, C++ dilinden daha yüksek seviyede ve hedef alınan işletim sistemiyle donanımlara göre uygulama yazılmasını kolaylaştıran bir "sistem ve uygulama" dilidir.

TRANSCRIPT

  • srm: r625, 2013-09-22

    D Programlama DiliD programlama dili ilebilgisayar programcl

    Ali ehreli

    D.ershane Serisi

    www.princexml.comPrince - Non-commercial LicenseThis document was created with Prince, a great way of getting web content onto paper.

  • Copyright 2009-2012 Ali ehreli0.1

    Kaynak gstermek artyla istediiniz blmlerini baka sitelere kopyalayabilirsiniz.

    Kiisel kullanm iin olmak artyla, istediiniz blmn istediiniz gibi kopyalayabilirsiniz.

    Ddili.org icerigi by Ali Cehreli is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License.Based on a work at digitalmars.com.Permissions beyond the scope of this license may be available at http://ddili.org/copyright.html.

    "D Programlama Dili" PDF Dosyas0.2

    Bu derslerin en yeni halini bir PDF dosyas olarak u adresten indirebilirsiniz:

    http://ddili.org/ders/d/D_Programlama_Dili.pdf

    PDF dosyasnn geliimi0.2.1

    r618, 2013-09-19: 'okuzlular' ve 'Ayrntl ablonlar' blmleri geniletildi. r596, 2013-07-09: 'Aralklar' blmndeki kodlar UFCS'ten yararlanacak biimde

    deitirildi. r557, 2013-05-21: 'is fadesi' blm 'Koullu Derleme' blmnden ayrld r539, 2013-01-31: 'lev arma Ortak Sz Dizimi (UFCS)' ve 'alias this' blmleri r519, 2012-11-09: toHash() hesaplar dzeltildi. r505, 2012-09-15: 'Kurucu ve Dier zel levler' ve 'le Ykleme' blmlerinde ok

    sayda deiiklik. r501, 2012-08-23: clear'in isminin 'destroy' olarak deimesine uygun deiiklikler. r491, 2012-08-09: 'Deimezlik' blmne 'const parametre mi, immutable parametre

    mi?' bal eklendi. r440, 2012-04-12: 'assert ve enforce' blm gelitirildi; 'E Zamanl Programlama'

    blm gelitirildi ve ikiye ayrld. r428, 2012-03-28: 'scope' deyimleri 'Hata Ynetimi' blmnden kartld ve yeni bir

    blm haline getirildi r408, 2012-03-20: 'lev Gstergeleri, simsiz levler, ve Temsilciler' blmne isimsiz

    ilevlerin yeni => sz dizimi eklendi, ve temsilcilerin nesne ve ye ilevlerden deoluturulabildikleri anlatld

    r396, 2012-03-13: 'const ve immutable' adl blmn 'Deimezlik' ad altnda batanyazlmas

    r382, 2012-02-26: Eleme tablolarnn .byKey(), .byValue(), ve .get() nitelikleri ve gotodeyiminin switch deyimindeki eit kullanm

    r369, 2012-02-14: 'Kout lemler' blmnn geniletilmesi r282, 2011-11-13: foreach dngsnn diziler dnda sayal kullanm ve eitli

    dzeltmeler r250, 2011-07-08: le yklemenin yeni sz dizimine dntrld, baz blmlerin

    problemleri eklendi, vs. r243, 2011-07-05: 'Bellek Ynetimi' blmne realloc() eklendi

    Copyright 2009-2012, http://ddili.org 2

  • r240, 2011-07-04: 'Bellek Ynetimi' blm r235, 2011-06-26: Emekliye ayrlan 'scope' belirtecinin yerine 'clear' ve 'scoped' r233, 2011-06-18: 'Tr Nitelikleri' blm r231, 2011-06-18: 'E Zamanl Programlama' blm r206, 2011-06-04: 'Kout lemler' blm r178, 2011-05-19: 'okuzlular' blm r175, 2011-05-18: 'Baka Aralk Olanaklar' blm r169, 2011-05-06: 'Aralklar' blm r155, 2011-03-21: std.cstream yerine std.stdio ve ok sayda dzeltme r149, 2011-02-04: Dilimlerin gsterildii blm 'Baka Dizi Olanaklar' yeni balyla

    geniletildi r132, 2010-07-21: eitli dzeltmeler: 'immutable char[]' yerine 'immutable(char)[]',

    Throwable ve Error yerine Exception, vs. r124, 2010-06-08: 'Hata Atma ve Yakalama' blmne ek: scope(exit), scope(success), ve

    scope(failure) r121, 2010-06-05: eitli dzeltmeler r118, 2010-05-31: 'Katmalar' blm r114, 2010-05-28: 'Dier lev Olanaklar' blm r109, 2010-05-25: 'Ayrntl ablonlar' blm r107, 2010-05-07: 'Etiketler' blm r104, 2010-05-05: 'Birlikler' blm r101, 2010-05-04: 'Yap ve Snflarda foreach' blm r99, 2010-05-01: 'lev Gstergeleri ve Kapamalar' blm r96, 2010-04-30: 'Koullu Derleme' blm r81, 2010-04-06: 'Bit lemleri' blm r75, 2010-04-02: 'Gstergeler' blm ve ncesi

    Srmlerdeki farkllklar ddili.org'un proje sayfasnda grebilirsiniz.

    Copyright 2009-2012, http://ddili.org 3

  • Teekkr1

    Bu derslerin yazm srasnda beni bir sre btnyle kaybedeceklerini bandan bilen, bunuanlayla karlayan, ve heyecanm paylaan eime ve kzma ok teekkr ederim.

    Bu derslerin doruluu ve anlalrl byk lde Ddili Forum yelerinin katklarnabaldr. Yeni dersler hep nce o forumda duyuruldular, ve ancak yelerin nerileri dikkatealndktan sonra genel kullanma sunuldular. Bu dersleri yazma srecinde heyecanm uyanktuttuklar iin Ddili Forum yelerine teekkr ederim.

    Mert Ataol, Zafer elenk, ve Salih Diner kitabn her satrn byk bir titizlikle gzdengeirdiler ve dzeltmeler nerdiler. Can Alpay ifti'nin ve Faruk Erdem ncel'in kitabn veddili.org'un geliiminde byk katklar oldu.

    Ergin Gney, Jordi Sayol, David Herberth, Andre Tampubolon, Gour-Gadadhara Dasa,Raphal Jakse, Andrej Mitrovic, Johannes Pfau, Jerome Sniatecki, Jason Adams, Paul Jurczak, kitabn ngilizce evirisi zerinde dzeltmeler ve eklemeler nerdiler.Bunlar kitabn Trkesine de aktarld.

    Teekkr

    Copyright 2009-2012, http://ddili.org 4

  • Tantm2

    Derslere balamadan nce baz noktalarda anlamamz gerekiyor.

    Siz: Her ne kadar D iin C, C++, ve Java gibi dillerdeki deneyimler yararl olsa da, buradakidersler D dilini ve genel olarak programcl hibir deneyim varsaymadan, temeldenanlatrlar. Eer programcl Trke kaynaklardan renmeyi seviyorsanz, buras sizegre... Hogeldiniz! :o)

    Hazrlk: Bu dersleri izleyebilmek iin D programlar yazacak bir ortama ihtiyacnz olacak.Bunun iin en azndan unlar gerekir:

    bir metin dzenleyici bir D derleyicisi Trke harfleri destekleyen bir ortam

    Metin dzenleyiciyi ve derleyiciyi ayr ayr kurmak yerine, onlarn ikisini ve baka aralar daieren bir gelitirme ortam da kurabilirsiniz. Bu konuda kurulum sayfasndanyararlanabilirsiniz. D dilini metin dzenleyici veya derleyici olmadan renemezsiniz. dmdderleyicisini kurmay ve program derlemeyi ilerleyen blmlerde greceiz.

    Dersler btnyle Trke programlardan olutuklar iin, altnz ortamda Trkeharflerin doru olarak grnmeleri gerekir. Bu konuda Windows ortam iin yardm almakiin Trke harflerin DOS pencerelerinde gsterilmesini anlatan forum konusundanyararlanabilirsiniz. (zellikle 2-a ve 2-b maddeleri.)

    Derslerin yaps: Her ders, olabildiince az sayda kavram rneklerle anlatyor. Hersayfann sonunda rencinin o zamana kadar rendikleriyle programlayabilecei problemlerbulunuyor. renci kendisininkiyle karlatrabilsin diye her problemin zm de veriliyor.Yerinizi kaybetmemeniz iin zmler ayr bir tarayc sayfasnda alrlar. Kitabn PDFdosyasnda ise btn zmler art arda en sonda bulunuyorlar.

    Bir derste anlatlan kavramlar anlamadan bir sonrakine gememenizi neririm. Eeranlalmayan kavramlar kalyorsa; bu sizden deil, derslerdeki eksikliklerden kaynaklanyorolabilir. O zaman ltfen sesinizi Ders Aras forumunda duyurun ve derslerin geliimineyardmc olun.

    Derslerde pencereli programlar anlatlmyor: Pencereli (grsel) programlar ok daha hove baz durumlarda ok daha kullanldrlar. Buna ramen, bu dersler grsel programyazmay anlatmazlar. nk dili renmek iin pencereler kullanmak gerekmez. Hatta grselprogram yazmak iin kullanlan ktphanelerin tasarmlar dilin kavramlaryla karabilir vedilin renimini gletirebilir. Bu yzden, bu dersler D dilini btnyle komut satrndanalan programlarla anlatrlar. D'yi ve standart ktphanesi Phobos'u bir kere rendiktensonra, zaten siz istediiniz grsel ktphane ile istediiniz pencereli programyazabileceksiniz.

    Ders RSS beslemesi: Bu blm hl yazm aamasnda olduu iin, eklenen yeni derssayfalarndan haberdar olmak iin RSS beslemesinden yararlanabilirsiniz.

    Szlk: Her sayfada, o derste kullanlan terimleri ieren bir mini szlk bulunuyor. Bylecederste geen terimleri btn szl amanz gerekmeden hzlca hatrlayabileceksiniz.(Yerinizi kaybetmemeniz iin btn szlk ayr bir tarayc sayfasnda alr.)

    Ders Aras forumu: Programlama dilleri bakalaryla paylanca ok daha zevklidir. D dilinirenenlerin forumu olan Ders Aras'na katln ve varsa sorularnz sorun, veya yenibalayanlara siz yardmc olun.

    Tantm

    Copyright 2009-2012, http://ddili.org 5

  • Bir rica: Bu derslerin yararl ve kullanl olabilmesi sizin katknza bal. Yazarn kafasndakurgulad anlatm yntemi renmeye uygun olmayabilir. Ltfen grdnz her trlyanl ve eksii en ksa zamanda yazara bildirin. Teekkrler!

    Yazar: Ali ehreli

    CV: http://acehreli.org/resume.html Kendisiyle Ceviz.net syleisi ve zmir'de Sanat syleisi Kendisine Ceviz.net'in C ve C++ forumunda veya Ddili Forum'da rastlayabilirsiniz [email protected] adresinden ulaabilirsiniz

    Tantm

    Copyright 2009-2012, http://ddili.org 6

  • Programclk3

    Programcln doru tanmnn ne olduu konusunda tam bir anlama yoktur. Bu yazarasorarsanz, programclk en ok zanaattr.

    Rastgele bir ka fikir:

    Bilgisayarn istediimiz gibi davranmasn salayan programlar oluturma iidir Aralar renmeyi, ve bu aralar nceki ustalarn deneyimleri dorultusunda kullanmay

    gerektirdii iin bir zanaattr Problem zd ve bunu belirli kstlamalar altnda yapt iin mhendisliktir ok zevkli ve tatmin edicidir Gzel sanat deildir ama insann oluturduu her eyde olduu gibi programlarn da

    gzelliklerinden sz edilebilir Kendisi bilim deildir ama kulland yntemler bilgisayar bilimi tarafndan gelitirilir

    renmek ve retmek ok zordur3.1

    Programclk 1950'lerden beri retilen bir uratr. O zamandan bu yana henzprogramlamay etkin bir ekilde retecek bir yntem gelitirilememitir.

    Ne yazk ki, insanlarn kabaca yarsna yakn bir blmnn programlama renmeye yatknolmadklar grlyor. Bu konuda yaplm aratrmalardan birisiyle ilgili olarak DdiliForum'da alan bir konuya gz atmak isteyebilirsiniz.

    O aratrmadan anlaldna gre, programclk renmeye yatkn olanlar; anlamadklar birdurumla karlatklarnda kafalarnda doru veya yanl, ama tutarl bir modelkurabilenlerdir.

    Bence yatkn olan kiiler iin programlamann zorluu, gerektirdii bilgi miktarndadr.

    Programclk

    Copyright 2009-2012, http://ddili.org 7

  • "Merhaba Dnya" Program4

    Her programlama dilinde gsterilen ilk program merhaba dnya programdr. Doal olarakson derece basit olmas gereken bu program o dilde program yazabilmek iin mutlakabilinmesi gereken kavramlar da ierdii iin nemlidir.

    imdilik bu kavramlar bir kenara brakalm ve nce bu program grelim:

    import std.stdio;

    void main(){

    writeln("Merhaba dnya!");}

    Yukardaki kaynak koddan alabilir program oluturulabilmesi iin kaynak kodun bir Dderleyicisi tarafndan derlenmesi gerekir.

    Derleyici kurulumu4.1

    Bu blm yazld srada derleyici olarak seenek bulunuyor: Digital Mars derleyicisi dmd ,GCC derleyicisi gdc , ve LLVM derleme ortamn hedefleyen ldc .

    D programlama dilinin gelitirilmesi srasndaki asl derleyici dmd olmutur. D'nin yeniolanaklar ilk olarak hep bu derleyicide gerekletirilmilerdir. Bu kitaptaki rnekler de hepdmd zerinde denenmi olduklarndan sizin de onu kurmanz neririm. Baka derleyicilerigerekirse daha sonra kurabilirsiniz.

    dmd 'nin en yeni srmn Digital Mars'n Download sayfasndan indirebilirsiniz. O sayfadakisrmler arasndan iletim sisteminize uyan ve sisteminizin 32 veya 64 bitlik olmasna balolan en yeni srm sein. D1 srmlerini semeyin. Bu kitap D'nin D2 diye de anlan sonsrmn anlatr.

    Derleyici kurulumu ortama bal olarak farkllk gsterse de bir ka balantya ve dmeyetklamak kadar kolaydr.

    Kaynak dosya4.2

    Programcnn D dili kurallarna gre yazd ve derleyiciye derlemesi iin verdii dosyayakaynak dosya denir. D derlemeli bir dil olduu iin, kaynak dosyann kendisi altrlabilir birprogram deildir. Kaynak dosya, ancak derleyici tarafndan derlendikten sonra altrlabilenprogram haline gelir.

    Her tr dosyann olduu gibi, kaynak dosyann da diske kaydedilirken bir isminin olmasgerekir. Kaynak dosya isminde sisteminizin izin verdii her harfi kullanabilirsiniz. Ancak, Dkaynak dosyalarnn dosya isim uzantsnn .d olmas geleneklemitir. Gelitirme ortamlar,ara programlar, ve baka programclar da bunu beklerler. rnein deneme.d , tavla.d ,fatura.d , vs. uygun kaynak dosya isimleridir.

    Merhaba dnya programn derlemek4.3

    Yukardaki program bir metin dosyasna yazn veya kopyalayn ve merhaba.d ismiylekaydedin.

    "Merhaba Dnya" Program

    Copyright 2009-2012, http://ddili.org 8

  • Derleyicinin grevi, bu kaynak dosyada yazm hatalar bulunmadn denetlemek ve onumakine koduna dntrerek altrlabilir program haline getirmektir. Program derlemekiin u admlar uygulayn:

    1. Bir konsol penceresi (u birim, komut satr) an.2. merhaba.d dosyasnn kaydedildii klasre gidin.3. Aadaki komutu yazn ve Enter'a basn. ($ karakterini yazmayn; o karakter komut

    satrnn ban temsil ediyor.)

    $ dmd merhaba.d

    Eer bir hata yapmadysanz hibir ey olmadn dnebilirsiniz. Tersine, dmd 'nin mesajvermemesi hereyin yolunda gittiini gsterir. Bulunduunuz klasrde merhaba (veyamerhaba.exe) isminde bir program olumu olmas gerekir.

    Eer derleyici baz mesajlar yazdysa program yazarken bir hata yaptnz iin olabilir.Hatay bulmaya aln, olas yanllar dzeltin, ve program tekrar derleyin. Programlamahayatnzda doal olarak sklkla hatalar yapacaksnz.

    Program baaryla derlenmise ismini yazarak balatabilirsiniz. Programn "Merhaba dnya!"yazdn greceksiniz:

    $ ./merhaba programn altrlmasMerhaba dnya! programn yazd satr

    Tebrikler! lk D programnz altrdnz.

    Derleyici seenekleri4.4

    Derleyicilerin derleme aamasyla ilgili komut satr seenekleri vardr. Bu seeneklerigrmek iin yalnzca derleyicinin ismini yazn ve Enter'a basn:

    $ dmd yalnzca derleyicinin ismiDMD64 D Compiler v2.059Copyright (c) 1999-2012 by Digital Mars written by Walter BrightDocumentation: http://www.dlang.org/index.htmlUsage:

    dmd files.d ... { -switch }

    files.d D source files...

    -unittest compile in unit tests...

    -w enable warnings...

    zellikle ksaltlm olarak gsterdiim yukardaki liste her zaman iin kullanmanznerdiim seenekleri ieriyor. Buradaki merhaba dnya programnda hibir etkisi olmasa daaadaki komut, program uyarlar ve birim testlerini etkinletirerek derler. Bu ve bazbaka seeneklerin anlamlarn ilerideki blmlerde greceiz:

    $ dmd merhaba.d -w -unittest

    dmd komut satr seeneklerinin tam listesini DMD Compiler sayfasnda bulabilirsiniz.

    "Merhaba Dnya" Program

    Copyright 2009-2012, http://ddili.org 9

  • Gelitirme ortam4.5

    Derleyiciye ek olarak bir gelitirme ortam (IDE) da kurmay dnebilirsiniz. Gelitirmeortamlar program yazma, derleme, ve hata ayklama admlarn kolaylatran programlardr.

    Gelitirme ortamlarnda program derlemek ve altrmak, bir tua basmak veya bir dmeyetklamak kadar kolaydr. Yine de programlarn konsolda nasl derlendiklerini bilmeniz denemlidir.

    Bir gelitirme ortam kurmaya karar verdiinizde dlang.org'daki IDEs sayfasndakiseeneklere bakabilirsiniz.

    Merhaba dnya programnn ierii4.6

    Bu kadar kk bir programda bile deinilmesi gereken ok sayda kavram bulunuyor. Bukavramlar bu aamada fazla ayrntlarna girmeden yle tantabiliriz:

    olanaklar: Her programlama dili kendi sz dizimini, temel trlerini, anahtar szcklerini,kurallarn, vs. tanmlar. Bunlar o dilin i olanaklarn olutururlar. Bu programda grlenparantezler, noktal virgller, main ve void gibi szckler; hep D dilinin kurallardahilindedirler. Bunlar Trke gibi bir dilin yazm kurallarna benzetebiliriz: zne, yklem,noktalama iaretleri, vs...

    Anahtar szckler: Dilin i olanaklarn belirleyen zel szcklere anahtar szck denir. Buprogramda tane anahtar szck var: Programa modl eklemeye yarayan import , "hibirtr" anlamna gelen void , ve programn balang noktasn belirleyen main .

    Ktphaneler ve ilevler: Dilin i olanaklar yalnzca dilin yapsn belirler. Bu olanaklarkullanlarak oluturulan ilevlerin bir araya getirilmelerine ktphane ad verilir. Bunu yineTrke'ye benzetecek olursak; dil; cmle yaps, ses uyumu, vs. gibi kavramlar ierir.Trke'yi kullanarak yaplabilecek sohbetlerin snr yoktur: bilimsel sohbet, futbol sohbeti,vs. Bunlar hep Trke olsalar da, kendilerine has zelliklere, anlamalara, ve kullanmlarasahiptirler. te bu deiik sohbetleri biraz olsun programlama dili ktphanelerinebenzetebiliriz.

    Bu programdaki writeln ilevi, standart D ktphanesinde ka satr yazdrmak iinkullanlan bir ilevdir. smi, "satr yaz"n karl olan "write line"dan gelir.

    Modller: D'de ktphaneler programlara modller halinde tantlrlar. Bu programdakullanlan tek modl olan std.stdio 'nun ismi, "standart ktphanenin standart giri/kmodl" olarak evirebileceimiz "standard input/output"tan tremitir.

    Karakterler ve dizgiler: Bu programdaki "Merhaba dnya!" gibi bilgilere dizgi, dizgilerioluturan elemanlara da karakter ad verilir. rnein bu programdaki dizgiyi oluturankarakterlerden bazlar M, e, ve ! karakterleridir.

    lem sras: Program, iini belirli admlar belirli srada tekrarlayarak yapar. Bu srann enbanda main isimli ilevin iindeki ilemler vardr; programn ileyii, main 'le balar. Bukk programda tek bir ilem bulunuyor: writeln 'li satrdaki ilem.

    Byk/Kk harf ayrm: Programda deiiklik yaparken dizgilerin iinde istediinizkarakterleri kullanabilirsiniz, ama dier isimleri grldkleri gibi kk harfle yazmayadikkat edin, nk D dilinde byk/kk harf ayrm nemlidir. rnein writeln ile WritelnD dilinde farkl isimlerdir.

    Grld gibi, en kk D programnda bile sz edilmesi gereken ok sayda kavrambulunuyor. Bunlar ayrntlaryla renecek ok zamanmz olacak.

    "Merhaba Dnya" Program

    Copyright 2009-2012, http://ddili.org 10

  • Problemler4.7

    1. Programa istediiniz baka bir ey yazdrn.2. Program birden fazla satr yazacak ekilde deitirin.3. Programn baka yerlerinde deiiklikler yapn ve derlemeye aln; rnein writeln

    satrnn sonundaki noktal virgl olmadnda derleme hatalaryla karlatnz grn.

    ... zmler

    "Merhaba Dnya" Program

    Copyright 2009-2012, http://ddili.org 11

  • writeln ve write5

    Bundan nceki derste, yazdrlmak istenen dizginin writeln 'e parantez iinde verildiinigrdk.

    Programda writeln gibi i yapan birimlere ilev, o ilevlerin ilerini yaparken kullanacaklarbilgilere de parametre ad verilir. Parametreler ilevlere parantez iinde verilirler.

    writeln satra yazdrmak iin bir seferde birden fazla parametre alabilir. Parametrelerinbirbirleriyle karmalarn nlemek iin aralarnda virgl kullanlr.

    import std.stdio;

    void main(){

    writeln("Merhaba dnya!", "Merhaba balklar!");}

    Bazen, ayn satra yazdrlacak olan btn bilgi writeln 'e hep birden parametre olarakgeirilebilecek ekilde hazr bulunmayabilir. Byle durumlarda satrn ba taraflar write ilepara para oluturulabilir ve satrdaki en sonuncu bilgi writeln ile yazdrlabilir.

    writeln yazdklarnn sonunda yeni bir satra geer, write ayn satrda kalr:

    import std.stdio;

    void main(){

    // nce elimizde hazr bulunan bilgiyi yazdryor olalm:write("Merhaba");

    // ... arada baka ilemlerin yapldn varsayalm ...

    write("dnya!");

    // ve en sonunda:writeln();

    }

    writeln 'i parametresiz kullanmak, satrn sonlanmasn salar.

    Balarnda // karakterleri bulunan satrlara aklama satr ad verilir. Bu satrlar programadahil deildirler; programn bilgisayara yaptraca ileri etkilemezler. Tek amalar, belirlinoktalarda ne yaplmak istendiini program daha sonra okuyacak olan kiilere aklamaktr.

    Problemler5.1

    1. Buradaki programlarn ikisi de dizgileri aralarnda boluk olmadan birbirlerine yapkolarak yazdryorlar; bu sorunu giderin

    2. write ' da birden fazla parametreyle armay deneyin

    ... zmler

    writeln ve write

    Copyright 2009-2012, http://ddili.org 12

  • Derleyici6

    D programclnda en ok kullanlan iki aracn metin dzenleyici ve derleyici olduklarngrdk. Programlar metin dzenleyicilerde yazlrlar.

    D gibi dillerde derleme kavram ve derleyicinin ilevi de hi olmazsa kaba hatlaryla mutlakabilinmelidir.

    Makine Kodu6.1

    Bilgisayarn beyni CPU denen mikro ilemcidir. Mikro ilemciye ne iler yapacanbildirmeye kodlama, bu bildirimlere de kod denir.

    Her mikro ilemci modelinin kendisine has kodlar vardr. Her mikro ilemcinin naslkodlanacana mimari tasarm aamasnda ve donanm kstlamalar gzetilerek karar verilir.Bu kodlar ok alt dzeyde elektronik sinyaller olarak gerekletirilirler. Bu tasarmdakodlama kolayl geri planda kald iin, dorudan mikro ilemciyi kodlayarak programyazmak ok g bir itir.

    Mikro ilemcinin adnn paras olan ilem kavram, zel saylar olarak belirlenmitir. rneinkodlar 8 bit olan hayal bir ilemcide 4 says ykleme ilemini, 5 says depolama ilemini, 6says da arttrma ilemini gsteriyor olabilir. Bu hayal ilemcide soldaki 3 bitin ilem saysve sadaki 5 bitin de o ilemde kullanlacak deer olduunu dnrsek, bu mikro ilemcininmakine kodu yle olabilir:

    lem Deer Anlam100 11110 YKLE 11110101 10100 DEPOLA 10100110 10100 ARTTIR 10100000 00000 BEKLE

    Makine kodunun donanma bu kadar yakn olmas, oyun kad veya renci kaytlar gibi stdzey kavramlarn bilgisayarda temsil edilmelerini son derece g hale getirir.

    Programlama Dili6.2

    Mikro ilemcileri kullanmann daha etkin yollar aranm, ve zm olarak st dzeykavramlar ifade etmeye elverili programlama dilleri gelitirilmitir. Bu dillerin donanmkayglar olmad iin, zellikle kullanm kolayl ve ifade gc gzetilerektasarlanmlardr. Programlama dilleri insanlara uygun dillerdir ve ok kabaca konumadillerine benzerler:

    if (ortaya_kat_atlm_m()) {oyun_kadn_gster();

    }

    Programlama dillerinin bir sorunu, anahtar szcklerinin geleneksel olarak ngilizceolmasdr. Neyse ki bunlar kolayca renebilecek kadar az saydadr. rnein if 'in "eer"anlamna geldiini bir kere renmek yeter.

    Derlemeli Dil6.3

    Bu gibi dillerde yazlan programn altrlr hale gelmeden nce derlenmesi gerekir. Buyntem ok hzl alan programlar retir; ama program yazmann yannda bir de derlemekgerektii iin, program gelitirme aamas daha klfetlidir. D, derlemeli bir dildir.

    Derleyici

    Copyright 2009-2012, http://ddili.org 13

  • Yorumlamal Dil6.4

    Baz programlama dilleri derleyici gerektirmezler. Bu gibi dillere yorumlamal dil denir.Yorumlamal dillerde yazlan programlar derlenmeleri gerekmeden hemen altrlabilirler.Bu dillere rnek olarak Python, Ruby, ve Perl' gsterebiliriz. Derleme aamas olmad iinbu diller program gelitirmeyi abuklatrrlar. Bir sakncalar, her altrldklarndaprogram metninin batan taranmasnn ve makine kodu karlklarnn alma zamanndabulunmasnn gerekmesidir. Bu yzden, yorumlamal dillerde yazlan programlar derlemelidillerde yazlan edeerlerinden genel olarak daha yava alrlar.

    Derleyici6.5

    Derleyicinin grevi araclktr: insanlarn anlad programlama dilini mikro ilemcininanlad kodlara evirir. Bu ileme derleme denir. Her derleyici belirli bir programlama dilinibilir ve o dilin derleyicisi olarak anlr: "D derleyicisi" gibi.

    Derleme Hatas6.6

    Derleyiciler program dilin kurallarna uygun olarak derledikleri iin, kural d kodlargrdklerinde bir hata mesaj vererek sonlanrlar. rnein kapanmam bir parantez,unutulmu bir noktal virgl, yanl yazlm bir anahtar szck, vs. derleme hatasna yol aar.

    Derleyici bazen de kod aka kural d olmad halde, programcnn yanl yapmasndanphelenebilir ve bu konuda uyar mesaj verebilir. Program derlenmi bile olsa, her zamaniin uyarlar da hata gibi kabul edip, uyarya neden olan kodu deitirmek iyi olur.

    Derleyici

    Copyright 2009-2012, http://ddili.org 14

  • Temel Trler7

    Bir bilgisayarn beyninin mikro ilemci olduunu grdk. Bir programdaki ilemlerin ounumikro ilemci yapar. Kendi yapmad ileri de bilgisayarn yan birimlerine devreder.

    Bilgisayarlarda en kk bilgi miktar, 0 veya 1 deerini tutabilen ve bit ad verilen yapdr.Bit, donanm dzeyinde bir ka tane transistrden oluur.

    Yalnzca 0 ve 1 deerini tutabilen bir veri trnn kullanm ok kstl olduu iin, mikroilemciler birden fazla bitin yan yana getirilmesinden oluan daha kullanl veri trleritanmlamlardr: rnein 8 bitten oluan bayt veya 32, 64, vs. bitten oluan daha byk veritrleri... Her mikro ilemcinin mimari tasarm gerei en etkin olarak kulland veri tr, omikro ilemcinin o kadar bitlik olduunu gsterir: "32 bitlik ilemci", "64 bitlik ilemci", gibi...

    Mikro ilemcinin tanmlad veri trleri de kendi balarna yeterli deillerdir; nk rneinrenci ismi gibi veya oyun kad gibi zel bilgileri tutamazlar. Mikro ilemcinin sunduu bugenel amal veri trlerini daha kullanl trlere evirmek programlama dillerinin grevidir.D'nin temel trleri bile tek balarna kullanldklarnda oyun kad gibi bir kavramdestekleyemezler. O tr kavramlar ileride anlatlacak olan yaplarla ve snflarla ifadeedilirler.

    D'nin temel trleri ounlukla dier dillerdeki temel trlere benzerler. Ek olarak, D'de belkide ancak bilimsel hesaplarda ie yarayan baz ek trler de bulunur.

    Tabloda kullanlan terimlerin aklamalarn aada bulacaksnz.

    Temel Trler

    Copyright 2009-2012, http://ddili.org 15

  • D'nin Temel Veri Trleri

    Tr Aklama lk Deeribool Bool deeri falsebyte iaretli 8 bit 0ubyte iaretsiz 8 bit 0short iaretli 16 bit 0ushort iaretsiz 16 bit 0int iaretli 32 bit 0uint iaretsiz 32 bit 0long iaretli 64 bit 0Lulong iaretsiz 64 bit 0Lfloat 32 bit kayan noktal say float.nandouble 64 bit kayan noktal say double.nanreal ya donanmn (mikro ilemcinin) tanmlad en byk kayan

    noktal say trdr (rnein, x86 mikro ilemcilerinde 80bit), ya da double'dr; hangisi daha bykse...

    real.nan

    ifloat sanal float deer float.nan* 1.0i

    idoublesanal double deer double.nan* 1.0i

    ireal sanal real deer real.nan *1.0i

    cfloat iki float'tan oluan karmak say float.nan+float.nan* 1.0i

    cdoubleiki double'dan oluan karmak say double.nan+double.nan* 1.0i

    creal iki real'den oluan karmak say real.nan +real.nan *1.0i

    char UTF-8 kod birimi 0xFFwchar UTF-16 kod birimi 0xFFFFdchar UTF-32 kod birimi ve Unicode kod noktas 0x0000FFFF

    Bunlara ek olarak hibir trden olmama kavramn ifade eden void anahtar szc devardr. cent ve ucent anahtar szckleri, iaretli ve iaretsiz 128 bitlik veri trlerini temsiletmek zere ilerisi iin ayrlmlardr.

    Aksine bir neden bulunmad srece genel bir kural olarak tam deerler iin intkullanabilirsiniz. Kesirli deerleri olan kavramlar iin de ncelikle double tr uygundur.

    Tablodaki Terimlerin Aklamalar7.1

    Bool deer: Mantksal ifadelerde kullanlan ve "doruluk" durumunda true , "doru olmama"durumunda false deerini alan trdr

    Temel Trler

    Copyright 2009-2012, http://ddili.org 16

  • aretli tr: Hem eksi hem art deerler alabilen trdr; rnein -128'den 127'ye kadardeer alabilen byte . simleri eksi iaretinden gelir.

    aretsiz tr: Yalnzca art deerler alabilen trdr; rnein 0'dan 255'e kadar deeralabilen ubyte . Bu trlerin bandaki u harfi, "iaretsiz" anlamna gelen "unsigned"n baharfidir.

    Kayan noktal say: Kabaca, 1.25 gibi kesirli deerleri tutabilen trdr; hesaplarnhassasiyeti trlerin bit saysyla doru orantldr (yksek bit says yksek hassasiyet salar);bunlarn dndaki trler kesirli deerler alamazlar; rnein int , yalnzca tamsay deerleralabilir

    Karmak say: Matematikte geen karmak say deerlerini alabilen trdr

    Sanal deer: Karmak saylarn salt sanal deerlerini tayabilen trdr; tabloda lk Deerstununda geen i , matematikte -1'in kare kk olan saydr

    nan: "Not a number"n ksaltmasdr ve geersiz kesirli say deeri anlamna gelir

    Tr Nitelikleri7.2

    D'de trlerin nitelikleri vardr. Niteliklere trn isminden sonra bir nokta ve nitelik ismiyleeriilir. rnein int 'in .sizeof niteliine int.sizeof diye eriilir. Burada niteliklerdenyalnzca drt tanesini greceiz; gerisini sonraki derslere brakacaz:

    .stringof trn okunakl ismidir .sizeof trn bayt olarak uzunluudur; trn ka bitten olutuunu hesaplamak iin bu

    deeri bir bayttaki bit says olan 8 ile arpmak gerekir .min "en az" anlamna gelen "minimum"un ksaltmasdr; trn alabilecei en kk

    deerdir .max "en ok" anlamna gelen "maximum"un ksaltmasdr; trn alabilecei en byk

    deerdir

    int 'in ka bayttan olutuunu, en kk deerini, ve en byk deerini yle yazdrabiliriz:

    import std.stdio;

    void main(){

    writeln("Tr : ", int.stringof);writeln("Bayt olarak uzunluu: ", int.sizeof);writeln("En kk deeri : ", int.min);writeln("En byk deeri : ", int.max);

    }

    size_t7.3

    Programlarda size_t tr ile de karlaacaksnz. size_t btnyle farkl bir tr deildir;ortama bal olarak ulong veya baka bir iaretsiz temel trn takma ismidir. smi "sizetype"tan gelir ve "byklk tr" anlamndadr. Adet gibi saymayla ilgili olan kavramlartemsil ederken kullanlr.

    Bu trn sizin ortamnzda hangi temel trn takma ismi olduunu yine .stringof nitelii ilerenebilirsiniz:

    import std.stdio;

    void main(){

    Temel Trler

    Copyright 2009-2012, http://ddili.org 17

  • writeln(size_t.stringof);}

    Yukardaki program denediim ortamda u kty alyorum:

    ulong

    Problem7.4

    Dier trlerin de niteliklerini yazdrn.Not: lerisi iin dnldkleri iin geersiz olan cent ve ucent trlerini hibirdurumda, hibir trden olmamay temsil eden void 'i ise bu problemdeki gibidurumlarda kullanamazsnz.

    ... zm

    Temel Trler

    Copyright 2009-2012, http://ddili.org 18

  • Atama ve lem Sralar8

    Programclk renirken karlalan engellerden ilk ikisini bu blmde greceiz.

    Atama ilemi8.1

    Program iinde

    a = 10;

    gibi bir satr grdnzde bu, "a'nn deeri 10 olsun" demektir. Benzer ekilde, aadakisatrn anlam da "b'nin deeri 20 olsun" demektir:

    b = 20;

    Bu bilgilere dayanarak o iki satrdan sonra unu grdmzde ne dnebiliriz?

    a = b;

    Ne yazk ki matematikten altmz kural burada uygulayamayz. O ifade, "a ile b eittir"demek deildir! Bataki iki ifadeyle ayn mant yrtnce, o ifadenin "a'nn deeri b olsun"demek olduunu grrz. "a'nn b olmas" demek, "b'nin deeri ne ise, a'nn deeri de oolsun" demektir.

    Fark gryor musunuz? Matematikten altmz = iareti programclkta bambaka biranlamda kullanlmaktadr: sa tarafn deeri ne ise, sol tarafn deerini de o yapmak...

    lem sralar8.2

    Programlarda ilemler adm adm ve belirli bir srada uygulanrlar. Yukardaki ifadeninprogram iinde alt alta bulunduklarn dnelim:

    a = 10;b = 20;a = b;

    Onlarn toplu halde anlamlar udur: "a'nn deeri 10 olsun, sonra b'nin deeri 20 olsun,sonra a'nn deeri b'nin deeri olsun". Yani oradaki ilem admndan sonra hem a'nn hemde b'nin deerleri 20 olur.

    Problem8.3

    Aadaki ilemlerin a 'nn ve b 'nin deerlerini dei toku ettiklerini gzlemleyin. Eerdeerler balangta srasyla 1 ve 2 iseler, ilemlerden sonra 2 ve 1 olurlar:

    c = a;a = b;b = c;

    ... zm

    Atama ve lem Sralar

    Copyright 2009-2012, http://ddili.org 19

  • Deikenler9

    Programda kullanlan kavramlar temsil eden yaplara deiken denir. rnek olarak havascakl gibi bir deeri veya yar arabas motoru gibi karmak bir nesneyi dnebilirsiniz.

    Her deiken belirli bir trdendir ve her deikenin bir deeri vardr. Deikenlerin oununisimleri de olur, ama programda aka anlmalar gerekmeyen deikenlerin isimleriolmayabilir de...

    rnek olarak bir okuldaki renci says kavramn ifade eden bir deiken dnebiliriz.renci says bir tamsay olduu iin, trn int olarak seebiliriz. Aklayc bir isim olarakda renci_says uygun olur.

    D'nin yazm kurallar gerei, deikenler nce trleri sonra isimleri yazlarak tantlrlar. Birdeikenin bu ekilde tantlmasna, o deikenin tanm, ve bu eyleme o deikenintanmlanmas denir. Deikenin ismi, programda getii her yerde deerine dnr.

    import std.stdio;

    void main(){

    // Deikenin tanmlanmas; renci_says'nn int// trnde bir deiken olduunu belirtir:int renci_says;

    // Deikenin isminin kullanld yerde deerine// dnmesi:writeln("Bu okulda ", renci_says, " renci var.");

    }

    Bu programn kts udur:

    Bu okulda 0 renci var.

    Programn ktsndan anlaldna gre, renci_says 'nn deeri 0'dr. Bunun nedeni,int 'in ilk deerinin temel trler tablosundan hatrlayacanz gibi 0 olmasdr.

    Dikkat ederseniz, renci_says ktda ismi olarak deil, deeri olarak belirmitir; yaniprogramn kts Bu okulda renci_says renci var. eklinde olmamtr.

    Deikenlerin deerleri = ileci ile deitirilir. Yapt i deer atamak olduu iin, bu ileceatama ileci denir:

    import std.stdio;

    void main(){

    int renci_says;writeln("Bu okulda ", renci_says, " renci var.");

    // renci_says'na 200 deerinin atanmas:renci_says = 200;writeln("Bu okulda imdi ", renci_says, " renci var.");

    }

    Bu okulda 0 renci var.Bu okulda imdi 200 renci var.

    Eer deikenin deeri tanmland srada biliniyorsa, tanmlanmasyla deerinin atanmasayn anda yaplabilir, ve hata riskini azaltt iin de nerilen bir yntemdir:

    Deikenler

    Copyright 2009-2012, http://ddili.org 20

  • import std.stdio;

    void main(){

    // Hem tanm, hem atama:int renci_says = 100;

    writeln("Bu okulda ", renci_says, " renci var.");}

    Bu okulda 100 renci var.

    Problem9.1

    ki deiken kullanarak ekrana "2.11 kurundan 20 avro bozdurdum." yazdrn.Deikenlerden kesirli say olan iin double trn kullanabilirsiniz.

    ... zm

    Deikenler

    Copyright 2009-2012, http://ddili.org 21

  • Standart Giri ve k Akmlar10

    Bizim ekran olarak algladmz k, aslnda D programnn standart kdr. Standart kkarakter temellidir: yazdrlan btn bilgi nce karakter karlna dntrlr ve ondansonra art arda karakterler olarak standart ka gnderilir. nceki blmlerde kagnderilen tamsaylar, rnein renci says olan 100 deeri, ekrana aslnda tamsay 100deeri olarak deil; 1 , 0 , ve 0 eklinde karakter olarak gnderilmitir.

    Normalde klavye olarak algladmz standart giri de bunun tersi olarak alr: bilgi artarda karakterler olarak gelir ve ondan sonra programda kullanlacak deerlere dntrlr.rnein giriten okunan 42 gibi bir deer, aslnda 4 ve 2 karakterleri olarak okunur.

    Bu dnmler bizim zel bir ey yapmamza gerek olmadan, otomatik olarak gerekleirler.

    Art arda gelen karakterler kavramna karakter akm ad verilir. Bu tanma uyduklar iin Dprogramlarnn standart girii ve k birer karakter akmdr. Standart giri akmnn ismistdin , standart k akmnn ismi de stdout 'tur.

    Akmlar kullanrken normalde akmn ismi, bir nokta, ve o akmla yaplacak ilem yazlr:akm.ilem gibi. Buna ramen, ok kullanlan akmlar olduklar iin, stdin ve stdout 'unzellikle belirtilmeleri gerekmez.

    nceki blmlerde kullandmz writeln , aslnda stdout.writeln 'in ksaltmasdr. Benzerekilde, write da stdout.write 'in ksaltmasdr. Merhaba dnya programn byle birksaltma kullanmadan yle de yazabiliriz:

    import std.stdio;

    void main(){

    stdout.writeln("Merhaba dnya!");}

    Problem10.1

    Yukardaki programda stdout 'u yine writeln ilemiyle kullann ama bir seferde birdenfazla deiken yazdrn.

    ... zm

    Standart Giri ve k Akmlar

    Copyright 2009-2012, http://ddili.org 22

  • Giriten Bilgi Almak11

    Girilen bilginin daha sonradan kullanlabilmesi iin bir deikende saklanmas gerekir.rnein okulda ka tane renci bulunduu bilgisini alan bir program, bu bilgiyi int trndebir deikende tutabilir.

    Yazdrma ilemi srasnda dolayl olarak stdout akmnn kullanldn bir nceki derstegrdk. Bu, bilginin nereye gideceini aklamaya yetiyordu; nk stdout , standart kdemektir. ka ne yazdrlacan da parametre olarak veriyorduk. rneinwrite(renci_says); yazmak, ka renci_says deikeninin deerininyazdrlacan sylemeye yetiyordu. zetlersek:

    akm: stdoutilem: writeyazdrlan: renci_says deikeninin deerihedef: normalde ekran

    write 'n karl readf 'tir. smindeki "f", "belirli bir dzende"nin ngilizcesi olan"formatted"dan gelir.

    Standart giriin de stdin olduunu grmtk.

    Okuma durumunda bundan bakaca nemli bir ayrnt vardr: okunan bilginin nerededepolanacann da belirtilmesi gerekir. Okuma ilemini de zetlersek:

    akm: stdinilem: readfokunan: bir bilgihedef: ?

    Bilginin depolanaca hedef belirtilirken bir deikenin adresi kullanlr. D'de isimlerden ncekullanlan & karakteri, o isimle belirtilen eyin adresi anlamna gelir. readf 'e okuduu bilgiyiyerletirecei yer bu ekilde bildirilir: &renci_says . Burada &renci_says ,"renci_says deikenine" diye okunabilir. Bu kullanm, yukardaki soru iaretini ortadankaldrr:

    akm: dinilem: readfokunan: bir bilgihedef: renci_says deikeni

    simlerin bana & karakteri koymak o ismin belirttii eyin gsterilmesi anlamna gelir. Bugsterme kavram, sonraki derslerde karlaacamz referanslarn ve gstergelerin dezn oluturur.

    readf konusunda bir noktay ilerideki derslere brakacaz ve imdilik ilk parametresi olarak"%s" kullanmak gerektiini kabul edeceiz:

    readf("%s", &renci_says);

    (Not: ou durumda aslnda boluk karakteri ile " %s" yazmak gerekeceini aadagsteriyorum.)

    "%s", verinin deikene uygun olan dzende dntrleceini belirtir. rnein giritengelen '4' ve '2' karakterleri, bir int 'e okunduklarnda 42 tamsay deerini oluturacak ekildeokunurlar.

    Giriten Bilgi Almak

    Copyright 2009-2012, http://ddili.org 23

  • Bu anlatlanlar gsteren programda nce sizden renci saysn bildirmeniz isteniyor.stediiniz deeri yazdktan sonra Enter'a basmanz gerekir.

    import std.stdio;

    void main(){

    write("Okulda ka renci var? ");

    // renci saysnn tutulaca deikenin tanmlanmasint renci_says;

    /*Giriten gelen bilginin renci_says deikenineatanmas

    */readf("%s", &renci_says);

    writeln("Anladm: okulda ", renci_says, " renci varm.");

    }

    Boluklarn gzard edilmelerinin gerekmesi11.1

    Yukardaki gibi programlarda deerleri yazdktan sonra Enter tuuna baslmas gerektiinibiliyorsunuz. Kullancnn Enter tuuna basm olmas da zel bir kod olarak ifade edilir ve obile programn standart giriinde belirir. Programlar bylece bilgilerin tek satr olarak myoksa farkl satrlarda m girildiklerini alglayabilirler.

    Baz durumlarda ise girite bekleyen o zel kodlarn hibir nemi yoktur; szlp gzardedilmeleri gerekir. Yoksa standart girii tkarlar ve baka bilgilerin girilmesini engellerler.

    Bunun bir rneini grmek iin yukardaki programda ayrca retmen saysnn dagirilmesini isteyelim. Program dzenini biraz deitirerek ve aklamalar kaldrarak:

    import std.stdio;

    void main(){

    write("Okulda ka renci var? ");int renci_says;readf("%s", &renci_says);

    write("Ka retmen var? ");int retmen_says;readf("%s", &retmen_says);

    writeln("Anladm: okulda ", renci_says, " renci"," ve ", retmen_says, " retmen varm.");

    }

    Ne yazk ki o program ikinci int 'in okunduu noktada taklr:

    Okulda ka renci var? 100Ka retmen var? 20

    Program burada taklr

    retmen says olarak 20 yazlm olsa da bir nceki 100'n sonunda baslm olan Enter'nkodlar girii tkamtr ve o yzden retmen_says deikeninin deeri olan 20okunamamaktadr. Programn giriine gelen kodlar u ekilde ifade edebiliriz:

    100[EnterKodu]20[EnterKodu]

    Giriten Bilgi Almak

    Copyright 2009-2012, http://ddili.org 24

  • Giriin tkand noktay krmzyla belirttim.

    Bu durumda zm, retmen saysndan nce gelen Enter kodunun nemli olmadnbelirtmek iin %s belirtecinden nce bir boluk karakteri kullanmaktr: " %s". Dzen dizgisiiinde geen boluk karakterleri sfr veya daha fazla saydaki grnmez kodu okuyup gzardetmeye yararlar. O tek boluk karakteri btn grnmez karakter kodlarn okuyup gzardeder: normal boluk karakteri, Enter'la girilen satr sonu karakteri, Tab karakteri vs.

    Genel bir kural olarak, okunan her deer iin " %s" kullanabilirsiniz. Yukardaki program odeiiklikle artk istendii gibi alr. Yalnzca deien satrlarn gstererek:

    // ...readf(" %s", &renci_says);

    // ...readf(" %s", &retmen_says);

    // ...

    kts:

    Okulda ka renci var? 100Ka retmen var? 20Anladm: okulda 100 renci ve 20 retmen varm.

    Ek bilgiler11.2

    Daha nce grdmz // karakterleri tek bir satr aklama yazmaya elverilidir. Birdenfazla satrda blok halinde aklama yazmak iin aklamay /* ve */ belirteleri arasnaalabilirsiniz.

    Baka aklama belirtelerini de ierebilmek iin /+ ve +/ belirteleri kullanlr:

    /+// Tek satrlk aklama

    /*Birden fazlasatrlk aklama

    */

    Yukardaki belirteleri bile ierebilen aklama blou+/

    Kaynak kodlardaki boluk karakterlerinin ou nemsizdir. O yzden fazla uzayan satrlarblebiliriz veya daha anlalr olacan dndmz boluklar ekleyebiliriz. Hattayazm hatasna yol amad srece hi boluk kullanmayabiliriz bile:

    import std.stdio;void main(){writeln("Okumas zor!");}

    Fazla skk kodu okumak gtr.

    Problem11.3

    Giriten say beklenen durumda harfler girin ve programn yanl altn gzlemleyin.

    ... zm

    Giriten Bilgi Almak

    Copyright 2009-2012, http://ddili.org 25

  • Mantksal fadeler12

    Programda asl ileri ifadeler yaparlar. Programda deer veya yan etki reten her eye ifadedenir. Aslnda olduka geni bir kavramdr, nk 42 gibi bir tamsay sabiti bile 42 deerinirettii iin bir ifadedir. "merhaba" gibi bir dizgi de bir ifadedir, nk "merhaba" sabitdizgisini retir. (Not: Buradaki retme kavramn deiken tanmlama ile kartrmayn.Burada yalnzca deer retmekten sz ediliyor; deiken retmekten deil. Her deerin birdeikene ait olmas gerekmez.)

    writeln gibi kullanmlar da ifadedirler, nk yan etkileri vardr: k akmna karakteryerletirdikleri iin k akmn etkilemi olurlar. imdiye kadar grdkleriniz arasndanatama ilecini de bir ifade rnei olarak verebiliriz.

    fadelerin deer retiyor olmalar, onlarn baka ifadelerde deer olarak kullanlmalarnsalar. Bylece basit ifadeler kullanlarak daha karmak ifadeler elde edilebilir. rnein havascakln veren bir hava_scakl() ilevi olduunu dnrsek, onu kullanarak yle birkt oluturabiliriz:

    writeln("u anda hava ", hava_scakl(), " derece");

    O satr toplam drt ifadeden oluur:

    1. "u anda hava " ifadesi2. hava_scakl() ifadesi3. " derece" ifadesi4. ve o ifadeyi kullanan writeln 'li ifade

    Bu blmde mantksal ifadeleri greceiz ama daha ileri gitmeden nce en temel ilemlerdenolan atama ilecini hatrlayalm.

    = (atama ileci): Sa tarafndaki ifadenin deerini sol tarafndaki ifadeye (rnein birdeikene) atar.

    hava_scakl = 23 // hava_scakl'nn deeri 23 olur

    Mantksal fadeler12.1

    Mantksal ifadeler Bool aritmetiinde geen ifadelerdir. Karar verme dzeneinin parasolduklar iin bilgisayarlar akll gsteren davranlarn da temelidirler. rnein birprogramn "eer girilen yant Evet ise dosyay kaydedeceim" gibi bir kararnda bir mantksalifade kullanlr.

    Mantksal ifadelerde yalnzca iki deer vardr: "doru olmama" anlamn tayan false ve"doruluk" anlamn tayan true . rnein Trke "bakent stanbul'dur" ifadesinin deerifalse , "bakent Ankara'dr" ifadesinin deeri true 'dur.

    Aadaki rneklerde bir soru ile kullanlan writeln ifadelerini yle anlamanz gerekiyor:Eer sorunun karsna "true" yazlmsa evet, "false" yazlmsa hayr... rnein programnkts

    Tatl var: true

    olduunda "evet, tatl var" demektir. Ayn ekilde

    Tatl var: false

    Mantksal fadeler

    Copyright 2009-2012, http://ddili.org 26

  • olduunda "hayr, tatl yok" demektir. Yani ktda "var" grnd iin "var olduunu"dnmeyin; ktdaki "... var: false", "yok" anlamna geliyor. Aadaki program paralarnhep yle okumanz gerekiyor.

    Mantksal ifadeleri daha ileride greceimiz koullarda, dnglerde, parametrelerde, vs. okkullanacaz. Programlarda bu kadar ok kullanldklar iin mantksal ifadeleri ok iyianlamak gerekir. Tanmlar son derece ksa olduu iin ok da kolaydrlar.

    Mantksal ifadelerde kullanlan mantksal ileler unlardr:

    == "Eit midir" sorusunu yantlar. ki tarafndaki ifadelerin deerlerini karlatrr ve eitolduklarnda "doruluk" anlamna gelen true deerini, eit olmadklarnda da "doruolmama" anlamna gelen false deerini retir. rettii deerin tr de doal olarakbool 'dur. rnein yle iki deikenimiz olsun:

    int haftadaki_gn_says = 7;int yldaki_ay_says = 12;

    Onlar kullanan iki eitlik ileci ifadesi ve sonular yle gsterilebilir:

    haftadaki_gn_says == 7 // trueyldaki_ay_says == 11 // false

    != "Eit deil midir" sorusunu yantlar. ki tarafndaki ifadeleri karlatrr ve == ilecinintersi sonu retir.

    haftadaki_gn_says != 7 // falseyldaki_ay_says != 11 // true

    || "Veya" anlamndadr. Sol tarafndaki ifadenin deeri true ise hi sa taraftaki ifadeyiiletmeden true deerini retir. Sol taraf false ise sa taraftakinin deerini retir. Builem Trke veya ifadesine benzer: birincisi, ikincisi, veya ikisi birden true olduundatrue retir.

    Bu ilece verilen iki ifadenin alabilecei olas deerler ve sonular yledir:

    Sol ifade Sa ifade Sonufalse false falsefalse true truetrue false (baklmaz) truetrue true (baklmaz) true

    import std.stdio;

    void main(){

    /*false, "doru olmama" anlamna geldii iinburada "yok"u temsil etsin

    true, "doru olma" anlamna geldii iinburada "var" temsil etsin

    */bool baklava_var = false;bool kadayf_var = true;

    writeln("Tatl var: ", baklava_var || kadayf_var);}

    Mantksal fadeler

    Copyright 2009-2012, http://ddili.org 27

  • Yukardaki programdaki || ilecini kullanan ifade, en az bir true deer olduu iintrue deerini retir.

    && "Ve" anlamndadr. Sol tarafndaki ifadenin deeri false ise hi sa taraftaki ifadeyiiletmeden false deerini retir. Sol taraf true ise sa taraftakinin deerini retir. Builem Trke ve ifadesine benzer: birincisi ve ikincisi true olduunda true retir.

    Sol ifade Sa ifade Sonufalse false (baklmaz) falsefalse true (baklmaz) falsetrue false falsetrue true true

    writeln("Baklava yiyeceim: ",baklava_yemek_istiyorum && baklava_var);

    Not: || ve && ilelerinin bu "sa taraf ancak gerektiinde" iletme davranlarileler arasnda ok nadirdir, ve bir de imdilik sonraya brakacamz ?: ilecindevardr. Dier ileler btn ifadelerinin deerlerini her zaman iin hesaplarlar vekullanrlar.

    ^ "Yalnzca birisi mi" sorusunu yantlar. ki ifadeden ya biri ya br true olduunda (amaikisi birden deil) true deerini retir.

    Sol ifade Sa ifade Sonufalse false falsefalse true truetrue false truetrue true false

    rnein ancak ve ancak bir arkadamn geldiinde tavla oynayacam, aksi taktirdeonlarla baka bir ey yapacam dnrsek; onlarn gelip gelmeme durumlarnagre tavla oynayp oynamayacam yle hesaplayabiliriz:

    writeln("Tavla oynayacam: ", ahmet_burada ^ bar_burada);

    < "Kk mdr" sorusunu yantlar. Sol taraf sa taraftan kkse (veya sralamadanceyse) true , deilse false deerini retir.

    writeln("Yendik: ", yediimiz_gol < attmz_gol);

    > "Byk mdr" sorusunu yantlar. Sol taraf sa taraftan bykse (veya sralamadasonraysa) true , deilse false deerini retir.

    writeln("Yenildik: ", yediimiz_gol > attmz_gol);

    ilecinin tersidir.

    writeln("Yenilmedik: ", yediimiz_gol = "Byk veya eit midir" sorusunu yantlar. Sol taraf sa taraftan byk (veyasralamada daha sonra) veya ona eit olduunda true retir. < ilecinin tersidir.

    Mantksal fadeler

    Copyright 2009-2012, http://ddili.org 28

  • writeln("Yenmedik: ", yediimiz_gol >= attmz_gol);

    ! "Tersi" anlamndadr. Dier mantksal ilelerden farkl olarak tek bir ifade ile alr vesa tarafndaki ifadenin deerinin tersini retir: true ise false , false ise true .

    writeln("Bakkala gideceim: ", !ekmek_var);

    fadeleri Gruplamak12.2

    fadelerin hangi srada iletilecekleri, gerektiinde parantezlerle belirtilir. Karmakifadelerde nce parantez iindeki ifadeler iletilir ve onlarn deeri dtaki ilele kullanlr.rnein "kahve veya ay varsa ve yannda da baklava veya kadayf varsa keyfim yerinde" gibibir ifadeyi yle hesaplayabiliriz:

    writeln("Keyfim yerinde: ",(kahve_var || ay_var) && (baklava_var || kadayf_var));

    Kendimiz parantezlerle gruplamazsak, ifadeler D dilinin kurallar ile belirlenmi olannceliklere uygun olarak iletilirler. && ilecinin ncelii de || ilecinden daha yksek olduuiin, yukardaki mantksal ifadeyi gruplamadan yle yazarsak

    writeln("Keyfim yerinde: ",kahve_var || ay_var && baklava_var || kadayf_var);

    ilem ncelikleri nedeniyle unun edeeri olarak iletilir

    writeln("Keyfim yerinde: ",kahve_var || (ay_var && baklava_var) || kadayf_var);

    ve tamamen farkl anlamda bir ifadeye dnr: "kahve varsa, veya ay ve baklava varsa,veya kadayf varsa; keyfim yerinde".

    Btn ilelerin ilem nceliklerini hemen hemen hibir programc ezbere bilmez. O yzden,gerekmese bile parantezler kullanarak hangi ifadeyi kurmak istediinizi aka belirtmekkodun anlalrl asndan ok yararldr.

    Giriten bool Okumak12.3

    Yukardaki rneklerdeki btn bool ifadeler ka "false" veya "true" dizgileri olarakyazdrlrlar. Bunun kart doru deildir: giriten okunan "false" ve "true" dizgileri otomatikolarak false ve true deerlerine dntrlmezler. O yzden, giriten gelen kelimeyi ncebir dizgi olarak okumamz, ve sonra ona bakarak bir bool deere dntrmemiz gerekir.

    Aadaki program denerken giriten "false" ve "true" girebilmenizi istiyorum. Bylece buderste anlatlanlar aynen deneyebileceksiniz. Bunun olabilmesi iin, derslerin bandaplanladm yoldan sapacak ve istemeyerek henz anlatmadm kodlar gstereceim.Giriten gelen "false" dizgisini false deerine, "true" dizgisini de true deerine dntrenbir ilev kullanacam. Bu ilev, std.conv modlnde tanmlanm olan to 'dan yararlanacak.("false" veya "true"dan baka bir dizgi girdiinizde ConvException hatas atlr.)

    Aadaki programlardaki main 'ler iinde anlalmaz bir taraf olmadn umuyorum. Amagiriten_bool_oku() ilevinde henz grmediiniz olanaklar kullanlyor; iine aklamalarkoydum ama isterseniz o ilevi imdilik tamamen gzard da edebilirsiniz.

    Mantksal fadeler

    Copyright 2009-2012, http://ddili.org 29

  • Problemler12.4

    1. Saylarn bykl ve kkl ile ilgili olan < , > vs. ileleri bu derste tandk. Buileler iinde "arasnda mdr" sorusunu yantlayan ile bulunmaz. Yani verilen birsaynn iki deer arasnda olup olmadn hesaplayan ile yoktur. Bir arkadanz bununstesinden gelmek iin yle bir program yazm olsun. Bu program derlemeye aln vederlenemediini grn:

    import std.stdio;

    void main(){

    int say = 15;

    writeln("Arasnda: ", 10 < say < 20); // derleme HATASI}

    Derleme hatasn gidermek iin btn ifadenin etrafnda parantez kullanmaydeneyin:

    writeln("Arasnda: ", (10 < say < 20));

    Yine derlenemediini grn.

    2. Ayn arkadanz hatay gidermek iin bir eyler denerken derleme hatasnn gruplama ilegiderildiini farketsin:

    writeln("Arasnda: ", (10 < say) < 20);

    Bu sefer programn beklendii gibi altn ve "true" yazdn gzlemleyin. Neyazk ki o kt yanltcdr nk programda gizli bir hata bulunuyor. Hatann etkisinigrmek iin 15 yerine bu sefer 20'den byk bir deer kullann:

    int say = 21;

    O deer 20'den kk olmad halde programn yine de "true" yazdrdn grn.

    pucu: Mantksal ifadelerin deerlerinin bool trnde olduklarn hatrlayn.Bildiiniz bool deerlerin 20 gibi bir saydan kk olmas gibi bir kavram tanmadk.

    3. D'de "arasnda mdr" sorusunu yantlayan mantksal ifadeyi u ekilde kodlamamzgerekir: alt snrdan byktr ve st snrdan kktr. Programdaki ifadeyi o ekildedeitirin ve artk ktnn beklendii gibi "true" olduunu grn. Ayrca, yazdnzifadenin say 'nn baka deerleri iin de doru altn denetleyin. rnein, say 50veya 1 olduunda sonu "false" ksn; 12 olduunda "true" ksn.

    4. Plaja ancak iki kouldan birisi gerekletiinde gidiyor olalm:

    Mesafe 10'dan az (kilometre varsayalm) ve yeterince bisiklet var Kii says 5 veya daha az, arabamz var, ve ehliyetli birisi var

    Aadaki programdaki mantksal ifadeyi bu koullar salandnda "true" yazdracakekilde kurun. Program denerken "... var m?" sorularna "false" veya "true" diyeyant verin:

    import std.stdio;import std.conv;import std.string;

    Mantksal fadeler

    Copyright 2009-2012, http://ddili.org 30

  • void main(){

    write("Ka kiiyiz? ");int kii_says;readf(" %s", &kii_says);

    write("Ka bisiklet var? ");int bisiklet_says;readf(" %s", &bisiklet_says);

    write("Mesafe? ");int mesafe;readf(" %s", &mesafe);

    bool araba_var = giriten_bool_oku("Araba var m? ");bool ehliyet_var = giriten_bool_oku("Ehliyet var m? ");

    /*Buradaki true'yu silin ve yerine sorudaki koullardanbirisi gerekletiinde true reten bir mantksal ifadeyazn:

    */writeln("Plaja gidiyoruz: ", true);

    }

    /*Bu ilevde henz gstermediim olanaklar kullanlyor. Buyzden, aslnda gerekmeyen aklamalar da ekledim.

    */bool giriten_bool_oku(string mesaj){

    // Mesaj yazdrwrite(mesaj, "(false veya true) ");

    // Girilen satr bir dizgiye okustring giri;while (giri.length == 0) {

    giri = chomp(readln());}

    // O dizgiden bir bool deer retbool dntrlen_deer = to!bool(giri);

    // retilen deeri ilevi arana dndrreturn dntrlen_deer;

    }

    eitli deerler girin, ve yazdnz ifadenin her durumda doru altn denetleyin:koullara uyduunda "true", uymadnda "false" yazsn.

    ... zmler

    Mantksal fadeler

    Copyright 2009-2012, http://ddili.org 31

  • if Koulu13

    Programda asl ilerin ifadeler tarafndan yapldn rendik. imdiye kadar grdmzprogramlarda ilemler main isimli ilev iinde batan sona doru ve yazldklar sradailetiliyorlard.

    D'de deyimler, ifadelerin iletilme kararlarn veren ve ifadelerin iletilme sralarn etkileyenprogram yaplardr. Kendileri deer retmezler ve yan etkileri yoktur. Deyimler, ifadeleriniletilip iletilmeyeceklerini ve bu ifadelerin hangi srada iletileceklerini belirlerler. Bukararlar verirken de yine ifadelerin deerlerinden yararlanrlar.

    Not: fade ve deyim kavramlarnn burada rendiiniz tanmlar D dilindeki tanmlardr.Baka dillerdeki tanmlar farkllklar gsterir ve hatta baz dillerde byle bir ayrm yoktur.

    if blou ve kapsam13.1

    if deyimi, ifadelerin iletilip iletilmeyeceine belirli bir mantksal ifadenin sonucunabakarak karar veren yapdr. "if", ngilizce'de "eer" anlamndadr; "eer tatl varsa"kullanmnda olduu gibi...

    Parantez iinde bir mantksal ifade alr, eer o ifade doruysa (yani deeri true ise), kmeparantezleri iindeki ifadeleri iletir. Bunun tersi olarak, mantksal ifade doru deilse kmeparantezleri iindeki ifadeleri iletmez.

    Sz dizimi yledir:

    if (bir_mantksal_ifade){

    // iletilecek bir ifade// iletilecek baka bir ifade// vs.

    }

    rnein "eer baklava varsa baklava ye ve sonra taba kaldr" gibi bir program yapsnyle yazabiliriz:

    import std.stdio;

    void main(){

    bool baklava_var = true;

    if (baklava_var) {writeln("Baklava yiyorum...");writeln("Taba kaldryorum...");

    }}

    O programda baklava_var 'n deeri false yaplrsa ka hibir ey yazdrlmaz, nk ifdeyimi kendisine verilen mantksal ifade false olduunda kme parantezi iindeki ifadeleriiletmez.

    Kme parantezleriyle gruplanm ifadelerin tmne blok, o blgeye de kapsam ad verilir.

    Yazm yanllarna yol amad srece, okumay kolaylatrmak iin programda istediinizgibi boluklar kullanabilirsiniz. Ben kme ama parantezini, yani { karakterini, if 'le aynsatra yazmay seviyorum; siz alt satra da yazabilirsiniz. kisi de olduka yaygnkullanmlardr.

    if Koulu

    Copyright 2009-2012, http://ddili.org 32

  • else blou ve kapsam13.2

    ou zaman if 'e verilen mantksal ifadenin doru olmad durumda da baz ilemleryapmak isteriz. rnein "eer ekmek varsa yemek ye, yoksa bakkala git" gibi bir karardaekmek olsa da olmasa da bir eylem vardr.

    D'de ifade false olduunda yaplacak iler else anahtar szcnden sonraki kmeparantezleri iinde belirtilir. "else", "deilse" demektir. Sz dizimi yledir:

    if (bir_mantksal_ifade){

    // doru olduunda iletilen ifadeler}else{

    // doru olMAdnda iletilen ifadeler}

    rnek olarak:

    if (ekmek_var) {writeln("Yemek yiyorum");

    } else {writeln("Bakkala yryorum");

    }

    O rnekte ekmek_var 'n deerine gre ya birinci dizgi ya da ikinci dizgi yazdrlr. Kmeparantezlerinin yerlerinin yine tercihe bal olduunu gryorsunuz.

    else kendisi bir deyim deildir, if deyiminin seime bal bir parasdr; tek banakullanlamaz.

    Kapsam parantezlerini hep kullann13.3

    Hi tavsiye edilmez ama bunu bilmenizde yarar var: Eer if 'in veya else 'in altndaki ifadetekse, kme parantezleri gerekmez. Yukardaki ifade kme parantezleri kullanlmadanaadaki gibi de yazlabilir:

    if (ekmek_var)writeln("Yemek yiyorum");

    elsewriteln("Bakkala yryorum");

    ou deneyimli programc tek ifadelerde bile kme parantezi kullanr. (Bununla ilgili birhatay problemler blmnde greceksiniz.) Mutlaka kme parantezleri kullanmanz bunoktada nermemin bir nedeni var: Bu neriye hemen hemen hibir zaman uyulmayan tekdurumu da imdi anlatacam.

    "if, else if, else" zinciri13.4

    Dilin bize verdii glerden birisi, ifade ve deyimleri serbeste kartrarak kullanmaimkandr. fade ve deyimleri kapsamlar iinde de kullanabiliriz. rnein bir elsekapsamnda bile if deyimi bulunabilir. Programlarn akll olarak alglanmalar, hep bizimifade ve deyimleri doru sonular verecek ekilde birbirlerine balamamzdan doar.Bisiklete binmeyi yrmekten daha ok sevdiimizi varsayarsak:

    if Koulu

    Copyright 2009-2012, http://ddili.org 33

  • if (ekmek_var) {writeln("Yemek yiyorum");

    } else {

    if (bisiklet_var) {writeln("Uzaktaki frna gidiyorum");

    } else {writeln("Yakndaki bakkala yryorum");

    }

    }

    Oradaki if deyimlerinin anlam udur: "eer ekmek varsa: yemek yiyorum; eer ekmekyoksa: bisiklet varsa frna gidiyorum, yoksa bakkala yryorum".

    Biraz daha ileri gidelim ve bisiklet olmadnda hemen bakkala yrmek yerine, komununevde olup olmamasna gre davranalm:

    if (ekmek_var) {writeln("Yemek yiyorum");

    } else {

    if (bisiklet_var) {writeln("Uzaktaki frna gidiyorum");

    } else {

    if (komu_evde) {writeln("Komudan istiyorum");

    } else{writeln("Yakndaki bakkala yryorum");

    }}

    }

    Burada grld gibi "eer byleyse bunu yap, deilse ama yleyse onu yap, o da deilseama yleyse unu yap, vs." gibi yaplar programclkta ok kullanlr. Ne yazk ki byleyaznca kodda fazla boluklar oluur: buradaki 3 if deyimi ve 4 writeln ifadesi iin toplam13 satr yazm olduk (bo satrlar saymadan).

    Sk karlalan bu yapy daha dzenli olarak yazmak iin, byle zincirleme kararlarda biristisna olarak ilerinde tek bir if deyimi bulunan else 'lerin kapsam parantezlerini yazmayz.

    Hibir zaman kodu aadaki gibi irkin brakmayn! Ben bir sonraki adma geme aamasolarak gsteriyorum (o yzden de renksiz braktm). lerinde tek bir if olan else 'lerin kmeparantezlerini kaldrnca:

    if (ekmek_var) {writeln("Yemek yiyorum");

    } else

    if (bisiklet_var) {writeln("Uzaktaki frna gidiyorum");

    } else

    if (komu_evde) {writeln("Komudan istiyorum");

    } else{writeln("Yakndaki bakkala yryorum");

    }

    if Koulu

    Copyright 2009-2012, http://ddili.org 34

  • Bir adm daha ileri giderek if anahtar szcklerini de stlerindeki else satrlarna eker vebiraz da hizalarsak, son derece okunakl bir yap oluur:

    if (ekmek_var) {writeln("Yemek yiyorum");

    } else if (bisiklet_var) {writeln("Uzaktaki frna gidiyorum");

    } else if (komu_evde) {writeln("Komudan istiyorum");

    } else{writeln("Yakndaki bakkala yryorum");

    }

    Bylece hem satr says azalm olur, hem de kararlara gre iletilecek olan btn ifadeler altalta gelmi olurlar. Drt koulun hangi srada denetlendii ve her koulda ne yapld birbakta anlalr.

    ok sk karlalan bu kod yapsna "if, else if, else" denir.

    Problemler13.5

    1. Aadaki programdaki mantksal ifadenin true olduunu gryoruz. Dolaysylaprogramn limonata iip barda ykamasn bekleriz:

    import std.stdio;

    void main(){

    bool limonata_var = true;

    if (limonata_var) {writeln("Limonata iiyorum");writeln("Barda ykyorum");

    } elsewriteln("Baklava yiyorum");writeln("Taba kaldryorum");

    }

    Oysa program altrrsanz, ktsnda bir de tabak kaldrldn greceksiniz:

    Limonata iiyorumBarda ykyorumTaba kaldryorum

    Neden? Program dzelterek beklenen kty vermesini salayn.2. Kullancyla oyun oynayan (ve ona fazlasyla gvenen) bir program yazn. Kullanc att

    zarn deerini girsin. Zarn deerine gre ya kullanc kazansn, ya da program:

    Zar Deeri Program kts1 Siz kazandnz2 Siz kazandnz3 Siz kazandnz4 Ben kazandm5 Ben kazandm6 Ben kazandm

    Baka bir deer HATA: Geersiz deer

    Ek puan: Hatal giri olutuunda deeri de yazsn. rnein:

    if Koulu

    Copyright 2009-2012, http://ddili.org 35

  • HATA: Geersiz deer: 7

    3. Ayn oyunu yle deitirelim: Kullanc 1'den 1000'e kadar bir say girsin ve 1-500aralnda siz kazann, 501-1000 aralnda bilgisayar kazansn. Hl bir ncekiproblemdeki zmleri uygulayabilir misiniz?

    ... zmler

    if Koulu

    Copyright 2009-2012, http://ddili.org 36

  • while Dngs14

    while dngs if kouluna ok benzer ve onun tekrar tekrar iletilmesidir. Mantksal birifade alr, bu ifade doru ise kapsamdaki ifadeleri iletir. Kapsamdaki ilemler tamamlanncamantksal ifadeye tekrar bakar ve doru olduu srece bu dngde devam eder. "while","olduu srece" demektir. Sz dizimi yledir:

    while (bir_mantksal_ifade){

    // iletilecek bir ifade// iletilecek baka bir ifade// vs...

    }

    rnein "baklava olduu srece baklava ye" gibi bir ifade yle programlanabilir:

    import std.stdio;

    void main(){

    bool hl_baklava_var = true;

    while (hl_baklava_var) {writeln("Tabaa baklava koyuyorum");writeln("Baklava yiyorum");

    }}

    O program sonsuza kadar o dng iinde kalacaktr, nk hl_baklava_var deikeninindeeri hi deimemekte ve hep true olarak kalmaktadr.

    while 'n gc, mantksal ifadenin programn almas srasnda deitii durumlarda dahaiyi anlalr. Bunu grmek iin kullancdan bir say alan ve bu say "0 veya daha byk"olduu srece dngde kalan bir program dnelim. Hatrlarsanz, int trndekideikenlerin ilk deeri 0 olduu iin bu programda da say 'nn ilk deeri 0'dr:

    import std.stdio;

    void main(){

    int say;

    while (say >= 0) {write("Bir say girin: ");readf(" %s", &say);

    writeln(say, " iin teekkrler!");}

    writeln("Dngden ktm");}

    O program girilen say iin teekkr eder ve eksi bir say girildiinde dngden kar.

    continue deyimi14.1

    "continue", "devam et" demektir. Bu deyim, dngnn geri kalanndaki ifadelerin iletilmeleriyerine, hemen dngnn bana dnlmesini salar.

    while Dngs

    Copyright 2009-2012, http://ddili.org 37

  • Yukardaki programda girilen her say iin teekkr etmek yerine, biraz seici olalm ve 13deeri girildiinde beenmeyip tekrar dngnn bana dnelim. Bu programda 13'eteekkr edilmez, nk say 13 olduunda continue ile hemen dngnn bana gidilir:

    import std.stdio;

    void main(){

    int say;

    while (say >= 0) {write("Bir say girin: ");readf(" %s", &say);

    if (say == 13) {writeln("Uursuz say kabul etmiyorum...");continue;

    }

    writeln(say, " iin teekkrler!");}

    writeln("Dngden ktm");}

    O programn davrann yle zetleyebiliriz: girilen say 0 veya daha byk olduu srecesay al, ama 13 deerini kullanma.

    break deyimi14.2

    Bir ok szlk anlam olan "break" D'de "dngy kr" anlamndadr. Bazen artk dngyleiimiz kalmadn anladmzda dngden hemen kmak isteriz; break bunu salar. Buprogramn arad zel saynn 42 olduunu varsayalm ve o sayy bulduu an dngyle iibitsin:

    import std.stdio;

    void main(){

    int say;

    while (say >= 0) {write("Bir say girin: ");readf(" %s", &say);

    if (say == 42) {writeln("ARADIIMI BULDUM!");break;

    }

    writeln(say, " iin teekkrler!");}

    writeln("Dngden ktm");}

    imdiki davrann da yle zetleyebiliriz: girilen say 0 veya daha byk olduu srece sayal, 42 gelirse hemen k.

    while Dngs

    Copyright 2009-2012, http://ddili.org 38

  • Sonsuz dng14.3

    break deyiminin kullanld baz durumlarda bilerek sonsuz dng oluturulur ve breakdeyimi o dngnn tek k olur. Sonsuz dng oluturmak iin while 'a sabit true deeriverilir. rnein kullancya bir men gstererek ondan bir komut bekleyen aadakiprogram, ancak kullanc zellikle istediinde bu dngden kmaktadr:

    import std.stdio;

    void main(){

    // Sonsuz dng, nk mantksal ifade hep true:while (true) {

    write("0:k, 1:Trke, 2:ngilizce - Seiminiz? ");

    int seim;readf(" %s", &seim);

    if (seim == 0) {writeln("Tamam, sonra grrz...");break; // Bu dngnn tek k

    } else if (seim == 1) {writeln("Merhaba!");

    } else if (seim == 2) {writeln("Hello!");

    } else {writeln("Onu bilmiyorum... :/");

    }}

    }

    (Not: Sonsuz dnglerden hata atlarak da klabilir. Hata atma dzeneini daha sonraki birblmde greceiz.)

    Problemler14.4

    1. u program giriten 3 geldii srece dngde kalmak iin programlanm ama bir hatavar: kullancdan bir kere bile say istemiyor:

    import std.stdio;

    void main(){

    int say;

    while (say == 3) {write("Say? ");readf(" %s", &say);

    }}

    Neden? O programdaki hatay giderin ve beklendii gibi almasn salayn:kullancdan say alsn ve say 3 olduu srece dngde kalsn.

    2. Bilgisayar iki kiiye (Aye ve Bar) yle bir oyun oynatsn: en bata Aye'den 1-10aralnda bir say alsn. Aye'nin bu aralk dnda say girmesini kabul etmesin ve dorusay girene kadar Aye'den say almaya devam etsin.

    Ondan sonra Bar'tan teker teker say almaya balasn ve Bar'n girdii sayAye'nin batan girdii sayya eit olunca oyunu sonlandrsn.

    while Dngs

    Copyright 2009-2012, http://ddili.org 39

  • Not: Aye'nin girdii say ekranda grnd iin tabii ki Bar tarafndan hemenbilinir. :o) Bu aamada bunun bir nemi yok; burada amacmz dngleri renmek...

    ... zmler

    while Dngs

    Copyright 2009-2012, http://ddili.org 40

  • Tamsaylar ve Aritmetik lemler15

    D'nin karar verme ile ilgili yaplarndan if 'i ve while ' grdk. Bu blmde temel trlerinsaysal olanlaryla yaplan aritmetik ilemlere bakacaz. Bylece bundan sonraki blmlerdeok daha becerikli ve ilgin programlar yazabileceksiniz.

    Aritmetik ilemler aslnda son derece basittirler nk zaten gnlk hayatmzda her zamankarmza karlar. Buna ramen, temel trlerle ilgilenirken mutlaka bilinmesi gereken oknemli kavramlar da vardr. Tr uzunluu, tama, ve krplma kavramlarn anlyorsanz btnkonuyu bu tabloya bakarak geebilirsiniz:

    le Etkisi rnek kullanm++ deerini bir arttrr ++deiken-- deerini bir azaltr --deiken+ iki deerin toplam birinci + ikinci- birinciden ikincinin karlm birinci - ikinci* iki deerin arpm birinci * ikinci/ birincinin ikinciye blm birinci / ikinci% birincinin ikinciye blmnnden kalan birinci % ikinci^^ birincinin ikinci'nin deeri kadar ss

    (birincinin ikinci kere kendisiyle arpm)birinci ^^ ikinci

    Tablodaki ikili ilelerin yanna = karakteri gelenleri de vardr: += , -= , *= , /= , %= , ve ^^= .Bunlar ilemin sonucunu soldaki deikene atarlar:

    say += 10;

    O ifade say 'ya 10 ekler ve sonucu yine say 'ya atar; sonuta deerini 10 arttrm olur. uifadenin edeeridir:

    say = say + 10;

    Tama: Her deer her tre smaz ve taabilir. rnein 0 ile 255 arasnda deerler tutabilenubyte 'a 260 deeri verilmeye kalklrsa deeri 4 olur.

    Krplma: Tamsaylar virglden sonrasn tutamazlar. rnein 3/2 ifadesinin deeri 1 olur.

    Eer bu kavramlar rnein baka dillerden biliyorsanz, bu kadar yetebilir. sterseniz gerikalann okumayabilirsiniz, ama yine de sondaki problemleri atlamayn.

    Ayrntl Bilgi15.1

    Bu blm ilgisiz bilgiler veriyor gibi gelebilir; nk aritmetik ilemler hepimizin gnlkhayatta srekli olarak karlatmz kavramlardr: Tanesi 10 lira olan bir eyden iki tanealrsak 20 lira veririz, veya 45 lira olan eylerin tanesi 15 liradr...

    Ne yazk ki iler bilgisayarda bu kadar basit olmayabilir. Saylarn bilgisayarda naslsaklandklarn bilmezsek, rnein 3 milyar borcu olan bir firmann 3 milyar daha bor almassonucunda borcunun 1.7 milyara dtn grebiliriz. Baka bir rnek olarak, 1 kutusu 4ocua yeten dondurmadan 11 ocuk iin 2 tane yetecek diye hesaplayabiliriz.

    Bu blm size ncekilerden daha teknik gelebilir ama tamsaylarn bilgisayarda nasl ifadeedildiklerinin bir programc tarafndan mutlaka bilinmesi gerekir.

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 41

  • Tamsaylar15.1.1

    Tamsaylar ancak tam deerler alabilen trlerdir: -2, 0, 10, vs. Bu trler 2.5 gibi kesirlideerler tutamazlar. Daha nce temel trler tablosunda da grdnz tamsay trleriunlardr:

    TrBit

    Uzunluulk

    Deeribyte 8 0

    ubyte 8 0short 16 0

    ushort 16 0int 32 0

    uint 32 0long 64 0L

    ulong 64 0L

    Hatrlarsanz, tr isimlerinin bandaki u karakteri "unsigned"dan geliyordu ve "iaretsiz"demekti. O trler eksi iareti olmayan trlerdir ve yalnzca sfr ve daha byk deerleralabilirler.

    Bitler ve tr uzunluklar15.1.2

    Gnmzdeki bilgisayar sistemlerinde en kk bilgi paras bittir. Bit, elektronik dzeyde vedevrelerin belirli noktalarnda elektrik geriliminin var olup olmamas kavramyla belirlendiiiin, ancak iki durumdan birisinde bulunabilir. Bu durumlar 0 ve 1 deerleri olarak kabuledilmilerdir. Yani sonuta bir bit, iki deiik deer saklayabilir.

    Yalnzca iki durumla ifade edilebilen kavramlarla fazla karlamadmz iin bitinkullanll da azdr: yaz veya tura, odada klarn ak olup olmad, vs. gibi iki durumuolan kavramlar...

    Biraz ileri giderek iki biti bir araya getirirsek, ikisinin birlikte saklayabilecekleri toplam deeradedi artar. kisinin ayr ayr 0 veya 1 durumunda olmalarna gre toplam 4 olaslk vardr.Soldaki rakam birinci biti, sadaki rakam da ikinci biti gsteriyor olsun: 00, 01, 10, ve 11.Yani bir bit eklemeyle toplam durum says ikiye katlanm olur. Bit eklemenin etkisini dahaiyi grebilmek iin bir adm daha atabiliriz: bit, toplam 8 deiik durumda bulunabilir:000, 001, 010, 011, 100, 101, 110, 111.

    Bu sekiz durumun hangi tamsay deerlerine karlk gelecekleri tamamen anlamalara vegeleneklere kalmtr. Yoksa rnein 000 durumu 42 deerini, 001 durumu 123 deerini, vs.gsteriyor da olabilirdi. Tabii bu kadar ilgisiz deerler kullanl olmayacaklarndan, 3 bitlikbir tr rnek alrsak, bu 8 durumun iaretli ve iaretsiz olarak kullanlmasnda alddeerler u tablodakine benzer:

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 42

  • BitlerinDurumu

    aretsizDeer

    aretliDeer

    000 0 0001 1 1010 2 2011 3 3100 4 -4101 5 -3110 6 -2111 7 -1

    Burada grmenizi istediim, 3 bitten nasl 8 farkl deer elde edilebildiidir.

    Grld gibi, eklenen her bit, saklanabilecek bilgi miktarn iki katna kartmaktadr. Bunudevam ettirirsek; bitlerin bir araya getirilmelerinden oluturulan deiik uzunluktaki trlerinsaklayabildikleri farkl deer miktarlarn, bir nceki bit uzunluunun saklayabilecei deermiktarn 2 ile arparak yle grebiliriz:

    BitAdedi

    SaklanabilecekFarkl Deer AdediD Tr

    En KkDeeri

    En BykDeeri

    1 22 43 84 165 326 647 1288 256 byte

    ubyte-128

    0127255

    ... ...16 65,536 short

    ushort-32768

    03276765535

    ... ...32 4,294,967,296 int

    uint-2147483648

    021474836474294967295

    ... ...64 18,446,744,073,709,551,616 long

    ulong-9223372036854775808

    09223372036854775807

    18446744073709551615... ...

    Baz tablo satrlarn atladm ve ayn sayda bitten oluan D trlerinin iaretli ve iaretsizolanlarn ayn satrda gsterdim (rnein int ve uint 32 bitlik satrdalar).

    Hangi durumda hangi tr15.1.3

    bitlik bir tr toplam 8 deer tayabildii iin rnein ancak atlan zarn sonucu veyahaftann gn says gibi kavramlar ifade etmek iin kullanlabilir. (D'de 3 bitlik tr yoktur;rnek olarak kullanyorum.)

    te yandan, uint ok byk bir tr olsa da, dnyadaki btn insanlar kapsayacak bir kimlikkart numaras gibi bir kavram iin kullanlamaz, nk uint dnyadaki insan nfusu olan 7

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 43

  • milyardan daha az sayda deer saklayabilir. long ve ulong 'un Trke'de nasl okunduunubile bilemeyeceim toplam deer adedi ise ou kavram iin fazlasyla yeterlidir.

    Temel bir kural olarak, zel bir neden yoksa, tamsaylar iin ncelikle int 'i dnebilirsiniz.

    Tama15.1.4

    Trlerin bit saylaryla belirlenen bu kstlamalar, onlarla yaplan ilemlerde garip sonularaneden olur. rnein deerleri 3 milyar olan iki uint 'in toplam gerekte 6 milyar olsa da, enfazla 4 milyar kadar deer saklayabilen uint 'e smaz. Bu durumda sonu uint 'ten tamolur; programda hibir uyar verilmeden 6 milyarn ancak 4 milyardan geri kalan, yani 2milyar kadar sonu deikeninde kalr. (Aslnda 6 milyar eksi 4.3 milyar, yani yaklak olarak1.7 milyar...)

    Krplma15.1.5

    Tamsaylar kesirli deerler tutamadklar iin ne kadar nemli olsa da, virglden sonrakibilgiyi kaybederler. rnein 1 kutusu 4 ocua yeten dondurmadan 11 ocuk iin 2.75 kutugerekiyor olsa bile, bu deer bir tamsay tr iinde ancak 2 olarak saklanabilir.

    Tamaya ve krplmaya kar alabileceiniz baz nlemleri ilemlerin tantmndan sonravereceim. nce aritmetik ilemleri tanyalm.

    Tr nitelikleri hatrlatmas15.1.6

    Temel trlerin tantld derste tr niteliklerini grmtk: .min , trn alabilecei en kkdeeri; .max da en byk deeri veriyordu.

    Arttrma: ++15.1.7

    Tek bir deikenle kullanlr. Deikenin isminden nce yazlr ve o deikenin deerini 1arttrr:

    import std.stdio;

    void main(){

    int say = 10;++say;writeln("Yeni deeri: ", say);

    }

    Yeni deeri: 11

    Arttrma ileci, biraz aada greceiniz atamal toplama ilecinin 1 deeri ilekullanlmasnn edeeridir:

    say += 1; // ++say ifadesinin ayns

    Arttrma ileminin sonucu; eer trn tayabilecei en yksek deeri ayorsa, o zamantaar ve trn alabildii en dk deere dnr. Bunu denemek iin nceki deeri int.maxolan bir deikeni arttrrsak, yeni deerinin int.min olduunu grrz:

    import std.stdio;

    void main(){

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 44

  • writeln("en dk int deeri : ", int.min);writeln("en yksek int deeri : ", int.max);

    int say = int.max;writeln("saynn nceki deeri : ", say);++say;writeln("saynn sonraki deeri: ", say);

    }

    en dk int deeri : -2147483648en yksek int deeri : 2147483647saynn nceki deeri : 2147483647saynn sonraki deeri: -2147483648

    Bu ok nemli bir konudur; nk say hibir uyar verilmeden, en yksek deerinden endk deerine gemektedir; hem de arttrma ilemi sonucunda!

    Buna stten tama denir. Benzer tama davranlarn azaltma, toplama, ve karmailemlerinde de greceiz.

    Azaltma: --15.1.8

    Tek bir deikenle kullanlr. Deikenin isminden nce yazlr ve o deikenin deerini 1azaltr:

    --say; // deeri bir azalr

    Azaltma ileci, biraz aada greceiniz atamal karma ilecinin 1 deeri ilekullanlmasnn edeeridir:

    say -= 1; // --say ifadesinin ayns

    ++ ilecine benzer ekilde, eer deikenin deeri batan o trn en dk deerindeyse,yeni deeri o trn en yksek deeri olur. Buna da alttan tama ad verilir.

    Toplama: +15.1.9

    ki ifadeyle kullanlr ve aralarna yazld iki ifadenin toplamn verir:

    import std.stdio;

    void main(){

    int birinci = 12;int ikinci = 100;

    writeln("Sonu: ", birinci + ikinci);writeln("Sabit ifadeyle: ", 1000 + ikinci);

    }

    Sonu: 112Sabit ifadeyle: 1100

    Eer iki ifadenin toplam o trde saklanabilecek en yksek deerden fazlaysa, yine tamaoluur ve deerlerin ikisinden de daha kk bir sonu elde edilir:

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 45

  • import std.stdio;

    void main(){

    // ki tane 3 milyaruint birinci = 3000000000;uint ikinci = 3000000000;

    writeln("uint'in en yksek deeri: ", uint.max);writeln(" birinci: ", birinci);writeln(" ikinci: ", ikinci);writeln(" toplam: ", birinci + ikinci);writeln("TAMA! Sonu 6 milyar olmad!");

    }

    uint'in en yksek deeri: 4294967295birinci: 3000000000ikinci: 3000000000toplam: 1705032704

    TAMA! Sonu 6 milyar olmad!

    karma: -15.1.10

    ki ifadeyle kullanlr ve birinci ile ikincinin farkn verir:

    import std.stdio;

    void main(){

    int say_1 = 10;int say_2 = 20;

    writeln(say_1 - say_2);writeln(say_2 - say_1);

    }

    -1010

    Eer sonucu tutan deiken iaretsizse ve sonu eksi bir deer alrsa, yine garip sonulardoar. Yukardaki program uint iin tekrar yazarsak:

    import std.stdio;

    void main(){

    uint say_1 = 10;uint say_2 = 20;

    writeln("SORUN! uint eksi deer tutamaz:");writeln(say_1 - say_2);writeln(say_2 - say_1);

    }

    SORUN! uint eksi deer tutamaz:429496728610

    Eninde sonunda farklar alnacak kavramlar iin hep iaretli trlerden semek iyi bir karardr.Yine, zel bir neden yoksa normalde int 'i seebilirsiniz.

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 46

  • arpma: *15.1.11

    ki ifadenin deerlerini arpar. Yine tamaya maruzdur:

    import std.stdio;

    void main(){

    uint say_1 = 6;uint say_2 = 7;

    writeln(say_1 * say_2);}

    42

    Blme: /15.1.12

    Birinci ifadeyi ikinci ifadeye bler. Tamsaylar kesirli say tutamayacaklar iin, eer varsasonucun kesirli ksm atlr. Buna krplma denir. rnein bu yzden aadaki program 3.5deil, 3 yazmaktadr:

    import std.stdio;

    void main(){

    writeln(7 / 2);}

    3

    Virglden sonrasnn nemli olduu hesaplarda tamsay trleri deil, kesirli say trlerikullanlr. Kesirli say trlerini bir sonraki blmde greceiz.

    Kalan: %15.1.13

    Birinci ifadeyi ikinci ifadeye bler ve kalann verir. rnein 10'un 6'ya blmnden kalan4'tr:

    import std.stdio;

    void main(){

    writeln(10 % 6);}

    4

    Bu ile bir saynn tek veya ift olduunu anlamada kullanlr. Tek saylarn ikiye blmndenkalan her zaman iin 1 olduundan, kalann 0 olup olmadna bakarak saynn tek veya iftolduu kolayca anlalr:

    if ((say % 2) == 0) {writeln("ift say");

    } else {writeln("tek say");

    }

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 47

  • s alma: ^^15.1.14

    Birinci ifadenin ikinci ifade ile belirtilen ssn alr. rnein 3 ss 4, 3'n 4 kere kendisiylearpmdr:

    import std.stdio;

    void main(){

    writeln(3 ^^ 4);}

    81

    Atamal aritmetik ileleri15.1.15

    Yukarda gsterilen ve iki ifade alan aritmetik ilelerin atamal olanlar da vardr. Bunlarilemi gerekletirdikten sonra ek olarak sonucu sol taraftaki deikene atarlar:

    import std.stdio;

    void main(){

    int say = 10;

    say += 20; // say = say + 20 ile ayn ey; imdi 30say -= 5; // say = say - 5 ile ayn ey; imdi 25say *= 2; // say = say * 2 ile ayn ey; imdi 50say /= 3; // say = say / 3 ile ayn ey; imdi 16say %= 7; // say = say % 7 ile ayn ey; imdi 2say ^^= 6; // say = say ^^ 6 ile ayn ey; imdi 64

    writeln(say);}

    64

    Eksi iareti: -15.1.16

    nne yazld ifadenin deerini artysa eksi, eksiyse art yapar:

    import std.stdio;

    void main(){

    int say_1 = 1;int say_2 = -2;

    writeln(-say_1);writeln(-say_2);

    }

    -12

    Bu ilecin sonucunun tr, deikenin tr ile ayndr. uint gibi iaretsiz trler eksi deerlertutamadklar iin, bu ilecin onlarla kullanlmas artc sonular dourabilir:

    uint say = 1;writeln("eksi iaretlisi: ", -say);

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 48

  • -say ifadesinin tr de uint 'tir ve o yzden eksi deer alamaz:

    eksi iaretlisi: 4294967295

    Art iareti: +15.1.17

    Matematikte saylarn nne yazlan + iareti gibi bunun da hibir etkisi yoktur. fadenindeeri eksiyse yine eksi, artysa yine art kalr:

    import std.stdio;

    void main(){

    int say_1 = 1;int say_2 = -2;

    writeln(+say_1);writeln(+say_2);

    }

    1-2

    nceki deerli arttrma: ++15.1.18

    Not: zel bir nedeni yoksa normal arttrma ilecini kullanmanz neririm.

    Normal arttrma ilecinden farkl olarak ifadeden sonra yazlr. Yukarda anlatlan ++ilecinde olduu gibi ifadenin deerini bir arttrr, ama iinde getii ifadede nceki deeriolarak kullanlr. Bunun etkisini grmek iin normal ++ ileciyle karlatralm:

    import std.stdio;

    void main(){

    int normal_arttrlan = 1;writeln(++normal_arttrlan); // 2 yazlrwriteln(normal_arttrlan); // 2 yazlr

    int nceki_deerli_arttrlan = 1;

    // Deeri arttrlr ama ifadede nceki deeri kullanlr:writeln(nceki_deerli_arttrlan++); // 1 yazlrwriteln(nceki_deerli_arttrlan); // 2 yazlr

    }

    2212

    Yukardaki arttrma ileminin olduu satr unun edeeridir:

    int nceki_deeri = nceki_deerli_arttrlan;++nceki_deerli_arttrlan;writeln(nceki_deeri); // 1 yazlr

    Yani bir anlamda, say arttrlmtr, ama iinde bulunduu ifadede nceki deerikullanlmtr.

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 49

  • nceki deerli azaltma: --15.1.19

    Not: zel bir nedeni yoksa normal azaltma ilecini kullanmanz neririm.

    nceki deerli arttrma ++ ile ayn ekilde davranr ama arttrmak yerine azaltr.

    lem ncelikleri15.1.20

    Yukardaki ilemleri hep tek balarna ve bir veya iki ifade ile grdk. Oysa mantksalifadelerde olduu gibi, birden fazla aritmetik ilemi bir arada kullanarak daha karmakilemler oluturabiliriz:

    int say = 77;int sonu = (((say + 8) * 3) / (say - 1)) % 5;

    Mantksal ifadelerde olduu gibi, bu ilelerin de D tarafndan belirlenmi olan nceliklerivardr. rnein * ilecinin ncelii + ilecininkinden yksek olduu iin, parantezlerkullanlmadnda, say + 8 * 3 ifadesi, nce * ilemi uygulanaca iin say + 24 olarakhesaplanr. Bu da yukardakinden farkl bir ilemdir.

    O yzden, parantezler kullanarak hem ilemleri doru srada uygulatm olursunuz, hem dekodu okuyan kiilere kodu anlamalarnda yardmc olmu olursunuz.

    Tamaya kar nlemler15.1.21

    Eer bir ilemin sonucu seilen tre smyorsa, zaten yaplacak bir ey yoktur. Ama bazensonu sacak olsa da ara ilemler srasnda oluabilecek tamalar nedeniyle yanl sonularelde edilebilir.

    Bir rnee bakalm: kenarlar 40'a 60 kilometre olan bir alann her 1000 metre karesine birelma aac dikmek istiyoruz. Ka aa gerekir?

    Bu problemi kat kalemle znce sonucun 40000 arp 60000 bl 1000 olarak 2.4 milyonolduunu grrz. Bunu hesaplayan bir programa bakalm:

    import std.stdio;

    void main(){

    int en = 40000;int boy = 60000;int aa_bana_yer = 1000;

    int gereken_aa = en * boy / aa_bana_yer;

    writeln("Gereken elma aac: ", gereken_aa);}

    Gereken elma aac: -1894967

    Brakn yakn olmay, bu sonu sfrdan bile kktr! Bu sorunun nedeni, programdakien * boy alt ileminin bir int 'e samayacak kadar byk olduu iin tamas, ve bu yzdende geri kalan / aa_bana_yer ileminin de yanl kmasdr.

    Buradaki ara ilem srasnda oluan tamay deiken sralarn deitirerek giderebiliriz:

    int gereken_aa = en / aa_bana_yer * boy;

    imdi hesap doru kar:

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 50

  • Gereken elma aac: 2400000

    Bu ifadenin doru almasnn nedeni, imdiki ara ilem olan en / aa_bana_yerifadesinin deerinin 40 olduu iin artk int 'ten tamamasdr.

    Aslnda byle bir durumda en doru zm; bir tamsay tr deil, kesirli say trlerindenbirisini kullanmaktr: float , double , veya real .

    Krplmaya kar nlemler15.1.22

    Benzer ekilde, ara ilemlerin srasn deitirerek krplmann da etkisini azaltabiliriz. Bununilgin bir rneini, ayn sayya blp yine ayn sayyla arptmzda grebiliriz: 10/9*9ileminin sonucunun 10 kmasn bekleriz. Oysa:

    import std.stdio;

    void main(){

    writeln(10 / 9 * 9);}

    9

    Yine, ilemlerin srasn deitirince krplma olmayaca iin sonu doru kar:

    writeln(10 * 9 / 9);

    10

    Burada da en iyi zm belki de bir kesirli say tr kullanmaktr.

    Problemler15.2

    1. Yazacanz program kullancdan iki tamsay alsn ve birincinin iinde ikinciden ka tanebulunduunu ve artann versin. rnein 7 ve 3 deerleri girilince ka unu yazsn:

    7 = 3 * 2 + 1

    2. Ayn program, kalan 0 olduunda daha ksa sonu verecek ekilde deitirin. rnein 10ve 5 verince gereksizce "10 = 5 * 2 + 0" yazmak yerine, yalnzca yeterli bilgiyi versin:

    10 = 5 * 2

    3. Drt ilemi destekleyen basit bir hesap makinesi yazn. lemi bir menden setirsin vegirilen iki deere o ilemi uygulasn. Bu programda tama ve krplma sorunlarn gzardedebilirsiniz.

    4. Yazacanz program 1'den 10'a kadar btn saylar ayr satrlarda olacak ekildeyazdrsn. Ama, bir istisna olarak 7 deerini yazdrmasn. Programda u ekildetekrarlanan writeln ifadeleri kullanmayn:

    import std.stdio;

    void main(){

    // Byle yapmayn!

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 51

  • writeln(1);writeln(2);writeln(3);writeln(4);writeln(5);writeln(6);writeln(8);writeln(9);writeln(10);

    }

    Onun yerine, bir dng iinde deeri arttrlan bir deiken dnn ve 7'yiyazdrmama kouluna da dikkat edin. Burada herhalde eit olmama koulunudenetleyen != ilecini kullanmak zorunda kalacaksnz.

    ... zmler

    Tamsaylar ve Aritmetik lemler

    Copyright 2009-2012, http://ddili.org 52

  • Kesirli Saylar16

    Tamsaylarn ve aritmetik ilemlerin olduka kolay olduklarn, buna ramen yaplarndankaynaklanan tama ve krplma gibi zellikleri olduunu grdk.

    Bu blmde de biraz ayrntya girmek zorundayz. Eer aadaki listedeki hereyi bildiinizidnyorsanz, ayrntl bilgileri okumayp dorudan problemlere geebilirsiniz:

    Bin kere 0.001 eklemek 1 eklemekle ayn ey deildir == veya != mantksal ifadelerini kesirli say trleriyle kullanmak ou durumda hataldr Kesirli saylarn ilk deerleri 0 deil, .nan 'dr; .nan deeriyle ilem yaplamaz; baka bir

    deerle karlatrldnda .nan ne kktr ne de byk stten tama deeri .infinity , alttan tama deeri -.infinity 'dir

    Kesirli say trleri ok daha kullanldrlar ama onlarn da mutlaka bilinmesi gerekenzellikleri vardr. Krplma konusunda ok iyidirler, nk zaten zellikle virglden sonrasiin tasarlanmlardr. Belirli sayda bitle snrl olduklar iin tama bu trlerde de vardrancak alabildikleri deer aral tamsaylarla karlatrldnda olaanst genitir. Ekolarak, tamsay trlerinin tama durumunda sessiz kalmalarnn aksine, kesirli saylar"sonsuzluk" deerini alrlar.

    nce kesirli say trlerini hatrlayalm:

    Tr Bit Uzunluu lk Deerifloat 32 float.nandouble 64 double.nan

    realen az 64, veya

    donanm salyorsadaha fazla (rnein 80)

    real.nan

    Kesirli tr nitelikleri16.1

    Kesirli trlerin nitelikleri tamsaylardan daha fazladr:

    .stringof trn okunakl ismidir .sizeof trn bayt olarak uzunluudur; trn ka bitten olutuunu hesaplamak iin bu

    deeri bir bayttaki bit says olan 8 ile arpmak gerekir .max "en ok" anlamna gelen "maximum"un ksaltmasdr; trn alabilecei en byk

    deerdir; bu deerin eksi iaretlisi de trn alabilecei en dk deer olur .min_normal "ifade edebildii sfra en yakn normalize deer" anlamndadr (tr aslnda

    bundan daha kk deerler de ifade edebilir ama o deerlerin duyarl trn normalduyarlnn altndadr)

    .dig "basamak says" anlamna gelen "digits"in ksaltmasdr; trn ka basamakduyarl olduunu belirtir

    .infinity "sonsuz" anlamna gelir; tama durumunda kullanlan deerdir

    Not: "Trn alabilecei en kk deer", .min deildir; .max 'n eksi iaretlisidir: rnein -double.max .

    Dier niteliklere bu aamada gerek olduunu dnmyorum; btn nitelikleri Properties forFloating Point Types bal altnda bulabilirsiniz.

    Yukardaki nitelikleri, birbirleriyle olan ilikilerini grmek iin bir say izgisine yleyerletirebiliriz:

    Kesirli Saylar

    Copyright 2009-2012, http://ddili.org 53

  • + +-----------+------------+ .... + .... +----------+----------+ +| -max -1 | 0 | 1 max |

    -infinity -min_normal min_normal infinity

    Yukardaki kesikli izginin leinin doru olduunu vurgulamak istiyorum: min_normal ile 1arasnda ne kadar deer ifade edilebiliyorsa, 1 ile max arasnda da ayn sayda deer ifadeedilir. Bu da min_normal ile 1 arasndaki deerlerin son derece yksek dorulukta olduklaranlamna gelir. (Ayn durum eksi taraf iin de geerlidir.)

    .nan16.2

    Aka ilk deeri verilmeyen kesirli saylarn ilk deerlerinin .nan olduunu grdk. .nandeeri baz anlamsz ilemler sonucunda da ortaya kabilir. rnein u programdakiifadelerin hepsi .nan sonucunu verir:

    import std.stdio;

    void main(){

    double sfr = 0;double sonsuz = double.infinity;

    writeln("nan kullanan her ilem: ", double.nan + 1);writeln("sfr bl sfr : ", sfr / sfr);writeln("sfr kere sonsuz : ", sfr * sonsuz);writeln("sonsuz bl sonsuz : ", sonsuz / sonsuz);writeln("sonsuz eksi sonsuz : ", sonsuz - sonsuz);

    }

    Kesirli saylarn yazmlar16.3

    Bu trn niteliklerine bakmadan nce kesirli saylarn nasl yazldklarn grelim. Kesirlisaylar 123 gibi tamsay eklinde veya 12.3 gibi noktal olarak yazabiliriz.

    Ek olarak, 1.23e+4 gibi bir yazmdaki e+ , "arp 10 zeri" anlamna gelir. Yani bu rnek1.23x104'tr, bir baka deyile "1.23 arp 10000"dir ve ifadenin deeri 12300'dr.

    Eer e 'den sonra gelen deer eksi ise, yani rnein 5.67e-3 gibi yazlmsa, o zaman "10zeri o kadar deere blnecek" demektir. Yani bu rnek 5.67/103'tr, bir baka deyile "5.67bl 1000"dir ve ifadenin deeri 0.00567'dir.

    Kesirli saylarn bu gsterimlerini, trlerin niteliklerini yazdran u programn ktsndagreceksiniz:

    import std.stdio;

    void main(){

    writeln("Tr ismi : ", float.stringof);writeln("Duyarlk : ", float.dig);writeln("En kk normalize deeri: ", float.min_normal);writeln("En byk deeri : ", float.max);writeln("En kk deeri : ", -float.max);writeln();writeln("Tr ismi : ", double.stringof);writeln("Duyarlk : ", double.dig);writeln("En kk normalize deeri: ", double.min_normal);writeln("En byk deeri : ", double.max);writeln("En kk deeri : ", -double.max);writeln();writeln("Tr ismi : ", real.stringof);

    Kesirli Saylar

    Copyright 2009