C# İle biLGİsayar programlama temelleri (C# Programlama Kitabı) Svetlin Nakov & Co



Yüklə 3,36 Mb.
səhifə26/31
tarix03.11.2017
ölçüsü3,36 Mb.
#28822
1   ...   23   24   25   26   27   28   29   30   31

11.3 C# Sınıfları


Şimdilik, OOP ortak özellikleri hakkında konuştuk. Modern programlama dillerinin büyük bir kısmı nesne yönelimlidir. Her sınıf ve nesneler ile çalışmak için öncelikle belirli özelliklere sahip olmanız gereklidir. OOP programlarının temel kavramları, hemen hemen tüm modern programlama dilleri tarafından kullanılır.

11.3.1 C# Sınıfları Nedir?


C# sınıfı class anahtar sözcüğünü takiben girilen ve sınıf ismini temsilen atanan bir tanımlayıcı tarafından tanımlanır. Bunu ayrı bir kod bloğunda tanımlanan veri üyeleri ve metotlarla tamamlarsınız.

C# sınıfları aşağıdaki elemanlardan oluşur:



  • Veri alanları: Belirli bir türde veri değişkenleri

  • Özellikler: Veri alanlarının işlevselliğini genişleterek veri alanlarına ayıklama ve kayıt yaparken ek veri yönetim yeteneği verme özelliğine haiz özel türde elemanlar. Bkz. Sınıfları Tanımlama Bölümü.

  • Metotlar – veri işlemeyi uygular.


11.3.2 Örnek Sınıf


Listeli elemanlardan oluşan bir C# sınıfı için örnek vereceğiz. Cat (Kedi) sınıfı gerçek hayattan “kedi”yi modellerken çeşitli alanları ad ve renk özellikleriyle tanımlanabilir.

Cat (Kedi) sınıfının tanımı alanları, özellikleri ve metotları ile birlikte aşağıda verilmiştir, ancak şu anda sınıf tanımına girmeyeceğiz, bu konu ileride Sınıfları Tanımlama Bölümü’nde anlatılacak.

public class Cat

{

// Field name



private string name;

// Field color

private string color;
public string Name

{

// Getter of the property "Name"



get

{

return this.name;



}

// Setter of the property "Name"

set

{

this.name = value;



}

}
public string Color

{

// Getter of the property "Color"



get

{

return this.color;



}

// Setter of the property "Color"

set

{

this.color = value;



}

}
// Default constructor

public Cat()

{

this.name = "Unnamed";



this.color = "gray";

}
// Constructor with parameters

public Cat(string name, string color)

{

this.name = name;



this.color = color;

}
// Method SayMiau

public void SayMiau()

{

Console.WriteLine("Cat {0} said: Miauuuuuu!", name);



}

}


Name (Ad) ve Color (Renk) özellikleri tanımlandığında örnek Kedi (Cat) sınıfının özel (private) veri alanları içinde ad ve renk değerlerini tutar. Ayrıca iki kurucu (constructor) sırasıyla, Cat (Kedi) sınıfının parametreli ve parametresiz örneklerini oluşturmak için tanımlanmış ve sınıf metotlarından SayMiau() yine aynı sınıf içinde tanımlanmıştır.

Örnek sınıf aşağıdaki şekilde gerçekleştirilir:



static void Main()

{

Cat firstCat = new Cat();



firstCat.Name = "Tony";

firstCat.SayMiau();


Cat secondCat = new Cat("Pepy", "red");

secondCat.SayMiau();

Console.WriteLine("Cat {0} is {1}.",

secondCat.Name, secondCat.Color);

}


Konsoldan çıktısı aşağıdaki gibi görünür:

Cat Tony said: Miauuuuuu!

Cat Pepy said: Miauuuuuu!

Cat Pepy is Red.


Nesneleri oluşturmak, özelliklerine erişmek, metotlarını çağırmak ile ilgili açıklamaları bölümde daha sonra ele alacağız. Şimdiki örneğimizin yürütülme kurallarına dikkatimizi vereceğiz.

11.3.3 Sistem Sınıfları


System.Console sınıfına ait Console.WriteLine metotunun çağrılması C#

sistem sınıflarının kullanımına bir örnektir. C# uygulamaları geliştirmek için standart kütüphanelerde tanımlı olan sınıflara sistem sınıfları denir. .NET uygulamalarının hepsinde kullanılabilir. Sistem sınıfları için örnekler String, Environment ve Math olarak daha sonra konuşulacaktır.

Programlamaya Giriş Bölümü’nden bildiğiniz gibi, .NET Çerçevesi SDK ile beraber gelen programlama dilleri (C# ve VB.NET), derleyiciler ve standart sınıf kitaplığı bulunmaktadır. Bu sistem geliştirme araçları programlamada en yaygın görevleri gerçekleştirmek için binlerce sistem sınıfı sağlar, konsol-tabanlı girdi/çıktı, metin işleme, koleksiyon sınıfları, paralel yürütme, ağ, veritabanı erişimi, veri işleme, yanı sıra Web tabanlı uygulama oluşturma, GUI ve mobil uygulamalar.

Sınıf uygulamasında mantık sarmalanışı önemlidir. Programcı için sınıfın ne yaptığı ile ilgilenmeliyiz, nasıl yaptığı atlanabilir. Bu nedenle sınıfların büyük bir bölümü public değildir. Sistem sınıflarının uygulaması genellikle programcıdan saklanır; çünkü sistemi ilgilendirir.


11.4 Nesneleri Oluşturma ve Kullanma


Şimdilik nesneleri programlarımızda oluşturma ve kullanmaya odaklanacağız. Önceden tanımlanmış sınıflar ile ve çoğunlukla .NET Çerçevesi’nin sistem sınıfları ile çalışacağız. Kendi sınıflarımızı tanımlamanın özellikleri için bkz. “Sınıfları Tanımlama” Bölümü.


11.4.1 Nesneleri Oluşturma ve Bırakma


Program çalıştırılması sırasında önceden tanımlanmış sınıflardan nesne oluşturulması new işlecinin kullanılmasıyla yapılır. Yeni oluşturulan nesne genellikle nesne sınıfının türünden veya o türe eşdeğer bir değişkene atanır. (Bkz. Nesne Yönelimli Programlamanın İlkeleri” Bölümü). Zorunlu olmayan bu atama sonucunda nesne kopyalanmaz, ve yeni oluşturulan nesneye bir referans (başvuru) bellek adresinde bir değişken olarak kaydedilir. Burada nasıl çalıştığını gösteren basit bir örnek veriyoruz:

Cat someCat = new Cat();

Cat sınıfının yeni yaratılan örneği Cat türünden someCat değişkenine atandığında, someCat değişkeni yığında kalırken, değeri olan Cat sınıf örneğini yönetilen yığıtta saklamaya devam ediyoruz:


11.4.1.1 Belirlenmiş Parametreler ile Nesneleri Oluşturma


Şimdi parametre değerlerinin, nesneyi oluşturma sırasında atandığı bir örneğe bakacağız:

Cat someCat = new Cat("Johnny", "brown");

Burada, someCat adlı nesne, “Johnny” adlı ve kahverengi renkli bir kediyi temsil ediyor. Bunu belirtmek için sınıf adından sonra parantez içinde “Johnny” ve “kahverengi” sözcüklerini yazmalıyız.

new işleci ile yeni bir nesne oluştururken iki şey gerçekleşir: bu nesne için bellek ayrılır ve bu nesnenin veri üyeleri ilk değerleri ile başlatılır. Başlatma özel bir yapıcı metot tarafından yapılır. Yukarıdaki örnekte başlatma parametreleri aslında sınıfın kurucu parametreleridir.

Bir süre sonra kurucuları da tartışacağız. Cat sınıfının Name ve Color üye değişkenleri (String sınıfına ait) birer referans türü olduğu için dinamik bellekte (yığın) ayrıca kaydedilir ve adres/işaretçileri nesnenin içinde birer referans (başvuru) olarak saklanır.

Aşağıdaki şekilde Cat nesnesinin bilgisayar belleğinde nasıl temsil edildiği örnek olarak verilmiştir. (oklar bir nesneden diğerine olan referansları göstermektedir.)


11.4.1.2 Nesnelerin Serbest Bırakılması


C# dilinde nesnelerle çalışmanın önemli bir özelliği, genellikle onların yok edilmesi ve bellekte kaplanan alanın bırakılması için manuel yöntemlere gerek kalmamasıdır. Bu bellek temizleyicisinin (çöp toplayıcı) kullanılmayan nesneleri otomatik olarak serbest bırakmasını mümkün kılan gömülü olarak çalışan .NET CLR sistemidir ve kaplanan bellek serbest kalır. Böylece birçok potansiyel hatalarla ve sorunlarla baş etmeye gerek kalmaz. Eğer belirli bir nesnenin manuel yöntemle serbest bırakılmasını istiyorsak, aşağıdaki örnekte gösterildiği gibi önce ona olan referansı (başvuru) yok etmeliyiz:

someCat = null;

Bu, nesneyi hemen yok etmeyecektir, ancak programın ona erişmesini geçersiz kılacaktır; ve bir dahaki sefere çöp toplayıcı belleği temizleyerek serbest bırakacaktır.


11.4.2 Bir Nesnenin Alan Değişkenlerine Erişim


Verilen bir nesnenin alan değişkenlerine ve özelliklerine erişim, nesne ve alan (veya özellik) adları arasında kullanılması gereken . (nokta) işleciyle gerçekleşir. Belirli bir sınıfın herhangi bir metot gövdesi içinde aynı sınıfın veri alanlarına veya özelliklerine erişiyorsanız . işlecini kullanmanız gerekli değildir.

Veri ayıklamak yada yeni bir veri atamak amacıyla sınıf alanlarına ve özelliklerine erişmek isteyebilirsiniz. Özelliklere, alan değişkenleri gibi erişebilirsiniz – C# bize bu yeteneği get ve set anahtar sözcükleri ile kazandırmıştır. Tanımı gereği özellikten bir veri değeri alınabilir yada yeni bir değer atanabilir. Yukarıda verilen Cat sınıfının özellikleri Name (Ad) ve Color (Renk) veri alanlarıdır.


11.4.2.1 Bir Nesnenin Bellek ve Özelliklerine Erişim – Örnek


Yukarıda önceden tanımlanmış bulunan Cat sınıfına ait bir nesnenin özelliğini kullanan örnek vereceğiz. Cat sınıfına ait myCat örneğini oluşturuyoruz ve Name özelliğine “Alfred” değerini atıyoruz. Bundan sonra standart çıktı üzerinde kedimizin adı ile biçimlendirilmiş bir dize yazdırıyoruz. Bir uygulama aşağıda verilmiştir:

class CatManipulating

{

static void Main()



{

Cat myCat = new Cat();

myCat.Name = "Alfred";
Console.WriteLine("The name of my cat is {0}.",

myCat.Name);

}

}



11.4.3 Nesne Metotlarının Çağrılması


Verilen bir nesnenin metotlarını çağırmak çağrı işleci () ve . işlecinin (nokta) yardımıyla gerçekleşir. Nokta işlecinin zorunlu olmadığı tek durum, aynı sınıfa ait bir başka metot gövdesi içinde metotun çağrılmasıdır. Bir metotun çağrılması, onun adını takiben () veya bazı argümanların geçirildiği durumlar için (
)
yazarak gerçekleştirilmesidir. Metotların nasıl çağrılacağı ile ilgili bkz. “Metotlar” Bölümü.

Şimdi sınıflara ait metotların public, private veya protected erişim niteleyicileri sayesinde kendilerine yapılan çağrıları kısıtlayabilmesinden bahsetmenin doğru zamanıdır. Bu niteleyiciler için bkz. “Sınıfları Tanımlama” Bölümü. Şimdilik public erişim niteleyicisinin metot çağrısı için herhangi bir kısıtlama koymadığını bilmeniz yeterlidir, bu metot herkese açık demektir.


11.4.3.1 Nesne Metotlarının Çağrılması – Örnek




Cat sınıfının SayMiau metotunu çağırarak verdiğimiz örneği tamamlıyoruz. Sonucu aşağıda verilmiştir:

class CatManipulating

{

static void Main()



{

Cat myCat = new Cat();

myCat.Name = "Alfred";
Console.WriteLine("The name of my cat is {0}.",myCat.Name);

myCat.SayMiau();

}

}



Yukarıdaki programı çalıştırdığınızda aşağıdaki metni standart çıktıda yazılı göreceksiniz:

The name of my cat is Alfred.

Cat Alfred said: Miauuuuuu!




11.4.4 Kurucular


Sınıf metotlarından özel biri kurucu olarak nitelendirilmiştir. Bu sınıftan bir nesne yaratılırken kurucu otomatik olarak çağrılır ve verileri ilk değerleri ile başlatır (amacı budur.) Kurucunun döndürdüğü hiçbir değer türü yoktur ve adı rasgele seçilmemiştir; adının sınıf adı ile aynı olması zorunludur. Kurucu metot parametre ile veya parametresiz de tasarlanıp kodlanabilir.

11.4.4.1 Parametre ile Tasarlanan Kurucu Metotlar

Her metot gibi kurucu da parametre alabilir. Her sınıfın farklı sayıda kurucusu olabilir, yalnız bir kısıtlamayla – parametre sayısı ve türleri değişik olmalıdır (imzaları değişikse). Bu sınıfın bir nesnesini oluştururken kuruculardan biri çağrılır.

Tanımlı kurucu metot sayısı birden fazlaysa, bir nesne yaratılırken hangisinin çağrılacağı araştırılmalıdır. Derleyici tarafından bu seçim otomatik olarak kolayca yapılarak problemi çözebilirsiniz. Nesne yaratılırken verilen parametrelere göre en iyi eşleşme yapılır.

11.4.4.2 Kurucu Metotların Çağrılması – Örnek



Cat sınıfının tanımına ve özellikle iki kurucusuna yeniden bakalım:


public class Cat

{

// Field name



private string name;

// Field color

private string color;

// Parameterless constructor

public Cat()

{

this.name = "Unnamed";



this.color = "gray";

}
// Constructor with parameters

public Cat(string name, string color)

{

this.name = name;



this.color = color;

}


}

Bu kod yardımıyla kurucuların parametreli ve parametresiz kullanımını göstereceğiz. Her iki kurucu tarafından Cat sınıfı için tanımlanmış bulunan örneklerin nasıl oluşturulacağına dair açıklamalarda bulunacağız. Nesnelerden biri özelliği belirtilmemiş bir kedi - ve diğeri Johnny adındaki kahverengi kedi olacak. Daha sonra, her iki kedinin SayMiau metotunu uygulayacağız ve sonucu analiz edeceğiz. Kaynak kod aşağıda verilmiştir:



class CatManipulating

{

static void Main()



{

Cat someCat = new Cat();


someCat.SayMiau();

Console.WriteLine("The color of cat {0} is {1}.",

someCat.Name, someCat.Color);
Cat someCat = new Cat("Johnny", "brown");
someCat.SayMiau();

Console.WriteLine("The color of cat {0} is {1}.",

someCat.Name, someCat.Color);

}

}



Programın çalıştırılması sonucu aşağıdaki metin standart çıktıya yazdırılır:

Cat Unnamed said: Miauuuuuu!

The color of cat Unnamed is gray.

Cat Johnny said: Miauuuuuu!

The color of cat Johnny is brown.




11.4.5 Statik Veri Alanları, Özellik ve Metotlar


Şimdiye kadar düşündüğümüz veri üyeleri, nesne durumlarını sınıfların belirli örnekleriyle doğrudan ilgili uygulamıştır. Nesne Yönelimli Programlama’da (OOP) veri alanları ve metotların veri türü (sınıf) ile ilişkili olan ve belirli bir sınıf örneği (nesne) ile bağdaştırılmayan özel kategorileri vardır. Somut nesnelerden bağımsız oldukları için bunlar statik üye diye bilinir. Ayrıca, tanımlandıkları sınıfın bir örneğinin yaratılmasına gerek kalmadan kullanılırlar. Bunlar veri alanları, metotlar ve kurucular olabilir. C# dilindeki statik üyelere kısaca göz atalım.

Verilen bir sınıfa ait statik veri alanları, özellikler veya metotlar tür öncesinde yerleştirilen veya metotun döndürdüğü değer öncesindeki static anahtar sözcüğü ile gerçekleştirilir. Statik kurucu tanımlanırken static anahtar sözcüğü kurucu metot adından önce gelir. Statik kurucuları bu bölümde tartışmayacağız. Şimdilik sadece statik alanları ve metotları dikkate alacağız (daha meraklı okuyucular için bkz. MSDN kütüphaneleri).


11.4.5.1 Statik Veri Alanları, Özellik ve Metotlar Ne Zaman Kullanılır?

Bu soruya cevap aranırken statik olan ve olmayan üyeler arasında çok iyi ayırım yapılması gerekmektedir. Detaylarını incelemeye çalışalım.


İki tür üye arasındaki temel farka az önce değindik. Nesnelerin bir kategorisi olarak sınıf ve bu kategorinin bir temsilcisi olarak nesneyi ele alırsak, statik üyeler için durum bilgisi ve kategorinin kendi davranışını ve statik olmayanlar için ise yine durum bilgisi ve o sınıfın değişik temsillerinin davranışlarını yansıttığını söyleyebiliriz.
Şimdi dikkatimizi statik olan ve statik olmayan veri alanları ve özelliklerin başlatılmasına odaklamamız gerekiyor. Statik olmayan alanların, nesnenin bir örneğinin yaratılması sırasında, sınıf kurucuya yapılan çağrı ile başlatıldığını biliyoruz - kurucu gövdesinin içinde veya dışında olabilir. Ancak, statik veri alanları ve özelliklerinin başlatılması sınıf nesnesi oluşturulduğunda gerçekleştirilemez, çünkü sınıf örneğinin bir yaratımı olmadığı takdirde de statik alanlar kullanılabilir. Aşağıdaki durumları bilmeniz önemlidir:



Programın ilk yürütülmesi sırasında sınıfa ait statik veri alanları ve özellikleri başlatılır.

Bir sonraki başlıkta, statik alanlar ve metot uygulamalarını anlatıyoruz.


11.4.5.2 Statik Alanlar ve Metotlar – Örnek


Bu bölümde verilen örnekte şöyle bir sorun dile getiriliyor: Metotun bir önceki çağrısından daha büyük bir değeri döndürdüğü bir metot, nesnelerin ardışık sıralandırılması için benzer bir işlev kullanır. İlk dönen değerin 0 olduğu varsayılırsa bu metotla doğal bir sayı dizisi elde edilir. Şimdi OOP paradigması içinde bu metotu ele alalım.

Metot adını NextValue(), sınıf adını Sequence tanımlarsanız, metotun döndürdüğü son değeri içeren int türüne ait alanı da CurrentValue olarak tanımlayabiliriz. Aşağıdaki iki eylemin metot gövdesi içinde ard arda gerçekleştirilmesi gerekiyor:

Değerinin artmasını istediğimiz alan ve sonuç olarak dönen yeni değer. Metotun döndürdüğü değer Sequence sınıfının herhangi bir nesnesine somut olarak bağlı değildir. Metot ve alanların statik tanımlı olduğu bu sınıfın uygulaması aşağıda verilmiştir:

public class Sequence

{

// Static field, holding the current sequence value



private static int currentValue = 0;
// Intentionally deny instantiation of this class

private Sequence()

{

}
// Static method for taking the next sequence value



public static int NextValue()

{

currentValue++;



return currentValue;

}

}



Dikkatli bir okuyucu fark edecektir ki, bu sınıf için tanımlanan varsayılan kurucu metot private niteleyici ile bildirilmiştir.



Yalnızca private kuruculara sahip bir sınıf örneklenemez. Böyle bir sınıf genellikle sadece statik üyelere sahiptir ve “yardımcı sınıf” olarak adlandırılır.

Şimdilik public, private ve protected erişim niteleyicilerinin ayrıntısına girmekte fayda görmüyoruz. Detayları okumak isteyen okuyucular için bkz. “Sınıfları Tanımlama” Bölümü.

Sequence sınıfını kullanan bir program aşağıda verilmiştir:

class SequenceManipulating

{

static void Main()



{

Console.WriteLine("Sequence[1...3]: {0}, {1}, {2}",

Sequence.NextValue(), Sequence.NextValue(),

Sequence.NextValue());

}

}


Sequence sınıfına ait NextValue() metotunun üç defa ard arda çağrılmasıyla ilk üç doğal sayı standart çıktıya yazdırılır. Sonucu aşağıda verilmiştir:

Sequence[1...3]: 1, 2, 3

Birkaç farklı dizi oluşturmak istediğiniz takdirde, Sequence sınıfı kurucu metotunun private niteleyicisi nedeniyle derleme hatası üretilir.

11.4.6 C# Sistem Sınıfları – Örnekler


.NET Çerçevesi içinde yer alan temel sistem sınıflarından biri System.Environment olarak kabul edilir. Donanım ve işletim sistemi hakkında bilgi alma kolaylığı sağlayan veri alanları ve metotların faydalı bir kümesinden oluşur ve bazıları programın çevre ile etkileşimine olanak verir. Bu sınıfın sağladığı fonksiyonel işlevler şöylece sıralanabilir:

  • İşlemci sayısı hakkında bilgi, bilgisayar ağ adı, işletim sistemi sürümü, geçerli kullanıcı adı, geçerli dizin, vb.

  • Bu kitapta göz önünde tutulmayacak olan harici tanımlı özelliklere erişim ve ortam değişkenleri.

Aşağıdaki uygulamada Environment sınıfına ait bir metot hızlı ve yüksek performanslı bir program geliştirmek için kullanılmıştır.

Kaynak kodun çalıştırılmasından önce ve sonra geçen zaman arasındaki farkın milisaniye cinsinden çalışma süresi TickCount statik özelliği yardımıyla aşağıdaki uygulamada hesaplanmıştır:



class SystemTest

{

static void Main()



{

int sum = 0;

int startTime = Environment.TickCount;
// The code fragment to be tested

for (int i = 0; i < 10000000; i++)

{

sum++;


}
int endTime = Environment.TickCount;

Console.WriteLine("The time elapsed is {0} sec.",

(endTime - startTime) / 1000.0);

}

}



Environment sınıfına ait TickCount statik özelliği, bilgisayarın açılışından metot çağrısına kadar geçen sürenin milisaniye cinsinden değerini tutmaktadır. Programın çalışması sonucu ölçülen zaman, geçerli bilgisayar yapılandırması ve çalışma yüküne göre değişiklik gösterir. Aşağıda bir standart çıktı verilmiştir:

The time elapsed is 0.031 sec.

Uygulamada Environment.TickCount statik özelliği ve Console.WriteLine(…) statik metotu kullanılmıştır.

11.4.6.1 System.String Sınıfı
.NET Çerçevesi’nin sınıflarından olan System.String ile dizeleri (String) temsil eden çalışmamıza devam ediyoruz. C# dilinin temel veri türü olan dizelerle çalışmak farklı temel veri türleri (tamsayı, kayan noktalı sayılar, Boolean değişkenleri, vb.) ile çalışmaktan farklıdır. Detaylı açıklamalar için bkz. “Dizeler ve Metin İşleme” Bölümü.

11.4.6.2 System.Math Sınıfı



System.Math sınıfı bir sayının üsse (kuvvete) yükseltilmesi, logaritmasının alınması, karekök ve bazı trigonometrik fonksiyonlar gibi temel sayısal ve matematiksel işlemleri gerçekleştirmek için gerekli olan metotları içerir. Aşağıda bu çeşit metotların kullanımını gösteren basit bir örnek vereceğiz.
İki kenarı ve aralarındaki açı derece cinsinden verilen bir üçgenin alanını hesaplayan bir program yapmak istiyoruz. Bunu gerçekleştirmek için Sin(…) metotu ve Math sınıfının PI sabiti gereklidir. Açı için girilen derece sayısı π sayısının yardımıyla kolaylıkla radyan cinsinden bir sayıya dönüştürebilir. Aşağıda bu mantığa göre kodlanmış bir uygulama verilmiştir:

class MathTest

{

static void Main()



{

Console.WriteLine("Length of the first side:");

double a = double.Parse(Console.ReadLine());

Console.WriteLine("Length of the second side:");

double b = double.Parse(Console.ReadLine());

Console.WriteLine("Size of the angle in degrees:");

int angle = int.Parse(Console.ReadLine());
double angleInRadians = Math.PI * angle / 180.0;

Console.WriteLine("Area of the triangle: {0}",

0.5 * a * b * Math.Sin(angleInRadians));

}

}


Programı test etmek isterseniz, düzgün bir eşkenar üçgenin alanını hesaplayıp hesaplamadığını kontrol edebilirsiniz. Daha fazla kolaylık sağlamak için kenar uzunluğunu 2 seçeriz – ve iyi bildiğiniz alan formülünü uygularız:




2, 2, 60 ardışık sayıları girildiğinde standart çıktı sonucu aşağıda verilmiştir:

Face of the triangle: 1.73205080756888

Sistem yerelleştirmenize (Bölge ve Dil Ayarları) bağlı olarak, "1,73205080756888" veya "1.73205080756888" çıktısı üretilir. Aşağıdaki kod parçacığıyla program başlangıcında ondalık noktasını "." olarak atayabilir ve bu kod satırı ile çalıştırabilirsiniz.



System.Threading.Thread.CurrentThread.CurrentCulture =

System.Globalization.CultureInfo.InvariantCulture;




11.4.6.3 System.Math Sınıfı – Örnekler



System.Math sınıfı aynı zamanda iyi bilinen iki matematik sabitini de tanımlar: Trigonometrik sabit π, ve Euler sayısı e. Aşağıda bu sayıların standart çıktıya yazdırılması verilmiştir:

Console.WriteLine(Math.PI);

Console.WriteLine(Math.E);


Standart çıktı sonucu aşağıda verilmiştir:



3.141592653589793

2.718281828459045





11.4.6.4 System.Random Sınıfı

Bazen programlamada rasgele sayılar kullanılır. Örneğin, 0-49 aralığında 6 rasgele sayı (aynı olmak zorunda değil) oluşturmak istediğimizde, System.Random sınıfı ve Next() metotunu kullanarak, örnek oluşturmak için (işletim sisteminin geçerli sistem saati tarafından türetilmiş) bir rasgele değerle programı başlatabilirsiniz. Next(n) metotunu çağırarak [0…n) aralığında bir rasgele sayı üretmeniz mümkündür. Bu metotun sonucu sıfır (0) sayısını da döndürebilir, ancak n sayısından küçük (eşit değil!) bir değeri döndüreceği kesindir. [1…49] aralığında bir rasgele sayı üretmek için Next(49) + 1 kullanımı çıktı üretir.



Random sınıfını kullanarak [1…49] aralığında altı (6) rasgele sayı üreten program aşağıda verilmiştir (sayıların eşit olması gerekli değildir).

class RandomNumbersBetween1And49

{

static void Main()



{

Random rand = new Random();

for (int number = 1; number <= 6; number++)

{

int randomNumber = rand.Next(49) + 1;



Console.Write("{0} ", randomNumber);

}

}



}

Programın çalıştırılması sonucu herhangi bir çıktı aşağıda verilmiştir:

16 49 7 29 1 28


1.4.7 System.Random Sınıfı ve Rasgele Şifre Üretmek

.Net Çerçevesi içinde gelen rasgele sayı üretecinin kullanımını göstermek için 8-15 karakter uzunluğunda ve en az 2 büyük, 2 küçük harf, 1 sayı ve 3 özel karaktere sahip bir rasgele şifre oluşturacağız. Bu amaçla aşağıdaki algoritmayı kullanacağız:




  1. Şifre ilk olarak boş karakter içerir. Öncelikle, rasgele sayı üretecini başlatmalısınız.

  2. Büyük harflerden iki tanesini rasgele olarak seçerek, parola içinde rasgele birer pozisyona yerleştirmelisiniz.

  3. Küçük harflerden iki tanesini rasgele olarak seçerek, parola içinde rasgele birer pozisyona yerleştirmelisiniz.

  4. Rakamlardan iki tanesini rasgele olarak seçerek, parola içinde rasgele birer pozisyona yerleştirmelisiniz.

  5. Özel karakterlerden üç tanesini rasgele olarak seçerek, parola içinde rasgele birer pozisyona yerleştirmelisiniz.

  6. Bu zamana dek, parola 8 karakterden oluşmalıdır. Parola uzunluğunu en fazla 15 karaktere tamamlamak için, 0-7 aralığından rasgele iki sayı, büyük harf, küçük harf, yada rasgele bir karakterden oluşan karakterleri parola içinde rasgele birer pozisyona eklemelisiniz.

Açıklanan algoritmanın bir uygulaması aşağıda verilmiştir:



class RandomPasswordGenerator

{

private const string CapitalLetters =



"ABCDEFGHIJKLMNOPQRSTUVWXYZ";

private const string SmallLetters =

"abcdefghijklmnopqrstuvwxyz";

private const string Digits = "0123456789";

private const string SpecialChars =

"~!@#$%^&*()_+=`{}[]\\|':;.,/?<>";

private const string AllChars =

CapitalLetters + SmallLetters + Digits + SpecialChars;


private static Random rnd = new Random();
static void Main()

{

StringBuilder password = new StringBuilder();


// Generate two random capital letters

for (int i = 1; i <= 2; i++)

{

char capitalLetter = GenerateChar(CapitalLetters);



InsertAtRandomPosition(password, capitalLetter);

}
// Generate two random small letters

for (int i = 1; i <= 2; i++)

{

char smallLetter = GenerateChar(SmallLetters);



InsertAtRandomPosition(password, smallLetter);

}
// Generate one random digit

char digit = GenerateChar(Digits);

InsertAtRandomPosition(password, digit);


// Generate 3 special characters

for (int i = 1; i <= 3; i++)

{

char specialChar = GenerateChar(SpecialChars);



InsertAtRandomPosition(password, specialChar);

}
// Generate few random characters (between 0 and 7)

int count = rnd.Next(8);

for (int i = 1; i <= count; i++)

{

char specialChar = GenerateChar(AllChars);



InsertAtRandomPosition(password, specialChar);

}
Console.WriteLine(password);

}
private static void InsertAtRandomPosition(

StringBuilder password, char character)

{

int randomPosition = rnd.Next(password.Length + 1);



password.Insert(randomPosition, character);

}
private static char GenerateChar(string availableChars)

{

int randomIndex = rnd.Next(availableChars.Length);



char randomChar = availableChars[randomIndex];

return randomChar;

}

}



Kaynak kodda açıklanması gereken bazı hususlar bulunmaktadır. Şöyle ki: Sabitlerin tanımlarından başlamak gerekirse:

private const string CapitalLetters =

"ABCDEFGHIJKLMNOPQRSTUVWXYZ";

private const string SmallLetters =

"abcdefghijklmnopqrstuvwxyz";

private const string Digits = "0123456789";

private const string SpecialChars =

"~!@#$%^&*()_+=`{}[]\\|':;.,/?<>";

private const string AllChars =

CapitalLetters + SmallLetters + Digits + SpecialChars;

Programın kaynak kodu başlatıldığında, C# sabit değerleri const belirteci ile bildirilen değişmez değişkenler olarak atanır. Programda sonradan birçok kez kullanılan sayı veya dizeleri tanımlamak için kullanılır. Bu şekilde değerlerin tekrar tekrar tanımlanması önlenir ve böylece bu değerler kodda sadece tek bir yerde kolayca değiştirilebilir. Örneğin belli bir anda “,” (virgül) karakterinin şifre oluştururken kullanılmamasına karar verirsek, programda tek satırda bunu çözebilirsiniz, sabitin her kullanımında bu yeni değer geçerli olacaktır. C# sabitleri Pascal biçimine uygun adlar taşırlar (birinci harf büyük, geri kalanı küçük harfden oluşur). Detaylı açıklamalar için bkz. “Sınıfları Tanımlama” Bölümü içinde “Sabitler” Başlığı.


Programın diğer kısımları şöyle çalışır: Rasgele sayı üretecini temsil eden rnd adında statik bir üye değişken RandomPasswordGenerator sınıfında tanımlanır. Bu üye bu sınıfın altında tanımlandığı için (Main() metotunun içinde değil), bu sınıfın tamamı tarafından erişilebilir (bu sınıfa ait herhangi bir metot erişebilir) ve statik tanımlandığı için statik metotlar bu değişkene erişebilir. Rasgele bir tamsayıya ihtiyaç duyulduğunda bu rasgele sayı üreteci kullanılır. RandomPasswordGenerator sınıfı sisteme yüklendiğinde bu rasgele sayı üreteci de başlatılır.
GenerateChar() metotunun görevi, kendisine parametre olarak verilmiş bir dizi karakterden oluşan küme içinden rasgele bir karakteri seçmektir. Çalışma prensibi kolaydır: Önce 0-(dize uzunluğu eksi 1) aralığından bir rasgele pozisyon belirlemek, sonra o pozisyondaki karakteri dizeden seçip getirmek.
InsertAtRandomPosition() metotu da benzer şekilde çalışır: StringBuilder nesnesi içinde rasgele bir pozisyon seçer ve bu pozisyona dönüş değeri olan karakteri yerleştirir. StringBuilder nesnesi ile ilgili detaylı açıklamalar için bkz. “Dizeler ve Metin İşleme” Bölümü.
Program rasgelelik görevini yerine getirdiği için oluşturulan şifreler program her çalıştırıldığında farklılık gösterir. Herhangi bir çıktı aşağıda verilmiştir:

8p#Rv*yTl{tN4



Yüklə 3,36 Mb.

Dostları ilə paylaş:
1   ...   23   24   25   26   27   28   29   30   31




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin