ForumTayfa  

Go Back   ForumTayfa > Güvenlik & Bilgisayar & İnternet & Webmaster & Programlama Bölümü > Güvenlik & Bilgisayar & İnternet & Webmaster & Programlama > Programlama

Programlama Programlama hakkında herşeyi paylaştığımız, soru ve sorunlarımızı tartıştığımız bölüm...

Yeni Konu aç  Cevapla
 
LinkBack Seçenekler Stil
Alt 10.03.07, 17:02   #1 (permalink)
Deneyimli Tayfa
 
silentwolf - ait Kullanıcı Resmi (Avatar)
 
Üyelik Tarihi: Dec 2006
Nereden: burada
Mesaj Sayısı: 3.964
Konu Sayısı: 157
Takım: Fenerbahçe
Rep Gücü: 196650
Rep Puanı: 19663395
Rep Derecesi : silentwolf 0-10000000silentwolf 0-10000000silentwolf 0-10000000silentwolf 0-10000000silentwolf 0-10000000silentwolf 0-10000000silentwolf 0-10000000silentwolf 0-10000000silentwolf 0-10000000silentwolf 0-10000000silentwolf 0-10000000
Ruh Hali:

Standart C# Öğreniyorum Makale 6: Karar Yapıları ve Döngüler




Konu 1: Karar Yapıları

Uygulamalar çalıştırılırken, yazılan kodların çalışma sırası, satırların teker teker işlenmesi ile gerçekleşir. Ancak çoğu zaman, bazı kodların sadece belli durumlarda çalışması istenir. Örneğin uygulama açılırken kullanıcı adı ve parola sorulması, kullanıcıların seviyelerine göre erişim izinleri tanımlanması gibi durumlarda kontrol işlemleri yapılmalıdır. Bu kontroller de karar yapıları ile gerçekleştirilir.
Algoritmaların akışını kontrol etmekte en büyük rol, karar yapılarınındır. Visual C# .NET dilinde farklı şekillerde kullanılan ancak benzer görevlere sahip karar yapıları tanımlıdır.
Bu bölüm tamamlandıktan sonra
· if else if karar yapıları ile akış kontrolü yapabilecek,
· Kontrollerde kullanılan koşul operatörlerinin tanıyacak,
· switch karar yapısını kullanabilecek,
· Hangi karar yapısının nerede kullanılacağını öğreneceksiniz.
if

if karar yapısı, bir koşul sağlandığı zaman yapılacak işlemleri kapsar. Kontrol edilecek koşul ifadesinin sonucu true değerini alırsa, küme parantezleri arasındaki kodlar çalıştırılır.
if(Koşul)
{
}
Örnek: Vize ve final notunu kullanıcıdan aldıktan sonra, geçme notunu hesaplayan ve notun elliden büyük olması durumunda ekrana “geçtiniz” mesajını çıkartan algoritma.

double gecmeNotu;
short finalNotu = short.Parse(textBox1.Text);
short vizeNotu = short.Parse(textBox2.Text);
gecmeNotu = finalNotu * 0.7 + vizeNotu * 0.3;
if(gecmeNotu > 50)
{
MessageBox.Show("Geçtiniz tebrikler...");
}
Koşul Operatörleri

Veri tipleri ve değişkenler üzerinde kontrol yapılırken birden fazla koşula ihtiyaç duyulabilir. Bu durumda, koşulları birbirleriyle karşılaştıracak operatörler kullanılır. Bu kontrollerden dönen değerler Boolean tipinde olduğu için, koşul operatörleri de bu değerler üzerinde işlem yaparlar.
& (And)

Bu ifade, verilen koşulların kesişimini alır. Eğer tüm koşulların değeri true ise sonuç da true olur. En az bir tane false değeri olan koşul varsa, sonuç false olur.

[Sadece Kayıtlı Kullanıcılar Linkleri Görebilir.Kayıt Olmak İçin Tıklayınız...]

| (Or)

Bu ifade, verilen koşulların birleşimini alır. Eğer tüm koşulların değeri false ise sonuç false olur. En az bir tane true değeri varsa sonuç true olur.

[Sadece Kayıtlı Kullanıcılar Linkleri Görebilir.Kayıt Olmak İçin Tıklayınız...]

&& (AndAlso)

Koşullardan biri False ise, diğerleri kontrol edilmeden False değeri döndürülür. Bu tip bir kullanım, birçok koşulun kontrol edilmesi gerektiğinde performansı arttırır.
string [] dizi;
// Diziye eleman ekleme işlemleri
// ...
if (dizi.Length > 0 && dizi[1].EndsWith("."))
{
label1.Text = "Cümle sonundaki kelime: " + dizi[1];
}
Bu örnekte, dizinin ilk elemanı üzerinde bir kontrol yapılmak isteniyor. Ancak diziye eleman eklenmemişse, ilk elemana ulaşırken hata üretilecektir. Dolayısıyla dizinin uzunluğunu da kontrol etmek gerekir. Kontrol And ifadesi ile yapılsaydı, dizi elemanın noktayla bitip bitmediği ve dizinin uzunluğu kontrol edilecekti. Bu durumda iç içe if ifadeleri ile uzun bir kod yazılacaktı. Pek çok kıyaslama gerekecek ve performans düşecekti. Ancak burada, dizi uzunluğu koşulu sağlanmazsa, diğer koşula geçilmeden if kontrolünden çıkılır.
|| (OrElse)

Koşullardan biri True ise, diğerleri kontrol edilmeden True değeri döndürülür.
string Rol;
// Veritabanından, kullanıcının rolü alınır.
// ...
// Sadece Administrator, Moderator ve Power User rolündeki
// kullanıcılar dosya silme işlemi yapabilirler.
if (Rol == "Administrator" || Rol == "Moderator"
|| Rol = "Power User")
{
// Dosya silme işlemleri
}
Dosya silme işlemi için, kullanıcının rolü veritabanından alındıktan sonra, kontrol işlemi yapılır. Eğer bir kullanıcın rolü Administrator, Moderator veya Power User rolünden biriyse diğer kontrollerin yapılması gerekmez. Bu örnekte Rol değişkeni Administrator değerine eşitse, diğer iki koşul kontrol edilmeden true ifadesi döner.
! (Değil)

Bir koşulun değerini tersine çevirir. Koşul false ise true, true ise false olur.

[Sadece Kayıtlı Kullanıcılar Linkleri Görebilir.Kayıt Olmak İçin Tıklayınız...]

if else

else ifadesi, if yapısındaki koşulun sağlanmadığı bütün durumlarda devreye girer.
if(Koşul)
{
//Diğer kodlar
}
else
{
//Diğer kodlar
}
Örnek: Her 100 milisaniyede bir, formun renginin siyahken beyaz olması, beyazken ise siyah olması için, formun renginin kontrolü yapılması gerekiyor.
public bool Beyaz = true;
private void timer1_Tick(object sender, System.EventArgs e)
{
if(Beyaz)
{
this.BackColor = Color.Black;
Beyaz = false;
}
else
{
this.BackColor = Color.White;
Beyaz = true;
}
}
if kontrolünde formun beyaz olup olmadığı bool tipindeki bir değişkende tutuluyor. Koşulda beyaz adlı değişken eğer true ise, formun arka planı siyah yapılır. Bu koşulun sağlanmadığı durumda, yani beyaz değişkeninin false olduğu durumda, else içindeki kodlar çalışacaktır ve formun arka planı beyaz yapılacaktır. Her kontrolden sonra beyaz değişkenin değiştirilmesinin nedeni, formun bir siyah bir beyaz olması istendiği içindir.
else if

