duyuruElektroArge.com'a Hoşgeldiniz. Üye Olmak İçin Tıklayın. duyuru





houseForum ana sayfa   iletişimİletişim   bilgiSSS  
kırmızı yeşil mavi
ekleKayıt  anahtarGiriş
evForum ana sayfa goE-Kütüphane goE-Ders goC#
 

  • Reklam

Ders 31 - Döngüler

C Dili Dersleri - Okan Bilke

Ders 31 - Döngüler

Mesajgönderen okanbilke » 11 Eyl 2015 23:11

Bilgisayar dillerinin işlemleri arka arkaya yapmasını sağlayan, bu sayede işlemci hızının önemli olduğunu gösteren komutlar döngülerdir. Bir çok amprik işlemin sonuçları döngüler kullanılarak formulize edilebilir ve çalıştırılabilir. Şimdi sizlere sırasıyla tüm döngüleri teker teker örnekleriyle izah edeceğim.
FOR DÖNGÜSÜ
Doğrudan veya dolaylı olarak sayaç (döngünün kaç kere tekrarlanacağı) sayısının bilindiği durumlarda kullanılabilecek olan en ideal döngü çeşididir. C# uygulamalarında for döngüsü çok esnek bir yapıya sahip olup neredeyse tüm döngü gerektiren problemler bir şekilde bu komutla çözülebilir. Öncelikle kullanımına ait örnek şablonu vermek istiyorum.
private void button1_Click(object sender, EventArgs e)
{
for (int i = BaslangicDeger; i <= BitisDeger; DegisimDegeri)
{
// Kodlar
}
}

Döngüde kullanılan sayaç değişkeni (Bizim örneğimizde i) aralarına ; karakteri kullanılarak üç değişik şekilde bildirilmelidir. Birinci parametre başlangıç değerini, ikinci parametre bitiş değerini, üçüncü ve son parametre ise sayacın değişim miktarını göstermektedir.
private void button1_Click(object sender, EventArgs e)
{
int Toplam = 0;
for (int i = 1; i <= 40; i++)
{
Toplam += i;
}
this.Text = "Aradaki Sayıların Toplamı=" + Toplam.ToString(); // 820 yazar
}

Veya
private void button1_Click(object sender, EventArgs e)
{
int Toplam = 0;
for (int i = 1; i <= 40; ++i) // Dikkat
{
Toplam += i;
}
this.Text = "Aradaki Sayıların Toplamı=" + Toplam.ToString();
}

Aynı örnekte aralarında iki fark olan sayıların toplanması istenseydi tek yapmanız gereken adım değerini iki artırmak olacaktı.
private void button1_Click(object sender, EventArgs e)
{
int Toplam = 0;
for (int i = 1; i <= 40; i += 2)
{
Toplam += i;
}
this.Text = "Aradaki Sayıların Toplamı=" + Toplam.ToString();
}

Kontrollere girilen değerler arasındaki sayıların toplamını hesaplatmanız gerekirse o zaman aşağıdaki şekilde bir kodlama kullanabilirsiniz.
private void button1_Click(object sender, EventArgs e)
{
int İlkSayı, SonSayi, Toplam = 0;
İlkSayı = Convert.ToInt32(textBox1.Text);
SonSayi = Convert.ToInt32(textBox2.Text);
for (int i = İlkSayı; i <= SonSayi; i++)
{
Toplam += i;
}
this.Text = "Aradaki Sayıların Toplamı=" + Toplam.ToString();
}

Aşağıdaki örnek uygulamada iki farklı kontrolden alınan değerler kullanılarak aralarındaki çift sayıların toplamı hesaplatılmaktadır. Örneği iki farklı yöntemle çözeceğim. Hangisinin daha hızlı olduğuna siz karar verin.
private void button1_Click(object sender, EventArgs e)
{
int İlkSayı, SonSayi, Toplam = 0, DegerDeneme;
İlkSayı = Convert.ToInt32(textBox1.Text);
SonSayi = Convert.ToInt32(textBox2.Text);
if(İlkSayı>SonSayi) // İlk Sayı Büyükse Değiştir
{
DegerDeneme = İlkSayı;
İlkSayı = SonSayi;
SonSayi = DegerDeneme;
}

if (İlkSayı % 2 != 0)
{
İlkSayı++; // Küçük Sayı Tekse Çift Yap
}
for (int i = İlkSayı; i <= SonSayi; i += 2)
{
Toplam += i;
}

this.Text = Toplam.ToString();
}

