C# ile İlk Uygulamalar ve Değişkenler
C# ilk program-konsol uygulaması C# açıkdıktan sonra File-New-Project
C# ilk program Açılan pencererede ilk olarak konsol uygulamasını seçiyoruz
C# ilk program Karşımıza çıkacak olan ekran :
C# ilk program Kodu yazdıktan sonra yeşil üçgene veya F5 tuşuna programı çalıştırmak için basalım
Kod bu araya yazılacak
C# ilk program
İstediğimiz yazı konsol ekranında görülmüştür. Enter tuşuna basarsak program sonlanır…
C# ilk program Programı tekrar nasıl çalıştıracağız? Projeyi nasıl açacağız? Proje nereye kaydedildi?
C# ilk program detaylı inceleme Console.WriteLine("Merhaba, Bu benim ilk programim");
Sınıf (Class)
Metod (Method)
Parametre (Parameter)
Console.ReadLine();
Sınıf
Metod
Parametre Kabul Etmiyor
C# ilk program detaylı inceleme C# dilinde herşey bi sınıftır. Her sınıfın iş yapan çeşitli elemanları vardır. İş yapan elemanlara metot yada işlev denilir. C# dili .NET platformu üzerinde yazılım geliştirmek için kullanılan bir araçtır. .NET sınıf kütüphanesinden faydalanma imkanımız vardır. Zaten .NET’i ve C# ı güçlü kılan özelliklerinden biri .NET platformunda binlerce hiyerarşik olarak düzenlenmiş ulaşımı kolay sınıflar bulunur. Bunlardan biri de console sınıfıdır.
Namespace (isim alanı) İsim alanı (namespace)
C# ilk program detaylı inceleme Namespace (isim alanı) .NET Framework dediğimiz altyapının bize veya diğer programlama dillerini kullanan programcılara sunduğu bir takım temel türler ve sınıflar mevcuttur. Bütün bu sınıfları ve türleri iyi organize edebilmek için .NET, namespace kavramını sıklıkla kullanmaktadır. Demekki .NET teki sınıf kütüphaneleri bir dilden bağımsız bir yapıdadır. Namespace ler .NET Framework sınıf kütüphanesindeki veri türlerini ve sınıfları kullanabilmemiz için C# dilinde using anahtar sözcüğü ile birlikte kullanılır ve derleyiciye bildirilir. Diğer dillerde ise bu isimalanları farklı şekilde derleyiciye bildirilir, ama temelde yapılan iş .NET Framework sınıf kütüphanelerini kullanma hakkı almaktır. Şimdi Programımızda using ile başlayan satırları silelim ve programı çalıştıralım
C# ilk program detaylı inceleme Namespace (isim alanı)
Aşağıdaki gibi bir hatayla karşılaşırsınız
C# ilk program detaylı inceleme Namespace (isim alanı) İsim alanlarını baştan belirtmek yerine alternatif olarak kodunuzu isim alanlarını belirterek de yazabilirisiniz.
System.Console.WriteLine("Merhaba, Bu benim ilk programim"); System.Console.ReadLine() ; Sınıfların bu şekilde belirtilmesi pek tercih edilmeyen bir yöntemdir. Çünkü içiçe bir çok isimalanının tanımlandığı durumlarda kaynak kodumuz gereksiz yere isimalanlarını yazmakla uzamaktadır. Bu hem okunabilirliği bozmakta hemde programcıya zaman kaybettirmektedir.
C# ilk program detaylı inceleme Çift Tırnak İşareti Console.WriteLine("Merhaba, Bu benim ilk programim"); Tırnak işaretlerini kaldırırsak ne olur? Console.WriteLine(Merhaba, Bu benim ilk programim);
C# ilk program detaylı inceleme Çift Tırnak İşareti " Programlama dillerinde karakter kelimesi, bir harf, sayı, noktalama işareti ya da bir sembol anlamına gelir. String kelimesi ise karakterlerin yan yana gelerek oluşturdukları dizi anlamına gelir. Stringlerden oluşan bir değişken c#’da çift tırnak işareti ile belirtilir. Ödev1 : Ekran çıktısı olarak ‘’Merhaba Bu benim ilk programım’’ veren konsol uygulamasını yazınız. Ekranda tırnak işaretleri görünecektir.
C# ilk program detaylı inceleme Noktalı virgül ; Herhangi bir C# deyiminin sonuna noktalı virgül eklemeyi unutmak programımızın hata vermesine neden olur.
Boş satır Programın daha kolay okunabilmesini ve anlaşılabilmesini sağlar.
Boş satırlar derleyici tarafından dikkate alınmazlar.
C# ilk program detaylı inceleme Aşağıdaki kod satırları hata verir mi? Console.WriteLine("Merhaba, Bu benim ilk programim")
//çalışmaz ; yok
Console. WriteLine("Merhaba, Bu benim ilk programim");
Console.WriteLine("Merhaba, Bu benim ilk programim");
// çalışır
Çalışmaz Bir string tek satır olmak zorundadır
C# ilk program detaylı inceleme
Bütün C# konsol uygulamaları çalışmaya Main fonksiyonunu işleterek başlar. Main fonksiyonu olmayan bir C# uygulaması düşünülemez. Main kelimesinin ilk harfi olan M daima büyük harfle yazılmalıdır. (C#’ın casesensitive olduğunu unutmayınız.) Main kelimesinden sonra kullanılan normal parantezler bir fonksiyonun (metodun varlığına işaret eder. Metodlar belirli işler yaparlar ve genelde geriye değer döndürürler. void anahtar kelimesi Main fonksiyonunun geriye hiçbir değer döndürmediğini belirtir.
örnek
Ekran çıktısı resimdeki gibi olan kodu sadece writeline metodunu kullanarak gerçekleştiriniz.
Örnek-Kod Console.WriteLine("--------------------------------"); Console.WriteLine(" "); Console.WriteLine("------ATATURK UNİVERSİTESİ------"); Console.WriteLine(" "); Console.WriteLine("--ENDUSTRİ MÜHENDİSLİGİ BÖLÜMÜ--"); Console.WriteLine(" "); Console.WriteLine("---------ERZURUM 2012-----------"); Console.WriteLine(" "); Console.WriteLine("--------------------------------"); Console.ReadLine();
C# ilk program görsel uygulama File-new-project
C# ilk program görsel uygulama Form1’e bir button ve bir textbox sürükleyip bırakıyoruz
C# ilk program görsel uygulama Button1’e çift tıkladığımızda: butonun click olayına erişiriz. Yani butona tıkladığımızda programın ne yapmasını istiyorsak buraya yazıyoruz.
C# ilk program görsel uygulama Biz programımızda butona tıklandığında textbox içine bir yazı yazılmasını istiyoruz. Yazılan kod ve program çalıştığında oluşacak görüntü aşağıdadır. private void button1_Click(object sender, EventArgs e) { textBox1.Text = "Merhaba Bu benim ilk Programım"; }
Örnek:2-1 Uygulamayı biraz daha görselleştirmek istersek. Proje ismi ornek_2_1 olan bir c# projesi için İstenenler From üzerinde 3 buton 1 textbox Buton1 üzerindeki yazı : textbox’a yaz Buton2 üzerindeki yazı : sil Buton3 üzerindeki yazı : kapat Textbox arka plan rengi kırmızı
Textbox üzerindeki yazının rengi sarı Buton1’e basıldığında textbox üzerinde istediğimiz mesajı yazacaz Buton2’ye basıldığında textbox üzerindeki yazı silinecek ve Buton3’e basılınca program kapanacaktır.
Örnek:2-1 İstenenlere göre adım adım gidelim. Öncelikle ismi Ornek_2_1 olan yeni bir proje oluşturuyoruz.
Örnek:2-1 Form üzerine araç kutusundan 3 adet button ve 1 adet textbox sürükleyip bırakıyoruz.
Not :
Eğer tasarım aşamasında buton isimlerini değiştirmek istersek, properties penceresini kullanarak butonun text özellğini değiştirebiliriz. Ancak biz program çalıştıkdan sonra yani form yüklenirken buton isimlerinin değişmesini istiyoruz. Form üzerinde boş olan herhangi bir yere çift tıklayalım.
Örnek:2-1 Karşımıza çıkan ekranda form yüklendiğinde oluşmasını istediğimiz durumları yazıyoruz
button1.AutoSize = true; (butonun büyüklüğünün üzerinde yazan yazıya göre otomatik olarak değişmesini sağlar) button1.Text = "textbox'a yaz"; (butonun text özelliğini değiştirir.
Örnek:2-1 Deneme amaçlı programımızı çalıştırırsak :
ÖNCE
SONRA
Şimdi button1’e çift tıklayalım ve textbox özelliklerini istenen duruma getirelim;
Örnek:2-1 Buton1’in tıklama olayına yazmamız gereken kodlar private void button1_Click(object sender, EventArgs e) { textBox1.Text = "Merhaba, Bu benim ilk programım!!"; textBox1.ForeColor = Color.Yellow; textBox1.BackColor = Color.Red; }
Bu haldeyken üzerinde sil yazn butona ve programı kapat yazan butona hiçbir kod yazılmadığı için bu butonlara basıldığında hiçbir olay gerçekleşmez
Örnek:2-1 Şimdi buton2 ve buton3’için gereken kodları yazalım. private void button2_Click(object sender, EventArgs e) { textBox1.Text = ""; } private void button3_Click(object sender, EventArgs e) { this.Close(); } Buton2’deki kod yazıyı siler, buton3 deki this.Close() ise formu kapatır. Eğer buton2’nin textbox’ın kırmızı olan arka plan rengini beyaz yapması istenseydi hangi kod satırı yazılırdı?
Değişkenler 33,6
“Demirci”
True
• Değişken
3.11.2009 12:40
• İstediğimiz değerleri bilgisayarın hafızasında tutmak için kullandığımız hafıza alanlarıdır. » x=33,6; » Soyad=“Demirci”; » ConnectionString=“RecordDataBase.mdb”; » Result=True/False; » SpecialDay=3.11.2009; • Bir ifade içinde ya da parametre olarak kullanılabilirler » MessageBox.Show(“Merhaba Sayın ” + Soyad); » If(x<50){IncreaseSize()}; » CalculateMyAge(SpecialDay,Now); » Lenght=Form1.Width; » txtUsersurname.Text = Soyad;
31
Veri Tipleri
C# type
Common language runtime type structure
Değişkenler Uzunluk (Byte)
Value range – 128 and 127
sbyte
System.SByte
1
Integer between
byte
System.Byte
1
Integer between 0 and 255
short
System.Int16
2
Integer between
ushort
System.UInt16
2
Integer between 0 and 65535
int
System.Int32
4
Integer between – 2147483648 and 2147483647
uint
System.UInt32
4
Integer between 0 and 4294967295
long
System.Int64
8
Integer between – 9223372036854775808 and +9223372036854775807
ulong
System.UInt64
8
Integer between 0 and 18446744073709551615
decimal
System.Decimal
12
1.0x10- 28 - 7.9 x1028
float
System.Single
4
1.5x10-45
double
System.Double
8
5.0 x 10- 324 - 1.7 x 10308
char
System.Char
2
Tek karakter, Integer olarak tutulur (between 0 and 65535 (‘a’, ‘?’, ‘7’,’-’)
string
System.String
-
Karakterler dizisi (karakter sınır yoktur) “halil”, “123”
bool
System.Boolean
1
true ve false
-
– 32768 and 32767
3.4x1038
32
Değişkenler • En sık kullanılan tipler •
int x; – x = 0, 1, 10000, -4323, 100, 2147483647 olabilir Ondalıklı sayıların ayracı olarak nokta (1.2) ya da virgül (1,2) kullanmak, makineden makineye değişir, C#’a özgü değildir. Türkçede nokta kullanılır, biz de nokta kullanacağız, ancak ekrana çıktılarda virgül görebilirsiniz!
•
double y; – y = 0,0, 1.5, 3.14, 0.0000005, -23232.0 olabilir
•
string z; – z = “”, “mehmet”, “3.sınıf”, “3.14”, “23 ocak 2003”, olabilir
•
bool t; – t = true ya da false olabilir, “false” olmaz, tırnaksız!
33
Değişkenler • Değişkenler Nasıl Kullanılır? – Önce tanımlamak gerekir (Adını ve tipini belirtme) { int myInteger; string myString; Sonra değer atanmak zorundadır, daha sonra bu değerini kullanabilirsiniz myInteger = 17; myString = “Benim yaşım =”; Messagebox.Show(myString + myInteger); } – İlk değeri atanmayan değişken okunamaz! Hata Olur string myString; Messagebox.Show(myString); X HATA
34
Değişkenler
• İsimlendirme Kuralları
– İlk karakter bir harf,alt çizgi karakteri ya da “@” karakteri olmalıdır A-Z, a-z, _, @ – Daha sonraki karakterler harf ,rakam ya da alt çizgi karakteri olabilir A- Z, a-z, 0-9, _ ClassSize, Screen1024, File_Extension, _RootPath, @DriveLetter – İki farklı isimlendirme geleneği vardır: • deveNotasyonu (camelCase): firstStudent, classCourseHour (İlk kelime küçük başlar, diğer kelimeler büyük başlar) • PascalNotasyonu (PascalCase): FirstStudent, ClassCourseHour (Tüm kelimeler büyük başlar) – Fonksiyon ve metotları fiil kullanarak isimlendirin CloseDialog(), StartRecord(), PlayMusic()
35
Değişkenler • Değişken Tanımlama Örnekleri – Aynı Satırda Birden fazla değişken tanımlanabilir • int age, birthYear, numberOfStudents; • double faizOranı = 0.89; • float faizOranı = 0.89, indirimOranı; • char myChar = ‘A’; • string myBloodType=“A”; • int numberOfStudents=100; • bool IsUserNameCorrect = false; • bool IsMusicFileFound = true;
36
Değişkenler • Değişken Geçerliliği – Değişkenler tanımlandıkları bloklarda geçerlidir! private void btnHesapla_Click(object sender, EventArgs e) { int age=0; // lokaldir MessageBox.Show(“Yaşınız=" + age); //Çalışır MessageBox.Show(“Kilonuz=" + agirlik); //Çalışır Blok } kapandı! int agirlik=0; // globaldir private void btnGoster_Click(object sender, EventArgs e) { MessageBox.Show("age=" + age); // Hata Verir MessageBox.Show(“Kilonuz=" + agirlik); //Çalışır } Lokal Değişkenler: Bir blok (fonksiyon, metot, döngü) içinde tanımlanan değişkenlere lokal (yerel) değişkenler denir. Global Değişkenler: Herhangi bir fonksiyon yada döngü içinde değil de, en dış blokta tanımlanan değişkenlerdir. Diğer tüm fonksiyonların içinde geçerlidirler.
37
•
Değişkenler Değişken Geçerliliği – Değişkenler tanımlandıkları blokların alt bloklarında da geçerlidir private void btnHesapla_Click(object sender, EventArgs e) { int age=0; MessageBox.Show("age=" + age); //Çalışır if(age>35) { MessageBox.Show(age); //Çalışır } Alt blok } private void btnGoster_Click(object sender, EventArgs e) { MessageBox.Show("age=" + age); // Hala hata Verir }
38
Değişkenler
• Değişken Geçerliliği – Değişkenler tanımlandıkları blokların alt bloklarında da geçerlidir, üst bloklarda geçersizdir. private void btnHesapla_Click(object sender, EventArgs e) { int age=0; MessageBox.Show("age=" + age); //Çalışır if(age>35) { MessageBox.Show(age); //Çalışır int bornYear = 2012 – age; MessageBox.Show(bornYear); //Çalışır } MessageBox.Show(bornYear); // Hata Verir } private void btnGoster_Click(object sender, EventArgs e) { MessageBox.Show("age=" + age); // Hala hata Verir }
39
Değişkenler
• Veri Tipi Dönüşümleri (Casting) – Bir veri tipinden başka bir veri tipine dönüşüm yapmaktır • İstemsiz (implicit) dönüşüm: Hiçbir dönüşüm operatörü kullanmadan yapılır. Veri kaybının olmadığı durumlarda yapılır int x = 10; int x = 10; double y = 50.45; double y = 50.45; x = y; // HATA İstemsiz y = x; // y 10.0 olur dönüşüm
• İstemli (explicit dönüşüm): Dönüşüm tipine göre bir operatör kullanılarak yapılır. Veri kaybı olsa bile sorunsuz yapılır
int x = 10; double y = 50.45; x = Convert.ToInt32(y); //x=50 olur Dönüşüm fonksiyonu
Diğer dönüşüm fonksiyonları …=Convert.ToInt32(2.34); …=Convert.ToDouble(100); …=Convert.ToString(13.14); …=Convert.ToByte(23.09); 40
Değişkenler
41
Değişkenler • Özetle: • int, double, string, bool değişken tipleridir • x,y,z intAge, strFullName, dbDolar değişken isimleridir • Convert.ToInt32(), Convert.ToDouble(), x.ToString() dönüşüm fonksiyonları/operatörleridir – intSayi = (int)dblBaskaSayi; // double int (sadece sayısal tipler arası geçerli!) – float fDegisken1=(float)Ldegisken2; // Long float (sadece sayısal tipler arası!)
• Değişkenler tanımlandıkları bloklarda ve bu bloğun alt bloklarında geçerlidirler. – Lokal ve Global değişkenler
42
SORULAR
Değişkenler
Soru: Bir dosyanın adını tutmak için lokal bir değişken tanımlayınız.
Soru: İlk değeri 1000 olan ve tamsayı tutmak için lokal bir değişken tanımlayınız.
Soru: Pi sayısını tutan global bir değişken tanımlayınız
Soru: İlk değeri false olan bir değişken tanımlayınız.
Soru: Bir tamsayı ile bir ondalıklı sayının toplamını bulan program için lokal değişkenler tanımlayınız.
43
Aritmetik Operatörler, Math Sınıfı ve Program Akış Komutları
Aritmetik Operatörler • • • • •
Çarpma için * Bölme için / Kalanı bulmak için % Toplama ve çıkarma için +, Tamsayı bölme işlemi sonucu yuvarlar. 7 / 5 sonuç olarak 1 verir.
• 7 % 5 sonuç olarak 2 verir.
2
Konsol Uygulaması Ornek Kullanıcıdan klavye yoluyla alacağı 2 sayının ortalamasını bularak ekrana yansıtacak bir C# konsol uygulaması yazınız.
Konsol Uygulaması Ornek Öncelikle ortalama işlemi için ne tip değişken tanımlanır onu düşünün?
Konsol Uygulaması Ornek • • • • • •
Console.WriteLine("lütfen bir sayı giriniz"); double a = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("lütfen bir sayı daha giriniz"); double b = Convert.ToDouble(Console.ReadLine()); double c = (a + b)/2; Console.WriteLine("girilen iki sayının ortalaması = " +c); Console.ReadLine();
Hesap Makinesi -Uygulama 4 işlemin (+, - , / , *) gerçekleştirildiği bir hesap makinesi uygulaması yapalım. Form üzerine 3 adet label, 3 textbox ve 5 buton ekleyelim
Hesap Makinesi -Uygulama Buton ve label üzerindeki yazıları şekildeki gibi değiştirelim.
Hesap Makinesi -Uygulama //TOPLAMA ISLEMI private void button1_Click(object sender, EventArgs e) { double sayi1 = Convert.ToDouble(textBox1.Text); double sayi2 = Convert.ToDouble(textBox2.Text); double toplam = sayi1 + sayi2; textBox3.Text = toplam.ToString() ; } // CİKARMA ISLEMI private void button2_Click(object sender, EventArgs e) { double sayi1 = Convert.ToDouble(textBox1.Text); double sayi2 = Convert.ToDouble(textBox2.Text); double fark = sayi1 - sayi2; textBox3.Text = fark.ToString(); }
Hesap Makinesi -Uygulama // CARPMA ISLEMI private void button3_Click(object sender, EventArgs e) { double sayi1 = Convert.ToDouble(textBox1.Text); double sayi2 = Convert.ToDouble(textBox2.Text); double carp = sayi1 * sayi2; textBox3.Text = carp.ToString(); } //BOLME ISLEMI private void button4_Click(object sender, EventArgs e) { double sayi1 = Convert.ToDouble(textBox1.Text); double sayi2 = Convert.ToDouble(textBox2.Text); double bol = sayi1 / sayi2; textBox3.Text = bol.ToString(); }
Hesap Makinesi -Uygulama //TEMIZLEME ISLEMI private void button5_Click(object sender, EventArgs e) { textBox1.Text = ""; textBox2.Text = ""; textBox3.Text = ""; }
C# da MATH sınıfı C# da Math Sınıfını ve metotlarını kullanarak bazı matematiksel işlemleri kısayoldan yapabilirsiniz. System.Math şeklinde çağrılır.
Abs(x) Bir sayının mutlak değerini tutar. Cos(x) Bir sayının kosinüsünü tutar. Sin(x) Bir sayının sinüsünü tutar. Tan(x) Bir sayının tanjantını tutar. Ceiling(x) x sayısından büyük en küçük tam sayıyı tutar (yukarı yuvarlama). Floor(x) x sayısından küçük en büyük tam sayıyı tutar (aşağı yuvarlama). Max(x,y) x ve y sayılarının en büyüğünü tutar. Min(x,y) x ve y sayılarının en küçüğünü tutar. Pow(x,y) x üzeri y’yi tutar. Sqrt(x) x’in karekökünü tutar. Log(x) x sayısının e tabanında logaritmasını tutar. Exp(x) e üzeri x’in değerini tutar. Log10(x) x sayısının 10 tabanındaki logaritmasını tutar.
C# da Math sınıfı uygulaması Yeni bir proje başlatılım ve formumuzun üzerine 1 button ve bir listbox ekleyelim
C# da Math sınıfı uygulaması Butonun click olayına aşağıdaki kodları yazalım ve ne olacağını yorumlayalım private void button1_Click(object sender, EventArgs e) { listBox1.Items.Add(Math.PI); listBox1.Items.Add(Math.Abs(-10.2)); listBox1.Items.Add(Math.Cos(30* (Math.PI/180) )); listBox1.Items.Add(Math.Sin(30 * (Math.PI / 180))); listBox1.Items.Add(Math.Max(-12,-0.0025)); listBox1.Items.Add(Math.Round(3.2)); listBox1.Items.Add(Math.Round(3.7)); listBox1.Items.Add(Math.Ceiling(3.2)); listBox1.Items.Add(Math.Ceiling (-3.2)); listBox1.Items.Add(Math.Floor(3.2)); listBox1.Items.Add(Math.Floor (-3.2)); }
Atama ifadesi • A = B ne demek? • A = B icra edildiği anda
A -18.567 122.45
• A ile B’yi yer değiştirmek istersek? • C=A • A=B • B = C icra edilir
B -18.567
A B C
-18.567 122.45 -18.567 122.45 ? 122.45
Not: = ile diğer operatörler birleştirilebilir: a=a+b a=a/b
yerine yerine
a += b a /= b
C#.NET Program Akış Komutları • • • • • •
Blok if… switch... for… while... do-while…
Akış komutları, programın istenilen satırlarının birden fazla defa çalıştırılması, belli bir koşula göre çalıştırılmasını ya da hiç çalıştırılmamasını sağlayan komutlardır.
Blok • • •
{ ve } arasındaki alana blok denir. Blok içindeki değişkenlere “yerel değişken” denir. Yerel değişkenlere sadece tanımlandıkları blok içinden erişilebilir. Bloğun çalıştırılması bitince değişken de yok olur. private void btnHelloWorld_Click(object sender, EventArgs e) { int x, y, z; x = 4; y = 3; z = (int)Math.Sqrt(x * x + y * y); { int i = 12; MessageBox.Show("blok içinden,z=" + z.ToString()); MessageBox.Show("blok içinden i=" + i.ToString()); } MessageBox.Show("blok dışı, z=" + z.ToString()); MessageBox.Show("blok dışı, i=" + i.ToString()); ! Hata }
if… komutu •
Bir koşula göre programın akışını değiştirir.
int ilksayi, ikincisayi; ilksayi = 10; ikincisayi = 7; if (ilksayi > ikincisayi) { MessageBox.Show("ilk sayı büyüktür"); } else { MessageBox.Show("ilk sayı büyük DEĞİLDİR"); }
Karşılaştırma Operatörleri: >, <, >=, <= BÜYÜK/KÜÇÜK MÜ? == EŞİT Mİ? != FARKLI MI?
Mantıksal Operatörler: && VE || VEYA ! DEĞİLDİR
if… komutu •
if() içine sonucu doğru (true) ya da yanlış (false) olabilecek bir deyim gelmelidir.
int ilksayi, ikincisayi; ilksayi = 10; ikincisayi = 7; bool sonuc = false; sonuc = (ilksayi > ikincisayi); if (sonuc) { MessageBox.Show("ilk sayı büyüktür"); } else { MessageBox.Show("ilk sayı büyük DEĞİLDİR"); }
if… komutu •
Örnek
int ilksayi, ikincisayi; ilksayi = Convert.ToInt32(txtSayi1.Text); // mesela 4 ikincisayi = Convert.ToInt32(txtSayi2.Text); // mesela 3 if (ilksayi > ikincisayi && (ilksayi % 2) == 0) { MessageBox.Show(“İlk sayıyı hem büyüktür hem de çifttir"); } else { MessageBox.Show("ilk sayı ya büyük değil ya da çift değil!"); }
if… komutu •
İç içe “else if” blokları yazılabilir int ilksayi, ikincisayi; ilksayi = 7; ikincisayi = 7; if (ilksayi>ikincisayi) { MessageBox.Show("ilk sayı büyüktür"); } else if( ilksayi==ikincisayi) // iki tane “=“ sembolü kullanılır { MessageBox.Show("ilk sayı ikinci sayıya EŞİTTİR"); } else if (ilksayi < ikincisayi) { MessageBox.Show("ilk sayı ikinci sayıdan KÜÇÜK"); } else { MessageBox.Show("ilk ve ikinci sayıları karşılaştıramadım"); }
if… komutu Dışarıdan Girilen 0-100 arasındaki nota göre geçip kalmayı belirleyiniz. 60 üzeri geçer.
if… komutu private void button1_Click(object sender, EventArgs e) { int sonuc = Convert.ToInt32(textBox1.Text); if ((sonuc > 100) || (sonuc < 0) ) { MessageBox.Show("Yanlış Not Girdiniz"); } else if (sonuc > 60) { MessageBox.Show("Geçtiniz"); } else { MessageBox.Show("KALDINIZ!!!"); } }
switch… komutu •
Belirli değerler karşılaştırma yapar. int ayNo; string ayAdi; ayNo=3; //Mart •Switch’den sonra normal parantezler () olmalı switch(ayNo) •Hemen altta select bloğu oluşturulmalı { } { •Bu bloğun içine case’ler yazılmalı case 1: •case’lerin yanına değerler yazılmalı ve ‘:’ olmalı ayAdi="Ocak"; •Bir sonraki case’den önce ‘break;’ yazılmalı break; •default kısmı isteğe bağlıdır, olmayabilir. case 2: ayAdi="Şubat"; break; case 3: ayAdi="Mart"; break; //..... default: // default kısmı kullanılmayabilir ayAdi="belirsiz"; break; }
switch… komutu • Switch ve string değişken örneği string ayAdi; ayAdi = txtAyAdı.Text; // mesela Nisan switch(ayAdi) { case “Ocak”: MessageBox.Show(“Sizin burcunuz balık”); break; case “Mart”: MessageBox.Show(“Sizin burcunuz kova”); break; case “Temmuz”: MessageBox.Show(“Sizin burcunuz aslan”); break; //..... default: MessageBox.Show(“Sizin burcunuz yok”); break; }
switch… komutu • Switch ve string değişken örneği – daha iyi string ayAdi, burcAdi; örnek ! ayAdi = txtAyAdı.Text; // mesela Nisan switch(ayAdi) { case “Ocak”: burcAdi = “balık”; break; case “Mart”: burcAdi = “kova”; break; case “Temmuz”: burcAdi = “aslan”; break; //..... default: burcAdi = “yok”); break; } MessageBox.Show(“Sizin burcunuz ” & burcAdi);
for… döngüsü •
Belirli bir kod bloğunu, önceden bilinen sayıda tekrar çalıştırmaya yarar
for (sayaç_değeri; döngü_koşulu; sayaç_değişimi) { deyimler; … }
int toplam,counter = 0; toplam = 0; for (counter = 1; counter <= 6; counter++) { toplam = toplam + counter; } MessageBox.Show(toplam.ToString());
* counter++ deyimi, counter=counter+1 demektir
for… döngüsü Aşağıdaki basit programların ne yaptığını açıklayın!!
int x = 0; for (int a = 1; a <= 10; a++) { x = x + 1; } this.Text = x.ToString();
int x = 0, a, b; for (a = 1; a <= 10; a++) { for (b = 1; b <= 5; b++) { x = x + 1; } } this.Text = x.ToString();
for… döngüsü Aşağıdaki basit programların ne yaptığını açıklayın!! int x = 0; int y = 0, a, b; for (a = 1; a <= 10; a++) { for (b = 1; b <= 5; b++) { x = x + 1; y = y + x + a + b; } } this.Text = x.ToString() + " " + y.ToString();
for… döngüsü
y=x^2 fonksiyonunun 1 ile 5 arasındaki integralini for döngüsü kullanarak hesaplayınız.
clc;clear; artis_mik=0.01; toplam=0; for i=1:artis_mik:4.99 toplam=toplam+((i^2)+(i+artis_mik)^2)*artis _mik/2; end toplam
for… döngüsü
y=x^2 fonksiyonunun 1 ile 5 arasındaki integralini for döngüsü kullanarak hesaplayınız.
double sonuc = 0; double i = 0; for (i = 1; i <= 4.99; i += 0.01) { sonuc = sonuc + ((Math.Pow(i, 2) + Math.Pow((i + 0.01), 2)) * 0.01) / 2; } this.Text = sonuc.ToString();
for… döngüsü • break ve continue komutları • •
break, for döngüsünden döngü bitmeden çıkmaya yarar (çıkar) continue, for döngüsünün içinde komutları çalıştırmadan sayacı bir artırır (atlar)
int carpim, counter; carpim = 1; for (counter = 1; counter <= 12; counter++) { carpim = carpim * counter; if (carpim > 100000) { carpim = 100000; break; } } MessageBox.Show(carpim.ToString()); }
for… döngüsü Form üzerine 1 buton ve 1 textbox ekleyelim. Aşağıdaki 2 kod arasındaki fark nedir. private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; for (int i = 0; i < 10; i++) { textBox1.Text += i.ToString()+" "; } }
private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; for (int i = 0; i < 10; i++) { textBox1.Text += i.ToString()+" "; if (i == 7) { textBox1.Text += " yedi bulundu"; break; } } }
for… döngüsü • continue
int carpim, counter; carpim = 1; for (counter = 0; counter <= 12; counter++) { carpim = carpim * counter; if ((counter % 2) ==0) // counter çift sayı ise { continue; // atla } else // değilse, { carpim = carpim * counter; // çarpmaya devam } } MessageBox.Show(carpim.ToString());
while… döngüsü •
Bir ifade true değerini verdiği sürece istenilen deyimleri tekrar eder.
while (true_yada_false_olabilecek_ifade) { …. tekrarlanmasını istediğiniz deyimler; .… } { int counter = 0; int toplam=0; while (counter < 10) { toplam += counter; counter++; } MessageBox.Show(toplam.ToString()); }
toplam += counter; deyimi toplam = toplam + counter; demektir
* counter’ı bir artırmazsanız (counter++), program sonsuz döngüye girer ve çakılır!
while… döngüsü Hangi sayıya kadar olan tam sayıların toplamı 100’ü ilk gecer.
int toplam = 0; int i = 1; while (toplam < 100) { toplam += i; i++; } i=i-1; MessageBox.Show(i.ToString ()+ "'e kadar olan sayıların toplamı 100'ü geçti " );
while… döngüsü (Ödev4) Collatz Problemi Önce bir pozitif tamsayı seçin. Bu sayıya yapılacak işlem: Sayı tekse 3 katını alıp 1 ekleyin. Sayı çiftse 2'ye bölün. Aynı işleme çıkan sayıya uygulayın. En sonunda elde edeceğiniz sayı1'dir. Örneğin 8 sayısını ele alalım: 8-(2'ye böl)-4-(2'ye böl)-2-(2'ye böl)-1 5-(3 katını al 1 ekle)-16-8-4-2-1 Kullanıcıdan alınan sayının kaç adımda 1’e ulaştığını gösteren bir c# kodu yazınız. Programın arayüzü aşağıdaki gibi olacaktır.
while… döngüsü (Ödev4)
do-while… döngüsü •
Bir bloğun çalışması, sondaki ifade true değerini verdiği sürece tekrar eder.
do { tekrarlanmasını istediğiniz deyimler; } while (true_false_olabilecek_ifade);
{ int counter = 0; int toplam=0; do { toplam += counter; counter++; } while (counter<20); MessageBox.Show(toplam.ToString());
}
* counter’ı bir artırmazsanız (counter++), program sonsuz döngüye girer ve çakılır!
do-while… döngüsü İki kod arasındaki fark nedir?
int a = 5; do { a++; this.Text = a.ToString(); } while (a != 5); MessageBox.Show("bitti");
int a = 5; while(a!=5) { a++; this.Text = a.ToString(); } MessageBox.Show("BİTTİ");
Sonsuz döngü neden?
While döngüsüne girmez neden?
C#.NET Program Akış Komutları
Atama ifadesi
A = B ne demek? A = B icra edildiği anda A ile B’yi yer değiștirmek istersek? C =A A=B B = C icra edilir
A -18.567 122.45 B -18.567
A B C
-18.567 122.45 -18.567 122.45 ? 122.45
Not:
= ile diğer operatörler birleştirilebilir: a=a+b a=a/b b
yerine yerine
a += b a /=
C#.NET Program Akış Komutları
Blok if… switch... for… while... do-while…
Akış komutları, programın istenilen satırlarının birden fazla defa çalıştırılması, belli bir koşula göre çalıştırılmasını ya da hiç çalıştırılmamasını sağlayan komutlardır.
Blok
{ ve } arasındaki alana blok denir.
Blok içindeki değişkenlere “yerel değişken” denir.
Yerel değişkenlere sadece tanımlandıkları blok içinden erişilebilir. Bloğun çalıştırılması bitince değişken de yok olur. private void btnHelloWorld_Click(object sender, EventArgs e) { int x, y, z; x = 4; y = 3; z = (int)Math.Sqrt(x * x + y * y); { int i = 12; MessageBox.Show("blok içinden,z=" + z.ToString()); MessageBox.Show("blok içinden i=" + i.ToString()); } MessageBox.Show("blok dışı, z=" + z.ToString()); MessageBox.Show("blok dışı, i=" + i.ToString()); ! Hata }
if… komutu
Bir koşula göre programın akışını değiştirir.
int ilksayi, ikincisayi; ilksayi = 10; ikincisayi = 7; if (ilksayi > ikincisayi) { MessageBox.Show("ilk sayı büyüktür"); } else { MessageBox.Show("ilk sayı büyük DEĞİLDİR"); }
Karşılaştırma Operatörleri: >, <, >=, <= BÜYÜK/KÜÇÜK MÜ? == EŞİT Mİ? != FARKLI MI?
Mantıksal Operatörler: && VE || VEYA ! DEĞİLDİR
if… komutu
if() içine sonucu doğru (true) ya da yanlış (false) olabilecek bir deyim gelmelidir.
int ilksayi, ikincisayi; ilksayi = 10; ikincisayi = 7; bool sonuc = false; sonuc = (ilksayi > ikincisayi); if (sonuc) { MessageBox.Show("ilk sayı büyüktür"); } else { MessageBox.Show("ilk sayı büyük DEĞİLDİR"); }
if… komutu
Örnek
int ilksayi, ikincisayi; ilksayi = Convert.ToInt32(txtSayi1.Text); // mesela 4 ikincisayi = Convert.ToInt32(txtSayi2.Text); // mesela 3 if (ilksayi > ikincisayi && (ilksayi % 2) == 0) { MessageBox.Show(“İlk sayıyı hem büyüktür hem de çifttir"); } else { MessageBox.Show("ilk sayı ya büyük değil ya da çift değil!"); }
if… komutu
İç içe “else if” blokları yazılabilir int ilksayi, ikincisayi; ilksayi = 7; ikincisayi = 7; if (ilksayi>ikincisayi) { MessageBox.Show("ilk sayı büyüktür"); } else if( ilksayi==ikincisayi) // iki tane “=“ sembolü kullanılır { MessageBox.Show("ilk sayı ikinci sayıya EŞİTTİR"); } else if (ilksayi < ikincisayi) { MessageBox.Show("ilk sayı ikinci sayıdan KÜÇÜK"); } else { MessageBox.Show("ilk ve ikinci sayıları karşılaştıramadım"); }
if… komutu Dışarıdan Girilen 0-100 arasındaki nota göre geçip kalmayı belirleyiniz. 60 üzeri geçer.
if… komutu private void button1_Click(object sender, EventArgs e) { int sonuc = Convert.ToInt32(textBox1.Text); if ((sonuc > 100) || (sonuc < 0) ) { MessageBox.Show("Yanlış Not Girdiniz"); } else if (sonuc > 60) { MessageBox.Show("Geçtiniz"); } else { MessageBox.Show("KALDINIZ!!!"); } }
switch… komutu
Belirli değerler karşılaştırma yapar. int ayNo; string ayAdi; ayNo=3; //Mart •Switch’den sonra normal parantezler () olmalı switch(ayNo) •Hemen altta select bloğu oluşturulmalı { } { •Bu bloğun içine case’ler yazılmalı case 1: •case’lerin yanına değerler yazılmalı ve ‘:’ olmalı ayAdi="Ocak"; •Bir sonraki case’den önce ‘break;’ yazılmalı break; •default kısmı isteğe bağlıdır, olmayabilir. case 2: ayAdi="Şubat"; break; case 3: ayAdi="Mart"; break; //..... default: // default kısmı kullanılmayabilir ayAdi="belirsiz"; break; }
switch… komutu
Switch ve string değişken örneği string ayAdi; ayAdi = txtAyAdı.Text; // mesela Nisan switch(ayAdi) { case “Ocak”: MessageBox.Show(“Sizin burcunuz balık”); break; case “Mart”: MessageBox.Show(“Sizin burcunuz kova”); break; case “Temmuz”: MessageBox.Show(“Sizin burcunuz aslan”); break; //..... default: MessageBox.Show(“Sizin burcunuz yok”); break; }
switch… komutu
Switch ve string değişken örneği – daha iyi örnek ! string ayAdi, burcAdi; ayAdi = txtAyAdı.Text; // mesela Nisan switch(ayAdi) { case “Ocak”: burcAdi = “balık”; break; case “Mart”: burcAdi = “kova”; break; case “Temmuz”: burcAdi = “aslan”; break; //..... default: burcAdi = “yok”); break; } MessageBox.Show(“Sizin burcunuz ” & burcAdi);
for… döngüsü Belirli bir kod bloğunu, önceden bilinen sayıda tekrar çalıştırmaya yarar
for (sayaç_değeri; döngü_koşulu; sayaç_değişimi) { deyimler; … }
int toplam,counter = 0; toplam = 0; for (counter = 1; counter <= 6; counter++) { toplam = toplam + counter; } MessageBox.Show(toplam.ToString());
* counter++ deyimi, counter=counter+1 demektir
for… döngüsü Aşağıdaki basit programların ne yaptığını açıklayın!!
int x = 0; for (int a = 1; a <= 10; a++) { x = x + 1; } this.Text = x.ToString();
int x = 0, a, b; for (a = 1; a <= 10; a++) { for (b = 1; b <= 5; b++) { x = x + 1; } } this.Text = x.ToString();
for… döngüsü Aşağıdaki basit programların ne yaptığını açıklayın!! int x = 0; int y = 0, a, b; for (a = 1; a <= 10; a++) { for (b = 1; b <= 5; b++) { x = x + 1; y = y + x + a + b; } } this.Text = x.ToString() + " " + y.ToString();
for… döngüsü (örnek) Formun Üzerine 1 textbox 3 label ve 1 combobox yerleştirin. Kullanıcı textbox’dan bir tamsayi alacak combobox’dan yaptıracağı işlemi seçecek ve sonucu Label da yazdırcaktır. Yapılacak olan işlemler, sayının faktoriyeli, sayıya kadar olan sayıların kareleri toplamı ve sayıya kadar olan sayıların toplamı şeklinde olacaktır.
int sayi = Convert.ToInt32(textBox1.Text); if (comboBox1.SelectedIndex == 0) { sayi = Math.Abs(sayi); int sonuc = 1; if (sayi != 0) { for (int i = 2; i <= sayi; i++) { sonuc *= i; } } label1.Text = sonuc.ToString(); } else if (comboBox1.SelectedIndex == 1) { int kareToplam = 0; sayi = Math.Abs(sayi); for (int i = 1; i <= sayi; i++) { kareToplam += i * i; } label1.Text = kareToplam.ToString(); } else if (comboBox1.SelectedIndex == 2) { int Toplam = 0; sayi = Math.Abs(sayi); for (int i = 1; i <= sayi; i++) { Toplam += i; } label1.Text = Toplam.ToString(); } else if (comboBox1.SelectedIndex == -1) { MessageBox.Show("lütfen seçim yapıniz"); }
Butonun click olayına yazılacak kod
for… döngüsü y=x^2 fonksiyonunun 1 ile 5 arasındaki integralini for döngüsü kullanarak hesaplayınız.
clc;clear; artis_mik=0.01; toplam=0; for i=1:artis_mik:4.99 toplam=toplam+((i^2)+(i+artis_mik)^2)*artis _mik/2; end toplam
for… döngüsü y=x^2 fonksiyonunun 1 ile 5 arasındaki integralini for döngüsü kullanarak hesaplayınız.
double sonuc = 0; double i = 0; for (i = 1; i <= 4.99; i += 0.01) { sonuc = sonuc + ((Math.Pow(i, 2) + Math.Pow((i + 0.01), 2)) * 0.01) / 2; } this.Text = sonuc.ToString();
for… döngüsü
break ve continue komutları
break, for döngüsünden döngü bitmeden çıkmaya yarar (çıkar)
continue, for döngüsünün içinde komutları çalıştırmadan sayacı bir artırır (atlar)
int carpim, counter; carpim = 1; for (counter = 1; counter <= 12; counter++) { carpim = carpim * counter; if (carpim > 100000) { carpim = 100000; break; } } MessageBox.Show(carpim.ToString()); }
for… döngüsü Form üzerine 1 buton ve 1 textbox ekleyelim. Aşağıdaki 2 kod arasındaki fark nedir. private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; for (int i = 0; i < 10; i++) { textBox1.Text += i.ToString()+" "; } }
private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; for (int i = 0; i < 10; i++) { textBox1.Text += i.ToString()+" "; if (i == 7) { textBox1.Text += " yedi bulundu"; break; } } }
for… döngüsü
continue
int carpim, counter; carpim = 1; for (counter = 0; counter <= 12; counter++) { carpim = carpim * counter; if ((counter % 2) ==0) // counter çift sayı ise { continue; // atla } else // değilse, { carpim = carpim * counter; // çarpmaya devam } } MessageBox.Show(carpim.ToString());
while… döngüsü
Bir ifade true değerini verdiği sürece istenilen deyimleri tekrar eder.
while (true_yada_false_olabilecek_ifade) { …. tekrarlanmasını istediğiniz deyimler; .… } { int counter = 0; int toplam=0; while (counter < 10) { toplam += counter; counter++; } MessageBox.Show(toplam.ToString()); }
toplam += counter; deyimi toplam = toplam + counter; demektir
* counter’ı bir artırmazsanız (counter++), program sonsuz döngüye girer ve çakılır!
while… döngüsü Hangi sayıya kadar olan tam sayıların toplamı 100’ü ilk gecer.
int toplam = 0; int i = 1; while (toplam < 100) { toplam += i; i++; } i=i-1; MessageBox.Show(i.ToString ()+ "'e kadar olan sayıların toplamı 100'ü geçti " );
while… döngüsü (Ödev4) Collatz Problemi Önce bir pozitif tamsayı seçin. Bu sayıya yapılacak işlem: Sayı tekse 3 katını alıp 1 ekleyin. Sayı çiftse 2'ye bölün. Aynı işleme çıkan sayıya uygulayın. En sonunda elde edeceğiniz sayı1'dir. Örneğin 8 sayısını ele alalım: 8-(2'ye böl)-4-(2'ye böl)-2-(2'ye böl)-1 5-(3 katını al 1 ekle)-16-8-4-2-1 Kullanıcıdan alınan sayının kaç adımda 1’e ulaştığını gösteren bir c# kodu yazınız. Programın arayüzü aşağıdaki gibi olacaktır.
while… döngüsü (Ödev4)
do-while… döngüsü Bir bloğun çalışması, sondaki ifade true değerini verdiği sürece tekrar eder.
do { tekrarlanmasını istediğiniz deyimler; } while (true_false_olabilecek_ifade); { int counter = 0; int toplam=0; do { toplam += counter; counter++; } while (counter<20); MessageBox.Show(toplam.ToString()); }
* counter’ı bir artırmazsanız (counter++), program sonsuz döngüye girer ve çakılır!
do-while… döngüsü İki kod arasındaki fark nedir? int a = 5; do { a++; this.Text = a.ToString(); } while (a != 5); MessageBox.Show("bitti");
int a = 5; while(a!=5) { a++; this.Text = a.ToString(); } MessageBox.Show("BİTTİ");
Sonsuz döngü neden?
While döngüsüne girmez neden?
Array (Diziler) 4. Hafta
Array
Aynı tipten çok sayıda değişken topluluğudur.
Birden fazla aynı tipteki değerle işlem yapmayı kolaylaştırır.
X
Y
Score1
Score2
56
40
Grade 40 56
80
(0) (1) (2) ...
(13)
Array tanımlama:
1. Array adını ve tipini belirtme 2.Array değişkenlerini nesne olarak yaratılması 3. Her bir değişkene, indeks numarası ile değer atama
Array Yaratma
1. Tip ve adını belirtme: ogrenciNo
int[] ogrenciNo;
2. Değişkenlerini nesne olarak yaratılması ogrenciNo
ogrenciNo = new int[5]; // Tüm array’ler 0 tabanlıdır.
0 0 0 0 0
ogrenciNo[0] ogrenciNo[1] ogrenciNo[2] ogrenciNo[3] ogrenciNo[4]
3. İndeks numaraları ile değer atama ve kullanma ogrenciNo[0] ogrenciNo[1] ogrenciNo[2] ogrenciNo[3] ogrenciNo[4]
= = = = =
45; 23; 157; 544; 651;
ogrenciNo
45 23 157 544 651
ogrenciNo[0] ogrenciNo[1] ogrenciNo[2] ogrenciNo[3] ogrenciNo[4]
Array Kullanma
Kullanma int[] ogrenciNo; ogrenciNo = new int[5]; ogrenciNo[0] = 45; ogrenciNo[1] = 23; ogrenciNo[2] = 157; ogrenciNo[3] = 544; ogrenciNo[4] = 651; MessageBox.Show(ogrenciNo[2]); int BaskaDegisken=0; BaskaDegisken = ogrenciNo[2] * 2; // BaskaDegisken (157 x 2) 314 olur
Aşamalar birleştirilebilir: int[] ogrenciNo; ogrenciNo = new int[5];
int[] ogrenciNo = new int[5];
int[] ogrenciNo = new int[5] {45,23,157,544,651};
Array Örnekleri
Her türlü değişken tipi için array tanımlanabilir int[] ogrenciNo = new int[5] {45,23,157,544,651}; short[] siraNo; double[] aylikUcretler = new double[50]; string[] ad=new string[3] {"halil","mehmet","mustafa"}; string[] ad1 = new string[] { "halil", "mehmet", "mustafa" }; lbSonuc.Text = ""; lbSonuc.Text = lbSonuc.Text + " " + ogrenciNo[0]; lbSonuc.Text = lbSonuc.Text + " " + ogrenciNo[1]; lbSonuc.Text = lbSonuc.Text + " " + ogrenciNo[2]; lbSonuc.Text = lbSonuc.Text + " " + ogrenciNo[3]; lbSonuc.Text = lbSonuc.Text + " " + ogrenciNo[4]; for (int counter = 0; counter <= 4; counter++) { lbSonuc.Text = lbSonuc.Text + " " + ogrenciNo[counter].ToString(); }
Array Uzunluğu
Uzunluk (Length),array’deki değişken sayısıdır int[] ogrenciNo = new int[5] {45,23,157,544,651}; //array’in uzunluğu 5’dir // 0..4 double[] rakamlar = new double[40]; // uzunluk 40’dır. // 0..39
Döngüde Length kullanmak for (int counter = 0; counter < ogrenciNo.Length; counter++) { lbSonuc.Text = lbSonuc.Text + ogrenciNo[counter].ToString(); }
Array için özel Döngü: foreach()
foreach(), array’in her bir elemanı için döngü bloğunu tekrarlar. for (int counter = 0; counter < ogrenciNo.Length; counter++) { lbSonuc.Text = lbSonuc.Text + ogrenciNo[counter].ToString(); }
yerine, foreach (int deger in ogrenciNo) { lbSonuc.Text +=deger.toString(); }
kullanabilirsiniz.
Array’lerde Boyut
Tek boyutlu (One-Dimension) Tek Boyutlu int[] Nokta = new int[10]; Nokta[0] = 10; Nokta[9] = 100;
10
0
0
0
0
0
0
0
0
100
Çok boyutlu (Multi-Dimension) 2 Boyutlu int[,] Nokta = new int[3, 10]; Nokta[0, 0] = 10; Nokta[1, 0] = 5; Nokta[2, 0] = 5; Nokta[0, 9] = 100; Nokta[1, 9] = 35; Nokta[2, 9] = 89; 10
5 5
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0 0 0 0
0 0 0
100 35 89
3 Boyutlu int[,,] Nokta = new int[10, 2,5]; Nokta[0,0,0] = 10; Nokta[0,0,1] = 5; Nokta[0,0,2] = 6; Nokta[0,0,3] = 80; Nokta[0,0,4] = 5000; Nokta[0,1,0] Nokta[0,1,1] Nokta[0,1,2] Nokta[0,1,3] Nokta[0,1,4]
= = = = =
20; 23; 30; 50; 75;
Çok Boyutlu Array Uzunluğu
GetLength() ve Döngü içinde kullanma
bool Negatifmi = false; for (int boyut0=0; boyut0 < Nokta.GetLength(0); boyut0++) { if (Nokta[boyut0, 0] < 0) { Negatifmi = true; } if (Nokta[boyut0, 1] < 0) { Negatifmi = true; for (int boyut0=0; boyut0 < Nokta.GetLength(0); boyut0++) } { if (Nokta[boyut0, 2] < 0) for (int boyut1=0; boyut1 < Nokta.GetLength(1); boyut1++) { Negatifmi ={ true; if (Nokta[boyut0, boyut1] < 0) } { } Negatifmi = true; } } }
Uygulama 10 elamanlı { 15, 24, 57, 89, 41, 25, 24, 12, 90, 85 } dizisinin elemanlarının en büyüğünü, en küçüğünü, ortalamasını ve standart sapmasını bulan programı kodlayınız. Standart sapmanın formülü
Uygulama double[] dizi = { 15, 24, 57, 89, 41, 25, 24, 12, 90, 85 }; double enb = -90000000, enk = 90000000, ort, toplam = 0, stdsapma = 0; for (int i = 0; i < dizi.Length; i++) { if (dizi[i] > enb) enb = dizi[i]; //en büyük elemanı bulmak için if (dizi[i] < enk) enk = dizi[i]; // en kücük elemanı bulmak icin toplam += dizi[i]; //elemanların toplamı için } ort = toplam / dizi.Length; for (int i = 0; i < dizi.Length; i++) stdsapma += Math.Pow((dizi[i] - ort), 2); stdsapma = Math.Sqrt((stdsapma / dizi.Length)); MessageBox.Show("enbüyük eleman = " + enb.ToString() + "\nenkücük eleman " + enk.ToString() + "\nortalama =" + ort.ToString() + "\nstandartsapma = " + stdsapma.ToString());
Uygulama (Fibonacci) Textbox’dan girilen değere göre Fibonacci serisindeki sayıyı veren programı kodlayınız.
Uygulama (Fibonacci) int boyut = Convert.ToInt32(textBox1.Text); if (boyut > 2) { int[] fibon = new int[boyut]; fibon[0] = 0; fibon[1] = 1; for (int i = 2; i < fibon.Length; i++) { fibon[i] = fibon[i - 1] + fibon[i - 2]; } MessageBox.Show("Serideki " + boyut.ToString() + " eleman = " + fibon[boyut - 1].ToString()); } else { MessageBox.Show("UYARI!! 2'den Büyük bir tamsayı giriniz!!"); }
Uygulama (Matris Çarpımı) Form üzerine 1 buton ve 1 listbox ekleyin. Butona Basıldığında Sonuç Matrisi ListBox’da görülecektir.
Örnek 1 2 1 A 0 3 1
1 2 B 1 5 2 3
5 15 C A B 1 12
Uygulama (Matris Çarpımı) int[,] A = new int[2, 3] {{1,2,1},{0,3,-1}}; int[,] B = new int[3, 2] {{1,2},{1,5},{2,3}}; int[,] C = new int[A.GetLength(0), B.GetLength(1)]; string satir = ""; for (int i = 0; i < A.GetLength(0); i++) { for (int j = 0; j < B.GetLength(1); j++) { for (int k = 0; k < A.GetLength(1); k++) { C[i, j] += A[i, k] * B[k, j]; } satir += C[i, j].ToString()+" "; if (j == B.GetLength(1) - 1) { listBox1.Items.Add(satir); satir = ""; } } }
C#’da Array Sınıfı ve İşlemler
Array Üzerinde İşlemler •
ArrayAdı.Rank – Kaç Boyut var?
•
ArrayAdı.GetLength(0) – 0’ıncı boyutta kaç eleman var? string[] ad = new string[] { "hasan", "ayşe", "duygu", "mert", "salih" }; MessageBox.Show(ad.GetLength(0).ToString()); MessageBox.Show(ad.Rank.ToString()); string[,] fullname = new string[5, 2]; fullname[0, 0] = "hasan"; fullname[0, 1] = "tahsin"; fullname[1, 0] = "ayşe"; fullname[1, 1] = "parman"; fullname[2, 0] = "duygu"; fullname[2, 1] = "dikmen"; fullname[3, 0] = "mert"; fullname[3, 1] = "karlıkuş"; fullname[4, 0] = "salih"; fullname[4, 1] = "mender"; int BoyutSayisi = fullname.Rank; MessageBox.Show(BoyutSayisi.ToString());
ad.GetLength(1) ?
Array Üzerinde İşlemler
Arr1.Rank(); Arr1.GetLength(0); System.Array.Clear(Arr1, 0, 5); System.Array.Sort(Arr1); System.Array.Reverse(Arr1); System.Array.Resize(Arr1, 7); System.Array.Copy(Arr1,0, Arr2, 0, 5); System.Array.IndexOf(Arr1, “Ankara”);
System.Array.Clear(Arr1, X, U); • • •
Array’deki elemanları tiplerine göre temizler X, kaçıncı elemandan itibaren temizleneceğini söyler U, kaç elemanın temizleneceğini (uzunluk) söyler •
Sayısal tipler – 0
•
Referans tipleri (string vb) – null
•
Boolean tipi – false
string[,] fullname = new string[5, 2]; fullname[0, fullname[0, 0] = "hasan"; fullname[0, fullname[0, 1] = "tahsin"; fullname[1, fullname[1, 0] = "ayşe"; fullname[1, fullname[1, 1] = "parman"; fullname[2, fullname[2, 0] = "duygu"; fullname[2, fullname[2, 1] = "dikmen"; fullname[3, fullname[3, 0] = "mert"; fullname[3, fullname[3, 1] = "karlıkuş"; fullname[4, fullname[4, 0] = "salih"; fullname[4, fullname[4, 1] = "mender"; System.Array.Clear(fullname, 0, fullname.Length);
0] 1] 0] 1] 0] 1] 0] 1] 0] 1]
null null null null null null null null null null
System.Array.Sort(Arr1);
Arr1 adında, tek boyutlu array’lerde, elemanları sıralar
Sayısal array – Küçükten büyüğe (0…9 Metin Array – Alfabetik olarak (A…Z)
… string[] ad = new string[] { "hasan", "ayşe", "duygu", "mert", "salih" }; System.Array.Sort(ad); …
ad[0] – “ayșe” ad[1] – “duygu” ad[2] – “hasan” ad[3] – “mert” ad[4] – “salih”
System.Array.Resize(Arr1, X);
Arr1, tek boyutlu array’dir, eleman sayısını değiştirmek için kullanılır. X, yeni uzunluk sayısıdır. … string[] ad = new string[] { "hasan", "ayşe", "duygu", "mert", "salih" }; System.Array.Rezise(ref ad, 10); ad[6]= “mahmut“; … *ref kelimesini kullanmak zorunludur. ad[0] – “ayșe” ad[1] – “duygu” ad[2] – “hasan” ad[3] – “mert” ad[4] – “salih” ad[5] – null ad[6] – “mahmut” ad[7] – null ad[8] – null ad[9] – null
System.Array.Reverse(Arr1);
Arr1 adındaki tek boyutlu array’in elemanlarını ters sırada yerleştirir. … string[] ad = new string[] { "hasan", "ayşe", "duygu", "mert", "salih" }; System.Array.Reverse(ad); …
ad[0] – “ayșe” ad[1] – “duygu” ad[2] – “hasan” ad[3] – “mert” ad[4] – “salih”
ad[0] – “salih” ad[1] – “mert” ad[2] – “hasan” ad[3] – “duygu” ad[4] – “ayșe”
System.Array.IndexOf(Arr1, BirDeger);
Arr1 gibi tek boyutlu array içinde, verilen değeri arar. BirDeger, sayı ya da metin olabilir. Bulursa, elemanın indeksini verir. Bulamazsa -1 değerini verir. string[] ad = new string[] { "hasan", "ayşe", "duygu", "mert", "salih" }; MessageBox.Show(System.Array.IndexOf(ad, "duygu").ToString()); MessageBox.Show(System.Array.IndexOf(ad, "Duygu").ToString()); MessageBox.Show(System.Array.IndexOf(ad, "feridun").ToString());
“duygu”
“Duygu”
“feridun”
System.Array.Copy(Arr1, X1, Arr2, X2, L);
Arr1, var olan array’dir, tek boyutlu olmak zorundadır.
Arr2, yeni array’dir, tek boyutlu olmak zorundadır.
X1, kopyalamanın Arr1’deki hangi elemandan başlayacağını söyler.
X2, kopyalamanın Arr2’deki hangi elemandan başlayacağını söyler.
L, kaç elemanın kopyalanacağını söyler
Arr2, gelen elemanları tutmaya yetecek uzunlukta olmalıdır.
string[] ad = new string[] { "hasan", "ayşe", "duygu", "mert", "salih" }; string[] ad2 = new string[7]; System.Array.Copy(ad,0,ad2,0,5);
0’ıncı elemandan itibaren tüm 5 elemanı ad2 array’ine kopyalar ad[0] – “ayșe” ad[1] – “duygu” ad[2] – “hasan” ad[3] – “mert” ad[4] – “salih”
ad2[0] - “ayșe” ad2[1] - “duygu” ad2[2] - “hasan” ad2[3] - “mert” ad2[4] - “salih” ad2[5] - null ad2[6] - null
ArrayList Klasik dizilerle çalışırken karşılaşabileceğimiz temel sorunları şu şekilde sıralamak mümkündür: Dizilerin sınırları sabittir. Dizilerin tüm elemanları aynı türden olmalıdır. Kullanmadığımız dizi elemanlarından dolayı bellek alanları gereksiz yere işgal edilmektedir.
Bu sorunların üzerinden gelebilşmek için Csharpda ArrayList sınıfı tanımlanmıştır. ArrayList’i listbox’in görünmeyeni olarak düşünebilirsiniz. ArrayList sınırları dinamik olarak değişebilen diziler olarak tanımlanır. Bu veri yapısı .NET sınıf kütüphanesinin System.Collections isim alanında bulunur.
ArrayList (Örnek) Form üzerine iki buton ve bir textbox ve bir listbox ekleyelim. Birinci buton textboxa girdiğimiz herhangi bir şeyi bir Arrayliste ekleyecek. İkinci buton listedekileri listboxda gösterecektir. Resimde görüldüğü üzere ArrayList deki elemanlar aynı tipte olmak zorunda değildir. En çok kullanılan özellikleri Add ve Remove dur.
ArrayList’i kullanabilmek için using System.Collections; eklenmelidir.
ArrayList liste = new ArrayList(); private void button1_Click(object sender, EventArgs e) { if (textBox1.Text != "") { liste.Add(textBox1.Text); textBox1.Text = ""; } } private void button2_Click(object sender, EventArgs e) { foreach (object item in liste) { listBox1.Items.Add(item); } }
RASTGELE SAYI ÜRETİM FONKSİYONLARI C#’da rasgele sayı üretme işini Random class’ı gerçekleştirmektedir. Yapı son derece basittir. İstenilen aralıkta değer üretilebilir. Random sınıfının üç fonksiyonu vardır. Bunlar Next, NextDouble, NextBytes Random sınıfını kullanmak için ilk olarak nesnesini türetmelisiniz Random rassal = new Random(); Next Fonksiyonu: Üç farklı kullanımı vardır. Birincisinde parametre almadan bir sayı üretir. Bunun üst ve alt sınırı yoktur. Diğer kullanımında ise integer tipinde parametre alır, sıfır ile girilen parametre arasında bir sayı üretir. Son kullanımında ise iki parametre alır. Bunlar da alt ve üst sınırlardır. Next fonksiyonun ürettiği sayı, integer tipindedir, yani tam sayı üretir.
RASTGELE SAYI ÜRETİM FONKSİYONLARI Form üzerine 1 buton ve 3 textbox ekleyelim.
Random rassal = new Random(); textBox1.Text = rassal.Next().ToString(); //Rastgele bir sayı üretir textBox2.Text = rassal.Next(50).ToString(); //0 ile 50 arasında rastgele sayı textBox3.Text = rassal.Next(14, 25).ToString();//14 ile 25 arasında rastgele sayı
RASTGELE SAYI ÜRETİM FONKSİYONLARI NextDouble Fonksiyonu: Bu fonksiyonu da 0 ile 1 arasında double tipinde rastgele sayı üretmek için kullanılır Random rassal = new Random(); textBox1.Text = rassal.NextDouble().ToString(); //0 ile 1 arasında double tipinde rastgele bir sayı üretir
NextByte Fonksiyonu: Byte tipindeki bir dizinin içini doldurmak için kullanırız.
RASTGELE SAYI ÜRETİM FONKSİYONLARI Form üzerine ilave olarak 1 listbox ekleyelim.
listBox1.Items.Clear(); Random rassal = new Random(); textBox1.Text = rassal.Next().ToString(); textBox2.Text = rassal.Next(50).ToString(); textBox3.Text = rassal.Next(14, 25).ToString(); byte[] dizi = new byte[6]; rassal.NextBytes(dizi); foreach (byte eleman in dizi) { listBox1.Items.Add(eleman); }
UYGULAMA (Sayısal Loto Programı) Program 1 ile 49 arasında birbirinden farklı 6 adet rassal tam sayı üretecek ve bu sayıları listbox’da sıralayacaktır.
UYGULAMA (Sayısal Loto Programı) listBox1.Items.Clear(); int[] loto = new int[6]; Random rassal = new Random(); loto[0] = rassal.Next(1, 50); listBox1.Items.Add(loto[0]); for (int i = 1; i < loto.Length; i++) { loto[i] = rassal.Next(1, 50); for (int j = 0; j < i; j++) { if (loto[j] == loto[i]) { loto[i] = rassal.Next(1, 50); j = -1; } } listBox1.Items.Add(loto[i]); }
String ve Char Sınıfları
String Sınıfı
System.String kütüphanesinde tanımlıdır Değişken tipi değil, obje sınıfır. string str1= “”; string str1= “Atatürk Üniversitesi”; string str1= null;
Karakter array’i olarak işlenebilir. string str1 = "Atatürk Üniversitesi"; MessageBox.Show(str1.Length.ToString()); foreach (char ch1 in str1) { MessageBox.Show(ch1.ToString()); }
String Metotları
Uzunluk
str1.Lenght
Birleştirme (Concat Metodu ve + operatörü) Concat istenildiği kadar, istenilen türde parametre alır. Aldığı parametreleri birleştirip string olarak tutar.
string str1 = "bu ";
string str2 = "gün ";
string str3 = "hava ";
int a1 = 23;
int a2 = 45;
string str4 = " derece ";
string str5 = "olacak ";
string cumle = String.Concat(str1, str2, str3, a1, str4, str5);
MessageBox.Show(cumle);
String Metotları Bir önceki örnekteki değişkenler dikkate alındığında aşağıdaki kodlar ne döndürür. string cumle2 = str1+ str2+ str3+ a1+ str4 + str5; MessageBox.Show(cumle2);
string cumle2 = a1+ a2; MessageBox.Show(cumle2); string cumle2 = str4 + a1+ a2 ; MessageBox.Show(cumle2);
string cumle2 = a1+ a2 + str4 ; MessageBox.Show(cumle2);
Dönüşüm hatası int to string
String Metotları Karşılaştırma: static int Compare(string a, string b) a ve b kıyaslanır, a büyükse pozitif bir sayı, b büyükse negatif bir sayı, eşitlerse 0 döndürür. Büyüklük-küçüklük mantığı sözlükte önde/sonda gelme mantığının aynısıdır. Sonda gelen daha büyük sayılır. Türkçe alfabesine uygundur. static int Compare(string a, string b, bool c) Birinci metotla aynı işi yapar. Tek fark eğer c true ise kıyaslamada büyük/küçük harf ayrımı gözetilmez. Eğer c false ise birinci metottan farkı kalmaz. static int Compare(string a, int indeks1, string b, int indeks2) Birinci metotla aynı mantıkta çalışır. Tek fark kıyaslamada ilk elemanların a[indeks1] ve b[indeks2] sayılmasıdır. Yani stringlerdeki bu elemanlardan önceki elemanlar yok sayılır.
String Metotları Aşağıdaki kodlarda sira değişkeninin değeri ne olur? string str1 = "Galatasaray" , str2 = "Fenerbahçe"; int sira = String.Compare(str2, str1); MessageBox.Show(sira.ToString());
-1
string str1 = "Galatasaray" , str2 = "galatasaray"; int sira = String.Compare(str2, str1); MessageBox.Show(sira.ToString());
-1
string str1 = "Galatasaray" , str2 = "gAlatasaray"; int sira = String.Compare(str2, str1); MessageBox.Show(sira.ToString());
-1
string str1 = "Galatasaray" , str2 = "galatasaray"; int sira = String.Compare(str2, str1,true); MessageBox.Show(sira.ToString());
0
string str1 = "Galatasaray" , str2 = "galatasaraz"; int sira = String.Compare(str2, str1,true); MessageBox.Show(sira.ToString());
1
String Metotları string Insert(int indeks,string str) Yazının indeks. elemanından sonrasına str stringini yerleştirir ve tutar. string str1 = "AtatürkÜniversitesi"; str1 = str1.Insert(7, " "); MessageBox.Show (str1);
string Remove(int indeks,int adet) Yazıdan indeks nolu karakterden itibaren adet kadar karakteri yazıdan siler ve oluşan bu yeni stringi tutar. string str1 = "Atatürk---Üniversitesi"; str1 = str1.Remove(7,3); MessageBox.Show (str1);
String Metotları string ToUpper() Kendisini çağıran stringin harflerini büyük yapar ve tutar. string str1 = "Atatürk Üniversitesi"; str1 = str1.ToUpper() ; MessageBox.Show (str1);
string ToLower() Kendisini çağıran stringin harflerini küçük yapar ve tutar. string str1 = "Atatürk Üniversitesi"; str1 = str1.ToLower() ; MessageBox.Show (str1);
String Metotları string[] Split(params char[] ayirici) Bu metotta metodu çağıran string ayirici dizisindeki karakter(ler)e göre parçalara ayrılır ve sonuç bir string dizisinde tutulur. string str1 = "Olmak ya da olmamak, işte bütün mesele bu!"; string[ ] str2 = str1.Split(' '); foreach (string str3 in str2) { MessageBox.Show(str3); }
String Metotları
.Split()
string Cumle; Cumle = “Bu gün hava çok güzel oldu gibi"; string[] arrKelimeler; arrKelimeler = Cumle.Split(‘ ’); // ‘ ‘ (boşluk) karakterine göre elemanlarına ayırır. arrKelimeler[0] “Bu” arrKelimeler[1] “gün” arrKelimeler[2] “hava” arrKelimeler[3] “çok” arrKelimeler[4] “güzel” arrKelimeler[5] “oldu” arrKelimeler[6] “gibi” arrKelimeler = Cumle.Split(‘.’); // “.“ karakterine göre elemanlarına ayırır. arrKelimeler = Cumle.Split(‘,’); // “,“ karakterine göre elemanlarına ayırır. arrKelimeler = Cumle.Split(‘—’); // “--“ karakterlerine göre elemanlarına ayırır. string[] ayrac= new string[] {“.”, ”,”, ” “, ”..”, “mustafa”} arrKelimeler = Cumle.Split(ayrac, StringSplitOptions.None);
String Metotları static string Join(string ayirici, string[] yazilar) Join() metodu ise Split() metodunun tam tersi şekilde işler. Bu metot da yazilar dizisinin elemanlarının arasına ayirici eklenerek tek bir string hâline getirilir. string[ ] str1 = { "Olmak", "ya da", "olmamak", "işte", "bütün", "mesele", "bu!" }; string str2 = String.Join (" ",str1) ; MessageBox.Show(str2);
String Metotları int IndexOf(string a) int IndexOf(char b) Kendisini çağıran string içinde parametredeki veriyi arar. Bulursa bulunduğu indeksi tutar. Eğer aranan birden fazla karaktere sahipse ilk karakterin indeksini tutar. Eğer arananı bulamazsa -1 değeri döndürür. Eğer stringin içinde aranandan birden fazla varsa ilk bulunanın indeksini döndürür. string str1 ="Olmak ya da olmamak, işte bütün mesele bu!"; MessageBox.Show(str1.IndexOf("O").ToString()); MessageBox.Show(str1.IndexOf("o").ToString()); MessageBox.Show(str1.IndexOf('!').ToString()); MessageBox.Show(str1.IndexOf("Z").ToString()); MessageBox.Show(str1.IndexOf("a").ToString()); MessageBox.Show(str1.IndexOf(" ").ToString()); MessageBox.Show(str1.IndexOf("işte").ToString());
String Metotları int LastIndexOf(string a) int LastIndexOf(char b) IndexOf metoduyla aynı işi yapar. Tek fark arananın son bulunduğu yerin indeksini vermesidir. string str1 ="Olmak ya da olmamak, işte bütün mesele bu!"; MessageBox.Show(str1.LastIndexOf(" ").ToString()); MessageBox.Show(str1.LastIndexOf("Z").ToString()); MessageBox.Show(str1.LastIndexOf("a").ToString()); MessageBox.Show(str1.LastIndexOf("O").ToString());
String Metotları int IndexOfAny(char[] a) int LastIndexOfAny(char[] b) Birincisi a dizisinin herhangi bir elemanının ilk bulunduğu indeks ile geri döner. İkincisi ise b dizisinin herhangi bir elemanının son bulunduğu indeks ile geri döner. char dizisindeki elemanların hiçbiri bulunamazsa -1 ile geri dönülür. string str1 ="Olmak ya da olmamak, işte bütün mesele bu!"; char[] ch1 = { ',', '!', ' ' }; int indeks = str1.IndexOfAny(ch1); MessageBox.Show(indeks.ToString()); string str1 ="Olmak ya da olmamak, işte bütün mesele bu!"; char[] ch1 = { ',', '!', ' ' }; int indeks = str1.LastIndexOfAny(ch1); MessageBox.Show(indeks.ToString());
String Metotları string Trim() Metodu çağıran stringin başındaki ve sonudaki boşluklar silinir. string str1 = " Atatürk Üniversitesi listBox1.Items.Add(str1); str1 = str1.Trim(); listBox1.Items.Add(str1);
";
string TrimStart(), string TrimEnd() Birincisi Metodu çağıran stringin başındaki ikincisi ise sonudaki boşlukları siler.
String Metotları string Trim(params char[] dizi) Metodu çağıran stringin başındaki ve sonundaki dizi dizisinde bulunan karakterler silinir. string str1 = "Olmak ya da olmamak, işte bütün mesele bu!"; char[ ] ch1 = { ' ', '!', 'a' }; str1 = str1.Trim(ch1); MessageBox.Show(str1);
string str1 = "aebbbbbeeeeaaaaattyyyaaaabbaebaeb"; char[] ch1 = { 'e', 'b', 'a' }; str1 = str1.Trim(ch1); MessageBox.Show(str1););
String Metotları string Substring(int indeks) Metodu çağıran stringin indeks. elemanından sonraki yazıyı tutar. string str1 = "Olmak ya da olmamak, işte bütün mesele bu!"; str1 = str1.Substring(6); MessageBox.Show(str1);
string Substring(int indeks,int toplam) Metodu çağıran yazının indeks. elemanından sonraki toplam karakterlik yazıyı tutar. string str1 = "Olmak ya da olmamak, işte bütün mesele bu!"; str1 = str1.Substring(6, 13); MessageBox.Show(str1);
String Metotları string Replace(char c1,char c2) string Replace(string s1,string s2) Birincisinde yazıda geçen bütün c1 karakterlerini c2 olarak değiştirir ve tutar. İkincisinde ise yazıda geçen bütün s1 yazılarını s2 olarak değiştirir ve tutar UYGULAMA : Basit bir şifreleme programı yapalım. Bunun için form üzerine 1 textbox ve 2 buton yerleştirin. Not : Bu örnek için sadece 6 harf (A,B,C,D,E,F) değiştirilecektir.
UYGULAMA private void button1_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text.Replace('A', 'é'); textBox1.Text = textBox1.Text.Replace('B', 'i'); textBox1.Text = textBox1.Text.Replace('C', 'ğ'); textBox1.Text = textBox1.Text.Replace('D', 'Z'); textBox1.Text = textBox1.Text.Replace('E', 'æ'); textBox1.Text = textBox1.Text.Replace('F', 'Ö'); } private void button2_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text.Replace('é', 'A'); textBox1.Text = textBox1.Text.Replace('i', 'B'); textBox1.Text = textBox1.Text.Replace('ğ', 'C'); textBox1.Text = textBox1.Text.Replace('Z', 'D'); textBox1.Text = textBox1.Text.Replace('æ', 'E'); textBox1.Text = textBox1.Text.Replace('Ö', 'F'); }
Char Sınıf
char char char char
ch1 ch2 ch3 ch4
= = = =
‘1’; // tek tırnak kullanılır! ‘d’; ‘*’; ‘.’;
string metin = “c:\documents\lab ödevi1.doc”; char[] arrKarakterler = metin.ToCharArray();
Char Sınıfı Fonksiyonları
char ch1 = ‘3’;
Char.IsDigit(ch1) true Char.IsLower(ch1) false/true Char.IsUpper(ch1) false/true Char.IsNumber(ch1) true Char.IsLetter(ch1) false // harf Char.IsPunctuation(ch1) true // noktalama Char.IsWhiteSpace(ch1) false // tek boşluk
UYGULAMA Kullanıcının girmiş olduğu metindeki sayıları ayıklayarak toplamını veren programı kodlayınız. Form üzerine 1 buton ve 2 textbox ekleyebilirsiniz. 1. textbox kullanıcının giriş yapması için 2. textbox ise sonucun yazdırılması için kullanılacaktır.
UYGULAMA textBox2.Text = String.Empty; string str = textBox1.Text; int toplam = 0; for (int i = 0; i < str.Length; i++) { if (Char.IsNumber(str,i)) { textBox2.Text += str[i]+"+"; toplam += Convert.ToInt32(str[i].ToString()); } } if (toplam == 0) { textBox2.Text = "Girilen Metinde Hic Numerik Değer Yoktur"; } else { textBox2.Text = textBox2.Text.Remove(textBox2.Text.Length - 1); textBox2.Text += " = " + toplam.ToString(); }
PROCEDURLER ve FONKSİYONLAR Uygulama geliştirirken, bir işlemin birçok yerde kullanıldığı zamanlar olur. Bu gibi durumlarda bir kere yazılan kodlar, farklı yerlerde tekrar yazılır. Uygulama üzerinde bir değişiklik yapılmak istenirse, tekrar yazılan kodların tek tek bulunup değiştirilmesi gerekir. Böylece hem uygulamanın yazımı zorlaşır hem de değişiklik yapmak giderek imkânsız hale gelir. Bu problemler, birçok yerde yapılması istenen işlemlerin metotlar (fonksiyonlar ve procedure) içinde yazılması ile çözülür. Sadece metot isimleri kullanılarak, istenen yerlerde kodlar çalıştırılır.
Procedür Tanımlamak private void mesaj() { MessageBox.Show("ATATÜRK ÜNİVERSİTESİ"); } Yukarıda işlediği zaman kullanıcıya «ATATÜRK ÜNİVERSİTESi» mesajını verecek bir procedure tanımlanmıştır. • C#’da procedureler void ile tanımlanır. • Diğer formların veya sınıfların (class) kullanması istenirse Public le sadece bu formun kullanması istenirse Private ile tanımlanır. Eğer erişim için isim kullanmassanız Private olarak algılanır. • En son olarak ta procedure ismi verilir. Tanımlanan procedure butona tıklanıldığı zaman çalıştırılmak istenirse private void button1_Click(object sender, EventArgs e) { mesaj(); }
Parametre İçeren Procedür Tanımlamak Aşağıda yine mesaj isimli bir procedure tanımlanmış olup bu sefer içerisinde yazı isimli string tipte bir parametre tanımlanmıştır. Parametreler araya virgül konularak çoğaltılabilir. private void mesaj(string yazi) { MessageBox.Show(yazi); } private void button1_Click(object sender, EventArgs e) { mesaj("Atatürk Üniversitesi \nEndüstri Mühendisliği Bölümü"); }
FONKSİYONLAR • Belirli bir işi yapan kod gruplarıdır private int Topla(int x, int y) { int toplam; toplam = x + y; return toplam; }
• Aynı fonksiyon birden fazla çağırılabilir • Çok uzun kod yazmayı engeller, tasarımı kolaylaştırır
FONKSİYONLAR Genel bir fonksiyonun prototipi aşağıdaki gibidir.
[static] FonksiyonAdı(prametreler) { // Fonksiyon (metod) içerisindeki kodlar. }
: Bu anahtar kelime hazırlanan fonksiyonun kimler tarafından kullanılacağını belirlemektedir. Sık kullanılan iki çeşit erişim şekli vardır. Bunlar; public: Hazırlanan fonksiyon programın herhangibir yerinden çağrılabilir. private: Hazırlanan fonksiyon sadece hazırlandığı sınıf içerisinden çağırılabilir. private anahtar kelimesi kod güvenliği açısından önemlidir.
Fonksiyon Bileşenleri • Aşağıdaki örneğe göre;
Fonksiyonun tipi
Fonksiyon bloğu
Fonksiyon adı
Fonksiyon parametreleri
private int Topla(int x, int y) { int toplam; toplam = x + y; Fonksiyon parametrelerinin tipleri return toplam; }
Ana programa dönüş komutu
Fonksiyonun dönüş değeri
Fonksiyon Tanımlama 1. Adına karar verin: Topla(), Cikar(), NoktalamaSayisi(), vb. –
Değişken isimlendirme kurallarına uygun, işlevini anlatan
2. Tipine karar verin: int, double, string, void, vb –
Tüm olası değişken tipleri ya da void kelimesi (“hiç” anlamında)
3. Parametrelerine karar verin: Kaç tane ve her birinin tipleri: double Topla(int x, double y, string z) –
Hiç olmayabilir, bir yada birden fazla olabilir.
4. Fonksiyon bloğunu yazın. –
{……}
5. Tipine göre return komutuyla bir değer döndürün. – –
return 40; return “Hata mesajı”; return null; return x+y+z; Fonksiyon tipi void ise, return’e gerek yok !
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int[] arrSayilar = new int[10]; private void btnEkle_Click(object sender, EventArgs e) { int sayi1, sayi2, sonuc; sayi1 = Int32.Parse(txtSayi1.Text); sayi2 = Int32.Parse(txtSayi2.Text); sonuc = Topla(sayi1, sayi2); lbSonuc.Text = sonuc.ToString(); } private int Topla(int x, int y) { int toplam; toplam = x + y; return toplam; } } }
Fonksiyon Nerede Tanımlanır? • Form1: Form bloğunun içinde herhangi boş bir yere tanımlanır. • Başka herhangi bir fonksiyonun içine tanımlanamaz! • Button_Click() veya Form_Load() gibi bir metotun içine tanımlanamaz!
Fonksiyon Nasıl Çalışır • Önce tanımlanır: int Topla(int x, int y) { int toplam; toplam = x + y; return toplam; }
• Sonra istenilen yerde çağırılır – Tipi void değilse: sonuc = Topla(sayi1, sayi2); MessageBox.Show(Topla(sayi1, sayi2).ToString()); if(Topla(sayi1, sayi2)>50) {…}
– Tipi void ise: … Topla(sayi1, sayi2);
…
Metot Aşırı Yüklenmesi ve Çağrılış Sırası:
C#'ta parametre sayısı ve/veya parametrelerin türleri farklı olmak şartıyla aynı isimli birden fazla metot yaratılabilir. Buna metotların aşırı yüklenmesi denir. C#, bir metot çağrıldığında ve çağrılanla aynı isimli birden fazla metot bulunduğunda metodun çağrılış biçimine bakar. Yani ana programdaki metoda girilen parametrelerle metotları kıyaslar. Önce parametre sayısına bakar. Eğer aynı isimli ve aynı sayıda parametreli birden fazla metot varsa bu sefer parametre türlerinde tam uyumluluk arar, parametre türlerinin tam uyumlu olduğu bir metot bulamazsa istemsiz tür dönüşümünün mümkün olduğu bir metot arar, onu da bulamazsa programımız hata verir. Aşağıdaki örneği inceleyelim. İstemsiz tür dönüşümlerinde dikkat edilecek nokta ise tür dönüşümü mümkün olan birden fazla fonksiyon varsa en az kaynağa ihtiyaç olan fonksiyon çalıştırılacaktır.
Metot Aşırı Yüklenmesi ve Çağrılış Sırası (Örnek) public static int topla(int a, int b) { MessageBox.Show("1. fonksiyon çağrıldı"); return a + b; } public static double topla(double a, double b) { MessageBox.Show("2. fonksiyon çağrıldı"); return a + b; } public static decimal topla(decimal a, decimal b) { MessageBox.Show("3. fonksiyon çağrıldı"); return a + b; } private void button1_Click(object sender, EventArgs e) { int inta = 5; int intb = 10; double dbla = 1.1; double dblb = 2.2; MessageBox.Show(topla(inta,intb).ToString()); MessageBox.Show(topla(dbla,dblb).ToString()); MessageBox.Show(topla(inta, dblb).ToString()); }
Metot Aşırı Yüklenmesi ve Çağrılış Sırası (Örnek)
Yukarıdaki programda, ilk toplama işleminde her iki parametre de int tipinden olduğu için birinci metot, ikinci toplama işlemi ise her iki parametre de double tipinden olduğu için ikinci metot çağırılmıştır. Ancak üçüncü toplama işleminde parametrelerden birisi int diğeri double tipinde olduğu için ihtiyacı karşılayan ve en az kaynağa ihtiyaç duyan ikinci metot çağırılmıştır (decimal tipi hafızada 12 byte, double tipi ise 8 byte yer kaplamaktadır).
Metot Aşırı Yüklenmesi ve Çağrılış Sırası (Örnek2) private double ort_hesapla(double x, double y) { return (x + y) / 2; } private double ort_hesapla(double x, double y, double z) { return (x + y+z) / 3; } private void button1_Click(object sender, EventArgs e) { int a = 5; int b = 7; int c = 9; MessageBox.Show(ort_hesapla(a, b).ToString()); MessageBox.Show(ort_hesapla(a, b,c).ToString()); }
Yukarıdaki örnekte ort_hesapla isimli iki adet fonksiyon tanımlanmıştır. Bu fonksiyonlardan birincisi iki paremetreyle çalışmakta ve girilen iki sayının ortalamasını bulabilmektedir. İkincisi ise üç parametre ile çalışmakta ve girilen 3 sayının ortalamasını hesaplamaktadır.
Ref Deyimiyle Fonksiyon/Procedure içerisinde parametre tanımlamak. Bazı durumlarda procedure/fonksiyonda tanımlanmış olan parametranin procedure/fonksiyon çıkış değeriyle ilgilenebilirsiniz işte bu tip durumlarda procedure/fonksiyonların kullanacağı parametreleri ref bildirisiyle yapmalısınız. Örnek; private void deneme(ref int x, int y ) { x *= 5; y *= 5; } private void button1_Click(object sender, EventArgs e) { int a = 5; int b = 10; deneme(ref a,b); MessageBox.Show(a.ToString()+" "+b.ToString ()); }
Dizi Parametreli Procedure Tanımlamak. Bir çok durumda procedure’lerinizin kullanacağı parametreler dizi olmak zorunda kalacaktır. Örnek; private void yaz(string[] deger) { listBox1.Items.AddRange(deger); } private void button1_Click(object sender, EventArgs e) { string[] sehirler = { "ANKARA", "İSTANBUL", "ERZURUM", "BOLU" }; yaz(sehirler); }
Dizi Parametreli Fonksiyon Tanımlamak. Fonksiyon tanımlarken parametre olarak dizi tanımlarken ; private long hesapla(long[] dizi) { long toplam=0; foreach (long deger in dizi) { toplam += deger; } return toplam; } private void button1_Click(object sender, EventArgs e) { long[] sayilar = new long[8] { 10, 20, 30, 40, 50, 60, 70, 80 }; long sonuc = hesapla(sayilar); MessageBox.Show(sonuc.ToString()); }
Metod içinde params bildirisiyle dizi değişken tanımlamak. Bir önceki örnekte eğer dizi değişkeni kullanmadan değerlerin toplamını almak isterseniz bu işlemi params la yapmak zorundasınız. private long hesapla(params long[] dizi) { long toplam = 0; foreach (long deger in dizi) { toplam += deger; } return toplam; } private void button1_Click(object sender, EventArgs e) { long sonuc = hesapla(10,20,30,40,50); MessageBox.Show(sonuc.ToString()); }
Eğer hesapla isimli fonksiyonda params bildirisi kullanılmaz long sonuc = hesapla(10,20,30,40,50); satırında hatayla karşılaşırsınız. Amaç yeni bir dizi değişken tanımlama zorunluluğundan programcıyı kurtarmaktır.
ise
UYGULAMA (Sesli Harf Bulma) Kullanıcıdan alınan bir metin içerisindeki sesli harf sayısını bulan (döndüren) fonksiyonu yazınız. Form üzerine 1 buton ve 1 textbox ekleyiniz
private int sesli_bul(string cumle) { int toplam = 0; cumle = cumle.ToLower(); for (int i = 0; i < cumle.Length; i++) { switch (cumle[i]) { case 'a': toplam += 1; break; case 'e': toplam += 1; break; case 'ı': toplam += 1; break; case 'i': toplam += 1; break; case 'o': toplam += 1; break; case 'ö': toplam += 1; break; case 'u': toplam += 1; break; case 'ü': toplam += 1; break; } } return toplam; }
UYGULAMA (Sesli Harf Bulma)
private void button1_Click(object sender, EventArgs e) { string str = textBox1.Text; int sesli = sesli_bul(str); MessageBox.Show("Girilen metinde " + sesli.ToString() + " adet sesli harf vardır"); }
UYGULAMA (En Büyük Ortak Bölen) Kullanıcıdan alınan veya rassal olarak üretilen iki sayının en büyük ortak bölenini bulan (döndüren) fonksiyonu yazınız. Form üzerine 2 buton ve 2 textbox 3 label ekleyebilirsiniz.
UYGULAMA (En Büyük Ortak Bölen) private double obeb(double x, double y) Fonksiyonu çağıran buton { double temp = x % y; while (temp > 0) { Obeb fonksiyonu x = y; y = temp; private void button1_Click(object sender, EventArgs e) temp = x % y; { } double a = Convert.ToDouble(textBox1.Text); return y; double b = Convert.ToDouble(textBox2.Text); } double sonuc = obeb (a,b); label3.Text = "EBOB = " + sonuc; } private void button2_Click(object sender, EventArgs e) { label3.Text = "‐"; textBox1.Text = String.Empty; textBox2.Text = String.Empty; Random rassal = new Random(); int a = rassal.Next(500); textBox1.Text = a.ToString(); int b = rassal.Next(500); textBox2.Text = b.ToString(); }
Sayıları rastgele üreten buton
Sınıflar, Nesneler ve MDI Formlar
Nesne Tabanlı Tasarım
Nesne tabanlı programlama kavramı 1960’larda ortaya çıkmıştır. 1972’de ortaya çıkan Smalltalk, gerçek anlamda ilk nesne tabanlı programlama dilidir. Smalltalk, nesne tabanlı programlamayı tanımlamış ve kurallarını koymuş bir dildir. C++’ın 1980’lerde çıkışı nesne tabanlı programlamayı, standart bir uygulama haline getirmiştir. C++ dilinin takipçileri olan C# ve Java dilleri yine nesne tabanlı diller olarak adlarını duyurmuşlardır.
NESNEYE DAYALI TASARIM Kavramlar ve Tasarım Süreci
Çözülmesi istenenen problemi çeşitli parçalara ayırıp her bir parça arasındaki ilişkiyi gerçeğine uygun bir şekilde belirleme tekniğine nesne yönelimi denir. Bu parçalar arasındaki ilişkiyi kullanıp büyük çaplı programlar geliştirme tekniğine de nesne yönelimli programlama denir. Nesnelerin kaynak kodundaki karşılığı sınıflardır.
Nesneye Dayalı Tasarım Anahtar Kavramlar Gerçek nesnelerin yazılım içindeki modelleridir.
NESNELER
SINIFLAR Gerçek nesnelerin yazılım karşılıklarını ifade edebilmek için kullanılan şablonlardır.
NESNEYE DAYALI TASARIM
Nesneler
GERÇEK DÜNYA BİLGİSAYAR
Bir arabanın yazılım içinde çalışması için gerekli bütün parçalar: Motor, tekerlekler, silecekler, direksiyon simiti, vs, vs, vs.
Sınıflar
Sınıf, gerçek hayattaki bir nesneyi istenen bir şekilde modelleyebilmek için gerekli bütün kod ve veriyi içeren yazılım birimidir.
Modülaritenin yeni birimidir.
Sınıf, hem veriyi hem de yöntemi içinde barındırır.
Modelleme, yazılım üretiminin temelidir.
Nesne – Sınıf ?
Sınıf nesnenin tanımıdır. Soyut bir kavramdır. Nesne sınıfın bir örneğidir. Somut bir niceliktir. Örneğin; İnsan sınıfı bir tanımlar kümesiyken, her birimiz İnsan sınıfının birer nesnesiyiz.
Sınıflar • Bir sınıfın temel static void Main(string[] args) Nesne işlevi, nesnede { Araba a = new Araba(1999,"Honda"); kullanılan yöntemleri Sınıfın İsmi / Tip ve verileri if(a.vitesGetir() != 0) { a.vitesiDegistir(0); tanımlamaktır. } • Sınıf tanımı aslında a.calistir(); nesnenin soyut bir a.debriyajaBas(0); karşılığıdır. a.vitesDegistir(1); ..... • Nesneye dayalı ..... } programlamada, soyutlama tasarım sürecinin temelidir.
Sınıflar
C# sınıfı yeni bir TİP tanımlar. Nesne, sınıfın hafızada oluşturulmuş bir örneğidir. Sınıfın arayüzü ve uygulama bölümleri vardır. Arayüz dışarıdan nasıl gözüktüğü, uygulama bölümü sınıfın ne yaptığıdır. Sınıflarda arayüz iyi tanımlanmalıdır. Sınıflar, “private” anahtar kelimesiyle veriyi dışarıdan saklar. “public” anahtar kelimesi arayüzü belirler.
public class Nokta { // saklı bölüm // dışarıdan görülmez private double x; private double y; // arayüz: dışarıdan // görülen bölüm
}
// orijinden uzaklığı bulan yöntem public double orijindenUzaklik() { return Math.Pow(x*x+y*y,0.5); }
SINIFLAR: Erişim Denetimi Sınıfın İsmi
Sınıf İçerisindeki Değişkenler
public class Nokta { // saklı bölüm // dışarıdan görülmez private double x; private double y; // arayüz: dışarıdan // görülen bölüm
Sınıf İçerisindeki Fonksiyonlar }
// orijinden uzaklığı bulan yöntem public double orijindenUzaklik() { return Math.Pow(x*x+y*y,0.5); }
SINIFLAR: Erişim Denetimi private: bütün içsel veri ve yöntemlerin bulunduğu yerdir.
public class Nokta { // saklı bölüm // dışarıdan görülmez private double x; private double y; // arayüz: dışarıdan // görülen bölüm
public: arayüz olarak kullanılan yöntemleri ve verileri içerir. }
// orijinden uzaklığı bulan yöntem public double orijindenUzaklik() { return Math.Pow(x*x+y*y,0.5); }
SINIFLAR: Erişim Denetimi Sınıf içindeki üye değişkenlere ve yöntemlere erişimin denetlenmesi üç farklı C# anahtar kelimesiyle sağlanır.
private: sınıf dışından görünmeyen değişkenlerin ve yöntemlerin tutulduğu bölümü işaretler public: sınıf dışından görünen ve erişilebilen değişkenlerin ve yöntemlerin bulunduğu bölümü tanımlamak için kullanılır protected: Türetilmiş sınıflardan erişilebilen değişkenlerin ve yöntemlerin bulunduğu bölümdür. Dışarıdan görülmez ama türetilmiş sınıflardan erişilir.
SINIFLAR: Erişim Denetimi •
Sınıf tanımında varsayılan erişim denetimi private’dır.
•
Sınıf tanımına başlarken, hiç bir erişim denetimi anahtar kelimesi yazılmazsa, private olarak alınır.
public class Nokta { // saklı bölüm // dışarıdan görülmez double x; double y; // arayüz: dışarıdan // görülen bölüm
}
// orijinden uzaklığı bulan yöntem public double orijindenUzaklik() { return Math.Pow(x*x+y*y,0.5); }
Bir C# Programının Yapısı public class Nokta { double x,y,z; public void orijindenUzaklik() { ….; } }
+ public static void Main(string[] args) { Nokta n = new Nokta(); ...... }
Çalıştırılabilir Program
Sınıf Oluşturma Bir projeye class eklemek için Project-Add Class-class seçilir. Ve otomatik olarak aşağıdaki kodlar eklenir.
Sınıf Oluşturma Ogrenci isminde bir class oluşturduğumuzda projede otomatik olarak oluşturulan kodlar
Sınıflar birer veri yapısıdır, gerçek hayattaki herhangi bir nesne bu yapı ile modellenebilir. Sınıf tanımlamaları yapılırken amaca uygun isimler seçilmelidir.
Sınıf Oluşturma namespace deneme_class_v1 { class Ogrenci { public ulong OgrenciNo; public string Ad; public string Soyad; public string Bolum; public byte Sinif; } }
Örnekte sadece özellikleri olan bir sınıf tanımlanmıştır. Elemanlarının hepsi public tanımlandıkları için sınıfın tüm üye değişkenlerine dışarıdan erişilebilir
Sınıf bildirimleri için bellekte yer tahsis edilmez. Sınıf bildirimleri sonradan tanımlanacak olan nesneler için derleyiciye nesnenin neye benzeyeceğini gösterir
Sınıf Nesneleri Tanımlama sınıflardan nesneler tanımlamak için new anahtar sözcüğü kullanılır. Nesnelerin bildirilmesi ve tanımlanması şu şekilde olur: Ogrenci ogr1; (Bildirim) Bildirim ile nesneye erişim için bir değişken tanımlanmış olur. Fakat nesne bellekte oluşturulmamıştır. Bunun için de; Ogrenci ogr1 = new Ogrenci(); kullanılır. Forma bir buton ekleyelim ve butonun click olayında Ogrenci sınıfına ait bir nesne tanımlayalım.
Sınıf Nesneleri Tanımlama
Sınıftan tanımlanan bir nesnenin üyelerine ‘.’ operatörü ile ulaşılır.
Sınıf Nesneleri Tanımlama Aşağıda butonun click olayında ogrenci sınıfından bir nesne oluşturulmuş ve nesnenin özelliklerine değerler atanmıştır; private void button1_Click(object sender, EventArgs e) { Ogrenci ogr1 = new Ogrenci(); ogr1.Ad = "Mustafa"; ogr1.Soyad = "YILMAZ"; ogr1.OgrenciNo = 12345678; ogr1.Bolum = "ENM"; ogr1.Sinif = 1; } Ogrenci sınıfı içerisine mesaj kutusuna öğrencinin adını yazdıran bir metod eklemek istersek;
Sınıf Nesneleri Tanımlama namespace deneme_class_v1 { class Ogrenci { public ulong OgrenciNo; public string Ad; public string Soyad; public string Bolum; public byte Sinif;
}
}
public void AdYaz() { MessageBox.Show(Ad); }
private void button1_Click(object sender, EventArgs e) { Ogrenci ogr1 = new Ogrenci(); ogr1.Ad = "Mustafa"; ogr1.Soyad = "YILMAZ"; ogr1.OgrenciNo = 12345678; ogr1.Bolum = "ENM"; ogr1.Sinif = 1; ogr1.AdYaz(); }
Aynı sınıf türünden birden fazla nesne yaratımı
Ogrenci ogr1 = new Ogrenci(); Ogrenci ogr2 = new Ogrenci(); ogr1.Ad = "Mustafa"; ogr1.Soyad = "YILMAZ"; ogr1.OgrenciNo = 12345678; ogr1.Bolum = "ENM"; ogr1.Sinif = 1; ogr1.AdYaz(); ogr2.Ad = "Yunus"; ogr2.Soyad = "Demir"; ogr2.OgrenciNo = 1235874; ogr2.Bolum = "ENM-YL"; ogr2.AdYaz();
Aynı sınıf türünden birden fazla nesne yaratımı (ÖNEMLİ NOT!!!) private void button1_Click(object sender, EventArgs e) { Ogrenci ogr1 = new Ogrenci(); Ogrenci ogr2 = ogr1; ogr1.Ad = "Mustafa"; ogr2.Ad = "Yunus"; ogr1.AdYaz(); ogr2.AdYaz(); } Bu program sonucunda oluşacakları tartışalım.
Aynı sınıf türünden birden fazla nesne yaratımı (ÖNEMLİ NOT!!!)
Yukarıdaki programda ogr1 ve ogr2 nesneleri ogrenci sınıfında olacak şekilde tanımlanmış fakat sadece ogr1 için hafıza alan tahsisatı yapılmış, ogr2 nesnesi ise ogr1 nesnesinin bellekteki adresine yönlendirilmiştir. Dolayısıyla ogr1’in özelliğinde yapılan bir değişiklik ogr2’yi, ogr2’in özelliğinde yapılan bir değişiklik ogr1’i etkileyecektir. Çünkü iki nesnede hafızada aynı alana yönlendirilmiştir. Burada önemli olan bir sınıf türünden new anahtar sözcüğüyle yarattığımız her bir nesne için bellekte o sınıftaki tüm metot ve özellikler için bir yer açılması ve tüm işlemlerin o bellek bölgesinde yapılmasıdır.
UYGULAMA (Diktörgen Sınıfı)
Bir diktörtgen sınıfı oluşturun. Sınıf özelliği olarak en, boy, alan ve cevreyi: metod olarak AlanHesapla, CevreHesapla ve EkranaYaz’ ı dikkate alınız.
UYGULAMA (Diktörgen Sınıfı) namespace deneme_class_v1 private { { class Dikdortgen { public int en, boy; private int alan, cevre; public void AlanHesapla() { alan = en * boy; } } public void CevreHesapla() { cevre = (en + boy) * 2; } public void EkranaYaz() { MessageBox.Show("En = " + en.ToString() + "\nBoy = " + boy.ToString() + "\nAlan = " + alan.ToString() + "\nCevre = " + cevre.ToString()); } } }
void button1_Click(object sender, EventArgs e) Dikdortgen drt = new Dikdortgen(); drt.en = 5; drt.boy = 10; drt.AlanHesapla(); drt.CevreHesapla(); drt.EkranaYaz();
Yapıcı (Kurucu) metotlar
Bir sınıf türünden bir nesne yarattığımızda o sınıftaki bütün özellikler ve metotlar bir bellek bölümüne kopyalanır ve bütün özelliklere (sınıfta bir değer atanmamışsa) varsayılan değer atanır. Bir sınıf türünden bir nesne yaratıldığı anda sınıftaki bütün özelliklerin varsayılan değeri tutması yanında başka şeyler de yapılması için yapıcı metotlar kullanılmaktadır. Yapıcı metotlar sınıfın adıyla aynı isimde olmalıdır. Ayrıca yapıcı metotların tanımlanmasında void anahtar sözcüğü kullanılamaz. Örnek: Bir önceki diktörtgen sınıfına yapıcı bir metod ekleyelim.
Yapıcı (Kurucu) metotlar class Dikdortgen { public int en, boy; private int alan, cevre; public Dikdortgen(int en, int boy) private { { this.en = en; this.boy = boy; AlanHesapla(); CevreHesapla(); } } public void AlanHesapla() { alan = en * boy; } public void CevreHesapla() { cevre = (en + boy) * 2; } public void EkranaYaz() { MessageBox.Show("En = " + en.ToString() + "\nBoy = " + boy.ToString() + "\nAlan = " + alan.ToString() + "\nCevre = " + cevre.ToString()); } }
void button1_Click(object sender, EventArgs e) Dikdortgen drt = new Dikdortgen(12, 22); ; drt.EkranaYaz();
Static üye elemanlar anahtar sözcüğüyle belirttiğimiz metot ya da özellikler direkt olarak söz konusu metot ya da özelliğin adı yazarak kullanılabilir
static
class Dikdortgen { public static double AlanHesapla(double en, double boy) { return en * boy; } } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(Dikdortgen.AlanHesapla(5, 10).ToString()); }
Static üye elemanlar
Bir nesneye bağlı olarak çalışmayacak üye elemanlar static olarak belirtiriz. Örneğin Console sınıfındaki WriteLine() metodu veya Math sınıfındaki PI özelliği static üye elemanlardır. üye elemanlara nesne oluşturarak ulaşmaya çalışmak hatalıdır.
Static
üye elemanları oluştururken static sözcüğünün erişim belirleyici sözcükle sırası önemli değildir. Yani static public int Topla() veya public static int Topla() kullanımlarının ikisi de doğrudur. Ancak tabii ki geri dönüş tipinin üye eleman adının hemen öncesinde gelmesi gerekir.
Static
Get ve Set Sözcükleriyle Özellik Tanımlanması
Bir nesnenin üye değişkenlerine değer atarken ya da içerisindeki değeri kullanırken belli kontrollerin yapılması gerekiyorsa ya da kod bloklarının çalıştırılması isteniyorsa set ve get ifadeleri kullanılır. set sözcüğü nesnenin özelliklerine değer atandığında çalışır. get sözcüğü ise özellik değeri okunduğunda ya da farklı bir ifadeye aktarılmaya çalışıldığında çalışır. Insan isimli bir sınıf oluşturalım ve get ve set’ in kullanımını görelim
Get ve Set Sözcükleriyle Özellik Tanımlanması Görüldüğü gibi önce Insan sınıfında Yas adlı bir özellik
class Insan oluşturulmuş olup bu özelliğe atanacak değer kontrol edilerek { private int yas; gerçekleştirilecektir. Özelliğe bir değer atanmaya çalışıldığında private string sacRengi; set bloğundaki, özellik kullanılmaya çalışıldığında da get public int Yas bloğundaki komutlar çalıştırılır. Aslında C# kütüphanesindeki { özelliklerin çoğu bu yöntemle oluşturulmuştur. Örneğin get { Windows programlamada bir butonun Text özelliği if (yas == 50) değiştirildiğinde butonun üzerindeki yazı da değişir, Text return yas / 5; özelliği normal bir değişken olarak tanımlansa bu işlem else return yas; gerçekleşemezdi. Programdaki value sözcüğü özelliğe girilen } değeri tutmakta olup girilen değer hangi türdeyse o türde set değer tutar. { if (value < 65 && value > 18) { yas = value; } else { yas = 18; }
ÖZET Sınıf ismi class anahtar sözcüğünden hemen sonra yazılır ve değişken tanımlama kurallarını sağlamalıdır. Sınıflarda istenilen sayıda özellik ve istenilen sayıda metot yani fonksiyon ve yordam tanımlanabilir. public anahtar sözcüğü özelliğe veya metoda bulunduğu sınıfın dışından erişilmesine izin verir. Hiçbir şey yazmamakla private anahtar sözcüğünün kullanılması aynı etkiye sahiptir.
MDI Formlar Oluşturma WinForms uygulamanızda birden fazla alt form oluşturma
Yeni Alt Form Ekleme
Uygulama Üzerinde, çocuk form oluşturma, gösterme, gizleme ve kapatmayı sağlayan butonlar bulunan formu içeren WinForms uygulamasını yazınız.
Ana Form (Form1.cs)
Ana Form (Form1.cs)
Çocuk Form (CocukForm.cs)
Dosya İşlemleri ve Hata Ayıklama
DOSYALAMA İŞLEMLERİ Bilgisayar yazılımlarının vazgeçilmez unsurlarından birisi de dosyalardır. Gerekli bilgilerin dosyalara yazılıp buradan tekrar okunması birçok program için büyük kolaylık, bazı programlar için de zorunluluktur. Bütün dosya ve dizin işlemleri “System” altında “IO” isim uzayında tanımlanmıştır. Dolayısıyla ilgili fonksiyonların kullanılabilmesi için “using System.IO” teriminin yazılması gerekmektedir.
Dizin ve Klasör İşlemleri Klasör, dosyaların bilgisayar hafızasındaki (hard-disk) adresi yada yolu (path) olarak tanımlanabilir. Bir vatandaşın şehir içerisinde oturduğu yer nasıl adres ile belirleniyorsa, hafızadaki bir dosyaya adres ile ulaşılabilmektedir. Bu bölümde klasörler üzerindeki işlemlerin nasıl gerçekleştirileceğine değinilecektir.
Klasör Fonksiyonları (Directory Class) Directory.CreateDirectory(yol); yol isimli parametre ile belirtilen yerde klasör oluşturmak için kullanılır. private void button1_Click(object sender, EventArgs e) { string yol2 = "d:\\c_sharp\\klasor1"; Directory.CreateDirectory(yol2); }
Klasör Fonksiyonları (Directory Class) Uygulama : c_sharp Klasörü içine isimleri klasor1……klasor100 olacak şekilde 100 adet yeni klasör açın. private void button1_Click(object sender, EventArgs e) {
}
for (int i = 1; i < 101; i++) { string yol = "d:\\c_sharp\\klasor \\" + i.ToString(); Directory.CreateDirectory(yol); }
Klasör Fonksiyonları (Directory Class) Directory.Delete(yol); yol isimli parametre ile belirtilen path deki klasörü siler. Bu fonksiyonun çalışabilmesi için klasörün içinin boş olması gerekir aksi halde program hata verecektir. Ancak yol parametresinden sonra true ekleyerek tüm alt kasörleri ve dosyalarıda silebilirsiniz.. string yol = "d:\\c_sharp\\klasor1"; Directory.CreateDirectory(yol); Directory.Delete(yol);
Klasör Fonksiyonları (Directory Class) Directory.Exists(yol); yol isimli parametre ile belirtilen path deki klasörün var olup olmadığını kontrol eder. Eğer klasörü bulursa geriye true değeri bulamaz ise false değeri döner. string yol = "d:\\c_sharp\\klasor1"; Directory.CreateDirectory(yol); bool kontrol = Directory.Exists(yol); MessageBox.Show(kontrol.ToString() );
Klasör Fonksiyonları (Directory Class) Directory.GetDirectories(yol); yol isimli parametre ile belirtilen path deki klasörün içindeki tüm klasörleri listelemek için kullanılır. (string dizisi döndürür) string[] altklasor = Directory.GetDirectories("c:\\Program Files"); listBox1.Items.AddRange(altklasor);
c:\\Program Files in içindeki tüm klasörlerin isimleri yoluyla beraber listelenir.
Klasör Fonksiyonları (Directory Class) Directory.GetFiles(yol); yol isimli parametre ile belirtilen klasörün içindeki tüm dosyalar listelemek için kullanılır. (string dizisi döndürür) string[] dosya = Directory.GetFiles ("c:\\WINDOWS"); listBox1.Items.AddRange(dosya);
c:\\WINDOWS ın içindeki tüm dosyaları listeler.
Klasör Fonksiyonları (Directory Class) Directory.GetDirectoryRoot(yol); yol isimli parametre ile belirtilen klasörün bulunduğu sürücüyü geri döndüren bir metod’dur. string yer = Directory.GetDirectoryRoot("c:\\WINDOWS"); this.Text = yer; c:\
Klasör Fonksiyonları (Directory Class) Directory.GetLogicalDrives(); Bilgisayrada bulunan sürücüleri listeleyen bir metod’dur. (string dizisi döndürür) string[] surucu = Directory .GetLogicalDrives (); listBox1.Items.AddRange(surucu );
Klasör Fonksiyonları (Directory Class) Directory.GetFileSystemEntries(aranacak_klasör, aranacak_dosya); Belirtilen klasörün içerisindeki ikinci parametre ile belirtilen dosyayı arar bulursa yoluyla beraber ismini döndürür. Bu fonksiyonda joker karakterler kullanarak sadece txt veya sadece exe vs. bulunabilir. string[] ad = Directory.GetFileSystemEntries("d:\\Arac Kutusu", "*.exe"); listBox1.Items.AddRange(ad);
Dosya Fonksiyonları (FileInfo Class)
C#’da dosya işlemleri içinde «FileInfo» class’ı yaratılmıştır. Bu class sayesinde dosyalar üzerinde istediğiniz işlemleri yapabilirsiniz. Dosyalama fonksiyonlarının işletilebilmesi için FileInfo clasına ait bir üye oluşturmanız gerekmektedir. Bu sınıf system.IO içerisinde yer almaktadır.
Dosya Fonksiyonları (FileInfo Class) dosya.CopyTo(kopyalanacak_yol, true); dosya değişkeninin gösterdiği yoldaki dosyayı kopyalanacak yol isimli yeni path deki dosyaya kopyalar. Örneğin d:\c_sharp\atauni.txt isimli bir metin dosyamız var olsun. Bu dosyayı aynı kalasör içine deneme.txt uzantılı başka bir kalsöre kopyalamak istersek.
Dosya Fonksiyonları (FileInfo Class) FileInfo dosya = new FileInfo("d:\\c_sharp\\atauni.txt"); dosya.CopyTo("d:\\c_sharp\\deneme.txt",true);
Dosya Fonksiyonları (FileInfo Class) dosya.Exists dosya değişkeniyle belirtilen path deki dosyanın var olup olmadığını bu komutla kontrol edebilirsiniz. Dosya varsa true, yoksa false değeri ni döndürür. dosya.Delete() dosya değişkeniyle belirtilen path deki dosyayı silmek için kullanılır. Bu metodu kullanmadan önce dosyanın var olup olmadığını kontrol ettiriniz. FileInfo dosya = new FileInfo("d:\\c_sharp\\deneme.txt"); if (dosya.Exists) dosya.Delete(); else MessageBox.Show ("Böyle bir dosya YOK!!!");
FileInfo Sınıfı FileInfo sınıfının diğer özellikleri
.Name - dosya adı .FullName – bulunduğu klasörler ve dosya adı .Directory – bulunduğu klasör .Length – byte cinsinden boyut .LastWriteDate – Son yazılma/kaydedilme tarihi .CreationTime – yaratılma tarihi
Dosyalama İşlemleri C# da dosyalama işlemleri «Stream» sınıfıyla yapılabilmektedir. Bu sınıfı kullanarak veri yazacağınız dosyaları çok kolay ve hızlı bir şekilde oluşturabilirsiniz. Bir metin dosyasından StreamReader sınıfı kullanılarak veri okunabilir.
Dosyalama İşlemleri
StreamReader : Dosyadan okumak için kullanılır. string StreamReader.ReadLine() : Dosyadan bir satır okumak için kullanılır. Dosyadan okuma yapmadan önce dosyanın varlığı File.Exists(string path) metodu ile kontrol edilmelidir.
Dosyalama İşlemleri string yol = "d:\\c_sharp\\atauni.txt"; FileInfo dosya1 = new FileInfo(yol); if (dosya1.Exists) { StreamReader oku = new StreamReader(yol, Encoding.GetEncoding("iso-8859-9")); string satir; while((satir=oku.ReadLine() )!=null) { MessageBox.Show(satir); } } else { MessageBox.Show ( "böyle bir dosya YOK!!!"); }
Uygulama: Bir butona basıldığında text dosyasında yer alan bir metnin tüm satırlarını bir döngüyle sırasıyla çok satırlı textbox’a ekleyen WinForms uygulamasını yazınız.
Dosyaya Yazma
C# dilinde dosyaya yazma işlemleri için System.IO alan adı kullanılır. Özellikle Türkçe desteğinin gerekli olduğu yerlerde StreamWriter sınıfı kullanılmalıdır.
Dosyaya Yazma
Butona basıldığında textbox’da yazanı bir txt dosyasına yazdıran programı kodlayın. private void button1_Click(object sender, EventArgs e) {
}
StreamWriter yaz = new StreamWriter("d:\\c_sharp\\deneme.txt"); yaz.WriteLine(textBox1.Text); yaz.Close();
Dosyaya Yazma
Eğer butona basıldığında daha önce oluşturulan dosyaya ilave bir şeyler yazılmak istenseydi true paremetresi girilmeliydi private void button1_Click(object sender, EventArgs e) {
}
StreamWriter yaz = new StreamWriter("d:\\c_sharp\\deneme.txt",true); yaz.WriteLine(textBox1.Text); yaz.Close();
OpenFileDialog Butona basıldığında OpenFileDialog ile seçilen dosyayı MessageBox ile gösteren WinForms uygulamasını yazınız.
OpenFileDialog private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); DialogResult sonuc = openFileDialog1.ShowDialog();
}
if (sonuc == DialogResult.OK) // Test result. { string dosyaAdi = openFileDialog1.FileName; MessageBox.Show(dosyaAdi); } else { MessageBox.Show("Dosya secilmedi"); }
OpenFileDialog Filtreler ve MultiSelect Hangi dosya türlerinin seçilebileceği Filter özelliği ile belirtilebilir. openFileDialog1.Filter = "Text Files (.txt)|*.txt|All Files (*.*)|*.*"; openFileDialog1.FilterIndex = 1; Birden fazla dosyanın seçilip seçilemeyeceği Multiselect özelliği ile belirlenebilir. openFileDialog1.Multiselect = true;
SaveFileDialog Butona basıldığında SaveFileDialog ile seçilen dosyayı TextBox’ta gösteren WinForms uygulamasını yazınız.
SaveFileDialog private void button1_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog1 = new SaveFileDialog();
}
if (saveFileDialog1.ShowDialog() == DialogResult.OK) { textBox1.Text = saveFileDialog1.FileName; }
SaveFileDialog Filtreler ve DefaultExt Hangi dosya türlerinin seçilebileceği Filter özelliği ile belirtilebilir. saveFileDialog1.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"; saveFileDialog1.FilterIndex = 2; Kullanıcı, uzantısı olmayan bir dosya adı belirttiğinde FileDialog, DefaultExt ile belirtilen uzantıyı ekler. saveFileDialog1.DefaultExt = "txt";
SaveFileDialog InitialDirectory ve Title Kayıt penceresinde yüklenecek başlangıç dizinini belirlemek için InitialDirectory özelliği kullanılır. saveFileDialog1.InitialDirectory = "C:\"; Kayıt penceresinin başlığı Title özelliği ile belirtilebilir. saveFileDialog1.Title = "Txt dosyalarını kaydet";
Hata Ayıklama (Debugging) Yazım Hataları (Syntax Errors) private void btnTopla_Click(object sender, EventArgs e) { double sayi1 = Convert.ToDouble(textBox1.Text) double sayi2 = Convert.ToDouble(textbox1.Text); double sonuç = sayi1 + sayi2; textBox3.Text = sonuc.ToString(); }
Bu hatalar derlenmez Hatalı satır ve kelimenin altı kırmızı çizilir Derlenmek istenirse hata verir
32
Hata Ayıklama (Debugging) Error List – – – –
Yazım hataları ve diğer hataların listelendiği pencere Hatalı dosya, hata mesajı ve hatalı satır numarası Hataların üzerine çift tıklayın, hatalı satıra gidersiniz View -> Error List
33
Hata Ayıklama (Debugging) Line Numbers (Satır Numaraları) – Basit ancak işe çok yarar – Tools > Options + Text Editor + C#
34
Hata Ayıklama (Debugging) Line Numbers (Satır Numaraları)
35
Hata Ayıklama (Debugging) Mantık Hataları (Logic Errors) – Yazım hatası yok, normal derlenme – Ancak program çalışırken oluşan hatalar – Sonuçta • Ya yanlış sonuç üretilir • Ya da hata oluşur, program çöker
– Çalışma sırasında (run time) oluşan hatalara exception (beklenmedik durum) denir. – Bu hataları bulmaya ve düzeltmeye debugging (hata ayıklama) denir. 36
Hata Ayıklama (Debugging) Mantık Hatalarına Örnekler – Sayı girilmesi gereken yere harf girmek • Örn. 3 + “3g”
– Boş bırakılmaması gereken kutunun boş kalması • Örn. Font büyüklüğünü seçiniz: …
– Tarih ve zaman formatlarının değişik girilmesi • Örn. 23.04.2010 x 23/04/2010 x 23 4 2010 x ….
– Donanım ve yazılım farklılıkları • Örn. DivX kodlamasının bilgisayarda olmaması 37
Hata Ayıklama (Debugging) Mantık Hatası Nasıl Çözülür? – Hatalı satır ya da satırlar bulunur – Değişiklik yapılır • Debugging
– Bazı kodlar risklidir, hata önlenemez – Bu kodlar “riskli koda” (exception) çevrilir. • Exception Handling * Bakınız “Exception Handling” slaytları 38
Debugging Bekleme Noktaları ve Bekleme Modu (Breakpoints and Break Mode (Debug Mode) – Program çalışırken hata olursa, hatanın oluştuğu satırda program durur – Bekleme moduna geçer – Satır sarı renkle boyanır – Hata (exception) mesajı ekrana verilir – Bu modda, • Kod değişikliği yapılabilir • Değişkenlerin değerleri öğrenilebilir • Program kaldığı yerden çalışmaya devam edebilir 39
Debugging Bekleme Noktaları ve Bekleme Modu (Breakpoints and Break Mode (Debug Mode) – Hata ayıklarken programı istenilen satırda durdurmak ve bekleme moduna almak için • Kod penceresinde o satırın başını tıklayın • Satır kahverengi olarak işaretlenecektir • O satıra bekleme noktası (breakpoint) denir – Daha sonra programı çalıştırın. Burayı – Program o satıra gelince tıklayın bekleme moduna geçecektir
40
Debugging Bekleme Noktaları ve Bekleme Modu (Breakpoints and Break Mode (Debug Mode) – Bekleme modundaki program istenirse satır satır çalıştırılabilir.
Kaldığı yerden devam
Baştan başlatma
Durdurma
Tek bir satır çalıştırma
41
Exception Handling (Riskli Kod Yazma)
Exceptions – Program çalışırken (run time) öngöremediğiniz sebeplerden dolayı oluşan hatalar – Hiçbir önlem alınmazsa, program hatalı satırda hata mesajı verir ve kapanır! • Program yazma aşamasında bekleme moduna geçer 42
Exception Handling Exception ile nasıl baş edilir? – 1. NEREDE? • Hatanın hangi satırda oluşabileceğini bilin
– 2. HANGİ HATA • Hata tipini bilmeniz gerekir, farklı hata tipleri için farklı kodlar yazabilirsiniz
– 3. Try...Catch... Kod bloğu yazın 43
Exception Handling NORMAL KOD double sayi1 = Convert.ToDouble(textBox1.Text); double sayi2 = Convert.ToDouble(textBox1.Text); double sonuc = sayi1 + sayi2; textBox3.Text = sonuc.ToString(); TRY..CATCH’li KOD double sayi1, sayi2; try { sayi1 = Convert.ToDouble(textBox1.Text); sayi2 = Convert.ToDouble(textBox1.Text); } catch (Exception exObjesi) { sayi1 = 0.0; sayi2 = 0.0; } double sonuc = sayi1 + sayi2; textBox3.Text = sonuc.ToString();
Hata olma ihtimali olan satırlar
Hata olursa çalışacak satırlar
44
Exception Handling Exception objesi Hatanın tipine göre mesaj verir TRY..CATCH’li KOD double sayi1, sayi2; try { sayi1 = Convert.ToDouble(textBox1.Text); sayi2 = Convert.ToDouble(textBox1.Text); } catch (Exception exObjesi) { sayi1 = 0.0; sayi2 = 0.0; MessageBox.Show("Hata oldu: " + exObjesi.Message); } double sonuc = sayi1 + sayi2; textBox3.Text = sonuc.ToString(); 45
Exception Handling Try Bloğu try { Hata olabilecek satırlar buraya } catch (Exception exObjeAdı) { Hata olursa çalışmasını istediğiniz satırlar buraya exObjeAdı nesnesini kullanmak zorunda değilsiniz }
İçi içe try..catch blokları yazılamaz Birbiri ardına yazılabilir 46
Exception Handling TRY..CATCH’li KOD double sayi1, sayi2; try { sayi1 = Convert.ToDouble(textBox1.Text); } catch (Exception exObjesi) { sayi1 = 0.0; } try { sayi2 = Convert.ToDouble(textBox2.Text); } catch (Exception exObjesi) { sayi2 = 0.0; } double sonuc = sayi1 + sayi2; textBox3.Text = sonuc.ToString(); 47