if deyimindeki koşul sağlanmadıysa else deyimindeki kodlar çalışıyordu. Ancak bazı durumlarda else içinde de kontrol yapmak gerebilir.
if(Koşul)
{
}
else if(Koşul2)
{
}
else if(Koşul3)
{
}
Örnek: Günün saatine göre karşılama mesajı çıkartmak için, saat değişkeni birçok kez kontrol edilmesi gerekir. Sadece bir if kontrolü yapılsaydı, sadece iki karşılama mesajı çıkartılabilirdi.
string karsilamaMesaji = " BilgeAdama hoşgeldiniz!";
int saat = DateTime.Now.Hour;
if ((9 <= saat && saat < 12))
{
karsilamaMesaji = karsilamaMesaji.Insert(0, "Günaydın,");
}
else if (12 <= saat && saat < 16)
{
karsilamaMesaji = karsilamaMesaji.Insert(0, "İyi günler,");
}
else if (16 <= saat && saat < 18)
{
karsilamaMesaji = karsilamaMesaji.Insert(0, "İyi akşamlar,");
}
// Formun başlığı karşılama mesajını
// gösterecek şekilde ayarlanır
this.Text = karsilamaMesaji;
switch

switch deyimi else if ile benzer işlevi görür, ancak okunması daha kolaydır. switch ile seçilen bir değerin kontrol edilmesi Case ifadelerinde yapılır.
string karsilamaMesaji = " BilgeAdama hoşgeldiniz!";
int saat = DateTime.Now.Hour;
switch (saat)
{
case 9:
case 10:
case 11:
karsilamaMesaji = karsilamaMesaji.Insert(0, "Günaydın,");
break;
case 12:
case 13:
case 14:
case 15:
karsilamaMesaji = karsilamaMesaji.Insert(0, "İyi günler,");
break;
case 16:
case 17:
karsilamaMesaji = karsilamaMesaji.Insert(0, "İyi akşamlar,");
break;
default:
karsilamaMesaji = karsilamaMesaji.Insert(0, "Merhaba,");
break;
}
Buradaki switch kullanımı, saat değerine göre işlem gerçekleştirilmesidir. Sayı, case ifadelerinde verilen değerler eşitse ilgili kodlar çalıştırılır. default ise, diğer koşulların sağlanmadığı tüm durumlarda devreye girer.
break ifadesi, kontrolün durması gerektiğini belirtir. Sayının belli değerler aralığında kontrolü yapılması için boş case ifadeleri kullanılır.
Hangi Karar Cümlesi Nerede Kullanılır?

if ve switch karar yapıları benzer işlevler görseler de kullanım yerlerine ve birbirlerine göre değişik avantajları vardır. if else if karar yapılarında, kontrol edilen değişkenlerin ya da değerlerin her seferinde tekrar yazılması gerekir. Bu durumda switch karar yapısı, kodların yazılışını ve okunuşunu kolaylaştırması açısından tercih edilmelidir. Ancak switch ile belli değerler aralığında kontrol yapılması, case ifadelerinin ardı ardına yazılması gerektiği için zordur.
Bir grup RadioButton kontrolü içinden sadece bir tanesi seçilebildiği için, seçilen kontrolü bulmak için else if yapısının kullanımı yeterli olacaktır.
if (RadioButton1.Checked)
{
}
else if (RadioButton2.Checked)
{
}
else if (RadioButton3.Checked)
{
}
Ancak bu kontroller, CheckBox kontrolünün kullanım yapısına uymaz. Formlarda birden fazla CheckBox kontrolü seçilebildiği için, seçilen kontrolleri bulmak için sadece if blokları kullanılmalıdır.
if (CheckBox1.Checked)
{
}
if (CheckBox2.Checked)
{
}
if (CheckBox3.Checked)
{
}
Uygulama

Bu uygulama kullanıcıya, stok durumuna veya tarihe göre değişen görüntüleme seçenekleri sunarak, ürün katalogu tanıtılır. Ürünler kategorilere göre ayrılmış bulunmaktadır ve ComboBox kontrolleri ile filtrelerden biri seçilmediği takdirde işlem gerçekleşmez.
Stok durumu filtresi ile sadece stokta bulunan ya da stokta kalmamış satılmakta olan ürünler listelenebilir. Tarihe göre filtreleme ile yeni çıkan ürünler ya da tüm ürünler gözlenebilir.
Uygulamada, akış diyagramından koda geçiş aşaması rahat bir şekilde görülecektir.
Algoritmanın incelenmesi

Uygulamanın algoritması başlangıç ve ürün ekleme algoritması olarak ikiye ayrılmıştır.
Başlangıç algoritmasında ürün kategorisinin, stok durumu ve tarih filtrelerin seçilip seçilmediği kontrolü yapılır. Eğer herhangi biri seçilmediği zaman kullanıcıya ilgili mesaj gösterilir ve algoritmadan çıkılır. Tüm kontroller yapıldıktan sonra, ilgili kategorideki ürünlerin listeye eklenmesi için diğer algoritma devreye girer.

Ürün ekleme algoritması, ilk algoritmada seçilen kriterlere göre, kullanıcıya gösterilecek ürün listesini doldurur. Bu algoritma başlangıç olarak kategori numarasını alır. Bu kategorideki stokta bulunan ürünleri listeye ekler. Stok durumu filtresinde “Hepsi” değeri seçiliyse, stokta o an bulunmayan ürünler de listeye eklenir. Tarih filtresinde “Son çıkanlar” değeri seçiliyse, eski ürünler listeden çıkartılır.

Forma kontrollerin eklenmesi

1. UrunYelpazesi isminde bir Visual C# Windows Projesi açın.
2. Forma biri lbUrunler diğeri lbKategoriler isminde iki ListBox kontrolü ekleyin. lbUrunler liste kutusu tüm filtreler uygulandıktan sonra çıkan ürünleri listeler. lbKategoriler liste kutusuna kategori isimleri ekleyin:
· Video
· Kitap
· Yazılım
3. Forma biri cmbTarihSirasi diğeri cmbStokDurumu isminde iki ComboBox kontrolü ekleyin. cmbTarihSirasi son ürünleri; cmbStokDurumu stoktaki ürünleri gösteren filtre olarak kullanılacaktır. cmbTarihSirasi elemanlarına “Son Çıkanlar” ve “Tüm Ürünler” değerlerini, cmbStokDurumu elemanlarına “Sadece Stoktakiler” ve “Hepsi” değerlerini ekleyin.
4. lblMesaj isminde bir Label kontrolü ekleyin. Dock özelliğini Buttom yapın. Bu kontrol filtrelerin seçilmediği durumda hata mesajlarını gösterecektir.
5. lblSecilenUrunler isminde bir Label kontrolü ekleyin ve lbUrunler liste kutusunun üstüne yerleştirin. Bu kontrol, seçilen ürünlerin hangi kategoride olduğunu gösterecektir.
6. Forma btnListele isminde bir Button kontrolü ekleyin.
Kodların yazılması

