C# Dersleri - Bölüm 3

Bu konuyu okuyanlar

Memik Yanık, C# derslerine devam ediyor. Programlama öğrenmek isteyip de nereden başlayacağını bilmeyenlerdenseniz, yazı dizisini takip edin.

Bir önceki derste Not Defteri ile kısa bir C# programı hazırlayıp “ilk.cs” adıyla kaydetmiştik. Devamında bu CS uzantılı C# programını derleyip EXE dosya hazırlamıştık. Hatta örneğimizin son hali beklediğimiz sonucu vermemişti. Bu dersimizde ilk olarak o derste yaptığımız örneği düzelteceğiz. Bir önceki dersimizde hazırladığımız örneğin son şeklini aşağıda verdim.

class Deneme

{

static void Main(string[] args)

{

int yil;

System.Console.Write("Hangi Yıldayız : ");

yil = System.Console.Read();

System.Console.WriteLine();

System.Console.Write("Girdiğiniz Yıl :");

System.Console.WriteLine(yil);

}

}


Bu koda dikkat ederseniz konsoldan bilgi okuma işlemi Read() metodu ile yapılmaktadır. Read() metodu konsoldan okuma yaparken girilen bilginin ilk karakterinin ASCII kodunu geriye göndermektedir. Bu örnek program çalıştırılıp “Hangi Yıldayız :” sorusuna “A” ile cevap verilirse ekrana 65 yazılır. Çünkü “A” hafinin ASCII kodu 65’dir.

cs_ders_3_resim_1.jpg


Console sınıfının ReadLine() metodu ise farklı bir şekilde çalışmaktadır ve konsoldan yani DOS penceresinden okuduğu bilginin String tipte olduğunu varsaymaktadır. Bu nedenle yukarıda verdiğimde örnekte değişiklik yapıp okuma işlemini Read() yerine ReadLine() metodu ile yapmaya çalıştım.

class Deneme

{

static void Main(string[] args)

{

int yil;

System.Console.Write("Hangi Yıldayız : ");

yil = System.Console.ReadLine();

System.Console.Write("Girdiğiniz Yıl :");

System.Console.WriteLine(yil);

}

}



Bu şekilde değiştirdiğimiz C# programını derlemeye çalışırsak hata meydana gelir. Çünkü ReadLine() metodu tarafından okunup geriye gönderilen bilgi String tipte olmasına rağmen burada int tipindeki değişkene aktarmaya çalışıyorum. Bu hatanın önüne geçmek için “yil” adını verdiğim değişken yerine string tipte bir değişken tanımlayıp kullandım.


class Deneme

{

static void Main(string[] args)

{

string str;

System.Console.Write("Hangi Yıldayız : ");

str = System.Console.ReadLine();

System.Console.Write("Girdiğiniz Yıl :");

System.Console.WriteLine(str);

}

}


Bu hali ile programımız istediğimiz sonucu verir. Bu örnekte konsoldan girilen “yıl” bilgisi matematiksel işlemlerde kullanılmadığı için rakamlardan meydana gelse bile string yani karaktersel bilgi olarak değerlendirmenin bir sakıncası olmaz.

Şimdi bu örnekte değişiklik yapıp kullanıcıdan 2 sayısal bilgi isteyip bunları birbirleri ile çarptıktan sonra sonucu ekrana yani konsola yazacağım. Bu amaçla önce 2 string değişken tanımlayıp ReadLine() metodu ile okunan bilgileri bu değişkenlere aktardım.

cs_ders_3_resim_2.jpg


Bu program bu hali ile kaydedilip çalıştırılırsa konsoldan girilen bilgiler string değişkenlere aktarılır. Bu örnekteki amacımız kullanıcının sayısal bilgi girmesini ve bu sayıları birbiri ile çarpıp ekrana getirmek olduğu için matematiksel işlem öncesi String değişkenlerin içeriğini int tipindeki değişkenlere aktarmak gerekir. Bu amaçla bu C# programına ekleme yapıp int tipinde 2 değişken tanımladım. Ardından string değişkenlerin içeriklerini dönüştürüp int tipindeki bu değişkenlere aktardım.


