Program Lama

July 31, 2017 | Author: Muhammed Doğan | Category: N/A
Share Embed Donate


Short Description

Download Program Lama...

Description

PROGRAMLAMA

1

Görsel Programlama Dilinin Kurulumu ve Çalýþma Ortamý

2

Deðiþkenler (Variables), Ýþleçler (Operators) ve Deyimler (Statements)

3

Yöntemler Yazmak ve Kapsamý Belirlemek

4

Karar Ýfadeleri

5

Yineleme (Iteration) Ýfadeleri ve Döngüler

6

Hatalarý ve Özel Durumlarý Yönetmek

7

Sýnýflar (Class) ve Nesneler (Object) Oluþturup Yönetmek

8

Deðerleri ve Baþvurularý Anlamak

9

Numaralandýrma ve Yapýlarla Deðer Türleri Oluþturmak

10

Diziler (Arrays)

11

Parametre Dizileri

12

Kalýtým (Inheritance)

13

Çöp Toplayýcýsý (Garbage Collector) ve Bellek Yönetimi

ÜNİTE 1. Görsel Programlama Dilinin Kurulumu ve Çalışma Ortamı Ünitede Ele Alınan Konular 1. 2. 3. 4.

Sistem Gereksinimleri ve Görsel Programlama Dilinin Kurulumu IDE Kavramı Visual Studio.NET Ortamını Kullanarak Programlamaya Başlamak Windows Form Uygulaması Oluşturmak

Ünite Hakkında “C# Programlama Dili”, Microsoft’un geliştirmiş olduğu yeni nesil bir nesne yönelimli programlama dilidir. Birçok alanda C, C++ ve Java’yı kendisine örnek alır. Java’yı kendisine örnek aldığı alanlardan birisi de derlenen değil yorumlanan bir dil olmasıdır. Java’yı örnek almış olmasına karşın bazı özelliklerinden dolayı Java’dan daha fazla kolaylık sağlamaktadır. Özellikle nesne yönelimli programlama kavramının gelişmesine katkıda bulunan en etkin programlama dillerinden biridir. .NET kütüphanelerini kullanmak amacıyla yazılan programların çalıştığı bilgisayarlarda uyumlu bir kütüphanenin bulunması gereklidir Bu, Microsoft’un .Net Framework’ü olabileceği gibi ECMA standartlarına uygun herhangi bir kütüphane de olabilir. Yaygın diğer kütüphanelere örnek olarak Portable.Net ve Mono verilebilir. Öğrenme Hedefleri Bu ünite tamamlandığında; 1. Görsel bir programlama dili ne demektir öğrenmiş olacaksınız. 2. IDE kavramını öğreneceksiniz. 3. Konsol uygulaması geliştirmeyi öğreneceksiniz. Üniteyi Çalışırken Üniteyi dikkatli şekilde okuyun programı kurmak için gerekli adımları izleyerek programı kurunuz ve ünitede verilen uygulamalar dışında uygulamalar yaparak becerinizi geliştiriniz. Unutmayın farklı uygulamalar geliştirmek; öğrenmenize yardımcı olacaktır. Ve asla denemekten vazgeçmeyin.

Sistem Gereksinimleri ve Görsel Programlama Dilinin Kurulumu Sistem Gereksinimleri Programlama I ve Programlama II adında iki dönemde alacağınız bu ders için öncelikle Microsoft Visual Studio 2008 programını kurarak başlayalım. Visual Studio 2008’i bilgisayarlarınıza kurmanız ve problemsiz bir şekilde çalışmalarınızı yürütebilmeniz için öncelikle aşağıda belirtilen sistem özelliklerine sahip bir bilgisayar edinmeniz gerekiyor. Donanım Gereksinimleri: • • • • •

En az 1.6 GHz işlemci En az 2.2 GB kullanılabilir disk alanı (3GB ve fazlası önerilir) En az 512 MB RAM kapasitesi (2 GB önerilir) En az 5400 RPM Hard Disk Sürücü En az 1024*768 çözünürlüğü destekleyen bir monitor.

Visual Studio 2008 aşağıdaki işletim sistemleri üzerine kurulabilir: • •

Windows Vista (x86 & x64) – Başlangıç sürümü (Starter Edition ) hariç Windows XP Service Pack 3 – Başlangıç Sürümü (Starter Edition) hariç

Visual Studio 2008 Kurulumu

Install Visual Studio 2008 seçeneğine tıklayarak kurulum işlemine başlıyoruz.

Daha sonra çıkan bu ekranda; eğer programda kurulum esnasında oluşan hataların tespit edilip Microsoft’a gönderilmesini istiyorsanız ekrandaki kutucuğu işaretlemeniz gerekir. Bu bir zorunluluk değildir istemiyorsanız boş bırakıp Next butonuna tıklayarak devam edebilirsiniz.

Gelen bu ekranda “I have read and accept the license terms.” (Lisans sözleşmesini okudum ve kabul ediyorum.) seçeneğini işaretleyip gerekli yere ismi girdikten sonra Next tuşuna basarak kuruluma devam ediyoruz. Gerekli şifre, kurulum DVD’sinin üzerinde olacaktır. Deneme sürümünü kuruyorsanız bu alanı boş bırakabilirsiniz.

Bu ekranda Default, Full, Custom gibi seçenekler ile karşılaşacaksınız. Eğer kurulumu Default seçerek yaparsanız önerilen özellikler kurulacaktır. Herhangi bir alan sıkıntınız yoksa ve bütün özellikleri kullanacağınızı düşünüyorsanız Full seçeneği işaretlenebilir. Custom ise sadece kullanacağınız özellikleri kendiniz belirlemeniz için oluşturulmuş bir alandır. Default ya da Full kurmanızı öneririm.

Bu ekranda seçmiş olduğunuz kurulum tipine göre bütün seçenekler sırasıyla yüklenecektir. Bilgisayarınızın hızına bağlı olarak 20 ile 40 dakika arasında bir süre içerisinde kurulum tamamlanacaktır.

Gelen bu son ekranda Finish diyerek kurulum işlemini tamamlıyoruz.

Bilgisayar yazılımı alanında kabul görmüş olan en güçlü görsel programlama platformlarından birini kurmuş bulunmaktasınız. Burada yapabilecekleriniz hayal gücünüzle ve azminiz ile sınırlı. Görsel programcılığın heyecan verici dünyasına hoş geldiniz. Giriş Kurmuş olduğunuz Microsoft Visual Studio platformunda Viusal C++, Visual Basic ve Visual C# gibi programlarda uygulamalar geliştirebilirsiniz. Bu ders içeriğinde C# programı anlatılacaktır. Daha önce C, C++ gibi ortamlarda uygulamalar geliştirmemiş bile olsanız ders içeriği en temelden başlayarak ele alınacaktır. Bu sizler için iyi değerlendirildiğinde bir avantaj olarak görülebilir. Microsoft Visual C#.Net öncelikle Microsoft.Net platformunda çalışacak uygulamalar geliştirmek isteyen programcıları hedef alan güçlü ve basit bir dildir. Microsoft Visual C#.Net, C++ ve Visual Basic’in birçok özelliğini içinde barındırmakla beraber bu dillerdeki bazı tutarsızlıkları ve hataları düzelterek daha temiz ve mantıklı bir dil ortaya çıkmıştır. Bu ders içeriğinde C# dilinin özelliklerini öğreneceksiniz ve bunları kullanarak Windows ve Web uygulamaları geliştirebileceksiniz. IDE KAVRAMI

Integrated Development Environment (Tümleşik Geliştirme Ortamı) bilgisayar programcılarının hızlı ve rahat bir şekilde yazılım geliştirebilmesini amaçlayan, geliştirme sürecini organize edebilen birçok araçla birlikte geliştirme sürecinin verimli kullanılmasına katkıda bulunan araçların tamamını içerisinde barındıran bir yazılım türüdür. Tümleşik geliştirme ortamlarında olması gerekli en temel özellikler: •

Programlama diline göre sözdizimi(syntax) renklendirmesi yapabilen kod yazım editörü.



Kod dosyalarının hiyerarşik olarak görülebilmesi amacıyla hazırlanmış gerçek zamanlı bir dizelge.



Tümleşik bir derleyici (compiler), yorumlayıcı (interpreter) ve hata ayıklayıcı (debugger).



Yazılımın derlenmesi, bağlanması, çalışmaya tümüyle hazır hale gelmesi ve daha birçok ek işi otomatik olarak yapabilmek amacıyla küçük inşa araçları.

Visual Studio.NET Ortamını Kullanarak Programlamaya Başlamak Bir konsol uygulaması geliştirmek için Visual Studio 2008’i açalım (Bundan sonra program olarak bahsedilecektir.). Açılan ekranda File menüsünden New’i seçelim karşımıza çıkacak alt menülerden Project seçeneğine tıklayalım. Yeni bir uygulama açmak için Ctrl+Shift+N klavye kısa yoluda kullanabilirsiniz.

New Project iletişim kutusu açılacaktır. Bu iletişim kutusu kullanılarak “Windows Form Application”, “ASP.NET Web Application”, “Console Application” gibi oluşturmak istediğiniz uygulamanın türünü belirleyen bir şablon seçebilirsiniz. Bizim ilk uygulamamız bir konsol uygulaması olacaktır. Uygulamayı yaratmak için aşağıdaki adımları takip ediniz:



Project Types bölmesinden “Visual C# Projects” simgesini seçin



Templates bölmesinden Console Application simgesini seçin.



Location alanına projelerinizi kaydedeceğiniz sürücü ve klasörün adresini yazınız (Bu derste yapacağınız tüm uygulamalar için ortak bir klasör kullanmaya özen gösterin. Bu alanda belirttiğiniz klasör yoksa Visual Studio.NET sizin için bu klasörü oluşturacaktır).



Name alanına projenize vermek istediğiniz ismi yazınız (Örnek: MerhabaDunya),



Son olarak OK butonuna bastığınızda yeni bir proje ekranı açılacaktır.

Kodlama işlemine geçmeden önce ekranı biraz inceleyelim. Menüler ve Araç Çubukları: Tüm Windows programlarında olduğu gibi menülerin ve araç çubuklarının bulunduğu bir bölüm var. Bu menü ve araç çubukları komutlara ulaşmanızı sağlayacaktır. Kodlama Alanı: Ekranın orta kısmı yani kod bölmesi kaynak dosyaları görüntüler ( Bizim oluşturduğumuz uygulamada Program.cs sekmesini ve bu uygulamaya ait kodları görüyoruz.). Eğer programımız birden fazla dosyadan meydana geliyorsa her kaynak dosyası kendisine ait etiketlenmiş bir sekme ile gösterilecektir. Bu durumda seçili olan sekmeye ait kodlama ekranında çalışabilirsiniz. Solution Explorer: Proje ile ilgili dosyaların adlarını görüntüler. Bir projeye ait birden fazla dosya oluşturulur. Projeyi oluşturduğunuz klasörü açtığınızda proje ismi ile oluşturulmuş bir klasör göreceksiniz. Her proje kendine ait bir klasör de tutulur. Solution Explorer’da gördüğünüz dosya isimlerini bu projeye ait klasör içinde de görebilir gerekirse buradan ulaşabilirsiniz. Bu ekrandaki dosyaları işaretlediğinizde bu bölümün hemen altında Properties ekranında dosyalara ait özellikleri görebilir ve gerektiğinde düzenlemeler yapabilirsiniz. Bu bölümdeki bazı dosyaların ne işe yaradığını açıklayalım. MerhabaDunya: Koyu olarak yazılan dosyanın üzerine tıklayın (MerhabaDunya). Properties ekranında Project File kısmında MerhabaDunya.csproj ismini göreceksiniz. Bu