Bu uygulamada kodların tamamı btnListele düğmesinin Click olayına yazılacaktır. Kodlar arasındaki numaralar akış diyagramında işlenen durumlara referans gönderir. Algoritma 1, başlangıç algoritmasındaki numaraları; Algoritma 2, ürün ekleme algoritmasındaki numaraları ifade eder.
1. btnListele düğmesine çift tıklayın ve Click olayına gelin. Düğmeye her basıldığında liste kutusuna ardı ardına öğeler eklenmemesi ve hata mesajlarının temizlenmesi için gerekli kodları yazın.
lblMesaj.Text = "";
lbUrunler.Items.Clear();
2. Kategori listesinden, stok ve tarih filtreleri için açılan kutulardan öğelerin seçili olup olmadığı kontrolü yapılır. Eğer seçilmemiş bir değer varsa, ilgili hata mesajı lblMesaj etiketinde görüntülenir.
// Algoritma 1 - 1
if ( cmbStokDurumu.SelectedIndex == -1 && cmbTarihSirasi.SelectedIndex == -1 ) {
lblMesaj.Text = "Stok Durumu ve Tarih Sırası seçiniz.";
// Algoritma 1 - 2
}
else if ( cmbStokDurumu.SelectedIndex == -1 ) {
lblMesaj.Text = "Stok Durumunu seçiniz.";
// Algoritma 1 - 3
}
else if ( cmbTarihSirasi.SelectedIndex == -1 ) {
lblMesaj.Text = "Tarih Sırasını seçiniz.";
// Algoritma 1 - 4
}
else if ( lbKategoriler.SelectedIndex == -1 ) {
lblMesaj.Text = "Kategori seçiniz.";
}
else {
// Algoritma 1 - 5
3. if else if deyimlerinde tüm kontroller yapıldıktan sonra else ifadesine geçilir. Algoritmanın akışı bundan sonra ürün ekleme işlemiyle devam edecektir.
switch ( lbKategoriler.SelectedIndex ) {
case 0:
// Sadece stokta bulunan ürünler eklenir.
// Algoritma 2 - 2
lbUrunler.Items.Add( "MSDN Tv Visual C# 5" );
lbUrunler.Items.Add( "MSDN Tv Visual C# 4" );
// Stokta bulunan veya bulunmayan ürünlerin Hepsi
// seçiliyse, kalan ürünler de listeye eklenir.
// Algoritma 2 - 3
if ( cmbStokDurumu.SelectedIndex == 1 ) {
// Algoritma 2 - 4
lbUrunler.Items.Add( "MSDN Tv Visual C#" );
lbUrunler.Items.Add( "MSDN Tv Visual C# 2" );
lbUrunler.Items.Add( "MSDN Tv Visual C# 3" );
}
// Eski ürünlerin gösterilmesi istenmiyorsa
// listeden çıkartılır.
// Algoritma 2 - 5
if ( cmbTarihSirasi.SelectedIndex == 0 ) {
// Algoritma 2 - 6
lbUrunler.Items.Remove( "MSDN Tv Visual C#" );
lbUrunler.Items.Remove( "MSDN Tv Visual C# 2" );
}
break;
4. Diğer iki kategori için liste ekleme işlemleri aynıdır.
case 1:
lbUrunler.Items.Add( "Yazılım Uzmanlığı 1" );
lbUrunler.Items.Add( "Yazılım Uzmanlığı 2" );
lbUrunler.Items.Add( "Yazılım Mühendisliği Orta Dzey" );
lbUrunler.Items.Add( "Yazılım Mühendisliği İleri Dzey" );
if ( cmbStokDurumu.SelectedIndex == 1 )
{
lbUrunler.Items.Add( "Yazılım Mühendisliği Başlangıç Düzeyi" );
lbUrunler.Items.Add( "Access Giriş" );
}
if ( cmbTarihSirasi.SelectedIndex == 0 )
{
lbUrunler.Items.Remove( "Yazılım Uzmanlığı 1" );
}
break;
case 2:
lbUrunler.Items.Add( "Visual Studio 6.0" );
lbUrunler.Items.Add( "Visual C# .NET Standard 2003" );
lbUrunler.Items.Add( "Visual C# C# Standard 2003" );
if ( cmbStokDurumu.SelectedIndex == 1 )
{
lbUrunler.Items.Add( "Visual Studio .NET 2005" );
}
if ( cmbTarihSirasi.SelectedIndex == 0 )
{
lbUrunler.Items.Remove( "Visual Studio 6.0" );
}
break;
}
5. swicth ifadesinde tüm eklemeler yapıldıktan sonra ikinci algoritma biter. İlk algoritmanın son aşaması olan, kullanıcıya hangi kategoride ürün seçildiğini gösteren mesaj yazılır ve if karar yapısı sonlanır.
// Algoritma 1 - 6
lblSecilenUrunler.Text = lbKategoriler.Text + " Kategorisindeki Ürünler";
}
Konu 2: Döngüler

Algoritmalarda bazı işlemlerin tekrar çalışması için, onları her seferinde yazmak gerekir. Ancak bu çözüm, çok fazla tekrar için hem yazmayı hem de okumayı zorlaştırır. Örneğin yüz elemanlı bir diziye rasgele sayı atanması için işlemin yüz defa yazılması gerekir. Döngüler ile işlem sadece bir defa yazılır ve tekrar sayısına göre bu işleme geri dönülür.

Bu bölüm tamamlandıktan sonra
· For ve While döngüsünü tanıyacak,
· İç içe döngüler kullanabilecek,
· Hangi döngünün nerede kullanıldığını öğreneceksiniz.
For

For döngüsü bir işlemin belirli sayıda yapılması için kullanılır.
for (int i = 0; i < 10; i++)
{
MessageBox.Show(“Merhaba”);
}
Bu döngüde 3 parametre vardır.
· İlk parametre sayacın başlangıç değerini belirler. Örnekte, sayaç değişkeni tanımlanıp 0 değeri atanmıştır.
· İkinci parametre bir koşul ifadesidir. Bu koşul sağlandığı sürece döngü devam eder. Örnekteki döngü, i değeri 10dan küçük olduğu sürece devam edecektir.
· Üçüncü parametre, her döngüden sonra yapılması gereken işlemi belirtir. Örnekte, her işlemden sonra i değeri bir artırılır.
Döngülerde kullanılan sayaçlar sadece belli bir sayıda işlem yapmayı sağlamaz. Sayaçların artma veya azalma adımları belirli olduğu için, kod içersinde çoğu zaman bu avantajdan yararlanılır.
listBox1.Items.Add("Karakter - ASCII kod karşılığı");
for (int i = 50; i <= 255; i = i + 2)
{
listBox1.Items.Add(Microsoft.VisualBasic.Strings.C hr(i) & " - " & i)
}
Örneğin dizi işlemlerinde, dizinin her elamanına ulaşmak için sayaç kullanılabilir. Sayacın artma hızı bir olduğu için dizi[sayac] ifadesi, sırayla dizinin elemanlarına ulaşmayı sağlar.
int [] dizi = new int[10];
Random r = new Random();
for (int i = 0; i < dizi.Length ; i++)
{
dizi[i] = r.Next(100);
}
DİKKAT: Değişken tanımlamaları For döngüsünün içinde de yapılabilir. Bu durumda, değişkenin kapsam alanı bu döngüyle sınırlı kalır.
For döngülerinin iç içe kullanımı

Çoğu zaman For döngülerindeki her etap için başka bir döngünün kurulması gerekir. Örneğin bir müşterinin birden fazla telefon numarası bir dizi içinde tutuluyorsa, bütün müşterilerin telefonlarını listelemek için iki döngü kullanılması gerekir. İlk döngü tek tek müşterileri almak için, alt döngü ise her müşterinin telefonlarını almak için kullanılmalıdır.

public struct Musteri {
public string Isim;
public string Soyad;
public string[] Telefonlari;
}
public Musteri[] Musteriler;
// Musteriler dizisi dolduruyor
// ...
private void Button1_Click( System.Object sender, System.EventArgs e )
{
int i, j;
for ( i=0; i<=Musteriler.Length - 1; i++ ) {
// lk mteri seiliyor
Musteri m = Musteriler[ i ] ;
Label1.Text += m.Isim + " " + m.Soyad;
Label1.Text += " müşterisinin telefonları:" + "\n";
for ( j=0; j<=m.Telefonlari.Length - 1; j++ ) {
Label1.Text += m.Telefonlari[ j ] ;
Label1.Text += "\n";
}
}
}
Birden fazla boyutlu dizilerde işlem yaparken de For döngüsü iç içe kullanılabilir. Örneğin iki boyutlu bir tabloda, ilk boyut için bir for döngüsü, diğer boyut için de başka bir for döngüsü kullanılarak dizinin tüm elemanlarına ulaşılabilir.
Random r = new Random();
string[,] tablo = new string[ 5, 5 ];
byte i = 0;
for ( i=1; i<=4; i++ )
{
tablo[ 0, i ] = "Yazar " + i;
tablo[ i, 0 ] = "Kitap " + i;
tablo[ ( ( int )( r.Next(3)) ) + 1, ( ( int )( r.Next(3) ) ) + 1 ] = "X";
}
tablo isminde String değerleri tutan bir dizi oluşturulur ve dizinin ilk satırına yazar isimleri, ilk sütununa da kitap isimleri konur. For döngüsünün sayacı birden başladığı için dizinin 0,0 koordinatlı ilk elemanına değer atanmaz.

[Sadece Kayıtlı Kullanıcılar Linkleri Görebilir.Kayıt Olmak İçin Tıklayınız...]