class Deneme

{

static void Main(string[] args)

{

string str1;

string str2;

int sayi1;

int sayi2;

System.Console.Write("İlk sayıyı girin : ");

str1 = System.Console.ReadLine();

System.Console.Write("İkinci sayıyı girin: ");

str2 = System.Console.ReadLine();

sayi1 = System.Int16.Parse(str1);

sayi2 = System.Int16.Parse(str2);

}

}



Bu kodda sizin için yeni olan System adlı Namespace’de yer alan Int16 sınıfıdır. String bilgiyi int tipindeki değişkene aktarırken bu sınıfın Parse() metodunu kullandım. Bu dönüştürme işlemini yaparken Int16 yerine Int32 sınıfının Parse() metodunu kullanabilirdim.

Hemen hatırlatmada bulunmak isterim: Her ne kadar bu örnekte kullanıcıya sayı girin mesajı verilmiş olunsa bile kullanıcı sayısal bilgi yerine karaktersel bilgi girerse Parse() metodu dönüştürme yapamayacağı için hata meydana gelir. Bu tip muhtemel hataların önene geçmek için hata kontrol blokları hazırlanır.

Bu şekilde konsoldan girilen bilgileri Parse() metodu ile dönüştürüp int tipindeki değişkenlere aktardıktan sonra matematiksel işlem yapabiliriz. Matematiksel işlem sonucu bulunacak değeri aktarmak üzere int tipinde 3. bir değişken tanımladım.


cs_ders_3_resim_3.jpg



Bu kodu dikkatice incelerseniz bir satırda aynı tipte birden fazla değişkeni tanımlamış olduğumuzu görürsünüz. Hemen hatırlatmak gerekirse; bu programı derleyip çalıştırıp sonra 1. sayı ile 2. sayının çarpımı sonucu elde edilen sayısal bilgi 2147.483.647’den büyük olursa hata meydana gelir.

Ayrıca string bilgileri Int16 sınıfının Parse() metodu ile dönüştürdüğümüz için konsoldan girilen sayılar 32767’den büyük olmamalı. Int16 sınıfının Parse() metodu yerine Int32 sınıfının Parse() metodunu kullansaydım 1. veya 2. sayı 2147.483.647 gibi büyük bir değer olabilirdi.

Çarpma işlemi sonucu bulunan değeri WriteLine() metodu sayesinde direk konsola yazmak mümkün olmasına rağmen amacım bazı konuları anlatmak olduğu için üçüncü bir string değişken tanımlayıp çarpma işlemi sonucu bulunan değeri dönüştürüp bu değişkene aktardım. Bu işlemi nasıl yaptığımı aşağıda görebilirsiniz.


class Deneme

{

static void Main(string[] args)

{

string str1,str2, sonuc_str;

int sonuc, sayi1, sayi2;

System.Console.Write("İlk sayıyı girin : ");

str1 = System.Console.ReadLine();

System.Console.Write("İkinci sayıyı girin: ");

str2 = System.Console.ReadLine();

sayi1 = System.Int32.Parse(str1);

sayi2 = System.Int32.Parse(str2);

sonuc = sayi1 * sayi2;

sonuc_str = System.Convert.ToString(sonuc);

}

}



Dikkat ederseniz burada int tipindeki değişkenin içeriğini string tipindeki değişkene aktarabilmek için Convert sınıfının ToString() metodundan yararlandım. C# ile az çok uğraşmış olanlar bu işlemin daha kısa bir yolunun olduğunu ileri sürebilirler. Bu arkadaşlar haklıdırlar; dönüştürme yaparken Convert sınıfının ToString() metodu yerine Object sınıfının ToString() metodunu kullanabilirsiniz. Object sınıfının ToString() metodunun nasıl kullanıldığını daha sonra anlatacağım. ToString() metodu ile integer bilgiyi string bilgiye dönüştürdükten sonra WriteLine() metodu ile konsola yazdım.


class Deneme