dosya bir C# proje dosyasıdır. Her proje dosyasına ait bir ya da daha fazla sayıda kaynak dosyaolabilir. Bir projedeki kaynak dosyalar aynı programlama dili kullanılarak oluşturulmalıdır. Yani programın bir kısmı C# başka bir kısmı ise Visual Basic ile hazırlanamaz. Program.cs: Bir C# kaynak dosyasıdır. Kodlama işlemi bu dosya üzerinde gerçekleştirilir. Bu bölüm içerisinde daha sonra bahsedeceğimiz ve Visual Studio.NET tarafından oluşturulmuş program kodları mevcuttur. AssemblyInfo.cs: Bu ds bir başka C# kaynak dosyasıdır. Bu dosyayı, programa ait öz nitelikleri belirtmek için kullanırsınız. Yazar adı, programın yazıldığı tarih vs. Bu bilgilerden sonra Visual Studio tarafından oluşturulan kod bloklarını inceleyelim. Program.cs dosyası Main adlı bir yöntemi çağıran Program adındaki bir sınıfı (class) tanımlar. Bütün yöntemler bir sınıfın içerisinde tanımlanmalıdır. Main yöntemi özel bir yöntemdir ve programın başlangıç noktasını belirler. Burada kullanılan Main yöntemi durağan (statik) bir yöntem olmalıdır. Önemli Not: Yöntemler konusu ilerleyen bölümlerde ele alınacaktır (Main yöntemi, Durağan Yöntemler vb.). Önemli Not: C# büyük küçük harf duyarlı bir dildir (Case Sensitive). Main’i büyük M ile yazmalısınız. Bu uygulamada konsolda Merhaba Dünya metnini gösteren kodu yazacağız. Daha sonra bu kodu çalıştırıp kod öğelerini bölümlemek için namespace’in (ad alanlarının) nasıl kullanıldığını öğreneceğiz. Kodlama işlemini gerçekleştirirken IDE’nin bize sunmuş olduğu teknolojilerden biri olan IntelliSense teknolojisinden faydalanacağız. IntelliSense teknolojisi kod tamamlama teknolojisi olarak adlandırılabilir. Bir program geliştirici olarak daha hızlı ve doğru kodlar yazmanızı sağlar. Bir IntelliSense önerisini kabul etmek için açılan listeden ok tuşları yardımı ile kullanacağınız komutu seçtikten sonra klavyeden TAB, ENTER ya da BOŞLUK (SPACE) tuşlarına basmanız gerekir. Seçim işlemi fare yardımıyla da gerçekleştirilebilir. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MerhabaDunya { class Program { static void Main(string[] args) { } } }

Kodlama alanında Visual Studio tarafından oluşturulan yukarıdaki kodları inceleyelim. Using ile tanımlanan alanlar otomatik olarak koda include (dâhil) edilmiş olan library’lerdir. Program, bloklar halinde oluşturulmuştur. Blokların oluşturulduğu alanlardaki – işaretine tıkladığınızda o blok kapatılarak + işaretine dönüşür. Bu işaret üzerine yeniden tıkladığınızda ise blok açılır ve bu blok içindeki kodları görebilirsiniz. Library (Kütüphane) programın ihtiyaç duyduğu bir takım özelliklerin çalışmasını sağlar. Örneğin Input, Output işlemleri gibi. Buradan sonraki bölümler kodlamaya aittir. Bu noktada bizi asıl ilgilendiren kısım ise aşağıdaki kod parçasıdır. static void Main(string[] args) { }

Konsolda “Merhaba Dünya” metnini görüntülemek için gerekli olan kodu küme parantezleri arasında oluşturacağız. Bu parantezler arasına Console yazmaya başladığımız anda IntelliSense listesi ekranda görüntülenecek ve yazmaya çalıştığınız kod parçası karşınıza çıkacaktır. Burada class, struct, enum, interface, delegate ve namespace’leri temsil eden semboller karşınıza çıkacaktır. Her bir sembol yeri geldiğinde detaylı bir şekilde açıklanacaktır. Bizim bu programda kullandığımız Console bir sınıfı (class) temsil etmektedir. Console yazdıktan sonra bir nokta koyun bu durumda Console sınıfının bütün yöntemlerini ve özelliklerini içeren yeni bir liste karşınıza çıkacaktır. Noktadan Sonra WriteLine yazacağız. Daha ilk karakteri yazdığımız anda W ile başlayan tüm yöntemler ve sınıflar listede belirecektir. Buradan WriteLine yöntemini OK tuşları ile seçerseniz sonrasında klavyeden Tab, Enter ya da Boşluk (Space) tuşlarına basarak bu yöntemi programınıza ekleyebilirsiniz. Bu işlemi fare ile yöntem üzerine çift tıklayarak da gerçekleştirebilirsiniz. Sonrasında normal bir parantez açınız. Parantez açıldığı anda bir IntelliSense ipucu ekranda belirecektir. Bu ipucu ekranı bu blok içerisinde nasıl bir kodlama yapmanız gerektiği hakkında size bilgi verecektir. Parantez içerisinde çift tırnak içerisinde ( “ ” ) konsolda görüntülenmesini istediğiniz metni yazınız. Parantezi kapadıktan sonra noktalı virgül (;) koyarak satırı sonlandırınız. Biz örneğimizde programcılığa başlangıçta klasik hale gelmiş olan “Merhaba Dünya” metnini kullandık. Bu noktadan sonra kodumuz aşağıdaki şekilde görüntülenmelidir. static void Main(string[] args) { Console.WriteLine("Merhaba Dünya"); }

Önemli Not: Parantezler içerisinde ifadeler oluştururken ya da blokları tanımlarken açmış olduğunuz parantezi önce kapatın ve sonrasında içine kodu yazmaya başlayın. Böylece parantezi kapatmayı unutmayacak ve programınızda syntax hataları ile karşılaşma olasılığını azaltmış olacaksınız. Programımız şu anda hazır durumda. View menüsünden Output seçeneğine tıklayın ekrana Output adında bir bölüm oluşturulacaktır.

Sonrasında Build menüsünden Build MerhabaDunya yazan sekmeye tıklayın. (Bu işlemin klavye kısa yolunun Shift+F6 olduğuna dikkat edin).

Programımız başarılı bir şekilde oluşturulduğunda Output ekranında aşağıdaki çıktıyı göreceksiniz. Burada koyu olarak belirtilen bölümler sizin ekranınızda aynı şekilde görünüyorsa oluşturma işlemi başarıyla tamamlanmış demektir. Yazmış olduğunuz programlarda kimi zaman Warning’ler ile karşılaşabilirsiniz. Warning bir uyarıdır ve program bu haliyle de çalışabilir. ------ Build started: Project: MerhabaDunya, Configuration: Debug Any CPU -----C:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll" /reference:"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll" /reference:"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll" /debug+ /debug:full /filealign:512 /optimize- /out:obj\Debug\MerhabaDunya.exe /target:exe Program.cs "Properties\AssemblyInfo.cs"

Compile complete -- 0 errors, 0 warnings MerhabaDunya -> C:\Documents and Settings\ayhanaydın\Desktop\uzaktanegitim\MerhabaDunya\MerhabaDunya\bin\Debug\MerhabaDunya.exe

========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

Şimdi Debug menüsünden Start Without Debugging’i tıklayın (Ctrl+F5). Programınız Command penceresinde çalışır ve aşağıdaki gibi bir ekran görüntüsü elde edersiniz. Bu ekrandan çıkmak için klavyeden herhangi bir tuşa basabilirsiniz.

Önemli Not: Start Without Debugging yerine Start’ı tıklarsanız programınız yine çalışır fakat çok kısa bir süreliğine ekranda görünür ve kaybolur. Ad Alanlarını Kullanmak (NameSpace) Yazmış olduğumuz programlar büyüdükçe iki sorunla karşılaşabilirsiniz. Bunlardan birincisi, uzun kod kısa koddan daha zor anlaşılır ve bakımı zordur. İkincisi ise daha uzun kod daha çok ad, adlandırılmış veri, adlandırılmış işlev ve adlandırılmış sınıf demektir. Adların sayısı arttıkça projenin oluşturulamama olasılığı artar ve ad çakışmaları meydana gelebilir. Bu adları belli kurallar dâhilinde uzatmak mümkündür fakat bu iyi bir çözüm değildir. Ad alanları tanımlayıcılar için adlandırılmış bir container (taşıyıcı ya da kap) yaratarak bu sorunu çözmeye yardımcı olur. Aşağıdaki örneği inceleyelim: namespace SampiyonlarLigi { class Fenerbahce { ... } class RealMadrid { ... } }

Burada SampiyonlarLigiFenerbahce adında bir sınıf yaratmak yerine SampiyonlarLigi adında bir ad alanı içinde Fenerbahce, RealMadrid gibi sınıflar yaratmak daha kullanışlıdır. Bu işlem yapıldığında istediginiz sınıfa SampiyonlarLigi.Fenerbahce yani namespace.classadı yazarak başvurabilirsiniz. Bu namespace alanına yeni sınıflar eklemek istediğinizde sınıf yapısını oluşturmanız yeterli olacaktır. .NET Framework yazılım geliştirme paketi (Software Development Kit, SDK) tüm sınıf yapılarını ad alanları içinde oluşturmanızı önerir ve Visual Studio.NET ortamı da projenizin adını en üst düzey ad alanı olarak alır ( Projeyi oluştururken vermiş olduğumuz isim bizim en üst düzey alan adımızdır.). Önemli Not: Alan adı ile aynı ismi taşıyan sınıflar (class) oluşturmamaya özen gösterin. Bizim örneğimizde kullandığımız Console sınıfı System ad alanında yer alır. Yani biz Console sınıfını kullanmak istediğimizde System.Console yazarak kullanabiliriz. Kodumuzu yeniden inceleyerek “using System;” satırına dikkat edin. Burada using bir yönergedir ve using yönergelerini bir kaynak dosyanın en üstüne veya bir ad alanında ilk ifade olarak ekleyebilirsiniz. Önemli Not: Kodunuzda açıklama satırları oluşturmak istediğinizde (Bu kısım derleyici tarafından elenir.) // ile tek satırlık açıklamalar ekleyebilirsiniz. Eğer kodun birkaç satırında açıklama blokları oluşturmak istiyorsanız /* ile başlayıp */ ile bu açıklama bloğunu sonlandırabilirsiniz.

Uygulama: Projenizin ilk satırında bulunan using System; satırının başına // ekleyerek Build menüsünden Build komutuna tıklayın oluşturma işleminin başarısız olduğunu göreceksiniz. Output bölmesinde oluşturma işleminin başarısız olduğunu gösteren açıklama satırlarının son ikisi aşağıdaki gibi görüntülenecektir. Compile complete -- 1 errors, 0 warnings == Build: 0 succeeded or up-to-date, 1 failed, 0 skipped == Ekranınızdaki Error List bölümünde ise hataya neden olan tanımlama iletisini görürsünüz. Bu ileti üzerine çift tıklayarak hataya neden olan satıra gidin ve bu satırı System.Console.WriteLine("Merhaba Dünya"); şeklinde değiştirin. Kodu yeniden Build edin ve oluşturma işleminin gerçekleştiğini gözlemleyin. Sonrasında Debug menüsünden Start Without Debugging’i tıklayarak programınızı yeniden çalıştırın. Önemli Not: Bu programlama dilini öğrenirken kimi zaman bilerek hatalar yapın. Bu şekilde öğrenmek ileride karşılaşacağınız hata mesajlarında nasıl davranacağınız konusunda sizlere yardımcı olacaktır. WINDOWS FORM UYGULAMASI Daha önce oluşturduğumuz Merhaba Dünya örneğini bu sefer Visual Studio.NET Visual Designer’ını kullanarak yeniden oluşturalım. Visual Studio.NET ortamı bu uygulama için gerekli olan her şeyi kullanıcılarına sağlamaktadır. Şimdi sırasıyla aşağıdaki adımları takip ederek uygulamayı oluşturalım ve kodlama işlemine başlayalım. •