Daha sonra tablonun diğer elemanlarına rasgele X değerleri atanır. Bu değer hangi yazarın hangi kitabı yazdığını gösterecektir.
r.Next(3) + 1 ifadesi 1 – 4 arasında rasgele sayı üretir. Bu sayı tablo dizisine indis olarak verildiğinde ise, kalan hücrelerde X değeri elde edilir.

[Sadece Kayıtlı Kullanıcılar Linkleri Görebilir.Kayıt Olmak İçin Tıklayınız...]

Tablonun tüm elemanlarını listelemek için iç içe iki For döngüsü kullanılmalıdır.
for ( int j=0; j<=tablo.GetLength( 0 ) - 1; j++ )
{
for (int h=0; h<=tablo.GetLength( 1 ) - 1; h++ ) {
Label1.Text += System.Convert.ToString( tablo[ j, h ] );
}
Label1.Text += "\n";
}
Yazarlar ve Kitaplar tablosu hazırlandıktan sonra, hangi yazarın hangi kitabı yazdığını bulmak için yine tablo elemanları içinde dolaşıp X değerini aramak gerekir. İlk For döngüsü ile Kitaplar satırında, ikinci For döngüsü ile Yazarlar sütunlarında gezilir.
for (int j=0; j<=tablo.GetLength( 0 ) - 1; j++ )
{
for (int h=0; h<=tablo.GetLength( 1 ) - 1; h++ )
{
// Tablonun her elemanının değeri
// X değeri ile karşılaştırılır.
if ( tablo[ j, h ] == "X" ) {
Label2.Text = tablo[ 0, h ] + ", ";
Label2.Text += tablo[ j, 0 ];
Label2.Text += " kitabını yazıyor";
break;
}
}
Label1.Text += "\n";
}
Tablonun her elemanı kontrol edilir ve X değeri bulunduğu zaman yazar ismi ve kitap ismi ekrana yazdırılır. Yazar isimleri, dizinin ikinci boyutunun ilk sırasında tutulduğu için tablo[0,h] kodu ile ulaşılır. Kitap isimleri ise, dizinin ilk boyutunun ilk sırasında tutulduğu için tablo[j,0] kodu ulaşılır. Buradaki h ve j değişkenleri o anda kontrol edilen elemanın tablodaki indisleridir.
break ifadesi, o anda bulunan For döngüsünden çıkmayı sağlar. Bu örnekte ikinci For döngüsü yazarlar sütunu üzerinde döndüğü için, bu döngüden çıkıldığında, ilk For döngüsüne tekrar geçilir. Bu sefer yeni bir kitap için yazarlar kontrol edilir. Sonuçta bir kitabı birden fazla yazar yazmasına rağmen, görüntülenecek olan sadece ilk yazardır.
While

While döngüsü bir koşul gerçekleştiği sürece çalışan döngüdür.
while(Koşul)
{
}
Birden ona kadar olan sayıların toplamını hesaplamak için, bir ve on arasındaki sayılar tek tek yazılıp toplanabilir. İyi bir yöntem olmasa da sonucu verir. Ancak kullanıcının girdiği bir sayıya kadar toplam almak için bir döngü gerekir.
int toplam = 0;
int sayac = int.Parse(txtSayiGirisi.Text);
while (sayac > 0)
{
toplam += sayac;
sayac -= 1;
}
Burada kullanıcının girdiği sayıdan itibaren sıfıra kadar giden bir döngü kurulur. Döngü sayacın sıfırdan büyük olduğu her durum için çalışacaktır. Sayaç sıfırlandığında ise döngüden çıkılır.
Sonsuz Döngüler

While döngüsü sayaç ile kullanılırken, sayacın değiştirilmesine dikkat edilmesi gerekir. Eğer sayaç değiştirilmezse, While ifadesindeki koşul hep true değeri alacağı için sonsuz döngüye girilir.
Sadece sayacın kontrol edilmediği durumlarda değil, koşulların yazılmalarındaki mantık hataları da sonsuz döngüye sebebiyet verir.
int i = 0;
while (i < 10 | i > 5)
{
label1.Text = "Sonsuz döngüye girildi";
i += 1;
}
For döngüsünde sayaç, artırma ifadesindeki değerden fazla bir sayıda azaltılırsa yine sonsuz döngüye girilir. Bu döngünün çalışması, int veri tipinin alabileceği minimum değere ulaşınca hata ile sonlanır.
for(int i = 0; i <= 9; i += 3)
{
MessageBox.Show("Sonsuz döngü");
i -= 4;
}
Uygulama

Bu uygulamada, bir satranç tahtası üzerindeki bir filin hareket alanı hesaplanır. Satranç tahtası rasgele taşlarla doldurulur. Verilen bir koordinatta bulunan fil, çapraz hareketlerine göre nereye ilerleyebileceği bulunur. Eğer filin önünde bir taş varsa, bu taşın bulunduğu yere ve daha gerisine ilerleyemeyecektir. Filin dört bir yanına çapraz olarak hareket edebileceği göz önünde bulundurulması gerekir.
Tahtanın doldurulması

1. Satranc isminde bir Windows projesi açın.
2. Form üzerine lbHareketAlani isminde bir ListBox, btnGoster isminde bir Button ekleyin.
3. btnGoster düğmesinin Click olayına 8 x 8 boyutunda bir dizi tanımlayıp dolduran kodları yazın. Bu dizi bool tipinde değerler taşır. Verilen indisteki elemanın değeri true olması, o koordinatta bir taşın bulunduğunu belirtir.
lbHareketAlani.Items.Clear();
int a,b;
Random r = new Random();
bool[,] tahta = new bool[ 8, 8 ];
for ( a=0; a<=7; a++ ) {
for ( b=0; b<=7; b++ )
{
int sonuc = (r.Next() % 2);
if (sonuc == 1)
{
tahta[ a, b ] = true;
}
else
{
tahta[ a, b ] = true;
}
}
}
Hareket Alanı

Tahta üzerindeki bir fil, dört çapraz yöne doğru ilerleyebilir. Dizide çapraz olarak ilerlemek x ve y koordinatlarının eşit oranda artması ve azalması demektir. Dizide ilerlerken x ve y koordinatlarının sıfırdan küçük ve dizinin boyutundan büyük olmamasına dikkat edilmelidir. Dört farklı yöne göre, koordinatlar artacak ya da azalacaktır.
1. Fili tahta üzerine yerleştirmek için kullanıcıdan koordinatları alın.
byte x = byte.Parse( txtFilinXKoordinati.Text ) ;
byte y = byte.Parse( txtFilinYKoordinati.Text ) ;
2. 0, 0 yönüne doğru olan yoldaki taşların kontrolünü yapın. Filin x ve y koordinatlarını birer düşürerek, koordinatlarda taş var mı yok mu kontrol edilir. Eğer taş yoksa bu kareye ilerlenebildiğini, lbHareketAlani liste kutusuna koordinat eklenerek gösterilir. Yol üzerinde bir taş varsa, daha fazla ilerlenemeyeceği için While döngüsünden çıkılır.
int i = 1;
while ( x - i >= 0 & y - i >= 0 )
{
if ( !( tahta[ x - i, y - i ] ) ) {
lbHareketAlani.Items.Add((x - i).ToString() + " - " + (y - i).ToString() );
i += 1;
}
else {
break;
}
}
3. 7, 0 yönüne doğru ilerlenir ve olası hareketler liste kutusuna eklenir.
i = 1;
while ( x + i < tahta.GetLength( 0 ) & y - i >= 0 ) {
if ( !( tahta[ x + i, y - i ] ) ) {
lbHareketAlani.Items.Add( (x + i).ToString() + " - " + (y - i).ToString() );
i += 1;
}
else {
break;
}
}
4. 7, 7 yönüne doğru kontrol yapılır.
i = 1;
while ( ! ( x + i >= tahta.GetLength( 0 ) | y + i >= tahta.GetLength( 1 ) ) ) {
if ( !( tahta[ x + i, y + i ] ) ) {
lbHareketAlani.Items.Add( (x + i).ToString() + " - " + (y + i).ToString());
i += 1;
}
else {
break;
}
}
5. 0, 7 yönüne doğru taşlar kontrol edilir.
i = 1;
while ( x - i >= 0 & y + i < tahta.GetLength( 1 ) ) {
if ( !( tahta[ x - i, y + i ] ) ) {
lbHareketAlani.Items.Add( (x - i).ToString() + " - " + (y + i).ToString() );
i += 1;
}
else {
break;
}
}
Debug