{

static void Main(string[] args)

{

string str1,str2, sonuc_str;

int sonuc, sayi1, sayi2;

System.Console.Write("İlk sayıyı girin : ");

str1 = System.Console.ReadLine();

System.Console.Write("İkinci sayıyı girin: ");

str2 = System.Console.ReadLine();



sayi1 = System.Int32.Parse(str1);

sayi2 = System.Int32.Parse(str2);

sonuc = sayi1 * sayi2;

sonuc_str = System.Convert.ToString(sonuc);

System.Console.WriteLine("Sayıların çarpımı : " + sonuc_str);

System.Console.Write("Devam etmek için bir tuşa basın");

System.Console.Read();

}

}



Biraz da Namespace’lerden Söz Edelim

Şimdi yukarıda uzun uzun anlatılan örneği bir tarafa bırakıp başka bir örnek hazırlayacağım. C# programlarını Visual Studio veya C# için hazırlanmış Express Edition’dan yararlanma yoluna henüz gitmediğimiz için CS uzantılı C# programını yine Not Defteri ile hazırlayacağız. Hazırladığım basit C# programını aşağıda verdim. DOS penceresinde derlenip DOS penceresinden bilgi alış verişi yapan C# programlarına konsol uygulaması adı verilmektedir.



Class Sinif_1

{

public static void Main()

{

System.Console.Write("Efes Pilsen Basketbol Takımı");

System.Console.ReadLine();

}

}



Bu şekilde hazırlanan C# programı DOS ortamında derlenip çalıştırılırsa belirtilen bilgi Write() metodu sayesinde DOS penceresine yazılır. Bir sonraki satırda kullanılan ReadLine() metodu sayesinde enter tuşuna basılıncaya kadar program çalışmaya devam eder. Bu örnekte ReadLine() yerine Read() metodu kullanılsaydı değişen bir şey olmazdı.


.NET Framework adı verilen sınıf kitaplığı ile gelen sınıfların Namespace adı verilen yapılarda saklandığını biliyorsunuz. C# programlarında kullanmak istediğiniz Class hangi Namespace’in içinde yer alıyorsa o Namespace’ı using deyimi ile programa dahil etmelisiniz veya yukarıda yapıldığı gibi kullanmak istediğiniz Namespace’in adını metodun önüne her seferinde yazmalısınız.


DOS penceresi ile ilgili Console sınıfı System adlı Namespace’te yer aldığı için Write() metodundan önce bu sınıfın yer aldığı Namespace’in adını yazdım. Söz konusu Namespace’teki sınıfları programınızda çok kez kullanıyorsanız her seferinde Namespace’in adını bu şekilde yazmak yerine aşağıda yapıldığı gibi ilgili Namespace’i using deyimi ile koda dâhil edebilirsiniz. using deyimi ile olmayan bir namespace’i C# programınıza dahil etmek istemeniz halinde derleme sırasında hata meydana gelir.



using System;

Class sinif_1

{

public static void Main()

{

Console.Write("Efes Pilsen Basketbol Takımı");

Console.ReadLine();

}

}



C# programlarınızda .NET Framework ile gelen Namespace’lerdeki hazır sınıfları kullanmanın ötesinde kendi hazırladığınız class’ları bir Namespace’in içine koymanız gerekir. Yukarıda bunu yapmamış olmamıza rağmen herhangi bir hata meydana gelmedi. Çünkü programcı yazdıklarını bir Namespace’e yerleştirmediği zaman C# derleyicisi kendiliğinden bir Namespace hazırlamaktadır. Şimdi yukarıda verdiğim programdaki “Sinif_1” adını verdiğim Class’ı bir Namespace’e dahil edeceğim.



using System;

namespace SDN

{

class sinif_1

{

public static void Main()

{

Console.Write("Efes Pilsen Basketbol Takımı");

Console.ReadLine();

}

}

}



Yukarıda bold yapılan paragrafı ve bu kısa C# kodunu; C++ veya Java gibi nesneye yönelik programlama dilleri hakkında az çok bilgi sahibi olan birisine gösterseniz şaşırıp “bunda önemli olan nedir veya üzerinde durulacak ne var ki?” diye size soru yöneltmesi yüksek ihtimaldir. Çünkü konuya kendi açısından bakacaktır. Bu dersleri C# veya nesneye yönelik programcılık konusunda yeni olanları düşünerek kaleme aldığım için yukarıda verdiğim kısa kod ve kalın(bold) yapılan açıklama karşısında duraklamanız normaldir. Bu düşünce ile aşağıda farklı renge boyanan paragrafı kaleme aldım.



