d programlama dili

650
 sürüm: r270, 2011-10-13 D Programlama Dili  D2 programlama dili ile bilgisayar programcılığı Ali Çehreli D.ershane Serisi

Upload: alpim54

Post on 10-Jul-2015

140 views

Category:

Documents


0 download

TRANSCRIPT

srm: r270, 2011-10-13

D

Programlama Dili

D2 programlama dili ile bilgisayar programcl

Ali ehreli

D.ershane Serisi

0.1

Copyright 2009-2011 Ali ehreliForum ve Wiki blmlerinin ierikleri genele aittir. Her dersin haklar dersin yazarna aittir. Kiisel kullanm iin olmak artyla istediiniz ekilde yararlanabilirsiniz. Bu sitenin geri kalannn haklar Ali ehreli'ye aittir. Kaynak gstermek artyla istediiniz blmlerini baka sitelere kopyalayabilirsiniz. Kiisel kullanm iin olmak artyla, istediiniz blmn istediiniz gibi kopyalayabilirsiniz. Creative Commons License Ddili.org icerigi by Ali Cehreli is licensed under a Creative Commons AttributionNoncommercial-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.

0.2

"D Programlama Dili" PDF DosyasBu derslerin en yeni halini bir PDF dosyas olarak u adresten indirebilirsiniz: http://ddili.org/ders/d/D_Programlama_Dili.pdf

0.2.1

PDF dosyasnn geliimi r250, 2011-07-08: le yklemenin yeni sz dizimine dntrld, baz derslerin problemleri eklendi, vs. r243, 2011-07-05: 'Bellek Ynetimi' dersine realloc() eklendi r240, 2011-07-04: 'Bellek Ynetimi' dersi r235, 2011-06-26: Emekliye ayrlan 'scope' belirtecinin yerine 'clear' ve 'scoped' r233, 2011-06-18: 'Tr Nitelikleri' dersi r231, 2011-06-18: 'E Zamanl Programlama' dersi r206, 2011-06-04: 'Kout lemler' dersi r178, 2011-05-19: 'okuzlular' dersi r175, 2011-05-18: 'Baka Aralk Olanaklar' dersi r169, 2011-05-06: 'Aralklar' dersi r155, 2011-03-21: std.cstream yerine std.stdio ve ok sayda dzeltme r149, 2011-02-04: Dilimlerin gsterildii ders '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' dersine ek: scope(exit), scope(success), ve scope(failure) r121, 2010-06-05: eitli dzeltmeler r118, 2010-05-31: 'Katmalar' dersi r114, 2010-05-28: 'Dier lev Olanaklar' dersi r109, 2010-05-25: 'Ayrntl ablonlar' dersi r107, 2010-05-07: 'Etiketler' dersi r104, 2010-05-05: 'Birlikler' dersi

Copyright 2009-2011 Ali ehreli, http://ddili.org

2

r101, 2010-05-04: 'Yap ve Snflarda foreach' dersi r99, 2010-05-01: 'lev Gstergeleri ve Kapamalar' dersi r96, 2010-04-30: 'Koullu Derleme' dersi r81, 2010-04-06: 'Bit lemleri' dersi r75, 2010-04-02: 'Gstergeler' dersi ve ncesi

Srmlerdeki farkllklar ddili.org'un proje sayfasnda grebilirsiniz.

Copyright 2009-2011 Ali ehreli, http://ddili.org

3

Teekkr

1

TeekkrBu derslerin yazm srasnda beni bir sre btnyle kaybedeceklerini bandan bilen, bunu anlayla karlayan, ve heyecanm paylaan eime ve kzma ok teekkr ederim. Bu derslerin doruluu ve anlalrl byk lde Ddili Forum yelerinin katklarna baldr. Yeni dersler hep nce o forumda duyuruldular, ve ancak yelerin nerileri dikkate alndktan sonra genel kullanma sunuldular. Bu dersleri yazma srecinde heyecanm uyank tuttuklar iin Ddili Forum yelerine teekkr ederim. zellikle Mert Ataol, kitabn her satrn byk bir titizlikle gzden geirdi ve dzeltmeler nerdi. Can Alpay ifti'nin ve Faruk Erdem ncel'in kitabn ve ddili.org'un geliiminde byk katklar oldu.

Copyright 2009-2011 Ali ehreli, http://ddili.org

4

Tantm

2

TantmDerslere balamadan nce baz noktalarda anlamamz gerekiyor. Siz: Her ne kadar D iin C, C++, ve Java gibi dillerdeki deneyimler yararl olsa da, buradaki dersler D dilini ve genel olarak programcl hibir deneyim varsaymadan, temelden anlatrlar. Eer programcl Trke kaynaklardan renmeyi seviyorsanz, buras size gre... 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 2.0 derleyicisi Trke harfleri destekleyen bir ortam Metin dzenleyiciyi ve derleyiciyi ayr ayr kurmak yerine, onlarn ikisini ve baka aralar da ieren bir gelitirme ortam da kurabilirsiniz. Bu konuda kurulum sayfasndan yararlanabilirsiniz. Eer sizin bu programlar kuracak deneyiminiz yoksa, bu aamada birisinden yardm almanz gerekiyor. D dilini metin dzenleyici veya derleyici olmadan renemezsiniz. Dersler btnyle Trke programlardan olutuklar iin, altnz ortamda Trke harflerin doru olarak grnmeleri gerekir. Bu konuda Windows ortam iin yardm almak iin Trke harflerin DOS pencerelerinde gsterilmesini anlatan forum konusundan yararlanabilirsiniz. (zellikle 2-a ve 2-b maddeleri.) Derslerin yaps: Her ders, olabildiince az sayda kavram rneklerle anlatyor. Her sayfann sonunda rencinin o zamana kadar rendikleriyle programlayabilecei problemler bulunuyor. renci kendisininkiyle karlatrabilsin diye her problemin zm de veriliyor. (Yerinizi kaybetmemeniz iin zmler ayr bir tarayc sayfasnda alrlar.) Bir derste anlatlan kavramlar anlamadan bir sonrakine gememenizi neririm. Eer anlalmayan kavramlar kalyorsa; bu sizden deil, derslerdeki eksikliklerden kaynaklanyor olabilir. O zaman ltfen sesinizi Ders Aras forumunda duyurun ve derslerin geliimine yardmc olun. Derslerde pencereli programlar anlatlmyor: Pencereli (grsel) programlar ok daha ho ve baz durumlarda ok daha kullanldrlar. Buna ramen, bu dersler grsel program yazmay anlatmazlar. nk dili renmek iin pencereler kullanmak gerekmez. Hatta grsel program yazmak iin kullanlan ktphanelerin tasarmlar dilin kavramlaryla karabilir ve dilin renimini gletirebilir. Bu yzden, bu dersler D dilini btnyle komut satrndan alan programlarla anlatrlar. D'yi ve standart ktphanesi Phobos'u bir kere rendikten sonra, zaten siz istediiniz grsel ktphane ile istediiniz pencereli program yazabileceksiniz. Ders RSS beslemesi: Bu blm hl yazm aamasnda olduu iin, eklenen yeni ders sayfalarndan haberdar olmak iin RSS beslemesinden yararlanabilirsiniz. Szlk: Her sayfada, o derste kullanlan terimleri ieren bir mini szlk bulunuyor. Bylece derste 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 dilini renenlerin forumu olan Ders Aras'na katln ve varsa sorularnz sorun, veya yeni balayanlara siz yardmc olun.

Copyright 2009-2011 Ali ehreli, http://ddili.org

5

Tantm

Bir rica: Bu derslerin yararl ve kullanl olabilmesi sizin katknza bal. Yazarn kafasnda kurgulad anlatm yntemi renmeye uygun olmayabilir. Ltfen grdnz her trl yanl ve eksii en ksa zamanda yazara bildirin. Teekkrler! Yazar: Ali ehreli CV: http://acehreli.org/resume.html Kendisiyle bir sylei Kendisine Ceviz.net'in C ve C++ forumunda veya Ddili Forum'da rastlayabilirsiniz [email protected] adresinden ulaabilirsiniz

Copyright 2009-2011 Ali ehreli, http://ddili.org

6

Programclk

3

ProgramclkProgramcln doru tanmnn ne olduu konusunda tam bir anlama yoktur. Bu yazara sorarsanz, 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

3.1

renmek ve retmek ok zordurProgramclk 1950'lerden beri retilen bir uratr. O zamandan bu yana henz programlamay etkin bir ekilde retecek bir yntem gelitirilememitir. Ne yazk ki, insanlarn kabaca yarsna yakn bir blmnn programlama renmeye yatkn olmadklar grlyor. Bu konuda yaplm aratrmalardan birisiyle ilgili olarak Ddili Forum'da alan bir konuya gz atmak isteyebilirsiniz. O aratrmadan anlaldna gre, programcla yatkn olanlar; anlamadklar bir durumla karlatklarnda kafalarnda doru veya yanl, ama tutarl bir model kurabilenlerdir. Bence yatkn olan kiiler iin programlamann zorluu, gerektirdii bilgi miktarndadr.

Copyright 2009-2011 Ali ehreli, http://ddili.org

7

Atama ve lem Sralar

4

Atama ve lem SralarEer programclk bir nceki blmde szedildii gibi baz insanlar iin gerekten ok zorsa; daha ileriye gitmeden nce bu insanlarn karlaacaklar engellerden ilk ikisini hemen burada grelim.

4.1

Atama ilemiProgram iinde a = 10 gibi bir satr grdnzde bu, "a'nn deeri 10 olsun" demektir. Benzer ekilde, b = 20 grdnzde de "b'nin deeri 20 olsun" demektir. imdi 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 o olsun" demektir. Fark gryor musunuz? Matematikten altmz = iareti programclkta bambaka bir anlamda kullanlmaktadr: sa tarafn deeri ne ise, sol tarafn deerini de o yapmak...

4.2

lem sralarProgramlarda ilemler adm adm ve belirli bir srada uygulanrlar. Yukardaki ifadeyi program iinde alt alta a = 10 b = 20 a = b eklinde grdnzde, onlarn anlam udur: "a'nn deeri 10 olsun, sonra b'nin deeri 20 olsun, sonra a'nn deeri b'nin deeri olsun" demektir. Yani oradaki ilem admndan sonra hem a'nn hem de b'nin deerleri 20 olur. Programclk renirken karlalan bu iki nemli kavram anladnz m? yleyse devam...