Kodlar yazıldıktan sonra indislerin doğru kullanıldığını, döngülerde mantıksal hataları yapılmadığını kontrol etmenin en kolay yolu hata ayıklayıcı ile çalışmaktır. Bu örnekte birçok döngü kurulmuştur, filin dört hareket yönündeki engeller kontrol edilir. Tüm hareketlerin işleyişine Debug ile kolayca bakılır.
1. TextBox ile filin koordinatlarının alındığı yere BreakPoint koyun ve projeyi çalıştırın.
2. x ve y koordinatlarına 0 değerini girin. Filin, tahtanın sol üst köşesinde olduğu varsayılır.
Bu durumda fil hangi yönde ilerleyebilir? Step Into komutu ile kodlar arasında ilerleyin ve hangi döngü içine girdiğini bulun.
3. Locals panelinde i değişkeninin değerini izleyin. Aynı panelde tahta dizisinin, o anda kontrol edilen değerine bakın. x ve y değerlerinin bir fazlasını alarak, diğer değerin true ya da false olduğunu kontrol edin.
Konu 3: Hata Yakalama

Bir uygulama geliştiricisi program yazarken çok çeşitli hatalarla karşılaşabilir. Visual C# .NET ortaya çıkan hata durumlarında, çok detaylı hata mesajlarını uygulama geliştiricisine gönderir. Bu hata mesajları, hataların nerede, nasıl yapıldığını çok detaylı bir şekilde gösterir. Hataların en ince ayrıntısına kadar işlenmesi, uygulama geliştirmede büyük kolaylık sağlar.
Visual C# .NET hata mesajları, çalışma zamanı (Run Time) ve tasarım zamanı (Design Time) hataları olarak ayrılabilir.
Tasarım zamanı hataları, kodların yazılması sırasında derleyici tarafından bulunan ve Task List panelinde gösterilen hatalardır. Task List panelinde hatanın açıklaması, hatanın projenin hangi dosyasında ve dosyanın kaçıncı satırında bulunduğunu gösterir. Tasarım zamanı hataları sözdizimi yanlış kullanıldığında meydana gelir.
Çalışma zamanı hataları, uygulama çalışırken yapılması imkânsız bir işlemin gerçekleştirilmesi sırasında meydana gelir. Örneğin TextBox ile bir sayının alınması sırasında, kullanıcı String tipinde bir değer girerse çalışma zamanında bir hata oluşur.
int []dizi = new int[10];
for (int i = 0; i <= dizi.Length; i++)
{
Label1.Text &= dizi(i)
}

Buradaki hata mesajı, dizinin büyüklüğünün dışında bir indis verildiğini belirtir.
Visual C# .NET dilinde uygulama geliştirirken oluşabilecek tüm hatalar .NET FrameWork çatısı altında Exception sınıfları halinde tanımlanır. Örneğin dizinin büyüklüğünden farklı bir indis verildiğinde IndexOutOfRangeException hatası ortaya çıkar. Tüm hatalar gibi bu hata da Exception taban sınıfından türemiştir.
Try Catch Finally

Çalışma zamanında ortaya çıkan hatalar uygulamanın beklenmedik bir şekilde sonlanmasına neden olur. Uygulamanın devam etmesi için bu hataların yakalanıp işlenmesi gerekir. Try Catch Finally blokları içinde, çalışma zamanı hataları meydana geldiği durumlarda çalışması istenen kodlar yazılır. Try bloğu içine, çalışırken hata üretebilecek kodlar yazılırken, Catch bloğu içine, hata oluştuğunda yapılması gereken işlemler yazılır.
int sayi, sonuc;
try
{
Random r = new Random();
sayi = r.Next(3);
sonuc = 100 / sayi;
MessageBox.Show("Bölme işlemi başarılı, sonuç: " + sonuc.ToString());
}
catch (Exception ex)
{
MessageBox.Show("Bölme işlemi başarısız. Hata Mesajı: " + ex.Message);
}
Bu örnekte üretilen rasgele bir sayı ile bölme işlemi yapılıyor. Sayı sıfır değerini aldığında bölme işlemi hata üretecektir. Dolayısıyla bu işlem Try bloğu içine yazılmalıdır. Catch bloğunda, işlemin başarısız olduğunu belirten bir mesaj yazılır. Exception nesnesinin Message özelliği, hatanın oluştuğu zaman üretilen mesajı tutar. Exception nesnesinin özellikleri Catch içinde kullanılmayacaksa, tanımlanmasına gerek yoktur.
try
{
}
Catch
{
label1.Text = "Exception kullanılmıyor.";
}
Finally bloğunda, Try Catch içinde yapılan tüm işlemlerden sonra çalıştırılacak kodlar yazılır. Finally bloğunda yazılan kodlar hata meydana gelse de gelmese de çalıştırılacaktır.
try
{
// Dosya aç
// Dosya işlemleri
}
catch (Exception ex)
{
// Dosya açılırken veya işlem yapılırken
// hata meydana geldi.
}
finally
{
// Dosya kapat
}
Finally bloğunda, genellikle, kullanılan kaynaklar serbest bırakılır. Örnekte, bir dosya açılıyor. Dosya açma veya dosyaya veri yazma işlemlerinde bir hata meydana geldiğinde, Catch ifadesinde bu hata yakalanıp ilgili mesaj kullanıcıya gösterilir. Finally bloğu her halükarda çalışacağı için dosya kapama işlemi burada yapılır.
Lab 1: Şifreleme Algoritması

Bu uygulamada, verilen bir yazı şifrelenerek bir dizi sayıya çevrilir. Bu sayılar, yazıda geçen karakterlerin Ascii kodlarının karışmış bir halidir. Şifreyi çözmek için, şifrelemede izlenen yolların tersi uygulanır.
İPUCU: Şifreleme algoritmalarında yazıyı şifrelerken izlenen yolların geri dönüşü olmalıdır. Örneğin rasgele sayılar kullanılarak şifrelenen bir yazıyı, tekrar rasgele sayılar kullanarak çözülemez.
Şifreleme:

Verilen yazının şifrelenmesi üç etaptan oluşur:
· Yazının karakterleri Ascii kodlarına çevrilir.
· Kodlar, gerekiyorsa başlarına 0 konarak, 4 haneli yapılır ve sıralı halde bir String değişkeninde tutulur.
· Sıralı şekilde yazılan kodlar, bir baştan bir sondan karakter alınarak tekrar düzenlenir.
Örnek: “acf” kelimesinin şifrelenmesi:
· a c f karakterleri Ascii kodlarına çevrilir.
a = 97
c = 99
f = 102
· Kodlar başlarına sıfır konarak 4 haneli yapılır.
0097
0099
0102
Sıralı halde bir String değişkenine yazılır.
009700990102
· Sayının ortasına kadar, önce baştan daha sonra sondan rakam alınarak tekrar yazılır. Siyah olarak gösterilen rakamlar, dizinin sonundan alınmıştır.
0
0 2
0 2 0
0 2 0 0
0 2 0 0 9
0 2 0 0 9 1
0 2 0 0 9 1 7
0 2 0 0 9 1 7 0
0 2 0 0 9 1 7 0 0
0 2 0 0 9 1 7 0 0 9
0 2 0 0 9 1 7 0 0 9 0
0 2 0 0 9 1 7 0 0 9 0 9 = Şifre
Projenin açılması

1. Visual Studio ortamında, Sifreleme isminde bir Windows projesi açın.
2. Açılan forma lblSifre isminde bir Label kontrolü, btnSİfrele isminde bir Button kontrolü ekleyin. Bu kontroller kullanıcıdan alınan yazının şifrelenip görüntülenmesini sağlayacaktır.
3. Açılan forma lblDesifre isminde bir Label kontrolü ve btnSİfreyiCoz isminde bir Button kontrolü ekleyin. Bu kontroller şifrelenmiş yazının lblSifre kontrolünden alınarak, şifrelenip görüntülenmesini sağlayacaktır.
DİKKAT: Şifreleme algoritmasının tüm kodları btnSifrele kontrolünün Click olayına yazılacaktır.
Ascii Kodlarına Çevirme