C# veya Visual Basic’in .NET uyumlu sürümü ile program yazanların kaçmakla kurtulamayacakları iki kavramdan birisi Class, diğeri ise Namespace’tir. Nesneye yönelik programcılığın temeli olan Class kavramı hakkında henüz doğru dürüst bilgi verilmemiş olmakla birlikte sanırım Class kavramı hakkında kafanızda beliren soruların üzerinde durmamayı şimdilik başarıyorsunuz Class bir yana bir de Namespace’ten söz edilince kafanızdaki sorular önem kazanmaya başlamış olabilir.

Birden Fazla Main() Metodu


Uygulamanızda birden fazla Class varsa Main() metodunun hangi Class’ta olduğunun önemi yoktur. Çünkü C# derleyicisi Main() metodunun hangi Class’ta olduğunu arayıp buluyor. Uygulamadaki birden fazla sınıfta Main() metodu varsa hangisinin kullanılacağının belirtilmesi gerekir. Bu konuda bilgi vermek için aşağıdaki gibi bir C# programı hazırladım.


using System;

class sinif_1

{

public static void Main()

{

Console.Write("Program İlk sınıftaki Main ile başladı");

Console.ReadLine();

}

}

class sinif_2

{

public static void Main()

{

Console.Write("Program İkinci sınıftaki Main ile başladı");

Console.ReadLine();

}

}



Bu şekilde hazırlanan C# programı bilinen şekilde derlendiğinde hata meydana gelir. Derleme satırında hangi sınıftaki Main() metodunun kullanılmak istendiği belirtilmelidir. Bu konsol uygulaması aşağıdaki gibi derlenirse uygulama ilk sınıftaki Main() metodundan itibaren çalışmaya başlar.



cs_ders_3_resim_4.jpg



Bu örneğe biraz dikkat ederseniz Main() metodunun bu kez parametresiz olduğunu veya parantezin içine herhangi bir değişken adı yazmadığımı görürsünüz. Ayrıca bu örnekte Namespace hazırlamadığımı fark etmiş olmalısınız.


Write ve WriteLine Metotları

Yukarıda verdiğim örneklerde konsola yalnızca bir bilgi yazdım. Şimdi konunun anlaşılmasına katkı olması için 4 bilgiyi yazacağım. Bu amaçla aşağıda verdiğim C# programını hazırladım.



using System;

namespace SDN

{

class sinif_1

{

public static void Main()

{

Console.Write("Fenerbahçe");

Console.Write("Galatasaray");

Console.Write("Beşiktaş");

Console.Write("Trabzonspor");

Console.ReadLine();

}

}

}



Bu programda Write() metodu ile konsola 4 bilgi arka arkaya yazılmakta ve ReadLine() metodu ile programın işletimi askıya alınmaktadır. Write() metodu ile konsola bilgi yazıldıktan sonra imleç yazma işleminin tamamlandığı yerde bekleyeceği için bu program derlenip çalıştırılırsa aşağıdaki gibi bir sonuç elde edilir.


cs_ders_3_resim_5.jpg




Bu bilgilerin ayrı satırlara yazılmasını sağlamak için Write() yerine WriteLine() metodunu kullanabilirsiniz. WriteLine() metodu kendisine parametre olarak verilen bilgiyi belirtilen ortama(burada konsol) yazdıktan sonra imleci bir sonraki satırın başına alır.


using System;

namespace SDN

{

class sinif_1

{

public static void Main()

{

Console.WriteLine("Fenerbahçe");

Console.WriteLine("Galatasaray");

Console.WriteLine("Beşiktaş");

Console.WriteLine("Trabzonspor");

Console.Read();

}

}

}



Write() metodu ile konsola yazılan metnin sonuna satır başı karakterini(“\n”) ekleyerek aynı sonucu alabilirsiniz. Satır başı karakterinin nasıl kullanıldığını aşağıda görebilirsiniz.