Copyright 2009-2011 Ali ehreli, http://ddili.org

8

Derleyici

5

DerleyiciD programclnda belki de en ok kullanlan iki ara metin dzenleyici ve derleyicidir. Metin dzenleyiciyi herkesin bildiini varsayarak ksaca "yaz yazma program" olarak hatrlatabiliriz. Programlar metin dzenleyicilerde yazlrlar. D gibi dillerde derleme kavram ve derleyicinin ilevi de hi olmazsa kaba hatlaryla mutlaka bilinmelidir.

5.1

Makine KoduBilgisayarn beyni CPU denen mikro ilemcidir. Mikro ilemciye ne iler yapacan bildirmeye kodlama, bu bildirimlere de kod denir. Her mikro ilemci modelinin kendisine has kodlar vardr. Her mikro ilemcinin nasl kodlanacana mimari tasarm aamasnda ve donanm kstlamalar gzetilerek karar verilir. Bu kodlar ok alt dzeyde elektronik sinyaller olarak gerekletirilirler. Bu tasarmda kodlama kolayl geri planda kald iin, dorudan mikro ilemciyi kodlayarak program yazmak ok g bir itir. Mikro ilemcinin adnn paras olan ilem kavram, zel saylar olarak belirlenmitir. rnein kodlar 8 bit olan hayal bir ilemcide 4 says ykleme ilemini, 5 says depolama ilemini, 6 says da arttrma ilemini gsteriyor olabilir. Bu hayal ilemcide soldaki 3 bitin ilem says ve sadaki 5 bitin de o ilemde kullanlacak deer olduunu dnrsek, bu mikro ilemcinin makine kodu yle olabilir: lem 100 101 110 000 Deer 11110 10100 10100 00000 Anlam YKLE 11110 DEPOLA 10100 ARTTIR 10100 BEKLE

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

5.2

Programlama DiliMikro ilemcileri kullanmann daha etkin yollar aranm, ve zm olarak st dzey kavramlar ifade etmeye elverili programlama dilleri gelitirilmitir. Bu dillerin donanm kayglar olmad iin, zellikle kullanm kolayl ve ifade gc gzetilerek tasarlanmlardr. Programlama dilleri insanlara uygun dillerdir ve ok kabaca konuma dillerine benzerler: if (ortaya_kat_atlm()) { oyun_kadn_gster(); } Programlama dillerinin bir sorunu, anahtar szcklerinin geleneksel olarak ngilizce olmasdr. Neyse ki bunlar kolayca renebilecek kadar az saydadr. rnein if 'in "eer" anlamna geldiini bir kere renmek yeter.

Copyright 2009-2011 Ali ehreli, http://ddili.org

9

Derleyici

5.3

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

5.4

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

5.5

Yorumlamal DilBaz 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 iin bu diller program gelitirmeyi abuklatrrlar. Bir sakncalar, her altrldklarnda program metninin batan taranmasnn ve makine kodu karlklarnn alma zamannda bulunmasnn gerekmesidir. Bu yzden, yorumlamal dillerde yazlan programlar derlemeli dillerde yazlan edeerlerinden genel olarak daha yava alrlar.

5.6

Derleme HatasDerleyiciler program dilin kurallarna uygun olarak derledikleri iin, kural d kodlar grdklerinde 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 yapmasndan phelenebilir ve bu konuda uyar mesaj verebilir. Program derlenmi bile olsa, her zaman iin uyarlar da hata gibi kabul edip, uyarya neden olan kodu deitirmek iyi olur.

Copyright 2009-2011 Ali ehreli, http://ddili.org

10

"Merhaba Dnya" Program

6

"Merhaba Dnya" ProgramHer programlama dilinde gsterilen ilk program, merhaba dnya programdr. Doal olarak son derece basit olmas gereken bu program, o dilde program yazabilmek iin mutlaka bilinmesi 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!"); } Bu kadar kk bir programda bile deinilmesi gereken ok sayda kavram vardr. Bu aamada fazla ayrntya 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 grlen parantezler, noktal virgller, main ve void gibi szckler; hep D dilinin kurallar dahilindedirler. Bunlar Trke gibi bir dilin yazm kurallarna benzetebiliriz: zne, yklem, noktalama iaretleri, vs... Anahtar szckler: Dilin i olanaklarn belirleyen zel szcklere anahtar szck denir. Bu programda tane anahtar szck var: Programa modl eklemeye yarayan import , "hibir tr" anlamna gelen void , ve programn balang noktasn belirleyen main . Ktphaneler ve ilevler: Dilin i olanaklar yalnzca dilin yapsn belirler. Bu olanaklar kullanlarak oluturulan ilevlerin bir araya getirilmelerine ktphane ad verilir. Bunu yine Trke'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 kullanmlara sahiptirler. te bu deiik sohbetleri biraz olsun programlama dili ktphanelerine benzetebiliriz. Bu programdaki writeln ilevi, standart D ktphanesinde ka satr yazdrmak iin kullanlan bir ilevdir. smi, "satr yaz"n karl olan "write line"dan gelir. Modller: D'de ktphaneler programlara modller halinde tantlrlar. Bu programda kullanlan tek modl olan std.stdio 'nun ismi, "standart ktphanenin standart giri/k modl" olarak evirebileceimiz "standard input/output"tan tremitir. Karakterler ve dizgiler: Bu programdaki "Merhaba dnya!" gibi bilgilere dizgi, dizgileri oluturan elemanlara da karakter ad verilir. rnein bu programdaki dizgiyi oluturan karakterlerden bazlar M, e, ve ! karakterleridir. lem sras: Program, iini belirli admlar belirli srada tekrarlayarak yapar. Bu srann en banda main isimli ilevin iindeki ilemler vardr; programn ileyii, main 'le balar. Bu kk programda tek bir ilem bulunuyor: writeln 'li satrdaki ilem. Byk/Kk harf ayrm: Programda deiiklik yaparken dizgilerin iinde istediiniz karakterleri kullanabilirsiniz, ama dier isimleri grldkleri gibi kk harfle yazmaya dikkat edin, nk D dilinde byk/kk harf ayrm nemlidir. rnein writeln ile Writeln D dilinde farkl isimlerdir. Grld gibi, en kk D programnda bile sz edilmesi gereken ok sayda kavram bulunuyor. Bunlar ayrntlaryla renecek ok zamanmz olacak.

Copyright 2009-2011 Ali ehreli, http://ddili.org

11

"Merhaba Dnya" Program

6.1

Kaynak dosyaProgramcnn D dili kurallarna gre yazd ve derleyiciye derlemesi iin verdii dosyaya kaynak dosya denir. D derlemeli bir dil olduu iin, kaynak dosyann kendisi altrlabilir bir program deildir. Kaynak dosya, ancak derleyici tarafndan derlendikten sonra altrlabilen program haline gelir. Her tr dosyann olduu gibi, kaynak dosyann da diske kaydedilirken bir isminin olmas gerekir. Kaynak dosya isminde sisteminizin izin verdii her harfi kullanabilirsiniz. Ancak, D kaynak dosyalarnn dosya isim uzantsnn .d olmas geleneklemitir. Gelitirme ortamlar, ara programlar, ve baka programclar da bunu beklerler. rnek olarak: deneme.d , tavla.d , fatura.d , vs.

6.2

Problemler1. Yukardaki program gelitirme ortamnza kopyalayn, derleyin, ve altrn. Programn kts yle olmaldr: Merhaba dnya! lerideki blmlerden yararlanabilmeniz iin bunu baarm olmanz ok nemli. Bu aamada deneyimli birisinden yardm almanz gerekebilir. 2. Programa istediiniz baka bir ey yazdrn. 3. Program birden fazla satr yazacak ekilde deitirin. 4. Programn baka yerlerinde deiiklikler yapn ve derlemeye aln; rnein writeln satrnn sonundaki noktal virgl olmadnda derleme hatalaryla karlatnz grn. ... zmler

Copyright 2009-2011 Ali ehreli, http://ddili.org

12

writeln ve write

7

writeln ve writeBundan nceki derste, yazdrlmak istenen dizginin writeln 'e parantez iinde verildiini grdk. Programda writeln gibi i yapan birimlere ilev, o ilevlerin ilerini yaparken kullanacaklar bilgilere de parametre ad verilir. Parametreler ilevlere parantez iinde verilirler. writeln satra yazdrmak iin bir seferde birden fazla parametre alabilir. Parametrelerin birbirleriyle karmalarn nlemek iin aralarnda virgl kullanlr. import std.stdio; void main() { writeln("Merhaba dnya!", "Merhaba balklar!"); } Bazen, satra yazdrlacak olan btn bilgi writeln 'e hep birden parametre olarak geirilebilecek ekilde hazr bulunmayabilir. Byle durumlarda satrn ba taraflar write ile para 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 programa dahil deildirler; programn bilgisayara yaptraca ileri etkilemezler. Tek amalar, belirli noktalarda ne yaplmak istendiini program daha sonra okuyacak olan kiilere aklamaktr.

7.1

Problemler1. Buradaki programlarn ikisi de dizgileri aralarnda boluk olmadan birbirlerine yapk olarak yazdryorlar; bu sorunu giderin 2. write ' da birden fazla parametreyle armay deneyin ... zmler

Copyright 2009-2011 Ali ehreli, http://ddili.org

13

Temel Trler

8

Temel TrlerBilgisayarlarn beyni mikro ilemcidir. Bir programdaki ilemlerin ounu mikro 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, mikro ilemciler birden fazla bitin yan yana getirilmesinden oluan daha kullanl veri trleri tanmlamlardr: rnein 8 bitten oluan bayt veya 32, 64, vs. bitten oluan daha byk veri trleri... Her mikro ilemcinin mimari tasarm gerei en etkin olarak kulland veri tr, o mikro ilemcinin o kadar bitlik olduunu gsterir: "32 bitlik ilemci", "64 bitlik ilemci", gibi... Mikro ilemcinin tanmlad veri trleri de kendi balarna yeterli deillerdir; nk rnein renci ismi gibi veya oyun kad gibi zel bilgileri tutamazlar. Mikro ilemcinin sunduu bu genel amal veri trlerini daha kullanl trlere evirmek programlama dillerinin grevidir. D'nin temel trleri bile tek balarna kullanldklarnda oyun kad gibi bir kavram destekleyemezler. O tr kavramlar ileride anlatlacak olan yaplarla ve snflarla ifade edilirler. D'nin temel trleri ounlukla dier dillerdeki temel trlere benzerler. Ek olarak, D'de belki de ancak bilimsel hesaplarda ie yarayan baz ek trler de bulunur. Tabloda kullanlan terimlerin aklamalarn aada bulacaksnz.