1. Şifrelenecek yazının girilmesi için gerekli kodu yazın. Bir yazı girilene kadar kullanıcıdan yazı istemek için do while döngüsünü kullanın.
string yazi = null;
// Algoritma 1 - 1
do {
yazi = txtSifrelenecekYazi.Text;
}
while ( ! ( yazi.Length > 0 ) );
2. Girilen yazının karakterlerini bir dizide toplamak için String değişkeninin ToCharArray() metodunu kullanın.
// Algoritma 1 - 2
char[] karakterler = yazi.ToCharArray();
3. Karakterlerin Ascii kodu karşılığını tutmak için kodlar isminde bir dizi yaratın. Karakterler dizisindeki tüm elemanlar üzerinde işlem yapmak için bir döngü kurun. Karakterler dizisindeki her karakteri Asc hazır fonksiyonu ile Ascii koduna çevirin.
int uzunluk = karakterler.Length - 1 ;
string[] kodlar = new string[ uzunluk + 1 ];
int i;
// kelimedeki her karakterin ASCII kodu alınır
for ( i=0; i<=uzunluk; i++ )
{
// Algoritma 1 - 3
kodlar[ i ] = ( Microsoft.VisualBasic.Strings.Asc( karakterler[ i ] ) ).ToString();
}
4. Bu algoritma sonunda elde edilen kodlar dizisi, şifrelenecek olan yazının her karakterinin Ascii kodunu tutar. Bu dizi diğer algoritmanın giriş değeri olarak kullanılacaktır.
Sıralı Kodlara Çevirme

Ascii karakter kodları 0 – 255 arasında değer alır. Dolayısıyla her kod maksimum üç haneli olacaktır. Şifre oluşturulurken yapılan son düzenlemede kolaylık sağlamak için, bu kodlar 4 haneli yapılır. Daha sonra bu kodlar diziden çekilerek SiraliKodlar adlı bir String değişkenine yazılır.

1. Dizideki kodları sıralı bir şekilde tutmak için SiraliKodlar adlı bir değişken tanımlayın. İlk algoritmadan alınan Ascii kodlarını tutan kodlar dizisi üzerinde bir döngü kurun.
string SiraliKodlar = null;
short j = 0;
while ( j <= kodlar.Length - 1 ) {
j += 1;
}
DİKKAT: 2 – 4 etaplarında yazılacak tüm kodlar While döngüsünün içine yazılacaktır.
Bu döngüde kullanılacak Ascii kodunu bir değişkene atan kodu yazın.
// Alogritma 2 - 1
string AsciiKodu = kodlar[ j ];
2. AsciiKodu değişkeninde tutulan kodun 4 haneli hale getirilmesi için kaç tane sıfır eklenmesi gerektiğini bulun. Eklenecek sıfırların sayısı, 4 – AsciiKodu değişkeninin uzunluğu kadardır. Örneğin 192 kodlu bir değişkene eklenmesi gerenken sıfır sayısı 4 – 3 = 1 tanedir.
byte eklenecek = System.Convert.ToByte( 4 - AsciiKodu.Length );
3. Eklenecek sayı kadar çalışacak bir döngü içinde, sıfır ekleme işlemini yapın.
for ( i=0; i<=eklenecek - 1; i++ ) {
// Alogritma 2 - 3
AsciiKodu = AsciiKodu.Insert( 0, "0" );
}
4. Düzenlenmiş AsciiKodu, SıralıKodlar değişkenine yazın ve sayacı bir artırarak diğer Ascii koduna geçin.
// Alogritma 2 - 4

SiraliKodlar += AsciiKodu;

j += 1;

Algoritma sonunda ortaya çıkan değer, karakterlerin 4 haneli Ascii kodlarını tutan bir String değişkenidir. Bu değişken diğer algoritmada, tekrar düzenlenmek üzere kullanılacaktır.

Şifrenin oluşturulması

Bir önceki algoritmada elde edilen SıralıKodlar değişkeni halen istenilen şifreli yazı değildir. Çünkü 4 haneli kodlar sıralı bir şekilde durur ve kolayca çözülebilir. Şifrenin ilk bakışta anlaşılmasını daha da zorlaştırmak için, sıralanmış kodlar biraz daha karıştırılır.

1. Döngüde kullanılacak J sayacını sıfırlayın ve şifrenin tutulacağı değişkeni tanımlayın
// Algoritma 3 - 1
j = 0;
string Sifre = null;
2. SıralıKodlar değişkeni üzerinde yapılacak işlem sayısı, bir baştan bir sondan ilerlendiği için, değişkenin uzunluğunun yarısı kadardır. Sayacın bu uzunluğa kadar tanımlı olan bir döngü oluşturun.
// Algoritma 3 - 2
while ( j < SiraliKodlar.Length / 2 ) {
j += 1;
}
DİKKAT: 3 – 4 etaplarında yazılacak tüm kodlar Do While döngüsünün içine yazılacaktır.
3. Şifreye, SıralıKodların j indisli karakterini ekleyin.
//Algoritma 3 - 3
Sifre &= Mid(SiraliKodlar, j + 1, 1)
4. Şifreye, SıralıKodların uzunluk – j indisli karakterini ekleyin.
// Algoritma 3 - 3
Sifre += Strings.Mid( SiraliKodlar, j + 1, 1 );
5. Sonuç olarak çıkan şifre, girilen yazının Ascii kodlarının karışık düzende tutulması ile oluşturulur.
// Algoritma 3 - 4
Sifre += SiraliKodlar.Substring(SiraliKodlar.Length - j - 1, 1 );
Şifreyi Çözmek

Şifreleme algoritması kullanılarak oluşturulan şifrenin çözülmesi, izlenen yolların tersi uygulanarak gerçekleştirilir. Deşifre algoritması iki etaptan oluşur.
1. Bir baştan bir sondan karakter alınarak şifrelenen Ascii kodları, sıralı kodlar haline dönüştürülür.
2. 4 haneli olarak duran sıralı kodlar, karakterlere çevrilir. Karakterler ardı ardına konarak deşifre işlemi gerçekleştirilir.
Örnek: “acf” kelimesinin şifrelenmiş hali 020091700909 şeklindedir. Bu kelime şifrelenirken, karakterleri 4 haneli Ascii kodların çevrilmiş ve bu kodların rakamlarının sırası değiştirilmişti. Bu şifrenin önce 4 haneli sıralı kodlar haline getirilmesi için, şifrelenen yöntemin tersi işlenir. Sırayla okunan rakamlar önce başa daha sonra sona yazılır.
Şifre: 0 2 0 0 9 1 7 0 0 9 0 9
Sıralı kodlara çevrim:

[Sadece Kayıtlı Kullanıcılar Linkleri Görebilir.Kayıt Olmak İçin Tıklayınız...]

Sonuç olarak elde edilen sıralı Ascii kodları, sıranın ilk yarısı ve son yarınsın birleşimi olur: 0097 0099 0102
DİKKAT: Sıranın ilk yarısı oluşturulurken, rakamlar sona eklenir. Ancak sıranın son yarısı oluşturulurken rakamlar başa eklenir.
Bu 4 haneli kodlar String değerinden Integer değerine çevrilir ve bu değerlerin karşılığı olan karakterler yazılır.
0097 à 97 à a
0099 à 99 à c
0102 à 102 à f
Elde edilen karakterler birleştirildiğinde şifre çözülmüş olur: “acf”
DİKKAT: Deşifre algoritmasının tüm kodları btnSifreyiCoz kontrolünün Click olayına yazılacaktır.
Şifreyi Sıralı Kodlara Dönüştürme

Bu algoritma verilen şifreyi sıralı Ascii kodlarına dönüştürür.