using System;

namespace SDN

{

class sinif_1

{

public static void Main()

{

Console.Write("Fenerbahçe\n");

Console.Write("Galatasaray \n");

Console.Write("Beşiktaş \n");

Console.Write("Trabzonspor \n");

Console.Read();

}

}

}



Yazan: Memik Yanık
SDN - http://shiftdelete.net
 

altug53

Öğrenci
Ben C# ı buldum indirdim fakat 30 günlük deneme sürümü olduğunu sonrada öğrendim.Acaba bana direkt link verebilirmisiniz.Yardımlarınız için şimdiden teşekkürler.Çünkü Memik abi ücretsiz sürümünü bulabileceğimizi söylemiş.
 

Memik Yanık

Öğrenci
.NET Framework ve Express Edition’nın bulunup indirilmesi ve register edilmesi konusunda sorular geleceğini düşündüğüm için başka bir yazı hazırlamıştım. PDF olarak düzenlenip SDN’den indirilebilinecekti. Henüz derslerde Express Edition’nı kullanmadığımız bu yazıya ulaşmanız için henüz bir hazırlık yapılmadı. Meraklılar bu yazıyı http://www.memikyanik.com/download/cs_icin_express_edition.rar buradan indirebilirler.
 

MehmetMiri

Öğrenci
Teşekkürler Memik hocam
içinden çıkamadığım bir soru var hocam kafamda, birden fazla main metodunun amacı nedir? Birden fazla main metodunda EXE çift tıklandığında hangi main metodundan başlayacağını kod olarak nasıl gösterebiliriz yani kullanıcı konsoldan derleyemez

 

Memik Yanık

Öğrenci
Söyleyeceklerimin pratik değeri olmasa bile konuyu anlamana yardımcı olacaktır: Varsayalım ki yazdığın programın hem Türkçe hem de İngilizce menülü sürümleri var. Veya programın hem normal hem de demo versiyonunu hazırlayacaksın. Bu durumda birden fazla Main() metodu hazırlayıp ona göre derleme yapabilirsin.
 

04dilan

Öğrenci
yapmayın ya arkadaslar gercekten öle mı oldu vay be :* hiç bişe anlaşılmıyo mal mal yazılar yazmıssınızz haha ;D
 

04dilan

Öğrenci
arkadaşlar ben simge buraya nasıl üye olabılırım bana acilen hemen yazabılırmısını çok acıl ama hemen bana yazın ve uye olunca heralde benım ıcın ayrı bı sayfa açılacak tam bılmıyorum bıde onun ıcını nasıl duzenlıyeceğimi yazarmısınız ne olurrrrr çok acil lazımmmm
 

Memik Yanık

Öğrenci
- sözüm 04dilan namlı muhterem arkadaşa değil- Ne zaman biryerde forumda vs. görülsem sanki bir yerden yönetiliyormuş gibi amaçları bağcı dövmek olan birkaç kişi hemen orada biter ve Memik Yanık şöyledir böyledir derler. Bu yıllardır böyle. SDN'nin bloğuna yazılanlara bakabilirsiniz.
 

MehmetMiri

Öğrenci
Memik Yanık dedi ki:
- sözüm 04dilan namlı muhterem arkadaşa değil- Ne zaman biryerde forumda vs. görülsem sanki bir yerden yönetiliyormuş gibi amaçları bağcı dövmek olan birkaç kişi hemen orada biter ve Memik Yanık şöyledir böyledir derler. Bu yıllardır böyle. SDN'nin bloğuna yazılanlara bakabilirsiniz.

Memik Hocam, bu gibi olayların neticesinde sizin gibi değerli kişilerin ne kadar büyük bir iş başardıklarını tahmin etmek güç değil, bu olaylar başarılı olan kişilerin başına gelip çekemiyenler tarafından gerçekleştiriliyor ama bilmiyorlar ki bu gibi olaylar Memik YANIK Gibi başarılı insanları ateşlemektedir..
 

SDN Son Haberler

Son mesajlar

Üst