Copyright 2009-2011 Ali ehreli, http://ddili.org

14

Temel Trler

D'nin Temel Veri Trleri Tr bool byte ubyte short int uint long ulong cent ucent float real Bool deeri iaretli 8 bit iaretsiz 8 bit iaretli 16 bit iaretli 32 bit iaretsiz 32 bit iaretli 64 bit iaretsiz 64 bit iaretli 128 bit (ilerisi iin dnlmtr; henz geerli bir tr deildir) Aklama lk Deeri false 0 0 0 0 0 0 0L 0L 0

ushort iaretsiz 16 bit

iaretsiz 128 bit (ilerisi iin dnlmtr; henz geerli 0 bir tr deildir) 32 bit kayan noktal say ya donanmn (mikro ilemcinin) tanmlad en byk kayan noktal say trdr (rnein, x86 mikro ilemcilerinde 80 bit), ya da double'dr; hangisi daha bykse... float.nan double.nan real.nan

double 64 bit kayan noktal say

ifloat sanal float deer idouble sanal double deer ireal sanal real deer

float.nan * 1.0i double.nan * 1.0i real.nan * 1.0i float.nan + float.nan * 1.0i double.nan + double.nan * 1.0i real.nan + real.nan * 1.0i 0xFF 0xFFFF 0x0000FFFF

cfloat iki float'tan oluan karmak say

cdouble iki double'dan oluan karmak say

creal

iki real'den oluan karmak say

char wchar dchar

UTF-8 kod birimi UTF-16 kod birimi UTF-32 kod birimi ve Unicode kod noktas

Bunlara ek olarak hibir trden olmama kavramn ifade eden void anahtar szc de vardr. Aksine bir neden yoksa, genel bir kural olarak tamsay deerler iin int kullanlr.

8.1

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

Copyright 2009-2011 Ali ehreli, http://ddili.org

15

Temel Trler

aretli tr: Hem eksi hem art deerler alabilen trdr; rnein -128'den 127'ye kadar deer alabilen byte . simleri eksi iaretinden gelir. aretsiz tr: Yalnzca art deerler alabilen trdr; rnein 0'dan 255'e kadar deer alabilen ubyte . Bu trlerin bandaki u harfi, "iaretsiz" anlamna gelen "unsigned"n ba harfidir. Kayan noktal say: Kabaca, 1.23 gibi kesirli deerleri tutabilen trdr; hesaplarn hassasiyeti trlerin bit saysyla doru orantldr (yksek bit says yksek hassasiyet salar); bunlarn dndaki trler kesirli deerler alamazlar; rnein int , yalnzca tamsay deerler alabilir Karmak say: Matematikte geen karmak say deerlerini alabilen trdr Sanal deer: Karmak saylarn salt sanal deerlerini tayabilen trdr; tabloda lk Deer stununda geen i , matematikte -1'in kare kk olan saydr nan: "Not a number"n ksaltmasdr ve geersiz kesirli say deeri anlamna gelir

8.2

Tr NitelikleriD'de trlerin nitelikleri vardr. Niteliklere trn isminden sonra bir nokta ve nitelik ismiyle eriilir. rnein int 'in .sizeof niteliine int.sizeof diye eriilir. Burada niteliklerden yalnzca 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 : writeln("Bayt olarak uzunluu: writeln("En kk deeri : writeln("En byk deeri : }

", ", ", ",

int.stringof); int.sizeof); int.min); int.max);

8.3

size_tProgramlarda 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 "size type"tan gelir ve "byklk tr" anlamndadr. Adet gibi saymayla ilgili olan kavramlar temsil ederken kullanlr. Bu trn sizin ortamnzda hangi temel trn takma ismi olduunu yine .stringof nitelii ile renebilirsiniz: import std.stdio; void main() {

Copyright 2009-2011 Ali ehreli, http://ddili.org

16

Temel Trler

}

writeln(size_t.stringof);

Yukardaki program denediim ortamda u kty alyorum: ulong

8.4

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

Copyright 2009-2011 Ali ehreli, http://ddili.org

17

Deikenler

9

DeikenlerProgramda kullanlan kavramlar temsil eden yaplara deiken denir. rnek olarak hava scakl gibi bir deeri veya yar arabas motoru gibi karmak bir nesneyi dnebilirsiniz. Her deiken belirli bir trdendir ve her deikenin bir deeri vardr. Deikenlerin ounun isimleri de olur, ama programda aka anlmalar gerekmeyen deikenlerin isimleri olmayabilir 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 olarak da renci_says uygun olur. D'nin yazm kurallar gerei, deikenler nce trleri sonra isimleri yazlarak tantlrlar. Bir deikenin bu ekilde tantlmasna, o deikenin tanm, ve bu eyleme o deikenin tanmlanmas 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; yani programn kts Bu okulda renci_says renci var. eklinde olmamtr. Deikenlerin deerleri = ileci ile deitirilir. Yapt i deer atamak olduu iin, bu ilece atama 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 atanmas ayn anda yaplabilir, ve hata riskini azaltt iin de nerilen bir yntemdir:

Copyright 2009-2011 Ali ehreli, http://ddili.org

18

Deikenler

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.

9.1

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

Copyright 2009-2011 Ali ehreli, http://ddili.org

19

Standart Giri ve k Akmlar

10

Standart Giri ve k AkmlarBizim ekran olarak algladmz k, aslnda D programnn standart kdr. Standart k karakter temellidir: yazdrlan btn bilgi nce karakter karlna dntrlr ve ondan sonra art arda karakterler olarak standart ka gnderilir. nceki blmlerde ka gnderilen tamsaylar, rnein renci says olan 100 deeri, ekrana aslnda tamsay 100 deeri olarak deil; 1 , 0 , ve 0 eklinde karakter olarak gnderilmitir. Normalde klavye olarak algladmz standart giri de bunun tersi olarak alr: bilgi art arda 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 D programlarnn standart girii ve k birer karakter akmdr. Standart giri akmnn ismi stdin , 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 'un zellikle belirtilmeleri gerekmez. nceki blmlerde kullandmz writeln , aslnda stdout.writeln 'in ksaltmasdr. Benzer ekilde, write da stdout.write 'in ksaltmasdr. Merhaba dnya programn byle bir ksaltma kullanmadan yle de yazabiliriz: import std.stdio; void main() { stdout.writeln("Merhaba dnya!"); }

10.1

Problem Yukardaki programda stdout 'u yine writeln ilemiyle kullann ama bir seferde birden fazla deiken yazdrn. ... zm

Copyright 2009-2011 Ali ehreli, http://ddili.org

20

Giriten Bilgi Almak

11

Giriten Bilgi AlmakGirilen bilginin daha sonradan kullanlabilmesi iin bir deikende saklanmas gerekir. rnein okulda ka tane renci bulunduu bilgisini alan bir program, bu bilgiyi int trnde bir deikende tutabilir. Yazdrma ilemi srasnda dolayl olarak stdout akmnn kullanldn bir nceki derste grdk. Bu, bilginin nereye gideceini aklamaya yetiyordu; nk stdout , standart k demektir. ka ne yazdrlacan da parametre olarak veriyorduk. rnein write(renci_says); yazmak, ka renci_says deikeninin deerinin yazdrlacan sylemeye yetiyordu. zetlersek: akm: ilem: yazdrlan: hedef: stdout write renci_says deikeninin deeri 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 nerede depolanacann da belirtilmesi gerekir. Okuma ilemini de zetlersek: akm: ilem: okunan: hedef: stdin readf bir bilgi ?

Bilginin depolanaca hedef belirtilirken bir deikenin adresi kullanlr. D'de isimlerden nce kullanlan & karakteri, o isimle belirtilen eyin adresi anlamna gelir. readf 'e okuduu bilgiyi yerletirecei yer bu ekilde bildirilir: &renci_says . Burada &renci_says , "renci_says deikenine" diye okunabilir. Bu kullanm, yukardaki soru iaretini ortadan kaldrr: akm: ilem: okunan: hedef: din readf bir bilgi renci_says deikeni

simlerin bana & karakteri koymak o ismin belirttii eyin gsterilmesi anlamna gelir. Bu gsterme kavram, sonraki derslerde karlaacamz referanslarn ve gstergelerin de zn 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 aada gsteriyorum.) "%s", verinin deikene uygun olan dzende dntrleceini belirtir. rnein giriten gelen '4' ve '2' karakterleri, bir int 'e okunduklarnda 42 tamsay deerini oluturacak ekilde okunurlar.

Copyright 2009-2011 Ali ehreli, http://ddili.org

21

Giriten Bilgi Almak

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 tanmlanmas int renci_says; /* Giriten gelen bilginin renci_says deikenine atanmas */ readf("%s", &renci_says); writeln( "Anladm: okulda ", renci_says, " renci varm.");

}

11.1

Boluklarn gzard edilmelerinin gerekmesiYukardaki gibi programlarda deerleri yazdktan sonra Enter tuuna baslmas gerektiini biliyorsunuz. Kullancnn Enter tuuna basm olmas da zel bir kod olarak ifade edilir ve o bile programn standart giriinde belirir. Programlar bylece bilgilerin tek satr olarak m yoksa farkl satrlarda m girildiklerini alglayabilirler. Baz durumlarda ise girite bekleyen o zel kodlarn hibir nemi yoktur; szlp gzard edilmeleri gerekir. Yoksa standart girii tkarlar ve baka bilgilerin girilmesini engellerler. Bunun bir rneini grmek iin yukardaki programda ayrca retmen saysnn da girilmesini 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? 100 Ka retmen var? 200 Program burada taklr retmen says olarak 200 yazlm olsa da bir nceki 100'n sonunda baslm olan Enter'n kodlar girii tkamtr ve o yzden retmen_says deikeninin deeri olan 200 okunamamaktadr. Programn giriine gelen kodlar u ekilde ifade edebiliriz: 100[EnterKodu]200[EnterKodu]

Copyright 2009-2011 Ali ehreli, http://ddili.org

22

Giriten Bilgi Almak

Giriin tkand noktay krmzyla belirttim. Bu durumda zm, retmen saysndan nce gelen Enter kodunun nemli olmadn belirtmek iin %s belirtecinden nce bir boluk karakteri kullanmaktr: " %s". Dzen dizgisi iinde geen boluk karakterleri sfr veya daha fazla saydaki grnmez kodu okuyup gzard etmeye yararlar. O tek boluk karakteri btn grnmez karakter kodlarn okuyup gzard eder: normal boluk karakteri, Enter'la girilen satr sonu karakteri, Tab karakteri vs. Genel bir kural olarak, okunan her deer iin " %s" kullanabilirsiniz. Yukardaki program o deiiklikle artk istendii gibi alr. Yalnzca deien satrlarn gstererek: // ... readf(" %s", &renci_says); // ... readf(" %s", &retmen_says); // ... kts: Okulda ka renci var? 100 Ka retmen var? 200 Anladm: okulda 100 renci ve 200 retmen varm.

11.2

Ek bilgiler Daha nce grdmz // karakterleri tek bir satr aklama yazmaya elverilidir. Birden fazla satrda blok halinde aklama yazmak iin aklamay /* ve */ belirteleri arasna alabilirsiniz. Baka aklama belirtelerini de ierebilmek iin /+ ve +/ belirteleri kullanlr: /+ // Tek satrlk aklama /* Birden fazla satrlk aklama */

Yukardaki belirteleri bile ierebilen aklama blou +/ Kaynak kodlardaki boluk karakterlerinin ou nemsizdir. O yzden fazla uzayan satrlar blebiliriz veya daha anlalr olacan dndmz boluklar ekleyebiliriz. Hatta yazm hatasna yol amad srece hi boluk kullanmayabiliriz bile: import std.stdio;void main(){writeln("Okumas zor!");} Fazla skk kodu okumak gtr.

11.3

Problemler1. Dviz kurunu ve avro adedini kullancdan bilgi olarak aln ve bu bilgiyi ka yazdrn. 2. Ayn programda giriten say beklenen durumda harfler girin ve programn yanl altn gzlemleyin. ... zmler

Copyright 2009-2011 Ali ehreli, http://ddili.org

23

Mantksal fadeler

12

Mantksal fadelerProgramda asl ileri ifadeler yaparlar. Programda deer veya yan etki reten her eye ifade denir. Aslnda olduka geni bir kavramdr, nk 42 gibi bir tamsay sabiti bile 42 deerini rettii iin bir ifadedir. "merhaba" gibi bir dizgi de bir ifadedir, nk "merhaba" sabit dizgisini retir. (Not: Buradaki retme kavramn deiken tanmlama ile kartrmayn. Burada yalnzca deer retmekten sz ediliyor; deiken retmekten deil. Her deerin bir deikene ait olmas gerekmez.) writeln gibi kullanmlar da ifadedirler, nk yan etkileri vardr: k akmna karakter yerletirdikleri iin k akmn etkilemi olurlar. imdiye kadar grdkleriniz arasndan atama ilecini de bir ifade rnei olarak verebiliriz. fadelerin deer retiyor olmalar, onlarn baka ifadelerde deer olarak kullanlmalarn salar. Bylece basit ifadeler kullanlarak daha karmak ifadeler elde edilebilir. rnein hava scakln veren bir hava_scakl() ilevi olduunu dnrsek, onu kullanarak yle bir kt oluturabiliriz: writeln("u anda hava ", hava_scakl(), " derece"); O satr toplam drt ifadeden oluur: 1. 2. 3. 4. "u anda hava " ifadesi hava_scakl() ifadesi " derece" ifadesi ve o ifadeyi kullanan writeln 'li ifade

Bu blmde mantksal ifadeleri greceiz ama daha ileri gitmeden nce en temel ilemlerden olan atama ilecini hatrlayalm. = (atama ileci): Sa tarafndaki ifadenin deerini sol tarafndaki ifadeye (rnein bir deikene) atar. hava_scakl = 23 // hava_scakl'nn deeri 23 olur

12.1

Mantksal fadelerMantksal ifadeler Bool aritmetiinde geen ifadelerdir. Karar verme dzeneinin paras olduklar iin bilgisayarlar akll gsteren davranlarn da temelidirler. rnein bir programn "eer girilen yant Evet ise dosyay kaydedeceim" gibi bir kararnda bir mantksal ifade kullanlr. Mantksal ifadelerde yalnzca iki deer vardr: "doru olmama" anlamn tayan false ve "doruluk" anlamn tayan true . rnein Trke "bakent stanbul'dur" ifadesinin deeri false , "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 programn kts Tatl var: true olduunda "evet, tatl var" demektir. Ayn ekilde Tatl var: false

Copyright 2009-2011 Ali ehreli, http://ddili.org

24

Mantksal fadeler

olduunda "hayr, tatl yok" demektir. Yani ktda "var" grnd iin "var olduunu" dnmeyin; ktdaki "... var: false", "yok" anlamna geliyor. Aadaki program paralarn hep yle okumanz gerekiyor. Mantksal ifadeleri daha ileride greceimiz koullarda, dnglerde, parametrelerde, vs. ok kullanacaz. Programlarda bu kadar ok kullanldklar iin mantksal ifadeleri ok iyi anlamak 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 eit olduklarnda "doruluk" anlamna gelen true deerini, eit olmadklarnda da "doru olmama" anlamna gelen false deerini retir. rettii deerin tr de doal olarak bool '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 yldaki_ay_says == 11 // true // false

!= "Eit deil midir" sorusunu yantlar. ki tarafndaki ifadeleri karlatrr ve == ilecinin tersi sonu retir. haftadaki_gn_says != 7 yldaki_ay_says != 11 // false // true

|| "Veya" anlamndadr. Sol tarafndaki ifadenin deeri true ise hi sa taraftaki ifadeyi iletmeden true deerini retir. Sol taraf false ise sa taraftakinin deerini retir. Bu ilem Trke veya ifadesine benzer: birincisi, ikincisi, veya ikisi birden true olduunda true retir. Bu ilece verilen iki ifadenin alabilecei olas deerler ve sonular yledir: Sol ifade false false true true false true false (baklmaz) true (baklmaz) Sa ifade Sonu false true true true

import std.stdio; void main() { /* false, "doru olmama" anlamna geldii iin burada "yok"u temsil etsin true, "doru olma" anlamna geldii iin burada "var" temsil etsin */ bool baklava_var = false; bool kadayf_var = true; } writeln("Tatl var: ", baklava_var || kadayf_var);

Copyright 2009-2011 Ali ehreli, http://ddili.org

25

Mantksal fadeler

Yukardaki programdaki || ilecini kullanan ifade, en az bir true deer olduu iin true deerini retir. && "Ve" anlamndadr. Sol tarafndaki ifadenin deeri false ise hi sa taraftaki ifadeyi iletmeden false deerini retir. Sol taraf true ise sa taraftakinin deerini retir. Bu ilem Trke ve ifadesine benzer: birincisi ve ikincisi true olduunda true retir. Sol ifade false false true true Sa ifade false (baklmaz) true (baklmaz) false true Sonu false false false true

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

Not: || ve && ilelerinin bu "sa taraf ancak gerektiinde" iletme davranlar ileler arasnda ok nadirdir, ve bir de imdilik sonraya brakacamz ?: ilecinde vardr. Dier ileler btn ifadelerinin deerlerini her zaman iin hesaplarlar ve kullanrlar. ^ "Yalnzca birisi mi" sorusunu yantlar. ki ifadeden ya biri ya br true olduunda (ama ikisi birden deil) true deerini retir. Sol ifade false false true true Sa ifade false true false true Sonu false true true false

rnein ancak ve ancak bir arkadamn geldiinde tavla oynayacam, aksi taktirde onlarla baka bir ey yapacam dnrsek; onlarn gelip gelmeme durumlarna gre tavla oynayp oynamayacam yle hesaplayabiliriz: writeln("Tavla oynayacam: ", ahmet_burada ^ bar_burada); < "Kk mdr" sorusunu yantlar. Sol taraf sa taraftan kkse (veya sralamada nceyse) true , deilse false deerini retir. writeln("Yendik: ", yediimiz_gol < attmz_gol); > "Byk mdr" sorusunu yantlar. Sol taraf sa taraftan bykse (veya sralamada sonraysa) 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 (veya sralamada daha sonra) veya ona eit olduunda true retir. < ilecinin tersidir.

Copyright 2009-2011 Ali ehreli, http://ddili.org

26

Mantksal fadeler

writeln("Yenmedik: ", yediimiz_gol >= attmz_gol); ! "Tersi" anlamndadr. Dier mantksal ilelerden farkl olarak tek bir ifade ile alr ve sa tarafndaki ifadenin deerinin tersini retir: true ise false , false ise true . writeln("Bakkala gideceim: ", !ekmek_var);

12.2

fadeleri Gruplamakfadelerin hangi srada iletilecekleri, gerektiinde parantezlerle belirtilir. Karmak ifadelerde 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" gibi bir ifadeyi yle hesaplayabiliriz: writeln("Keyfim yerinde: ", (kahve_var || ay_var) && (baklava_var || kadayf_var)); Kendimiz parantezlerle gruplamazsak, ifadeler D dilinin kurallar ile belirlenmi olan nceliklere uygun olarak iletilirler. && ilecinin ncelii de || ilecinden daha yksek olduu iin, 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 belirtmek kodun anlalrl asndan ok yararldr.

12.3

Giriten bool OkumakYukardaki rneklerdeki btn bool ifadeler ka "false" veya "true" dizgileri olarak yazdrlrlar. Bunun kart doru deildir: giriten okunan "false" ve "true" dizgileri otomatik olarak false ve true deerlerine dntrlmezler. O yzden, giriten gelen kelimeyi nce bir dizgi olarak okumamz, ve sonra ona bakarak bir bool deere dntrmemiz gerekir. Aadaki program denerken giriten "false" ve "true" girebilmenizi istiyorum. Bylece bu derste anlatlanlar aynen deneyebileceksiniz. Bunun olabilmesi iin, derslerin banda planladm yoldan sapacak ve istemeyerek henz anlatmadm kodlar gstereceim. Giriten gelen "false" dizgisini false deerine, "true" dizgisini de true deerine dntren bir 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. Ama giriten_bool_oku() ilevinde henz grmediiniz olanaklar kullanlyor; iine aklamalar koydum ama isterseniz o ilevi imdilik tamamen gzard da edebilirsiniz.

Copyright 2009-2011 Ali ehreli, http://ddili.org

27

Mantksal fadeler

12.4

Problemler1. Saylarn bykl ve kkl ile ilgili olan < , > vs. ileleri bu derste tandk. Bu ileler iinde "arasnda mdr" sorusunu yantlayan ile bulunmaz. Yani verilen bir saynn iki deer arasnda olup olmadn hesaplayan ile yoktur. Bir arkadanz bunun stesinden gelmek iin yle bir program yazm olsun. Bu program derlemeye aln ve derlenemediini grn: import std.stdio; void main() { int say = 15; } writeln("Arasnda: ", 10 < say > 20); // derleme HATASI

Derleme hatasn gidermek iin btn ifadenin etrafnda parantez kullanmay deneyin: writeln("Arasnda: ", (10 < say > 20)); Yine derlenemediini grn... 2. Ayn arkadanz hatay gidermek iin bir eyler denerken derleme hatasnn gruplama ile giderildiini farketsin: writeln("Arasnda: ", (10 < say) > 20); Bu sefer de programn beklendii gibi almadn grn: 15 deerinin 10 ile 20 arasnda olduunu bildiimiz halde sonu "false" kmaktadr. Neden? pucu: Mantksal ifadelerin deerlerinin bool trnde olduklarn hatrlayn. Bildiiniz bool deerlerin 20 gibi bir saydan byk olmas gibi bir kavram tanmadk. 3. D'de "arasnda mdr" sorusunu yantlayan mantksal ifadeyi u ekilde kodlamamz gerekir: alt snrdan byktr ve st snrdan kktr. Programdaki ifadeyi o ekilde deitirin ve artk ktnn beklendii gibi "true" olduunu grn. Ayrca, yazdnz ifadenin say 'nn baka deerleri iin de doru altn denetleyin. rnein, say 50 veya 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" yazdracak ekilde kurun. Program denerken "... var m?" sorularna "false" veya "true" diye yant verin: import std.stdio; import std.conv; import std.string; void main() { write("Ka kiiyiz? "); int kii_says; readf(" %s", &kii_says); write("Ka bisiklet var? ");

Copyright 2009-2011 Ali ehreli, http://ddili.org

28

Mantksal fadeler

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 koullardan birisi gerekletiinde true reten bir mantksal ifade yazn: */ writeln("Plaja gidiyoruz: ", true);

} /*

Bu ilevde henz gstermediim olanaklar kullanlyor. Bu yzden, aslnda gerekmeyen aklamalar da ekledim. */ bool giriten_bool_oku(string mesaj) { // Mesaj yazdr writef(mesaj ~ "(false veya true) "); // Girilen satr bir dizgiye oku string giri; while (giri.length == 0) { giri = chomp(readln()); } // O dizgiden bir bool deer ret bool dntrlen_deer = to!bool(giri); // retilen deeri ilevi arana dndr return dntrlen_deer;

}

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

Copyright 2009-2011 Ali ehreli, http://ddili.org

29

if Koulu

13

if KouluProgramda asl ilerin ifadeler tarafndan yapldn rendik. imdiye kadar grdmz programlarda ilemler main isimli ilev iinde batan sona doru ve yazldklar srada iletiliyorlard. D'de deyimler, ifadelerin iletilme kararlarn veren ve ifadelerin iletilme sralarn etkileyen program yaplardr. Kendileri deer retmezler ve yan etkileri yoktur. Deyimler, ifadelerin iletilip iletilmeyeceklerini ve bu ifadelerin hangi srada iletileceklerini belirlerler. Bu kararlar 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.

13.1

if blou ve kapsamif deyimi, ifadelerin iletilip iletilmeyeceine belirli bir mantksal ifadenin sonucuna bakarak 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), kme parantezleri iindeki ifadeleri iletir. Bunun tersi olarak, mantksal ifade doru deilse kme parantezleri 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 yapsn yle 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 if deyimi kendisine verilen mantksal ifade false olduunda kme parantezi iindeki ifadeleri iletmez. Kme parantezleriyle gruplanm ifadelerin tmne blok, o blgeye de kapsam ad verilir. Yazm yanllarna yol amad srece, okumay kolaylatrmak iin programda istediiniz gibi boluklar kullanabilirsiniz. Ben kme ama parantezini, yani { karakterini, if 'le ayn satra yazmay seviyorum; siz alt satra da yazabilirsiniz. kisi de olduka yaygn kullanmlardr.

Copyright 2009-2011 Ali ehreli, http://ddili.org

30

if Koulu

13.2

else blou ve kapsamou zaman if 'e verilen mantksal ifadenin doru olmad durumda da baz ilemler yapmak isteriz. rnein "eer ekmek varsa yemek ye, yoksa bakkala git" gibi bir kararda ekmek olsa da olmasa da bir eylem vardr. D'de ifade false olduunda yaplacak iler else anahtar szcnden sonraki kme parantezleri 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. Kme parantezlerinin yerlerinin yine tercihe bal olduunu gryorsunuz. else kendisi bir deyim deildir, if deyiminin seime bal bir parasdr; tek bana kullanlamaz.

13.3

Kapsam parantezlerini hep kullannHi tavsiye edilmez ama bunu bilmenizde yarar var: Eer if 'in veya else 'in altndaki ifade tekse, kme parantezleri gerekmez. Yukardaki ifade kme parantezleri kullanlmadan aadaki gibi de yazlabilir: if (ekmek_var) writeln("Yemek yiyorum"); else writeln("Bakkala yryorum"); ou deneyimli programc tek ifadelerde bile kme parantezi kullanr. (Bununla ilgili bir hatay problemler blmnde greceksiniz.) Mutlaka kme parantezleri kullanmanz bu noktada nermemin bir nedeni var: Bu neriye hemen hemen hibir zaman uyulmayan tek durumu da imdi anlatacam.

13.4

"if, else if, else" zinciriDilin bize verdii glerden birisi, ifade ve deyimleri serbeste kartrarak kullanma imkandr. fade ve deyimleri kapsamlar iinde de kullanabiliriz. rnein bir else kapsamnda bile if deyimi bulunabilir. Programlarn akll olarak alglanmalar, hep bizim ifade ve deyimleri doru sonular verecek ekilde birbirlerine balamamzdan doar. Bisiklete binmeyi yrmekten daha ok sevdiimizi varsayarsak:

Copyright 2009-2011 Ali ehreli, http://ddili.org

31

if Koulu

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 ekmek yoksa: bisiklet varsa frna gidiyorum, yoksa bakkala yryorum". Biraz daha ileri gidelim ve bisiklet olmadnda hemen bakkala yrmek yerine, komunun evde 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 deilse ama yleyse unu yap, vs." gibi yaplar programclkta ok kullanlr. Ne yazk ki byle yaznca kodda fazla boluklar oluur: buradaki 3 if deyimi ve 4 writeln ifadesi iin toplam 13 satr yazm olduk (bo satrlar saymadan). Sk karlalan bu yapy daha dzenli olarak yazmak iin, byle zincirleme kararlarda bir istisna olarak ilerinde tek bir if deyimi bulunan else 'lerin kapsam parantezlerini yazmayz. Hibir zaman kodu aadaki gibi irkin brakmayn! Ben bir sonraki adma geme aamas olarak gsteriyorum (o yzden de renksiz braktm). lerinde tek bir if olan else 'lerin kme parantezlerini 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"); }

Copyright 2009-2011 Ali ehreli, http://ddili.org

32

if Koulu

Bir adm daha ileri giderek if anahtar szcklerini de stlerindeki else satrlarna eker ve biraz 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 alt alta gelmi olurlar. Drt koulun hangi srada denetlendii ve her koulda ne yapld bir bakta anlalr. ok sk karlalan bu kod yapsna "if, else if, else" denir.

13.5

Problemler1. Aadaki programdaki mantksal ifadenin true olduunu gryoruz. Dolaysyla programn limonata iip barda ykamasn bekleriz: import std.stdio; void main() { bool limonata_var = true; if (limonata_var) { writeln("Limonata iiyorum"); writeln("Barda ykyorum"); } else writeln("Baklava yiyorum"); writeln("Taba kaldryorum");

}

Oysa program altrrsanz, ktsnda bir de tabak kaldrldn greceksiniz: Limonata iiyorum Barda ykyorum Taba 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 1 2 3 4 5 6 Baka bir deer Program kts Siz kazandnz Siz kazandnz Siz kazandnz Ben kazandm Ben kazandm Ben kazandm HATA: Geersiz deer

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

Copyright 2009-2011 Ali ehreli, http://ddili.org

33

if Koulu

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

Copyright 2009-2011 Ali ehreli, http://ddili.org

34

while Dngs

14

while Dngswhile dngs if kouluna ok benzer ve onun tekrar tekrar iletilmesidir. Mantksal bir ifade alr, bu ifade doru ise kapsamdaki ifadeleri iletir. Kapsamdaki ilemler tamamlannca mantksal 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 deikeninin deeri hi deimemekte ve hep true olarak kalmaktadr. while 'n gc, mantksal ifadenin programn almas srasnda deitii durumlarda daha iyi anlalr. Bunu grmek iin kullancdan bir say alan ve bu say "0 veya daha byk" olduu srece dngde kalan bir program dnelim. Hatrlarsanz, int trndeki deikenlerin 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.

14.1

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

Copyright 2009-2011 Ali ehreli, http://ddili.org

35

while Dngs

Yukardaki programda girilen her say iin teekkr etmek yerine, biraz seici olalm ve 13 deeri girildiinde beenmeyip tekrar dngnn bana dnelim. Bu programda 13'e teekkr 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 srece say al, ama 13 deerini kullanma.

14.2

break deyimiBir ok szlk anlam olan "break" D'de "dngy kr" anlamndadr. Bazen artk dngyle iimiz kalmadn anladmzda dngden hemen kmak isteriz; break bunu salar. Bu programn arad zel saynn 42 olduunu varsayalm ve o sayy bulduu an dngyle ii bitsin: 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 say al, 42 gelirse hemen k.

Copyright 2009-2011 Ali ehreli, http://ddili.org

36

while Dngs

14.3

Sonsuz dngbreak deyiminin kullanld baz durumlarda bilerek sonsuz dng oluturulur ve break deyimi o dngnn tek k olur. Sonsuz dng oluturmak iin while 'a sabit true deeri verilir. rnein kullancya bir men gstererek ondan bir komut bekleyen aadaki program, 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... :/"); }

}

}