1. Şifreyi lblSifre etiketinden alın ve sıralı kodların oluşturulması için gereken değişkenleri tanımlayın.
// Algoritma 1 - 1
string Sifre = lblSifre.Text;
string SiraliKodlar = null;
short i = 0;
// Başa ve sona rakam ekleneceği için
// değişkenlere başlangıç değerleri verilir
string ilkYarisi = "";
string sonYarisi = "";
2. Şifrenin tüm elemanları üzerinde bir döngü kurarak, sıralı kodların ilk ve son yarısını oluşturun. Kodların ilk yarısı, şifrenin tek haneli rakamları ile; kodların son yarısı, şifrenin çift haneli rakamları ile oluşturulur. Dolayısıyla döngünün sayacı ikişer ikişer artmalıdır. Şifrenin i indisli rakamını sıranın ilk yarısına, yanındaki rakamı (i + 1 indisli rakamı) sıranın son yarısına ekleyen kodları yazın.
for ( i=1; i<=System.Convert.ToInt16( Sifre.Length ); i+=2 )
// Algoritma 1 - 2
// Sıranın ilk yarısının sonuna rakam eklenir.
ilkYarisi += Strings.Mid( Sifre, i, 1 );
// Algoritma 1 - 3
// Sıranın son yarısının başına rakam eklenir.
sonYarisi = sonYarisi.Insert( 0, Sifre.Substring(i , 1 ) ); }
3. Sıralı kodların ilk yarısı ve son yarısı birleştirilir. Elde edilen değer, 4 haneli Ascii kodlarının sırayla tutulduğu bir String değeridir.
// Algoritma 1 - 4
SiraliKodlar = ilkYarisi + sonYarisi;
Sıralı Kodların Okunması

İlk algoritmada elde edilen sıralı Ascii kodları, bu algoritmada okunarak karakterlere çevrilir ve şifre çözülmüş olur.

1. Şifre çözüldüğü zamanki değerinin tutulacağı değişkeni tanımlayın ve sıralı kodlar üzerinde bir döngü kurun. Sıralı kodların 4 haneli kodlardan oluştuğu için, döngüde bir seferde 4 rakam alınacaktır. Bunun için döngünün sayacı 4 artırılmalıdır.
i = 0;
string yazi = "";
while ( i < SiraliKodlar.Length ) {
i += 4;
}
DİKKAT: 2 – 3 etaplarında yazılacak tüm kodlar Do While döngüsünün içine yazılacaktır.
2. Döngü her seferinde bir Ascii kodu alır. Bu değeri tutan bir değişken tanımlanır ve sıralı kodlardan 4 haneli rakam bu değişkene atanır.
int AsciiKodu;
// Algoritma 2 - 1
AsciiKodu = int.Parse( SiraliKodlar.Substring(i , 4 ) ) ;
3. Alınan Ascii kodunun karakter karşılığı bulunur ve yazi değişkenine eklenir.
// Algoritma 2 - 2
yazi += Microsoft.VisualBasic.Strings.Chr( AsciiKodu );
4. Döngü sonunda elde edilen değer lblDesifre etiketine yazılır.
// Algoritma 2 - 3
lblDesifre.Text = yazi;
Lab 2: Sıralama Algoritması

Bu algoritma, bir dizinin elemanlarını küçükten büyüğe sıralar.
Dizinin Doldurulması

1. Siralama isimli bir Windows projesi açın
2. Form üzerine biri lbSirasiz, diğeri lbSirali isimli iki ListBox ekleyin. Bu kontroller dizinin sırasız ve sıralı halini listeler.
3. btnListele ve btnSirala isimli iki Button ekleyin.
4. Formun kod tarafına geçin ve bir dizi tanımlayın. Bu dizi bir çok yordamın içinde kullanılacağı için global olarak tanımlanır.
public string[] dizi = new string[ 5 ];
5. btnListele düğmesinin Click olayına, diziyi karışık bir şekilde isimlerle dolduran kodları yazın:
dizi[ 0 ] = "Enis";
dizi[ 1 ] = "Engin";
dizi[ 2 ] = "Tamer";
dizi[ 3 ] = "Kadir";
dizi[ 4 ] = "Fulya";
int i;
for ( i=0; i<=dizi.Length - 1; i++ ) {
ListBox1.Items.Add( dizi[ i ] );
}
Dizinin Sıralanması

Sıralama algoritması, dizi üzerinde bir döngü kurar ve sırayla dizinin bir elemanı seçilir. Bu eleman için bir başka döngü kurulur ve seçilen elemanın indisine kadar olan tüm elemanlarla bir karşılaştırma yapılır. Küçük olan sıranın başına konmak için büyük olan ile yer değiştirilir.
Örnek

1. Dizinin 2. elemanı seçilir: “Engin”
Dizinin 2. indisine kadar olan elemanlarla karşılaştırılır. “Engin” değeri alfabetik sırada “Enis” değerinden küçük olduğu için, bu iki değer yer değiştirilir.
Sıra, Engin Enis Tamer Kadir Fulya olur.
2. Dizinin 3. elemanı seçilir: “Tamer”
Dizinin 3. indisine kadar olan elemanlarla karşılaştırılır. “Tamer” değeri, “Enis” ve “Engin” değerlerinden büyük olduğu için sıralama değişmez.
3. Dizinin 4. elemanı seçilir: “Kadir”
Dizinin 4. indisine kadar olan elemanlarla karşılaştırılır. “Kadir” < “Tamer” olduğu için bu iki değer yer değiştirilir.
Sıra, Engin Enis Kadir Tamer Fulya olur.
“Kadir” değeri , “Enis” ve “Engin” değerlerinden büyük olduğu için sıralama değişmez.
4. Dizinin 5. elemanı seçilir: “Fulya”
Dizinin 5. indisine kadar olan elemanlarla karşılaştırılır. “Fulya” < “Tamer” olduğu için bu iki değer yer değiştirilir.
Sıra, Engin Enis Kadir Fulya Tamer olur.
“Fulya” < “Kadir” olduğu için bu iki değer yer değiştirilir.
Sıra, Engin Enis Fulya Kadir Tamer olur.
Dizideki tüm değerler kontrol edildiği için algoritmadan çıkılır.

1. btnSirala düğmesinin Click olayına, dizi üzerinde bir döngü tanımlayın. Bu döngü dizinin (1 indisli) ikinci elemanından başlayarak dizi sonuna kadar devam edecektir. Daha sonra bu döngü içine başka bir döngü daha yazın. Bu döngü, ilk döngünün sayacından başlar ve sıfır olana kadar devam eder. İkinci döngünün amacı, ilk döngüde seçilen elemanı, dizinin başına kadar olan elemanlarla karşılaştırmaktır.
int i;
for ( i=1; i<=dizi.Length - 1; i++ ) {
int j = i;
while ( j != 0 && String.Compare(dizi[ j ], dizi[ j - 1 ]) == -1 ) {
// Yer değiştirme Algoritması
j -= 1;
}
}
While döngüsü, j değeri sıfır olana kadar ve dizinin kontrol edilen değeri bir önceki değerden küçük olana kadar devam eder. Burada, dizi elemanlarının kontrolünün sadece bir defa (bir önceki eleman ile) yapıldığı düşünülebilir. Ancak küçük eleman yer değiştirildiğinde j değeri bir düşürülür. Döngü tekrar çalıştığı zaman, aynı eleman bu sefer dizinin kalan elemanlarıyla karşılaştırılır.
AndAlso operatörü, j değerinin sıfır olma durumunda diğer kontrolün yapılmaması için kullanılır. Diğer kontrolde dizi(j – 1) ifadesi, negatif indisli değere ulaşılmak istendiği için hata mesajı verir.
2. Yer değiştirme algoritması, bir değişkenin değerinin geçici bir yerde tutulması ile gerçekleştirilir.

Sıralama algoritmasında dizinin j ve j - 1 indisli değerleri yer değiştirilir. While döngüsü içinde “Yer değiştirme Algoritması” yazan yorum satırını kaldırın ve yerine algoritma kodlarını yazın.
// Yer değiştirme
string temp = dizi[ j - 1 ];
dizi[ j - 1 ] = dizi[ j ];
dizi[ j ] = temp ;
3. lbSirali liste kutusunda dizinin yeni sırasını görüntüleyen kodları yazın.
for (int t=0; t<=dizi.Length - 1; t++ ) {
ListBox2.Items.Add( dizi[ t ] );
}
Lab 3: Arama Algoritması

