C# Eğitimleri – For Döngüsü 2 – For Loop 2

C# Eğitimlerimizde bir önceki yazımda For Döngüsüne giriş yapmıştık. O yazımda for döngüsünün neden ve nasıl kullanıldığını biraz teknik sayılabilecek şekilde anlattım. Bu yazımda for döngüsü ile bir kaç örnek gerçekleştirerek olayın tam olarak anlaşılmasını sağlamaya çalışacağım.

For döngüsü bildiğiniz gibi belli kod bloklarını istediğimiz kadar tekrar çalıştıran yapılardı.

İlk basit örneğimizle olaya başlayalım.

Örnek Çözümler

  • Bir listbox içine 1 den 10 a kadar sayıları sırası ile yazdıralım.

Bu noktada for döngüsünü bilmiyor olsaydık yapacağımız işlemi görelim.

Gördüğümüz gibi yazdırdı. Ama ne kadar mantıklı duruyor bu kodlama onu sorguladığımızda çokta mantıklı olmadığı kanısına kolayca varabiliriz.

Böyle bir kodlamanın kusurlarını sıralayacak olursak;

  • Tüm değerler static bu değerlerle dinamik işleri yapmanın imkanı yok. Yani programın her anında ne olacağını net bilmemizi gerektirir. Eğer bunu yapabilirsek tümü static olan değerlerimizle işlem yapabiliriz.

DipNot: Static kelimesinin anlamı sabit değer demektir. Yani programın her yerinde son değeri ile kullanılmasını sağlayacak değerler.

  • Yazdırılacak ifade 10 tane belki 100 tane ise bir noktaya kadar mantıklı olduğunu düşünebiliriz. Ama yazdıracağımız kayıt 1 milyon tane olsa. Olmaz demeyin büyük firmaların kendi yapılarında tuttukları kayıt sayıları için 1 milyon 2 milyon gibi değerler basit değerler. İşte böyle bir durum için iş işin içinden çıkılmaz bir hal alacaktır.

 

  • Aynı zamanda bu bir kod hamallığıdır.

DipNot: Yazdığınız bir programın kalitesini, değerini yada işlevselliğini yazmış olduğunuz fazla kod sayısıyla ölçmeniz bir uçağın ağırlığı ile övünmenize benzer ki bu nereden baksanız tutarsız bir davranıştır. For döngüsü yerine böyle kod hamallığı yaparak çok uzun satırlar kodladım demekte aynı tutarsızlığa sahiptir.

Hadi gelin şu işlemi nasıl iki satır kodlama ile gerçekleştirebileceğimize bakalım.

 

Kod Açıklaması (Algoritma)

i değerinin 1 den başlayacağını ve 11 den küçük olduğu sürece bu döngünün tekrar edeceğini ve i değerinin her döngü sonunda 1 artacağını söyleyerek basitçe döngümüzü oluşturmuş olduk arkadaşlar.

Böyle bir kodlamayla değil 1 000 000, 10 000 000 kayıt bile geri dönebilirsiniz. For döngüsü bunu sizin yerinize yapacaktır.

Yukarıdaki kodlamayla aynı işlemi yapacak ama bazen kafaları karıştırabilen bir örnek kodlama göstereyim.

Farkı şudur, şartta kullandığımız <= ifadesi. Eğer gitmek istediğimiz en son değer için <= yada >= gibi bir ifade ile yazarsam belirtilen son değere eşitlik veririz. Yani burada 10 oldu. Ama bir önceki kodlamada olduğu gibi sadece < yada > olarak ifade edeceksek gitmek istediğimiz değerin 1 öncesini yada 1 sonrasını yazmamız gerekecektir. İlk kodlamada 11 yazdığımız gibi.

Şimdi belki bunu anlayamayacak yada bunda dipnot düşülecek ne var gibi bir şey gelebilir aklınıza. İleride i şartının gideceği değeri bir değişkenden aldığınızda o değişkenin değerini direk olarak kodlama anında bilemeyeceğiniz için bir hatırlatıcı olarak bunu yazmak istedim.

 