Aşağıdaki örnek uygulamada değişik bir teknik kullanılarak dizi elemanları sıralatılmıştır.
private void button1_Click(object sender, EventArgs e)
{
int[] DiziElemanlar = new int[8] { 10, 5, 25, 15, 80, 75, 70, 30 };
System.Collections.IEnumerator DiziOku = DiziElemanlar.GetEnumerator();
int DegerDene;
for (int i = 0; i <= DiziElemanlar.Length - 1; i++)
{
int j = 0;
DiziOku.Reset();
while (DiziOku.MoveNext())
{
int Deger = Convert.ToInt32(DiziOku.Current);
if(Deger>DiziElemanlar[i])
{
DegerDene = DiziElemanlar[i];
DiziElemanlar[i] = DiziElemanlar[j];
DiziElemanlar[j] = DegerDene;
}
j++;
}
}
foreach (int Eleman in DiziElemanlar)
{
listBox1.Items.Add(Eleman.ToString());
}
}

Aşağıdaki örnek algoritma aynı sıralama işlemini yapmakla beraber biraz daha karmaşık bir yapıya sahiptir.
private void button1_Click(object sender, EventArgs e)
{
int[] DiziElemanlar = new int[8] { 10, 5, 25, 15, 80, 75, 70, 30 };
System.Collections.IEnumerator DiziOku = DiziElemanlar.GetEnumerator();
System.Collections.IEnumerator DiziOku2 = DiziElemanlar.GetEnumerator();
for (int i = 0; i <= DiziElemanlar.Length - 1; i++)
{
int j = 0;
DiziOku2.MoveNext();
int KiyasDeger = Convert.ToInt32(DiziOku2.Current);
DiziOku.Reset();
while (DiziOku.MoveNext())
{
int Deger = Convert.ToInt32(DiziOku.Current);
if(Deger>KiyasDeger)
{
DiziElemanlar[i] = Deger;
DiziOku2.Reset();
for (int k = 0; k <= i; k++)
{
DiziOku2.MoveNext();
}
DiziElemanlar[j] = KiyasDeger;
KiyasDeger = Convert.ToInt32(DiziOku2.Current);
}
j++;
}
}
foreach (int Eleman in DiziElemanlar)
{
listBox1.Items.Add(Eleman.ToString());
}
}

Bu döngüyü aşağıdaki şekilde kullanarak diğer döngülere dönüştürebilirsiniz.
private void button1_Click(object sender, EventArgs e)
{
int Toplam = 0;
int i = 0;
for (; i <= 40; i++)
{
Toplam += i;
}
this.Text = Toplam.ToString();
}

Bu örnekte doğru sonuç verecektir. Aynı zamanda aşağıdaki şekilde bir kullanım sayesinde sayacı döngü içerisinde değiştirebilirsiniz. Aşağıdaki kodlama kesinlikle doğrudur.
private void button1_Click(object sender, EventArgs e)
{
int Toplam = 0;
int i = 0;
for (; i <= 20;)
{
Toplam += i;
i++;
}
this.Text = Toplam.ToString();
}

Dilerseniz koşulu döngü içerisinde girebilirsiniz. Sonuç değişmeyecektir.
private void button1_Click(object sender, EventArgs e)
{
int Toplam = 0;
int i = 0;
for (; ; )
{
if (i > 20)
{
break;
}
Toplam += i;
i++;
}
this.Text = Toplam.ToString();
}

Son bir örnek vererek for döngüsünü sonlandıralım. Bu sefer iç içe for döngülerinden faydalanacağım. Bu sayede konu daha da pekişmiş olacak.
private void button1_Click(object sender, EventArgs e)
{
int[] DiziElemanlar = new int[8] { 10, 5, 25, 15, 80, 75, 70, 30 };
System.Collections.IEnumerator DiziOku = DiziElemanlar.GetEnumerator();
System.Collections.IEnumerator DiziOku2 = DiziElemanlar.GetEnumerator();
int i = 0;
for (; DiziOku2.MoveNext(); )
{
int j = 0;
int KiyasDeger = Convert.ToInt32(DiziOku2.Current);
DiziOku.Reset();
for (; DiziOku.MoveNext(); )
{
int Deger = Convert.ToInt32(DiziOku.Current);
if (Deger > KiyasDeger)
{
DiziElemanlar[i] = Deger;
DiziOku2.Reset();
for (int k = 0; k <= i; k++)
{
DiziOku2.MoveNext();
}
DiziElemanlar[j] = KiyasDeger;
KiyasDeger = Convert.ToInt32(DiziOku2.Current);
}
j++;
}
i++;
}
DiziOku.Reset();
for (; DiziOku.MoveNext(); )
{
listBox1.Items.Add(DiziOku.Current.ToString());
}
}

WHILE DÖNGÜSÜ
Döngü komutlarının işleyebilmesi için bildirilen koşulun doğru olması gerekmektedir. Yani koşul true değerini döndürüyorsa döngü komutları devamlı olarak tekrar işletilecektir.
private void button1_Click(object sender, EventArgs e)
{
while (KosulIcerigi)
{
// Kodlar
}
}