14.4

Problemler1. u program giriten 3 geldii srece dngde kalmak iin programlanm ama bir hata var: 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-10 aralnda bir say alsn. Aye'nin bu aralk dnda say girmesini kabul etmesin ve doru say girene kadar Aye'den say almaya devam etsin. Ondan sonra Bar'tan teker teker say almaya balasn ve Bar'n girdii say Aye'nin batan girdii sayya eit olunca oyunu sonlandrsn. Not: Aye'nin girdii say ekranda grnd iin tabii ki Bar tarafndan hemen bilinir. :o) Bu aamada bunun bir nemi yok; burada amacmz dngleri renmek...

Copyright 2009-2011 Ali ehreli, http://ddili.org

37

while Dngs

... zmler

Copyright 2009-2011 Ali ehreli, http://ddili.org

38

Tamsaylar ve Aritmetik lemler

15

Tamsaylar ve Aritmetik lemlerD'nin karar verme ile ilgili yaplarndan if 'i ve while ' grdk. Bu blmde temel trlerin saysal olanlaryla yaplan aritmetik ilemlere bakacaz. Bylece bundan sonraki blmlerde ok daha becerikli ve ilgin programlar yazabileceksiniz. Aritmetik ilemler aslnda son derece basittirler nk zaten gnlk hayatmzda her zaman karmza karlar. Buna ramen, temel trlerle ilgilenirken mutlaka bilinmesi gereken ok nemli kavramlar da vardr. Tr uzunluu, tama, ve krplma kavramlarn anlyorsanz btn konuyu bu tabloya bakarak geebilirsiniz: le ++ -+ * / % ^^ Etkisi deerini bir arttrr deerini bir azaltr iki deeri toplar ikinciyi birinciden kartr iki deeri arpar birinciyi ikinciye bler birincinin ikinciye blmnnden kalan verir birincinin ikinci'nin deeri kadar ssn alr (birinciyi ikinci kere kendisiyle arpar) rnek kullanm ++deiken --deiken birinci + ikinci birinci - ikinci birinci * ikinci birinci / ikinci birinci % ikinci birinci ^^ ikinci

Tablodaki ikili ilelerin yanna = karakteri gelenleri de vardr: += , -= , *= , /= , %= , ve ^^= . Bunlar ilemin sonucunu soldaki deikene atarlar. rnein: say += 10; O ifade say 'ya 10 ekler ve sonucu yine say 'ya atar; yani deerini 10 arttrm olur. Tama: Her deer her tre smaz ve taabilir. rnein 0 ile 255 arasnda deerler tutabilen ubyte '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 geri kalann okumayabilirsiniz, ama yine de sondaki problemleri atlamayn.

15.1

Ayrntl BilgiBu blm ilgisiz bilgiler veriyor gibi gelebilir; nk aritmetik ilemler hepimizin gnlk hayatta srekli olarak karlatmz kavramlardr: Tanesi 10 lira olan bir eyden iki tane alrsak 20 lira veririz, veya 45 lira olan eylerin tanesi 15 liradr... Ne yazk ki iler bilgisayarda bu kadar basit olmayabilir. Saylarn bilgisayarda nasl saklandklarn bilmezsek, rnein 3 milyar borcu olan bir firmann 3 milyar daha bor almas sonucunda borcunun 1.7 milyara dtn grebiliriz. Baka bir rnek olarak, 1 kutusu 4 ocua yeten dondurmadan 11 ocuk iin 2 tane yetecek diye hesaplayabiliriz. Bu blm size ncekilerden daha teknik gelebilir ama tamsaylarn bilgisayarda nasl ifade edildiklerinin bir programc tarafndan mutlaka bilinmesi gerekir.

Copyright 2009-2011 Ali ehreli, http://ddili.org

39

Tamsaylar ve Aritmetik lemler

15.1.1

TamsaylarTamsaylar ancak tam deerler alabilen trlerdir: -2, 0, 10, vs. Bu trler 2.5 gibi kesirli deerler tutamazlar. Daha nce temel trler tablosunda da grdnz tamsay trleri unlardr: Bit Uzunluu 8 8 16 16 32 32 64 64 lk Deeri 0 0 0 0 0 0 0L 0L

Tr byte ubyte short ushort int uint long ulong

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

Bitler ve tr uzunluklarGnmzdeki bilgisayar sistemlerinde en kk bilgi paras bittir. Bit, elektronik dzeyde ve devrelerin belirli noktalarnda elektrik geriliminin var olup olmamas kavramyla belirlendii iin, ancak iki durumdan birisinde bulunabilir. Bu durumlar 0 ve 1 deerleri olarak kabul edilmilerdir. Yani sonuta bir bit, iki deiik deer saklayabilir. Yalnzca iki durumla ifade edilebilen kavramlarla fazla karlamadmz iin bitin kullanll da azdr: yaz veya tura, odada klarn ak olup olmad, vs. gibi iki durumu olan kavramlar... Biraz ileri giderek iki biti bir araya getirirsek, ikisinin birlikte saklayabilecekleri toplam deer adedi 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 daha iyi 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 ve geleneklere kalmtr. Yoksa rnein 000 durumu 42 deerini, 001 durumu 123 deerini, vs. gsteriyor da olabilirdi. Tabii bu kadar ilgisiz deerler kullanl olmayacaklarndan, 3 bitlik bir tr rnek alrsak, bu 8 durumun iaretli ve iaretsiz olarak kullanlmasnda ald deerler u tablodakine benzer:

Copyright 2009-2011 Ali ehreli, http://ddili.org

40

Tamsaylar ve Aritmetik lemler

Bitlerin Durumu 000 001 010 011 100 101 110 111

aretsiz Deer 0 1 2 3 4 5 6 7

aretli Deer 0 1 2 3 -4 -3 -2 -1

Burada grmenizi istediim, 3 bitten nasl 8 farkl deer elde edilebildiidir. Grld gibi, eklenen her bit, saklanabilecek bilgi miktarn iki katna kartmaktadr. Bunu devam ettirirsek; bitlerin bir araya getirilmelerinden oluturulan deiik uzunluktaki trlerin saklayabildikleri farkl deer miktarlarn, bir nceki bit uzunluunun saklayabilecei deer miktarn 2 ile arparak yle grebiliriz: Bit Adedi 1 2 3 4 5 6 7 8 ... 16 ... 32 ... Saklanabilecek Farkl Deer Adedi D Tr 2 4 8 16 32 64 128 256 ... 65,536 short ushort ... 4,294,967,296 ... long -9223372036854775808 9223372036854775807 ulong 0 18446744073709551615 int uint -2147483648 0 2147483647 4294967295 -32768 0 32767 65535 byte ubyte -128 0 127 255 En Kk Deeri En Byk Deeri

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

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

Hangi durumda hangi tr bitlik bir tr toplam 8 deer tayabildii iin rnein ancak atlan zarn sonucu veya haftann 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 kimlik kart numaras gibi bir kavram iin kullanlamaz, nk uint dnyadaki insan nfusu olan 6

Copyright 2009-2011 Ali ehreli, http://ddili.org

41

Tamsaylar ve Aritmetik lemler

ksur milyardan daha az sayda deer saklayabilir. long ve ulong 'un Trke'de nasl okunduunu bile bilemeyeceim toplam deer adedi ise ou kavram iin fazlasyla yeterlidir. Temel bir kural olarak, zel bir neden yoksa, tamsaylar iin ncelikle int 'i dnebilirsiniz.15.1.4

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

15.1.5

KrplmaTamsaylar kesirli deerler tutamadklar iin ne kadar nemli olsa da, virglden sonraki bilgiyi kaybederler. rnein 1 kutusu 4 ocua yeten dondurmadan 11 ocuk iin 2.75 kutu gerekiyor olsa bile, bu deer bir tamsay tr iinde ancak 2 olarak saklanabilir. Tamaya ve krplmaya kar alabileceiniz baz nlemleri ilemlerin tantmndan sonra vereceim. nce aritmetik ilemleri tanyalm.

15.1.6

Tr nitelikleri hatrlatmasTemel trlerin tantld derste tr niteliklerini grmtk: .min , trn alabilecei en kk deeri; .max da en byk deeri veriyordu.

15.1.7

Arttrma: ++Tek bir deikenle kullanlr. Deikenin isminden nce yazlr ve o deikenin deerini 1 arttrr: 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 ile kullanlmasnn edeeridir: say += 1; // ++say ifadesinin ayns

Arttrma ileminin sonucu; eer trn tayabilecei en yksek deeri ayorsa, o zaman taar ve trn alabildii en dk deere dnr. Bunu denemek iin nceki deeri int.max olan bir deikeni arttrrsak, yeni deerinin int.min olduunu grrz: import std.stdio; void main() {

Copyright 2009-2011 Ali ehreli, http://ddili.org

42

Tamsaylar ve Aritmetik lemler

writeln("en dk int deeri writeln("en yksek int deeri

: ", int.min); : ", int.max);

}

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

en dk int deeri : en yksek int deeri : saynn nceki deeri : saynn sonraki deeri:

-2147483648 2147483647 2147483647 -2147483648

Bu ok nemli bir konudur; nk say hibir uyar verilmeden, en yksek deerinden en dk deerine gemektedir; hem de arttrma ilemi sonucunda! Buna stten tama denir. Benzer tama davranlarn azaltma, toplama, ve karma ilemlerinde de greceiz.15.1.8

Azaltma: -Tek bir deikenle kullanlr. Deikenin isminden nce yazlr ve o deikenin deerini 1 azaltr: --say; // deeri bir azalr

Azaltma ileci, biraz aada greceiniz atamal karma ilecinin 1 deeri ile kullanlmasnn 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.15.1.9

Toplama: +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: 112 Sabit ifadeyle: 1100 Eer iki ifadenin toplam o trde saklanabilecek en yksek deerden fazlaysa, yine tama oluur ve deerlerin ikisinden de daha kk bir sonu elde edilir:

Copyright 2009-2011 Ali ehreli, http://ddili.org

43

Tamsaylar ve Aritmetik lemler

import std.stdio; void main() { // ki tane 3 milyar uint 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: 4294967295 birinci: 3000000000 ikinci: 3000000000 toplam: 1705032704 TAMA! Sonu 6 milyar olmad!

15.1.10

karma: 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);

}

-10 10 Eer sonucu tutan deiken iaretsizse ve sonu eksi bir deer alrsa, yine garip sonular doar. 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: 4294967286 10 Eninde sonunda farklar alnacak kavramlar iin hep iaretli trlerden semek iyi bir karardr. Yine, zel bir neden yoksa normalde int 'i seebilirsiniz.

Copyright 2009-2011 Ali ehreli, http://ddili.org

44

Tamsaylar ve Aritmetik lemler

15.1.11

arpma: *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

15.1.12

Blme: /Birinci ifadeyi ikinci ifadeye bler. Tamsaylar kesirli say tutamayacaklar iin, eer varsa sonucun kesirli ksm atlr. Buna krplma denir. rnein bu yzden aadaki program 3.5 deil, 3 yazmaktadr: import std.stdio; void main() { writeln(7 / 2); }

3

15.1.13

Kalan: %Birinci ifadeyi ikinci ifadeye bler ve kalann verir. rnein 10'un 6'ya blmnden kalan 4'tr: import std.stdio; void main() { writeln(10 % 6); }

4 Bu ile bir saynn tek veya ift olduunu anlamada kullanlr. Tek saylarn ikiye blmnden kalan her zaman iin 1 olduundan, kalann 0 olup olmadna bakarak saynn tek veya ift olduu kolayca anlalr: if ((say % 2) == 0) { writeln("ift say"); } else { writeln("tek say"); }

Copyright 2009-2011 Ali ehreli, http://ddili.org

45

Tamsaylar ve Aritmetik lemler

15.1.14

s alma: ^^Birinci ifadenin ikinci ifade ile belirtilen ssn alr. rnein 3 ss 4, 3'n 4 kere kendisiyle arpmdr: import std.stdio; void main() { writeln(3 ^^ 4); }

81

15.1.15

Atamal aritmetik ileleriYukarda gsterilen ve iki ifade alan aritmetik ilelerin atamal olanlar da vardr. Bunlar ilemi gerekletirdikten sonra ek olarak sonucu sol taraftaki deikene atarlar: import std.stdio; void main() { int say = 10; say say say say say say } += 20; -= 5; *= 2; /= 3; %= 7; ^^= 6; // // // // // // say say say say say say = = = = = = say say say say say say + 20 - 5 * 2 / 3 % 7 ^^ 6 ile ile ile ile ile ile ayn ayn ayn ayn ayn ayn ey; ey; ey; ey; ey; ey; imdi imdi imdi imdi imdi imdi 30 25 50 16 2 64

writeln(say);

64

15.1.16

Eksi iareti: 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);

}

-1 2 Bu ilecin sonucunun tr, deikenin tr ile ayndr. uint gibi iaretsiz trler eksi deerler tutamadklar iin, bu ilecin onlarla kullanlmas artc sonular dourabilir: uint say = 1; writeln("eksi iaretlisi: ", -say);

Copyright 2009-2011 Ali ehreli, http://ddili.org

46

Tamsaylar ve Aritmetik lemler

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

15.1.17

Art iareti: +Matematikte saylarn nne yazlan + iareti gibi bunun da hibir etkisi yoktur. fadenin deeri 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

15.1.18

nceki deerli arttrma: ++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 deeri olarak kullanlr. Bunun etkisini grmek iin normal ++ ileciyle karlatralm: import std.stdio; void main() { int normal_arttrlan = 1; writeln(++normal_arttrlan); writeln(normal_arttrlan); int nceki_deerli_arttrlan = 1; // Deeri arttrlr ama ifadede nceki deeri kullanlr: writeln(nceki_deerli_arttrlan++); // 1 yazlr writeln(nceki_deerli_arttrlan); // 2 yazlr

// 2 yazlr // 2 yazlr

}

2 2 1 2 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 deeri kullanlmtr.

Copyright 2009-2011 Ali ehreli, http://ddili.org

47

Tamsaylar ve Aritmetik lemler

15.1.19

nceki deerli azaltma: -Not: zel bir nedeni yoksa normal azaltma ilecini kullanmanz neririm. nceki deerli arttrma ++ ile ayn ekilde davranr ama arttrmak yerine azaltr.

15.1.20

lem ncelikleriYukardaki ilemleri hep tek balarna ve bir veya iki ifade ile grdk. Oysa mantksal ifadelerde olduu gibi, birden fazla aritmetik ilemi bir arada kullanarak daha karmak ilemler oluturabiliriz: int say = 77; int sonu = (((say + 8) * 3) / (say - 1)) % 5; Mantksal ifadelerde olduu gibi, bu ilelerin de D tarafndan belirlenmi olan ncelikleri vardr. rnein * ilecinin ncelii + ilecininkinden yksek olduu iin, parantezler kullanlmadnda, say + 8 * 3 ifadesi, nce * ilemi uygulanaca iin say + 24 olarak hesaplanr. Bu da yukardakinden farkl bir ilemdir. O yzden, parantezler kullanarak hem ilemleri doru srada uygulatm olursunuz, hem de kodu okuyan kiilere kodu anlamalarnda yardmc olmu olursunuz.

15.1.21

Tamaya kar nlemlerEer bir ilemin sonucu seilen tre smyorsa, zaten yaplacak bir ey yoktur. Ama bazen sonu sacak olsa da ara ilemler srasnda oluabilecek tamalar nedeniyle yanl sonular elde edilebilir. Bir rnee bakalm: kenarlar 40'a 60 kilometre olan bir alann her 1000 metre karesine bir elma aac dikmek istiyoruz. Ka aa gerekir? Bu problemi kat kalemle znce sonucun 40000 arp 60000 bl 1000 olarak 2.4 milyon olduunu 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, programdaki en * boy alt ileminin bir int 'e samayacak kadar byk olduu iin tamas, ve bu yzden de 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:

Copyright 2009-2011 Ali ehreli, http://ddili.org

48

Tamsaylar ve Aritmetik lemler

Gereken elma aac: 2400000 Bu ifadenin doru almasnn nedeni, imdiki ara ilem olan en / aa_bana_yer ifadesinin deerinin 40 olduu iin artk int 'ten tamamasdr. Aslnda byle bir durumda en doru zm; bir tamsay tr deil, kesirli say trlerinden birisini kullanmaktr: float , double , veya real .15.1.22

Krplmaya kar nlemlerBenzer ekilde, ara ilemlerin srasn deitirerek krplmann da etkisini azaltabiliriz. Bunun ilgin bir rneini, ayn sayya blp yine ayn sayyla arptmzda grebiliriz: 10/9*9 ileminin 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.

15.2

Problemler1. Yazacanz program kullancdan iki tamsay alsn ve birincinin iinde ikinciden ka tane bulunduunu 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 10 ve 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 ve girilen iki deere o ilemi uygulasn. Bu programda tama ve krplma sorunlarn gzard edebilirsiniz. 4. Yazacanz program 1'den 10'a kadar btn saylar ayr satrlarda olacak ekilde yazdrsn. Ama, bir istisna olarak 7 deerini yazdrmasn. Programda u ekilde tekrarlanan writeln ifadeleri kullanmayn: import std.stdio; void main() { // Byle yapmayn!

Copyright 2009-2011 Ali ehreli, http://ddili.org

49

Tamsaylar ve Aritmetik lemler

}

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'yi yazdrmama kouluna da dikkat edin. Burada herhalde eit olmama koulunu denetleyen != ilecini kullanmak zorunda kalacaksnz. ... zmler

Copyright 2009-2011 Ali ehreli, http://ddili.org

50

Kesirli Saylar

16

Kesirli SaylarTamsaylarn ve aritmetik ilemlerin olduka kolay olduklarn, buna ramen yaplarndan kaynaklanan tama ve krplma gibi zellikleri olduunu grdk. Bu blmde de biraz ayrntya girmek zorundayz. Eer aadaki listedeki hereyi bildiinizi dnyorsanz, 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 gereken zellikleri vardr. Krplma konusunda ok iyidirler, nk zaten zellikle virglden sonras iin tasarlanmlardr. Belirli sayda bitle snrl olduklar iin tama bu trlerde de vardr ancak alabildikleri deer aral tamsaylarla karlatrldnda olaanst genitir. Ek olarak, tamsay trlerinin tama durumunda sessiz kalmalarnn aksine, kesirli saylar "sonsuzluk" deerini alrlar. nce kesirli say trlerini hatrlayalm: Tr float double real Bit Uzunluu 32 64 en az 64, veya donanm salyorsa daha fazla (rnein 80) lk Deeri float.nan double.nan real.nan

16.1

Kesirli tr nitelikleriKesirli 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 normal duyarlnn altndadr) .dig "basamak says" anlamna gelen "digits"in ksaltmasdr; trn ka basamak duyarl 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 for Floating Point Types bal altnda bulabilirsiniz. Yukardaki nitelikleri, birbirleriyle olan ilikilerini grmek iin bir say izgisine yle yerletirebiliriz:

Copyright 2009-2011 Ali ehreli, http://ddili.org

51

Kesirli Saylar

+ +-----------+------------+ .. + .. +----------+----------+ + | -max -1 -min 0 min 1 max | -infinity infinity

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

16.2

.nanAka ilk deeri verilmeyen kesirli saylarn ilk deerlerinin .nan olduunu grdk. .nan deeri baz anlamsz ilemler sonucunda da ortaya kabilir. rnein u programdaki ifadelerin hepsi .nan sonucunu verir: import std.stdio; void main() { double sfr = 0; double sonsuz = double.infinity; writeln("nan kullanan her ilem: writeln("sfr bl sfr : writeln("sfr kere sonsuz : writeln("sonsuz bl sonsuz : writeln("sonsuz eksi sonsuz : ", ", ", ", ", double.nan + 1); sfr / sfr); sfr * sonsuz); sonsuz / sonsuz); sonsuz - sonsuz);

}

16.3

Kesirli saylarn yazmlarBu trn niteliklerine bakmadan nce kesirli saylarn nasl yazldklarn grelim. Kesirli saylar 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 rnek 1.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 "10 zeri o kadar deere blnecek" demektir. Yani bu rnek 5.67/103'tr, bir baka deyile "5.67 bl 1000"dir ve ifadenin deeri 0.00567'dir. Kesirli saylarn bu gsterimlerini, trlerin niteliklerini yazdran u programn ktsnda greceksiniz: import std.stdio; void main() { writeln("Tr ismi writeln("Duyarlk writeln("En kk writeln("En byk writeln(); writeln("Tr ismi writeln("Duyarlk writeln("En kk writeln("En byk writeln(); writeln("Tr ismi writeln("Duyarlk writeln("En kk writeln("En byk }

: : normalize deeri: deeri : : : normalize deeri: deeri : : : normalize deeri: deeri :

", ", ", ", ", ", ", ", ", ", ", ",

float.stringof); float.dig); float.min_normal); float.max); double.stringof); double.dig); double.min_normal); double.max); real.stringof); real.dig); real.min_normal); real.max);