Arama algoritmaları, sıralı bir liste üzerinde bir değerin aranmasıdır. Karışık sırada olan bir listede yapılan arama, ancak listenin başından sonuna kadar tüm elemanlarının kontrol edilmesi ile gerçekleşir. Bu yöntem büyük dizilerde performansı düşürür. Belirli bir sırada olan dizilerde ise daha hızlı arama yöntemleri kullanılmalıdır. Bu labda ikili arama yöntemi (Binary Search) incelenecektir.
DİKKAT: İkili arama yöntemi sadece sıralı bir dizi üzerinde uygulanabilir. Ya da elimizdeki dizi öncelikle sıralanır.
NOT: İkili arama yönteminde büyük küçük kıyaslaması yapıldığından dizinin sıralı olması gerekir.
Dizinin sıralanması

Arama algoritması sıralı bir dizi üzerinde çalışacağı için, dizi oluşturulduktan sonra sıralanması gerekir.
1. IkiliArama isminde bir Windows projesi açın.
2. Forma btnAra isimli bir Button ve lbDizi adlı bir ListBox ekleyin.
3. Kod sayfasına geçin ve global bir dizi tanımlayın.
public int[] dizi = new int[ 11 ];
4. Formun Load olayına diziyi rasgele sayılar ile doldurmak için gereken kodları yazın.
int i;
Random r = new Random();
for (i=0; i<=10; i++ )
{
dizi[ i ] = r.Next(1000);
}
5. Diziyi sıralayın ve değerlerini lbDizi adlı listeye ekleyin.
Array.Sort( dizi );
for ( i=0; i<=10; i++ ) {
ListBox1.Items.Add( dizi[ i ] );
}
Arama algoritması

İkili arama algoritması, dizi üzerinde aranacak değeri önce sıranın ortasındaki değerle karşılaştırır. Dizi küçükten büyüğe sıralı olduğu için, eğer aranan değer ortadaki değerden küçükse arama, dizinin ilk yarısında devam eder. Dizinin diğer yarısı aranan değerden büyük değerler içerdiği için, aramaya dâhil edilmez.
Örnek

Küçükten büyüğe sıralı dizi üzerinde 9 değeri aranacaktır.
Dizi: 1 2 4 7 9 10 12 18
1. Son, baş ve orta değişkenleri tanımlanır: Son değeri dizinin son elemanının indisini, baş değeri dizinin ilk elemanının indisini, orta değeri ise son + baş / 2 değerini alır. Orta değeri virgüllü bir değer alırsa tam sayıya çevrilir.
2. Başlangıç olarak baş -1, son dizi uzunluğu değerini alır.
Baş = -1
Son = 8
Orta = (8 – 1) / 2 = 3
3. Dizinin orta indisli değeri alınır. Dizi(3) = 7
4. Aranan 9 değeri, yediden büyük olduğu için, dizini son yarısında aranır. Baş değişkenine orta değeri verilirse, dizinin başlangıç indisi değiştirilir, böylece aramalar dizinin son yarısında gerçekleşmiş olur.
Dizi: 9 10 12 18
Baş = 3
Son = 8
Orta = (8 + 3) / 2 = 5
5. Dizinin orta indisli değeri alınır. Dizi(5) = 10
6. 9 değeri, ondan küçük olduğu için, kalan dizinin ilk yarısında aranır.
Dizi: 9 10
Baş = 3
Son = 5
Orta = (5 + 3) / 2 = 4
7. Dizinin ortasındaki değer alınır: 9
8. Böylece 9 değerinin indisi orta değeri olur.

Kodlar

Arama algoritmasının kodları btnAra düğmesinin Click olayına yazılacaktır.
1. Algoritma için gerekli bas, son ve orta değişkenlerini tanımlayın ve başlangıç değerlerini verin. Aranan değerin indisini tutmak için de bir değişken tanımlayın.
int son = dizi.Length;
int bas = -1;
int orta;
int indis;
2. Kullanıcıdan aranacak değeri girmesini isteyin.
int hedef = int.Parse(textBox1.Text);
3. Dizide aranacak değer kalmadığı zaman çıkan bir döngü kurun. Son ve bas değerleri arasındaki fark bire düştüğünde, dizide aranacak değer kalmamıştır.
while ( son - bas > 1 ) {
}
4. While döngüsü içine, dizinin orta indisli değerini alan ve bu değeri aranan değerle karşılaştıran kodları yazın.
orta = ( son + bas ) / 2;
if ( dizi[ orta ] > hedef ) {
son = orta;
}
else if ( dizi[ orta ] < hedef ) {
bas = orta;
}
else {
indis = orta;
MessageBox.Show( "İndis: " + indis.ToString());
return;
}
Eğer dizinin ortasındaki değer aranan değerse, indis bulunmuş demektir. orta değişkeni kontrolün yapıldığı değerin indisini tuttuğu için, sonuç orta değeri olur ve yordamdan çıkılır.
5. Eğer istenen değer bulunamadan döngüden çıkılırsa, indis -1 değerini alır. End While ifadesinden sonra, aranan değerin bulunamadığını belirten kodu yazın.
indis = -1;
MessageBox.Show( "İndis: " + indis + " Aranan değer bulunamadı");
Makale Sonu Soruları & Alıştırmalar

1. if ifadesi hangi veri tipini kontrol eder?
2. if - switch karar yapılarının farkları nelerdir?
3. true | false & false
(true | false) & false
ifadeleri hangi değerleri döndürür?
4. 4 boyutlu bir dizinin tüm elemanlarını doldurmak için, dizi üzerinde kaç tane döngü kurulmalıdır?
5. Uygulamaları derledikten sonra hatalar hangi yollarla görülebilir?
6. Finally bloğundaki kodlar ne zaman çalışır?
7. Sıralı arama yönteminde (Linear Search) dizinin elemanlarının sıralı olması gerekli midir?
8. Sıralı arama yöntemin bir dizi üzerinde uygulayın.
Kaynak : Yazılım Profesyoneli 1


__________________
bir silahım olsaydı...




hiç bir farklılık ayrımcılığa neden olamaz.
Hürriyet Hürriyettir.

silentwolf isimli Üye şimdilik offline konumundadır   Alıntı ile Cevapla
Cevapla


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 
Seçenekler
Stil

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık



Tüm Zamanlar GMT +3 Olarak Ayarlanmış. Şuanki Zaman: 01:09.


Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.6.0
User Alert System provided by Advanced User Tagging v3.0.6 (Lite) - vBulletin Mods & Addons Copyright © 2020 DragonByte Technologies Ltd.
ForumTayfa

Arşiv: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 95 96 97 98 99 100 102 103 104 105 106 155 156 157 158 159 160 161 162 163 164 167 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271


ForumTayfa - Link Değişimi
Telinka İletişim | Voip Ürünleri | Link Değişimine Katılın |

Sitemiz bir forum sitesi olduğundan dolayı, kullanıcılar her türlü görüşlerini önceden onay olmadan anında siteye yazabilmektedir. ForumTayfa Yöneticileri mesajları itina ile kontrol etse de, bu yazılardan dolayı doğabilecek her türlü sorumluluk yazan kullanıcılara aittir. Yine de sitemizde yasalara aykırı unsurlar bulursanız [email protected] email adresine bildirebilirsiniz, şikayetiniz incelendikten sonra en kısa sürede gereken yapılacaktır.

Any member of our web site has the right of adding comments instantly without getting permisson due to the forum structure of our site basis. Althought, our site modarators check comments with care, all the responsibilities sourced from these comments directly belong to the members. If you still find any illegal content in our site ( A.buse, H.arassment, S.camming, H.acking, W.arez, C.rack, D.ivx, Mp.3 or any Illegal Activity ), please report us via [email protected] .Your reports will be evaluated as soon as the arrival of your e-mail.