Birinci uygulamada olduğu gibi New sekmesinin altından Project’i seçerek New Project iletişim kutusunu açalım.



Project Types bölmesinde C#’ ın seçili olduğundan emin olun ve Templates bölümünden Windows Application’ı tıklayın.



Location alanına çalışma klasörünüzü gösterin ve programınız için bir isim verip OK tuşuna tıklatın.

Boş bir Windows formu yaratılıp Design View’de yukarıdaki gibi görüntülenecektir. Bu ekranda ilk gözümüze çarpan noktalar sol taraftaki Toolbox ve oluşturulan Form nesnesidir. Uygulamamızı oluşturmaya başlayalım. Sol taraftaki Toolbox menüsünden All Windows Forms sekmesinin yanındaki + işaretini basın ve bu menüye ait tüm özellikleri görüntüleyin. Önemli Not: Seçmiş olduğunuz çalışma düzenine bağlı olarak ekran görünümü farklılıklar gösterebilir. Toolbox yazısının sağında bulunan simgeleri inceleyin bu simgeler bu menünün ekranda nerede bulunacağı, gizli ya da görünür olması; ya da kapatılmasıyla ilgili işlemleri gerçekleştirir. Buradaki bir adet TextBox ve bir adet Buton’u ya sürükleyerek ya da önce Toolbox bölümünde işaretleyip sonrada Form üzerine tıklayarak aşağıdaki şekilde ekranınıza yerleştiriniz.

Şimdi formunuzun üzerinde farenin sağ tuşuna tıklayarak View Code sekmesini tıklayın. Şimdi ekranınızda bir Form1.cs birde Form1.cs[Design] adında iki sekme görülecektir (Bu işlemi Solution Explorer üzerinde Form1.cs seçip bu bölümün üstünde bulunan kısa yol simgeleri ile de gerçekleştirebilirsiniz). Form1.cs sekmesini tıklayın burada Visual Studio.NET tarafından otomatik olarak oluşturulan kodları göreceksiniz. Buradaki using yönergelerini dikkatli bir şekilde inceleyin. Şimdi Form1.cs[Designer] üzerinde oluşturduğunuz objelerin özelliklerini görmek için üzerine tıklayın sağ tarafta Properties alanında bu objelere ait özellikleri göreceksiniz. Buton1 nesnesini seçip Properties ekranından bu objenin textini(metnini) OK olarak değiştirin ve form üzerinde boş bir alana tıklayın. Buton ismi “OK” olarak değişecektir. Form üzerinde butonun üzerine çift tıklayın kodlama ekranına döneceksiniz ve aşağıdaki gibi bir yapı ile karşılaşacaksınız. private void button1_Click(object sender, EventArgs e) {

}

Burada aşağıdaki kodlamayı yapın. private void button1_Click(object sender, EventArgs e) { textBox1 .Text

= ("Merhaba Dunya");

}

Oluşturduğumuz formda textbox nesnesinin text alanı boştu (Properties alanından kontrol edin.). Biz yazdığımız kod ile bu nesnenin text’inin Merhaba Dünya olmasını istedik. Uygulamamız çalıştırılmaya hazır. Debug menüsünden Start Debugging, klavyeden F5 ya da kodlama alanının hemen üzerinde bulunan Play butonuna tıklayarak uygulamayı test ediniz. Bu işlem sonucunda “Form”unuz ekranda görüntülenecek ve OK butonuna basıldığında Merhaba Dünya metni görüntülenecektir.

ÖZET Visual Studio programının kurulumu ve IDE ortamından bahsedilmiştir. Bir adet konsol ve bir adet de Windows uygulaması yapılarak kullanılan platform özelliklerinden söz edilmiştir. Visual Studio.NET ve C# programlama dilinin bazı özellikleri anlatılmıştır.

DEĞERLENDİRME SORULARI 1. Bir blok halinde açıklama yapmak için aşağıdaki sembollerden hangileri kullanılır? a. // b. /* */ c. */ d. * e. / 2. Console sınıfı hangi namespace’e (alan adı) aittir? a. Writeline b. Input/Output c. Program d. System e. Linq 3. C# …………. ……….. duyarlı bir dildir. (Büyük Küçük Harf)

1

PROGRAMLAMA

2

Görsel Programlama Dilinin Kurulumu ve Çalýþma Ortamý

Deðiþkenler (Variables), Ýþleçler (Operators) ve Deyimler (Statements)

3

Yöntemler Yazmak ve Kapsamý Belirlemek

4

Karar Ýfadeleri

5

Yineleme (Iteration) Ýfadeleri ve Döngüler

6

Hatalarý ve Özel Durumlarý Yönetmek

7

Sýnýflar (Class) ve Nesneler (Object) Oluþturup Yönetmek

8

Deðerleri ve Baþvurularý Anlamak

9

Numaralandýrma ve Yapýlarla Deðer Türleri Oluþturmak

10

Diziler (Arrays)

11

Parametre Dizileri

12

Kalýtým (Inheritance)

13

Çöp Toplayýcýsý (Garbage Collector) ve Bellek Yönetimi

ÜNİTE 2. Değişkenler (Variables), İşleçler (Operators) ve Deyimler (Statements) Ünitede Ele Alınan Konular 1. Anahtar Sözcükleri (Keywords) ve Değişkenler 2. Temel Veri Türleri ve Aritmetik İşleçler Ünite Hakkında Bu ünitede ifadeler, anahtar sözcükler (keywords) ve tanımlayıcılar (identifiers) gibi Microsoft Visual C# syntax (sözdizimi) ve dil yapısının parçalarını tanıyacaksınız. Ayrıca değişken tanımlamayı ve kullanmayı göreceksiniz. C#’ın özelliği olan aritmetik operatörleri ve değerleri değiştirmek için operatör kullanmayı,iki ya da daha fazla operatör içeren deyimleri kontrol etmeyi öğreneceksiniz. Öğrenme Hedefleri Bu ünite tamamlandığında; • Verileri (bilgileri) saklamak için değişken kullanmayı öğreneceksiniz. • + ve – gibi aritmetik operatörleri kullanacaksınız. • Bir ya da daha fazla operatörü birleştirmeyi göreceksiniz.

Üniteyi Çalışırken Mutlaka uygulamalar geliştiriniz ve ilk defa karşılaştığınız terimleri farklı kaynaklardan da okuyarak bilgi sahibi olunuz.

İfadeleri Anlamak İfade, eylemi gerçekleştiren komuttur. İfadeler yöntemlerin içinde bulunurlar. Yöntem bir sınıf içinde adlandırılmış ve sıralanmış ifadeler olarak düşünülebilir. İlk bölümde “Main Yöntemi”nden kısaca bahsedilmişti. C#’taki ifadeler, iyi tanımlanmış bir kurallar kümesine uymalıdır. Bu kurallar topluca syntax (sözdizimi) olarak bilinirler. C# syntax kurallarından en önemlisi her ifadenin bir noktalı virgül ile bitmesidir. Aşağıdaki ifade sonunda noktalı virgül olmazsa program tarafından derlenmez. Console.WriteLine("Merhaba Dünya");

Herhangi bir dilde program yazmanın püf noktası; öncelikle o dilin syntax yapısını öğrenmek ve o dili deyimsel yolla kullanmaktır. Tanımlayıcıları (Identifiers) Kullanmak Tanımlayıcılar, öğeleri programlarda tanımlamak için kullanılan adlardır. C#’da tanımlayıcıları belirlerken aşağıdaki syntax kurallarına uymanız gerekir. •

Yalnızca harfleri (büyük ya da küçük) ve rakamları kullanabilirsiniz.



Bir tanımlayıcı, bir harf ile başlamalıdır (Alt çizgi bir harf olarak kabul edilebilir.).

ÖRNEK: durum, _durum, ikiKelime, eryaman3 geçerli, durum%, ikiKelime$ ve 3eryaman ise geçersiz tanımlamalardır. Önemli Not: C# küçük -büyük harfe duyarlı bir programlama dilidir. Ankara ile ankara özdeş tanımlayıcılar değildir. Anahtar Sözcükleri Tanımlamak C# dili birçok tanımlayıcıyı kendi kullanımı için ayırmıştır. Bunlara, anahtar sözcük (keywords) adı verilir. Bunların her birinin özel bir anlamı vardır. Kodlama alanında bu tanımlayıcıları kullandığınız anda mavi renkte gösterilirler. Örneğin; class, using, namespace anahtar sözcüklere örnek olarak verilebilir. Bu anahtar sözcükler aşağıdaki tabloda gösterilmiştir. Bu anahtar sözcüklere program geliştirildikçe yenileri eklenebilmektedir. abstract

event

new

struct

as

explicit

null

switch

base

extern

object

this

bool

false

operator

throw

break

finally

out

true

byte

fixed

override

try

case

float

params

typeof

catch

for

private

uint

char

foreach

protected

ulong

checked

goto

public

unchecked

class

if

readonly

unsafe

const

implicit

ref

ushort

continue

in

return

using

decimal

int

sbyte

virtual

default

interface

sealed

volatile

delegate

internal

short

void

do

is

sizeof

while

double

lock

stackalloc

else

long

static

enum

namespace

string

Değişkenleri Kullanmak Değişken (variables), bir değeri saklayan depolama alanı olarak adlandırılabilir. Değişkenleri geçici bilgi saklayan kutular gibi düşünebilirsiniz. Örneğin sayısal bir değeri, programınızın herhangi bir yerinde kullanmak için bir değişkene atayabilirsiniz x=5; gibi. Programınızda kullandığınız değişkenler benzersiz olmalıdırlar. Değişken tanımlama için Framework bazı öneriler sunmuştur. Bunlar; •

Değişkenleriniz alt çizgi ile başlamasın.



Yalnızca koşula bağlı olarak değişken tanımlayıcı yaratmayın. Örneğin aynı anda kullanmak için “degisken” ve “Degisken” adında iki farklı değişken oluşturmayın.



Ad küçük harfle başlasın.



Birden çok sözcükten oluşan tanımlayıcılarda ikinci ve daha sonraki sözcükleri büyük harfle başlatın ( Bu camelCase gösterim biçimi olarak bilinir.).



Macar gösterim biçimini kullanmayın ( C++ kullanan kişiler bu gösterime aşina olabilirler. Bu gösterimde değişkenlerin isimlerinin başlarına türünü belirten bir önek getirilmesi veya fonksiyon isimlerinin yapacağı işi belirtecek şekilde seçilmesi gibi öneriler vardır.).

Değişken Bildirimi Değişkenleri içlerinde değer tutan kutulara benzetmiştik. C# birçok farklı türden değeri işleyebilir. Örneğin int (tamsayı), float(kayan noktalı sayı) ve char ( karakter dizisi) bunlardan bazılarıdır. Bir değişken bildirimi yapılırken bu değişkenin içinde ne tür bilgi tutacağını da belirlemek gerekir. Bir değişkenin adı ve türü bir tanımlama ifadesi içinde bildirilir. Aşağıdaki ifade age adında ve int (tamsayı) değerler taşıyan bir değişkeni bildirmektedir. int age;

Burada int değişken türü anahtar sözcüklere bir örnektir. Değişkeni bildirdikten sonra ona bir değer atayabilirsiniz aşağıdaki ifade age değişkenine 20 değerini atıyor. age=20; Önemli Not: = işareti sağındaki değeri solundaki değişkene atayan bir atama operatörüdür. Örnek: Aşağıdaki kodu Console uygulamasında yazınız ve sonucu ekranda görüntüleyiniz. int age; age = 20; Console.WriteLine(age);

