SVETLIN NAKOV & CO. C# ile Bilgisayar Programlama Temelleri ÇEVİREN : AYŞEGÜL TUNÇ fotoğraf: Brian J. Skerry, http://travel.nationalgeographic.com C# İle Bilgisayar Programlama Temelleri İçindekiler Tablosu Yazar Hakkında 8 Önsöz 9 Bölüm 0: Giriş 10 Bu Kitapta Kimler Hedefleniyor? 10 Öncesinden Bilgi Gerekli Değildir! 11 Bu Kitabın Kapsamı Nedir? 12 Bu Kitabın Öğretmedikleri Nelerdir? 13 .NET Platformu 13 Yazılım Mühendisliği, Takım Çalışması 13 WEB Teknolojileri, Veritabanları 13 Bilgi Nasıl Sunulmuştur? 14 C# ve .NET Platformu 14 C# Programlama Dili 15 Neden C#? 17 C# veya Java? 17 Neden PHP Değil? 17 Neden C veya C++ Değil? 18 C# Avantajları 19 Örnekler Visual Studio 2012 İçin C# 5 Dilinde Verilmiştir 20 Bu Kitabı Nasıl Okumalısınız? 21 Alıştırmaları Asla İhmal Etmeyin! 22 Bu Kitaptan Öğrenmek İçin Ne Kadar Zamana İhtiyacınız Var? 22 Karmaşık veya Kolay? 23 Neden Veri Yapıları ve Algoritmaların Önemi Belirtilmiştir? 24 Google’da İş Görüşmeleri 24 Microsoft’ta İş Röportajları 24 Gerçekten Bir Programcı Olmak İster Misiniz? 25 Bir Programcı Olmak İçin Motive Olun yada Bir Başka İş Bulun! 27 Kitabın İçindekilerine Bir Bakış 28 Bölüm 0: Önsöz 28 Bölüm 1: Programlamaya Giriş 28 Bölüm 2: Temel Türler ve Değişkenler 29 Bölüm 3: İşleçler ve İfadeler 29 Bölüm 4: Konsol Giriş ve Çıkış 30 www.nakov.com Page 2 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 5: Koşullu İfadeler 30 Bölüm 6: Döngüler 31 Bölüm 7: Diziler 31 Bölüm 8: Sayısal Sistemler 32 Bölüm 9: Metotlar 32 Bölüm 10: Özyineleme 33 Bölüm 11: Nesneleri Oluşturma ve Kullanma 33 Bölüm 12: İstisnai Durum İşleme 34 Bölüm 13: Dizeler ve Metin İşleme 34 Bölüm 14: Sınıfları Tanımlama 35 Bölüm 15: Metin Dosyaları 35 Bölüm 16: Doğrusal Veri Yapıları 36 Bölüm 17: Ağaçlar ve Grafikler 36 Bölüm 18: Sözlükler, Karma Tabloları ve Kümeler 37 Bölüm 19: Veri Yapıları ve Algoritma Karmaşıklığı 37 Bölüm 21: Yüksek Kalite Programlama Kodu 38 Bölüm 22: Lambda İfadeleri ve LINQ 39 Bölüm 23: Problem Çözme Metodolojisi 39 Bölüm 24, 25, 26: Örnek Programlama Sınavı 40 Bölüm 27: Sonuç 40 Bölüm 1: Programlamaya Giriş 41 Bölümün İçindekileri 41 Bilgisayarlar Bilgiyi Nasıl İşler? 41 “Programlama” Ne Demektir? 41 Bilgisayarı Yönetmek 42 Programlamanın Özü 42 Yazılım Geliştirme Aşamaları 43 Dokümantasyon 47 Yazılım Geliştirme Kodlamadan Daha Fazlasıdır 47 İlk C# Programımız 48 Main() Metotunu Tanımlamak 49 C# Büyük ve Küçük Harf Arasında Ayrım Yapar! 50 Program Kodu Doğru Biçimli Olmalıdır 50 Başlıca Biçimlendirme Kuralları 52 Dosya Adları Sınıf Adlarına Karşılık Gelir 53 C# Dili ve .NET Platformu 53 C# Dili 53 Anahtar Sözcükler 54 www.nakov.com Page 3 / 151 C# İle Bilgisayar Programlama Temelleri Otomatik Bellek Yönetimi 54 Ortamdan ve Programlama Dilinden Bağımsızlık 55 Common Language Runtime (CLR) – .NET’in Kalbi 56 .NET Framework’u Nasıl Edineceğim? 56 .NET’in Çekirdek Kurulumu (21MB) 56 .NET Framework SDK (134 MB) 57 .NET Teknolojileri 57 Hangi İşletim Sistemlerinde Çalışıyor? 57 Verinin görselleştirilmesi 58 Yazılım teknolojileri 58 .NET teknolojisi 58 The Base Class Library - Temel Sınıf Kütüphaneleri 59 Uygulama Programlama Arayüzü (API) 60 Windows Konsolunda C# Programları Oluşturma 61 Windows Üzerinde C# Programları Derleme 64 Windows Üzerinde C# Programları Derleme ve Çalıştırma 65 Windows Üzerinde Sistem Yollarını Değiştirme 66 Visual Studio Tümleşik Geliştirme Ortamı (IDE) 70 Tümleşik Geliştirme Ortamları 70 Visual Studio Nedir? 70 Yeni bir C# Projesi Oluşturma 74 Kaynak Kodun Derlenmesi 77 Projeyi Başlatma 78 Programda Hata Ayıklama 79 Diğer .NET Dilleri 82 Bölüm 2: Temel Türler ve Değişkenler 84 Bölümün İçindekileri 84 Değişken Nedir? 84 Veri Türleri 84 Veri türleri aşağıdakilerle karakterize edilir: 85 C# temel veri türleri aşağıdaki türlerle belirlenmiştir: 85 C# ve .NET Türleri Arasındaki İlişki 86 Tamsayı Türleri 86 Kayan Noktalı Gerçek Sayı Türleri 89 Gerçek Sayı Türü: Float 89 Gerçek Sayı Türlerinin Özel Değerleri 90 Gerçek Sayı Türü: Double 90 Kayan Noktalı Gerçek Sayı Türleri - Örnek 91 www.nakov.com Page 4 / 151 C# İle Bilgisayar Programlama Temelleri Gerçek Sayı Türlerinin Duyarlılığı 91 Gerçek Sayı Türlerinin Doğruluğu - Örnek 92 Gerçek Sayı Türlerinin Sunumu Hakkında 93 Gerçek Sayı Türleri ile Hesaplamalarda Hatalar 93 Ondalık Duyarlıklı Gerçek Sayı Türleri 94 Boole Türü 95 Boole Türü – Örnek 96 Character Türü 97 Character Türü – Örnek 97 Dizeler 98 Dizeler – Örnek 98 Object Türü 98 Object Kullanımı – Örnek 98 Nullable Türler 99 Değişkenlerin Özellikleri 101 Değişkenlerin Adlandırılması – Kurallar 102 Değişkenlerin Adlandırılması – Öneriler 102 Değişkenlerin Bildirilmesi 104 Değer Atanması 105 Değişkenlerin Başlatılması 105 Standart Değişken Değerleri 105 Değer ve Referans Türleri 107 Değer ve Referans Türleri ve Bellek 108 Simgedeğerler 111 Değer ve Referans Türleri 111 Gerçek Sayı Türlerinin Özel Değerleri 111 Boole Simgedeğeri 111 Boole Simgedeğerleri – Örnek 112 Integer Simgedeğerleri 112 Tamsayı Simgedeğerleri – Örnek 112 Gerçek Sayı Simgedeğerleri 113 Gerçek Sayı Simgedeğerleri – Örnekler 113 Karakter Simgedeğerleri 113 Kaçma Karakterleri 114 Kaçma Karakterleri – Örnek 115 Dize Simgedeğerleri 115 Dize Simgedeğerleri – Örnek 116 Bölüm 3: İşleçler ve İfadeler 118 www.nakov.com Page 5 / 151 C# İle Bilgisayar Programlama Temelleri Bölümün İçindekileri 118 İşleç Nedir 118 C# İşleçleri 118 İşleçler 118 İşleç Kategorileri 119 Argüman Sayısına Göre İşleç Türleri 119 İşleçler – Örnek 120 C# İşleç Önceliği 120 Aritmetik İşleçler 122 Aritmetik İşleçler - Örnek 123 Mantıksal İşleçler 123 Mantıksal İşleçler - Örnek 124 De Morgan Kuralları 125 Dizileri Bitiştirmek İçin İşleçler 125 Dizileri Bitiştirmek İçin İşleçler – Örnek 126 Bitsel İşleçler 127 Bitsel İşleçler ve Performansları 128 Bitsel İşleçler – Örnek 129 Karşılaştırma İşleçleri 129 Karşılaştırma İşleçleri – Örnek 130 Atama İşleçleri 130 Atama İşleçleri – Örnek 131 Peşpeşe Atama 131 Bileşik Atama İşleçleri 132 Koşullu İşleç ?: 133 Koşullu İşleç “?:” – Örnek 133 Diğer İşleçler 134 “.” İşleci 134 [] Kare Köşeli Parantez İşleci 134 () Parantez İşleci 134 Türü Dönüştürme İşleci 134 “as” İşleci 134 “new” İşleci 135 “is” İşleci 135 “??” İşleci 135 Türü Dönüştürme ve Türe Zorlama 136 Türü Örtük Dönüştürme 137 Türü Örtük Dönüştürme – Örnekler 137 www.nakov.com Page 6 / 151 C# İle Bilgisayar Programlama Temelleri Olması Mümkün Örtülü Dönüşümler – Örnekler 138 Türü Açıkça Dönüştürme 138 Türü Açıkça Dönüştürme – Örnek 139 Türü Dönüştürme Sırasında Veri Kayıpları 140 Türe Zorlama Sırasında Taşma İstinasının Fırlatılması 141 Olması Mümkün Açık Dönüşümler 141 String Türüne Dönüştürme 142 String Türüne Dönüştürme – Örnek 142 İfadeler 143 İfadelerin Yan Etkileri 143 İfadeler, Veri Türleri ve İşleç Öncelikleri 144 Sıfıra Bölme 144 Kodu Daha Anlaşılır Yapmak İçin Parantezlerin Kullanılması 145 Bölüm 4: Konsol Giriş ve Çıkış 148 Bölümün İçindekileri 148 Kullanıcı ve Program Arasındaki İletişim 148 Ne Zaman Konsol Kullanılmalıdır? 148 Konsol Nedir? 148 Konsol Nasıl Başlatılır? 149 Konsollar Hakkında Daha Fazlası 150 Temel Konsol Komutları 151 Windows Konsol Komutları 151 www.nakov.com Page 7 / 151 C# İle Bilgisayar Programlama Temelleri Yazar Hakkında S VETLIN NAKOV has 15 years technical background as software engineer, software project manager, consultant, trainer, and entrepreneur with rich experience with the .NET and Java EE platforms, information systems, databases, Web development and software engineering. He is author of 7 books on computer programming and software technologies, C# and Java, and tens of technical and scientific publications. Svetlin has been a speaker at hundreds of conferences, seminars, courses and other trainings. „The book Introduction to ProHe holds a PhD degramming with C# is fundamengree in computer tal computer programming book science, medals from that focuses on the concepts of the International Inthe computer programming, data formatics Olympiads structures and algorithms. It is the (IOI) and the Bulgarecommended start for junior deverian President’s award “John Atanassoff”. He lopers and is entirely free. ” has been a part-time lecturer in Sofia University, New Bulgarian University and the Technical University of Sofia. Currently Svetlin drives the largest training center for software engineers in Bulgaria – Software University where he teaches young people in computer science, software development and information technologies. www.nakov.com Page 8 / 151 C# İle Bilgisayar Programlama Temelleri Önsöz Eğer programlamayı ciddiye almak istiyorsanız, doğru kitabı edindiniz. Gerçekten! Bu kitapla programlamaya ilk adımları yapabilirsiniz. Böylece modern programlama dillerini ve yazılım geliştirme teknolojilerini öğrenmeniz için uzun yolculuğa uçan bir başlangıç alacaksınız. Bu kitap, programlamanın son 15 yıl içinde önemli ölçüde değişmeyen temel ilke ve kavramlarını öğretir. C # takip etmek istediğiniz dil olmasa bile bu kitabı okumak için tereddüt etmeyin. İlerleyeceğiniz dil hangisi olursa olsun, burada size vereceğimiz bilgi geçerli olacaktır, çünkü bu kitap size programcılar gibi düşünmeyi öğretecek. Biz size pratik algoritmik problemlerin çözümü için nasıl program yazılacağını öğreteceğiz ve algoritmaları ortaya atma (ve uygulama) becerilerini size öğreteceğiz ve algoritmaları ortaya atma (ve uygulama) becerilerini sizde oluşturacağız ve çeşitli veri yapılarını kullanacağız. Size göründüğü kadar imkansız gelecek ama, bilgisayar programları yazmanın tüm temel prensipleri son 15 yıl içinde çok değişmedi. www.nakov.com Programlama dilleri değişiyor, teknolojiler modernize oluyor, entegre geliştirme ortamları daha gelişiyor, ancak programlamanın temel prensipleri aynı kalmıştır. Yeni başlayanlar algoritmik düşünmeyi öğrendikleri zaman, ve sonra bir sorunu çözmek için içgüdüsel olarak bir dizi adımlar içine bölmeyi öğrendikleri zaman, bunun yanı sıra uygun veri yapılarını seçmeyi öğrendikleri zaman ve yüksek-kaliteli programlama kodu yazdıklarında programcı olurlar. Bu becerileri kazandıktan sonra, kolayca yeni bir dil ve çeşitli teknolojileri öğrenebilirsiniz - Web programlama, HTML5 ve JavaScript gibi, mobil geliştirme, veritabanları ve SQL, XML, REST, ASP.NET, Java EE, Python, Ruby ve daha yüzlercesi. Page 9 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 0: Giriş B u kitap, bir programcı gibi düşünmeyi size öğretmek için tasarlanmıştır ve C# dili, Java, C++, PHP veya Python gibi diğer modern programlama dilleri ile yer değiştirebilecek sadece bir araçtır. Bu programlama üzerine bir kitaptır, C# üzerine bir kitap değildir! Bu Kitapta Kimler Hedefleniyor? Bu kitap yeni başlayanlar için uygundur. Bugüne kadar programlamayı ciddi olarak yapmayan bunu yapmaya başlamak isteyen herkes için tasarlanmıştır. Bu kitap sıfırdan başlar ve programlama temellerini adım adım tanıtır. Bir yazılım mühendisi olmak için kesinlikle gereken herşeyi ve bir yazılım firmasında çalışmayı size öğretmeyecektir, ama o teknolojik bilgi ve becerileri kurabileceğiniz zemini hazırlayacaktır ve onlar aracılığıyla programlamayı mesleğiniz haline getirmeniz mümkün olacaktır. Eğer hiç bir bilgisayar programı yazmamışsanız, merak etmeyin. Bu kitap programlamayı size en baştan öğretecektir. Öncesinden herhangi bir bilgi ya da yetenek gerekli değildir. Tüm ihtiyacınız, bazı temel bilgisayar okuma yazma ve programlama becerisidir. Kalan kısmı kitaptan elde etmeyi bekleyebilirsiniz. Bu kitap gönüllü yazılım mühendislerinden oluşan büyük bir ekip tarafından aslında Bulgarca yazılmış ve İngilizce’ye çevrilmiş nüshası daha sonra Türkçe’ye çevrilmiştir. Çevirmenin anadili İngilizce olmadığı için pek çok hatalar ve özensiz çeviri bulabilirsiniz. Lütfen bizi bağışlayın! Çoğu Bulgar olan 70’i aşkın kişi bu kitabın asıl projesine katıldı. Tüm ekip bu kitabı okumayı seçtiğiniz için sizi tebrik ediyor ve içeriğinin bulabileceğiniz küçük hatalar ve yanlışlıklardan daha önemli olduğuna inanıyor. Tadını çıkarın! Eğer zaten basit programlar yazıyorsanız veya resmi bir kurumda (okul, üniversite vb.) programlama okuma tecrübeniz varsa, veya arkadaşlarınızla kodlamışsanız, herşeyi bildiğinizi düşünmeyin! Bu kitabı okuyunca kaçırdığınız çok şeyin farkında olabilirsiniz. Bu kitap yeni başlayanlar içindir, ancak deneyimli profesyonel programcıların bile eksikliğini duyduğu beceri ve kavramları öğretebilir. Yazılım şirketleri kendi kendini eğitmiş nice insanlarla yürütülüyor, yıllardır programlama yapmak için maaş almış olmalarına rağmen, programlama temellerine dair hiçbir kavrayışa sahip olmamalarına rağmen, ve bir karma tablo nedir hiçbir fikirleri olmamalarına rağmen, çokbiçimliliğin nasıl çalıştığına ve bit düzeyinde işlenen operasyonlar ile nasıl çalışacaklarına dair hiçbir fikirleri olmamalarına rağmen. Onlar gibi olmayın! Önce programlama temellerini öğrenin ve ardından teknolojileri. Aksi takdirde programlama becerileriniz riskte kalacaktır, yaşamınız boyunca değilse bile az yada çok yıllar boyunca. www.nakov.com Page 10 / 151 C# İle Bilgisayar Programlama Temelleri Öncesinden Bilgi Gerekli Değildir! B u kitabı okumaya başlamadan önce okuyuculardan herhangi bir programlama bilgisine sahip olmalarını beklemiyoruz. Kitap içeriğini okuyabilmeniz ve kavrayabilmeniz için bilgi teknolojisi veya bilgisayar bilimi okumanız da gerekli değildir. Kitap sıfırdan başlar ve yavaş yavaş sizde programlama ilgisi uyandırır ve diğer kaynaklardan onları bulup çıkarmanız gerekli değildir. Derleyici, hata ayıklayıcı, entegre geliştirme ortamı, değişken, dizi, döngü, konsol, dize, veri yapısı, algoritma, algoritma karmaşıklığı, sınıf veya nesne hakkında herhangi bir şey bilmiyorsanız, telaşa kapılmayın. Bu kitaptan, tüm bu terimleri öğreneceksiniz ve daha birçoğunu ve yavaş yavaş günlük işlerinizde sürekli onları kullanmaya alışacaksınız. Sadece kitabı sürekli okuyun ve egzersizleri mutlaka yerine getirin. „Biraz dahi olsa, İngilizce öğrenmeden programcı olmayı umuyorsanız yanılıyorsunuz! Bu sadece naif bir beklentidir. Eğer İngilizce bilmiyorsanız, İngilizce öğreten bir ders alınız ve daha sonra teknik literatür okumaya başlayın, bilmediğiniz sözcükleri yazarak öğrenmeye alışınız. Teknik İngilizce’nin kısa sürede öğrenmesi kolay olduğunu anlayacaksınız.” Temel bilgisayar okur yazarlığına sahip olmanız bekleniyor, çünkü dosya, sabit disk ve ağ bağdaştırıcısının ne olduğunu açıklamayacağız, ne de fareyi nasıl taşıyacağınızı veya bir klavyede nasıl yazılacağını. Bir bilgisayar ile nasıl çalışacağınızı ve İnternet’i nasıl kullanacağınızı bilmenizi bekliyoruz. Okuyucuların İngilizce’yi en azından temelde bilmeleri önerilir. Programlama üzerine hazırlanmış web sitelerinde bulunan her gün kullanacağınız ve her zaman okuyabileceğiniz tüm belgeler ve tüm dokümantasyon büyük ihtimalle İngilizce dilinde yazılmış olmalıdır. Bir programcının mesleğinde, İngilizce kesinlikle gereklidir. Ne kadar çabuk öğrenirseniz, o kadar iyidir. www.nakov.com Page 11 / 151 C# İle Bilgisayar Programlama Temelleri Bu Kitabın Kapsamı Nedir? B u kitap programlama temellerini kapsamaktadır. Değişkenleri nasıl tanımlayacağınızı ve kullanacağınızı, basit veri yapıları (sayılar gibi) ile nasıl çalışacağınızı, mantıksal ifadeler, koşullu ifadeler ve döngüleri nasıl düzenleyeceğinizi, konsola nasıl yazdıracağınızı, dizileri nasıl kullanacağınızı, sayı sistemleri ile nasıl çalışacağınızı, yöntemleri nasıl tanımlayacağınızı ve kullanacağınızı ve nesneleri nasıl oluşturacağınızı ve kullanacağınızı öğretecek. Temel programlama bilgisi ile birlikte, bu kitap dize işleme, istisnai durum işleme, karmaşık veri yapılarını (ağaçlar ve karma tabloları gibi) kullanmak, metin dosyaları ile çalışmak, isteğe uyarlı sınıf tanımlamak, ve LINQ sorguları ile çalışmak gibi daha karmaşık kavramları anlamanıza yardımcı olacaktır. Nesne yönelimli programlama kavramları - modern yazılım geliştirme için kurulu bir yaklaşım derinlemesine ele alınacaktır. Son olarak, yüksek kalitede programlar yazma alıştırmaları ve gerçek dünya programlama sorunlarını çözmek ile karşı karşıya olacaksınız. Bu kitap programlama problemlerinin çözümü ile genel olarak algoritmik problemlere yönelik tam bir metodoloji sunar, ve bunun bir kaç örnek konu ve programlama sınavları ile nasıl uygulanacağını gösterir. Programlama üzerine başka bir kitapta aramanıza gerek yoktur! www.nakov.com Page 12 / 151 C# İle Bilgisayar Programlama Temelleri Bu Kitabın Öğretmedikleri Nelerdir? .NET Platformu Yazılım Mühendisliği, Takım Çalışması WEB Teknolojileri, Veritabanları • İlk söz olarak, ancak önemsiz de- • Bu kitaptan, yazılım mühendisli- • Meslektaşlarınızın bazıları doğru- lışmasını ve bir yazılım şirketinin lar ve veritabanları ile programla- ğil, bu kitap “Yazılım Mühendisliği” ünvanı derecesi adına size herhangi bir ödül vermeyecektir! Bu kitap .NET platformunu size anlatmayacaktır, veritabanları ile nasıl çalışmanız gerektiğini, dinamik web sitelerini nasıl oluştura- cağınızı ve mobil uygulamalar geliştirmeyi, window tabanlı grafik kullanıcı arayüzünü (GUI) nasıl oluşturacağınızı ve zengin Inter- net uygulamalarını (RIA) size öğretmeyecektir. Skype, Firefox, MS Word veya Facebook gibi sosyal ağlar ve Amazon.com gibi satış sitelerine ait olan karmaşık yazı- lım uygulamaları ve sistemleri geliştirmeyi öğrenmeyeceksiniz. Ve başka hiçbir kitap tek başına bunu başaracak gibi görünmüyor! Bu tür projelerin yürütülmesi için gerekli olan çalışmaların tümü çok uzun yıllar boyu sürer. Bu kitapta yeralan bilgi ve deneyim gelecekteki müstakbel programcılar için sadece harika bir başlangıçtır. ğini öğrenmeyeceksiniz, takım çagerçek projeler üzerinde çalışmak için sizi hazırlamasını anlamak da pek mümkün değildir. Tüm bunları öğrenmek için birkaç kitap daha ve ekstra dersler gerekir, ancak bu kitapta harcayacağınız zaman için pişman olmanıza gerek yok, çünkü programlama temelleri ile başlayan doğru seçimde zaten bulundunuz. Web geliştirme, mobil uygulamalar ve veri- tabanları ile ilk etapta etkileşmek daha kötü sonuçlara mal olabilir- di. En azından uzman programcı olma şansınız var, bunun için derinlemesine programlama ve teknoloji bilgisine sahip olacaksınız. Programlama temellerini bir kere elde ettikten sonra, veritabanla- rı, ardı sıra web uygulamalarını dan web ya da mobil uygulamamaya başlamışlardır, bir dizi, bir liste veya karma tablo ne olduğunu bilmek onların harcı olmasa da, bunu zor yoldan yapmak için baştan yola çıkarlar. PHP ve My- SQL ile düşük kaliteli web sitele- rini yapmayı öğrendikten profesyonel olmak için de bir çok yol denerler. Web teknolojileri ve veritabanlarını sizin için güzel bir öğrenme alanıdır, ancak önce programlama öğrenilmelidir! Çünkü eğer algoritmik düşünmeye zaman ayırırsanız, programlama sorunlarını çözmeyi bildikten sonra bir teknoloji öğrenmek te- melleri bilirseniz sizin için kolaylaşır. Bu her şeyden daha önemlidir. okumak ve anlamak nispeten size kolay gelecektir. SQL, ASP.NET, AJAX, XAML veya WinRT ile durum böyle değildir. “Web uygulamaları ve/veya veritabanları ile programlamaya başlangıç bir yabancı dili öğrenmek için yeni başlayanların onu dilin kendi alfabesinden veya bir ders kitabından okumaya başlamak yerine bir klasik romandan okumaya başlamaları kadar yanlış bir görüş teşkil etmektedir. Bu imkansız değildir, ancak temel eksikliği varsa, bina inşa etmek güç olur. Yüksekle muhtemel sonuçları hayati temel bilgi eksikliği ve meslektaşları/ yaşıtlarının önlenemez gülüşlerine maruz kalmaktır.” www.nakov.com Page 13 / 151 C# İle Bilgisayar Programlama Temelleri Bilgi Nasıl Sunulmuştur? Ç ok sayıda yazar, yardımcı yazar ve editör olarak kitabın her bölümünü benzer ve anlaşılır tarzda yazmak için elimizden geleni yaptık. İçerik iyi yapılandırılmış bir şekilde sunulmuştur; anlaşılabilir ve metin içinde bilgiyi aramanın oldukça kolay olduğu birçok başlık ve alt başlıklar halinde işlenmiştir. B u kitap programcılar için programcılar tarafından yazılmıştır. Yazarlar, aktif yazılım geliştiricilerdir ve arkadaşları hem yazılım geliştirme hem de gelecekteki programcıları eğitmek konusunda gerçek deneyim sahibidirler. Kendiniz göreceğiniz gibi, bu nedenle, içerik sunum kalitesi, çok iyi düzeydedir. Tüm yazarlar olarak programlama üzerine bir kitapta en önemli şeylerden birinin örnek kaynak kod olduğunun belirgin bilincindeyiz. Bu çok önemli nedenle metne pek çok örnek, çizim, açıklama, resim ve şekiller eşlik ediyor. C# yazılım uygulamalarının geliştirilmesi için modern bir programlama dilidir. C# ve .NET Platformu Bu kitap programlama ile ilgilidir. Programcı olarak düşünmeyi, kod yazmayı, veri yapılarını ve algoritmaları düşünmeyi ve sorun çözmeyi size öğretmek için tasarlanmıştır. C# ve Microsoft .NET platformunu (C# arkasındaki platform) sadece programlama kodunu yazmak için kullanacağız ve dilin özelliklerini incelemeyeceğiz. Bu elinizdeki kitap Java ve C++ gibi diğer diller için de yazılmış olabilir, ancak farkları bariz değil önemsizdir. Bununla birlikte, kısa bir C# (telaffuzu “see sharp”) tanımını verelim. “C#” ve “.NET Platformu” terimleri eğer sizin için bilinmeyense, ayrıntılarını ve bağlantılarını sonraki bölümde öğreneceksiniz. Şimdi kısaca C#, .NET, .NET Platformu, CLR ve C# ile ilgili diğer teknolojileri açıklayalım. www.nakov.com Page 14 / 151 C# İle Bilgisayar Programlama Temelleri C# Programlama Dili C#, .NET platformu ile birlikte Microsoft tarafından oluşturulan ve geliştirilen, modern nesne yönelimli, genel amaçlı bir programlama dilidir. C# ve .NET platformu üzerinde geliştirilen çok çeşitli yazılım vardır: ofis uygulamaları, web uygulamaları, web siteleri, masaüstü uygulamaları, mobil uygulamalar, oyunlar ve diğerleri. C#, Java ve C++ benzeri yüksek seviyeli bir dildir ve bir ölçüde Delphi, VB.NET ve C dillerine benzerdir. Tüm C# programları nesne yönelimlidir. Bunlar yöntemleri tanımlanmış bir küme sınıftan oluşur ve yöntemler program mantığını – bilgisayarın yürüttüğü talimatları içerir. Bir sınıf, yöntem ve C# programları ile ilgili detayları fazlasıyla bir sonraki bölümde bulacaksınız. Günümüzde C# en popüler programlama dillerinden biridir. Dünya çapında milyonlarca geliştirici tarafından kullanılmaktadır. Microsoft’un .NET platformu için uygulama geliştirmek ve yürütmek için geliştirdiği C# dili Microsoft odaklı şirketler arasında yayılmıştır, şirketler ve bireysel geliştiriciler tarafından da yaygın olarak kullanılır. İyi de olsa kötü de olsa, bu kitabın yazıldığı zaman itibariyle, C# dili ve .NET platformu tamamen Microsoft tarafından yönetilmektedir ve sürdürülmektedir ve üçüncü kişilere açık değildir. Bu nedenle, IBM, Oracle ve SAP gibi tüm diğer büyük yazılım şirketleri Java platformunda kendi çözümlerini temellendirmiş ve kendi yazılım ürünlerini geliştirmek için birincil dil olarak Java kullanmışlardır. www.nakov.com C# ve .NET Platformunun aksine, Java dili ve platformu yazılım şirketleri, kuruluşlar ve bireysel geliştiricilerinin bütün bir toplum içinde yer aldıkları açık kaynak projeleridir. Java dünyasındaki standartlar, teknik özellikler ve tüm yeni özellikler, tek bir şirket (C# ve .NET Platformu’nda olduğu gibi) yerine, tüm Java toplulukları üzerinden oluşturulan çalışma grupları tarafından geliştirilmiştir. C# dili üzerinde yürütüldüğü Yürütüm Süresi Ortak Dili (Common Language Runtime: CLR) adında özel bir çevre ile birlikte dağıtılır. .NET Platformu temel işlevsellik sağlayarak, derleyici, hata düzeltici ve diğer geliştirme araçlarından oluşan standart kütüphaneleri içerir. CLR .NET Platformu’nun bir parçasıdır. Neyse ki platform üzerindeki CLR programları taşınabilirdir, ve bir kere yazıldığında işletim sistemleri üzerinde küçük değişikliklerle veya hiçbir değişiklik yapmadan çeşitli donanım platformları üzerinde çalışabilir. C# programları en yaygın olarak MS Windows üzerinde çalışır, ancak .NET Platformu ve CLR aynı zamanda cep telefonlarını ve Windows Mobile, Windows Phone ve Windows 8 tabanlı diğer taşınabilir cihazları da destekler. C# programları hala serbest .NET Platformu uygulaması olan Mono ile Linux, FreeBSD, iOS, Android, MacOS X ve diğer işletim sistemleri üzerinde çalıştırılabilir, ancak, bu resmen Microsoft tarafından desteklenmiyor. Page 15 / 151 C# İle Bilgisayar Programlama Temelleri C# dili bağımsız bir ürün halinde dağıtılmamıştır – Microsoft .NET Platformu’nun (“Microsoft nokta Net Platformu” olarak telaffuz edilir) bir parçasıdır. .NET Platformu genellikle C# ile veya .NET uyumlu bir başka dilde (VB.NET, Yönetilen C++, J# veya F# gibi) yazılmış programların geliştirilmesi ve yürütülmesi için bir ortam oluşturur. Şu bileşenleri vardır: .NET programlama dilleri (C#, VB.NET ve diğerleri); C# programlarını kontrollü bir şekilde çalıştıran kodun (CLR) yürütülmesi için yönetilen bir ortam; C# programlarını CLR’in anlayabileceği bir ara koda (MSIL adında) dönüştüren csc derleyicisi gibi bir dizi geliştirme aracı; • Veritabanlarına erişime izin veren ADO.NET gibi standart bir kitaplık seti (MS SQL Sunucu veya MySQL gibi) ve stan- dart iletişim platformları yoluyla uygulamaları bağlayan WCF ve HTTP, REST, JSON, SOAP ve TCP gibi soketleri içeren protokoller. .NET Platformu her modern Windows dağıtımının bir parçasıdır ve farklı versiyonları mevcuttur. Son sürümü Microsoft’un web sitesinden indirilebilir ve yüklenebilir. Bu kitabın yayın tarihi itibariyle, .NET Platformu’nun son sürümü 4.5’tir. Windows Vista paketi – .NET Platformu 2.0, Windows 7 – .NET 3.5 ve Windows 8 – .NET 4.5 içermektedir. www.nakov.com Page 16 / 151 C# İle Bilgisayar Programlama Temelleri Neden C#? C# veya Java? Neden PHP Değil? Kitabımız için C# seçmemizin birçok nedeni vardır. Bu tüm dünyada milyonlarca programcı tarafından yaygın olarak kullanılan modern bir programlama dilidir. Aynı zamanda, C# (C ve C++ aksine) öğrenmek için çok basit ve kolaydır. Yeni başlayanlar için uygun ve birçok büyük şirket tarafından endüstride hâlâ yaygın olarak kullanılan bir dil ile başlamak doğaldır, bu özelliği onu günümüzde en popüler programlama dillerinden biri haline getirmiştir. Bu yoğun olarak tartışılabilmesine rağmen, Java’nın C# için en ciddi rakip olduğu kabul edilmektedir. Java ile C# arasında bir karşılaştırma yapmayacağız, çünkü C# tartışmasız daha iyidir, daha güçlüdür, zengindir ve mühendisliği daha iyidir. Ancak, bu kitabın amaçları için, biz her modern programlama dilinin programlama ve algoritmaları öğrenmek için yeterli olacağını vurgulamak zorundayız. C# seçtik çünkü öğrenmesi daha kolaydır ve son derece kullanışlı, ücretsiz bir entegre geliştirme ortamı ile dağıtılmıştır (örneğin, Visual C# Ekspres Baskısı). Java tercih edenler için bu kitabın Java sürümü www. introprogramming.info adresinde mevcuttur. Programlama dillerinin popülaritesi ile ilgili olarak, C# ve Java’nın yanı sıra, bir başka yaygın olarak kullanılan dil de PHP’dir. Küçük web siteleri ve web uygulamaları geliştirmek için uygundur, ancak büyük ve karmaşık yazılım sistemlerinin uygulanmasında ciddi zorluklar doğurmaktadır. Yazılım sektöründe PHP küçük projeler için ilk olarak ve en önemli şekilde kullanılır, çünkü geliştiricilerin kötü, düzensiz ve bakımı kolay olmayan kod yazmasına yol açabilir, daha önemli projeler için sakıncalı olabilir. Bu konu da tartışmalıdır, ancak genel olarak kabul edilmektedir ki, inşa edildiği eskimiş kavram ve kökenler nedeniyle ve çeşitli evrimsel nedenlerle, PHP düşük kaliteli programlama eğilimi içinde olan bir dildir, kötü kod yazma ve bakımı kolay olmayan yazılım oluşturmaya neden olabilir. PHP kavramsal olarak yordamsal bir dildir ve modern nesne yönelimli programlama paradigmalarını desteklemesine rağmen PHP programcılarının çoğu yordamsal kod yazar. www.nakov.com Page 17 / 151 C# İle Bilgisayar Programlama Temelleri PHP’nin yazılım mühendisliği mesleğindeki adı “kod maymunu” dili olarak bilinir, çünkü PHP programcıları korkutucu oranda en düşük kaliteli kod yazar. Düşük kaliteli, kötü yapılandırılmış ve kötü organize edilmiş programlama kodu yazmak eğilimi nedeniyle, PHP dili ve platformunun bütün kavramları yanlış kabul edilir ve ciddi şirketler (Microsoft, Google, SAP, Oracle ve onların ortakları gibi) bundan kaçınırlar. Bu sebeple ciddi bir yazılım mühendisi olmak istiyorsanız, C # veya Java ile başlayın ve (mümkün olduğunca) PHP’den kaçının. Elbette, PHP’nin programlama dünyasında kullanımları vardır, (örneğin, WordPress ile blog oluşturma, Joomla veya Drupal ile küçük bir web sitesi, veya PhpBB ile bir tartışma panosu) ancak tüm PHP platformu, .NET ve Java gibi büyük sistemler için iyi organize edilmemiş ve tasarlanmamıştır. Web tabanlı olmayan uygulamalar ve büyük endüstriyel projelere gelince, PHP mevcut seçenekler arasında uzun bir atış değildir. PHP’yi doğru kullanmak ve onunla yüksek kaliteli profesyonel projeler geliştirmek için çok tecrübe gereklidir. PHP geliştiricileri genellikle öğreticiler, makale ve düşük kaliteli kitaplardan öğreniyor ve kötü uygulama ve alışkanlıkları seçip bulurken onları daha sonra ortadan kaldırmak kolay olmaz. Bu nedenle, ilk geliştirme dili olarak PHP öğrenmeyin. C# veya Java ile başlayın. Yazarların kolektif büyük deneyimlerine dayanarak C# ile programlamaya başlamanızı ve C, C++ ve PHP gibi dilleri bunları kullanmaya başlamak zorunda kalacağınız ana kadar görmezden gelmenizi tavsiye ediyoruz. Neden C veya C++ Değil? Tartışma götürse de, C ve C++ dilleri oldukça ilkel, eski ve çürüyen olarak kabul edilir. Onların hâlâ kendi kullanımları vardır ve düşük seviyeli programlama için uygundur (örneğin özel donanım aygıtları için programlama) ama onları izlemenizi tavsiye etmiyoruz. Eğer bir işletim sistemi yazmak istiyorsanız, veya bir gömülü cihazı programlamak istiyorsanız, alternatiflerin eksikliği nedeniyle ve donanımı çok dikkatli kontrol etmek gerektiği için saf C programlayabilirsiniz. C dili manevi olarak eskidir ve hiçbir şekilde onunla programlamaya başlamak için bir tavsiyeye rastlamazsınız. Saf C kodlayan programcının verimliliği C# ve Java gibi modern genel amaçlı programlama dilleri altındaki verimlilik ile karşılaştırıldığında birçok kez çok daha düşüktür. C’nin bir değişiği Apple/iPhone geliştiricileri arasında kullanılır, ama iyi bir dil değil olduğundan değil, hiçbir iyi alternatif olmadığı içindir. Çoğu Apple odaklı programcı Objective-C sevmiyor ama bir başka şey yazmak konusunda başka hiçbir seçimleri olmadığı için bu işi gerçekleştiriyorlar. Donanım ile çok yakın çalışmayı gerektiren uygulamalar ile programlamak zorunda kalındığında veya (3D oyunlar gibi) özel performans gereksinimleri olduğunda C++ kabul edilebilir. Her bağlamda (Web uygulamaları geliştirme veya iş yazılımları gibi) C++ olağanüstü yetersizdir. www.nakov.com Page 18 / 151 C# İle Bilgisayar Programlama Temelleri Eğer şimdi programlamaya başlıyorsanız bunu sürdürmenizi tavsiye etmiyoruz. Hala bazı okullarda ve üniversitelerde çalışmalar yapılmasının nedeni kalıtsaldır, çünkü bu kurumlar çok muhafazakardır. Örneğin, Uluslararası Bilişim Olimpiyatı (IOI) programlama yarışmalarında izinli kullanımlı tek dilin C++ olmasını teşvik etmeye devam ediyor, C++ nadiren endüstride kullanılır olmasına rağmen. İnanmıyorsanız, bazı iş arama siteleri aracılığıyla bakabilirsiniz ve C++ ile verilen iş ilanları yüzdesini sayın. C++ dilinin popülerliğini kaybetti çünkü başlıca nedeni hızla geliştirilen kaliteli yazılımın uygulanabilirliğinin yetersiz kalmasıdır. C++ dilinde yüksek kaliteli yazılım yazmak için, inanılmaz akıllı ve deneyimli programcı olmak zorunda kalırsınız, aynı tez C# ve Java için kesinlikle gerekli değildir. C++ öğrenme daha fazla zaman alır ve çok az programcı gerçekten iyi biliyor. C++ programcısının verimliliği C# programcısına kıyasla birçok kere daha düşüktür ve bu yüzdendir ki C++ zemin kaybediyor. Bu nedenlerden dolayı, C++ dili yavaş yavaş kayboluyor ve bu nedenle bunu öğrenmek için tavsiyede bulunmuyoruz. C# Avantajları C# nesne yönelimli bir programlama dilidir. Ciddi yazılım sistemleri için kullanılan modern programlama dillerinin hepsi (Java ve C++ gibi) nesne yönelimlidir. Nesne yönelimli programlamanın avantajları kitap boyunca birçok alıntılar halinde dile getirilmiştir, buna rağmen şu an için, size gerçek dünyadan nesneleri ile çalışma izni veren dil olarak nesne yönelimli dilleri düşünebilirsiniz (örneğin öğrenci, okul, ders kitabı, kitap ve diğerleri için). Nesneler (örneğin isim, renk, vb) özelliklere sahiptir ve (örneğin, hareket, konuşma, vb) eylemleri gerçekleştirebilir. C# ve .NET Platformu ile programlamaya başlayarak, perspektifi çok yüksek bir yola sapmış oluruz. Programcılar için iş teklif eden bir web sitesi açarsanız, C# ve .NET uzmanları için çok büyük ve Java programcıları için yakın bir talep olduğunu kendiniz göreceksiniz. Aynı zamanda, PHP, C++ ve diğer teknoloji talebini C# ve Java mühendisleri talebi ile kıyasladığımızda daha düşük bir rakam ortaya çıkmaktadır. İyi programcı için, kullandıkları dilin önemi bir anlam taşımamaktadır, çünkü programlamayı bilirler. İhtiyaç duydukları dil ve teknoloji ne olursa olsun onlar hızlı uzmanlaşacaklardır. Amacımız C# öğretmek değil, programlama öğretmektir! Programlama temellerinde uzmanlaştıktan, algoritmik düşünmeyi öğrendikten, diğer programlama dilleri ile tanıştıktan sonra, onların C# ile ne kadar ortak noktaları olduğunu göreceksiniz ve öğrenme modeliniz kolaylaşacak. Bu kitap programlamanın değişmeyen temellerini öğretiyor. www.nakov.com Page 19 / 151 C# İle Bilgisayar Programlama Temelleri Programlamayı öğrenirken hangi C# ve Visual Studio sürümünü kullanacağınız hiçbir büyük önem taşımamaktadır. Önemli olan programlama ve algoritmik düşünme ilkelerini öğrenmektir! Örnekler Visual Studio 2012 İçin C# 5 Dilinde Verilmiştir Bu kitapta verilen örneklerin hepsi bu kitabın yayınlanması itibariyle C# dili ve .NET Platformu 4.5 sürümü ile ilgilidir. Visual Studio tümleşik geliştirme ortamını kullanmaya dair tüm örnekler ürünün 2012 sürümü ile ilgilidir. Bu kitabın yazılması sırasında en son bu sürümler vardı. Microsoft Visual Studio 2012 tümleşik geliştirme ortamının (IDE) başlangıç düzeyindeki C# programcıları için uygun olarak düşünülmüş Windows Masaüstü için Microsoft Visual Studio Express 2012 adı verilen bir de ücretsiz sürümü vardır. Ücretsiz ve ücretli (ticari bir yazılım ürünü olan) Visual Studio sürümleri arasındaki fark bu kitapta kullanmamızı gerektirmeyen bazı işlevlerin kullanılabilirliğinde yatmaktadır. C# 5 ve Visual Studio 2012 kullanmalarına rağmen bu kitaptaki örneklerin çoğu .NET Platformu 2.0 / 3.5 / 4.0 ve C # 2.0 / 3.5 / 4.0 altında sorunsuz çalışacaktır ve Visual Studio 2005/2008/2010 altında derlenebilir. Programlamayı öğrenirken hangi C# ve Visual Studio sürümünü kullanacağınız hiçbir büyük önem taşımamaktadır. Önemli olan programlama ve algoritmik düşünme ilkelerini öğrenmektir! C# dili, .NET Platformu ve Visual Studio tümleşik geliştirme ortamı sadece araçlardır ve herhangi bir zamanda bunlarla başkalarını takas edebilirsiniz. Bu kitabı okursanız ve VS2012 şu anda en son sürüm değilse emin olun ki neredeyse bu kitabın tüm içeriği geriye dönük uyumluluk nedeniyle yine aynı olacaktır. www.nakov.com Page 20 / 151 C# İle Bilgisayar Programlama Temelleri Bu Kitabı Nasıl Okumalısınız? Bu kitabı okuma sırasında birçok uygulama beraberinde geliyor. Programlamayı öğrenmek kolay değildir! Yüzmeyi bir kitaptan nasıl okuyarak öğrenmek mümkün değilse gerçekleştirim olmadan çalışıyor olmak da mümkün değildir. Bocalarsanız ama başka çaresi olmaz! Her bölümden sonra sorunlar üzerinde çalışarak bu kitaptan daha fazla şey öğreneceksiniz. Burada okuduğunuz her şeyi bir bilgisayarda kendiniz için denemelisiniz. Aksi takdirde öğrenemezsiniz. Örneğin, basit bir program yazmak için Visual Studio ile ilgili ilk okuduğunuzda, Microsoft Visual Studio (veya Visual C# Ekspres) yükleyin ve programınızı yazmak için deneyin, bunu yapmanız gerekiyor. Aksi takdirde öğrenmeniz sorunlu olabilir! Teoride, her şey kolay gibi görünüyor, ancak programlama uygulama anlamına gelir. Bunu hatırlayın çünkü bu kitapta o „Alıştırma yapmadan bu kitabı sorunları çözmek için çalışacağız. Bu sorunlar özenle okursanız bir anda anlam taşımaz! seçilmiştir – ne sizi vazgeçirecek kadar çok zor, ne Program yazma hakkında metde çok kolaydır, böylece bir meydan okuma olarak onları çözmeyi algılamaya motive olacaksınız. Eğer ni okuduğunuzdan çok daha fazla zorluklarla karşılaşırsanız, Telerik Yazılım Akademisi zaman harcamak gerekir. Bir taşıt “C # Programlama Temelleri” eğitim kursunun aracını sürmeyi öğrenmek gibitartışma grubu yardımına bakın: http://forums. dir: hiç kimse kitap okuyarak sürüş academy.telerik.com (Forum Bulgar geliştiriciler için tasarlandı, ancak o insanlar “yaşam”larında İngilizce öğrenemez. Sürüş öğrenmek için konuşuyorlar ve endişelenmeyin, bu kitapla ilgili farklı durumlar, yollar, arabalar, vb. sorularınıza cevap vereceklerdir. Binlerce öğrenci her için birçok kez sürücülüğü denemeyıl bu kitaptan egzersizleri çözmek istiyorlar böylece niz gerekir. Programlama öğrenmek her problem için kitaptan birçok çözüm bulabilirsiniz. Bu web sitesinde kitaptaki her alıştırma için resmi için, programlamak gerekiyor!” çözümler + testler de yayınlayacak. Herkes okulda matematik okudu ve matematik problemlerini çözmeyi öğrenmek için nasıl bir pratik gerektiğini herkes bilir. Ne kadar olursa olsun öğretmenlerinizi izler ve dinleseniz de, oturup sorunları çözmeden onları öğrenemezsiniz. Aynısı programlama için geçerlidir. Çok alıştırmaya ihtiyacımız var. Sorunları çözmeniz, deney yapmak için, çaba göstermek için ve sorunlarla mücadele etmek için, hata yapmak ve onları düzeltmek için, denemek ve başarısız olmak için, yeniden denemek ve nihayet işlerin yolunda gittiği zaman o anları deneyimlemek için çok yazmanız gerekiyor. Çok alıştırmaya ihtiyacımız var. İlerleme kaydetmenin tek yolu budur! Bir geliştirici olmak için insanlar der ki en az 50.000 – 100.000 satır kod yazmaları gerekir. Doğru sayı değişebilir. Bazı insanlar hızlı öğrenir yada sadece problem çözme deneyimleri vardır. Diğerleri için daha fazla pratik gerekebilir, ancak her durumda programlamayı uygulamak çok önemlidir! Sorunları çözmek için ve bir geliştirici olmak için kod yazmak gerekir. Başka yolu yoktur! www.nakov.com Page 21 / 151 C# İle Bilgisayar Programlama Temelleri Alıştırmaları Asla İhmal Etmeyin! Her bölümün sonunda hatırı sayılır derecede çok alıştırma bulunmaktadır. Onları ihmal etmeyin! Alıştırmalar olmadan, bir şey öğrenemezsiniz. Bir bölümü okuduktan sonra bilgisayar önünde oturmanız ve kitapta gördüğünüz örneklerle oynamanız gerekir. Sonra belirlediğiniz sorunları çözme konusunda kendinizi ayarlamalısınız. Hepsini çözemezseniz en azından denemelisiniz. Eğer gerekli zamanınız yoksa, en azından her bölüm için ilk birkaç sorunun çözümüne çalışmanız gerekir. Her bölümden sonra sorunların çözümü olmadan devam etmeyin, bu sadece anlamsız olur! Sorunlar okuduğunuzu şeyleri uygulayacağınız mümkün olan en küçük geçerli durumdır. Uygulamada programcı olduğunuzda, daha büyük ve daha karmaşık ölçekte her gün benzer sorunları çözeceksiniz. „Maliyeti ne olursa olsun kitabın her bölümünden sonra gelen alıştırma problemlerini çözmeniz için çaba sarf etmeniz gerekir! Aksi takdirde hiçbir şey öğrenememe ve sadece zaman harcama riski ile karşı karşıya kalırsınız.” Herhangi bir insani beceriyi öğrenmek için, okumak, görmek yada nasıl yapılacağının gösterilmesi gerekir ve sonra bunu kendiniz yapıp deneyerek birçok pratik geliştirebilirsiniz. Aynı olgu programlama için de geçerlidir – ya okumanız, ya görmeniz yada nasıl yapılacağını dinlemeniz gerekir, taa ki yapana kadar. Bu Kitaptan Öğrenmek İçin Ne Kadar Zamana İhtiyacınız Var? Programlama temellerinde uzmanlaşmak çok önemli bir görevdir ve çok zaman alır. Bu konuda inanılmaz derecede iyi olsanız bile, bir veya iki hafta içinde iyi seviyede programlama öğrenmenin kalıcı olacağını düşünmek yanlış olur. Herhangi bir insani beceriyi öğrenmek için, okumak, görmek yada nasıl yapılacağının gösterilmesi gerekir ve sonra bunu kendiniz yapıp deneyerek birçok pratik geliştirebilirsiniz. Aynı olgu programlama için de geçerlidir – ya okumanız, ya görmeniz yada nasıl yapılacağını dinlemeniz gerekir, taa ki yapana kadar. Sonra başarılı olur veya olmazsınız, nihayet öğrendiğinizin farkına varana kadar tekrar denersiniz. Öğrenme adım adım yapılır, rasgele değil belirli bir ardışıklık temeline dayanır, çaba ve tutarlılık isteyen bir seridir, bu nedenle paylaşılabilir. Eğer bu kitaptaki konu içeriğini okumak, anlamak, öğrenmek ve iyice ve derinlemesine kazanmak istiyorsanız, gün boyu süren bir etkinlik için en az 2 ay yatırım gerekiyor, yada her gün biraz alıştırma yaparsanız en azından 4-5 ay yatırım gerekiyor. Derinlemesine programlama temellerini kavramanın mümkün olacağı minimum zaman miktarı bu kadardır. www.nakov.com Page 22 / 151 C# İle Bilgisayar Programlama Temelleri Bu miktardaki derslerin gerekliliği Telerik Yazılım Akademisi tarafından verilen serbest eğitim ile gerçekte doğrulanmıştır (http://academy.telerik.com). Bu kitaptaki derslere dayalı eğitimlere katılan öğrencilerin yüzlercesi genellikle tam zamanlı çalışma ile 3-4 ay içinde bu kitabın konularının hepsini öğrenir. Her yıl binlerce öğrenci bu kitabın alıştırma problemlerini çözüyor ve kitabın içeriğini kapsayan programlama sınavlarını başarıyla geçiyor. İstatistikler gösteriyor ki, öncesinde programlamaya maruz kalmayan herhangi bir kimse Telerik Akademisi’nde verilen derslere karşılık gelen ve bu kitap ellerindeyken 3-4 ay eşdeğerinde bir aktiviteyi kapsayan tam gün süre ile zaman geçirmiyorsa, bahsi geçen sınav veya sınavlarda başarısız karne alıyor. Kitaptaki ana konu 1100 sayfada sunulmuştur, günlük bir sayfa olmak üzere okursanız sadece dikkatle okumanız ve örnek programları test etmeniz bir ay alacaktır. Elbette, alıştırmalar için yeterli zaman (birkaç ay daha fazla) harcamak zorundasınız; onlar olmadan programlamayı öğrenmenizin işlerlik kazanması zorlaşır ve değeri azalır. Karmaşık veya Kolay? Kitaptaki alıştırmalar zorluk dereceleri değişen yaklaşık 350 problemden oluşur. Bunlardan bazılarının çözümü için birkaç dakika, diğerleri için birkaç saat (yardım olmadan tüm bunları çözebilirseniz) gerekebilir. İhtiyacınız olan zaman tam günlü bir veya iki aylık bir çalışma veya günde daha az çalışıyorsanız birkaç ay daha ek çalışma olarak özetlenebilir. Her bölümün alıştırmaları zorluk düzeyi artarak sıralanmıştır. İlk birkaç alıştırma bölümdeki örneklere benzer şekilde nispeten kolaydır. Son birkaç alıştırma genellikle karmaşıktır. Bunları çözmek için dış kaynakları (Wikipedia bilgileri gibi) kullanmanız gerekebilir. Bilinçli olarak, her bölümdeki son birkaç alıştırma bölümde verilen bilgileri aşar ve çözümü bunun dışında sizin becerinize dayanır. Favori arama motorunda arama gerçekleştirmek için sizi motive etmek istiyoruz. İnternette aramayı öğrenmeniz gerekir! Bu herhangi bir programcı için temel bir beceridir. Öğrenmeyi öğrenmeniz gerekir. Programlama her gün öğrenmek ile ilgilidir. Teknoloji sürekli değiştiği için her şeyi bilemezsiniz. Bir programcı olmak her gün yeni API’ler, platformlar, teknolojiler ve araçlar öğrenmekle eşdeğerdir. Sadece kendinizi hazırlayın, kaçınılması mümkün değildir. Alıştırmaları çözerken sizi İnternet’te aramaya yöneltecek pek çok problem bulabilirsiniz. Kimi alıştırmalarda bir sonraki bölümde işlenen konuları okumanız gerekebilir, bu nedenle kişisel yetenek gerekiyor. Tanınmış algoritmalar, veya başka bir şey sizin çözüm bulmanıza yarayabilir, ancak İnternet’te arama gerçekleştirmek her durumda vazgeçilmez temel bir beceridir. Kitapta kapsanan alıştırmaları çözmeniz gerçekten birkaç aydan az almaz. Eğer kendinize ayıracağınız bu kadar zamana sahip değilseniz, üzülmeyin gerçekten programlamayı sürdürmek istediğiniz önemlidir. Bu büyük çabaları içeren gerçekten çok ciddi bir girişimdir. Eğer sürekli ve programlamayı iyi bir seviyede öğrenmek istiyorsanız, zaman çizelgesi hazırlayın ve kitap yada buna dayalı video derslerini izleyin. www.nakov.com Page 23 / 151 C# İle Bilgisayar Programlama Temelleri Neden Veri Yapıları ve Algoritmaların Önemi Belirtilmiştir? B u kitap, programlama temel bilgilerine ek olarak, uygun algoritmik düşünme ve programlamanın temel veri yapılarını kullanmayı size öğretir. Veri yapıları ve algoritmalar, bir programcının en önemli temel becerileridir! Onları iyi kavrarsanız, yazılım teknolojisinde, geliştirme aracı, platform veya API konularında yeterli olmak yolunda bir probleminiz olmaz. En ciddi yazılım şirketlerinin çalışanlarını işe alırken dikkat ettikleri en önemli kriter budur. Bunun kanıtı, Google ve Microsoft gibi büyük şirketlerde yapılan ve sadece temel veri yapıları ve algoritmalar ile algoritmik düşünmeye dayanan iş görüşmeleridir. A şağıdaki bilgiler 2007-2008 Microsoft ve Google’da yazılım mühendisliği iş görüşmelerinden başarıyla geçmiş bulunan ve bu kitabın önde gelen yazarı Svetlin Nakov’dan geliyor. Nakov kendi deneyimlerini paylaşıyor. Google’da İş Görüşmeleri Zürih Google’da yazılım mühendisliği iş görüşmelerine ait soruların %100 ‘ü veri yapıları, algoritmalar ve algoritmik düşünmeye dayalı konuları içerir. Böyle bir görüşmeye girdiğinizde, beyaz bir tahta üzerinde bağlantılı liste uygulaması yapmanız istenebilir. (bkz. “Doğrusal Veri Yapıları”) veya çeşitli renklerle dolu olan GIF görüntüsü bir taramalı çokgeni doldurmak için bir algoritma yazmanız da beklenebilir. (bkz.”Ağaçlar ve Grafikler” in enine-arama bölümü) Google algoritmik düşünebilen ve temel veri yapıları ve bilgisayar algoritmaları kavrayışına sahip insanlarla ilgileniyor gibi görünür. Adaylar daha sonra kendi çalışmaları doğrultusunda kullanmak istedikleri herhangi bir teknolojiyi hızla öğrenebilir. Söylemeye gerek duymalıyız ki, bu kitap Google’da bir iş görüşmesinden geçmek için size gerekli bilgi ve becerilerin hepsini verecek kadar çok beceri vaat etmiyor. Kitaptaki bilgiler kesinlikle gerekli bir minimumdur, ancak tamamen yeterli değildir. Bu sadece ilk adımları teşkil eder. www.nakov.com Microsoft’ta İş Röportajları Dublin Microsoft’da yazılım mühendisliği iş görüşmelerinde bir çok soru, veri yapıları, algoritmalar ve algoritmik düşünmeye odaklanmıştır. Örneğin, bir dize sözcüğü tersten yazmanız (bkz. “Dizeler ve Metin İşleme” Bölümü) yada yönsüz grafikte topolojik arama gerçekleştirmeniz (bkz. “Ağaçlar ve Grafikler” Bölümü) istenebilir. Google’ın aksine, Microsoft yazılım mimarileri, çoklu, güvenli kod yazma, büyük miktarda veri ile çalışma ve yazılım testi ile ilgili bir çok mühendislik sorusu sorar. Bu kitap Microsoft’a başvurmak için gerekli yeterlilikten uzaktır, ancak içerdiği bilgiler kesinlikle soruların çoğunluğu için size faydalı olacaktır. Page 24 / 151 C# İle Bilgisayar Programlama Temelleri Gerçekten Bir Programcı Olmak İster Misiniz? B ir programcı olmak istiyorsanız, gerçek programcıların ciddi, ağırbaşlı, düşünme ve sorgulama yetenekleri olduğunu kavramalısınız. Onlar için hızlı bir şekilde tüm modern veya eski platformlar, teknolojiler, kütüphaneler, programlama araçları, programlama dilleri ve geliştirme araçları önemlidir, ve hayatlarının bir parçası olarak programlamayı hissederler. İyi programcılar kendi mühendislik becerilerini ilerleyen zaman bağlamında ortaya koyar, yeni teknolojiler, yeni programlama dilleri ve paradigmaları öğrenmeye çalışır, işte yeni yollar takip eder, her gün yeni platformlar ve yeni geliştirme araçları hayal eder. Mantıksal düşünme yeteneğine sahip olup; sorunlar üzerinde akıl yürütüp bunları çözmek için algoritmalar dile getirmekle kalmayıp; çözüm olarak ardı sıra gelen bir aşama dizisi belirtirler; teknolojik araçlar kullanarak çevre dünya modellenir; kendi fikirlerini ifade etmek için kod yazmak yada program bileşenleriyle oynamak yerinde bir davranıştır; kendi algoritmalarını ve programlarını sorunları görmek için haklarında gelebilecek istisnai durumları öngörerek test ederler; ve bunları hallederler, daha deneyimli insanların tavsiyesini dinler; ve kullanıcı ihtiyaçlarına uygun olarak onların uygulamaları için kullanıcı arayüzünü uyarlayabilirler, kendi algoritmalarını robot endüstrisinde kullanabilirler, ve tıp alemi gibi diğer alanlarda çalıştırabilir ve etkileşim haline geçebilirler. İyi programcılar sürekli kitap okur, programlama üzerine makaleler veya bloglar okur ve yeni teknolojilerle ilgilenir; sürekli bilgi ve görgü kazanırlar, ve sürekli çalışma biçimlerini yenileştirirler, buna yazılım kalitesi diyorlar. Bazıları ciddi bir sorun ile yüzleştiklerinde yemek yada uyumak ihtiyaçları bile baskılanıyor, saplantı hissedebiliyorlar, yada sadece bazı ilginç ders veya sunumdan ilham alarak vakit geçirebiliyorlar, bu da depresif risk taşıyor. O zaman programlamak sizin için video oyunlarına takılmak olabilir, daha bilinçli öğrenilmesi ve sınırların daraltılması bir çözüm olarak görünse de geçici heveslere kapılmak çok kolaydır. Kendinizi programlamaya çok eğilimli görebilirsiniz, ancak bulunduğunuz ortam sizin bu gelişiminizi kösteklemiş olabilir. www.nakov.com Page 25 / 151 C# İle Bilgisayar Programlama Temelleri İyi programcıların bir veya daha fazla bilgisayarı vardır, Internet bağlantısı ve teknolojilere sürekli ulaşılabilecek mekanlarda vakit geçirirler. Düzenli olarak web sitelerini ve yeni teknolojiler ile ilgili blogları ziyaret ederler, kendi meslektaşları ile günlük iletişim kurarlar, şu anda gerekli olmayan teknoloji derslerini, seminer ve diğer etkinlikleri ziyaret ederler. Deneme yada yazılımın bir parçasını yapmak için yeni araçlar ve yeni yollar araştırırlar yada işin bir parçası olarak. Yeni kütüphaneleri incelerler, yeni diller öğrenirler, yeni platformlar denerler ve yeni geliştirme araçlarını bilgilerini pekiştirmek için kullanırlar. Bu yardımlaşma ile beceriler unutulmaz ve sunum için gerekli olan farkındalık, yetkinlik ve profesyonellik Gerçek programcılar kendi mesleklerini asla tam aklımla biliyorum demez. Onların öğrenmek zorunda oldukları inancı vardır. Programcılıkta merak daha etkindir, analog saatin GPS sistemi ile nasıl aynı fonksiyonu hatta daha fazlasıyla entegre olduğunu hepimiz biliriz. Okuyucunun bilgisayar bilimlerini idrak etmesi için örnekler çoğaltılabilir : İnternet teknolojisi, programlama dilleri, işletim sistemleri, derleyiciler, bilgisayar grafikleri, oyun, donanım, yapay zeka ve her şey aynı programcılığın ürünüdür. Var olmaları için teknoloji gerekir; böylece endüstri doğar. Programcı tam özveri gerektiren bir meslektir. www.nakov.com Programcı demek yetenekli ve standart dışı durumlarla başa çıkmak mümkün, yetkili, bilgili, düşünme, bilerek akıl yürütme demektir. Meslek halini alması yıllar alabilir. Eğer hala her gün yeni bir şeyler öğrenmek ve teknolojiler ile rekabet etmek istiyorsanız, programcılığa başlamanız uygundur. Ancak emekli olmayı beklemeyin, zira rekabet o kadar çetindir ki sizi ezip geçebilir, başka bir mesleği öğrenmek isteyebilirsiniz. Azim ve sebatınız iş yapma gücünüzle doğru orantılı olmalıdır. Parasal kaygılarla işe başlamak pek çok başarılı genç adayın kafasındaki ana fikirdir. Ancak bu gerçekleştiğinde teknoloji ilerleyeceği için siz geri kalırsınız. Bu da meslek etiketleri yerine yıllar boyu gerçekliği kanıtlanmış doğrularla yola çıkmayı ve sonuçlarından yararlanmayı beraberinde getirir. Hiç şüpheniz olmasın, bu zevk sizi yeterince tatmin edecektir. Page 26 / 151 C# İle Bilgisayar Programlama Temelleri Sürekli ve durmadan amacınızı düşünüyorsunuz. Hatta bazen yüksek sesle, kendinize sesleniyorsunuz: “Ben iyi bir programcı olmak istiyorum ve bunun için çok çalışmak zorundayım, çok okumak ve çok şey öğrenmek zorundayım, her gün, sürekli ve özenle bir çok problem çözmek zorundayım.” Bir Programcı Olmak İçin Motive Olun yada Bir Başka İş Bulun! İyi programcı olmak veya programlamanın sırlarını bilmekten vazgeçmemişseniz, ve yazılım geliştirme, bilgisayar bilimi ve yazılım teknolojileri uzmanı olarak önümüzdeki aylar ve yıllar boyunca sabit gayretli olarak bağlılıkla çalışmaya söz verdiyseniz, bu konuda derin bir anlayış geliştirdiyseniz, birçok kitap veya başka öğretiler size öz motivasyon ve belirgin hedefler verecektir. Programcı olduğunuzu veya olmayı başardığınızı düşünün, varsayın ki programlamayla her gün meşgul oluyorsunuz, programcılık sizin mesleğinizdir. Dünyadaki tüm yazılımları yazabiliyorsunuz programlama öğrenmek için iyi bir (eğer yeterli zamanınız varsa); „Gerçekten başlangıç bir yıl boyunca her gün programlamaktır. deneyimli programcıların çözebildiği Eğer (istisnasız) her gün programlarsanız ve uzun her türlü sorunu çözebiliyorsunuz. Sürekli ve durmadan amacınızı bir süre için bunu yaparsanız (örneğin bir yada iki düşünüyorsunuz. Hatta bazen yüksek yıl) bir programcı olmamak için hiçbir yol yoktur. sesle, kendinize sesleniyorsunuz: Yıllardır programlamayı uygulayan herkes bir gün “Ben iyi bir programcı olmak çok iyi olacaktır. Diğer yeteneklerin geliştirilmesi de istiyorum ve bunun için çok çalışmak bu yolu takip eder. Öğrenmek istiyorsanız, sadece zorundayım, çok okumak ve çok şey uzun bir süre boyunca her gün alıştırma yapmalısınız.” öğrenmek zorundayım, her gün, sürekli ve özenle bir çok problem çözmek zorundayım.” Çevrenizdeki her yere programlama kitapları koyuyorsunuz. “Ben iyi bir programcı olacağım” diye asılı bir mottoyu her akşam uyumadan önce ve her sabah uyandığınızda görebileceğiniz şekilde yatağınıza iliştiriyorsunuz. Her gün (istisnasız!) programlıyorsunuz, yeni teknolojileri öğreniyorsunuz, eğleniyorsunuz, sorunları çözüyorsunuz, oyun yazıyorsunuz, bir web sitesi hazırlıyorsunuz, derleyici, veritabanı ve diğer yüzlerce program yapmak için orijinal fikirler geliştiriyorsunuz. İyi programcı olmak için her gün programlıyorsunuz ve her gün programlamayı ve mükemmel bir programcı olacağınız gelecek zamanı düşünüyorsunuz. Bunu derinden inandığınız için yapabildiniz! Herkes inandığı ve vazgeçmediği ölçüde bunu gerçekleştirebilir. Bu kitabın ilk adım olduğunu ve her şeyin size bağlı olduğunu unutmayarak motivasyonunuzu artırın. www.nakov.com Page 27 / 151 C# İle Bilgisayar Programlama Temelleri Kitabın İçindekilerine Bir Bakış Bölüm 0: Önsöz Ö nsöz (güncel bölüm) kitabın içeriğini, okuyucunun öğreneceklerini, beklentilerinin neler olması gerektiğini, kitabı nasıl okuması gerektiği, neden C# dilini kullandığımızı, neden veri yapıları ve algoritmalara, vb. odaklandığımızı okuyuculara tanıtır. Önsöz aynı zamanda kitabın tarihini de anlatır, bölümlerin içeriğini, Bulgarca’dan İngilizce’ye yazarlar, editörler ve çevirmenleri takım olarak tanıtır. Tüm dünyada Microsoft, Google, SAP, VMware, Telerik ve diğer önde gelen yazılım şirketlerinden ünlü yazılım mühendisleri tarafından yazılmış tam gözden geçirmeleri içeriyor. Ö nsöz yazarı Svetlin Nakov’dur (Veselin Kolev ve Mihail Stoynov’un çok az katkısı ile) İngilizce’ye Ivan Nenchovski tarafından çevrilmiş ve Mihail Stoynov, Veselina Raykova, Yoan Krumov ve Hristo Radkov tarafından düzenlenmiştir. Kitabın sonraki bölümlerinde karşımıza çıkacak içeriğin bölüm özetini veren öğrenilecekler birkaç cümle ile bundan sonraki bölümlerde anlatılacak. Bölüm 1: Programlamaya Giriş “Programlamaya Giriş” Bölümü’nde, programlamanın temel terminolojisine göz atacağız ve ilk programımızı yazacağız. Programlama nedir sorusuna kendimizi alıştıracağız ve bilgisayarlar ve programlama dilleri ile bağlantı kuracağız. Kısaca yazılım geliştirmenin ana aşamalarını gözden geçireceğiz, C# dilini, .NET platformu ve yazılım geliştirmede kullanılan farklı Microsoft teknolojilerini tanıtacağız. C# programlama için gereken yardımcı araçları inceleyeceğiz ve ilk bilgisayar programımızı yazmak için C# dilini kullanarak derleyeceğiz ve komut satırını ve bunun yanı sıra Microsoft Visual Studio tümleşik geliştirme ortamını kullanarak çalıştıracağız. .NET Platformu için dokümantasyon olarak düşünülmüş MSDN Kitaplığı’na kendimizi alıştıracağız, bu dilin yetenekleri ile ilgili çalışmamızda bize yardımcı olacaktır. Teodor Bozhikov ve Svetlin Nakov tarafından düzenlenen bölüm Pavel Donchev tarafından yazılmıştır. Bölümün içeriği “Java ile Programlamaya Giriş” kitabının Luchesar Cekov tarafından yazılmış çalışmalarına biraz dayanmaktadır. Atanas Valchev tarafından İngilizce’ye www.nakov.com Page 28 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 2: Temel Türler ve Değişkenler “Temel Türler ve Değişkenler” Bölümü’nde, C# temel türleri ve değişkenlerinin ne oldukları ve onlarla nasıl çalışılacağını inceleyeceğiz. Öncelikle, veri türleri üzerinde duracağız – tamsayı türleri, gerçek kayan nokta türleri, Boole, karakter türleri, dizeler ve nesne türleri. Değişkenlerin ne oldukları ve özellikleri hakkında devam edeceğiz, değişkenlerin bildirimi, onlara değer ve ilk değer atanması. C# veri türlerinin ana kategorilerini tanıtacağız – değer ve referans türleri. Son olarak, kalıp deyimler üzerinde duracağız – kalıp deyimlerin ne oldukları ve çeşitleri hakkında. Nikolay Vasilev tarafından düzenlenen bölüm Veselin Georgiev ve Svetlin Nakov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Hristo Todorov ve Svetlin Nakov tarafından yazılmış çalışmalarına dayanmaktadır. Lora Borisova tarafından İngilizce’ye çevrilmiştir (Angel Angelov ve Hristo Radkov tarafından düzenlenmiştir). Bölüm 3: İşleçler ve İfadeler “İşleçler ve İfadeler” Bölümü’nde, C# işleçlerini ve çeşitli veri türleri üzerinde gerçekleştiren işlemleri tanıtacağız. İşleçler arası öncelikleri açıklığa kavuşturacağız ve işleçlerin türlerini aldıkları argüman sayısı ve yaptıkları işlem sayımına göre tanıyacağız. Tür zorlamalarının neden gerekli olduğunu ve nasıl çalışmak gerektiğini inceleyeceğiz. Son olarak, ifadeleri açıklayacağız ve nasıl kullanılacağını anlatacağız. Marin Georgiev tarafından düzenlenen bölüm Dilyan Dimitrov ve Svetlin Nakov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Lachezar Bozhkov tarafından yazılmış çalışmalarına dayanmaktadır. Angel Angelov tarafından İngilizce’ye çevrilmiştir (Martin Yankov ve Hristo Radkov tarafından düzenlenmiştir). www.nakov.com Page 29 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 4: Konsol Giriş ve Çıkış “Konsol Giriş ve Çıkış” Bölümü’nde, veri girişi ve çıkışı için bir araç olarak konsola aşina olacağız. Konsolun ne olduğunu, ne zaman ve nasıl kullanıldığını, konsola erişmek için geliştirilen birçok programlama dillerine ait kavramları açıklayacağız. Kullanıcı etkileşimi için bazı C# özelliklerini tanıtacağız ve giriş-çıkış işlemleri için ana akımları, Console.In, Console.Out ve Console.Error, Console sınıfını ve çeşitli biçimlerde veri yazdırmak için biçim dizelerinin kullanımını inceleyeceğiz. Bir metni sayıya nasıl dönüştüreceğinizi göreceksiniz (ayrıştırma), çünkü C# sayıları bu şekilde girilir. Svetlin Nakov tarafından düzenlenen bölüm Iliyan Murdanliev tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Boris Valkov tarafından yazılmış çalışmalarına dayanmaktadır. Lora Borisova tarafından İngilizce’ye çevrilmiştir (Dyanko Petkov tarafından düzenlenmiştir). Bölüm 5: Koşullu İfadeler “Koşullu İfadeler” Bölümü’nde, durumlara bağlı olarak farklı eylemleri yürütmek için kullanabileceğiniz C# koşullu ifadelerini ele alacağız. Koşullu işleçlerin sözdizimini açıklayacağız: Çeşitli örneklerle if ve if-else ve seçim kontrolü olan switch işlecinin pratik uygulamalarını açıklayacağız. Koşullu ifadelerin iç içe ya da diğer türlerini kullanırken daha iyi bir programlama tarzı elde etmek için takip edilmesi gereken en iyi uygulamalar üzerinde duracağız. Marin Georgiev tarafından düzenlenen bölüm Svetlin Nakov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Marin Georgiev tarafından yazılmış çalışmalarına dayanmaktadır. George Vaklinov tarafından İngilizce’ye çevrilmiştir (Momchil Rogelov tarafından düzenlenmiştir). www.nakov.com Page 30 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 6: Döngüler “Döngüler” Bölümü’nde, bir kod parçasını tekrar tekrar yürütebileceğiniz döngü mekanizmalarını inceleyeceğiz. Koşullu tekrarların (while ve dowhile döngüleri) nasıl uygulandığını ve for döngüleri ile nasıl çalışılacağını tartışacağız. Bir döngü tanımlamak, yapılandırmak ve anahtar uygulamalarından bazıları için çeşitli yollarla örnekler verilecektir. Son olarak, birbiri içinde birden çok döngünün nasıl kullanılacağını (iç içe döngüler) göreceğiz. Svetlin Nakov tarafından düzenlenen bölüm Stanislav Zlatinov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Rumyana Topalska tarafından yazılmış çalışmalarına dayanmaktadır. Angel Angelov tarafından İngilizce’ye çevrilmiştir (Lora Borisova tarafından düzenlenmiştir). Bölüm 7: Diziler “Diziler” Bölümü’nde, aynı tür elemanlar ile çalışmak için bir araç olan dizileri tanıtacağız. Ne olduklarını, nasıl bildirileceklerini, oluşturulacaklarını ve elemanlarına nasıl erişim sağlanacağını anlatacağız. Tek boyutlu ve çok boyutlu dizileri inceleyeceğiz. Bir dizi elemanları üzerinden yineleme yapmak, standart girdiden okumak ve standart çıktıya yazmak için çeşitli yollar öğreneceksiniz. Örnek olarak dizileri kullanarak çözebileceğiniz birçok alıştırma vereceğiz, ve onların ne kadar yararlı olduğunu göstereceğiz. Radoslav Todorov tarafından düzenlenen bölüm Hristo Germanov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Mariyan Nenchev tarafından yazılmış çalışmalarına dayanmaktadır. Boyan Dimitrov tarafından İngilizce’ye çevrilmiştir (Radoslav Todorov ve Zhelyazko Dimitrov tarafından düzenlenmiştir). www.nakov.com Page 31 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 8: Sayısal Sistemler “Sayısal Sistemler” Bölümü’nde, çeşitli sayı sistemleri ve bunların sayı gösterimi ile çalışmak için var olan araçlara bir göz atacağız. Sayıların ondalık, ikili ve onaltılı sayı sistemleri ile temsil edilmesine özellikle önem vereceğiz, çünkü bilgisayar, iletişim ve programlamada yaygın olarak kullanılmaktadır. Buna ek olarak, sayısal verileri bir bilgisayarda kodlama yöntemlerini ve kodlama türlerini, yani işaretli büyüklükler, bir’in tümleyeni, iki’nin tümleyeni ve ikili kodlanmış ondalıkları açıklayacağız. Mihail Stoynov tarafından düzenlenen bölüm Teodor Bozhikov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Petar Velev ve Svetlin Nakov tarafından yazılmış çalışmalarına dayanmaktadır. Atanas Valchev tarafından İngilizce’ye çevrilmiştir (Veselina Raykova tarafından düzenlenmiştir). Bölüm 9: Metotlar “Metotlar” Bölümü’nde, programlamada altyordamların ayrıntılarını bileceğiz. Bu altyordamlara C# dilinde yöntemler deniyor. Ne zaman ve neden yöntemlerin kullanılacağını açıklayacağız; yöntemlerin nasıl bildirileceğini göstereceğiz ve bir yöntemin imzası nedir açıklayacağız. Özel bir yöntemi nasıl oluşturacağımızı ve daha sonra kullanmak için nasıl çağrılacağını öğreneceğiz ve metotlarda parametreleri nasıl kullanacağımızı ve bir metottan sonuç döndürmeyi göstereceğiz. Son olarak, metotlar ile çalışırken bazı yerleşik uygulamaları tartışacağız. Tüm bunlar detaylı bir şekilde açıklanan örneklerle ve ekstra alıştırmalar ile pekiştirilmiş olacak. Radoslav Todorov ve Nikolay Vasilev tarafından düzenlenen bölüm Yordan Pavlov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Nikolay Vasilev tarafından yazılmış çalışmalarına dayanmaktadır. Ivaylo Dyankov tarafından İngilizce’ye çevrilmiştir (Vladimir Amiorkov ve Franz Fischbach tarafından düzenlenmiştir). www.nakov.com Page 32 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 10: Özyineleme “Özyineleme” Bölümü’nde, özyineleme ve uygulamalarını tanıtacağız. Güçlü bir programlama tekniği olan özyinelemeyi kullanan bir yöntem kendi kendisini çağırır. Özyineleme sayesinde kolayca farklı yapılandırma kombinasyonlarını çıkarabileceğimiz karmaşık kombinasyon problemlerini çözebiliriz. Özyinelemenin doğru ve yanlış kullanımlarından pek çok örnek göstereceğiz ve sizi bunların nasıl yararlı olabileceğine ikna edeceğiz. Svetlin Nakov tarafından düzenlenen bölüm Radoslav Ivanov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Radoslav Ivanov ve Svetlin Nakov tarafından yazılmış çalışmalarına dayanmaktadır. Vasya Stankova tarafından İngilizce’ye çevrilmiştir (Yoan Krumov tarafından düzenlenmiştir). Bölüm 11: Nesneleri Oluşturma ve Kullanma “Nesneleri Oluşturma ve Kullanma” Bölümü’nde, nesne yönelimli programlamanın temel kavramlarını öğreneceğiz – sınıflar ve nesneler – ve .NET Platformu’nun standart kütüphanelerinden sınıfları nasıl kullanacağımızı açıklayacağız. Bazı sık kullanılan sistem sınıfları üzerinde duracağız ve bunların örnekleri (nesneleri) nasıl oluşturacağınızı ve kullanacağınızı göstereceğiz. Bir nesnenin özelliklerine nasıl erişileceğini, kurucuların nasıl çağrılacağını ve sınıflarda statik alanlar ile nasıl çalışılacağını tartışacağız. Son olarak, “ad alanları” üzerinde odaklanacağız – bize nasıl yardımcı olurlar, nasıl dahil edilir ve nasıl kullanılırlar. Stefan Staev tarafından düzenlenen bölüm Teodor Stoev tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Teodor Stoev ve Stefan Staev tarafından yazılmış çalışmalarına dayanmaktadır. Vasya Stankova tarafından İngilizce’ye çevrilmiştir (Todor Mitev tarafından düzenlenmiştir). www.nakov.com Page 33 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 12: İstisnai Durum İşleme “İstisnai Durum İşleme” Bölümü’nde, nesne yönelimli programlama ve özellikle C# dilindeki istisnai durumları tanıyacaksınız. try-catch cümlesini kullanarak istisnai durumları nasıl yakalayacağınızı, çağrılan yöntemlere onları nasıl geçireceğinizi ve throw deyimini kullanarak standart, özel veya yakalanan istisnai durumları nasıl atacağınızı öğreneceksiniz. Kullanımlarına dair örnekler vereceğiz, istisnai durum türlerine ve .NET Platformu’nda oluşturulan istisnai durum hiyerarşisine bakacağız. Son olarak, istisnai durumları kullanmanın avantajlarına ve bunların belirli durumlara nasıl uygulanacağına bakacağız. Radoslav Kirilov tarafından düzenlenen bölüm Mihail Stoynov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Luchesar Cekov, Mihail Stoynov ve Svetlin Nakov tarafından yazılmış çalışmalarına dayanmaktadır. Dimitar Bonev ve George Todorov tarafından İngilizce’ye çevrilmiştir (Doroteya Agayna tarafından düzenlenmiştir). Bölüm 13: Dizeler ve Metin İşleme “Dizeler ve Metin İşleme” Bölümü’nde, dizeleri tanıtacağız: C# dilinde nasıl uygulandığını ve metin içeriğini nasıl işleyebileceğimizi. Metin işlemek için farklı yöntemler üzerinde ayrıntılı olarak duracağız; ve geçirilen parametrelere göre alt dizeleri ayıklamayı, anahtar kelimeler için nasıl arama yapılacağını, bunun yanı sıra ayırıcı karakterleri kullanarak bir dizenin nasıl bölüneceğini öğreneceğiz. Düzenli ifadeler hakkında yararlı bilgiler vereceğiz ve belirli bir örüntü ile eşleşen veriyi nasıl ayıklayacağımızı öğreneceğiz. Son olarak, konsolda metin içeriğinin daha şık ve sıkı biçimlendirmesini elde etmek için gerekli yöntemler ve sınıflara, sayılar ve tarihlerin baskısını almak için çeşitli yollara bir göz atacağız. Radoslav Todorov tarafından düzenlenen bölüm Veselin Georgiev tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Mario Peshev tarafından yazılmış çalışmalarına dayanmaktadır. Vesselin Georgiev tarafından İngilizce’ye çevrilmiştir (Todor Mitev ve Vladimir Amiorkov tarafından düzenlenmiştir). www.nakov.com Page 34 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 14: Sınıfları Tanımlama “Sınıfları Tanımlama” Bölümü’nde, özel sınıfları nasıl tanımlayabileceğimizi ve bir sınıfın elemanlarının neler olduğunu göstereceğiz. Sınıfların veri alanlarını, kurucularını ve özelliklerini bildirmeyi öğreneceğiz ve yöntemin ne olduğunu yine hatırlayacağız, ancak metotlar ve bunların erişim değiştiricileri hakkındaki bilgimizi genişleteceğiz. Kurucuların özellikleri üzerinde odaklanacağız ve program nesnelerinin yığın (dinamik bellek) içinde nasıl var olduklarını ve alanlarının nasıl ilk değer atayarak başlatıldığını detaylı olarak açıklayacağız. Son olarak, sınıfın statik elemanlarının ne olduğunu – veri alanları (sabitler dahil), özellikler ve metotları – ve bunların nasıl kullanılacağını açıklayacağız. Bu bölümde, genel özellikleri olan türleri, dökümlü türleri ve iç içe sınıfları da tanıtacağız. Bu bölüm Nikolay Vasilev, Svetlin Nakov, Mira Bivas ve Pavlina Hadjieva tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Nikolay Vasilev tarafından yazılmış çalışmalarına dayanmaktadır. Radoslav Todorov, Yoan Krumov, Teodor Rusev ve Stanislav Vladimirov tarafından İngilizce’ye çevrilmiştir (Vladimir Amiorkov, Pavel Benov ve Nencho Nenchev tarafından düzenlenmiştir). Bu bölüm kitaptaki en geniş bölümdür, yani sizin için yüksek kalite standardında hazırlanması için birçok yazar katkıda bulunarak üzerinde çalıştı. Bölüm 15: Metin Dosyaları “Metin Dosyaları” Bölümü’nde .NET Platformu’ndaki metin dosyaları ile çalışmayı tanıtacağız. Bir dosyayı kesintisiz olarak iletmenin ne olduğunu, amacını ve nasıl kullanıldığını açıklayacağız. Bir metin dosyasının ne olduğunu ve metin dosyalarındaki verilerin nasıl okunacağını ve yazılacağını açıklayacağız ve metin dosyaları ile çalışırken özel durumları yakalamanın ve işlemenin en iyi uygulamalarını ayrıntılı olarak sunacağız. Doğal olarak, tüm bunları bir sürü örnekler ile uygulayarak görselleştireceğiz ve göstereceğiz. Stanislav Zlatinov tarafından düzenlenen bölüm Radoslav Kirilov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Danail Alexiev tarafından yazılmış çalışmalarına dayanmaktadır. Nikolay Angelov tarafından İngilizce’ye çevrilmiştir (Martin Gebov tarafından düzenlenmiştir). www.nakov.com Page 35 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 16: Doğrusal Veri Yapıları “Doğrusal Veri Yapıları” Bölümü’nde, programlamada bazı temel veri gösterimlerini ve doğrusal veri yapılarını tanıtacağız, çünkü çoğu kez belirli bir sorunu çözmek amacıyla, bir dizi eleman ile çalışmamız gerekir. Örneğin, bu kitabı okumak için ardışık olarak her sayfayı okumak zorundayız, yani sayfaları oluşturan her bir elemanı atlamadan dikkatle incelemek zorundayız. Belirli bir problem için bazı veri yapılarının diğerine göre nasıl daha verimli ve kullanışlı olabileceğini göreceğiz. Sonra “liste”, “yığıt” ve “kuyruk” doğrusal yapılarını ve onların uygulamalarını inceleyeceğiz ve bu yapıların bazı uygulamalarının detaylarını tanıyacağız. Dilyan Dimitrov ve Svetlin Nakov tarafından düzenlenen bölüm Tsvyatko Konov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Tsvyatko Konov ve Svetlin Nakov tarafından yazılmış çalışmalarına dayanmaktadır. Vasya Stankova tarafından İngilizce’ye çevrilmiştir (Ivaylo Gergov tarafından düzenlenmiştir). Bölüm 17: Ağaçlar ve Grafikler “Ağaçlar ve Grafikler” Bölümü’nde, ağaç-benzeri diye anılan veri yapılarına, yani ağaçlara ve grafiklere bakacağız. Bu yapıların özelliklerinin bilinmesi modern programlama için önemlidir. Bu yapıların her biri gerçek hayat problemlerinin modellenmesi ve onların yardımı ile verimli olarak çözülebilmesi için kullanılmaktadır. Ağaç-benzeri veri yapılarının ne olduğunu ayrıntılarıyla inceleyeceğiz ve onların birincil avantajları ve dezavantajlarını göstereceğiz. Aynı zamanda, onların pratik kullanımını gösteren örnek uygulamalar ve alıştırmalar vereceğiz. Ayrıca, ikili ağaçlar, ikili arama ağaçları ve dengeli ağaçları ve daha sonra “grafik” veri yapısını, grafiklerin türlerini ve bunların kullanımını dikkatle inceleyeceğiz. .NET Platformu’nun hangi parçalarının ikili arama ağaçlarından faydalandığını göstereceğiz. Iliyan Murdanliev ve Svetlin Nakov tarafından düzenlenen bölüm Veselin Kolev tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Veselin Kolev tarafından yazılmış çalışmalarına dayanmaktadır. Kristian Dimitrov ve Todor Mitev tarafından İngilizce’ye çevrilmiştir (Nedjaty Mehmed ve Dyanko Petkov tarafından düzenlenmiştir). www.nakov.com Page 36 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 18: Sözlükler, Karma Tabloları ve Kümeler “Sözlükler, Karma Tabloları ve Kümeler” Bölümü’nde, sözlük ve kümeler gibi daha karmaşık veri yapılarını, buna ilaveten karma tablolar ve dengeli ağaçları kullanarak bunların uygulamaları analiz edeceğiz. Karma tablolarının ve karma fonksiyonunun ne demek olduğunu ve neden programlamanın o kadar önemli parçaları olduğunu detaylarıyla açıklayacağız. “Çarpışmalar” kavramını ve karma tabloları uygularken çarpışmaların nasıl oluşabileceklerini tartışacağız. Onları çözmek için çeşitli yaklaşımlar önereceğiz. “Küme” soyut veri yapısına bakacağız ve bir sözlük yada dengeli ağaç ile nasıl gerçekleştirilebileceğini açıklayacağız. Günlük pratikte bu veri yapılarının uygulamalarını gösteren örnekler vereceğiz. Tsvyatko Konov ve Svetlin Nakov tarafından düzenlenen bölüm Mihail Valkov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Vladimir Tsanev (Tsachev) tarafından yazılmış çalışmalarına dayanmaktadır. George Mitev ve George K. Georgiev tarafından İngilizce’ye çevrilmiştir (Martin Gebov ve Ivaylo Dyankov tarafından düzenlenmiştir). Bölüm 19: Veri Yapıları ve Algoritma Karmaşıklığı “Veri Yapıları ve Algoritma Karmaşıklığı” Bölümü’nde, şimdiye kadar öğrendiğimiz veri yapılarını, temel işlemler (ekleme, arama, silme, vb.) için performanslarına dayalı olarak karşılaştıracağız. Belirli durumlara en uygun veri yapıları için öneriler vereceğiz. Bir kümeyi, bir karma tablo, bir dizi, bir dinamik dizi, bir karma tablo veya dengeli ağaç kullanarak uygulamanın ne zaman daha iyi ve tercih edilebilir olduğunu açıklayacağız. Bu yapıların her biri için .NET Platformu’nda bir uygulama vardır. Biz sadece belirli bir veri yapısını ne zaman kullanmamız gerektiğini öğrenmek zorundayız ki böylece verimli ve güvenilir bir kaynak kodu yazabilelim. Veselin Kolev tarafından düzenlenen bölüm Nikolay Nedyalkov ve Svetlin Nakov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Svetlin Nakov ve Nikolay Nedyalkov tarafından yazılmış çalışmalarına dayanmaktadır. George Halachev ve Tihomir Iliev tarafından İngilizce’ye çevrilmiştir (Martin Yankov tarafından düzenlenmiştir). www.nakov.com Page 37 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 20: Nesne Yönelimli Programlamanın “Nesne Yönelimli Programlamanın İlkeleri” Bölümü’nde, nesne yönelimli programlamanın (OOP) ilkelerini tanıtacağız: sınıf kalıtımı, arayüzlerin gerçekleştirimi, veri ve davranış soyutlama, veri sarmalama ve uygulama detaylarını gizleme, çokbiçimlilik ve sanal yöntemler. Uyum ve bağlaşım ilkelerini detaylı olarak açıklayacağız. Kısaca nesne yönelimli modellemeyi ve belirli bir iş problemine dayanan nesne modeli oluşturmayı da açıklayacağız ve nesne yönelimli modellemede UML ve rolünü tanıyacağız. Son olarak, kısaca tasarım desenlerini tartışacağız ve pratikte sık kullanılan tasarım desenleri için örnekler vereceğiz. Mihail Valkov tarafından düzenlenen bölüm Mihail Stoynov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Mihail Stoynov tarafından yazılmış çalışmalarına dayanmaktadır. Vasya Stankova ve Momchil Rogelov tarafından İngilizce’ye çevrilmiştir (Ivan Nenchovski tarafından düzenlenmiştir). Bölüm 21: Yüksek Kalite Programlama Kodu “Yüksek Kalite Programlama Kodu” Bölümü’nde, yüksek kaliteli programlama kodu yazmanın temel kurallarına göz atacağız. Program elemanları (değişkenler, yöntemler, sınıflar ve diğerleri) için adlandırma kuralları, biçimlendirme ve kod yerleşimi yönergeleri, sınıf ve yöntemleri yüksek kaliteli oluşturmak için en iyi uygulamalar, ve yüksek kaliteli kod dokümantasyonunun ilkeleri üzerinde duracağız. Yüksek kaliteli ve düşük kaliteli birçok kod örnekleri verilecektir. Çalışma esnasında, bir tümleşik geliştirme ortamının, bazı işlemleri (biçimlendirme ve mevcut kodun yeniden yapılandırılması gibi) otomatik hale getirmek için gerektiğinde nasıl kullanılacağı açıklanacaktır. Otomatik test yapmak için endüstriyel bir yöntem olarak bilinen birim testleri de ele alınacaktır. Pavel Donchev tarafından düzenlenen bölüm Mihail Stoynov ve Svetlin Nakov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Mihail Stoynov, Svetlin Nakov ve Nikolay Vasilev tarafından yazılmış çalışmalarına dayanmaktadır. Blagovest Buyukliev tarafından İngilizce’ye çevrilmiştir (Dyanko Petkov, Mihail Stoynov ve Martin Yankov tarafından düzenlenmiştir). www.nakov.com Page 38 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 22: Lambda İfadeleri ve LINQ “Lambda İfadeleri ve LINQ” Bölümü’nde, C# dilinin daha gelişmiş ve ileri yeteneklerinden bazılarını tanıtacağız. Daha kesin olmak gerekirse, lambda ifadeleri ve LINQ kullanarak koleksiyonlara sorguların nasıl yapıldığının açıklığa kavuşturulması için özel dikkat vereceğiz. Zaten yaratılmış sınıflara uzantı yöntemlerini kullanarak nasıl işlevsellik ekleneceğini açıklayacağız. Anonim türleri tanıtacağız ve kısaca onların doğasını ve kullanımını tanımlayacağız. Lambda ifadeleri de tartışacağız ve pratikte yerleşik lambda fonksiyonlarının çoğunun nasıl çalıştığını göstereceğiz. Daha sonra C# parçası olan LINQ sözdizimi içine dalacağız. ne olduğunu, nasıl çalıştığını ve bunu kullanarak ne tür sorgular yapabileceğimizi öğreneceğiz. Son olarak, LINQ anahtar kelimelerini tartışacağız, onların anlamı ve birçok örnek ile yeteneklerini ortaya koyacağız. Veselin Kolev tarafından düzenlenen bölüm Nikolay Kostov tarafından yazılmıştır. Nikolay Kostov tarafından İngilizce’ye çevrilmiştir (Zhasmina Stoyanova ve Mihail Stoynov tarafından düzenlenmiştir). Bölüm 23: Problem Çözme Metodolojisi “Problem Çözme Metodolojisi” Bölümü’nde, programlama problemlerinin çözümü için tavsiye edilebilir bir yaklaşımı tartışacağız ve biz somut örnekler ile göstereceğiz. Problemleri çözerken izlememiz gereken mühendislik ilkelerini (büyük ölçüde matematik, fizik ve diğer disiplinlerdeki sorunlara uygulanan) görüşeceğiz ve uygulama halinde onları göstereceğiz. Birkaç örnek problem çözerken geçmemiz gereken adımları anlatacağız ve bu adımları takip etmezsek yapabileceğimiz hataları göstereceğiz. Problem çözmenin genellikle atlanan bazı önemli adımlarını (örneğin test etmek gibi) dikkate alacağız. Veselin Georgiev tarafından düzenlenen bölüm Svetlin Nakov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Svetlin Nakov tarafından yazılmış çalışmalarına dayanmaktadır. Ventsi Shterev ve Martin Radev tarafından İngilizce’ye çevrilmiştir (Tihomir Iliev ve Nedjaty Mehmed tarafından düzenlenmiştir). www.nakov.com Page 39 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 24, 25, 26: Örnek Programlama Sınavı “Örnek Programlama Sınavı (Konu # 1, Konu # 2 ve Konu # 3)” Bölümü’nde, üç örnek programlama sınavından dokuz örnek problemin açıklamalarına bakacağız ve çözüm önereceğiz. Onları çözme yolunda, “Problem Çözme Metodolojisi”nde açıklanan metodolojiyi uygulamaya koyacağız. Radoslav Todorov, Radoslav Ivanov ve Teodor Stoev tarafından düzenlenen bölüm Stefan Staev, Yosif Yosifov ve Svetlin Nakov tarafından yazılmıştır. Tüm bölümün içeriği “Java ile Programlamaya Giriş” kitabının Stefan Staev, Svetlin Nakov, Radoslav Ivanov ve Teodor Stoev tarafından yazılmış çalışmalarına dayanmaktadır. Stanislav Vladimirov, Ivaylo Gergov, Ivan Nenchovski ve Ivaylo Gergov tarafından İngilizce’ye çevrilmiştir (Tihomir Iliev ve Nedjaty Mehmed tarafından düzenlenmiştir). Bölüm 27: Sonuç Sonuç olarak uzman bir yazılım mühendisi olarak bu kitaptan sonraki gelişiminize devam etmek için daha fazla bilgi vereceğiz. Telerik Yazılım Akademisi’nde – Bulgaristan’da yazılım geliştirme uzmanları için en büyük eğitim merkezinde – verilen ücretsiz kurslardan, nasıl uygulanacağından, ne öğreneceğinizden, nasıl bir kariyer yolu seçeceğinizden ve diğer birkaç kaynaktan söz edeceğiz. Bölüm Svetlin Nakov tarafından yazılmıştır. Ivan Nenchovski tarafından İngilizce’ye çevrilmiştir (Svetlin Nakov tarafından düzenlenmiştir). www.nakov.com Page 40 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 1: Programlamaya Giriş Bölümün İçindekileri B u bölümde programlamanın temel terminolojisine göz atacağız ve ilk programımızı yazacağız. Programlama nedir sorusunu ve bilgisayarlar ve programlama dilleri ile bağlantısını tanıtacağız. Yazılım geliştirmenin farklı aşamalarını kısaca gözden geçireceğiz. C # dilini, .NET platformu ve yazılım geliştirmede kullanılan farklı Microsoft teknolojilerini tanıtacağız. C# programlama için gereken yardımcı araçları inceleyeceğiz ve ilk bilgisayar programımızı yazmak için C# dilini kullanarak derleyeceğiz ve komut satırını ve bunun yanı sıra Microsoft Visual Studio tümleşik geliştirme ortamını kullanarak çalıştıracağız. .NET Platformu için dokümantasyon olarak düşünülmüş MSDN Kitaplığı’na kendimizi alıştıracağız, bu dilin yetenekleri ile ilgili çalışmamızda bize yardımcı olacaktır. “Programlama” Ne Demektir? Günümüzde bilgisayarlar vazgeçilmez hale gelmiştir. İşyerindeki karmaşık problemleri çözmek için bilgisayarlardan faydalanırız, karayolunda yön bulmaya yardımcıdırlar, eğlenmek ve iletişim kurmak için kullanılırlar. İş dünyasında, eğlence endüstrisi, telekomünikasyon ve finans sektöründe sayısız uygulamaları vardır. Bilgisayarların çağdaş toplumun sinir sistemi olduğunu söylemek bir abartı değildir ve onlar olmadan varlığını hayal etmek zordur. Bilgisayarlar çok yaygın olmasına rağmen, az sayıda kişi gerçekten nasıl çalıştıklarını bilir. Gerçekte, bilgisayarlar değil, ancak bunların üzerinde çalışan programlar (yazılım) önemli meseledir. Bilgisayarları son kullanıcı için değerli yapan, hayatımızı değiştirmek için birçok farklı türdeki hizmetlere izin veren yazılımdır. Bilgisayarlar Bilgiyi Nasıl İşler? Programlamanın ne anlama geldiğini anlamak için, bir bilgisayar ve işletim sistemini kabaca tüm atölye, depo ve ulaşımıyla büyük bir fabrika ile karşılaştırabiliriz. Bu kaba karşılaştırma çağdaş bilgisayarda mevcut olan karmaşıklık düzeyini hayal etmeyi kolaylaştırır. Bir bilgisayarda çalışan birçok süreç vardır ve bunlar bir fabrikadaki atölye ve üretim hatlarını temsil www.nakov.com eder. Üzerindeki dosyalar ile birlikte sabit disk, ve çalışma belleği (RAM) depoları temsil eder, bilgi girişi ve çıkışını sağlayan farklı protokoller ise ulaşım sistemlerini temsil eder. Bir fabrikada yapılan ürünler farklı farklı atölyelerden gelir. Depolardaki hammaddeleri kullanırlar ve tamamlanmış malları orada geri saklarlar. Hammaddeler, tedarikçiler tarafından depolara taşınır ve tamamlanan ürün depolardan satış yerlerine taşınır. Bunu yapmak için, farklı ulaşım türleri kullanılır. Hammadde fabrikaya girer, farklı işleme aşamalarından geçer ve ürünlere dönüştürülerek fabrikayı terk eder. Her fabrika tüketime hazır bir ürün olarak hammaddeleri dönüştürür. Page 41 / 151 C# İle Bilgisayar Programlama Temelleri Bilgisayarı Yönetmek Programlamanın Özü Bir fabrikadaki ürünlerin tüm imalat sürecinde pek Programlamanın özü, her seviyede bilgisayarın çalışmasını hatları atölyelerin olarak bilinen “emir” ve “komutlar” yardımıyla programcılar yöneticiler tarafından yönetilir. Bunların her biri farklı yoluyla bilgisayarın çalışmasını organize etmek anlamına çok yönetim seviyesi vardır. Ayrı makineler ve montaj kontrol etmektir. Bu, aynı zamanda programlama talimatları yöneticileri vardır, ve bir bütün olarak fabrika genel tarafından yapılır. “Programlamak” birbirini izleyen talimatlar operatörler tarafından işletilir, bir seviyede işlemleri denetler. Makine operatörleri en düşük seviyede hizmet verir – düğmeler ve kollar ile makineleri kontrol ederler. Bir sonraki seviye atölye yöneticileri için ayrılmıştır. Ve en üst seviyede, genel yöneticiler fabrikadaki üretim süreçlerinin farklı yönlerini yönetirler. Emirler çıkararak bunu yaparlar. Bilgisayarlar ve yazılımda da bu aynıdır – yönetim ve denetimin birçok seviyeleri vardır. En düşük seviye işlemci ve onun kayıt tutucuları tarafından gelir. Bu komutlar (talimatlar) yazılı olarak verilmektedir ve tam olarak bilgisayar tarafından (sırasıyla işletim sistemi, CPU ve çevresel aygıtlar tarafından) takip edilmektedir. Bazı işleri gerçekleştirmek, tamamlamak veya bazı sonuçları elde etmek için uygulanan birbirini izleyen adımlar dizisine algoritma denir. Bu tanım programlama ile algoritmaların Programlama nasıl algoritmalar ilgili olduğunu yoluyla, anlatır. bilgisayara ne yapmak istediğinizi adımlar dizisi ile anlatmayı içerir. yönetilir (düşük bir seviyede makine programları Programcılar bilgisayarları kontrol eden bu talimatları oluşturan makinelerin kontrolü ile karşılaştırabiliriz. İşletim sayıda program vardır, ve bunlar farklı türde programlama aygıtlar, kullanıcılar ve iletişim protokolleri gibi farklı bilgisayarı kontrol etmeye yöneliktir. Makine seviyesine (en atölyelerdeki insanlardır. Bu talimatlar program olarak adlandırılır. Çok sisteminin (örneğin, Windows 7) dosya sistemi, çevresel dilleri kullanılarak oluşturulur. Her dil farklı bir seviyede kullanılarak bu gerçekleştirilir) – sorumlulukları daha yüksek bir seviyede kontrol edilir – fabrikadaki farklı atölye ve departmanların yönetimi ile karşılaştırabiliriz. En üst düzeyde, uygulama yazılımını buluyoruz. operasyonlarını Büyük gerektiren, miktarda süreçler işlemci topluluğunun bütünü ile çalışır. Bu, kaynakların kullanımını en büyüğe çıkarmak ve kaliteli sonuçlar üretmek için bütün fabrikayı çalıştıran genel yöneticilerin seviyesidir. “Programlama” bilgisayarın çalışmalarını bir şeyler yapması için organize etmek üzere birbiri ardı sıra gelen talimat dizilerinin yazılması anlamına geliyor. Bu talimatlar dizilerine “bilgisayar programları” veya “betikler” denir. www.nakov.com düşük) yönelik diller vardır – örneğin Assembler. Diğerleri (işletim sistemi ile etkileşerek) sistem düzeyinde en yararlıdır, C gibi. Uygulama programlarını oluşturmak için kullanılan yüksek seviyeli diller de vardır. Bu dillere C#, Java, C++, PHP, Visual Basic, Python, Ruby, Perl, JavaScript ve diğerleri dahildir. Bu kitapta C# programlama diline bakacağız – modern bir yüksek seviyeli dil. Bir programcı C# kullandığında, yüksek düzeyde komutlar verir, bir fabrikada genel yönetici pozisyonundan verilen emirler gibi. C# ile yazılmış programlar şeklinde verilen talimatlar doğrudan veya işletim sistemi üzerinden hemen hemen tüm bilgisayar kaynaklarına erişebilir ve kontrol edebilir. Basit C# programlarını yazmayı öğrenmeden önce, yazılım geliştirmenin farklı aşamalarına iyice bir göz atalım, çünkü programlama, en önemli aşama olmasına rağmen, tek başına değildir. Page 42 / 151 C# İle Bilgisayar Programlama Temelleri Yazılım Geliştirme Aşamaları Yazılım yazma işi yazılım mühendisleri ve diğer uzmanlardan oluşan bütün bir ekibi kapsamakla beraber çok karmaşık ve zaman alıcı olabilir. Bunun bir sonucu olarak, programcıların hayatını kolaylaştıran pek çok yöntem ve uygulamalar ortaya çıkmıştır. Ortak yönleri her yazılım ürününün geliştirilmesi için pek çok farklı aşamadan geçmesidir: • Ürün gereksi- • Planlama yap- • Uygula- nimlerini to- mak, mima- ma (program plamak ve işi riyi ve tasarımı kodu yazmayı başlatmak hazırlamak; içerir) ve • Ürün testi; • Dağıtım ve • Destek. işletme; gerçekleştirim; Ürün gereksinimlerini toplamak ve işi başlatmak Başlangıçta, belirli bir ürün için, sadece fikir vardır. Gereksinimlerin bir listesini içerir, burada kullanıcı ve bilgisayarın eylemleri tanımlanır. Genel durumda, bu eylemler zaten varolan etkinlikleri daha kolay hale getirir – maaşları hesaplama, balistik yörüngeleri hesaplama yada Google Maps üzerinde en kısa yolu arama verilebilecek bazı örneklerdir. Birçok durumda, yazılım, önceden var olmayan fonksiyonları yerine getirir – belli bir aktivitenin otomasyonu gibi. Ürün için gereksinimler genellikle İngilizce veya başka herhangi bir dilde yazılmış belgeler şeklinde hazırlanır. Bu aşamada programlama yapılmaz. Gereksinimler belirli bir alanda sorunlara aşina olan tarafından anlaşılması kolay bir şekilde yazılır. Genel durumda, bu uzmanlar programcı değildir, onlara iş analistleri denir. www.nakov.com Page 43 / 151 C# İle Bilgisayar Programlama Temelleri Planlama Yapmak, Mimariyi ve Tasarımı Hazırlamak Tüm gereksinimler toplandıktan sonra planlama aşamasına gelinir. Bu aşamada, projenin uygulanması için programın yürütüleceği platformları, teknolojileri ve ilk mimarisini (tasarım) tanımlayan teknik bir plan oluşturulur. Bu adım yoğun miktarda yaratıcı Doğru analiz ve planlama yapmayı kolaylaştıran birçok kural bulunmasına rağmen, bu aşamada yoğun miktarda sezgi ve içgörü gereklidir. Bu adım geliştirme sürecinin daha fazla ilerlemesini önceden belirler. Bu aşamada sadece hazırlık yapılır, hiçbir programlama yoktur. çalışma ister, tecrübeli birçok yazılım mühendisi tarafından yerine getirilir. Onlara yazılım mimarları denir. Gereksinimlere göre, aşağıdaki kısımlar belirlenir: www.nakov.com • Uygulamanın türü – örneğin konsol uygulaması, masaüstü uygulaması (GUI, Grafik Kullanıcı Arayüzü uygulaması), istemci-sunucu uygulaması, Web uygulaması, Zengin İnternet Uygulamaları (RIA), mobil uygulama, uçbirimden-uçbirime (peer-to-peer) uygulama veya diğerleri; • Yazılım mimarisi – örneğin tek katmanlı, çift katmanlı, üç katmanlı, çoklu katmanlı veya SOA mimarisi için; • Uygulanması için en uygun programlama dili – örneğin C# , Java, PHP, Python, Ruby, JavaScript veya C++, ya da farklı dillerin bir arada kullanılması; • Kullanılacak teknolojiler: platform (Microsoft .NET, Java EE, LAMP veya diğerleri), veritabanı sunucusu (Oracle, SQL Server, MySQL, NoSQL veritabanı veya diğerleri), kullanıcı arabirimi için teknolojiler (Flash, Java Server Faces, Eclipse RCP, ASP .NET, Windows Forms, Silverlight, WPF veya diğerleri), veri erişimi için teknolojiler (örneğin Hibernate, JPA veya ADO .NET Entity Framework), raporlama teknolojileri (SQL Server Raporlama Hizmetleri, Jasper Reports veya diğerleri) ve yazılım sisteminin çeşitli parçaların uygulanması için kullanılacak teknolojilerin pek çok diğer kombinasyonları; • Geliştirmeyi basitleştirecek geliştirme platformları, örneğin ASP.NET MVC (.NET için) Knockout.js (JavaScript için), Rails (Ruby için), Django (Python için) ve diğerleri; • Geliştirme ekibinin bir parçası olacak insanların sayısı ve becerisi (büyük ve ciddi projeler büyük ve deneyimli geliştirici ekipleri tarafından yapılır); • Geliştirme planı - Her aşama için işlevselliği, kaynakları ve zaman sınırlarını ayırır. • Diğerleri (ekibin büyüklüğü, takımın yerelliği, iletişim yöntemleri, vb). Page 44 / 151 C# İle Bilgisayar Programlama Temelleri Uygulama Ürün Testi Programlama ile bağlantılı en yakın adım uygulama aşamasıdır. Bu aşamada, program (uygulama) verilen görev, tasarım ve mimariye göre uygulanır (yazılır). Programcılar programın (kaynak) kodunu yazmaya katılırlar. Küçük bir proje oluşturulurken, diğer aşamalar kısa olabilir yada tamamen atlanabilir, ancak uygulama her zaman vardır; aksi takdirde işlem yazılım geliştirme değildir. Bu kitap uygulama sırasında kullanılan becerileri açıklamayı esas almıştır – bir programcının zihniyetini oluşturmayı ve yazılım uygulamaları oluşturmak için C# dili ve .NET Platformu tarafından sağlanan tüm kaynakları kullanmak için bilgi birikimi sağlamayı garanti eder. Ürün testi yazılım geliştirmenin çok önemli bir aşamasıdır. Amacı tüm gereksinimlerin sıkı bir şekilde takip edildiğinden ve yerine getirildiğinden emin olmaktır. Bu süreç el ile uygulanabilir, ancak otomatik testlerle yapılması tercih edilen yoldur. Bu testler mümkün olduğunca denemeleri otomatik hale getiren küçük programlardır. Otomatikleştirilmesi çok zor olan işlevsellik parçaları vardır. Ürün denemelerinin kod kalitesini sağlamak için otomatik testler içermesinin yanı sıra manuel prosedürlere de yer verilmesinin nedeni budur. Test (çalışma) süreci kalite güvence mühendisleri (QAs) tarafından yürütülmektedir. Yazılımdaki hataları (bug) bulmak ve düzeltmek için programcılar ile yakın bir çalışma içine girerler. Bu aşamada, koddaki hataları bulmak bir önceliktir ve neredeyse hiçbir yeni kod yazılmaz. Birçok kusur ve hatalar genellikle test aşamasında bulunur ve uygulama aşamasına program geri gönderilir. Bu iki aşama çok yakından bağlantılıdır ve bir yazılım ürününün tüm gereksinimleri yerine getirmesinden ve dağıtım, kullanım aşamaları için hazır olmasından önce birçok kez bu iki aşama arasında geçişler yapılması çok yaygındır. www.nakov.com Page 45 / 151 C# İle Bilgisayar Programlama Temelleri Dağıtım ve İşletme Teknik Destek Programlama ile bağlantılı en yakın adım uygulama aşamasıdır. Bu aşamada, program (uygulama) verilen görev, tasarım ve mimariye göre uygulanır (yazılır). Programcılar programın (kaynak) kodunu yazmaya katılırlar. Küçük bir proje oluşturulurken, diğer aşamalar kısa olabilir yada tamamen atlanabilir, ancak uygulama her zaman vardır; aksi takdirde işlem yazılım geliştirme değildir. Bu kitap uygulama sırasında kullanılan becerileri açıklamayı esas almıştır – bir programcının zihniyetini oluşturmayı ve yazılım uygulamaları oluşturmak için C# dili ve .NET Platformu tarafından sağlanan tüm kaynakları kullanmak için bilgi birikimi sağlamayı garanti eder. İşletim sürecinde, problemlerin ortaya çıkması kaçınılmazdır. Pek çok faktör problemlere neden olabilir – yazılım hataları, yanlış kullanım ya da hatalı yapılandırma, ancak çoğu problem kullanıcılar kendi gereksinimlerini değiştirdiğinde oluşur. Bu problemlerin bir sonucu olarak, belirli bir iş görevini çözmek için oluşturulan yazılım bu özelliklerini kaybeder. Bu geliştiriciler ve destek uzmanları tarafından ek katılım gerektirir. Destek süreci genellikle, yazılım ürünü ne kadar iyi olursa olsun, tüm yaşam döngüsü boyunca devam eder. Destek süreci geliştirme ekibi tarafından ve özel eğitimli destek uzmanları tarafından yürütülmektedir. Yapılan değişikliklere bağlı olarak, birçok farklı insan sürece dahil olabilir - iş analistleri, mimarlar, programcılar, kalite mühendisleri, yöneticiler ve diğerleri. Örneğin, maaşları hesaplayan bir yazılım programına bakacak olursak, servis verilen muhasebe sürecini ilgilendiren vergi mevzuatı her değiştiğinde güncelleştirilmesi gerekecektir. Örneğin, son kullanıcı donanım değiştirildiğinde destek takımın müdahalesi gerekli olacaktır, çünkü yazılımın yeniden yüklenmesi ve yeniden yapılandırılması gerekecektir. www.nakov.com Page 46 / 151 C# İle Bilgisayar Programlama Temelleri Dokümantasyon Yazılım Geliştirme Kodlamadan Daha Fazlasıdır Dokümantasyon aşaması ayrı bir aşama değil ama tüm diğer aşamalara eşlik eder. Dokümantasyon yazılım geliştirme önemli bir parçasıdır, ve bir yazılım ürününün geliştirilmesi ve desteği sırasında farklı katılımcılar arasında bilgi aktarmayı amaçlamaktadır. Bilgi farklı aşamalardan geçtiği gibi, tek bir kademeden de geçebilir. Geliştirme dokümantasyonu genellikle geliştiriciler (mimarlar, programcılar, kalite mühendisleri ve diğerleri) tarafından oluşturulmuş bir belge topluluğunu temsil eder. Gördüğümüz gibi, yazılım geliştirme, sadece kodlamadan (kod yazmadan) çok daha fazlasıdır, ve yazılım mühendisleri denilen uzmanları geniş bir yelpazede gerektiren bir dizi diğer süreçleri içerir – gereksinim analizi, tasarım, planlama, test ve destek gibi. Programlama yazılım geliştirmenin sadece küçük ancak çok önemli bir parçasıdır. www.nakov.com Yukarıdaki süreçler arasında programlama olmadan yazılım geliştiremeyeceğimiz için bu kitapta sadece programlamaya odaklanacağız. Page 47 / 151 C# İle Bilgisayar Programlama Temelleri İlk C# Programımız C# dili ve .NET Platformu’nun derinliğine açıklamasına geçmeden önce, C# ile yazılmış bir programın nasıl çalıştığını gösteren basit bir örneğe göz atalım: class HelloCSharp { static void Main(string[] args) { System.Console.WriteLine(“Merhaba C#!”); } } Bu programın yaptığı tek şey varsayılan çıkış üzerinde “Merhaba C#!” mesajını yazdırmaktır. Çalıştırmak için hâlâ erkendir, bu yüzden sadece kendi yapısına göz atacağız. Daha sonra derlemek ve komut isteminden veya yanı sıra bir geliştirme ortamından belirli bir programı çalıştırmanın nasıl tam olarak yapıldığını anlatacağız. İlk programımız üç mantıksal bölümden oluşur: - - - Bir HelloCSharp sınıfının tanımı; Bir Main() metotunun tanımı; Main() metotunun içeriği. İlk C# Programımız Nasıl Çalışır? Programımızın ilk satırında HelloCSharp adında bir sınıfı tanımlarız. Bir sınıfın en basit tanımı class anahtar sözcüğünün ardından sınıf adını vermektir. Bizim programımızda sınıfın adı HelloCSharp olmuştur. Sınıfının içeriği kıvırcık parantez {} ile çevrili program satırlarını içeren bir blokta yer almaktadır. Bir Sınıfı Tanımlamak www.nakov.com Page 48 / 151 C# İle Bilgisayar Programlama Temelleri Main() Metotunu Tanımlamak Üçüncü satırda programımız için başlangıç noktası olan Main() adlı bir yöntemi tanımlıyoruz. C# ile yazılmış her program şu başlığı (imza) taşıyan Main() yöntemi ile başlar: static void Main(string[] args) Yöntem yukarıda gösterildiği gibi bildirilmelidir, statik (static) ve boş (void) olmalıdır, bir adı olmalıdır Main ve parametre listesi olarak sadece bir parametre almalıdır, dize (string) türündeki bir dizi (ar ray). Örneğimizde parametrelere args denmiştir, ancak bu zorunlu değildir. Bu parametre çoğu durumda kullanılmaz, bu nedenle atlanabilir (isteğe bağlıdır). Bu durumda programın giriş noktası basitleştirilebilir ve şöyle görünecektir: static void Main() Yukarıda belirtilen gereklerin herhangi biri karşılanmazsa, programı derlemek mümkündür, ancak başlangıç noktası doğru olarak tanımlı olmadığı için program çalışmaya başlamaz. Her yöntemin içeriği, imzasının ardından açılış ve kapanış küme parantezleri ile çevrili olarak gelir. Örnek programımızın sonraki satırında varsayılan çıktıya (konsol) bir mesaj, “Merhaba, C #!”, yazdırmak için System.Console sistem nesnesini ve WriteLine() metotunu kullandık. Main() yönteminde rasgele bir ifade dizisi yazabiliriz, ve onlar belirttiğimiz sırada çalıştırılacaklardır. İfadeler hakkında daha fazla bilgi, “İşleçler ve İfadeler” Bölümü’nde bulunabilir, konsol ile çalışma “Konsol Giriş ve Çıkış” Bölümü’nde anlatılmıştır, sınıflar ve yöntemler “Sınıfları Tanımlamak” Bölümü’nde bulunabilir. www.nakov.com Page 49 / 151 C# İle Bilgisayar Programlama Temelleri C# Büyük ve Küçük Harf Arasında Ayrım Yapar! C # dili büyük ve küçük harfler arasında ayrım yapar, bu nedenle C# kodu yazarken doğru harf kullanmalıyız. Yukarıdaki örnekte class, static, void gibi bazı anahtar sözcükleri ve System.Console gibi sistem sınıfları ve nesnelerinden bazılarının adlarını kullandık. „Yazarken dikkatli olun! Büyük harfle, küçük harfle veya her ikisinin bir karışımı ile yazılı aynı şey, C# için farklı şeyler anlamına gelir. Class ve class farklı olduğu gibi, System.Console ve SYSTEM.CONSOLE da farklıdır.” Bu kural programın tüm unsurları için geçerlidir: anahtar sözcükler, değişkenlerin adları, sınıf adları, vb. Program Kodu Doğru Biçimli Olmalıdır B içimlendirme boşluk, sekme ve yeni satır gibi, derleyici için önemsiz olan fakat koda mantıksal yapısını veren ve okunmasını kolaylaştıran karakterleri eklemektir. Örneğin ilk programımıza (Main() metotunun kısa versiyonu) bir göz atalım: class HelloCSharp { static void Main(string[] args) { System.Console.WriteLine(“Merhaba C#!”); } } Program kodu yedi satır içeriyor ve bazıları diğerlerinden daha girintili yazılmıştır. Tüm bunlar sekme olmadan da yazılabilir, aşağıdaki gibi: www.nakov.com Page 50 / 151 C# İle Bilgisayar Programlama Temelleri class HelloCSharp { static void Main() { System.Console.WriteLine(“Merhaba C#!”); } } veya aynı satır üzerinde: class HelloCSharp{static void Main(){System.Console.WriteLine ( “Merhaba C#!”);}} ve hatta şöyle: { HelloCSharp class static void Main() { System . Console.WriteLine(“Merhaba C#!”) ;} } „Programlarınızın biçimlendirilmemiş kod içermesine asla izin vermeyin! Bu program okunabilirliğini ciddi olarak azaltır ve kodun sonraki değişiklikleri için zorluklara yol açar.” Yukarıdaki örnekler tam da biçimlendirilmiş kod gibi derlenir ve çalışır, ancak okunması ve anlaması daha zordur, ve bu nedenle zor değiştirmesi ve bakımı daha zordur. www.nakov.com Page 51 / 151 C# İle Bilgisayar Programlama Temelleri Başlıca Biçimlendirme Kuralları Kodumuzu doğru biçimlendirmek istiyorsak, girintilerle ilgili bazı önemli kurallara uymalıyız: • Yöntem- • Yöntem • Açılış kıvırcık • Kapanış • Bütün sınıf • Değişken • Yöntem adları lere sınıf içeriğine parante- kıvırcık pa- adları büy- adları küçük büyük harfle tanımının yöntem zi { ken- rantezi } ken- ük harfle harfle başlamalıdır. içinde girin- tanımının di satırında di satırında başlamalıdır; başlamalıdır; başlamalıdır; ti verilir (bir içinde gi- olmalıdır olmalıdır ve il- veya daha rinti verilir; ve belirttiği gili açılış pa- fazla [Tab] yöntem rantezinin tam karakteri ile veya sınıfın dikey olarak sağa doğru tam altına altına (aynı hareket etti- yerleştirilmiş girinti ile) riniz); olmalıdır; yerleştirilmiş olmalıdır; Kod girintileri çok basit bir kuralı izler: bir kod parçası başka bir kod parçasının mantıksal olarak içerisinde olduğunda, tek bir [Tab] ile sağa (taşınır) girintili olur. Örneğin, bir yöntem, bir sınıfın içerisinde tanımlanmış ise, (sağa doğru hareketli) girintili olur. Aynı şekilde, bir yöntemin gövdesi bir başka yöntemin içerisindeyse de girinti verilir. Bunu basitleştirmek için, “{“ karakterine her rastladığımızda kapanış “}” karakterine kadarki tüm kodun sağda girintili olacağını varsayabiliriz. www.nakov.com Page 52 / 151 C# İle Bilgisayar Programlama Temelleri Dosya Adları Sınıf Adlarına Karşılık Gelir Her C# birkaç programı sınıf bir veya tanımından C# Dili ve .NET Platformu C# Dili C# ilk sürümü 1999 ve 2002 C# modern, genel-amaçlı, nesne-yönelimli, yüksekseviyeli bir programlama dilidir. Sözdizimi C ve C++ benzerdir, ancak bu dillerdeki birçok özellik programlamayı kolaylaştıracak şekilde dili sadeleştirmek amacıyla C# tarafından desteklenmez. yılları arasında Microsoft oluşur. Her sınıfın tanımlı olduğu tarafından geliştirildi ve resmen dosyanın karşılık .NET platformunun bir parçası gelen bir isimle ve .cs uzantısına olarak 2002 yılında piyasaya sahip olacağı kabul edilir. Bu çıkarıldı. gereklerin yerine getirilmemesi programlamaya yeni bir kalite halinde, yaklaşımı devam sınıf adına program çalışmaya edecektir, ancak .NET Platformu sağlayarak, “sanal makine” ve “yönetilen kod” kodda gezinmek zor olacaktır. kavramlarına Örneğimizde, sınıf HelloCSharp Windows için daha kolay yazılım olarak geliştirme yapılmasını hedefliyor. adlandırılmıştır sonuç olarak cs bir adlı kodu ve HelloCSharp. dosyada kaydetmek O dayalı zamanlarda Java olarak dili ve kaynak platformu yazılım geliştirmenin gerekir. tüm alanlarında büyük başarı kazanmıştı; C# ve .NET Microsoft’un Java teknolojisine karşılık doğal tepkisi olmuştur. C# programları sınıfların ve diğer türlerin tanımlarını içeren .cs uzantılı bir yada birkaç dosyadan oluşur. Bu dosyalar C# derleyicisi (csc) tarafından çalıştırılabilir koda derlenir, ve bunun bir sonucu olarak aynı isimde ama farklı bir uzantıya (.exe veya .dll) sahip dosyalar içinde assembly oluşturulur. Örneğin HelloCSharp.cs derleyeceksek, HelloCSharp. exe adında bir dosya elde ederiz (bazı ek dosyalar da oluşturulur, ancak şu anda biz onları tartışmayacağız). Derlenen kod bilgisayarımızda herhangi bir başka program gibi çalıştırabilir (üzerine çift tıklayarak). Derlenmiş C# kodu (örneğin HelloCSharp.exe) .NET Platformu’na sahip olmayan bir bilgisayarda çalıştırmaya çalışırsak, bir hata iletisi alırız. www.nakov.com Page 53 / 151 C# İle Bilgisayar Programlama Temelleri Anahtar Sözcükler Programlama yapılarını oluşturmak için C# şu anahtar sözcükleri kullanır (liste Mart 2013 tarihli MSDN’den alınmıştır ve tam olmayabilir): abstract case continue else finally if is object protected sealed struct typeof using as base Bool break byte catch decimal enum fixed implicit lock operator public short switch uint virtual char default event float in long out readonly sizeof this ulong void checked delegate explicit For Int namespace override ref stackalloc throw unchecked volatile class do extern foreach interface new params return static true unsafe while const double false goto internal null private sbyte string try ushort C# dilinin ilk versiyonunun yaratılmasından beri anahtar sözcüklerin hepsi kullanılmıyor. Bazıları sonraki sürümlerinde eklenmiştir. C# ana program elemanları arasında (anahtar sözcüklerin yardımı ile tanımlanan ve kullanılan) sınıflar, yöntemler, işleçler, ifadeler, şartlı ifadeler, döngüler, veri türleri, istisnai durumlar ve birkaç diğerleri vardır. Bu kitabın önümüzdeki birkaç bölümlerinde, yukarıdaki tabloda verilen anahtar sözcüklerin çoğunun kullanımı ile birlikte detaylı olarak tüm bu programlama yapılarını gözden geçireceğiz. Otomatik Bellek Yönetimi .NET Platformu’nun en büyük avantajlarından biri yerleşik otomatik bellek yönetimidir. Nesneler için elle bellek ayırmak ve daha sonra uygun bir zamanda belleği serbest bırakmak gibi karmaşık bir görevden programcıları korur. Bu önemli ölçüde geliştiricinin verimliliğini ve C# ile yazılmış programların kalitesini artırır. www.nakov.com Page 54 / 151 C# İle Bilgisayar Programlama Temelleri .NET Platformu’nda, bellek yönetimi ile ilgilenmek üzere CLR özel bir bileşene sahiptir. Buna “çöp toplayıcı” (otomatik bellek temizleme sistemi) denir. Çöp toplayıcının başlıca şu görevleri vardır: değişkenler için ayrılan belleğin artık kullanılmayacağı zamanı kontrol etmek, o belleği serbest bırakmak ve yeni nesnelerin tahsisi için kullanılabilir hale getirmek. „Dikkat edilmesi gereken önemli bir nokta, bellekte kullanılmayan nesnelerin (örneğin yerel değişkenler) hangi anda temizlenmiş olacağı tam olarak belli değildir. C# dilinin özelliklerine göre, belirli bir değişken kapsam dışına alındıktan sonraki bir anda bu olur, ancak herhangi bir zaman sonra mı, yoksa mevcut bellek normal programın çalışması için yetersiz olduğunda mı olduğu belirtilmemiştir.” Ortamdan ve Programlama Dilinden Bağımsızlık Farklı .NET dilleri kullanan programcılar kolayca kendi kodlarını değiş tokuş yapabilir. Örneğin C# programcısı başka bir programcı tarafından yazılmış VB.NET kodu, Managed C++ kodu veya F# kodu kullanabilir. Bunu mümkün kılan farklı .NET dillerinde yazılmış programların veri türleri, yürütme altyapıları ve derlenmiş kodlarının (assembly) ortak bir sistemi paylaşmasıdır. .NET teknolojisinin büyük bir avantajı, farklı işletim sistemleri ve donanım aygıtları üzerinde, sadece bir kez yazılmış ve derlenmiş olan kodu çalıştırma yeteneğidir. Windows ortamında bir C# programını derledikten sonra onu Windows, Windows Mobile Windows RT veya Linux altında çalıştırabiliriz. Microsoft .NET Platformu’nu resmi olarak sadece Windows, Windows Mobile ve Windows Phone için destekliyor, ancak diğer işletim sistemleri üzerinde .NET uygulanmasını sunan üçüncü şahıslara ait sağlayıcılar da vardır. www.nakov.com Page 55 / 151 C# İle Bilgisayar Programlama Temelleri Common Language Runtime (CLR) – .NET’in Kalbi .NET Platformu kullanıma hazır C# dili, CLR ve birçok yardımcı araç ve kütüphaneleri içerir. .NET Platformu’nun merkezinde yönetilen kodun (MSIL kod) yürütmesini kontrol eden ortam – Common Language Runtime (CLR) vardır. Ortak Dil Çalışma Platformu olarak da adlandırılan CLR, .NET altyapısında programların çalışmasını kontrol eden ve işletim sistemi ile programın arasında yer alan arabirimdir. Normalde yazılan kodlar makine diline çevrilir ve işletim sistemi ile direkt bağlantı kurup çalışırdı. Eğer platformdan bağımsız bir ortam istiyorsak, ihtiyaç duyulan şey CLR olur, hangi platformda iseniz (Linux, Mac, Windows) CLR bu noktada devreye girer ve .NET programlarını farklı platformlarda işletim sistemine göre çalıştırır. Farklı donanım platformları ve işletim sistemlerinde .NET programlarının yürütülmesini sağlar. .NET Framework’u Nasıl Edineceğim? .NET Framework için uygulama geliştirmek istiyorsanız,işletim sisteminize .NET çalıştırma ortamını kurmanız gerekiyor. NET Framework yüklemek için, Microsoft’un web sitesinden (http://download.microsoft. com) indirmeniz gerekir. Son sürümünü indirmek ve kurmak en iyisidir. Bu ortamı, Java uygulamalarını çalıştırmak için gerekli olan Java Runtime Environment (JRE) gibi düşünebilirsiniz. .NET Platformu iki ayrı kurulum dosyası halinde, ücretsiz sunuluyor. www.nakov.com .NET’in Çekirdek Kurulumu (21MB) Bu kurulum ile bilgisayarınızda bir metin editörü açıp kodunuzu yazabilir, gelen derleyiciler ile derleyip uygulamanızı sınayabilirsiniz. Metin editörü programın kaynak kodunu yazmak için ve bir dosyaya kaydetmek için kullanılır. Bundan sonra, kod derlenir ve çalıştırılır. Birçok metin düzenleme programları vardır. Kullanabileceğiniz Windows’un yerleşik Notepad (çok temel ve zahmetlidir) veya Notepad++ (notepadplus.sourceforge. net) veya pspad (www.pspad.com) gibi daha iyi bir ücretsiz bir metin editörü. Ancak bu kurulum, geliştiriciler için değil, daha çok dağıtım sonrası uygulamanızın çalışacağı sistemler için uygundur. .NET uygulamaları için gerekli çalışma zamanı ortamını, web uygulamalarının sunulabilmesi için gerekli olan Web sunucu (IIS) eklentilerini ve desteklenen temel dillerin derleyicilerini sunmaktadır. Bir yazılım geliştiricinin bunlardan daha fazlasına ihtiyacı vardır. Hele de uygulama geliştireceği ortamda herhangi bir deneyimi yoksa. Bu nedenle ikinci bir seçenek sunuluyor. Page 56 / 151 C# İle Bilgisayar Programlama Temelleri .NET Framework SDK (134 MB) Hangi İşletim Sistemlerinde Çalışıyor? SDK yani Software Development Kit, çekirdek kurulumu içeriğinden daha kapsamlı bir kurulumdur. Peki, 134 MB’lik kurulumda fazladan neler var: Faydalı araçlar, hata ayıklayıcılar, SQL Server’ın hafif versiyonu MSDE, hızlıca başlamanızı temin edecek QuickStart Tutorials, örnek uygulamalar ve devasa dokümantasyon. Organizasyonu ve disiplini ile göz kamaştıran bir dokümantasyon olduğunu kullanmaya başladıkça çok iyi anlayacaksınız. Bu iki kurulumu da ücretsiz olarak Microsoft’un sitesinden indirebilirsiniz. Şu anda .NET Framework istemci uygulamaları Windows 98/Me/NT4/2000/XP/Server 2003 işletim sistemlerinde çalışabiliyor. Ancak sunucu davranışı için Windows 2000 (SP2 ve üstü), Windows XP veya Windows Server 2003 gerekiyor. Windows Server 2003’te .NET Framework kurulmuş oluyor zaten, ayrıca yüklemenize gerek yok. Bu işletim sistemleri dışında ASP.NET sayfalarını (yani .NET’in tarayıcıları ve mobil cihazları hedef alan web uygulamaları) sunamıyorsunuz. Elbette ki bu sunum, Internet Information Server (IIS) da gerektiriyor. Teoride .NET Framework herhangi bir işletim sistemine taşınabilir. Ancak taşınacağı işletim sistemine özgü çalışma zamanı ortamının ve sınıf kütüphanesinin yazılması gerekmektedir. „Başlamadan önce .NET Framework yüklemeniz gerektiğini unutmayın! Aksi takdirde, programı derlemeniz ve çalıştırmanız mümkün olmayacaktır. Windows 8 veya Windows 7 çalıştırıyorsanız, .NET Framework zaten Windows’un bir parçası olarak kurulacaktır.” .NET Teknolojileri .NET Framework uzantıları .NET programlarını geliştirirken yeniden kullanılabilir yazılım bileşenleridir. Kodun yeniden kullanılması yazılım geliştirmeyi önemli ölçüde kolaylaştırır, çünkü ortak sorunlara çözümler sağlar, karmaşık algoritmaların ve teknoloji standartlarının gerçekleştirimlerini sunar. Çağdaş programcı her gün kütüphaneleri ve bileşenleri www.nakov.com kullanır ve bunu yaparak pek çok zahmete girmekten kurtulur. Page 57 / 151 C# İle Bilgisayar Programlama Temelleri Verinin görselleştirilmesi Yazılım teknolojileri .NET teknolojisi Grafik ve diyagramlar şeklinde veriyi görselleştiren yazılım örneğine bakalım. .NET’te yazılmış, grafik çizen bir kütüphaneyi kullanabiliriz. Yapmamız gereken tek şey doğru veri ile giriş yapmaktır, kütüphane bizim için grafiği çizecektir. Bu çok uygun ve verimlidir. Ayrıca, üretim maliyetlerinin azalmasına yol açar, çünkü programcıların ek işlevler üzerinde çalışmaya zaman harcamaları gerekmez (örneğimizde, karmaşık matematiksel hesaplamaları ve grafik kartını kontrol etmeyi içeren çizim çizelgelerini çizmek). Uygulamanın kendisi daha yüksek kalitede olacaktır çünkü kullanılan uzantı bu özel alanda daha fazla deneyime sahip uzmanlar tarafından geliştirilmiş ve desteklenmiş olacaktır. Yazılım teknolojileri yazılım geliştirme alanında bazı spesifik problemleri ele alan sınıflar, modüller, kütüphaneler, programlama modelleri, araçları, şablonlar ve en iyi uygulamalardan oluşur. Web teknolojileri, mobil teknolojiler, bilgisayar grafiği için teknolojiler ve .NET veya Java gibi bazı platformlar ile ilgili teknolojiler gibi genel yazılım teknolojileri mevcuttur. .NET teknolojisi .NET sınıfları, kütüphaneler, araçlar, standartlar ve diğer programlama araçlarının bir topluluğudur ve belirli bir uygulama türünü yaratmak için gerekli olan teknolojik çerçeveyi belirleyen kurulu geliştirme modelleridir. .NET geliştirirken farklı alanlarda hizmet veren birçok .NET teknolojisi kullanabiliriz. Tipik örnekler şöyledir: Dinamik Web uygulamalarını hızlı ve kolay oluşturan Web teknolojileri (ASP.NET ve ASP.NET MVC gibi) ve Internet üzerinde çalışan zengin kullanıcı arayüzlü multimedya uygulamalarının kurulmasını mümkün kılan .NET mobil teknolojileridir (WinJS gibi). Bir başka örnek de ADO.NET ile verilebilir. İlişkisel veritabanlarına (Microsoft SQL Server ve MySQL gibi) erişim için standart bir yaklaşım sunan bir teknolojidir. www.nakov.com Page 58 / 151 C# İle Bilgisayar Programlama Temelleri Microsoft dışındaki yazılım geliştiriciler tarafından geliştirilen bazı teknolojiler yaygın hale gelmiş ve sonuç olarak teknoloji standartları olmuşlardır. Bazıları Microsoft tarafından fark edilmiş ve daha sonra .NET Framework’un sonraki versiyonlarına eklenmiştir. Bu şekilde, .NET Platformu yeni kütüphaneler ve teknolojiler ile sürekli gelişmeye ve genişlemeye devam etmektedir. The Base Class Library - Temel Sınıf Kütüphaneleri .NET kütüphanesi kullanıma hazır, bazı işlevsellikleri sunan .NET sınıflarından oluşan bir topluluktur. .NET Framework’te programcıların işlerini kolaylaştırmak için birtakım hazır kütüphaneler vardır, fakat C# dilinde hazır kütüphaneler mevcut değildir. Örneğin, System.Data.SqlClient sınıfları bir .NET kütüphanesini oluşturmaktadır. Bu sınıflar ADO.NET teknolojisi aracılığıyla bir SQL Server veritabanına bağlanmak için gerekli olan işlevselliği sağlar. .NET Framework birçok teknoloji ve geliştiricilerin kullandığı standart işlevselliği sağlayan temel sınıf kütüphanelerini içermektedir. Bu kütüphanelere Base Class Library deniyor. Temel sınıf kütüphaneleri, uygulamalarınızı geliştirirken size lazım olabilecek birçok servisi ve nesneyi içinde barındıran bir sistemdir. Temel sınıf kütüphaneleri, namespaces (isim alanları) içinde organize edilmişlerdir. 1.System isim alanı: .NET çalışırken gerekli temel sınıfları içerir. Ayrıca diğer tüm sınıf kütüphaneleri de bunun içinde kümelenmiştir. System hiyerarşinin tepesinde bulunur. Örneğin tüm veritabanı işlemleri için kullanılacak sınıf kütüphanesi “System.Data” dır. Bu sınıf kütüphanesi içindeki SQL ile işlemler için “System.Data.SqlClient” isim alanı mevcuttur. 2.System.Net : HTTP ve ağ protokolleri için kullanılır. 3.System.Xml : XML verileri ile çalışmak için kullanılır. 4.System.IO : Dosyalara bilgi girişi, dosyadan bilgi okuma, I/O işlemleri için kullanılır. 5. System.Windows.Forms : Windows tabanlı uygulamalarda kullanılan zengin grafik arabirimi kontrollerini içerir. www.nakov.com Örneğin, sistem kütüphanesinde matematiksel fonksiyonlar ile çalışan kullanıma hazır sınıflar vardır, logaritma hesaplanması ve trigonometrik fonksiyonlar (System. Math sınıfı) gibi. Başka bir örnek ağlar ile ilgili kütüphanedir (System. Net). Bu kütüphane e-posta göndermek için (System.Net. Mail.MailMessage sınıfını kullanarak) ve İnternet’ten dosya indirmek için (System.Net.WebClient kullanarak) kurulu bir işlevselliğe sahiptir. Page 59 / 151 C# İle Bilgisayar Programlama Temelleri Uygulama Programlama Arayüzü (API) .NET kütüphaneleri ve teknolojileri nesne oluşturarak ve üzerlerinde yöntem çağırarak kullanılır. Programlama kütüphanelerinde herkese ait sınıf ve yöntemlerin bir kümesi Uygulama Programlama Arayüzü veya sadece API olarak bilinir. Örnek olarak .NET API‘ye bakabiliriz, bu bir küme .NET sınıf kütüphanesidir, dilin yeteneklerini genişletir ve üst düzey işlevler ekler. .NET teknolojilerinin hepsi herkese ait (açık) API sunar. Teknolojiler genellikle sadece API olarak adlandırılır ve belirli işlevler ekler. Örneğin: dosyalar ile çalışan API, grafikler ile çalışan API, yazıcılar ile çalışan API, Word ve Excel belgelerini okumak ve oluşturmak için API, PDF belgeleri ile çalışan API, Web geliştirme için API, vb. C# Programlarını Derleme ve Yürütme HelloCSharp.cs Dosyadaki örnek adında bir dosya programı yazın; oluşturun; Şimdi C# ile yazılmış basit örnek derleme programımızı ve çalıştırma- nın zamanı geldi. Bunu başarmak kileri için, yanda- yapmanız gerekir: Konsol tabanlı C# HelloCSharp.exe dosyasını çalıştırın. derleyicisini (csc.exe) kullanarak HelloC- Sharp.cs programını yürütülebilir bir dosya olan HelloCSharp.exe içine derleyin; Şimdi, bunu bilgisayarda yapalım! Örnek programı Windows üzerinde yazmak ve çalıştırmak için gerekenlere ayrıntılı bir göz atacağız. İşte bizim ilk C# programımızın kodu: www.nakov.com Page 60 / 151 C# İle Bilgisayar Programlama Temelleri class HelloCSharp { static void Main() { HelloCSharp.cs System.Console.WriteLine(“Merhaba C#!”); } } Windows Konsolunda C# Programları Oluşturma Öncelikle Komut İstemi olarak bilinen Windows komut konsolunu başlatalım. Windows 7 için bunu Windows Gezgini başlangıç menüsünden yapabilirsiniz: Start -> Programs -> Accessories -> Command Prompt. Yönetici olarak konsolu çalıştırmanız tavsiye edilir. (Komut İstemi simgesine sağ tıklayın ve “Yönetici olarak çalıştır” seçin). Bunu yapmazsanız kullanmak istediğiniz bazı işlemler kısıtlanmış olabilir. Windows 8 için Win8 Başlangıç Ekranından komut istemi simgesine sağ tıkladığınızda “Yönetici olarak çalıştır” komutuna doğrudan ulaşabilirsiniz: www.nakov.com Page 61 / 151 C# İle Bilgisayar Programlama Temelleri Konsolu açtıktan sonra, üzerinde deneme yapacağımız bir dizin oluşturalım. Dizini oluşturmak için md komutunu kullanın ve cd komutuyla içine girin. www.nakov.com Page 62 / 151 C# İle Bilgisayar Programlama Temelleri Dizin IntroCSharp olarak adlandırılacak ve C:\ dizininde bulunacak. Geçerli dizininizi değiştirerek C:\IntroCSharp yapın ve yerleşik Windows metin editörü – Notepad kullanarak yeni bir dosya HelloCSharp.cs oluşturun. Metin dosyası “HelloCSharp.cs” oluşturmak için, konsolda aşağıdaki komutu çalıştırın: notepad HelloCSharp.cs Bu komut yeni bir dosya oluşturulması için onay isteyerek aşağıdaki iletişim penceresi ile Not Defteri’ni başlatacak: Not Defteri böyle bir dosyanın var olmadığı konusunda bizi uyaracak ve bunu oluşturmak isteyip istemediğimizi bize soracaktır. [Evet] tıklayın. Bir sonraki adım, programın kaynak kodunu yeniden yazmak veya sadece Kopyala/Yapıştır ile elde etmektir. www.nakov.com Page 63 / 151 C# İle Bilgisayar Programlama Temelleri [Ctrl+S] tuşuna basarak kaydedin ve [Alt+F4] ile Not Defteri editörünü kapatın. Şimdi C:\IntroCSharp\HelloCSharp.cs dosyasında yazılmış örnek C# programımızın başlangıç kodu bulunmaktadır. Windows Üzerinde C# Programları Derleme Yapmamız gereken kalan tek şey programı derlemek ve çalıştırmaktır. Derleme csc. exe derleyicisi tarafından yapılır. Yapmamız gereken kalan tek şey programı derlemek ve çalıştırmaktır. Derleme csc. exe derleyicisi tarafından yapılır. İlk hatayı aldık – Windows adı “csc” ile yürütülebilir bir dosya veya komut bulamıyor. Bu çok yaygın bir problemdir ve ilk kez C# kullanıyorsanız görünmesi normaldir. Çeşitli nedenlerden dolayı meydana gelir: - .NET Framework yüklü değil; - .NET Framework doğru yüklenmiş, ancak Microsoft.NET\Framework\v4.0.xxx dizini çalıştırılabilir dosyalar için tanımlı olan sistem yoluna eklenmemiş ve Windows csc.exe bulamıyor. www.nakov.com Page 64 / 151 C# İle Bilgisayar Programlama Temelleri İlk problem .NET Framework (bizim durumumuzda - 4.5 versiyonu) yükleyerek kolayca çözülür. Diğer problem sistem yolunu değiştirerek çözülebilecek (daha sonra yapacağız) veya aşağıda şekilde görüldüğü gibi, csc.exe için geçerli tam yolu kullanarak. Bizim durumumuzda, C # derleyicisi için tam dosya yolu C:\ Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe olmuştur (unutmayın ki bu yol yüklü .NET Framework sürümüne bağlı olarak değişebilir). Visual Studio 2012 ile gelen NET 4.5 ve C# 5 “v4.0.30319” adlı bir dizine yükleniyor. Windows Üzerinde C# Programları Derleme ve Çalıştırma Şimdi tam dosya yolunu vererek csc derleyiciyi çağıralım ve ona bir parametre (HelloCSharp.exe) olarak derlemek istediğiniz dosyayı geçelim. csc yürütmesi hatasız tamamlandıktan sonra sonuç olarak aşağıdaki dosyayı elde edersiniz: C:\IntroCSharp\HelloCSharp.exe. Bunu çalıştırmak için, sadece adını yazmanız gerekir. Programın çalıştırılması sonucu “Merhaba, csc yürütmesi hatasız tamamlandıktan sonra sonuç olarak elde edersiniz: C:\IntroCSharp\HelloCSharp.exe. Bunu sadece adını yazmanız gerekir. Programın çalıştırılması C#!” mesajı konsolda basılı görünür. Böylece iyi bir www.nakov.com aşağıdaki dosyayı çalıştırmak için, sonucu “Merhaba, başlangıç yaptık: Page 65 / 151 C# İle Bilgisayar Programlama Temelleri Windows Üzerinde Sistem Yollarını Değiştirme Tam dosya yolunu kullanabilmek için, girmeden Windows komut satırı C# derleyicisini (csc.exe) sistem yoluna klasörü ekleyebilirsiniz. 1.Denetim Masası’nı açın ve “Sistem” seçin. Sonuç olarak bu iyi-bilinen pencere (ekran görüntüsü, Windows 7’den alınmıştır) görüntülenir: www.nakov.com Page 66 / 151 C# İle Bilgisayar Programlama Temelleri Windows 8 biraz farklı görünebilir, ama neredeyse aynıdır: 2.“Gelişmiş sistem ayarlarını” seçin. “Sistem özellikleri” penceresi görünür: www.nakov.com Page 67 / 151 C# İle Bilgisayar Programlama Temelleri 3.“Ortam Değişkenleri” düğmesine tıklayın ve tüm ortam değişkenlerini içeren bir pencere görünür: 4.“Şekilde görüldüğü gibi, Sistem değişkenleri listesinden “Path” seçin ve “Düzenle” butonuna basın. .NET Framework yüklü olduğu dizinin yolunu gireceğiniz küçük bir pencere görünür: www.nakov.com Page 68 / 151 C# İle Bilgisayar Programlama Temelleri Tabii ki, .NET Framework’un nerede yüklü olduğunu bulmak zorundayız. Varsayılan olarak, Windows sistem dizini C:\ Windows\ Microsoft.NET içinde bir yerde bulunur, örneğin: C:\Windows\Microsoft.NET\Framework64\v4.0.30319 Zaten mevcut olan ortam değişkenlerine ek bir yol eklemek için ara olarak bir noktalı virgül (;) koyduktan sonra yol adını bitiştirerek yazarız. „Dikkatli olmalıyız çünkü herhangi bir mevcut sistem yolunu silerseniz, Windows işlevleri veya bazı yüklü yazılım parçaları düzgün çalışmayabilir!” 5. Yolu ayarladıktan sonra, csc.exe çalıştırmayı deneyebilirsiniz, tam yolunu girmeden. Bunu yapmak için, yeni bir cmd.exe (Komut İstemi) penceresi açın (Komut İstemi’ni yeniden başlatmak önemlidir) ve “csc” komutu yazın. C# derleyicisinin sürüm bilgileri ve hiçbir giriş dosyası belirtilmediğine dair bir mesaj görmeniz gerekir. www.nakov.com Page 69 / 151 C# İle Bilgisayar Programlama Temelleri Visual Studio Tümleşik Geliştirme Ortamı (IDE) Şimdiye kadar Windows konsol (Komut İstemi) kullanarak C# programlarının nasıl derleneceğini ve çalıştırılacağını inceledik. Tabii ki, bunu yapmanın daha kolay bir yolu var - şimdiye kadar kullanılan tüm komutları çalıştıran bir tümleşik geliştirme ortamını kullanarak. Geliştirme ortamları (IDE) ile nasıl çalışılacağına ve işimizi nasıl kolaylaştıracaklarına bir göz atalım. Tümleşik Geliştirme Ortamları Önceki örneklerde, tek bir dosyadan oluşan bir programın nasıl derleneceği ve çalıştırılacağı incelenmişti. Genellikle programlar birçok dosyadan oluşur, hatta bazen on binlerce. Tek bir dosyadaki programı metin editöründe yazmak, komut isteminden derlemek ve çalıştırmak kolaydır, ancak büyük bir proje için tüm bunları yapmanın çok karmaşık ve zaman alıcı bir çaba olabileceği kanıtlanmıştır. Karmaşıklığı azaltan, yazılım uygulamalarını yazmayı, derlemeyi ve yürütmeyi kolay kılan tek bir araç vardır – Tümleşik Geliştirme Ortamı (IDE) diye adlandırılır. Geliştirme ortamları genellikle ana geliştirme işlevlerine birçok eklemeler getirir, hata ayıklama, birim testi, genel hataları tespit etme, bir depoya erişim sağlama ve diğerleri gibi. Visual Studio Nedir? Visual Studio, Windows ve .NET Framework platformu üzerinde yazılım uygulamaları geliştirmek için güçlü bir tümleşik ortamdır (IDE). Visual Studio (VS), farklı programlama dillerini (örneğin, C#, VB.NET ve C++) ve farklı yazılım geliştirme teknolojilerini (Win32, COM, ASP.NET, ADO.NET Entity Framework, Windows Forms, WPF, Silverlight Windows Store uygulamaları ve daha birçok Windows ve .NET teknolojileri) destekliyor. Kod yazma, derleme, yürütme, hata ayıklama ve uygulamaları test etme, kullanıcı arayüzü tasarımı (formlar, diyaloglar, web sayfaları, görsel kontroller ve diğerleri), veri ve sınıf modelleme, testleri ve yüzlerce diğer fonksiyonları çalıştırmak için güçlü bir bütünleşik bir ortam sunuyor. www.nakov.com Page 70 / 151 C# İle Bilgisayar Programlama Temelleri IDE “tümleşik geliştirme ortamı” anlamına gelir - kod yazmak, derlemek, çalıştırmak, test etmek, hata ayıklamak vb. için her şeyin tek bir yerde entegre edildiği bir araçtır. Visual Studio tipik bir geliştirme IDE örneğidir. .NET Framework 4.5 Visual Studio 2012 (VS 2012) ile birlikte gelir. Bu Mart 2013 itibariyle en son Visual Studio sürümüdür. C# 5, .NET 4.5 ve Windows 8 ile uygulama geliştirmek için tasarlanmıştır. VS 2012 ticari bir üründür, ancak Visual Studio Ekspres 2012 adı verilen ücretsiz bir sürümü de vardır. http://microsoft.com/visualstudio/downloads adresindeki Microsoft web sitesinden ücretsiz olarak indirebilirsiniz. Birkaç tane Visual Studio 2012 Ekspres sürümü bulunmaktadır (masaüstü, Web, Windows 8 ve diğerleri için). Bu kitabın içeriğinde bulunan C # kodunu yazmak istiyorsanız, Masaüstü için Visual Studio 2012 Ekspres kullanabilirsiniz yada bulunduğunuz Üniversiteden veya kurumdan tam Visual Studio ücretsiz lisansına sahip olup olmadığınızı kontrol edin. Birçok akademik kurum Windows, Visual Studio, SQL Server ve diğer geliştirme araçlarını ücretsiz lisanslamak için öğrencilerine Microsoft DreamSpark hesapları sağlamaktadır. Eğer öğrenci iseniz, üniversite yönetiminize DreamSpark programını sorun. Dünyanın her tarafında çoğu üniversite bu programın üyeleridir. Bu kitapta VS Ekspres 2012’nin yalnızca en önemli işlevlerinden biri göz önüne alınacaktır – kodlama ile ilgili olanlar. Program oluşturma, düzenleme, derleme, yürütme ve hata ayıklama için fonksiyonları bulunmaktadır. Bu kitapta örnekler için VS 2010 ve VS 2008 gibi eski Visual Studio sürümlerinin de kullanılabilir olduğunu unutmayın, ancak kullanıcı arayüzleri biraz farklı görünebilir. Örneklerimiz Windows 8 üzerinde VS 2012’ye dayanmaktadır. Bir örnek ile devam etmeden önce, Visual Studio 2012’nin görsel arayüz yapısına daha detaylı bir göz atalım. Windows bunun ana parçasıdır. Her birinin uygulamaların geliştirilmesine bağlı farklı bir işlevi vardır. Visual Studio 2012’nin varsayılan kurulum www.nakov.com Page 71 / 151 C# İle Bilgisayar Programlama Temelleri Visual Studio’nun araştıracağımız birkaç penceresi vardır: - Başlangıç Sayfası - başlangıç sayfasından son projelerimizden herhangi birini rahatlıkla açabiliriz veya yeni bir proje başlatabiliriz, ilk C# programımızı oluşturmak veya C# kullanımı hakkında yardım almak için. - Kod Editörü - programın kaynak kodunu tutar ve birden fazla dosyanın açılmasını ve düzenlenmesini sağlar. - Hata Listesi - geliştirdiğimiz programdaki hataları (varsa) gösterir. Daha sonra C# programlarımızı Visual Studio içinden derlerken bu pencereyi nasıl kullanacağımızı öğreneceğiz. - Çözüm Gezgini - hiçbir proje yüklenmediğinde, bu pencere boştur, ancak C# programcıları olarak hayatımızın bir parçası haline gelecek. Projemizin yapısını gösterir – C# kodu olsun olmasın, içerdiği tüm dosyaları, resimleri www.nakov.com Page 72 / 151 C# İle Bilgisayar Programlama Temelleri veya diğer bazı tür kod ve kaynakları. - Özellikler - Geçerli nesnenin özelliklerinin bir listesini tutar. Özellikler esas olarak bileşen tabanlı programlamada kullanılır, örneğin WPF, Windows Store veya ASP.NET Web Forms uygulaması geliştirirken. Visual Studio’nun yardımcı işlevsellikleri ile ilgili diğer birçok penceresi vardır ama biz şu anda bunları gözden geçirmeyeceğiz. www.nakov.com Page 73 / 151 C# İle Bilgisayar Programlama Temelleri Yeni bir C# Projesi Oluşturma Visual Studio ile başka bir şey yapmadan önce, yeni bir proje oluşturmak veya varolan bir projeyi yüklememiz gerekir. Tasarlanan proje çok sayıda dosyayı mantıklı bir şekilde gruplandırır, bir yazılım uygulaması veya sistemi uygulamak üzere. Her yeni program için ayrı bir proje oluşturmanız önerilir. Aşağıdaki adımları izleyerek Visual Studio’da bir proje oluşturabilirsiniz: - File -> New Project … - “New Project” iletişim kutusu görünür ve oluşturabileceğimiz projelerin tüm farklı türlerini listeler. Bir proje türünü seçin (örneğin Konsol Uygulaması veya WPF Uygulaması), programlama dili (örneğin C# veya VB.NET) ve .NET Framework sürümü (örneğin .NET Framework 4.5) ve projenize bir ad verin (bizim durumumuzda “IntroToCSharp”): • Konsol Uygulaması’nı seçin. Konsol uygulamaları varsayılan girdi ve çıktı olarak konsolu kullanan programlardır. Veri klavye ile girilir ve sonuç basılacak olduğunda www.nakov.com Page 74 / 151 C# İle Bilgisayar Programlama Temelleri bu, konsolda görünür (program penceresinde ekrandaki metin olarak). Konsol uygulamalarının yanı sıra, bir grafik kullanıcı arayüzü ile (örneğin Windows Forms veya WPF) de uygulamalar, Web uygulamaları, web hizmetleri, mobil uygulamalar, Windows Store uygulamaları, veritabanı projeleri ve diğerlerini de oluşturabiliriz. • Projenin adını “Name” alanına girin. Bizim durumumuzda IntroToCSharp adını seçin. • [OK] düğmesine basın. Yeni oluşturulan proje şimdi Çözüm Gezgini’nde gösterilir. Ayrıca, program kodunu içeren ilk dosyamız da, otomatik olarak eklenir. Program.cs olarak adlandırılmıştır. Dosyalar, sınıflar, yöntemler ve programın diğer elemanları için anlamlı isimler vermek çok önemlidir, böylece onları kolayca bulabiliriz ve kodda gezinebilirsiniz. Anlamlı bir isim demek şu soruya cevap vermesi anlamına gelir: “Bu dosya/sınıf/yöntem/değişkenin oluşturulma amacı nedir?” ve kodun nasıl çalıştığını anlamaları için geliştiricilere yardımcı olur. Alıştırmalar bölümünün 3.problemini çözüyor olsanız da, bir isim olarak Problem3 vermeyin. Proje/sınıflarınızı amacına göre adlandırın. Projeniz iyi adlandırılmıştır ise, birkaç ay veya bir yıl sonra ne yapmak için tasarlandığını açmadan ve içine bakmadan açıklamak mümkün olacaktır. Problem3 bu projenin aslında ne yaptığı hakkında hiçbir şey söylemez. Program.cs dosyasını yeniden adlandırmak için, Çözüm Gezgini’nde üzerine tıklayın ve “Rename” seçeneğini seçin. C# programımızı içeren ana dosyayı HelloCSharp.cs olarak adlandırabiliriz. Dosyayı yeniden adlandırmayı dosya Çözüm Gezgini’nde seçiliyken [F2] tuşu ile de yapılabiliriz: www.nakov.com Page 75 / 151 C# İle Bilgisayar Programlama Temelleri Sınıf adını bunun yanı sıra dosya adını yeniden adlandırmak isteyip istemediğimizi bize soran bir diyalog penceresi görünür. “Evet” seçeneğini seçin. www.nakov.com Page 76 / 151 C# İle Bilgisayar Programlama Temelleri Yapmamız gereken tek şey Main() yöntemi için kod eklemektir. Varsayılan olarak, HelloCSharp.cs kodu yüklü ve düzenleme için hazır olmalıdır. Değilse, Çözüm Gezgini’nde HelloCSharp.cs dosyasına çift tıklayarak onu yükleriz. Aşağıdaki kaynak kodu girin: Kaynak Kodun Derlenmesi Visual Studio’da derleme işlemi birkaç adım içerir: • Sözdizimi hatalarının kontrolü; • Eksik kütüphaneler gibi diğer hataların kontrolü; • Çalıştırılabilir bir dosya içine (.NET assembly) C# kodunun dönüştürülmesi. Konsol uygulamaları için bu bir .exe dosyasıdır. www.nakov.com Page 77 / 151 C# İle Bilgisayar Programlama Temelleri Visual Studio’da bir dosyayı derlemek için, [F6] tuşuna veya [Shift + Ctrl + B] tuşuna basın. Genellikle, hatalar biz hâlâ yazarken ya da en geç derlerken programcının dikkatini çekmek için kırmızı renkle altı çizilidir. Görünür olması durumunda “Hata Listesi” penceresinde listelenir (Eğer görünür değilse, Visual Studio’nun “Görünüm” menüsünden gösterebiliriz). Projemizde en az bir hata varsa, bu “Hata Listesi” penceresinde küçük kırmızı bir “x” ile işaretlenmiş olacaktır. Dosya adı, satır numarası ve proje adı – gibi sorun hakkındaki kısa bilgiler her hata için görüntülenir. “Hata Listesi”nde listelenen hatalardan biri üzerine çift tıklarsanız, Visual Studio otomatik olarak hatanın oluştuğu kod dosyasına ve satıra sizi götürecektir. Yukarıdaki ekran görüntüsünde sorun, “using System” yerine “using Systema” yazmış olmamızdı. Projeyi Başlatma Projeyi başlatmak için, basın [Ctrl + F5] basın ( [Ctrl] tuşuna basılı tutarak ve aynı anda [F5] tuşuna basarak). Program başlayacak ve sonucu takiben “Devam etmek için herhangi bir tuşa basın...” mesajı konsolda görüntülenir: Son mesaj program tarafından üretilen sonucun bir parçası değildir. Programın yürütmesi bittikten sonra Visual Studio tarafından üretilen bir hatırlatma mesajıdır ve bize sonucunu görmek için zaman verir. Sadece [F5] tuşuna basarak programı çalıştırırsanız, bu mesaj görünmez ve sonuç göründükten sonra anında kaybolur, çünkü program kendi yürütmesini bitirmiş olacaktır, ve pencere kapanacaktır. Her zaman [Ctrl+F5] tuşuna basarak konsol uygulamalarını başlatmamızın nedeni budur. Tüm proje türleri yürütülebilir değildir. Bir C# projesini yürütmek için, bu bölümde daha önce anlatılan şekilde bildirilmiş bir Main() metotunu gerçekleştiren en az bir sınıfın olması gerekir. www.nakov.com Page 78 / 151 C# İle Bilgisayar Programlama Temelleri Programda Hata Ayıklama Program aynı zamanda böcek (bug) olarak da bilinen hataları içerdiğinde, onları bulmanız ve kaldırmanız gerekir, yani programın hatalarını ayıklamak zorundayız. Hata ayıklama işlemi aşağıdaki adımları içerir: - - - - Sorunları (bug) farketmek; Sorunlara neden olan kodu bulmak; Program düzgün çalışacak şekilde kodu düzeltmek; Değişiklikleri yaptıktan sonra programın beklendiği gibi çalıştığından emin olmak için test etmek. Program düzgün çalışmaya başlayana kadar bu işlem birkaç kez tekrar edilebilir. Sorunu fark ettikten sonra, ona neden olan kodu bulmamız gerekir. Visual Studio her şeyin planlandığı gibi çalışıp çalışmadığını adım adım kontrol etmemize izin vererek bize yardımcı olabilir. Belirlenen pozisyonlarda programın yürütülmesini durdurmak için kesme noktaları (breakpoint) yerleştirebilirsiniz. Kesme noktası programın bir satırı ile ilişkilidir. Program kesme noktaları ile ilişkili satırlar üzerinde yürütmesini durdurur, kalan kodun adım adım yürütülmesine izin verir. Her adımda mevcut değişkenlerin değerlerini kontrol edebilir ve hatta değiştirebiliriz. Hata ayıklama, programı bir tür yavaş hareketlerle adım adım yürütmeyi gerektirir. Kolayca kod detaylarını anlamak için fırsat verir ve tam olarak nerede ve neden hata oluştuğunu görmemizi sağlar. Kesme noktalarının nasıl kullanılacağını göstermek için, programımızda kasıtlı bir hata yaratalım. Yürütme sırasında bir ayrıcalık yaratan satırı programa ekleyeceğiz (“İstisnai Durum İşleme” Bölümü’nde ayrıcalıklara detaylı göz atacağız). Şimdilik aşağıdaki şekilde programımızı düzenleyelim: www.nakov.com Page 79 / 151 C# İle Bilgisayar Programlama Temelleri HelloCSharp.cs class HelloCSharp { static void Main() { throw new System.NotImplementedException( “Intended exception.”); System.Console.WriteLine(“Hello C#!”); } } [Ctrl + F5] ile programı tekrar başlattığınızda bir hata alırsınız ve bu konsolda basılacaktır: Kesme noktalarının sorunu bulmada bize nasıl yardımcı olacağını görelim. Main() metotunun açılış parantezini taşıyan satıra imleci götürün ve [F9] basın (bunu yaparak bu satır üzerine bir kesme noktası yerleştiririz). Hata ayıklama modunda yürütüldüğünde, programın orada duracağını belirten bir kırmızı nokta görünür: www.nakov.com Page 80 / 151 C# İle Bilgisayar Programlama Temelleri Şimdi hata ayıklama modunda programı başlatmanız gerekir. D e b u g - > S t a r t Debugging seçin veya [F5] basın. Program başlayacak ve karşılaştığı ilk kesme noktasında anında duracaktır. Satır sarı renkli olacak ve bundan sonra programı adım adım çalıştırabileceksiniz. [F10] tuşu ile bir sonraki satıra geçilir. Satırı yürütmek için bir kez daha [F10] basın. Bu kez, Visual Studio, hatanın oluştuğu satırı ve yanı sıra bununla ilgili bazı ek ayrıntıları belirten bir pencere görüntüler. Verilen bir satır üzerindeyken satır sarı renkli olduğunda, satırdaki kod henüz yürütülmemiştir anlamına gelir. Satırı geçtiğimizde bir kez yürütülür. Eklediğimiz satırda bulunmamıza ve buranın hataya sebep olması gerektiğine rağmen, bu örneğimizde biz hata almadık. www.nakov.com Page 81 / 151 C# İle Bilgisayar Programlama Temelleri Programda sorunun nerede olduğunu bir kez anladıktan sonra, onu kolayca düzeltebilirsiniz. Bunu yapmak için, önce programın yürütülmesi bitmeden durdurmak gerekir. Debug–>Stop Debugging seçin veya [Shift + F5] basın. Bundan sonra sorunlu satırı silin ve [Ctrl + F5] tuşuna basarak (hata ayıklama olmadan) normal modda programı başlatın. Diğer .NET Dilleri C# en popüler .NET dilidir, ancak .NET programlarını yazmak için kullanılan birkaç diğer dil de vardır: - VB.NET - Visual Basic .NET (VB) .NET Framework’te çalışması için adapte edilmiş Basic dilidir. Microsoft Visual Basic 6’dan (Windows 3.1 ve Windows 95 için eski geliştirme ortamı) sonra geldiği kabul edilir. Garip sözdizimi vardır (C# geliştiricileri için), ancak genellikle C# gibi aynı işi yapar, sadece farklı sözdizimiyle. VB.NET’nin var olmasının tek sebebi tarihseldir: VB6’den sonra gelmiştir ve onun kendi sözdizimini devam ettirir. VB6 programcısı olmadığınız sürece önerilmez. - Managed C++ - C++ programlama dilinin .NET Framework için adaptasyonu. Hızlı bir şekilde mevcut C++ kodunu .NET’te kullanılmak üzere dönüştürmek gerekiyorsa yararlı olabilir. Yeni projeler için tavsiye edilmez. Bu kitabın okuyucuları için, C++ deneyime sahip olsanız bile tavsiye edilmez, çünkü .NET programlamayı gereksiz yere karmaşık yapar. - F # - .NET Framework içine işlevsel programlama paradigmasını koymak için bir deneme. (Fonksiyonel programlama gurusu olmadığınız sürece) hiç tavsiye edilmez. - JavaScript - WinJS teknolojisi aracılığıyla Windows 8 (Windows Store) uygulamaları geliştirmek için kullanılabilir. İyi JavaScript becerilerine sahip uzman HTML5 geliştiricileri için iyi bir seçim olabilir. Konsol uygulamalarını www.nakov.com Page 82 / 151 C# İle Bilgisayar Programlama Temelleri Alıştırmalar 1.Microsoft Visual Studio ve Microsoft Developer Network (MSDN) Kütüphanesi Dokümantasyonu’nu yükleyin ve kendinizi alıştırın. 2.Standart .NET API belgelerinden (MSDN Kütüphanesi) System.Console sınıfının tanımını bulun. 3.System.Console.WriteLine() metotunun açıklamasını ve değişik olası parametrelerini MSDN Kütüphanesi’nden bulun. 4.Komut istemini (konsol) ve Visual Studio’yu kullanarak bu bölümdeki örnek programı derleyin ve çalıştırın. 5.Farklı bir selamlama yazdırmak için örnek programı değiştirin, örneğin “İyi günler!”. 6.Konsol üzerinde adınızı ve soyadınızı bastıran bir konsol uygulaması yazın. 7.Konsol üzerinde her biri yeni satırda olmak üzere aşağıdaki sayıları bastıran bir program yazın:1, 101, 1001. 8.Konsol üzerinde geçerli tarih ve zamanı yazdıran bir program yazın. 9.12345 sayısının karekökünü bastıran bir program yazın. 10. 2, -3, 4, -5, 6, -7, 8 dizisinin ilk 100 elemanını bastıran bir program yazın. 11. Konsoldan şimdiki yaşınızı okuyup 10 yıl sonraki yaşınızı bastıran bir program yazın. 12. C# ve .NET Framework arasındaki farkı açıklayın. 13. En popüler programlama dillerinin bir listesini yapın. C# hangi bakımlardan onlardan farklıdır? www.nakov.com Page 83 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 2: Temel Türler ve Değişkenler Bölümün İçindekileri Bu bölümde C# temel türleri ve değişkenleri ile tanışacağız – ne oldukları ve onlarla nasıl çalışılacağı hakkında. Önce veri türlerini dikkate alacağız – tamsayı türleri, gerçek türler ile kayan nokta, Boole, karakter, dize ve nesne türleri. Değişkenler ile devam edeceğiz, özelliklerini, nasıl bildirildiklerini, bir değerin nasıl atandığını, ve değişkenlere ilk değer atamanın yani başlatmanın ne olduğunu anlatacağız. İki çeşit C# veri türü ile tanışacağız – değer türleri ve referans türleri. Nihayet değişik türdeki değişmezleri ve onların kullanımını inceleyeceğiz. Değişken Nedir? Tipik bir program yürütme (çalıştırma) sırasında değişen çeşitli değerleri kullanır. Örneğin, kullanıcı tarafından girilen değerler üzerinde bazı hesaplamalar gerçekleştiren bir program oluşturabiliriz. Herhangi bir kullanıcı tarafından girilen değerler, açıktır ki, başka bir kullanıcı tarafından girilenlerden farklı olacaktır. Bu programı oluştururken, programcı, girdi olarak sunulacak değerlerden hangisinin girileceğini bilmiyor anlamına gelir, ve bunun gerektirdiği kullanıcı tarafından girebilen tüm olası değerleri işlemek için hesaplama yapmak demektir. Bir kullanıcı hesaplama işleminde kullanılacak yeni bir değer girdiğinde, bilgisayarın rasgele erişim belleğinde (geçici olarak) onu koruyabilirsiniz. Belleğin bu bölümündeki değerler yürütme boyunca değişebilir ve bu nedenle – değişkenler olarak adlandırılır. Veri Türleri Veri türleri benzer özelliklere sahip değerlerin kümeleridir (aralıklarıdır). Örneğin byte türü [0 ... 255] aralığında tamsayılar kümesini belirtir. www.nakov.com Page 84 / 151 C# İle Bilgisayar Programlama Temelleri Özellikleri Veri türleri aşağıdakilerle karakterize edilir: • İsim – örneğin, int; • Boyut (ne kadar bellek kullandıkları) - örneğin, 4 bayt; • Varsayılan değer - örneğin 0. Türler C# temel veri türleri aşağıdaki türlerle belirlenmiştir: • Tamsayı türleri – sbyte, byte, short, ushort, int, uint, long, ulong; • Gerçek kayan nokta türleri – float, double; • Ondalık hassasiyette gerçek tür – decimal; • Boole türü – bool; • Karakter türü – char; • Dize – string; • Nesne türü – object. Bu veri türlerine temel türler denir (yerleşik türler), çünkü C# diline düşük seviyede gömülüdürler. Aşağıdaki tablo, yukarıda belirtilen veri türleri için geçerli veri aralıklarını ve varsayılan değerlerini gösteriyor: www.nakov.com Page 85 / 151 C# İle Bilgisayar Programlama Temelleri Veri Türü Varsayılan Değer En Küçük Değeri En Büyük Değeri byte 255 sbyte 0 -128 short 0 -32768 ushort int uint long ulong float double decimal bool char object string 0 0 0 0u 0L 0u 0.0f 0.0d 0.0m false ‘\u0000’ null null 0 0 -2147483648 0 127 32767 65535 2147483647 4294967295 -9223372036854775808 9223372036854775807 0 18446744073709551615 ±1.5×10-45 ±3.4×1038 ±1.0×10-28 ±7.9×1028 ±5.0×10-324 İki olası değer: true ve false ±1.7×10308 ‘\u0000’ ‘\uffff’ - - - - C# ve .NET Türleri Arasındaki İlişki C# temel veri türleri ile .NET Framework’te bulunan ortak tür sisteminin (Common Type System: CTS) türleri arasında doğrudan ilişki vardır. Örneğin, C# int türü CTS System.Int32 türüne ve VB.NET dilinde Integer türüne karşılık gelirken, C# long türü CTS System.Int64 türüne ve VB.NET dilinde Long türüne tekabül etmektedir. .NET Framework ortak tür sistemi (CTS) sayesinde, farklı programlama dilleri arasında uyumluluk vardır (örneğin, C#, Managed C++, VB.NET ve F# gibi). Aynı nedenle C#’de bulunan int, Int32 ve System.Int32 türleri aslında tek ve aynı veri türü için gösterilen – işaretli 32-bit tamsayılar için farklı takma adlardır. Tamsayı Türleri Tamsayı türleri tamsayı numaralarını temsil eder ve sbyte, byte, short, ushort, int, uint, long ve ulong olarak tanımlıdır. Şimdi bunları teker teker inceleyelim. www.nakov.com Page 86 / 151 C# İle Bilgisayar Programlama Temelleri sbyte byte sbyte türü 8-bitlik işaretli tamsayıdır. onun için olası değerlerin sayısı 28 dir, yani tümüyle 256 değer alabildiği anlamına gelir, ve her ikisi de, pozitif ve negatif olabilir. sbyte içinde saklanabilir en düşük değer, Sbyte.MinValue = -128 ( -27 ), ve en büyük değer Sbyte.MaxValue = 127 ( 27 – 1 ) ‘dir. Varsayılan değeri 0 sayısıdır. byte türü 8-bitlik işaretsiz tamsayı türüdür. Sadece negatif olmayan 256 farklı tamsayı değeri ( 28 ) vardır. Varsayılan değeri 0 sayısıdır. Minimum değeri Byte.MinValue = 0, ve en yüksek değeri Byte. MaxValue = 255 ( 28 – 1 ) ‘dir. short short türü 16-bitlik işaretli tamsayıdır. Minimum değeri Int16. MinValue = -32768 ( -215 ), ve maksimum değeri Int16.MaxValue = 32767 ( 215 – 1 ) ‘dir. short türü için varsayılan değer 0 sayısıdır. ushort ushort türü 16-bitlik işaretsiz tamsayıdır. Saklayabildiği en küçük değer UInt16.MinValue = 0 ve en büyük değer UInt16.MaxValue = 65535 ( 216 – 1 ) ‘dir. Varsayılan değeri 0 sayısıdır. int Değerlendireceğimiz sonraki tamsayı türü int’dir. 32-bitlik işaretli tamsayıdır. Anlaşıldığı gibi, bit sayısı arttıkça bir türün saklayabileceği olası değerler de artmaktadır. int için varsayılan değer 0 ‘dır. Minimum değeri Int32.MinValue = -2,147,483,648 ( –231 ), ve maksimum değeri Int32.MaxValue = 2,147,483,647 ( 231 – 1 ) ‘dir int türü programlamada en sık kullanılan türdür. Programcılar genellikle tamsayılar ile çalışırken int kullanır, çünkü bu tür 32-bit mikroişlemci için doğaldır ve günlük yaşamda gerçekleştirilen hesaplamaların çoğu için yeterince “büyük”tür. www.nakov.com Page 87 / 151 C# İle Bilgisayar Programlama Temelleri uint uint türü 32-bitlik işaretsiz tamsayı türüdür. Varsayılan değeri 0u veya 0U (ikisi eşdeğerdir) sayısıdır. ‘u’ harfi sayının uint (aksi takdirde int olarak anlaşılır) türünde olduğunu gösterir. Alabileceği en küçük değeri UInt32.MinValue = 0, ve en büyük değeri UInt32.MaxValue = 4,294,967,295 ( 232 – 1 ) ‘dir. long long türü varsayılan değeri 0l veya 0L (ikisi eşdeğerdir, ancak ‘l’ harfi ‘1’ bir basamağı ile kolayca karıştırılabileceği için ‘L’ kullanılması tercih edilir) sayısı olan 64-bitlik işaretli türdür. ‘L’ harfi sayının long türüne (aksi takdirde int anlaşılmalıdır) sahip olduğunu göstermektedir. long türünde saklanabilen en küçük değer Int64.MinValue=-9,223,372,036,854,775,808 ( -263 ) ve en büyük değer Int64.MaxValue = 9,223,372,036,854, 775,807 ( 263 – 1 ) ‘dir. ulong En büyük tamsayı türü ulong türüdür. Varsayılan değeri 0u veya 0U (ikisi eşdeğerdir) sayısı olan 64-bitlik işaretsiz türdür. ‘u’ eki sayının ulong türünde (aksi takdirde long anlaşılmaktadır) olduğunu gösterir. long türünde saklanabilen en küçük değer UInt64.MinValue = -0 ve en büyük değer UInt64.MaxValue = 18,446,744,073,709,551,615 ( 264 – 1 ) ‘dir. Aşağıda yer alan “Değişkenleri Bildirmek” ve “Değişkenleri Başlatmak” Bölümleri’nde bir değişkenin bildirilmesini ve başlatılmasını detaylı olarak görmeniz mümkün olacaktır ve örnekler bunu daha açık hale getirecektir. Aşağıdaki kod parçasında, tamsayı türlerinin kullanımını gösterdik. Küçük sayılar için byte türünü, ve çok büyük sayılar için – ulong türünü kullandık. Kullanılan tüm değerler pozitif sayılar olduğu için işaretsiz türleri kullandık. www.nakov.com Page 88 / 151 C# İle Bilgisayar Programlama Temelleri // Bazı değişkenleri bildirelim byte centuries = 20; ushort years = 2000; uint days = 730480; ulong hours = 17531520; // Konsola sonucu yazdıralım Console.WriteLine(centuries + “ centuries are “ + years + “ years, or “ + days + “ days, or “ + hours + “ hours.”); // Konsol çıktısı: // 20 centuries are 2000 years, or 730480 days, or 17531520 // hours. ulong maxIntValue = UInt64.MaxValue; Console.WriteLine(maxIntValue); // 18446744073709551615 Kayan Noktalı Gerçek Sayı Türleri C# gerçek türleri matematikten bildiğimiz gerçek sayılardır. IEEE 754 Standartına uygun bir kayan nokta ile temsil edilirler ve float ve double olarak bulunmaktadır. Şimdi bu iki veri türünü detaylarıyla düşünelim ve aralarındaki benzerlikler ve farklılıklar nedir anlamaya çalışalım. Gerçek Sayı Türü: Float Değerlendireceğimiz birinci tür 32-bitlik gerçek kayan noktalı türü olan float olacak. Aynı zamanda tek duyarlıklı gerçek sayı olarak bilinir. Varsayılan değeri 0.0f veya 0.0F ‘dır (her ikisi de eşdeğerdir). Sonuna konan ‘f’ karakteri açıkça sayının float türünde olduğunu gösterir (çünkü varsayılan olarak tüm gerçek sayılar double olarak kabul edilir). Bu özel sonek hakkında daha fazla bilgiyi “Gerçek Değişmezler” Bölümü’nde okuyabilirsiniz. Dikkate aldığımız tür yedi ondalık basamağa kadar doğruluğa sahiptir (diğerleri kaybolmuştur). Örneğin 0,123456789 sayısı float türü olarak tutulduğu takdirde, 0,1234568 olarak yuvarlanacaktır. float türüne dahil edilebilen değerler aralığı (7 önemli ondalık basamak duyarlığına yuvarlandığı takdirde) ±1.5 × 10-45 ile ±3.4 × 1038 aralığındadır. www.nakov.com Page 89 / 151 C# İle Bilgisayar Programlama Temelleri Gerçek Sayı Türlerinin Özel Değerleri Gerçek Sayı Türü: Double Gerçek veri türleri gerçek sayı olmayan fakat bazı matematiksel soyutlamalar olan birkaç özel değere de sahiptir: C# dilinde ikinci gerçek kayan noktalı türü double türüdür. Buna ayrıca çift duyarlıklı gerçek sayı da denir. 0.0d ve 0.0D varsayılan değerine sahip 64-bit türüdür (‘d’ soneki olarak zorunlu değildir çünkü C# dilinde tüm gerçek sayı türleri varsayılan olarak double olmaktadır). Bu tür 15 ila 16 ondalık basamak duyarlığına sahiptir. double türü için kaydedilebilen değerler (15-16 önemli ondalık basamak duyarlığına yuvarlandığında), ±5.0 × 10-324 ile ±1.7 × 10308 aralığındadır. • Negatif sonsuz –∞ (Single. NegativeInfinity). Örneğin -1.0f sayısı 0.0f tarafından bölündüğü zaman elde edilir. • Pozitif sonsuz +∞ (Single. PositiveInfinity). Örneğin 1.0f sayısı 0.0f tarafından bölündüğü zaman elde edilir. • Belirsizlik (Single.NaN) – Geçersiz bir işlem gerçek sayılar üzerinde yapıldığı anlamına gelir. Örneğin 0.0f sayısı 0.0f tarafından bölündüğü zaman, yada negatif bir sayının karekökünü hesaplarken elde edilir. www.nakov.com double türünün en küçük değeri Double. MinValue = -1.79769e + 308 sabiti ve en büyük değeri Double.MaxValue = 1.79769e+308 sabitidir. 0 pozitif sayısına en yakın double türü Double.Epsilon = 4.94066e-324 sayısıdır. double türündeki değişkenler de float türünde olduğu gibi bazı özel değerler alabilir: Double.PositiveInfinity (+∞), Double.NegativeInfinity (-∞) ve Double.NaN (geçersiz sayı). Page 90 / 151 C# İle Bilgisayar Programlama Temelleri Kayan Noktalı Gerçek Sayı Türleri - Örnek Gerçek sayı türünde değişkenleri bildiren, bu değişkenlere değer atayan ve değerlerini konsola bastıran bir örnek aşağıda verilmiştir: float floatPI = 3.14f; Console.WriteLine(floatPI); // 3.14 double doublePI = 3.14; Console.WriteLine(doublePI); // 3.14 double nan = Double.NaN; Console.WriteLine(nan); // NaN double infinity = Double.PositiveInfinity; Console.WriteLine(infinity); // Infinity Gerçek Sayı Türlerinin Duyarlılığı Matematik belirli bir aralıkta sayısız tane gerçek sayı vardır (bu aralıktaki tamsayıların sayısı sınırlıdır), yani herhangi iki a ve b gerçek sayısı arasında a < c < b olan sayısız adet bir c sayısı vardır. Bunun sonucu olarak, bilgisayar belleğinde saklanabilen gerçek sayılar sınırlı bir doğruluk gerektirir. Matematik ve Fizik bilimleri çoğunlukla son derece büyük sayılarla (pozitif ve negatif), ve (sıfıra çok yakın) son derece küçük sayılarla çalıştığı için, bilgisayar ve elektronik cihazlardaki gerçek türler uygun şekilde saklanmalı ve işlenmelidir. Örneğin, Fizik bilimine göre elektronun kütlesi yaklaşık kilogramdır ve 1 gram molekül maddede yaklaşık 6.02*1023 9.109389*10-31 atom vardır. Her iki değer de float ve double türünde kolaylıkla saklanabilir. Esnekliği sayesinde, gerçek sayıların modern kayan noktalı gösterimi bize çok büyük sayılar için (örneğin yüzlerce basamağı olan pozitif ve negatif sayılar) maksimum sayıda anlamlı basamak ile ve sıfıra çok yakın sayılarla (örneğin, ilk önemli basamağından önceki ondalık noktadan sonra yüzlerce sıfırı olan pozitif ve negatif sayılar) çalışmak olanağını veriyor. www.nakov.com Page 91 / 151 C# İle Bilgisayar Programlama Temelleri Gerçek Sayı Türlerinin Doğruluğu - Örnek Üzerinden geçtiğimiz C# dilinin gerçek türleri – float ve double sadece alabilecekleri farklı olası değerler aralığı bakımından değil ama aynı zamanda hassasiyetleri (koruyabildikleri ondalık basamak sayısı) bakımından da farklılık gösterirler. Birinci tür 7 basamaklı, ikinci tür 15-16 basamaklı bir hassasiyete sahiptir. Gerçek sayı türünde bildiğimiz birkaç değişkeni bildiren, bu değişkenlere ilk değer atayarak başlatan ve değerlerini konsola bastıran bir örnek aşağıda verilmiştir. Örneğin amacı, aralarındaki doğruluk farkını açıklamaktadır: // Declare some variables float floatPI = 3.141592653589793238f; double doublePI = 3.141592653589793238; // Print the results on the console Console.WriteLine(“Float PI is: “ + floatPI); Console.WriteLine(“Double PI is: “ + doublePI); // Console output: // Float PI is: 3.141593 // Double PI is: 3.14159265358979 float olarak bildirilen π sayısının 7.nci basamağa kadar yuvarlandığını ve double olarak bildirilen π sayısının 15.nci basamağa kadar yuvarlandığını görüyoruz. double gerçek türünün float türüne göre daha fazla kesinlik içerdiği sonucuna varabiliriz, böylece ondalık noktadan sonra daha büyük bir hassasiyete ihtiyacımız varsa, onu kullanabileceğiz. www.nakov.com Page 92 / 151 C# İle Bilgisayar Programlama Temelleri Gerçek Sayı Türlerinin Sunumu Hakkında C# dilindeki gerçek kayan noktalı sayılar üç bileşenden oluşmaktadır (IEEE 754 Standartına göre): işaret (1 veya –1), mantis ve kuvvet (üs), ve bunların değerleri karmaşık bir formülle hesaplanır. Gerçek sayıların gösterimi hakkında daha detaylı bilgi “Sayısal Sistemler” Bölümü’nde verilmiştir. Burada veri türlerinin temsiline ve hesaplanabilen diğer veri türlerine derinlemesine bakacağız. Gerçek Sayı Türleri ile Hesaplamalarda Hatalar Gerçek kayan noktalı veri türleri ile hesaplamalarda alışılmamış davranışlar gözlemlemek mümkündür, çünkü belirli bir gerçek sayının gösterimi sırasında sık sık doğruluğun kaybedilmesine rastlanır. Bunun nedeni bazı gerçek sayıların 2’nin negatif güçlerinin toplamı olarak tam olarak temsil edilmesinde yetersiz kalınmasıdır. float ve double türleri tarafından doğru bir temsili olmayan sayılara örnekler 0.1, 1/3, 2/7 olarak verilebilir. İşte C# kayan nokta sayıları ile hesap hatalarını gösteren bir örnek C# kodu: float f = 0.1f; Console.WriteLine(f); // 0.1 (correct due to rounding) double d = 0.1f; Console.WriteLine(d); // 0.100000001490116 (incorrect) float ff = 1.0f / 3; Console.WriteLine(ff); // 0.3333333 (correct due to rounding) double dd = ff; Console.WriteLine(dd); // 0.333333343267441 (incorrect) „float ve double türleri için tüm gerçek sayıların doğru temsili yoktur. Örneğin, 0,1 sayısı float türünde yuvarlanmış olarak 0,099999994 ile temsil edilir. www.nakov.com Page 93 / 151 C# İle Bilgisayar Programlama Temelleri İlk örnekte, beklenmeyen sonucun nedeni 0,1 (yani 1/10) sayısının IEEE 754 gerçek kayan noktalı sayı formatında hiçbir doğru temsilinin olmamasıdır ve bu nedenle yaklaşık değeri kaydedilmiştir. Doğrudan yazdırıldığında sonuç yuvarlama nedeniyle doğru görünüyor. Yuvarlama sayının konsolda basılacak dize için dönüşümü sırasında yapılır. double türünden float türüne geçilirken, IEEE 754 biçimde sayının yaklaşık temsili daha belirgindir. Bu nedenle, yuvarlama, artık yanlış temsili gizlemez, ve sekizinci basamaktan sonra o hataları gözlemleyebilirsiniz. İkinci durumda 1/3 sayısının hiçbir doğru temsili yoktur ve 0,3333333’e çok yakın bir sayıya yuvarlanır. Bu sayının değeri double türünde yazıldığında daha önemli basamak koruduğu için açıkça görülebilir. Her iki örnek de kayan nokta sayı aritmetiğinin hatalar üretebilir olduğunu göstermektedir ve bu nedenle hassas finansal hesaplamalar için uygun değildir. Neyse ki, C# 0,1 gibi rakamları yuvarlama olmadan bellekte tutabilen hassas ondalık aritmetiği desteklemektedir. Ondalık Duyarlıklı Gerçek Sayı Türleri C# sayıların ikili sistem yerine ondalık rakam sistemi vasıtasıyla temsil edildiği ondalık kayan nokta aritmetiğini destekler. Böylece C# dilindeki ondalık kayan nokta aritmetik türü kayan nokta sayılarını depolarken ve işlerken doğruluğunu kaybetmez. C# dilinde ondalık duyarlıklı gerçek sayılar için veri türü 128-bitlik decimal türüdür. 28 – 29 ondalık basamağa kadar bir duyarlığı vardır. En küçük değeri -7.9×1028 ve en büyük değeri +7.9×1028 ‘dir. Varsayılan değeri 0.0m veya 0.0M ‘dir. ‘m’ soneki sayının decimal türde olduğunu açıkça göstermektedir (çünkü varsayılan olarak tüm gerçek sayılar double türündedir). decimal türünde 0’a en yakın kaydedilebilen sayı ±1.0 × 10-28 ‘dir. decimal türünde ne çok büyük pozitif veya negatif sayıların ne de 0’a çok yakın sayıların saklanamayacağı açıktır. Ancak, „Daha küçük veri aralığına rağmen, decimal türünde finansal hesaplamalar için bu veri saklanabilen tüm ondalık sayılar duyarlığını korur. Bu türü neredeyse mükemmeldir nedenle decimal türü hassas hesaplamalar için çok çünkü sayıları 10’un kuvvetlerinin daha elverişli ve finansal olanlar için çok uygundur.” toplamı olarak temsil eder ve yuvarlamadan kaynaklanan veri kayıpları ikili gösterim ile kullanıldığında çok daha küçüktür. www.nakov.com Page 94 / 151 C# İle Bilgisayar Programlama Temelleri decimal türündeki gerçek sayılar, finansal hesaplamalar için son derece elverişlidir – gelirler, vergiler, borçlar, faizler, ödemeler, vb. hesaplamalar. decimal türünde bir değişkeni bildiren ve ona değer atayan bir örnek aşağıda verilmiştir: decimal decimalPI = 3.14159265358979323846m; Console.WriteLine(decimalPI); // 3.14159265358979323846 decimal türünde bildirdiğimiz decimalPI sayısı 1 pozisyon kadar bile yuvarlanmamıştır çünkü onu 21 basamaklı duyarlıkla kullandık ve bu „Eğer para ile hesaplamalar da yuvarlatılmamış decimal türüne uyuyor. yapıyorsanız float veya double yerine decimal türünü Yüksek duyarlık ve hesaplamalar sırasında kullanın. Aksi halde hesaplamaalışılmamış davranışların olmaması (float ve double lar sırasında hoş olmayan anotürlerinde rastladığımız) nedeniyle doğruluğun maliler sonucunda hatalar ile önem arz ettiği finansal hesaplamalar için decimal karşılaşabilirsiniz!” türü son derece uygundur. Gerçek kayan noktalı sayılar ve ondalık duyarlıklı gerçek sayılar arasındaki temel fark hesaplamaların doğruluğu ve hangi kapsama kadar saklanan değerlerin yuvarlandığıdır. double türü bize çok büyük değerler ve sıfıra çok yakın değerler ile çalışma olanağı sağlar ama doğruluktan fedakarlık ederek ve bazı tatsız yuvarlama hatalarına da göz yumarak. decimal türü daha küçük bir aralıkta çalışır ama hesaplamalarda daha fazla doğruluk sağlar, bunun yanı sıra ondalık sayılar ile anomalilere rastlanmaz. decimal türünde tüm hesaplamalar doğrudan daha düşük bir mikroişlemci seviyesi yerine tamamen yazılım ile yapıldığı için bu tür için yapılan hesaplamalar double türü ile yapılan aynı hesaplamalardan onlarca ve yüzlerce kat daha yavaş çalışır, bu nedenle gerçekten gerekli olduğu zaman bu türü kullanınız. Boole Türü Boole türü bool anahtar sözcüğü ile bildirilir. İki olası değeri vardır: true ve false. Varsayılan değeri false olur. En sık olarak mantıksal ifadelerin hesaplama sonucunu depolamak için kullanılır. www.nakov.com Page 95 / 151 C# İle Bilgisayar Programlama Temelleri Boole Türü – Örnek Halen bildiğimiz türde birkaç değişkeni bildiren, bu değişkenlere ilk değer atayarak başlatan, onları karşılaştıran ve sonucu konsola bastıran bir örnek aşağıda verilmiştir: // Declare some variables int a = 1; int b = 2; // Which one is greater? bool greaterAB = (a > b); // Is ‘a’ equal to 1? bool equalA1 = (a == 1); // Print the results on the console if (greaterAB) { Console.WriteLine(“A > B”); } else { Console.WriteLine(“A <= B”); } Console.WriteLine(“greaterAB = “ + greaterAB); Console.WriteLine(“equalA1 = “ + equalA1); // Console output: // A <= B // greaterAB = False // equalA1 = True Yukarıdaki örnekte, int tipinde iki değişken bildiriyoruz, bunları karşılaştırıyoruz ve bool türündeki greaterAB değişkenine sonucu atıyoruz. Benzer şekilde, equalA1 değişkeni için de aynı şeyi yapıyoruz. Değişken greaterAB değeri true ise, o zaman A > B konsola yazdırılıyor, aksi takdirde A <= B yazdırılıyor. www.nakov.com Page 96 / 151 C# İle Bilgisayar Programlama Temelleri Character Türü Karakter türü tek bir karakterdir (Bir Unicode tablosu karakterinin 16-bitlik sayısı). C# dilinde char anahtar sözcüğü ile bildirilir. Unicode tablosu tüm insan dillerinden herhangi bir karakteri (harf, noktalama, vb.) yazı sistemleri (tüm diller ve alfabeler) olarak bir tamsayı veya tamsayı dizisi ile temsil eden teknolojik bir standarttır. Unicode tablosu hakkında daha fazla bilgi “Dizeler ve Metin İşleme” Bölümü’nde bulunabilir. char değişkeninin mümkün olan en küçük değeri 0 ve en büyük değeri 65535’dir. char türünün değerleri harfler veya diğer karakterlerdir, ve kesme işareti içine alınır. Character Türü – Örnek char türünde bir değişkeni bildiren, bu değişkene ilk değer olarak önce ‘a’ atayarak başlatan, sonra ‘b’, ve daha sonra ‘A’ atayan ve konsola bu harflerin Unicode değerlerini bastıran bir örnek aşağıda verilmiştir: // Declare a variable char ch = ‘a’; // Print the results on the console Console.WriteLine( “The code of ‘” + ch + “’ is: “ + (int)ch); ch = ‘b’; Console.WriteLine( “The code of ‘” + ch + “’ is: “ + (int)ch); ch = ‘A’; Console.WriteLine( “The code of ‘” + ch + “’ is: “ + (int)ch); // // // // Console output: The code of ‘a’ is: 97 The code of ‘b’ is: 98 The code of ‘A’ is: 65 www.nakov.com Page 97 / 151 C# İle Bilgisayar Programlama Temelleri Dizeler Dizeler karakter dizileridir. C# dilinde string anahtar sözcüğü ile bildirilir. Varsayılan değeri null olur. Dizeler tırnak işareti içine alınır. Dizeleri kullanarak çeşitli metin işleme işlemleri yapabilirsiniz: birleştirme (bir dizeyi başka bir dize ile birleştirme), belirli bir ayırıcı ile ayırma, arama, karakterlerin değiştirilmesi ve diğerleri. Metin işleme hakkında daha fazla bilgi, bir dizenin ne olduğu, uygulamaları ve nasıl kullanabileceğiniz hakkında ayrıntılı açıklama bulacağınız “Dizeler ve Metin İşleme” Bölümü’nde yer almaktadır. Dizeler – Örnek string türünde birkaç değişkeni bildiren, bu değişkenlere ilk değer atayarak başlatan ve değerlerini konsola bastıran bir örnek aşağıda verilmiştir: // Declare some variables string firstName = “John”; string lastName = “Smith”; string fullName = firstName + “ “ + lastName; // Print the results on the console Console.WriteLine(“Hello, “ + firstName + “!”); Console.WriteLine(“Your full name is “ + fullName + “.”); // Console output: // Hello, John! // Your full name is John Smith. Object Türü Nesne türü .NET Framework içindeki diğer tüm türlerin atası olan özel bir türdür. object anahtar sözcüğü ile bildirilir, ve herhangi bir başka türden değer alabilir. Bu bir referans türüdür, yani gerçek değerin depolandığı bir bellek alanı indeksidir (adresidir). Object Kullanımı – Örnek object türünde birkaç değişkeni bildiren, bu değişkenlere ilk değer atayarak başlatan ve değerlerini konsola bastıran bir örnek aşağıda verilmiştir: www.nakov.com Page 98 / 151 C# İle Bilgisayar Programlama Temelleri // Declare some variables object container1 = 5; object container2 = “Five”; // Print the results on the console Console.WriteLine(“The value of container1 is: “ + container1); Console.WriteLine(“The value of container2 is: “ + container2); // Console output: // The value of container1 is: 5 // The value of container2 is: Five. Örnekte gördüğünüz gibi, object türü değişkeninde herhangi bir başka türden değerler saklanabilir. Böylece object türü, evrensel veri kapsayıcı haline gelir. Nullable Türler Nullable türler değer türleri (int, double ve bool gibi) etrafında belirli bir sarıcıdır ve null değere sahip bir veri depolama olanağı sunar. Bu genellikle değeri eksik olan (yani, null değeri olan) verilere izin vermeyen türler için referans (başvuru) türleri olarak kullanılmak üzere ve hem normal değerleri hem de özel null değerini kabul etmek üzere fırsat sağlar. Böylece null türleri isteğe bağlı değer tutar. Belirli bir türü nullable halinde sarmalama iki şekilde yapılabilir: Nullable<int> i1 = null; int? i2 = i1; Her iki bildirim de eşdeğerdir. Bu işlemi gerçekleştirmek için en kolay yol türün sonuna bir soru işareti (?) eklemektir, örneğin, int?, Nullable<…> sözdizimini kullanmak daha zordur. Nullable türleri referans türleridir, yani onların gerçek değerini içeren dinamik bellekte bir nesneye başvurudurlar. Bir değere sahip olabilir yada olmayabilirler ve normal temel veri türleri olarak aşağıdaki örnekte gösterildiği bazı özellikleriyle birlikte kullanılabilirler: www.nakov.com Page 99 / 151 C# İle Bilgisayar Programlama Temelleri int i = 5; int? ni = i; Console.WriteLine(ni); // 5 // i = ni; // this will fail to compile Console.WriteLine(ni.HasValue); // True i = ni.Value; Console.WriteLine(i); // 5 ni = null; Console.WriteLine(ni.HasValue); // False //i = ni.Value; // System.InvalidOperationException i = ni.GetValueOrDefault(); Console.WriteLine(i); // 0 Yukarıdaki örnek nullable değişkeninin (int?) nasıl doğrudan bir değere sahip olabileceğini gösteriyor, değer nullable-olmasa bile (int). Tersi doğrudan mümkün değildir. Bu amaçla, nullable türlerinin Value özelliği kullanılabilir. Nullable türü değişkeninin depolanan değerini döndürür veya program yürütme sırasında değer eksik (null) ise bir hata (InvalidOperationException) üretir. Nullable türü değişkeninin atanmış bir değere sahip olup olmadığını kontrol etmek amacıyla, Boole türündeki HasValue özelliğini kullanabilirsiniz. Başka bir yararlı yöntem GetValueOrDefault() ‘dur. Nullable türü değişkeni bir değer taşıyorsa, bu yöntem onun değerini dönecektir, aksi takdirde nullable türü için varsayılan değeri (sıklıkla 0) dönecektir. Nullable türleri zorunlu olmayan bilgileri depolamak için kullanılır. Örneğin, bir öğrenci için veri saklamak istiyorsanız, adı ve soyadı zorunluysa ve yaş gerekli değilse, yaş değişkeni için int? türünü kullanabiliriz: string firstName = “John”; string lastName = “Smith”; int? age = null; www.nakov.com Page 100 / 151 C# İle Bilgisayar Programlama Temelleri Değişkenlerin Özellikleri Değişkenlerin özellikleri aşağıdakiler ile karakterize edilir: • isim (tanımlayıcı), örneğin yaş; • tür (sakladığı bilginin), örneğin int; • değer (depolanan bilgi), örneğin 25. Değişken, belirli bir veri türünde değer saklayan adlandırılmış bir bellek alanıdır ve bu bellek alanına adıyla programda erişilebilir. Değişkenler programın işlevini sağlayan bellekte (yığın) doğrudan saklanabilir veya daha büyük nesnelerin (örneğin karakter dizeleri ve diziler gibi) saklandığı dinamik bellekte depolanabilir. Temel veri türlerine (sayılar, char, bool) değer türleri denir çünkü onlar program yığınında doğrudan kendi değerlerini depolarlar. Referans veri türleri (örneğin dizeler, nesneler ve diziler gibi) dinamik bellekte bunların değerinin saklandığı bir adrese işaret eder. Dinamik olarak onlara bellekte yer ayrılabilir ve serbest bırakılabilir, yani boyutları değer türlerinin aksine önceden sabit olarak belirli değildir. Değer ve referans veri türleri hakkında daha fazla bilgi “Değer ve Referans Türleri” Bölümü’nde bulunmaktadır. www.nakov.com Page 101 / 151 C# İle Bilgisayar Programlama Temelleri Değişkenlerin Adlandırılması – Kurallar Derleyiciden programımızda kullanılan bazı bilgiler için bellek alanı ayırmasını istediğinizde bunun için bir ad sağlamanız gerekir. Bu ad abir tanımlayıcı gibi çalışır ve ilgili bellek alanına işaret edilmesini sağlar. Değişkenin adı seçtiğimiz herhangi bir ad olabilir, ancak C# dilinin spesifikasyonunda belirlenmiş bazı kurallara uymanız gerekir: Değişken adları a – z, A – Z harfleri, 0 – 9 rakamlarının yanı sıra ‘_’ karakterini içerebilir. - Değişken adları rakam ile başlayamaz. - Değişken adları C# dilinin bir anahtar sözcüğü ile denk olamaz. Örneğin base, char, default, int, object, this, null ve diğerleri değişken adları olarak kullanılamazlar. - C# anahtar sözcüklerinin listesi “Programlamaya Giriş” Bölümü’nün “Anahtar Kelimeler” altbölümünden bulunabilir. Değişkene bir anahtar sözcük gibi bir ad vermek isterseniz, ada bir önek ekleyebilirsiniz – “@”. Örneğin char ve null geçersiz adlar olduğu halde, @char ve @null geçerli adlardır. Değişkenlerin Adlandırılması – Öneriler Değişkenleri nasıl adlandıracağınıza dair bazı öneriler sunacağız, çünkü derleyici tarafından izin verilen adların tümü değişkenler için uygun değildir. - Adlar tanımlayıcı olmalı ve değişkenin ne için kullanıldığını açıklaması gerekir. Örneğin, bir kişinin adını saklayan bir değişken için uygun bir isim personName olup ve uygunsuz ad a37 olur. - Sadece Latin harfleri kullanılmalıdır. Kiril harflerine derleyici tarafından izin verilse de, bu değişkenleri veya program dahilinde kalan tanımlayıcıları adlandırmada kullanmak için iyi bir uygulama değildir. - C# için genellikle değişken adlarının küçük harfle başlaması ve küçük harfleri içermesi gerektiği kabul edilir, ancak, her yeni sözcük büyük www.nakov.com Page 102 / 151 C# İle Bilgisayar Programlama Temelleri harfle başlamalıdır. Örneğin, firstName adı firstname yada first_ name kullanmaktan daha doğru ve daha iyidir. Değişken adlarında _ karakterinin kullanımı kötü bir adlandırma tarzı olarak kabul edilir. - Değişken adları ne çok uzun ne de çok kısa olmalıdır – onların sadece kendi bağlamında değişken amacını açıklığa kavuşturması gerekir. - Büyük ve küçük harfler C# onları ayırdığı için dikkatle kullanılmalıdır. Örneğin, age ve Age farklı değişkenlerdir. İşte iyi adlandırılmış değişkenlerden bazı örnekler: - - - - firstName age startIndex lastNegativeNumberIndex Ve işte kötü adlandırılmış değişkenlerden bazı örnekler: (Adlar C# derleyicisine göre doğru olmasına rağmen): _firstName (_ karakteri ile başlıyor) - - last_name (_ karakterini içeriyor) - AGE (büyük harflerle yazılmış) - Start_Index (büyük harfle başlıyor ve _ karakterini içeriyor) lastNegativeNumber_Index (_ karakterini içeriyor) - - a37 (ad açıklayıcı değildir ve değişkenin amacını açıkça anlatmıyor) - fullName23, fullName24, vb. (Kullanılan değişkenin netliğini geliştirmediği sürece bir değişken adının rakam içermesi uygun değildir; eğer farklı bir sayı ile biten benzer adlara sahip değişkenler olması gerekiyorsa, aynı veya benzer tür veriyi depolamak için, tek bir koleksiyon veya dizi değişkeni oluşturmak ve onu örneğin fullNamesList olarak adlandırmak daha uygun olabilir. Değişkenler kısaca amacını açıklayan adlara sahip olmalıdır. Değişken uygunsuz bir ad ile adlandırıldığı zaman, programın sonradan okunması ve değiştirilmesi çok zor hale gelir (nasıl çalıştığını bir süre sonra unutmuş olduğumuzda). Değişkenlerin doğru adlandırılması hakkında daha fazla açıklama için “Yüksek Kalite Programlama Kodu” Bölümü’ne bakınız. www.nakov.com Page 103 / 151 C# İle Bilgisayar Programlama Temelleri „Değişkenleri adlandırırken, her zaman kısa ve kesin adlar kullanmayı deneyin. Değişken adı ne için kullanıldığını belirtmelidir kuralını izleyin, örneğin ad şu soruyu cevaplamalıdır “bu değişkende ne değer saklanır”. Bu koşul yerine getirilmediği zaman daha iyi bir ad bulmaya çalışın. Rakamlar değişken adlarında kullanılmak için uygun değildir.” Değişkenlerin Bildirilmesi Bir değişkeni bildirdiğinizde, aşağıdaki adımları gerçekleştirirsiniz: - - - değişkenin türünü belirtmek (int gibi); adını belirtmek (age gibi bir tanımlayıcı); isteğe bağlı olarak başlangıç değerini belirtmek (örneğin 25 gibi), ancak bu zorunlu değildir. C# değişkenlerini bildirmek için sözdizimi aşağıdaki gibi şöyledir: <veri türü> <tanımlayıcı> [= <başlangıç değeri>]; Değişkenlerin bildirimine örnekler aşağıda verilmektedir: string name; int age; www.nakov.com Page 104 / 151 C# İle Bilgisayar Programlama Temelleri Değer Atanması Bir değişkene değer atanması, değişken içinde saklanması gereken bir değeri sağlamakla yapılır. Bu işlem “=” atama operatörü tarafından gerçekleştirilir. Operatörün sol tarafına değişken adını ve sağ tarafına – değişkenin yeni değerini koyarız. Değişkenlere değerler atanmasına örnekler aşağıda verilmektedir: name = “John Smith”; age = 25; Değişkenlerin Başlatılması Programlamada başlatma kelimesi bir başlangıç değerini belirtmek demektir. Değişkenlerin bildirilme anında onlara değer atayarak onları gerçekte başlatmış oluyoruz. Standart Değişken Değerleri C# dilinde her veri türü varsayılan bir değere sahiptir (buna varsayılan başlatma değeri denir), belirli bir değişken için hiçbir değer açıkça atanmamış olduğunda varsayılan başlatma değeri kullanılır. Zaten alışmış olduğumuz türlerin varsayılan değerlerini görmek için aşağıdaki tabloyu kullanabilirsiniz: www.nakov.com Page 105 / 151 C# İle Bilgisayar Programlama Temelleri Veri Türü Varsayılan Değer Veri Türü Varsayılan Değer byte 0 double 0.0d sbyte 0 float 0.0f short 0 decimal 0.0m Int 0 char ‘\u0000’ object null ushort uint 0 0u long 0L ulong 0u bool string false null Değişkenleri bildirmek, onları başlatmak ve onlara değer atamayı aşağıdaki örnek ile özetleyelim: // Declare and initialize some variables byte centuries = 20; ushort years = 2000; decimal decimalPI = 3.141592653589793238m; bool isEmpty = true; char ch = ‘a’; string firstName = “John”; ch = (char)5; char secondChar; // Here we use an already initialized variable and reassign it secondChar = ch; www.nakov.com Page 106 / 151 C# İle Bilgisayar Programlama Temelleri Değer ve Referans Türleri C# dilinde iki çeşit veri türü vardır: Değer ve referans. Değer türleri program yürütme yığıtında saklanır ve doğrudan kendi değerini içerirler. Değer türleri arasında temel sayısal türler, karakter türü ve Boole türü vardır: sbyte, byte, short, ushort, int, long, ulong, float, double, decimal, char, bool. Program onların değer kümesini tutan erişimden çıktığında onlar için ayrılan bellek serbest bırakılır, yani tanımlandığı kod bloğu yürütmeyi tamamladığında. Örneğin programın Main() yöntemi ile bildirilen erim içinde tanımlanan bir değişken, program bu yöntemin yürütülmesini tamamlayıncaya kadar, yani sona erene kadar, yığıt içinde saklanır, (yani program Main() metotunu tamamen yürüttükten sonra C# programı sonlanıncaya kadar). Referans türleri program yürütme yığıtında, bir başvuru (adresi) tutar, ve onların bu referans noktaları dinamik bellekte (yığın) sakladıkları değeri işaret eder. Referans bir göstericidir (bellek biriminin adresi) ve yığıttaki değerin gerçek konumunu göstermektedir. Örnek olarak, yürütme yığıtındaki bir adreste depolanan değer 0x00AD4934 olarak verilebilir. Referansın bir türü vardır. Referans sadece aynı türden nesnelere işaret edebilir, yani türe koşulsuz zorlanmıştır. Tüm referans türleri bir null değeri tutabilir. Bunun anlamı “hiçbir değeri yok” olan özel bir hizmet değeridir. Referans türlerinin yaratılması için dinamik bellekte yer ayrılır. Program tarafından artık kullanılmayan bellek için (çöp toplayıcı) gibi bir bellek temizleyicisi, dinamik belleğin bir kısmını serbest bırakır. Belirli bir referans değişkeninin çöp toplayıcısı tarafından tam olarak ne zaman serbest bırakılacağı bilinmemektedir, çünkü bu bellek yükü ve diğer faktörlere bağlıdır. Belleğin ayrılması ve serbest bırakma işlemi yavaş olduğu için, referans türlerinin değer türlerine göre daha yavaş olduğu söylenebilir. Referans veri türleri program yürütme sırasında dinamik olarak tahsis edilip serbest bırakıldığı için boyutları önceden bilinmeyebilir. Örneğin, string türünde bir değişkenin uzunluğu farklı metin verisi içerebilir. Gerçekte string değişkeni www.nakov.com Page 107 / 151 C# İle Bilgisayar Programlama Temelleri metin değerinin adresini depolarken, string metin değeri dinamik bellekte saklanır ve farklı bir boyutu (bayt sayısını) kaplayabilir. Referans türleri, tüm sınıflar, diziler ve arayüzleri içeren şu türlerden oluşur: object, string, byte[]. Bu kitabın sonraki bölümlerinde sınıflar, nesneler, dizeler, diziler ve arayüzleri öğreneceksiniz. Şimdilik, değer türü olmayan tüm türlerin, referans türü olduğunu ve değerlerinin yığında (dinamik olarak ayrılan bellekte) saklandığını bilmek yeterlidir. Değer ve Referans Türleri ve Bellek Değişkenleri bildirmek, onları başlatmak ve onlara değer atamayı aşağıdaki örnek ile özetleyelim: int i = 42; char ch = ‘A’; bool result = true; object obj = 42; string str = “Hello”; byte[] bytes = { 1, 2, 3 }; www.nakov.com Page 108 / 151 C# İle Bilgisayar Programlama Temelleri Bu noktada değişkenler bellekte aşağıdaki gibi yer almaktadır: Şimdi değişkenlerin değerlerini değiştiren aşağıdaki kodu çalıştırırsak, değer ve referans türlerinin değiştirilmesiyle bellekte neler olduğu görülecektir: i = 0; ch = ‘B’; result = false; obj = null; str = “Bye”; bytes[1] = 0; Bu değişiklikler sonrasında, değişkenler ve değerleri bellekte aşağıdaki gibi bulunur: www.nakov.com Page 109 / 151 C# İle Bilgisayar Programlama Temelleri Şekilden görebileceğiniz gibi, bir değer türüne yapılan (i = 0) değişiklik, onun yığıt içindeki değerini doğrudan değiştirir. Bir referans türünün değiştirilmesiyle farklı şeyler olur: Değer yığında (bytes[1] = 0) değiştirilir. Dizi referansını tutan değişken ise değişmeden (0x00190D11) kalır. Bir referans türüne null değer atanmasıyla, bu referansın değişken değeri ile olan bağlantısı kesilir ve değişken boş değerle (obj=null) kalır. Bir nesneye (bir referans türü değişkenine) yeni bir değer atanmasıyla yığında (dinamik bellekte) yeni nesneye bellek tahsis edilir, eski nesne serbest (unreferenced) kalır. Referans yeni nesneye yönlendirilir, (str = “Bye”), eski nesne (“Hello”) artık kullanımda olmadığı için çöp toplayıcı (otomatik bellek temizlemek için .NET Framework iç sistemi) tarafından gelecek bir zamanda temizlenecektir. www.nakov.com Page 110 / 151 C# İle Bilgisayar Programlama Temelleri Simgedeğerler Daha önce değindiğimiz temel türler, C# diline yerleşik özel veri türleridir. Programın kaynak kodunda belirtilen değerlerine simgedeğerler denir. Bir örnek konuyu daha net yapacaktır: bool result = true; char capitalC = ‘C’; byte b = 100; short s = 20000; int i = 300000; Yukarıdaki örnekte, simgedeğerler, true, ‘C’, 100, 20000 ve 300000 olarak belirlenmiştir. Onlar programın kaynak kodunda doğrudan ayarlanmış değişken değerleridir. Değer ve Referans Türleri C# dilinde, simgedeğerlerin çeşitli türleri vardır: Gerçek Sayı Türlerinin Özel Değerleri Boole Simgedeğeri Boole simgedeğerleri aşağıdaki gibidir: • Boole • Integer - true • Real - false • Character • String • Object simgedeğeri null www.nakov.com bool türü bir değişkene bir değer atadığınızda, sadece bu iki değerden birini veya (true veya false olarak hesaplanan) bir Boole ifadesini kullanabilirsiniz. Page 111 / 151 C# İle Bilgisayar Programlama Temelleri Boole Simgedeğerleri – Örnek bool türü bir değişkenin bildirimi ve true Boole simgedeğerini temsil eden bir değer atanmasına bir örnek aşağıda verilmiştir: bool result = true; Integer Simgedeğerleri Tamsayı simgedeğerleri bir dizi basamaktan oluşur: bir (+, -) işareti, önek ve sonekler. Önekleri kullanarak onluk veya onaltılık sayı tabanı biçimindeki tamsayıları program kaynak kodunda sunabiliriz. “Sayısal Sistemler” bölümünde farklı sayı sistemleri hakkında daha fazla bilgiyi bulacaksınız. Tamsayı simgedeğerlerinde aşağıdaki önek ve sonekler yer alabilir: - “0x” ve “OX” önekleri onaltılık değerleri gösterir, örneğin 0xA8F1 gibi; - ‘l’ ve ‘L’ sonekleri long veri türlerini gösterir, örneğin 357L gibi; - ‘u’ ve ‘U’ sonekleri uint ve ulong veri türlerini gösterir, örneğin 112u gibi. Varsayılan olarak (sonek kullanılmazsa) tamsayı simgedeğerleri int türündedir. Tamsayı Simgedeğerleri – Örnek Tamsayı simgedeğerlerini kullanmaya bazı örnekler aşağıda verilmiştir: // The following variables are initialized with the same value int numberInDec = 16; int numberInHex = 0x10; // This will cause an error, because the value 234L is not int int longInt = 234L; www.nakov.com Page 112 / 151 C# İle Bilgisayar Programlama Temelleri Gerçek Sayı Simgedeğerleri Gerçek simgedeğerleri bir dizi basamaktan oluşur: (+, -) işareti, sonekler ve ondalık nokta karakteri. float, double ve decimal türlerindeki değerler için bunları kullanıyoruz. Gerçek simgedeğerleri üssel formatta temsil edilebilir. Bunlar, aynı zamanda aşağıdaki gösterimleri kullanır: - ‘f’ ve ‘F’ sonekleri float veri türü anlamında; - ‘d’ ve ‘D’ sonekleri double veri türü anlamında; - ‘m’ ve ‘M’ sonekleri decimal veri türü anlamında; - ‘e’ bir üssü belirtir, örneğin, “e-5” tamsayı kısmının 10-5 ile çarpıldığı anlamına gelir. Varsayılan olarak (hiçbir soneki yoksa), gerçek sayılar double türündedir. Gerçek Sayı Simgedeğerleri – Örnekler Tamsayı simgedeğerlerini kullanmaya bazı örnekler aşağıda verilmiştir: // The following is the correct way of assigning a value: float realNumber = 12.5f; // This is the same value in exponential format: realNumber = 1.25e+1f; // The following causes an error, because 12.5 is double float realNumber = 12.5; Karakter Simgedeğerleri Karakter simgedeğerleri kesme işareti (tek tırnak) içine alınmış tek karakterden oluşur. char türündeki değerleri atamak için kullanılır. Bir karakter simgedeğeri aşağıdakilerden biri olabilir: www.nakov.com Page 113 / 151 C# İle Bilgisayar Programlama Temelleri - bir karakter, örneğin ‘A’; - bir karakter kodu, örneğin ‘\u0065’; - bir kaçma karakteri. Kaçma Karakterleri Bazen klavyede gösterilmeyen veya özel anlamlara sahip karakterler ile çalışmamız gerekli olur, örneğin “yeni satır” karakteri gibi. Bu karakterler programın kaynak kodunda doğrudan temsil edilemiyorlar, ve bunları kullanmamız için şimdi tartışacağımız özel teknikler gerekir. Kaçma karakterleri birer simgedeğerdir. Özel bir karakter dizisidir, kaynak kodunda doğrudan yazılamayan bir karakteri tarif eder. Örnek olarak, “yeni satır” karakteri verilebilir. Kaynak kodunda doğrudan temsil edilemeyen pek çok karakter örneği vardır: çift tırnak işareti, sekme, yeni satır, ters eğik çizgi ve diğerleri. İşte en sık kullanılan kaçma karakterlerinin bazıları: - \’ – tek tırnak - \” – çift tırnak - \\ – ters eğik çizgi - \n – yeni satır - \t – sekme (tab) - \uXXXX – Unicode sayısına göre belirlenen karakter, örneğin \u03A7. \ (ters eğik çizgi) karakteri de kaçma karakteridir, çünkü özel bir anlama veya etkiye sahip ve kaynak kodunda doğrudan temsil edilemeyen karakterlerin ekran (veya başka bir çıkış aygıtı) üzerinde görüntülenmesini sağlar. www.nakov.com Page 114 / 151 C# İle Bilgisayar Programlama Temelleri Kaçma Karakterleri – Örnek Karakter simgedeğerleri bazı örnekler aşağıda verilmiştir: // An ordinary character char character = ‘a’; Console.WriteLine(character); // Unicode character code in a hexadecimal format character = ‘\u003A’; Console.WriteLine(character); // Assigning the single quotiation character (escaped as \’) character = ‘\’’; Console.WriteLine(character); // Assigning the backslash character (escaped as \\) character = ‘\\’; Console.WriteLine(character); // // // // // Console output: a : ‘ \ Dize Simgedeğerleri Dize simgedeğerleri string türündeki veriler için kullanılır. Çift tırnak içinde bir karakter dizisidir. char türü için yukarıda tartışılan bütün kaçma kuralları string simgedeğerleri için de geçerlidir. www.nakov.com Page 115 / 151 C# İle Bilgisayar Programlama Temelleri Dizeler alıntı dizeyi (kelimesi kelimesine dize) belirtecek şekilde @ karakteri tarafından önekli olabilir. Alıntı dizelerde kaçma kuralları geçerli değildir, yani, \ karakteri kaçma karakteri değildir ve \ anlamına gelir. Alıntı dizelerde sadece bir karakterin kaçması gerekmektedir – “ karakteri (çift tırnak) ve tekrarlanma yoluyla kaçması sağlanır “” (çift çift tırnak). Diğer tüm karakterlere, tam anlamıyla riayet edilir hatta yeni satır karakterine bile. Alıntı dizeleri, genellikle dosya sistemi yollarının adlandırılması için kullanılır. Dize Simgedeğerleri – Örnek string quotation = “\”Hello, Jude\”, he said.”; Console.WriteLine(quotation); string path = “C:\\Windows\\Notepad.exe”; Console.WriteLine(path); string verbatim = @”The \ is not escaped as \\. I am at a new line.”; Console.WriteLine(verbatim); // Console output: // “Hello, Jude”, he said. // C:\Windows\Notepad.exe // The \ is not escaped as \\. // I am at a new line. Dizeler hakkında daha fazlasını “Dizeler ve Metin İşleme” Bölümü’nde bulacaksınız. Alıştırmalar 1. Aşağıdaki değerleri sbyte, byte, short, ushort, int, uint, long ve ulong türlerinden en uygununa atamak için birkaç değişken bildirin: 52.130; -115; 4825932; 97; -10000; 20000; 224; 970.700.000; 112; -44; -1.000.000; 1990; 123456789123456789. 2. Aşağıdaki değerlerden hangileri float, double ve decimal türündeki değişkenlere atanabilir? : 5; -5,01; 34,567839023; 12,345; 8923,1234857; 3456,09112487 5956542151256683467. www.nakov.com Page 116 / 151 C# İle Bilgisayar Programlama Temelleri 3. En azından 0,000001 doğruluğunda iki gerçek sayıyı karşılaştıran bir program yazın. 4. Onaltılık formatta 256 değeri ile int türünde bir değişkeni başlatın (16’lık tabandaki bir sayı sisteminde 256’nın karşılığı 100’dür). 5. char türünde bir değişken bildirin ve Unicode kodu 72 olan bir değere karakter olarak atayın (72’nin onaltılık gösterimini bulmak için Windows hesap makinesini kullanın). 6. bool türünde olan isMale değişkenini bildirin ve cinsiyetinize bağlı olarak ona bir değer atayın. 7. “Merhaba” ve “Dünya” değerlerine atanmış olan string türünde iki değişken bildirin. object türünde bir değişken bildirin. İki string değişkeninin bitiştirilmesiyle elde değeri bu değişkene atayın (gerekirse boşluk ekleyin). object türündeki değişkeni yazdırın. 8. string türünde iki değişken bildirin ve “Merhaba” ve “Dünya” değerlerini atayın. İki string türündeki değişkenin bitiştirilmesiyle elde edilen değeri bir object türü değişkenine atayın (ortadaki boşluk karakterini atlamadan). string türünde üçüncü bir değişken bildirin ve object türünde tanımladığınız değişkenin değeri ile başlatın (tür çevrimi kullanmanız gerekir). 9. string türünde iki değişken bildirin ve “Çift tırnakların “kullanımı” zorluklara neden olmaktadır.” değerini atayın (dış tırnak işaretleri olmadan). Değişkenlerden biri alıntı dize olsun ve diğeri olmasın. 10.“o” karakterini kullanarak bir kalp şeklini yazdıran bir program yazın. 11.Kenarları telif hakkı karakterinden “©” oluşan bir ikizkenar üçgenini konsola yazdıran bir program yazın. 12.Pazarlama ile ilgili bir şirket, çalışanlarının veri kaydını tutmak istiyor. Her kayıt aşağıdaki verilerle karakteristik olmalıdır : Ad, soyad, yaş, cinsiyet (‘m’ veya ‘f’) ve tekil çalışan sayısı (27,560,000 – 27,569,999). Uygun veri türlerini ve öznitelik adlarını kullanarak bir çalışanın bilgilerini korumak için gerekli uygun değişkenleri bildirin. 13.int türünde iki değişken bildirin. Sırasıyla 5 ve 10 değerleri atayın. Değerleri değiş-tokuş (takas) edin ve bunları yazdırın. www.nakov.com Page 117 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 3: İşleçler ve İfadeler Bölümün İçindekileri B u bölümde C# işleçlerini ve farklı veri türleri ile kullanıldığında gerçekleştirebilecekleri eylemleri tanıyacağız. Başlangıçta, hangi işleçlerin yüksek önceliğe sahip olduğunu açıklayacağız ve farklı işleç türlerini alabildikleri argüman sayısına ve gerçekleştirdikleri eylemlere göre analiz edeceğiz. İkinci bölümde ise, veri türlerinin dönüşümünü inceleyeceğiz. Ne zaman ve neden gerekli olduklarını ve farklı veri türleri ile nasıl çalışılacağını açıklayacağız. Bölümün sonunda, ifadeler ve onlarla nasıl çalışmamız gerektiğine özel dikkat vereceğiz. Son olarak, bu bölümdeki bilgi materyalimizi güçlendirmek için alıştırmaları hazırladık. İşleçler Her programlama dili işleçleri kullanır, bunlar aracılığıyla veriler üzerinde farklı eylemleri gerçekleştirebilirsiniz. C# işleçlerine bir göz atalım ve onların ne için ve nasıl kullanıldığını görelim. İşleç Nedir C# İşleçleri Önceki bölümde bir değişkenin nasıl bildirileceğini ve değer atanacağını öğrendikten sonra, onlar üzerinde çeşitli işlemleri gerçekleştirmeyi tartışacağız. Bu amaçla işleçler ile tanışacağız. C# işleçleri farklı birkaç kategoriye ayrılmıştır: - Aritmetik işleçler – basit matematiksel işlemleri gerçekleştirmek için kullanılır. - Atama işleçleri – değişkenlere değer atamaya izin verir. - Karşılaştırma işleçleri – iki karakter ve/veya değişkenin karşılaştırılmasına olanak verir. - Mantıksal işleçler – Boole veri türleri ve Boole ifadeler ile çalışan işleçler. - İkili işleçler - sayısal verilerin ikili gösterimi üzerinde işlem gerçekleştirmek için kullanılır. - Türü dönüştürme işleçleri - bir türden diğerine veri dönüşümünü sağlar. İşleçler temel veri türlerini ve nesneleri işlemeye izin verir. Girdi olarak bir veya daha fazla işlenen alırlar ve sonuç olarak bazı değer döndürürler. C# işleçleri özel karakterlerdir (örneğin “+”, “.”, “^”, vb.) ve bir, iki veya üç işlenen üzerinde dönüşümler gerçekleştirirler. C# işleçlerine örnekler, matematikteki ekleme çıkarma, çarpma ve bölme işaretleridir (+, -, *, /) ve onların tamsayılar ve gerçek sayılar üzerinde gerçekleştirdikleri işlemlerdir. www.nakov.com Page 118 / 151 C# İle Bilgisayar Programlama Temelleri İşleç Kategorileri Aşağıda kategorilere ayrılmış işleçlerin bir listesi yer almaktadır: Kategori aritmetik mantıksal ikili karşılaştırma atama dize bitiştirme türü dönüştürme diğerleri -, +, *, /, %, ++, -- İşleçler &&, ||, !, ^ &, |, ^, ~, <<, >> ==,!=, >, <, >=, <= =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= + (type), as, is, typeof, sizeof 0u Argüman Sayısına Göre İşleç Türleri İşleçler aldıkları argüman sayısına göre farklı türlere ayrılır: İşleç türü Argüman sayısı (işlenenler) birli bir işlenen alır üçlü üç işlenen alır ikili iki işlenen alır C#’da ikili işleçlerin tümü sola-ilişkilendirilmiştir, yani atama işleçleri hariç ifadeler soldan sağa hesaplanır. Tüm atama işleçleri ve koşullu işleçler ?: ve ?? sağailişkilendirilmiştir, yani ifadeler sağdan sola hesaplanır. Birli işleçler ilişkisel değildir. C# işleçlerinden bazıları farklı veri türleri üzerinde farklı işlemleri gerçekleştirir. Örneğin + işleci sayısal veri türleri (int, long, float, vb) üzerinde kullanıldığında, işleç matematiksel toplama gerçekleştirir. Ancak, dizeler üzerinde kullanıldığında, işleç iki değişken/simgedeğerin içeriğini bitiştirir (peş peşe ekler) ve yeni dizeyi döndürür. www.nakov.com Page 119 / 151 C# İle Bilgisayar Programlama Temelleri İşleçler – Örnek İşleçleri kullanmaya bir örnek aşağıda verilmiştir: int a = 7 + 9; Console.WriteLine(a); // 16 string firstName = “John”; string lastName = “Doe”; // Do not forget the space between them string fullName = firstName + “ “ + lastName; Console.WriteLine(fullName); // John Doe Örnek yukarıda açıklandığı gibi, nasıl + işlecinin sayılar üzerinde kullanıldığı zaman sayısal bir değer döndürdüğünü ve dizeler üzerinde kullanıldığında peş peşe bitiştirilen dizeyi döndürdüğünü göstermektedir. C# İşleç Önceliği Bazı işleçler diğerleri üzerinde önceliğe sahiptir. Örneğin, matematikte çarpma toplamanın üzerinde önceliğe sahiptir. Daha yüksek bir önceliğe sahip işleçler daha düşük olanlardan önce hesaplanmaktadır. () operatörü önceliği değiştirmek için kullanılır ve matematikte olduğu gibi ilk önce hesaplanır. Aşağıdaki tablo, C# işleçlerinin önceliğini göstermektedir: www.nakov.com Page 120 / 151 C# İle Bilgisayar Programlama Temelleri Öncelik En yüksek öncelik ... (,) İşleçler ++, -- (arttakı), new, (type), typeof, sizeof ++, -- (öntakı), +, -(birli), !, ~ *, /, % + (dize bitiştirme) +, <<, >> <, >, <=, >=, is, as ==, != &, ^, | && || ?:, ?? En düşük öncelik =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= Tablonun üst satırlarında bulunan işleçler, alt satırlarda bulunan işleçlerden daha yüksek önceliğe sahiptir ve dolayısıyla bir ifadenin hesaplanmasında bunların sırasıyla avantajı vardır. Bir işlecin önceliğini değiştirmek üzere parantez kullanabilirsiniz. Daha karmaşık ifadeleri yazarken yada birçok işleç varsa kodun okunabilirliği ve anlaşılabilirliğindeki güçlükleri önlemek için parantez kullanılması tavsiye edilir. Örneğin, // Ambiguous x + y / 100 // Unambiguous, recommended x + (y / 100) www.nakov.com Page 121 / 151 C# İle Bilgisayar Programlama Temelleri Aritmetik İşleçler C# aritmetik işleçleri +, -, * matematikte olanlar gibi aynıdır. Sayısal değerler üzerinde toplama, çıkarma ve çarpma işlemini yaparlar ve sonucu da sayısal bir değerdir. Bölme işleci / tamsayı ve gerçek sayılar üzerinde farklı bir etkiye sahiptir. Bir tamsayıyı bir tamsayı ile böldüğünüzde (int, long ve sbyte gibi), döndürülen değer bir tamsayıdır (yuvarlama yoktur, kesirli kısım atılır). Böyle bölünmeye tamsayı bölünmesi denir. Tamsayı bölünmesine örnek: 7 / 3 = 2. Tamsayı bölünmesinde 0 ile bölmeye izin verilmez ve bir çalışma zamanı istisnai durumuna DivideByZeroException neden olur. Tamsayı bölümünün kalanı % işleci ile elde edilebilir. Örneğin, 7 % 3 = 1, ve –10 % 2 = 0. İki gerçek sayıyı veya biri gerçek olan iki sayıyı böldüğünüzde (örneğin float, double, vb), bir gerçek sayı bölünmesi yapıyorsunuz (tamsayı değil) ve sonuç, bir tamsayı ve bir kesir kısmıdır. Örneğin: 5,0 / 2 = 2,5. Gerçek sayı bölünmesinde 0,0 ile bölmeye izin verilir ve sırasıyla sonuç +∞ (Sonsuz), -∞ (-Sonsuz) veya NaN (geçersiz değer) olur. Artım işleci ++ değişkenin değerine bir birim ekler, benzer şekilde azalım işleci -değerden bir birim çıkarır. Öntakı olarak ++ ve -- işleçlerini kullandığınızda, (hemen değişkenden önce onları yerleştirdiğinizde), önce yeni değer hesaplanır ve daha sonra sonuç geri gönderilir. Aynı işleçleri arttakı olarak kullandığınızda, (değişkenden hemen sonra onları yerleştirdiğinizde), ilk olarak işlenen özgün değer döndürülür, daha sonra toplama veya çıkarma yapılır. www.nakov.com Page 122 / 151 C# İle Bilgisayar Programlama Temelleri Aritmetik İşleçler - Örnek Aritmetik işleçler ve etkilerine bazı örnekler şunlardır: int squarePerimeter = 17; double squareSide = squarePerimeter / 4.0; double squareArea = squareSide * squareSide; Console.WriteLine(squareSide); // 4.25 Console.WriteLine(squareArea); // 18.0625 int a = 5; int b = 4; Console.WriteLine(a + b); // 9 Console.WriteLine(a + (b++)); // 9 Console.WriteLine(a + b); // 10 Console.WriteLine(a + (++b)); // 11 Console.WriteLine(a + b); // 11 Console.WriteLine(14 / a); // 2 Console.WriteLine(14 % a); // 4 int one = 1; int zero = 0; // Console.WriteLine(one / zero); // DivideByZeroException double dMinusOne = -1.0; double dZero = 0.0; Console.WriteLine(dMinusOne / zero); // -Infinity Console.WriteLine(one / dZero); // Infinity Mantıksal İşleçler Mantıksal (Boole) işleçleri Boole değerleri alır ve (true veya false) bir Boole sonucu döndürür. Temel Boole işleçleri “AND” (&&), “OR” (||), “exclusive OR” (^) ve mantıksal olumsuzlamadır (!). www.nakov.com Page 123 / 151 C# İle Bilgisayar Programlama Temelleri Aritmetik işleçler ve etkilerine bazı örnekler şunlardır: x true y x &&y false false true false true false true true true false false false false !x x || y x^y true true false false true true true false true false Tablo ve aşağıdaki örnek mantıksal “AND” (&&) işlecinin ancak her iki değişken de doğru olduğu zaman true döndürdüğünü göstermektedir. Mantıksal “OR” (||) işleci en az bir değişken doğru olduğu zaman true döndürür. Mantıksal olumsuzlama operatörü (!) argümanın değerini değiştirir. Örneğin işlenenin true değeri varsa ve bir olumsuzlama operatörü uygulanırsa, yeni değer false olacaktır. Olumsuzlama birli işleçtir ve argümandan önce yerleştirilir. İki işlenenden sadece birinin true değeri varsa Exclusive “OR” (^) true döndürür. İki işlenenin farklı değerleri varsa onlar aynı değerleri varsa, Exclusive “OR” true sonuç dönecek, aynı değerleri varsa false dönecektir. Mantıksal İşleçler - Örnek Aşağıdaki örnek mantıksal işleçlerin kullanımını ve bunların etkilerini gösteriyor: www.nakov.com Page 124 / 151 C# İle Bilgisayar Programlama Temelleri bool a = true; bool b = false; Console.WriteLine(a && b); // False Console.WriteLine(a || b); // True Console.WriteLine(!b); // True Console.WriteLine(b || true); // True Console.WriteLine((5 > 7) ^ (a == b)); // False De Morgan Kuralları Mantıksal işlemler matematiksel mantığın kapsamı içerisindeki De Morgan kurallarının altında toplanır. !(a && b) == (!a || !b) !(a || b) == (!a && !b) Birinci kural, iki önermenin birletiminin (mantıksal AND) olumsuzlanmasının, onların olumsuzlamalarının ayırtımına eşit olduğunu ifade eder. İkinci kural, her iki önermenin ayırtımının olumsuzlanmasının, olumsuzlamalarının birletimine eşit olduğunu ifade eder. onların Dizileri Bitiştirmek İçin İşleçler + işleci dizeleri (string) birleştirmek için kullanılır. İki veya daha fazla dizeyi birleştirir (peş peşe ekler) ve yeni bir dizge olarak sonuç döndürür. İfadedeki argümanlardan en az biri string türünde ise ve işlenenlerden bazıları string türünde değilse, başarılı olarak dize birleştirmeye izin vermesi için otomatik olarak string türüne dönüştürülür. .NET çalışma zamanı anında bizim için böyle işlem uyumsuzluklarının nasıl işlendiğini düşünmek fantastiktir, bu bize kodlamada biraz zaman tasarrufu ve programlama görevinin ana hedeflerine odaklanmamızı sağlar! Ancak, bir işlemi uygulamak istediğinizde değişkenlerin türünü dönüştürmeye zorlamayı (cast) gözden kaçırmamak iyi bir uygulamadır, gözden kaçırmak yerine, her işlem için uygun türe dönüştürülmüş olmalıdır ki böylece sonuç tam olarak kontrolümüzde olsun ve varsayılan tür dönüşümlerini önlemiş olalım. İşlemlerin türünü dönüştürmek hakkında daha detaylı bilgi bu bölümün ilerisinde “Tür Dönüşümleri” başlıklı bölümde verilecektir. www.nakov.com Page 125 / 151 C# İle Bilgisayar Programlama Temelleri Dizileri Bitiştirmek İçin İşleçler – Örnek İki dizeyi ve bir dizi ile bir dizeyi birleştirmeyi gösteren bir örnek aşağıda verilmiştir: string csharp = “C#”; string dotnet = “.NET”; string csharpDotNet = csharp + dotnet; Console.WriteLine(csharpDotNet); // C#.NET string csharpDotNet4 = csharpDotNet + “ “ + 5; Console.WriteLine(csharpDotNet4); // C#.NET 5 Örnekte string türünde iki değişkeni başlatıyoruz ve onlara değer atıyoruz. Üçüncü ve dördüncü satırda biz hem dizeleri bitiştirmek ve sonucu konsolda yazdırmak için Console.WriteLine() yöntemine geçiriyoruz. Sonraki satırda sonuç dizesini bir boşluk karakteri ve 5 sayısı ile bitiştiriyoruz. Döndürülen değeri csharpDotNet5 değişkenine atıyoruz, bu değişkenin türü otomatik olarak string türüne dönüştürülecektir. Son satırda sonucu yazdırıyoruz. „Dizeleri birleştirme (peş peşe ekleme, yapıştırma) yavaş bir işlemdir ve dikkatle kullanılmalıdır. Dizeler üzerinde yapılan döngülü (tekrarlayan) işlemler için StringBuilder sınıfını kullanmanız tavsiye edilir.” “Strings” Bölümü’nde bir döngü içinde dizeleri birleştirme işlemleri için neden StringBuilder sınıfının kullanılması gerektiğini ayrıntısıyla anlatacağız. www.nakov.com Page 126 / 151 C# İle Bilgisayar Programlama Temelleri Bitsel İşleçler Bir bitsel işleç sayısal türlerin ikili gösterimi üzerinde işlem yapan işleçtir. Bilgisayarlardaki tüm veriler ve özellikle sayısal veriler birler ve sıfırların bir dizisi olarak temsil edilir. İkili rakam sistemi bu amaç için kullanılır. Örneğin, 55 sayısı ikili rakam sisteminde 00110111 olarak temsil edilir. Verilerin ikili gösterimi uygundur, çünkü elektronikte sıfır ve bir Boole devreleri tarafından gerçekleştirilebilir, burada sıfır “elektrik yok” olarak yada örneğin –5V gerilim ile temsil edilir ve bir “elektrik var” ile yada örneğin + 5V gerilim ile temsil edilir. İkili rakam sistemini derinlemesine “Sayısal Sistemler” Bölümü’nde inceleyeceğiz, ancak şimdilik bilgisayarlarda sayıların birler ve sıfırlar olarak temsil edildiğini ve bitsel işleçlerin onları analiz etmek ve sıfırları tersine çevirerek bir ve birleri tersine çevirererek sıfır olarak değiştirmek için kullanıldığını düşünebiliriz. Bitsel işleçler mantıksal işleçlere çok benzerdir. Aslında, mantıksal ve bitsel işleçlerin aynı şeyi, ancak farklı veri türlerini kullanarak gerçekleştirdiklerini düşünebiliriz. Mantıksal işleçler, true ve false (Boole değerler) değerler ile çalışırlar, bitsel işleçler sayısal değerler ile çalışır ve bunların ikili temsili üzerinden bit düzeyinde uygulanır, yani bunlar sayıların bitleri (0 ve 1 basamaklarından oluşan) ile çalışır. C# mantıksal işleçleri gibi bitsel işleçler arasında “AND” (&), bitsel “OR” (|), bitsel olumsuzlama (~), ve excluding “OR” (^) vardır. www.nakov.com Page 127 / 151 C# İle Bilgisayar Programlama Temelleri Bitsel İşleçler ve Performansları 0 ve 1 ikili basamakları üzerinde bitsel işleçlerin performansı aşağıdaki tabloda gösterilmektedir: x y -x x&y x|y x^y 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 1 1 0 0 1 0 Gördüğünüz gibi, bitsel ve mantıksal işleçler birbirine çok benziyor. “AND” ve “OR” yazımları açısından aralarındaki fark mantıksal işleçlerin çift işaret (&&) ve çift dikey çubuk (||) ile yazılması, ve bitsel işleçlerin tek bir & simgesi veya dikey çubuk (|) ile yazılmasıdır. Exclusive “OR” için bitsel ve mantıksal işleçler aynıdır “^”. Mantıksal olumsuzlama için kullandığımız “!”, bitsel olumsuzlamada (evirme) “~” operatörünü kullanır. Programlama için mantıksal operatörlerde hiçbir benzeri olmayan iki bitsel işleç vardır. Bunlar sola bit kaydırma (<<) ve sağa bit kaydırma (>>) olarak tanımlıdır. Sayısal değerler üzerinde kullanılan bu işleçler sola veya sağa tüm bit değerlerini taşırlar. Sayının dışında kalan bitler kaybolur ve 0 ile yer değiştirir. Bit kaydırma işleçleri şu şekilde kullanılır: İşlecin sol tarafında işlecin kullanmak istediği değişkeni (işlenen) yerleştiririz, sağ tarafta kaç bit ofset istediğimizi belirten bir sayısal değeri koyarız. Örneğin, 3 << 2 üç sayısının bitlerini iki kez sola taşımak istediğiniz anlamına gelir. 3 sayısının bitleri şöyledir: “0000 0011”. İki kez sola hareket ettirildiğinde, ikili değer şöyle görünecektir: “0000 1100”, ve bu bitlerin dizilimi 12 sayısı olacaktır. Örneğe baktığımızda aslında sayıyı 4 ile çarpmış olduğumuzu görebilirsiniz. Bit kaydırmanın kendisi 2’nin bir üssü tarafından çarpma (sola kaydırma) veya bölme (sağa kaydırma) olarak temsil edilebilir. Bu olayın nedeni ikili rakam sisteminin doğasından kaynaklanmaktadır. Sağa hareket ettirmeye örnek 6 >> 2 ile verilirse, bu “0000 0110” ikili sayısını iki pozisyon sağa kaydırmak anlamına gelir. Burada en sağdaki iki basamağı kaybederiz ve sol tarafı sıfır ile besleriz. Sonuç “0000 0001”, yani 1 olacaktır. www.nakov.com Page 128 / 151 C# İle Bilgisayar Programlama Temelleri Bitsel İşleçler – Örnek Bitsel işleçlerin kullanımına bir örnek aşağıda verilmiştir. Sayıların ikili gösterimi ve bitsel işleçlerin sonuçları yorumlar (yeşil metin) halinde gösterilmiştir: byte a = 3; byte b = 5; // 0000 0011 = 3 // 0000 0101 = 5 Console.WriteLine(a | b); // 0000 0111 = 7 Console.WriteLine(a & b); // 0000 0001 = 1 Console.WriteLine(a ^ b); // 0000 0110 = 6 Console.WriteLine(~a & b); // 0000 0100 = 4 Console.WriteLine(a << 1); // 0000 0110 = 6 Console.WriteLine(a << 2); // 0000 1100 = 12 Console.WriteLine(a >> 1); // 0000 0001 = 1 Örneğimizde a ve b değişkenlerini oluşturuyoruz ve ilk değerleri ile başlatıyoruz. Sonra iki değişken üzerinde bazı bitsel işlemlerin sonuçlarını konsola yazdırıyoruz. Uyguladığımız ilk işlem olan “OR” örneği a ve b değişkenlerinin ikili gösterimi içinde 1 olan tüm pozisyonlar için, sonuçta da aynı pozisyonda 1 olduğunu gösteriyor. İkinci işlem “AND” olmuştur. İşlemin sonucunda sadece en sağ bit 1 içeriyor, çünkü a ve b değerlerinin aynı anda 1 olduğu tek pozisyon en sağ bitleridir. Exclusive “OR” sadece a ve b ikili bitlerinin farklı değerlere sahip olduğu pozisyonlarda 1 döndürür. Son olarak, mantıksal olumsuzlama ve bit kaydırma: sola ve sağa gösterilmektedir. Karşılaştırma İşleçleri C# karşılaştırma işleçleri iki yada daha fazla işleneni karşılaştırmak için kullanılır. C# dili tarafından desteklenen karşılaştırma işleçleri şunlardır: - - - - - - www.nakov.com daha büyük (>) daha küçük (<) daha büyük yada eşit (>=) daha küçük yada eşit (<=) eşitlik (==) farklılık (!=) Page 129 / 151 C# İle Bilgisayar Programlama Temelleri C# karşılaştırma işleçlerinin tümü ikilidir (iki işlenen alır) ve döndürdükleri sonuç bir Boole değeridir (true veya false). Karşılaştırma işleçleri aritmetik işleçlerden daha düşük önceliğe sahiptir, ancak atama işleçlerinden daha yüksek önceliğe sahiptir. Karşılaştırma İşleçleri – Örnek C# karşılaştırma operatörlerinin kullanımını gösteren bir örnek aşağıda verilmiştir: int x = 10, y = 5; Console.WriteLine(“x Console.WriteLine(“x Console.WriteLine(“x Console.WriteLine(“x Console.WriteLine(“x Console.WriteLine(“x > y : “ + (x > y)); // True < y : “ + (x < y)); // False >= y : “ + (x >= y)); // True <= y : “ + (x <= y)); // False == y : “ + (x == y)); // False != y : “ + (x != y)); // True Örnekte, ilk olarak x ve y değişkenlerini oluşturuyoruz ve bunlara sırasıyla 10 ve 5 değerlerini atıyoruz. Sonraki satırda Console.WriteLine(...) metotunu kullanarak x ve y değişkenlerinin > işlecinin kullanılmasıyla karşılaştırılmasının sonucunu konsola yazdırıyoruz. x değişkeni, y değişkeninden daha büyük bir değere sahip olduğundan döndürülen değer true olur. Benzer şekilde, x ve y değişkenlerini karşılaştırmak için kullanılan diğer 5 karşılaştırma işlecinden gelen sonuçlar, sonraki satırlarda yazdırılmaktadır. Atama İşleçleri Bir değişkene değer atamak için kullanılan işleç “=” olarak tanımlıdır (matematiksel denklem karakter). Bir değer atamak için kullanılan sözdizimi aşağıdaki gibidir: işlenen1 www.nakov.com = simgedeğer, ifade veya işlenen2; Page 130 / 151 C# İle Bilgisayar Programlama Temelleri Atama İşleçleri – Örnek Atama işlecinin kullanımını gösteren bir örnek aşağıda verilmiştir: int x = 6; string helloString = “Hello string.”; int y = x; Örnekte x değişkenine 6 değerini atıyoruz. İkinci satırda helloString değişkenine bir metin simgedeğeri atıyoruz ve üçüncü satırda biz y değişkenine x değişken değerini kopyalıyoruz. Peşpeşe Atama Atama işlemi kademeli olarak kullanılabilir (aynı ifadede bir defadan fazla). Bu durumda, atamalar, sağdan sola doğru arka arkaya gerçekleştirilmektedir. İşte bir örnek: int x, y, z; x = y = z = 25; Örnekte ilk satırda üç değişkeni başlatıyoruz ve ikinci satırda onlara 25 değerini atıyoruz. www.nakov.com „C# dilinde tanımlı atama operatörü, “=” iken karşılaştırma operatörü “==” dir. İki işleci değiştirerek kullanmak kod yazma sırasında yapılabilen yaygın bir hatadır. Birbirine çok benzer olan karşılaştırma işlecini ve atama işlecini karıştırmamak için dikkatli olun.” Page 131 / 151 C# İle Bilgisayar Programlama Temelleri Bileşik Atama İşleçleri Atama işleci dışında bileşik atama işleçleri de vardır. Bunlar hem işlem ve hem de atamayı birlikte gerçekleştirecek bir işleç ile kod miktarını azaltmaya yardımcı olurlar. Bileşik operatörler için aşağıdaki sözdizimi vardır: işlenen1 işleç = işlenen2; Üstteki ifade aşağıdaki gibidir: işlenen1 = işlenen1 işleç işlenen2; Atama yapan bir bileşik işleç örneği aşağıda verilmiştir: int x = 2; int y = 4; x *= y; // Same as x = x * y; Console.WriteLine(x); // 8 En yaygın olarak kullanılan bileşik atama operatörleri += vardır (işlenen2 değerini işlenen1 değerine ekler), –= (sol işlenenin değerinden sağ işlenen değerini çıkarır). Diğer bileşik atama operatörleri *=, /= ve %= olarak tanımlıdır. Aşağıdaki örnek bileşik atama işleçlerinin nasıl çalıştığı hakkında iyi bir fikir verir: int x = 6; int y = 4; Console.WriteLine(y *= 2); // 8 int z = y = 3; // y=3 and z=3 Console.WriteLine(z); // 3 Console.WriteLine(x |= 1); // 7 Console.WriteLine(x += 3); // 10 Console.WriteLine(x /= 2); // 5 www.nakov.com Page 132 / 151 C# İle Bilgisayar Programlama Temelleri Örnekte, öncelikle x ve y değişkenlerini oluşturuyoruz ve bunlara sırasıyla 6 ve 4 değerlerini atıyoruz. Sonraki satırda konsola y değişkeni üzerinde *= işleci ve 2 simgedeğeri ile uygulanan işlem sonucunda elde edilen yeni değeri yazdırıyoruz. İşlemin sonucu 8 ‘dir. Örneğin kalan kısımlarında diğer bileşik atama işleçlerini uyguluyoruz ve konsola sonuçlarını yazdırıyoruz. Koşullu İşleç ?: Koşullu işleç ?: iki ifadeden hangisinin hesaplanması ve sonuç olarak döndürülmesi gerektiğini belirlemek için bir ifadenin Boole değerini kullanır. Operatör üç işlenen üzerinden çalışır, bu nedenle üçlü işleçtir. Birinci ve ikinci işlenen arasına “?” karakteri yerleştirilir, ve ikinci ve üçüncü işlenen arasına “:” yerleştirilir. İlk işlenen (veya ifade) Boole olmalıdır ve sonraki iki işlenenin aynı türde olması gerekir, sayılar veya dizeleri gibi. ?: işlecinin sözdizimi aşağıdaki gibidir: işlenen1 ? işlenen2 : işlenen3 Şöyle çalışır: işlenen1 true olarak ayarlandıysa, işlecin sonucu işlenen2 değerini döndürür. Aksi halde (işlenen1 false olarak ayarlanmış ise), işlecin sonucu işlenen3 değerini döndürür. Çalışma sırasında, ilk argümanın değeri hesaplanır. true değeri varsa, o zaman ikinci (orta) argüman hesaplanır ve sonuç değeri olarak döndürülür. Ancak, ilk argümanın hesaplanan sonucu false ise, o zaman üçüncü (son) argüman hesaplanır ve sonuç değeri olarak döndürülür. Koşullu İşleç “?:” – Örnek Atama işlecinin kullanımını gösteren bir örnek aşağıda verilmiştir: int a = 6; int b = 4; Console.WriteLine(a > b ? “a>b” : “b<=a”); // a>b int num = a == b ? 1 : -1; // num will have value -1 www.nakov.com Page 133 / 151 C# İle Bilgisayar Programlama Temelleri Diğer İşleçler Şimdiye kadar aritmetik, mantıksal, bitsel işleçleri, dizeleri bitiştirme işlecini ve ayrıca koşullu işleci ?: inceledik. Bunların yanı sıra C# dilinde tanımlı kayda değer birkaç diğer işleç daha vardır. “.” İşleci Erişim işleci “.” (nokta) bir sınıf veya nesne yöntemlerine ve veri alanlarına erişmek için kullanılır. Nokta işlecinin kullanım örneği aşağıda verilmiştir: Console.WriteLine(DateTime.Now); // Prints the date + time [] Kare Köşeli Parantez İşleci Köşeli parantez [] bir dizinin elemanlarına endeks yoluyla erişmek için kullanılır. Dizinleyici olarak adlandırılır. Dizinleyiciler dize karakterlerine erişmek için de kullanılır. Örnek: int[] arr = { 1, 2, 3 }; Console.WriteLine(arr[0]); // 1 string str = “Hello”; Console.WriteLine(str[1]); // e () Parantez İşleci Parantez () ifadelerin ve işleçlerin yürütme önceliğini geçersiz kılmak için kullanılır. Parantezlerin nasıl çalıştığını daha önce görmüştük. Türü Dönüştürme İşleci Türü dönüştürme işleci (type) bir değişkeni bir türden başka bir türe dönüştürmek için kullanılır. “Türü Dönüştürme” Bölümü’nde ayrıntılı olarak inceleyeceğiz. “as” İşleci Türü dönüştürmek için as işleci de aynı zamanda kullanılır, ancak geçersiz dönüşümler istisnai durum değil, boş değer olan null döndürür. www.nakov.com Page 134 / 151 C# İle Bilgisayar Programlama Temelleri “new” İşleci Yeni nesneleri oluşturmak ve başlatmak için new işleci kullanılır. “Nesne Oluşturma ve Kullanma” Bölümü’nde ayrıntılı olarak inceleyeceğiz. “is” İşleci Bir nesnenin verilen bir tür ile uyumlu olup olmadığını kontrol etmek için (nesnenin türünü onaylamak için) is işleci kullanılır. “??” İşleci ?? işleci koşullu işlece ?: benzerdir. Farkı iki işlenen arasına yerleştirilmiş olmasıdır ve sadece değeri boş değilse sol işleneni döndürür, aksi takdirde sağ işleneni döndürür. Örnek: int? a = 5; Console.WriteLine(a ?? -1); // 5 string name = null; Console.WriteLine(name ?? “(no name)”); // (no name) Diğer İşleçler – Örnekler Açıkladığımız işleçleri gösteren bir örnek aşağıda verilmiştir: int a = 6; int b = 3; Console.WriteLine(a + b / 2); Console.WriteLine((a + b) / 2); string s = “Beer”; Console.WriteLine(s is string); // 7 // 4 // True string notNullString = s; string nullString = null; Console.WriteLine(nullString ?? “Unspecified”); // Unspecified Console.WriteLine(notNullString ?? “Specified”); // Beer www.nakov.com Page 135 / 151 C# İle Bilgisayar Programlama Temelleri Türü Dönüştürme ve Türe Zorlama Genellikle, işleçler aynı veri türüne sahip argümanlar üzerinde çalışır. Ancak C# dilinde tanımlı olan ve belirli bir amaç için en uygununu seçebileceğiniz çok çeşitli veri türleri vardır. Farklı veri türündeki iki değişken üzerinde işlem gerçekleştirmek için her iki değişkenin de aynı veri türüne dönüştürülmesi gerekir. Türü dönüştürme (türe zorlama) açık ve örtük olarak yapılabilir. Her C# ifadesinin bir türü vardır. Türü elde etmek için ifadenin yapısına ve türlerine, değişkenlere ve kullanılan simgedeğerlere bakmak gerekir. Geçerli bağlam için uygun olmayan bir türde ifade yazmak mümkündür. Bazı durumlarda bu bir derleme hatası verecektir, fakat diğer durumlarda ifadenin türüne benzer veya ilgili bir tür elde edilebilecektir. Bu durumda program türü dönüştürmeyi kapalı olarak gerçekleştirir. T türünün S türüne spesifik dönüştürülmesinin bir sonucu olarak S türü programın çalıştırılması sırasında T türünün bir ifadesi olarak davranış görür. Bazı durumlarda bu dönüşüm bir doğrulama gerektirecektir. İşte bazı örnekler: object türünden string türüne dönüşüm değerin gerçekten string türünün bir örneği olduğunu sağlaması için yürütülme zamanında doğrulama gerektirir. - string türünden object türüne dönüşüm herhangi bir doğrulama gerektirmez. string türü object türünün bir kalıtımı olduğu için bir hata veya veri kaybı riski olmadan kendi temel sınıfına dönüştürülebilir. “Nesne Tabanlı Programlama İlkeleri” Bölümü’nde kalıtımı ayrıntılarıyla inceleyeceğiz. - int türünden long türüne dönüşüm yürütülme sırasında doğrulama olmadan yapılabilir, çünkü int türündeki değerler kümesi long türündeki değerler kümesinin bir alt kümesi olduğu için veri kaybı riski yoktur. - double türünden long türüne dönüşüm 64-bit kayan noktalı değerden 64-bit tamsayıya dönüşümü gerektirir. Değerine bağlı olarak, veri kaybı mümkündür ve bu nedenle, türleri açık bir şekilde dönüştürmek gereklidir. - C# dilinde tüm türler diğer tüm türlere dönüştürülemeyebilir, ancak bunlardan sadece bazılarına dönüştürülebilir. Kolaylık sağlamak için, C# dilinin olası bazı dönüştürümlerini kendi türlerine göre üç kategoride gruplayacağız: - örtük dönüştürme - açık dönüştürme string türünden veya türüne dönüştürme - www.nakov.com Page 136 / 151 C# İle Bilgisayar Programlama Temelleri Türü Örtük Dönüştürme Türü örtük (kapalı) dönüştürme sadece dönüşüm sırasında veri kaybı riski olmadığı zamanlarda mümkündür, daha düşük bir aralığa sahip türden daha geniş bir aralık türüne dönüştürme yaparken (örneğin int türünden long türüne). Örtük dönüştürme yapmak için herhangi işleci kullanmak gerekli değildir ve dolayısıyla bu dönüşüme örtülü denir. Örtük dönüştürme derleyici tarafından otomatik olarak yapılır daha küçük aralığa sahip ile bir değişkene daha büyük aralıkta değer verdiğinizde yada ifadenin farklı aralığa sahip birkaç türü varsa. Böyle bir durumda, dönüşüm en yüksek aralıktaki tür içine uygulanır. Türü Örtük Dönüştürme – Örnekler Örtülü türü dönüştürmeye bir örnek aşağıda verilmiştir: int myInt = 5; Console.WriteLine(myInt); // 5 long myLong = myInt; Console.WriteLine(myLong); // 5 Console.WriteLine(myLong + myInt); // 10 Örnekte int türünde bir değişken, myInt, oluşturuyoruz ve 5 değerini atıyoruz. Bundan sonra long türünde bir değişken, myLong, oluşturuyoruz ve myInt değişkeninde bulunan değeri buna atıyoruz. mylong değişkeninde depolanan değer otomatik int türünden long türüne dönüştürülür. Son olarak, iki değişkenin toplamından çıkan sonucu yazdırıyoruz. Değişkenler farklı türde olduğu için otomatik olarak daha geniş bir aralıkta olan türe dönüştürülür, yani long türüne ve konsolda yazdırılan sonuç da yine long olur. Gerçekten de, Console.WriteLine() yöntemi için verilen parametre long türündedir, ancak yöntem içinde bu yeniden dönüştürülmüş olacak, bu kez string türüne, böylece konsolda basılabilir. Bu dönüşüm Long.ToString() yöntemi tarafından gerçekleştirilir. www.nakov.com Page 137 / 151 C# İle Bilgisayar Programlama Temelleri Olması Mümkün Örtülü Dönüşümler – Örnekler C# temel veri türleri üzerinde bazı olası örtülü dönüşümler şunlardır: - sbyte → short, int, long, float, double, decimal; - byte → short, ushort, int, uint, long, ulong, float, double, decimal; -short → int, long, float, double, decimal; -ushort → int, uint, long, ulong, float, double, decimal; -char → ushort, int, uint, long, ulong, float, double, decimal (char karakter türü olmasına rağmen bazı durumlarda bir sayı olarak kabul edilebilir ve sayısal türde davranış gösterebilir, hatta sayısal ifadelere katılabilir); -uint → long, ulong, float, double, decimal; -int → long, float, double, decimal; -long → float, double, decimal; -ulong → float, double, decimal; - float → double. Daha küçük bir aralıktaki türden daha büyük aralıktaki türe dönüştürme sırasında hiçbir veri kaybı olmaz. Sayısal değer dönüştürüldükten sonra aynı kalır. Birkaç istisna vardır. int türünden float (32-bit değerlere) türüne dönüştürdüğünüzde, aralarındaki fark int bir tamsayının tüm bitlerini kullanırken float için kesirli bölümü temsil etmede kullanılan bir bit parçasının olmasıdır. Dolayısıyla, int türünden float türüne dönüşüm yapıldığında yuvarlama nedeniyle keskinlik kaybı mümkündür. Aynı şey 64-bitlik long türünün 64-bit uzunluğunda bir double türüne dönüştürülmesi için de geçerlidir. Türü Açıkça Dönüştürme Veri kaybı olasılığı olduğunda açıkça tür dönüştürme kullanılır. Kayan nokta türünü tamsayı türüne dönüştürürken kesirli bölümünün kaldırılmasıyla gelen veri kaybı her zaman vardır ve türü açıkça dönüştürmek (örneğin, double türünden long türüne) zorunludur. Böyle bir dönüşüm yapmak için veri dönüştürme (type) işlecini kullanmak gereklidir. Aynı zamanda, daha geniş bir aralıktaki türden daha dar bir aralıktaki türe dönüştürürken de veri kaybı olabilir (double türünden float türüne veya long türünden int türüne). www.nakov.com Page 138 / 151 C# İle Bilgisayar Programlama Temelleri Türü Açıkça Dönüştürme – Örnek Türü açıkça dönüştürmenin kullanımını ve bazı durumlarda oluşabilecek veri kaybını gösteren bir örnek aşağıda verilmiştir: double myDouble = 5.1d; Console.WriteLine(myDouble); // 5.1 long myLong = (long)myDouble; Console.WriteLine(myLong); // 5 myDouble = 5e9d; // 5 * 10^9 Console.WriteLine(myDouble); // 5000000000 int myInt = (int)myDouble; Console.WriteLine(myInt); // -2147483648 Console.WriteLine(int.MinValue); // -2147483648 Örneğin birinci satırında myDouble değişkenine 5.1 değerini atıyoruz. (long) işlecini kullanarak long türüne (açıkça) dönüştürdükten ve konsola myLong değişkenini yazdırdıktan sonra değişkenin kesir kısmını kaybettiğini görüyoruz, çünkü long bir tamsayıdır. Sonra çift duyarlıklı bir gerçek sayı değişkeni olan myDouble için 5 milyar değeri atıyoruz. Son olarak, (int) işleci tarafından myDouble değerini int türüne dönüştürüyoruz ve myInt değişkenini yazdırıyoruz. int.MinValue yazdırmışız gibi aynı sonuç görünmektedir, çünkü myDouble değişkeni int aralığından daha büyük bir değer içeriyor. „Kapsam dışına çıkıldıktan sonra bir değişkenin değerinin ne olacağını tahmin etmek her zaman mümkün değildir! Bu nedenle, yeterince büyük aralıktaki türleri kullanın ve bir “küçük” türe geçiş yaparken dikkatli olun.” www.nakov.com Page 139 / 151 C# İle Bilgisayar Programlama Temelleri Türü Dönüştürme Sırasında Veri Kayıpları Tür dönüşümü sırasında veri kaybı için bir örnek vereceğiz: long myLong = long.MaxValue; int myInt = (int)myLong; Console.WriteLine(myLong); // 9223372036854775807 Console.WriteLine(myInt); // -1 Kasıtlı bir örtük dönüştürme durumunda türü dönüştürme operatörü de kullanılabilir. Bu kod okunabilirliğine katkıda bulunarak hata şansını azaltır ve birçok programcı tarafından iyi bir uygulama olarak kabul edilir. Türü dönüştürmeye verilebilecek biraz daha fazla örnek aşağıda verilmiştir: float heightInMeters = 1.74f; // Explicit conversion double maxHeight = heightInMeters; // Implicit double minHeight = (double)heightInMeters; // Explicit float actualHeight = (float)maxHeight; // Explicit float maxHeightFloat = maxHeight; // Compilation error! Yukarıdaki örnekte son satırda, derleme hatası üretecek bir deyim var, çünkü double türünü float türüne örtülü ve veri kaybına neden olabilecek şekilde dönüştürmek için çalışıyoruz. C# kesin türlendirmeli bir dil olduğu için bu gibi değerlerin tahsis edilmesine izin vermez. www.nakov.com Page 140 / 151 C# İle Bilgisayar Programlama Temelleri Türe Zorlama Sırasında Taşma İstinasının Fırlatılması Bazen büyük türden küçük türe geçiş sırasında türün taşmasıyla yanlış sonuç almak yerine sorunun bildirimini almak uygundur. Tamsayı türlerinde taşmayı kontrol etmeyi içeren bu anahtar sözcük checked ile tanımlıdır. double d = 5e9d; // 5 * 10^9 Console.WriteLine(d); // 5000000000 int i = checked((int)d); // System.OverflowException Console.WriteLine(i); Yukarıdaki kod parçasının yürütülmesi sırasında OverflowException türünde bir istisnai durum (yani, bir hata bildirimi) ortaya çıkar. İstisnalar ve bunları yakalayan ve işleyen yöntemler hakkında daha fazla bilgiyi “İstisnai Durum İşleme” Bölümü’nde bulabilirsiniz. Olması Mümkün Açık Dönüşümler C# sayısal türleri arasındaki açık dönüşümler aşağıda listelenen türler arasından herhangi ikisi arasında mümkündür: sbyte, byte, short, ushort, char, int, uint, long, ulong, float, double, decimal Bu dönüşümler sırasında sayı boyutu veya hassasiyeti ile ilgili bilgiler gibi birtakım veriler kaybolmuş olabilir. Dikkat ediniz ki, türe zorlama yoluyla string türüne veya türünden dönüştürme mümkün değildir. www.nakov.com Page 141 / 151 C# İle Bilgisayar Programlama Temelleri String Türüne Dönüştürme Gerekirse null değeri de dahil olmak üzere her türlü veriyi string türüne dönüştürebilirsiniz. Bitiştirme işlecini (+) kullandığınızda argümanlardan en az biri string türünde değilse dizelerin dönüşümü otomatik olarak yapılır. Bu durumda argüman string türüne dönüştürülür ve işleç iki dizenin bitiştirilmiş halini temsil eden yeni bir dize döndürür. Farklı nesneleri string türüne dönüştürmek için başka bir yol da değişken veya değer üzerinde ToString() metotunu çağırmaktır. Bu .NET Framework’ün tüm veri türleri için geçerlidir. Hatta 3.ToString() çağırmak da C# dilinde tamamen geçerlidir ve sonuç “3” dizesini dönecektir. String Türüne Dönüştürme – Örnek Farklı veri türlerini string türüne dönüştüren çeşitli örneklere göz atalım: int a = 5; int b = 7; string sum = “Sum = “ + (a + b); Console.WriteLine(sum); String incorrect = “Sum = “ + a + b; Console.WriteLine(incorrect); Örnekten elde edilen sonuç aşağıdaki gibidir: Sum = 12 Sum = 57 Perimeter = 24. Area = 35. Sonuçlardan açıktır ki, bir sayıyı bir karakter dizesine bitiştirmek dizeyi izleyen sayının metin gösterimini sonuçta döndürür. Dikkat ediniz ki, dizeleri bitiştirmek için kullanılan “+”, sayıların toplanması işleminde hoş olmayan etkilere neden olabilir, çünkü matematiksel toplama işleci “+” ile eşit önceliğe sahiptir. İşlemlerin öncelikleri parantez içine koyarak değiştirilmediği sürece, her zaman soldan sağa doğru yürütüleceklerdir. Dizeye ve dizeden dönüştürme hakkında daha fazla ayrıntıya “Konsol Giriş ve Çıkış” Bölümü’nde bakacağız. www.nakov.com Page 142 / 151 C# İle Bilgisayar Programlama Temelleri İfadeler Programın çalışmasının çoğu ifadelerin hesaplamasında geçer. İfadeler bazı türde (sayı, dize, nesne ya da başka türde) bir değere hesaplanan işleçler, simgedeğişmezler ve değişkenlerden oluşur. İşte ifadelerin bazı örnekleri: int r = (150-20) / 2 + 5; // Expression for calculating the surface of the circle double surface = Math.PI * r * r; // Expression for calculating the perimeter of the circle double perimeter = 2 * Math.PI * r; Console.WriteLine(r); Console.WriteLine(surface); Console.WriteLine(perimeter); Bu örnekte, üç ifade tanımlanmaktadır. İlk ifade bir dairenin yarıçapını hesaplar. İkinci ifade bir dairenin alanını hesaplamaktadır, ve sonuncu ifade çevresini bulur. Yukarıdaki program parçasının sonucu şöyledir: 70 15393.80400259 439.822971502571 İfadelerin Yan Etkileri İfade hesaplanması yan etkiye sebep olabilir, çünkü ifade gömülü atama işleçlerini içerebilir, çağıran yöntemlerin artan veya azalan değerlerine neden olabilir. Böyle bir yan etkinin bir örneği aşağıda verilmektedir: int a = 5; int b = ++a; Console.WriteLine(a); // 6 Console.WriteLine(b); // 6 www.nakov.com Page 143 / 151 C# İle Bilgisayar Programlama Temelleri İfadeler, Veri Türleri ve İşleç Öncelikleri İfadeleri yazarken, veri türü ve kullanılan işleçlerin davranışı dikkate alınmalıdır. Buna önem vermemek beklenmedik sonuçlara yol açabilir. İşte bazı basit örnekler: // First example double d = 1 / 2; Console.WriteLine(d); // 0, not 0.5 // Second example double half = (double)1 / 2; Console.WriteLine(half); // 0.5 İlk örnekte, bir ifade iki tamsayıyı bölüyor (1 ve 2 tamsayılarını) ve sonucu double türünde bir değişkene atıyor. Sonuç, bazılarınız için beklenmedik olabilir, ancak onlar bu durumda “/” işlecinin tamsayılar üzerinden çalıştığını ve sonucun kesirli kısmın kesilmesi ile elde edilen bir tamsayı olduğu gerçeğini görmezden gelenlerdir. İkinci örnek gösteriyor ki, sonuçta kesrin de göründüğü bir bölme yapmak istiyorsanız, işlenenlerden en az birinin float veya double türüne dönüştürülmesi gereklidir. Bu senaryoda bölüm sonucu artık tamsayı değildir ve sonuç doğrudur. Sıfıra Bölme Bir başka ilginç örnek de 0 ile bölünmedir. Programcıların çoğu 0 ile bölünmenin geçersiz işlem olduğunu ve çalışma zamanında bir hataya (istisnai durum) neden olacağını düşünür, ancak bu aslında sadece 0 ile tamsayı bölünmesi için doğrudur. 0 ile kesirsel bölme sonucunun Infinity veya NaN olduğunu gösteren bir örnek aşağıda verilmiştir: int num = 1; double denum = 0; // The value is 0.0 (real number) int zeroInt = (int) denum; // The value is 0 (integer number) Console.WriteLine(num / denum); // Infinity Console.WriteLine(denum / denum); // NaN Console.WriteLine(zeroInt / zeroInt); // DivideByZeroException www.nakov.com Page 144 / 151 C# İle Bilgisayar Programlama Temelleri Kodu Daha Anlaşılır Yapmak İçin Parantezlerin Kullanılması İfadeler ile çalışırken işlemlerin öncelikleri hakkında en ufak bir şüphe olduğunda parantez kullanmak önemlidir. Parantezlerin ne kadar yararlı olduğunu gösteren bir örnek aşağıda verilmiştir: double incorrect = (double)((1 + 2) / 4); Console.WriteLine(incorrect); // 0 double correct = ((double)(1 + 2)) / 4; Console.WriteLine(correct); // 0.75 Console.WriteLine(“2 + 3 = “ + 2 + 3); // 2 + 3 = 23 Console.WriteLine(“2 + 3 = “ + (2 + 3)); // 2 + 3 = 5 Console.WriteLine( “Perimeter = “ + 2 * (a + b) + “. Area = “ + (a * b) + “.”); Alıştırmalar 1. Bir tamsayının tek veya çift olup olmadığını kontrol eden bir ifade yazın. 2. Belirli bir tamsayının kalansız olarak hem 5 ve hem de 7 tarafından bölünebilir olup olmadığını denetleyen bir Boole ifadesini yazın. 3. Belirli bir tamsayının (sağdan sola) üçüncü basamağının 7 olup olmadığını kontrol eden bir ifade yazın. 4. Verilen bir tamsayının üçüncü bitinin 1 veya 0 olup olmadığını kontrol eden bir ifade yazın. 5. İki tarafı a, b ve yüksekliği h ile verilen bir yamuk alanını hesaplayan bir ifade yazın. www.nakov.com Page 145 / 151 C# İle Bilgisayar Programlama Temelleri 6. Kullanıcı tarafından girilen kenar ve yükseklik verisine göre bir dikdörtgenin çevresini ve alanını konsola yazdıran bir program yazın. 7. Ay’ın yerçekimi alanı Dünya’dakinin yaklaşık %17’sidir. Dünya üzerinde belirli bir ağırlığı verilen adamın aydaki ağırlığını hesaplayan bir program yazın. 8. Belirli bir {x, y} noktasının K({0, 0}, R=5) ile verilen dairenin içinde kalıp kalmadığını denetleyen bir ifade yazın. Açıklama: dairenin merkezi {0, 0} noktası ve yarıçapı 5’tir. 9. Belirli bir {x, y} noktasının K({0, 0}, R=5) ile verilen dairenin içinde ve [{-1, 1}, {5, 5}] ile verilen dikdörtgenin dışında kalıp kalmadığını denetleyen bir ifade yazın. Açıklama: dikdörtgen için sol alt ve sağ üst köşe verilmiştir. 10. abcd formatında girdi olarak dört haneli bir sayı alan ve aşağıdaki eylemleri gerçekleştiren bir program yazın (örneğin 2011) : - basamakların toplamını hesaplayan (örneğimizde 2 + 0 + 1 + 1 = 4). - sayıyı ters sırada konsola yazdıran: dcba (örneğimizde 1102). - son rakamı birinci konuma koyan: dabc (örneğimizde 1201). - ikinci ve üçüncü basamakları yer değiştiren: acbd (örneğimizde 2101). 11. Bir n sayısı ve p pozisyonu veriliyor. Sayının p pozisyonundaki bit değerini (0 ya da 1) yazdıran işlem dizisini yazın. n = 35, p = 5 → 1. Başka bir örnek: n = 35, p = 6 → 0. 12. v tamsayısının p pozisyondaki bit değerinin 1 olup olmadığını denetleyen bir Boole ifadesini yazın. Örnek v = 5, p = 1 → false. 13. Bir n sayısı, v değeri, (v = 0 veya 1) ve p pozisyonu verilmiştir. p pozisyonundaki bit değeri v değerine sahip olacak şekilde n değerini değiştirecek bir işlem dizisi yazın. Örnek: n = 35, p = 5, v = 0 → n = 3. Başka bir örnek, n = 35, p = 2, v = 1 → n = 39. www.nakov.com Page 146 / 151 C# İle Bilgisayar Programlama Temelleri 14. Belirli bir n sayısının (1 < n < 100) asal sayı olup olmadığını denetleyen bir program yazın (yani sadece 1’e ve kendisine kalansız bölünen). 15. Verilen bir 32-bit işaretsiz tamsayının 3, 4 ve 5’nci pozisyonlarındaki bit değerlerini 24, 25 ve 26’ncı pozisyonlarındaki bit değerleri ile değiştirecek bir program yazın. 16. Verilen bir 32-bit işaretsiz tamsayının {p, p+1, …, p+k-1} pozisyonlarındaki bit değerlerini {q, q+1, …, q+k-1} pozisyonlarındaki bitler ile değiştirecek bir program yazın. www.nakov.com Page 147 / 151 C# İle Bilgisayar Programlama Temelleri Bölüm 4: Konsol Giriş ve Çıkış Bölümün İçindekileri Bu bölümde veri girişi ve çıkışı için bir araç olarak konsol ile tanışacağız. Ne olduğunu, ne zaman ve nasıl kullanılacağını, ve programlama dillerinin çoğunun konsola nasıl eriştiğini açıklayacağız. C# dili için bazı kullanıcı etkileşimi özellikleri ile tanışacağız: Konsoldan metin ve sayıları okuma ve metin ve sayıları yazdırma. Aynı zamanda girişçıkış işlemleri için ana akımları inceleyeceğiz Console.In, Console.Out ve Console. Error, Console ve çeşitli biçimlerde veri yazdırma için biçim dizelerinin kullanımı. Konsol Nedir? Konsol işletim sisteminin bir penceresidir, bu pencere vasıtasıyla kullanıcılar işletim sisteminin sistem programları ile veya diğer konsol uygulamaları ile etkileşimde bulunabilirler. Etkileşim standart girdiden (genellikle klavye) metin girişi ile veya standart çıktı (genellikle bilgisayar ekranı) üzerinde metin görüntüleme şeklinde oluşur. Bu eylemler aynı zamanda giriş-çıkış işlemleri olarak bilinir. Konsolda yazılı metin bazı bilgileri getirir ve bir veya daha fazla program tarafından gönderilen bir karakter dizisidir. Kullanıcı ve Program Arasındaki İletişim Ne Zaman Konsol Kullanılmalıdır? Bir Konsol kullanıcı ile iletişim için bazı durumlarda yeri doldurulamaz bir araç olmaya devam etmektedir. Bu durumlardan biri kullanıcıya sonucun zarif gösteriminden daha çok çözülecek spesifik soruna dikkati odaklamanın gerekli olduğu küçük ve basit programlar yazmaktır. Daha sonra giriş ve çıkış konsolundan giriş yada sonucu çıktı yapan basit bir çözüm kullanılır. Başka bir kullanım da daha büyük bir uygulama için küçük bir kod parçasını test etmek istediğiniz durumdur. Konsol uygulamasının işleminin basitliği nedeniyle karmaşık bir kullanıcı arayüzü üzerinden gitmek zorunda kalmadan ve istediğiniz kodu almak için test için bir dizi ekran geliştirmeden kolayca ve rahatça bu küçük kod parçasını ayırabilirsiniz. çok program kullanıcı ile bir şekilde iletişim kurar. Programlara talimat vermek amacıyla kullanıcı için bu iletişim gereklidir. Modern iletişim yöntemleri çok ve çeşitlidir: grafik veya web-tabanlı arayüzler, konsol veya diğerleri yoluyla olabilir. Bahsettiğimiz gibi, ve arasındaki kullanıcılar programlar iletişim araçlarından biri de konsoldur. Konsol daha az kullanılır hale gelmektedir. Bunun nedeni, arayüzü modern kavramları ile kullanıcı çalışmanın kullanıcının bakış açısıyla daha uygun ve sezgisel olmasıdır. www.nakov.com Page 148 / 151 C# İle Bilgisayar Programlama Temelleri Konsol Nasıl Başlatılır? Her işletim sisteminin konsolu başlatmak için kendi yolu vardır. Windows’da örneğin şu şekilde yapılabilir: Start → (All) Programs → Accessories → Command Prompt Konsolu başlattıktan sonra siyah bir ekran (bu renk değiştirilebilir) aşağıdaki gibi görünmelidir: Konsolu başlatırken geçerli kullanıcının ev dizini (bu durumda kullanıcı adı nakov) geçerli dizin olarak kullanılır ve bu kullanıcı için bir rehber olarak gösterilir. „Konsol Start düğmesine basmak suretiyle başlatılabilir ve arama kutusuna “cmd” yazıp [Enter] tuşuna basarak (Windows Vista, Windows 7 ve üstünde). Windows XP için, Start → Run … →, “cmd” yazıp [Enter] dizisi üzerinden gidiniz.” Konsol ekranı yerine görüntülenmesi için bu kullanacağız: sonuçların basitleştirilmiş bölümde artık şu formu Konsoldan gelen sonuçlar www.nakov.com Page 149 / 151 C# İle Bilgisayar Programlama Temelleri Konsollar Hakkında Daha Fazlası Sistem konsolu metin bilgilerini görüntüleyen yukarıda gösterilen siyah penceredir. Metin dizelerini gösterir ve her karakter yazdırıldıktan sonra sağa hareket eden bir imlece sahiptir. İmleç konsolun son sütunundan geçtikten sonra (genellikle 80 sütunu vardır), sonraki satırın başına gider. İmleç, son satır üzerinden geçerse, konsolun içeriği yukarı kayar ve son satırın altına yeni boş bir satır gösterir. Windows programları konsol-tabanlı, masaüstü-tabanlı, Web-tabanlı ve diğerleri olabilir. Konsol-tabanlı programlar, giriş ve çıkış için konsolu kullanır. Masaüstü-tabanlı programlar grafik kullanıcı arayüzü (GUI) kullanırlar. Web-tabanlı programların Web-tabanlı kullanıcı arayüzü vardır. Bu kitapta biz hemen hemen her zaman konsol tabanlı programlar yazacağız, böylece girdileri klavyeden okunacak ve çıktıları konsolda yazdırılacaktır. Bazı konsol-tabanlı programlar, kullanıcıların metin, sayı ve diğer verileri girmesini beklerler ve bu genellikle klavye ile yapılır. Windows’da genellikle konsol “Komut İstemi” veya “kabuk” olarak da adlandırılan yada işletim sisteminde işletim sisteminin bir parçası veya ek olarak yüklü olan geniş bir yelpazedeki programların yanı sıra sistem komutlarına erişim sağlayan bir konsol-tabanlı program olan sistem komut yorumlayıcısı ile ilişkilidir. İşletim sisteminin “kabukları” işletim sistemine sağlayabildikleri arayüzün türüne göre iki ana kategoriye ayrılır: - - CLI - Komut Satırı Arabirimi - Komutlar için (Windows’daki cmd.exe ve Linux’daki bash gibi) bir konsoldur. GUI - Grafik Kullanıcı Arayüzü - (Windows Explorer gibi) grafiksel bir çalışma ortamıdır. www.nakov.com Page 150 / 151 C# İle Bilgisayar Programlama Temelleri Çoğu yorumlayıcı dosyaları içeren dizinlerin içeriğini incelemek gibi bazı gelişmiş özellikleri desteklemesine rağmen, her iki tür için kabuğun asıl amacı kullanıcının çalıştığı diğer programları yürütmektir. Örneğin Windows konsolu başlatıldığında, etkileşimli modda sistem programlarını ve komutları yürüten Windows komut yorumlayıcısını (cmd.exe) çalıştırırız. „Her işletim sisteminin kendi komutları olan kendi komut yorumlayıcısı vardır.” Temel Konsol Komutları Windows standart komut istemindeki programları bulmak ve başlatmak için yararlı olan bazı temel komutlara göz atacağız. Windows Konsol Komutları Konsolda çalışan komut yorumlayıcısı “Komut İstemi” veya “MS-DOS Komut İstemi” (Windows’un eski sürümlerinde) olarak adlandırılır. Bu yorumlayıcı için bazı temel komutlara bir göz atacağız: www.nakov.com Page 151 / 151