Bir örnek de i’nin şartını bir değişkene bağlı olarak aldığı bir for döngüsü yazalım.

  • Textboxdan aldığınız bir ifadenin karakterlerini tek tek listbox a yazdırınız. 

Aynı kodlamanın 3 Halini paylaşacağım. Birincisi açıklama satırlarıyla. İkincisi temiz haliyle. Üçüncüsü de aynı kodlamayı daha kısa nasıl yapabilirdi ki gösterdiğim kodlama olacak.

Açıklama Satırlı

 

Temiz Kod

 

Daha Kısa Kod

 

Daha da Kısa Kodlama

 

DipNot: Son paylaştığım en kısa haliyle de kodlanabilir. Ama bunu şu sebepten tercih etmeyebiliriz. Kodları uzun süre sonra tekrar okumak istediğimizde kod okunurluğu, anlaşılırlığı açısından bazen sorunlar çıkarabilecek bir kısaltma şeklidir. Bir diğer sebebi değişkenlere atama yapılmadığı için değerleri programın farklı yerlerinde kullanma olasılığını ortadan kaldırmaktadır.

Bir ekran çıktısını görüp sonrada kısaca kodları açıklayalım.

 

Kod Açıklaması (Algoritma)

Öncelikle Kelime isminde bir değişken tanımladık. Bu değişkene Textbox’a kullanıcı tarafından girilecek değeri atadık.

DipNot: Bilmemiz gereken olaylardan biride her string değer bir char dizisini ifade eder. 

Length: Bir dizinin eleman sayısını bulmak için kullanıdığımız bir property’dir (Özelliktir). Metod değildir.

Yukarıda da söylediğim gibi Kelime değişkeni bir string ifade ve bir karakter dizisini oluşturur.

Kelime.Length ile kaç karakter barındırdığını bulmuş olduk. Yani dizinin uzunluğunu.

Örneğin Kelime’ye gelen değer ABCDE olsaydı. Length özelliği geriye 5 değerini dönecekti.

Daha sonra for döngüsü başladı.

i değerini 0’dan başlattık.

Bunun sebebi. C# da diziler 0 dan saymaya başlar.

Yani ABCDE gibi bir karakter dizinin ilk elemanını almak istersem bu dizinin 1. elemanı değil 0. elemanını istememle gerçekleşecektir.

Kelime[0] bize A değerini geri dönecektir.

Kelime[1] B değerini dönecektir. Vs.

Şimdi asıl olay şart kısmında. Kullanıcının ne kadar uzunlukta bir değer gireceğini bilmediğimiz için static olarak şu değere kadar dön demek pek mantıklı olmayacaktır.

Bir kişi 1 000 000 uzunluğunda bir değer giremez gibi bir öngörüde bulunup şartı i<1 000 000 olarak yapsaydık ne olurdu?

Bu durumda yazdığımız kod runtime(çalışma zamanı) hatası verecekti.

Neden?

Çünkü Kelime dizisinin uzunluğu 5 di ve 6. kaydı istediğimizde, olmadığı için bulamayacak ve index dizin sınırları dışındaydı gibi bir hata alacaktık.

İkinci bir sorun ise 5 karakterlik bir set için 1 000 000 kere döngünün dönmesini istemek de pek akıl karı olmayacaktır. Bize ciddi performans kayıplarına neden olacaktır.

O yüzden dinamik olarak Kelime dizisinin uzunluğu ne kadarsa, for döngüsünün o kadar dönmesini sağlamak için şartı dinamik bir değişkene bağladık.

i<Length ifadesi bunu sağladı.

Artık girilen değer 10 karakterse for 10 kere dönecektir. 100 karakterse 100 kere dönecektir.

Umarım for döngüsünün yapısı ve yapmaya çalıştığı iyi bir şekilde oturmuştur.

Bir sonraki eğitim yazımda görüşmek üzere.

 

Print Friendly, PDF & Email
Facebook Sayfamizdan Bizleri Takip Edebilirsiniz
Murat Bilginer

Industryolog Akademi Founder – Endüstri Mühendisi
Canias ERP Troia Geliştiricisi & Yazılım Uzmanı
7 Yıldır bildiğini paylaşmak için çabalayan bir blogger.

http://muratbilginer.net/