Önemli Not: Fare işaretçisini kodlama alanında bir değişkenin üzerinde tutarsanız değişkenin türünü gösteren bir ipucu ekranı belirir. Temel Veri Türleriyle Çalışmak C# dilinde önceden tanımlanmış(C# dilinde var olan tipler) veri tipleri, değer tipleri ve referans tipleri olmak üzere ikiye ayrılır. Bu iki veri tipi arasındaki farkı çok iyi kavramak gerekir. Daha önce dediğimiz gibi değişkenler bellekte bulunan verilerdir. Aslında bir değişkeni kullanırken o değişkenin bellekte bulunduğu adresteki veriye ulaşıyoruz. Değer tipleri değişkenin değerini doğrudan bellek bölgesinden alırlar. Referans tipleri ise başka bir nesneye referans olarak kullanılırlar. Yani referans tipleri aslında bir çeşit bellek bölgesi olan heap alanında yaratılan veri türlerinin (bunlara kısaca nesne de diyebiliriz) adreslerini saklarlar. Değer tipleri yaratıldıklarında stack dediğimiz bellek bölgelerinde oluşturulurlar; referans tipleri ise kullanımı biraz daha sınırlı olan heap dediğimiz bellek bölgesinde saklanırlar. C ve C++ dillerine aşina olan arkadaşların da tahmin ettiği gibi gösterici kavramı ile referans veri tipleri arasında çok fazla fark yoktur. Fakat C# dilinde kullanıcının doğrudan kullanabileceği bir gösterici veri türü tanımlamak yoktur. Bunun yerine bazı değişkenler değer tip, bazıları ise referans tipi olarak işlem görürler. Peki, bunlar nelerdir? Temel veri tipleri olan int, double, float ve yapı nesneleri gibi veri türleri değer tipler; herhangi bir sınıf türü ise referans türüdür. İki değer tipi nesnesini birbirine eşitlerken değişkenlerde saklanan değerler kopyalanarak eşitlenir ve bu durumda iki yeni bağımsız nesne elde edilmiş olur; yani

birinin değerini değiştirmek diğerini etkilemez. Fakat iki referans tipini birbirlerine eşitlediğimizde bu nesnelerde tutulan veriler kopyalanmaz. İşlem yapılan yer, nesnelerin heap bölgesindeki adresleridir; yani iki nesne de aslında heap bellek bölgesinde aynı adresi gösterecekleri için birinde yapılan değişiklik diğerini de etkileyecektir. Referans tiplerini tanımlarken herhangi bir adresi göstermediğini belirtmek için null değere atanırlar. (Örneğin: y = null ;)

CTS (Common Type System) Tipleri .NET bir yazılım geliştirme platformudur. Aslında bütün veri tipleri CTS dediğimiz bir sistem ile tanınırlar. Yani C# dilinde ki veri türleri aslında CTS 'deki veri türleri için birer ara yüz gibidirler. CTS sayesinde .NET platformu için geliştirilen bütün diller aynı veri tiplerini kullanırlar; tek değişen, veri türlerini tanımlama yöntemi ve “sytax”ıdır. Bu yüzden bizim C# dili ile tanımlayacağımız her veri tipinin CTS 'de bir karşılığı mevcuttur. Bu veri türleri ve CTS karşılıkları aşağıda tablolar halinde mevcuttur.

C#’daki adı

CTS Karşılığı

Açıklama

Max ve Min Aralık ya da Değeri

sbyte

System.Byte

8 bit işaretli tamsayı

-128: 127

short

System.Int16

16 bit işaretli tamsayı

-32.768: 32.767

int

System.Int32

32 bit işaretli tamsayı

-2.147.483.648: 2.147.483.647

long

System.Int64

64 bit işaretli tamsayı

-9.223.372.036.854.775.808: 9.223.372.036.854.775.807

byte

System.Byte

8 bit işaretsiz tamsayı

0: 255

ushort

System.UInt16

16 bit işaretsiz tamsayı

0: 65.535

uint

System.UInt32

32 bit işaretsiz tamsayı

0: 4.294.967.295

ulong

System.UInt64

64 bit işaretsiz tamsayı

0: 18.446.744.073.709.551.615

float

System.Single

32 bit tek kayan sayı

+ya da - 1,5*10-45 : + ya da - 3,4*1038

double

Sytem.Double

64 bit çift kayan sayı

+ya da - 5*10-324 : + ya da - 1,7*10308

decimal

System.Decimal 128 bit ondalıklı sayı

+ya da - 1,5*10-28 : + ya da - 7,9*1028

bool

System.Boolean bit

true ya da false ( 0 ya da 1)

char

System.Char

16 Unicode karakterleri

Karakterleri temsil eder

Atanmamış Yerel Değişkenler: Bir değişkeni bildirdikten (oluşturduktan) sonra siz o değişkene herhangi bir değer atamamış olsanız bile bu değişken rastgele bir değer taşır. C ve C++ için değişkene değer atanmamış olması bile programın derlenmesine engel değildi. Bu aslında büyük bir hatadır. C# buna izin vermez eğer C# da bildirdiğiniz değişkene değer atamazsanız programınız derlenmez. Bu gerekliliğin adı Kesin Atama Kuralı (Definite Assignment Rule )’dır. Örneğin aşağıdaki gibi bir ifade derleme zamanında hata verecektir

int age; Console.WriteLine(age);

ÖRNEK: Konsol uygulamanızdaki kodu aşağıdaki şekillerde yazarak yeniden derlemeye çalışın ve sonuçları dikkatli bir şekilde inceleyin ( Küsuratlı yaş olur mu demeyin ben söyleyenleri duydum.  ). int age; age = 20.5; Console.WriteLine(age);

double age Age=20.5; Console.WriteLine(age);

Aritmetik Operatörleri (İşleçleri) Kullanmak Bildiğimiz toplama, çıkarma, çarpma ve bölme işlemlerinin simgeleri (+, -, *, /) aritmetiksel operatörler olarak tanımlanır. int hesap; hesap=3*5;

Burada * operatörümüz (işleç) 3 ve 5 ise operand (işlenen) değerlerimizdir. Bir operatörü bir değer üzerinde kullanabilmek o değerin türüne bağlıdır. Aritmetik operatörlerin tümünü char, int, long, float, double ve decimal türlerdeki değerlerde kullanabilirsiniz. Bir istisna durum hariç string ve bool türündeki değerler için bu operatörleri kullanamazsınız. ÖRNEK: Konsol uygulamasında aşağıdaki kodları yazarak programınızı derleyiniz. Console.WriteLine(“Ankara”-“Erzurum”);

Console.WriteLine(“22” + “3”);

// Derleme zamanı hatası

Program çalışır ve 223 görüntüler

Not: operatörü + yaparakda deneyin

Görüldüğü gibi + operatörünün stringleri (dize ya da karakter katarı) birleştirmek için kullanılması bir istisnadır. Önemli Not: String olarak tutulan değerleri aritmetik hesaplamalarda kullanmak isterseniz Int32.Parse yöntemini kullanarak string türündeki değeri tamsayıya çevirebilirsiniz. Ayrıca C# az kullanılan başka bir operatörü daha destekler. Bu operatör, % sembolünü kullanan modülüs (kalan) operatörüdür. Bir örnekle açıklamak gerekirse x % y işleminin sonucu x’in y’ye bölümünden kalan değerdir. Uygulama: Aşağıdaki programı çalışma klasörünüze indirip Mathoperators.sln dosyasına çift tıklayarak açınız. Programı çalıştırıp aşağıdaki uygulamaları yapınız ve sonuçları yorumlayınız.

Bölüm2/MathOperators klasörüne indirme linki KOYUN •

Sol operand (işlenen) alanına 48 yazın.



Sağ operand alanına 14 yazın.



Yapmak istediğiniz işlemin yanındaki kutucuğu işaretleyip sonuçları gözlemleyin. Toplama, çıkarma ve çarpma işlemleri sonucunda beklenen sonuçları görmüş olmanız gerekiyor.



Peki ya bölme işlemi? Evet sonuç 3.4285 çıkması gerekiyor ama sonuç 3. Evet, burası gerçek hayat değil. C# da bir tam sayıyı başka bir tamsayıya böldüğünüzde sonuç tamsayıdır.



Şimdi kalan işlemi (modulüs) yapın sonuç 48’in 14’ e bölümünden kalan 6 olmalı.

Kodları İnceleyelim; Formunuz üzerinde farenin sağ tuşuna tıklayıp View Code’u seçerseniz kodlama ekranı açılacaktır. Kodumuzun üst kısımlarında bulunan; private System.Windows.Forms.TextBox lhsOperand; private System.Windows.Forms.TextBox rhsOperand;

şeklindeki iki ifadeyi bulun. Bu ifadeler, “lhsOperand” ve “rhsOperand” adında ve TextBox türünde iki değişkeni bildirir. Her ikisi de girdiğiniz değerleri Text özelliklerinden dolayı string (dize) olarak tutar. Kod bölmesinde multiplyValues yöntemini bulun. private void multiplyValues() { int lhs = int.Parse(lhsOperand.Text); int rhs = int.Parse(rhsOperand.Text); int outcome; outcome = lhs * rhs; expression.Text = lhsOperand.Text + " * " + rhsOperand.Text; result.Text = outcome.ToString(); }

Bu yöntemdeki ilk ifade, lhs (left hand side; sol operand) adında bir int değişkeni bildirir. Bu değişkenin içerisine text özelliği olan değer, parse edilerek int’e dönüştürülür ve atılır. İkinci satırda da benzer bir işlem gerçekleştirilir ve sağ operand text kutusuna yazılan değer int olarak parse edilip rhs (right hand side) değişkenine atanır. Üçüncü ifade outcome adında bir değişkeni bildirir. Dördüncü ifade lhs değişkeni ile rhs değişkenini çarpılıp sonucun outcome değişkenine atıldığı ifadedir. Beşinci ifade Gösterim alanının kodlamasıdır. Bu alanın text’i lhs’nin text’ i ve rhs’nin text’i arasına “*” sembolü konularak ekrana yazılmıştır. Altıncı ifade ise outcome değişkenini string bir ifadeye dönüştürüp result.Text (Sonuç) alanında görüntüler.

Text Özelliği ve ToString Yöntemi Form üzerinde görüntülenen metin alanlarının içeriklerine ulaşabilmenizi sağlayan özelliğin adı Text özelliğidir. Örneğin result.Text özelliği form üzerindeki Sonuç alanının içeriğini ifade eder. Metin alanlarının, metin alanının form üzerindeki yeri ve boyutu gibi birçok özelliği vardır. Her sınıfın bir ToString yöntemi vardır. ToString’in amacı, bir nesneyi string (dize) gösterimine dönüştürmektir. Örneğimizde outcome tamsayı nesnesini, ToString yöntemiyle string bir ifadeye dönüştürdük. Bu işlem, değerin Sonuç alanında gösterilmesi için zorunluydu. Çünkü Text alanları sadece string ifadeler içerebilir.

İşlem Önceliği: Öncelik bir deyim içindeki operatörlerin gerçekleştirilme sırasıdır. Aşağıdaki örnekte + ve * operatörlerini kullanan deyimi düşünün. 4+2*5 Bu deyim, sonucu belirsiz olmaya aday bir deyimdir; Burada 2 solundaki 4 değerine + operatörü ile mi yoksa sağındaki 5 değerine * operatörü ile mi bağlıdır? İşlemlerin sırası önemlidir; çünkü sonucu etkiler. •

+ operatörü * operatöründen öncelikli ise 2 + operatörüne bağlıdır ve toplama sonucu (4+2) * işleminin sol operand (işlenen) değişkenini oluşturur. Tüm deyimin sonucu 6*5 =30 olur.