Şimdi bu döngüyü kullanarak girilen iki sayı arasındaki tek sayıları toplatacak bir uygulama yapacağım. Dikkatlice takip ediniz.
private void button1_Click(object sender, EventArgs e)
{
int IlkSayi, SonSayi, Toplam = 0, DegerDeneme;
IlkSayi = Convert.ToInt32(textBox1.Text);
SonSayi = Convert.ToInt32(textBox2.Text);
if (IlkSayi > SonSayi)
{
DegerDeneme = IlkSayi;
IlkSayi = SonSayi;
SonSayi = DegerDeneme;
}
int i = IlkSayi;
while (i <= SonSayi)
{
if (i % 2 != 0)
{
Toplam += i;
}
i++;
}
this.Text = Toplam.ToString();
}

Aşağıdaki kodun bu işi çok daha hızlı yapacağı aşikardır.
private void button2_Click(object sender, EventArgs e)
{
int IlkSayi, SonSayi, Toplam = 0, DegerDeneme;
IlkSayi = Convert.ToInt32(textBox1.Text);
SonSayi = Convert.ToInt32(textBox2.Text);
if (IlkSayi > SonSayi)
{
DegerDeneme = IlkSayi;
IlkSayi = SonSayi;
SonSayi = DegerDeneme;
}
if (IlkSayi % 2 == 0)
{
IlkSayi++;
}
int i = IlkSayi;
while(i<=SonSayi)
{
Toplam += i;
i += 2;
}
this.Text = Toplam.ToString();
}

DO WHILE DÖNGÜSÜ
Bu ifadenin while döngüsünden tek farkı, şartın döngü çıkışında kontrol edilmesidir. Koşul sağlandığı sürece döngü devam eder. Dikkat edilecek diğer bir husus, koşul döngü çıkışı kontrol edildiği için döngü içindeki kodlar en az bir kere işletilir. Öncelikle prototipini verelim.
private void button1_Click(object sender, EventArgs e)
{
do
{
// Kodlar
} while (KoşulIcerik); // Koşul
}

Aşağıdaki örnek uygulamada toplam değerinin 100'ü geçtiği durum hesaplatılmaktadır.
private void button1_Click(object sender, EventArgs e)
{
Double Sonuc = 0;
int i = 1;
do
{
Sonuc += i++;
} while (Sonuc <= 100);
this.Text = i.ToString() + " Sayısına Kadar OK";
}

FOREACH DÖNGÜSÜ
Dizi değişken değerleriyle ilgili kullanılabilen çok kullanışlı bir döngüdür. Muhakkak dizi değişken olması zorunluluğu vardır. Amaç her defasında dizinin bir sonraki elemanını gösterip, o elemana ait içeriğin elde edilebilmesi hususudur. Aşağıda döngüye ait yapı verilmiştir.
private void button1_Click(object sender, EventArgs e)
{
foreach(String Deger in Dizi) // Dizi Değişken Olmak Zorunda
{
// Kodlar
}
}

Şimdi basit bir örnekle bu döngüyü izah etmeye çalışalım. Amacımız diziye ait tüm elemanları bu döngüyü kullanarak mesaj içeriği olarak kullanıcıya göstermek olacaktır.
private void button1_Click(object sender, EventArgs e)
{
// Listele
String[] DiziElemanlari = new string[3] { "ANKARA", "İZMİR", "İSTANBUL" };
foreach(String TekEleman in DiziElemanlari)
{
listBox1.Items.Add(TekEleman);
}
}

Aşağıdaki örnek uygulamada gönderilen dizi elemanları toplatılarak sonuç değeri elde edilmektedir. Belirtmekte yarar görüyorum, foreach döngü kullanılarak dizilerin tüm elemanlarına indis numarası belirtmeden erişim sağlanmaktadır. Bu erişim sadece okuma anlamında kullanılabilir, aktarılan değişkenin değeri döngü içerisinde kesinlikle değiştirilemez (Bizim örneğimizde TekEleman değişkeni bu görevi üstlenmiştir).
private void button1_Click(object sender, EventArgs e)
{
int[] DiziElemanlar = { 15, 30, 20, 40, 70 };
int DiziToplam = 0;
foreach(int TekEleman in DiziElemanlar)
{
DiziToplam += TekEleman;
}
this.Text = DiziToplam.ToString(); // 175 Yazar
}
okanbilke@gmail.com
Kullanıcı avatarı
okanbilke
Site Kurucusu
Site Kurucusu
 
Mesajlar: 721
Beğendiklerim: 0 mesaj
Beğenilenlerim: 0 mesaj
Kayıt: 15 Mar 2013 13:09
Konum: Ankara

Reklam

Dön C#

Kimler çevrimiçi

Bu forumu gezen kullanıcılar: Hiç bir kayıtlı kullanıcı yok ve 1 misafir


  • Reklam
cron