Copyright 2009-2011 Ali ehreli, http://ddili.org

52

Kesirli Saylar

Benim ortammdaki kts aadaki gibi oldu; real tr donanma bal olduu iin bu kt sizin ortamnzda farkl olabilir: Tr ismi : float Duyarlk : 6 En kk normalize deeri: 1.17549e-38 En byk deeri : 3.40282e+38 Tr ismi : double Duyarlk : 15 En kk normalize deeri: 2.22507e-308 En byk deeri : 1.79769e+308 Tr ismi : real Duyarlk : 18 En kk normalize deeri: 3.3621e-4932 En byk deeri : 1.18973e+4932

16.4

Gzlemlerulong trnn tutabilecei en yksek deerin ne kadar ok basama olduunu hatrlyor musunuz: 18,446,744,073,709,551,616 says 20 basamaktan oluur. Buna karn, en kk kesirli say tr olan float 'un bile tutabilecei en yksek deer 1038 mertebesindedir. Yani unun gibi bir deer: 340,282,000,000,000,000,000,000,000,000,000,000,000. real 'in en byk deeri ise 104932 mertebesinde. Yani 4900'den fazla basama olan bir say! Baka bir gzlem olarak double 'n 15 duyarlkla ifade edebilecei en dk deere bakalm: 0.000...burada 300 tane daha 0 var...0000222507.

16.5

Tama gzard edilmezNe kadar byk deerler tutuyor olsalar da kesirli saylarda da tama olabilir. Kesirli say trlerinin iyi taraf, tama olutuunda tamsaylardaki tamann tersine bundan haberimizin olabilmesidir: taan saynn deeri "art sonsuz" iin .infinity , "eksi sonsuz" iin .infinity haline gelir. Bunu grmek iin u programda .max 'n deerini %10 arttrmaya alalm. Say zaten en byk deerinde olduu iin, %10 arttrnca taacak ve yarya blnse bile deeri "sonsuz" olacaktr: import std.stdio; void main() { real say = real.max; writeln("nce: ", say); // 1.1 ile arpmak, %110 haline getirmektir: say *= 1.1; writeln("%10 arttrnca: ", say); // kiye blerek kltmeye alalm: say /= 2; writeln("Yarya blnce: ", say);

}

Copyright 2009-2011 Ali ehreli, http://ddili.org

53

Kesirli Saylar

O programda say bir kere real.infinity deerini alnca yarya blnse bile sonsuz deerinde kalr: nce: 1.18973e+4932 %10 arttrnca: inf Yarya blnce: inf

16.6

Duyarlk (Hassasiyet)Duyarlk, yine gnlk hayatta ok karlatmz ama fazla szn etmediimiz bir kavramdr. Duyarlk, bir deeri belirtirken kullandmz basamak saysdr. rnein 100 lirann te birinin 33 lira olduunu sylersek, duyarlk 2 basamaktr. nk 33 deeri sadece iki basamaktan ibarettir. Daha hassas deerler gereken bir durumda 33.33 dersek, bu sefer drt basamak kullanm olduumuz iin duyarlk 4 basamaktr. Kesirli say trlerinin bit olarak uzunluklar yalnzca alabilecekleri en dk ve en yksek deerleri deil; deerlerin duyarlklarn da etkiler. Bit olarak uzunluklar ne kadar fazlaysa, duyarlklar da o kadar fazladr.

16.7

Krplma yokturKesirli saylarda virglden sonrasn atmak anlamnda krplma yoktur. Saynn doruluu duyarlyla ilgilidir: virglden sonraki basamaklarn ne kadar doru olduklarn duyarlk belirler.

16.8

Hangi durumda hangi trzel bir neden yoksa her zaman iin real 'i kullanmak doruluk asndan yararldr. float 'un duyarl ok dktr, ama kk olmasnn yarar salayaca nadir programlardan birisini yazyorsanz, o zaman dnerek ve lerek karar verebilirsiniz. te yandan real 'in duyarl her ortamda ayn olmad iin, tanabilirlik asndan double kullanmak isteyebilirsiniz.

16.9

Her deeri ifade etmek olanakszdrHer deerin ifade edilememesi kavramn nce gnlk hayatmzda gstermek istiyorum. Kullandmz onlu say sisteminde virglden nceki basamaklar birler, onlar, yzler, vs. basamaklardr; virglden sonrakiler de onda birler, yzde birler, binde birler, vs... Eer ifade etmek istediimiz deer bu basamaklarn bir karm ise, deeri tam olarak ifade edebiliriz. rnein 0.23 deeri 2 adet onda bir deerinden ve 3 adet yzde bir deerinden olutuu iin tam olarak ifade edilebilir. te yandan, 1/3 deerini onlu sistemimizde tam olarak ifade edemeyiz nk virglden sonra ne kadar uzatrsak uzatalm yeterli olmaz: 0.33333... Benzer durum kesirli saylarda da vardr. Trlerin bit saylar snrl olduu iin, her deer tam olarak ifade edilemez. Bilgisayarlarda kullanlan ikili say sistemlerinin bir fark, virglden ncesinin birler, ikiler, drtler, vs. diye; virglden sonrasnn da yarmlar, drtte birler, sekizde birler, vs. diye gitmesidir. Eer deer bunlarn bir karm ise tam olarak ifade edilebilir; deilse edilemez. Bilgisayarlarda tam olarak ifade edilemeyen bir deer 0.1'dir (10 kuru gibi). Onlu sistemde tam olarak 0.1 eklinde ifade edilebilen bu deer, ikili sistemde 0.0001100110011... diye

Copyright 2009-2011 Ali ehreli, http://ddili.org

54

Kesirli Saylar

tekrarlar ve kesirli saynn duyarlna bal olarak belirli bir yerden sonra hataldr. (Tekrarladn sylediim o son sayy ikili sistemde yazdm, onlu deil...) Bunu gsteren aadaki rnei ilgin bulabilirsiniz. Bir deikenin deerini bir dng iinde her seferinde 0.001 arttralm. Dngnn 1000 kere tekrarlanmasnn ardndan sonucun 1 olmasn bekleriz. Oysa yle kmaz: import std.stdio; void main() { float sonu = 0; // Bu dngnn 1000 kere tekrarlandktan sonra 1 deerine // ulaacan dnrz: while (sonu < 1) { sonu += 0.001; } // Bakalm doru mu... if (sonu == 1) { writeln("Beklendii gibi 1"); } else { writeln("FARKLI: ", sonu); }

}

FARKLI: 1.00099 Bunun nedeni; 0.001 deerinin de tam olarak ifade edilemeyen bir deer olmas, ve bu deerdeki hata miktarnn sonucu 1000 kere etkilemesidir. Sonutan da anlalaca gibi, dngden klabilmesi iin 1001 kere tekrarlanmas gerekmitir.

16.10

Kesirli say karlatrmalarTamsaylarda u karlatrma ilelerini kullanyorduk: eitlik (== ), eit olmama (!= ), kklk (< ), byklk (> ), kk veya eit olma (= ). Kesirli saylarda geersiz deeri gsteren .nan da bulunduu iin, onun dier deerlerle kk byk olarak karlatrlmas anlamszdr. rnein .nan 'n m yoksa 1'in mi daha byk olduu gibi bir soru yantlanamaz. Bu yzden kesirli saylarda baka bir karlatrma kavram daha vardr: sraszlk. Sraszlk, deerlerden en az birisinin .nan olmas demektir. Aadaki tablo kesirli say karlatrma ilelerini gsteriyor. lelerin hepsi ikilidir ve rnein soldaki == sadaki eklinde kullanlr. false ve true ieren stunlar, ilelerin hangi durumda ne sonu verdiini gsterir. Sonuncu stun, ifadelerden birisinin .nan olmas durumunda o ilecin kullanmnn anlaml olup olmadn gsterir. rnein 1.2 < real.nan ifadesinin sonucu false ksa bile, ifadelerden birisi real.nan olduu iin bu sonucun bir anlam yoktur nk bunun tersi olan real.nan < 1.2 ifadesi de false verir.

Copyright 2009-2011 Ali ehreli, http://ddili.org

55

Kesirli Saylar

le == != > >= < !

Anlam eittir eit deildir byktr byktr veya eittir kktr kktr veya eittir kk, byk, eit deildir kktr veya byktr kktr, byktr, veya eittir kk deildir ve eit deildir kk deildir byk deildir ve eit deildir byk deildir kk deildir ve byk deildir

Soldaki Soldaki kisi Bykse Kkse Eitse false true true true false false false true true true true false false false false true false false true true false true true false false true true false true false false true false true false false true false true false true true

En Az Birisi .nan ise false true false false false false true false false true true true true true

.nan ile Anlaml evet evet hayr hayr hayr hayr evet hayr hayr evet evet evet evet evet

Dikkat ederseniz; ! karakteri ieren, yani anlamnda "deildir" sz bulunan btn ilelerin .nan ile kullanlmas anlamldr ve sonu hep true 'dur. .nan 'n geerli bir deeri gstermiyor olmas, ou karlatrmaya "deil" sonucunu verdirir.

16.11

Problemler1. nceki blmdeki hesap makinesini kesirli bir tr kullanacak ekilde deitirin. Bylece hesap makineniz ok daha doru sonular verecektir. Denerken deerleri girmek iin 1000, 1.23, veya 1.23e4 eklinde yazabilirsiniz. 2. Giriten 5 tane kesirli say alan bir program yazn. Bu saylarn nce iki katlarn yazsn, sonra da bee blmlerini. Bu problemi bir sonra anlatlacak olan dizilere hazrlk olarak soruyorum. Eer bu program imdiye kadar rendiklerinizle yazarsanz, dizileri anlamanz daha kolay olacak. ... zmler

Copyright 2009-2011 Ali ehreli, http://ddili.org

56

Diziler

17

DizilerBir nceki dersin problemlerinden birisinde 5 tane deiken tanmlam ve onlarla belirli ilemler yapm