* operatörü + operatöründen öncelikli ise 2 * operatörüne bağlıdır ve çarpmanın sonucu (2*5) + işleminin sağ operand değişkenini oluşturur. Tüm deyimin sonucu da 4+10=14 olur.

Matematikten bildiğimiz gibi *, /, % gibi operatörler +, - gibi operatörlere göre daha önceliklidir. C# içinde bu durum geçerlidir. Yani sonuç ikinci maddede verilen şekildedir. Ayraçlar kullanarak işlem önceliğini istediğiniz bir operatöre verebilirsiniz örneğin ifadenizi (4+2)*5 şeklinde oluşturursanız işlem önceliği + operatöründe olacaktır. Aynı Öncelikli Operatörler İçin Birleşim Özelliği: Birleşim, bir deyimin operatörlerinin bağlanacakları yöndür (sol ya da sağ). Aşağıdaki örneği inceleyelim: 3 / 2 * 5 bu deyimde sonuc belirsiz şeklinde tanımlanabilir. Burada 2, solundaki / operatörüne mi yoksa sağındaki * operatörüne mi bağlıdır? Her iki operatörün de işlem önceliği aynı olmasına rağmen burada işlem hangi sırayla yapılacaktır? •

2, / operatörüne bağlıysa bölme işleminin sonucu (3/2) * operatörünün sol operand değeri olur. Bu durumda deyimin sonucu 15/2 olur.



2, * operatörüne bağlıysa çarpma işleminin sonucu (2*5) / operatörünün sağ operandı olur ve deyimin sonucu 3/10 olur.

Anlaşılıyor ki aynı önceliğe sahip operatörlerin nasıl ele alınacağına karar vermek için başka tanımlar yapmak zorundayız. Bu tanımın adı da “Birleşim Özelliği”dir. * ve / operatörlerinin her ikisi de operandların soldan sağa işleneceğini gösteren sola birleşim özelliği taşır. Buna göre işleme, deyimin solundan başlamamız gerekiyor örneğimize bakarsak önce 3/2 sonucu elde edilecek ve bu sonuç 5 ile çarpılacaktır ve sonuç, 15/2 olacaktır. İlerleyen bölümlerde karşılaşacağımız operatörler için de birleşim özellikleri detaylı bir şekilde verilecektir.

ÖZET Programlama dillerinin temel özellikleri olan keywords, değişken ve deyim kavramlarından bahsedilmiştir. C ve C++ da karşımıza çıkan bazı zorlukların C# ile nasıl giderildiği anlatılmıştır. Veri türleri ve aritmetik operatörlerden bahsedilmiştir. DEĞERLENDİRME SORULARI S.1. Özel anlamı olan tanımlayıcılar……………… olarak adlandırılırlar. a. Keywords

b. Değişken

c. Operatör

d. Operand

e. İfade

d.50

e. 32

d. 8

e. 3

S.2. C#’ da 4*2+3*5 deyiminin sonucu nedir? a. 55

b. 23

c. 100

S.3. 2 / 3 * 4 deyiminin sonucu nedir? a. 2/12

b. 6

c. 8/3

PROGRAMLAMA

1

Görsel Programlama Dilinin Kurulumu ve Çalýþma Ortamý

2

Deðiþkenler (Variables), Ýþleçler (Operators) ve Deyimler (Statements)

3

Yöntemler Yazmak ve Kapsamý Belirlemek

4

Karar Ýfadeleri

5

Yineleme (Iteration) Ýfadeleri ve Döngüler

6

Hatalarý ve Özel Durumlarý Yönetmek

7

Sýnýflar (Class) ve Nesneler (Object) Oluþturup Yönetmek

8

Deðerleri ve Baþvurularý Anlamak

9

Numaralandýrma ve Yapýlarla Deðer Türleri Oluþturmak

10

Diziler (Arrays)

11

Parametre Dizileri

12

Kalýtým (Inheritance)

13

Çöp Toplayýcýsý (Garbage Collector) ve Bellek Yönetimi

ÜNİTE 3. Yöntemler Yazmak ve Kapsamı Belirlemek Ünitede Ele Alınan Konular 1. 2. 3. 4.

Yöntem Oluşturmak ve Çağırmak Yöntemlere Bilgi Aktarmak Bir yöntemden Bilgi Almak Yöntemlerle Çalışırken İçlerine Girmek ya da Çıkmak İçin Visual Studio.NET Tümleşik Hata Ayıklama Aracını Kullanmak

Ünite Hakkında Bir önceki bölümde değişkenleri bildirmeyi, operatörler kullanarak deyimler yaratmayı ve işlem önceliğinin birden çok operatör içeren deyimleri nasıl etkilediğini gördük. Bu bölümde yöntemler hakkında birçok şeyi ögreneceksiniz. Öğrenme Hedefleri Bu ünite tamamlandığında; • Bir yönteme bilgi aktarmak için bağımsız değişkenlerin ve parametrelerin kullanımını ve dönüş ifadeleriyle yöntemlerden bilgi almayı öğreneceksiniz. • Visual Studio.NET’in tümleşik hata ayıklama aracını kullanarak yöntemlerin içine girmeyi ya da çıkmayı öğreneceksiniz.

Üniteyi Çalışırken Konuyu tekrar ederek ve farklı uygulamalar geliştirerek çalışınız.

Yöntemleri (Methods) Bildirmek Yöntem, adlandırılmış ifadeler gurubudur. Her yöntemin bir adı ve bir gövdesi vardır. Yöntem gövdesi, yöntem çağrıldığında gerçekleştirilecek ifadeleri içerir. Yöntemin adı, yöntemin genel amacını belirten anlamlı bir tanımlayıcı olmalıdır (Örneğin: SınıfOrtalaması). Birçok yöntem, işlemek üzere veri alır ve işlemin sonucu olan verileri döndürür. Yöntemler çok temel ve güçlü yapılardır. Yöntem Bildirme Syntax (Sözdizimi) Yapısı Visual C# için yöntemlerin syntax yapısı aşağıdaki gibidir: dönüşTürü

yöntemAdı

(parametreListesi )

{ // yöntem ifadeleri } •

dönüşTürü: Bir tür adıdır ve yöntemin hangi türden bilgi döndüreceğini belirtir. Bu int ya da string gibi herhangi bir tür adı olabilir. Bir değer döndürmeyen yöntem yazılıyorsa, dönüş türü yerine void yazılır.



yöntemAdı: Yöntemi çağırmak için kullanılacak addır. Yöntem adları da değişken adlarının uyması gereken tanımlayıcı kurallarına uymalıdır. Örneğin addValues geçerli, add$Values geçersiz birer yöntem adıdır. Yani camelCase yöntem adlarını kullanın; yöntem adlarını açıklayıcı olarak verin ve mümkünse bu yapıya uymak için bir yüklem ile başlayın; örneğin, displayCustomer.



parametreListesi: Yöntemin kabul edeceği ve seçime bağlı bilgilerin türünü ve adını tanımlar. Parametreleri parantez içinde değişken tanımlaması yapar gibi önce tür adı sonra da parametre adı olacak biçimde bildirebilirsiniz. Yazılan yöntemin iki ya da daha fazla parametresi var ise bunları virgülle ayırmalısınız.



Yöntem gövdesi: Yöntem çağrıldığında çalıştırılacak satırlardır. Blok (küme) parantezleri arasına yazılır.

Önemli Not: C, C++ ve Visual Basic ile program geliştirenler, C#’ın genel yöntemleri desteklemediğine dikkat etmelidir. Derlenebilmeleri için bütün yöntemlerinizi bir class içinde yazmalısınız. Aşağıda, lhs ve rhs (left-hand side ve right-hand side) adlı iki parametre alan ve bir int değer döndüren addValues adlı bir yöntemin tanımı gösterilmektedir. int addValues(int lhs, int rhs) { ... // Yöntem ifadeleri }

Sadece answer adında bir int parametre alan ve bir değer döndürmeyen showResult yönteminin tanımı ise aşağıdaki şekilde yapılabilir. Bu yöntemi sadece sonuçları göstermek için kullanabilirsiniz geriye herhangi bir değer döndürmemektedir. void showResult(int answer) { ... // Yöntem ifadeleri ... }

Önemli Not: Visual Basic ile program geliştirenler C#’ın değer (function) döndüren ve döndürmeyen yöntemler (procedure ya da subroutine) için farklı keywords (anahtar sözcük) kullanmadığına dikkat etmelidirler. Burada ya bir dönüş değeri belirtilmeli ya da void “keyword”ünü kullanmalısınız. Return İfadeleri Yazmak Yönteminizin bir bilgi döndürmesini istiyorsanız, yöntemin içerisine bir dönüş ifadesi yazmak zorundasınız. Burada dikkat edilmesi gereken nokta bir işlev (function) ya da yöntem int değer döndürüyorsa return ifadesi de int değer döndürmelidir. Aksi takdirde program derlenmez. int addValues(int lhs, int rhs) { ... // Yöntem ifadeleri return lhs + rhs; }

return ifadesi yöntemimizin sonunda olmalıdır; çünkü yöntemin sonlanmasına neden olur. Yani bu ifadeden sonraki hiçbir ifade çalıştırılmaz.Bu şekilde bir tanımlama yapmış olsanız bile derleyici, sizleri uyaracaktır. Yönteminizin bir değer döndürmesini istemiyorsanız yöntemden çıkmak için return ifadesinin sonuna sadece “;” noktalı virgül koyabilirsiniz. void showResult(int answer) { .... if (....) return; ....

}

Farklı bir şekilde ise return ifadesini kullanmayabilirsiniz. Çünkü yöntem sondaki küme parantezine ulaşıldığı anda sonlanacaktır. Bu sıklıkla kullanılan bir yol olmasına karşın doğru bir kullanım şekli değildir.

Uygulama: Aşağıdaki programı bilgisayarınıza indirin ve burada tanımlanmış yöntemleri (Methods) inceleyin. Bu program, bir önceki bölümde oluşturulmuş uygulamanın yöntemler ile yeniden ele alınmış halidir. Yöntemler Kodlamanın yöntemlere ait bölümü aşağıda verilmiştir. private int addValues(int lhs, int rhs) { expression.Text = lhs.ToString() + " + " + rhs.ToString(); return lhs + rhs; } private int subtractValues(int lhs, int rhs) { expression.Text = lhs.ToString() + " - " + rhs.ToString(); return lhs - rhs; } private int multiplyValues(int lhs, int rhs) { expression.Text = lhs.ToString() + " * " + rhs.ToString(); return lhs * rhs; } private int divideValues(int lhs, int rhs) { expression.Text = lhs.ToString() + " / " + rhs.ToString(); return lhs / rhs; } private int remainderValues(int lhs, int rhs) { expression.Text = lhs.ToString() + " % " + rhs.ToString(); return lhs % rhs; } private void showResult(int answer) { result.Text = answer.ToString(); } private void quit_Click(object sender, System.EventArgs e) { Application.Exit(); } }

Kod bölmesinden addValues yöntemini bulun; private int addValues(int lhs, int rhs) { expression.Text = lhs.ToString() + " + " + rhs.ToString(); (1.ifade) return lhs + rhs; (2. ifade) }

addValues yöntemi iki ifade içerir. İlk ifade, üç dizenin birleştirilmesiyle oluşan dizeyi expression.Text özelliğine atar. İkinci ifade sol operand (lhs) ve sağ operand (rhs) değerlerini + operatörünü kullanarak toplar ve bu toplam sonucunu döndürür (return). Burada lhs ve rhs iki int değerdir. Bu iki int değerin yeni bir int değer yarattığına dikkat edin bu int değer oluşturulan addValues yöntemidir. Şimdi kod bölmesinde showResult yöntemini bulun; private void showResult(int answer) { result.Text = answer.ToString(); }

Öncelikle void bir yöntem olduğunu gözlemleyin. Yani herhangi bir değer döndürmemektedir. Bu yöntem, answer parametresini string (dize)e dönüştürür ve dönüştürülmüş bu değeri result.Text özelliğine atar. Yöntemleri Çağırmak Bir yöntemi görevini gerçekleştirmesi için adını kullanarak çağırabilirsiniz; yani çalıştırılmasını sağlayabilirsiniz. Yöntem bilgi gerektiriyorsa (parametreleriyle belirtildiği gibi), verileri istendiği biçimde sunmalısınız. Yöntem bir bilgi döndürüyorsa, bu bilgiyi bir biçimde yakalamalısınız. Bir Yöntemin Çağrılış Syntax Yapısını Belirlemek C#’da yöntemlerin çağrılış syntax yapısı aşağıdaki gibidir: yöntemAdı (bağımsızDeğişkenListesi) •

yöntemAdı: Çağrılacak yöntemin adı olmalıdır. Bu noktada C#’ın büyük küçük harf duyarlı bir programlama dili olduğunu göz ardı etmeyiniz.



bağımsızDeğişkenListesi: Yöntemin alacağı bilgiyi saklar. Bu bölüm isteğe bağlıdır. Her parametre için bağımsız bir değişken vermeniz gerekir ve her bağımsız değişkenin değeri kendine karşılık gelen parametrenin türüne uygun olmalıdır.

Önemli Not: Yöntemleri bağımsız değişkenleri kullanmadan çağırmanız gerekirse bile parantez kullanmanız gerekir. Örneğin; yöntemAdı ( ) şeklinde. Yeniden örneğimize dönelim; int addValues(int lhs, int rhs) { //... }

addValues yönteminin iki tane int parametresi vardır ve onu çağırırken virgülle ayrılmış iki bağımsız değişkenle çağırmanız gerekir. addValues(39, 3) şeklinde yöntemi çağırabiliriz. Bu ilgili yöntem için doğru bir çağırma şeklidir. Bu yöntemi başka şekillerde çağırırsanız başarılı olamazsınız. Aşağıda bununla ilgili birkaç tane örnek verilmiştir. addValues

//derleme zamanı hatası, parantezler (ayraçlar) yok

addValues ( )

//derleme zamanı hatası, yetersiz bağımsız değişken

addValues( 39)

// derleme zamanı hatası, yetersiz bağımsız değişken

addValues (“39”, “3”)

//derleme zamanı hatası, yanlış türler

addValues yöntemi, int türünde bir değer döndürür. Bu int değer, int değerlerin kullanabileceği her yerde kullanılabilir. Örneğin; result = addvalues(39, 3);

// Bir atamanın sağ tarafında

showResult(addValues(39, 3)); olarak.

// başka bir yöntemin çağrılmasında bağımsız değişken

Kodu incelerken toString yönteminin bağımsız değişkeni olmadığı halde toString ( ) şeklinde parantezler kullanıldığına dikkat edin. Örneğin showResult yönteminde answer.ToString( ) ifadesi ile answer nesnesine ait ToString yöntemi çağrılıyor. Scope (Kapsam) Kavramı Bir yöntem içinde bir değişkenin oluşturulabileceğini gördük. Değişken kendini tanımlayan ifadede oluşturulur ve yöntem içinde daha sonra gelen ifadeler bunu kullanabilir. Yöntem sona erdiğinde ise değişken yok edilir. Başka bir şekilde ifade edecek olursak değişken görülür biçimde olduğu sürece belirli yerlerde kullanılabilir. Bir değişkenin ne zaman görülür biçimde olduğunu ve kullanılabileceğini belirleyen bir takım kurallar vardır ve bunlara scope (kapsam) adı verilir. Herhangi bir identifier (tanımlayıcı), program içinde belirli bir yerde kullanılabiliyorsa identifier orada scope içindedir. Bu scope alanı identifier’in program içinde kullanılabilir olduğu yerdir. Scope kavramı sadece değişkenler için değil aynı zamanda yöntemler için de geçerlidir. Bir Yöntem ile Yerel Kapsam Oluşturmak Yöntem bloğunu oluşturan sağ ve sol “{ }” küme parantezleri bir kapsama (scope) alanını belirler. Bir yöntem bloğu içerisinde bildirilen bütün değişkenler o yöntemin kapsamına eklenir. Bu şekilde oluşturulan değişkenlere yerel değişkenler adı verilir. Yani bu yöntem bloğu içerisinde yereldirler ve başka bir yöntemin kapsamında değildirler. Başka bir ifaddeyle bu şekilde oluşturulan değişkenler, yöntemler arasında kullanılamaz ve bu değişkenler sadece oluşturulduğu yöntem bloğuna aittir. Örneğin;

class Ornek { void Yontem() { int degisken; ... } void baskaYontem() { degisken = 42; //Derleme zamanı hatası } }

Bir Sınıf (Class) ile Sınıf Kapsamı Oluşturmak Sınıf bloğunu oluşturan sağ ve sol “{ }” küme parantezleri de bir kapsam (scope) alanı oluştururlar. Bir sınıf bloğu içerisinde (yöntem içerisinde değil) bildirilen bütün değişkenler o sınıf kapsamına eklenirler. Bu şekilde tanımlanan değişkenler o sınıf içerisinde tanımlı tüm yöntemler tarafından kullanılabilirler. Örneğin; class Ornek { int degisken; void Yontem() { degisken=42; } void baskaYontem() { }

degisken = 42; //Derleme zamanı hatası

}

Tanımlayıcıları (Identifiers) Aşırı Yüklemek (Overloaded) İki tanımlayıcı aynı ada sahipse ve aynı scope alanı içinde bildirilmiş ise bu tip tanımlayıcılar için aşırı yüklü (overloaded) oldukları söylenebilir. Genellikle aşırı yüklü bir tanımlayıcı, derleme zamanı hatası olarak karşımıza çıkar. Örnek olarak; aynı yöntem bloğu içerisinde aynı isimde iki yerel değişken bildirilirse derleme zamanı hatası oluşur. Benzer şekilde aynı sınıf içinde aynı isimde iki alan ya da aynı sınıf içinde tümüyle aynı iki yöntem tanımlanırsa yine derleme zamanı hatası ile karşılaşılır. Peki, neden bu kadar uzun bahsedildi bu konudan? Bir tanımlayıcıyı aşırı yüklemenin hem faydalı hem de önemli bir yöntemi vardır. Bir yöntemi; ancak iki yöntem farklı parametrelere sahipse farklı sayıda parametreleri varsa ya da parametre türleri farklıysa aşırı yükleyebilirsiniz. Bir yöntemi çağırdığınızda, virgülle ayrılmış bağımsız değişkenleri ve bağımsız değişkenlerin sayısını ve türlerini vererek hangi yöntemi seçeceği belirtilebilir. Buna en güzel örnek Console sınıfının WriteLine yöntemidir. WriteLine yöntemi aşırı yüklüdür. Konsola bir string (dize) değer yazılmak istenirse, string bağımsız değişkeni WriteLine yöntemine gönderilir ve WriteLine(string s) otomatik olarak çağırılır. Konsola bir

integer değer yazılmak istenirse WriteLine yöntemine int bağımsız değişkeni gönderilir ve WriteLine(int i) otomatik olarak çağrılır. Burada derleyici her şeyi düzenler. Derleme zamanında; derleyici, gönderilen bağımsız değişkenlere bakar ve parametreleri uyan yöntemi çağırır. Örneğin; static void Main() { Console.WriteLine("Cevap"); Console.WriteLine(42); }

Bir yöntemin parametreleri aşırı yüklenebilse de dönüş türü aşırı yüklenemez. Diğer bir deyişle, yalnızca dönüş türleri farklı olan aynı ada sahip iki yöntem bildirilemez. Yöntemleri Yazmak ve Çağırmak Şimdi yapacağınız örneklerde, sabit bir günlük ile çalışan bir danışmana çalıştığı gün sayısına bağlı olarak ne kadar ödeme yapılacağını hesaplayan bazı yöntemler yazacaksınız. Daha sonra bu yöntemleri bir konsol uygulamasında çalıştıracaksınız ve son olarak yöntemler çalışırken içlerine girmek ve çıkmak için Visual Studio. NET hata ayıklayıcısını kullanacaksınız. Aşağıdaki link de verilen projeyi bilgisayarınıza yükleyin ve açın. Yöntem Oluşturma

Yukarıdaki kodlamayı göreceksiniz. Şimdi adım adım kendi yöntemlerimizi oluşturalım.



void run ( ) yöntem bloğundan sonra aşağıdaki readDouble (doubleOku) yöntemini oluşturalım. public double readDouble(string vade) { Console.Write(vade); string line = Console.ReadLine(); return double.Parse(line); }

Bu yöntem, parametre olarak vade adında string türünde bir değer alıyor. Bu kodu yazdıktan sonra Build menüsünden Build Solution’ı tıklayın ve oluşturulan yöntemin hatasız bir şekilde derlendiğinden emin olun. •

readInt (intOku) adında bir yöntem tanımlayalım. public int readInt(string vade) { Console.WriteLine(vade); string line=Console.ReadLine (); return int.Parse(line); }

Burada line adında string bir değişken oluşturuldu ve bu değişkene konsoldan okunan değer atıldı. Sonrasında bu değer int değere dönüştürüldü (Integer olarak Parse edildi.). Bu kodlamadan sonra yeniden Build Solution’ı kullanın ve derlemenin hatasız bir şekilde gerçekleştirildiğinden emin olun. •

calculateFee (ucretHesapla) adında bir yöntem oluşturalım. public double calculateFee(double dailyRate, int noOfDays) { return dailyRate * noOfDays; }

Oluşturulan yöntem bir double türünde birde int türünde iki parametre içermektedir. Burada danışmanın günlük kazanç oranı ile gün sayısı çarpılarak return değerimiz oluyor. Yeniden Build Solution’ı tıklayarak hatasız bir derleme işlemi gerçekleştiğinden emin olun. •

writeFee (ucretYaz) adında bir yöntem oluşturalım. public void writeFee(double fee) { Console.WriteLine("Danışmanın günlük ücreti {0}", fee * 1.1); }

Ücreti yazdırmak için oluşturulan bu yöntem double bir parametre içermekte ve ekrana danışmanın ücretini yazdırmaktadır. {0}ifadesinden daha sonra bahsedilecektir (video dersi izleyin) ama programı tamamladıktan sonra bu satırı; Console.WriteLine("Danışmanın günlük ücreti {0} {0}", fee * 1.1);

şeklinde değiştirin ve sonucu gözlemleyin.



Code bölmesinde run yöntemine dönün ve bloklar arasına aşağıdaki ifadeyi yazın. public void run() { double dailyRate=readDouble("Günlük Oranı Giriniz:"); int noOfDays=readInt ("Gün Sayısını Giriniz:"); writeFee(calculateFee (dailyRate, noOfDays )); }

Burada dailyRate adında double bir değişken ve noOfDays adında int bir değişken tanımlandı. Günlük oran double bir değer, gün sayısı ise int değer olarak okunup ilgili değişkenlere atandı. Bu aşama tamamlanıncaönce Build Solution’ı kullanarak hata olmadığından emin olun sonrasında Debug menüsünden Start Without Debugging ile programınızı çalıştırın. “Günlük Oranı Giriniz” kısmına 418 yazın ve Enter tuşuna basın. “Gün Sayısını Giriniz” kısmına 21 değerini yazın ve Enter tuşuna basın program komut penceresinde aşağıdaki değerleri yazmış olmalı.

Visual Studio.NET Hata Ayıklayıcısını Kullanmak Bu bölümde son olarak programı yavaş bir biçimde çalıştırmak için Visual Studio.NET Hata Ayıklayıcısını kullanalım. Burada yukarıdaki örneğimiz için yöntemlerin ne zaman çağrıldığını ve her return ifadesinin çağıran ifadeye denetimi nasıl aktardığını izleyeceksiniz. Yöntemlerin içine girerken ve çıkarken Debug araç çubuğundaki araçları kullanacaksınız. Bu araç çubuğu programda bir hata ayıklamaya başladığınız anda belirir. Bu işlemi manuel olarak View menüsünden Toolbars’ı oradan da Debug’ı tıklayarak gerçekleştirebilirsiniz. Şimdi aşağıdaki adımları sırasıyla programınız üzerinde uygulayınız. •

Code bölümünden run yöntemini bulun.



Fare işaretçisini bu yöntem içindeki ilk ifadeye götürün ve bu satırda herhangi bir yerde farenizin sağ tuşuna tıklayıp açılan menüden Run To Cursor seçeneğini tıklayın. Program, imlecin olduğu satıra kadar çalışır ve code bölmesinin sol tarafında hangi

ifadenin etkin olduğunu belirten sarı bir ok görünür ve aynı zamanda bu satırda sarı bir zemin rengi ile kaplanır. double dailyRate=readDouble("Günlük Oranı Giriniz:");



Debug araç çubuğunu kendi penceresinde görüntülemek için sol kenarından tutup code bölmesinin üzerine doğru sürükleyin. Ekranınızda Debug araç çubuğunu ayırt edemiyorsanız önce View menüsünden Toolbars’ın içinden gizleyin ve sonra yeniden görünmesini sağlayarak hangisi olduğunu bulun.



Debug araç çubuğundan Step Into (F11 kısayolu) düğmesine tıklayın ( Bütün bu işlemleri Debug menüsü altından da gerçekleştirebilirsiniz.). Sarı imleç readDouble yöntem bloğunun ilk satırına gider.



Debug araç çubuğunda Step Out (Shift+F11) düğmesine tıklayın. Program konsol penceresinde “Günlük Oranı Giriniz” satırı görüntülenir.



Konsol penceresinde 418 yazıp Enter tuşuna basın. Denetim yeniden Visual Studio.NET programlama ortamına döner. Sarı imleç, readDouble yönteminin dışına çıkıp run yönteminin ilk ifadesine gider.



Debug araç çubuğunda yeniden Step Into düğmesini tıklayın. Sarı imleç, run yönteminin ikinci ifadesine atlar: int noOfDays=readInt ("Gün Sayısını Giriniz:");



Debug araç çubuğundan Step Into düğmesine tıklayın. Sarı imleç, readInt yönteminin ilk ifadesine atlar.



Debug araç çubuğunda Step Out düğmesine tıklayın. Program konsol penceresinde “Gün Sayısını Giriniz” satırını görüntüler; 18 yazıp Enter tuşuna basınız. Denetim yeniden programlama ortamına geçer. Sarı imleç, readInt yönteminin dışına çıkıp run yönteminin ikinci ifadesine dönmüştür.



Debug araç çubuğundan Step Into düğmesine tıklayın. Sarı imleç, run yönteminin üçüncü satırına atlar. writeFee(calculateFee (dailyRate, noOfDays ));



Debug araç çubuğundan Step Into düğmesine tıklayın. Sarı imleç, calculateFee yönteminin ilk ifadesine atlar.



Debug araç çubuğundan Step Out düğmesine tıklayın. Sarı imleç, run yönteminin üçüncü ifadesine atlar.



Debug araç çubuğundan Step Into düğmesine tıklayın. Sarı imleç, writeFee yönteminin ilk ifadesine atlar.



Debug araç çubuğundan Step Out düğmesini tıklayın. Sarı imleç, run yönteminin son ifadesine atlar.

Konsol penceresinde programın hesapladığı sonucu görürsünüz. Son olarak Debug araç çubuğunda Stop Debugging’ i tıklayarak hata ayıklama (debug) işlemini sona erdirin.

ÖZET Yöntemler C#’da oldukça önemli bir yer tutmaktadır. Yöntemleri oluştururken bir sınıf içerisinde tanımlayın. Bir yöntemin değer döndürmesi isteniyorsa mutlaka return ifadesine sahip olmalıdır. Yöntemleri çağırmak da belirli kurallar çerçevesinde olmalıdır. Bir yöntemi çağırmak için yöntemin adını ve daha sonra da yöntemin istediği bağımsız değişkenleri tanımlamak zorundasınız. Debug işlemi, yazmış olduğunuz yöntemlerin içine girmek hatalar varsa tespit etmek için oldukça kullanışlı bir özelliktir. DEĞERLENDİRME SORULARI S.1. Bir yöntemin içinden değer döndürmek için…return……. anahtar sözcüğü kullanılır. S.2. Değer döndürmeyen bir yöntem yazarken dönüş türü yerine …void…. yazılır. S.3. Yazılan yöntemin iki ya da daha çok parametresi varsa bu parametreler aşağıdakilerden hangisi kullanılarak ayrılır? a. , b. : c. ; d. . e. Hiçbiri S.4. Yöntem bir değer döndürmeyecekse return ifadesi kullanılmayabilir. Doğru/Yanlış S.5. Console.WriteLine aşırı yüklü bir yöntemdir. Doğru/Yanlış

PROGRAMLAMA

1

Görsel Programlama Dilinin Kurulumu ve Çalýþma Ortamý

2

Deðiþkenler (Variables), Ýþleçler (Operators) ve Deyimler (Statements)

3

Yöntemler Yazmak ve Kapsamý Belirlemek

4

Karar Ýfadeleri

5

Yineleme (Iteration) Ýfadeleri ve Döngüler

6

Hatalarý ve Özel Durumlarý Yönetmek

7

Sýnýflar (Class) ve Nesneler (Object) Oluþturup Yönetmek

8

Deðerleri ve Baþvurularý Anlamak

9

Numaralandýrma ve Yapýlarla Deðer Türleri Oluþturmak

10

Diziler (Arrays)

11

Parametre Dizileri

12

Kalýtým (Inheritance)

13

Çöp Toplayýcýsý (Garbage Collector) ve Bellek Yönetimi

ÜNİTE 4. Karar İfadeleri Ünitede Ele Alınan Konular 1. Boolean Operatörleri 2. Karara İfadeleri ve If ifadeleri 3. Karmaşık Karar İfadeleri İçin Switch İfadeleri Ünite Hakkında Bir önceki bölümde yöntemlerden bilgi alabilmek için return ifadelerinin kullanımını öğrendiniz. Bu yöntemler ne kadar yararlı olsalar da bir eksiklikleri vardır. Hep aynı şeyi yaparlar. Programların karmaşık ve uzun problemleri çözmesi gerekebilir. Bu karmaşıklığı düzenleyebilmek için koşullara bağlı olarak farklı zamanlarda farklı eylemler gerçekleştiren seçici yöntemler yazabilmelisiniz. Bu bölümde bu işlemin nasıl yapılacağını göreceksiniz. Öğrenme Hedefleri Bu ünite tamamlandığında; • Boolean değişkenlerini tanımlamayı öğreneceksiniz. • Boolean deyimlerinin sonuçlarına göre karar verme işlemleri için if ifadeleri yazmayı göreceksiniz. • Daha karmaşık karar verme ifadeleri için switch ifadelerini öğreneceksiniz. Üniteyi Çalışırken Daha önceki bilgileriniz ile burada öğrendiklerinizi karşılaştırın. Farklılıklar olup olmadığına karar verin.

Bool Değişkenlerini Bildirmek Programlamada bir şey ya doğrudur ya da yanlıştır. Bunu herhangi bir sorunun cevabı ya evet ya da hayırdır şeklinde de yorumlayabilirsiniz. Gerçek dünyanın aksine burada başka bir olasılık yoktur. Örneğin x değişkenine 20 değeri atayıp daha sonra x, 10’dan küçük mü diye sorarsanız yanıt kesinlikle hayır olacaktır. Bir Boolean deyiminin sonucu her zaman doğru ya da yanlıştır. Bu durumdan yola çıkarak C#’ın, değerleri doğru ya da yanlış olan değişkenleri bildirmek için kullandığı ve bool olarak adlandırılan temel veri türünü ele alalım. Bir bool değişkenine değer atamak için true ya da false anahtar sözcüklerini kullanabilirsiniz. Aşağıdaki örneği inceleyelim; bool havaYagmurlu; havaYagmurlu = true; Console.WriteLine(havaYagmurlu); // True yazar

Bu örnekte “havaYagmurlu” adında bir değişken tanımladık. Bu değişkene true değerini atadık ve son olarak bu değişkenin değerini konsola yazdırdık. Boolean Operatörlerini Kullanmak Boolean operatörünün sonucu her zaman doğru (true) ya da yanlış (false)’tır. C#’ da birçok Boolean operatörü vardır. En basit Boolean operatörü, ! sembolünü kullanan NOT (DEĞİL) operatörüdür. NOT (!) operatörü bir Boolean değere uygulanırsa sonuç o değerin tersi olur. Başka bir şekilde ifade edilecek olursa yanlış olan sonuç doğru; doğru olan sonuç ise yanlış olarak elde edilir. Önemli Not: Tek bir operand (işlenen) üzerinde işlem gerçekleştiren operatörlere tekli (unary) operatörler, iki operand üzerinde işlem gerçekleştiren operatörlere ise ikili (binary) operatörler adı verilir. Eşitlik ve İlişkisel Operatörleri Anlamak Boolean operatörlerinin uygulamada çok kullanılan bir başka iki örneği ise eşitlik ve eşitsizlik operatörleridir. Bu operatörler aynı türden iki değerin birbirine eşit mi yoksa farklı mı olduğunu bulmak için kullanılır. Bu operatörler ile yakından ilgili diğer operatörlere ise ilişkisel (relational) operatörler adı verilir. Bu operatörler aynı türden iki değişkeni karşılaştırır ve bunlarının birinin diğerinden büyük, küçük, küçükeşit, ya da büyükeşit gibi ilişkilerini göstermek için kullanılır. Bu operatörlerin C# daki kullanımı aşağıdaki tabloda verilmiştir.

İşleç

Anlam

Örnek

not 70 ise sonuç

==

Eşittir.

not==80

false

!=

Eşit değil.

not!= 60

true

<

Küçüktür.

not=

Büyük ya da eşittir.

not>=30

true

Önemli Not: Eşitlik operatörünü (= =), atama operatörü (=) ile karıştırmayın. Eşitlik operatörü bir değerin başka bir değere eşit olup olmadığının denetimini yapar; eğer sonuç doğru ise true yanlış ise false değeri döndürür. Atama operatörü ise bir değişkene x=y ya da x=70 gibi değerleri atamak için kullanılır. Mantıksal Operatörler Boolean operatörlerine örnek olarak verebileceğimiz iki farklı operatör ise && sembolünü kullanan mantıksal AND (VE) operatörü ve || sembolünü kullanan mantıksal OR (VEYA) operatörüdür. Bu operatörler, Boolean operatörlerini birleştirerek daha büyük deyimler oluşturmak için kullanılırlar. Bu operatörler sonuçların true ya da false olması yönüyle ilişkisel operatörlere benzeseler de bu operatörlerin gerçekleştireceği işlem değerlerinin kendileri true ya da false olmak zorundadır. Aşağıdaki örnek bir öğrencinin bir dersteki ortalamasının 70 ile 74 arasında olması durumunda CC değişkenine true değerini atar. bool CC; CC=(ortalama >=70) && (ortalama= Büyük ya da eşittir

Eşitlik

= = Eşittir != Eşit Değil

Sol

&& Mantıksal AND Boolean Atama

|| Mantıksal OR =

Sol Sağ

if İfadelerini Kullanmak (if Statement) if (eğer) ifadesi, bir Boolean deyiminin sonucu true olduğunda bir ya da daha çok ifadeyi oluşturmak için kullanılır. Burada Boolean deyiminin sonucu false olduğunda else anahtar sözcüğü ile başlayan bölümde oluşturulan ifadeler ele alınır. if ifadesinin genel kullanım formu aşağıda gösterildiği gibidir; if (booleanDeyimi) İlk ifade // boolenDeyimi sonucu true (Doğru) ise çalıştırılacak bölüm else İkinci ifade //boolenDeyimi sonucu false (Yanlış) ise çalıştırılacak bölüm

Eğer else kullanılmaz ve booleanDeyimi’nin sonucu yanlış olursa program, hiçbir işlem gerçekleştirmez. Aşağıdaki örneği inceleyelim. Bu örnekte bir saatin saniyelerini artıran bir if ifadesi gösteriliyor. Şimdilik dakikalar ele alınmadı.

int saniye; ... if (saniye==59) saniye=0; else saniye=saniye+1;

Bir if ifadesindeki deyimler mutlaka parantez içinde yazılmalıdır ve deyim mutlaka Boolean bir deyim olmalıdır. C ve C++ if ifadelerinin içine tamsayı deyim yazmanıza izin verir ve tamsayı değeri derleme esnasında true (sıfırdan farklı) ya da false (sıfır) olarak değiştirir. C#’ da bu şekilde bir tanımlama yaparsanız program kesinlikle derlenmeyecek ve bir derleme zamanı hatası oluşturacaktır. Ayrıca bir if ifadesinin içinde eşitlik sınaması yerine atama işlemi yapmaya kalkarsanız C# derleyicisi, hatanızı mutlaka yakalar. int saniye; ... if (saniye==59) // Doğru Kullanım ... if (saniye=59) // derleme zamaı hatası

İfadeleri Gruplamak İçin Bloklar Kullanmak Bazı durumlarda Boolean deyimi doğru olduğunda birden çok ifade çalıştırmak istersiniz. Bu ifadeleri bir yöntem içinde gruplayabileceğiniz gibi bir blok içinde de gruplayabilirsiniz. Aşağıdaki örnek bu şekilde kullanımı gösterir burada saniye değeri 59’a eşit olduğunda bu blok çalışır ve blok içerisindeki iki atama işlemi gerçekleştirilir. int saniye; int dakika; ... if (saniye==59) { saniye=0; dakika=dakika+1; } else saniye=saniye+1;

Önemli Not: Yukarıdaki if ifadesi küme parantezleri kullanılmadan yazılırsa C# derleyicisi yalnızca saniye=0 ifadesini if deyimi ile ilişkilendirir. Sonraki ifade bağımsız olarak ele alınır ve her zaman çalışır. Kimi zaman derleyici else anahtar sözcüğünü yakalayıp herhangi bir işlemde yapamayabilir ve bu durumda da bir sözdizimi hatasıyla karşılaşırsınız. if İfadelerini Basamaklamak if ifadeleri başka if ifadeleri ile iç içe kullanılabilir. Bu işlem yapılarak Boolean deyimleri true sonucunu verene kadar art arda farklı karşılaştırmalar yapılabilir. Aşağıdaki örnekte hafta günlerinin adı ile ilgili bir program vardır.

if (gun==0) gunAdi="Pazar"; else if (gun==1) gunAdi="Pazartesi"; else if (gun==2) gunAdi="Salı"; else if (gun==3) gunAdi="Çarşamba"; else if (gun==4) gunAdi="Perşembe"; else if (gun==5) gunAdi="Cuma"; else if (gun==6) gunAdi="Cumartesi"; else gunAdi="Bilinmiyor";

Bu örnekte eğer gun değeri sıfır ise ilk sınama true değerini verir ve gunAdi değişkenine Pazar değeri atanır. gun’ün değeri sıfır değilse sınama başarısız olur ve denetim, ikinci if ifadesini çalıştırıp gun değerinin 1’e eşit olup olmadığına bakar. İkinci if ifadesine sadece birinci sınama false olduğunda bakılır. İşlem, bu şekilde sonuna kadar devam eder. Örnek: Aşağıdaki link de verilen programı bilgisayarınıza indiriniz. Bu örnekte, basamaklı if ifadelerini kullanan iki tarihi birbiriyle karşılaştıran bir uygulama yapılacaktır. Seçim Örneği Programı bilgisayarınıza yükledikten sonra Farm1.cs yi açın. Sonra Debug menüsünden Start Without Debugging komutunu tıklayın (Ctrl+F5). Oluşturulan form üzerinde birinci tarih ve ikinci tarih adlı iki adet DateTimePicker denetimi vardır. Her ikisi de bugünün tarihini gösterir. Karşılaştır düğmesini tıklayın. Programınız aşağıdaki şekilde görüntülenmelidir.

Sonuçları inceleyecek olursak bu karşılaştırma işlemi sonucunda sadece küçüktür, büyüktür ve büyükeşit operatörleri doğru sonucu vermiş gibi görünmektedir. Aslında ilk seçeneğin yani Birinci Tarih = = İkinci Tarih seçeneğinin Boolean deyimi true olmalıdır. Programdan çıkın Visual Studio.NET ortamına dönün ve form üzerinde farenin sağ tuşuna tıklayıp View Code seçeneğini kullanarak kodlama ekranına geçin. Code bölmesinde aşağıdaki yöntemi bulunuz. private int dateCompare(DateTime lhs, DateTime rhs) { // TO DO return 42; }

Bu yöntemi, tarihleri doğru karşılaştıracak şekilde uygulamamız gerekiyor. DateTimePicker tarihle ilgili yıl, ay ve gün bilgilerini tutmaktadır. Karşılaştırma işlemi yaparken her bir değeri ayrı ayrı karşılaştırmamız gerekiyor. Öncelikle aşağıdaki yöntemi inceleyin; if lhs < rhs, sıfırdan küçük bir tamsayı döndürür. if lhs==rhs, sıfır döndürür if lhs>rhs, sıfırdan büyük bir tamsayı döndürür

Bu bilgilerden sonra dateCompare yöntemini aşağıdaki şekilde kodlayın. int sonuc; if (lhs.Year < rhs.Year) sonuc = -1; else if (lhs.Year > rhs.Year) sonuc = +1; else if (lhs.Month < rhs.Month) sonuc = -1; else if (lhs.Month > rhs.Month) sonuc = +1; else if (lhs.Day < rhs.Day) sonuc = -1; else if (lhs.Day > rhs.Day) sonuc = +1; else sonuc = 0; return sonuc;

Program ilk olarak yıl bilgisine bakacak Birinci Tarih yılı İkinci Tarih yılından küçük ise sonuç -1 değeri alacak büyük ise +1 değeri alacak eğer küçük ya da büyük değilse ay bilgisini sonra da gün bilgisini kontrol edecek. Bunların hiçbiri birbirinden farklı değilse yani yıl, ay ve gün bilgileri aynı ise program sonuç değişkenine 0 değerini alacak ve bunu return edecektir. Programı yeniden çalıştırıp karşılaştır butonuna tıkladığınızda aşağıdaki ekranı görmelisiniz.

Programımız doğru çalışıyor gözüküyor. Farklı tarih bilgileri girerek programınızı yeniden çalıştırın ve sonuçların doğru olup olmadığını gözlemleyin. switch İfadeleri Basamaklanmış bir if ifadesi yazıldığında kimi zaman tüm if ifadelerinin benzer göründüğünü fark edersiniz; hepside benzer deyimleri karşılaştırırlar. Tek farkları, her if ifadesinin aynı deyimin sonucunu farklı bir değerle karşılaştırıyor olmasıdır. Örneğin; if (gun==0) gunAdi="Pazar"; else if (gun==1) gunAdi="Pazartesi"; else if (gun==2) gunAdi="Salı"; else if (gun==3) ... else gunAdi="Bilinmiyor";

Bu gibi durumlarda programın daha etkin ve kolay okunur biçime dönüştürülmesi için switch ifadeleri kullanılabilir. Switch ifadelerinin genel kullanımı aşağıdaki gibidir. switch (denetimDeyimi) { case sabitDeyim: ifadeler break; case sabitDeyim: ifadeler break; case sabitDeyim:

ifadeler break; ... default ifadeler break; }

Yukarıdaki örnek gösterimde switch, case, default ve break anahtar sözcüklerdir. Buradaki gösterimde denetimDeyimi bir kez değerlendirilir ve sabitDeyim’in değeri denetimDeyimi’nin değerine eşit olan case’in altındaki ifadeler break ifadesine kadar çalıştırılır. Sonra switch ifadesi sonlanır ve program switch ifadesinin bitişini gösteren son küme parantezinden sonra çalışmaya devam eder. Hiçbir sabitDeyim’in değeri, denetimDeyimi’nin değerine eşit değilse seçime bağlı olarak default değerinin altındaki ifadeler çalıştırılır. default deyimi programda kullanılmak zorunda değildir. Hiçbir deyimin değeri hiçbir durumu karşılamazsa ve programda default deyimi oluşturulmamışsa program hata vermez küme parantezinden sonraki bölümden itibaren çalışmaya devam eder. Daha önce if ifadesi ile oluşturulan örneğimizi switch ile yeniden ele alalım; switch (gun) { case 0: gunAdi="Pazar"; break; case 1: gunAdi="Pazartesi"; break; case 2: gunAdi="Salı"; break; ... default gunAdi="Bilinmiyor"; break; }

Switch İfadesi Kuralları switch ifadeleri çok kullanışlı olmasına karşın bir takım kurallara uygun oluşturulmak zorundadır. Bu kurallar aşağıda verilmiştir: •

switch ifadelerini yalnızca temel veri türleriyle (int gibi) ve string ile kullanabilirsiniz. switch’i diğer veri türleriyle kullanmak isterseniz if ifadesini kullanmalısınız.



Durum (case) etiketleri, 12 ya da “12” gibi sabit deyimler olmalı. Durum etiketlerini çalıştırma esnasında hesaplamak isterseniz, if ifadesini kullanmalısınız.



Durum etiketleriniz benzersiz deyimler olmalıdır. Yani aynı değere sahip iki durum etiketi yaratamazsınız.



Aynı ifadeleri birden çok değer için çalıştırmak istiyorsanız durum etiketi syntax(sözdizimi)’nı tekrarlamanız gerekir. Yani durum etiketi değerlerini gruplamanın bir yolu yoktur. Örneğin:

switch (koz) { case Kalp: case Karo: // Hata renk="Kırmızı"; break; case Maca: case Sinek: // Hata renk = "Siyah"; break; }

“Başarısızlık yok.” ( no fall-through) kuralının anlamı, bir switch ifadesinin anlamını değiştirmeden bölümlerini istediğiniz gibi değiştirebilirsiniz. break ifadesi switch ifadesinin her durumu için (default dâhil) kullanımı zorunlu bir ifadedir. C ve C++’da break ifadesini kullanmazsanız, program bir sonraki duruma geçer ve o ifadeleri çalıştırmaya devam eder. Günümüzde bilinen en büyük ve en pahalı bilgisayar hatasının C programında unutulan bir break ifadesi olduğudur. C#’ da ise bu durum bir derleme zamanı hatası olarak karşımıza gelir. Bu işlem için default yerine başka yöntemler kullanılabilir olsa da çok fazla önerilmez ve bu içerikte yer verilmeyecektir. Örnek: Aşağıdaki programı bilgisayarınıza indirin. Bu program bir dizenin karakterlerini okuyan ve her karakteri XML karşılığını eşleyen bir program olacaktır. Örneğin “=70)&&(ortalama
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF