Bölüm 7 - DELPHI'DE DÖNGÜ KOMUTLARI (For Döngüsü)
Dögüler yazılım dilleri içerisinde çok önemli yer tutan komutlardır. Arka arkaya bir çok kez işletilmesi gereken kodların bulunduğu durumlarda, veya
belirlediğiniz şartın gerçekleşmesine kadar, döngüler baş vurulması gereken tek seçenektir. Bilhassa dizilerle beraber kullanılabildikleri zaman güçleri korkunç derecede artabilmektedir. Bu yüzden üzerinde çokça zaman harcamalı, konuyu tam anlamıyla kavrayabilmelisiniz.
Bu bölümde Delphi’de kullanılabilen tüm döngüler basitten, en karmaşığına doğru incelenecek ve detaylı örnekler verilecektir.
• For Döngüsü
İlk olarak döngü sayaç sayının belli olduğu “for” döngüsünü inceleyeceğim. Bu döngü sayesinde, döngü bloğu içerisine yazacağınız kodları arka arkaya istediğiniz kadar işletebilirsiniz. Döngünün bilinen bir diğer özelliği de blok içerisindeki kodların en az bir kere işletileceğidir (Aslında tam olarak öyle değildir. Mesela başlangıç değerini bitiş değerinden büyük verirseniz, döngü içerisindeki kodlar hiç işlemeden döngü sona erecektir. Fakat diğer döngülerin bu tip durumlarda kullanılması daha uygun olacaktır).
Aşağıda yapı verilmiştir. Dikkatlice inceleyiniz.
for i:=baslangic to bitis do
//Tek Satırlık Kod Buraya yazılacak;
Hemen bu yapıyı örneklendirelim.
belirlediğiniz şartın gerçekleşmesine kadar, döngüler baş vurulması gereken tek seçenektir. Bilhassa dizilerle beraber kullanılabildikleri zaman güçleri korkunç derecede artabilmektedir. Bu yüzden üzerinde çokça zaman harcamalı, konuyu tam anlamıyla kavrayabilmelisiniz.
Bu bölümde Delphi’de kullanılabilen tüm döngüler basitten, en karmaşığına doğru incelenecek ve detaylı örnekler verilecektir.
• For Döngüsü
İlk olarak döngü sayaç sayının belli olduğu “for” döngüsünü inceleyeceğim. Bu döngü sayesinde, döngü bloğu içerisine yazacağınız kodları arka arkaya istediğiniz kadar işletebilirsiniz. Döngünün bilinen bir diğer özelliği de blok içerisindeki kodların en az bir kere işletileceğidir (Aslında tam olarak öyle değildir. Mesela başlangıç değerini bitiş değerinden büyük verirseniz, döngü içerisindeki kodlar hiç işlemeden döngü sona erecektir. Fakat diğer döngülerin bu tip durumlarda kullanılması daha uygun olacaktır).
Aşağıda yapı verilmiştir. Dikkatlice inceleyiniz.
for i:=baslangic to bitis do
//Tek Satırlık Kod Buraya yazılacak;
Hemen bu yapıyı örneklendirelim.
Şayet “for” bloğu içerisinde birden fazla satır kod işletilecekse, o zaman ayrıca “begin-end” bloğu kullanmalısınız.
For i:=baslangic to bitis do
Begin
//İşleyecek olan kod satırları
//İşleyecek olan kod satırları
end;
Tek satır işleteceğiniz zamanlarda “begin-end” bloğu kullanırsanız yanlış olmayacaktır. İyice alışana kadar “begin-end” bloklarını tek satırlı durumlar içinde kullanmanızı öneririm (Alıştıktan sonra tek satırlı durumlar için bu bloğu kullanmayabilirsiniz).
Şimdi bu döngü ile ilgili basitten zora doğru örneklendirmeler yapalım. Örnekler için formunuzun üzerine tetikleme amaçlı bir button yerleştirmeniz yeterli olacaktır (Zaten kodlamadan formun üzerine eklenen kontroller hakkında bir fikriniz olacaktır).
Aşağıdaki örnekte “for” döngüsüyle “0-20” arasındaki sayıların toplamı hesaplanmaktadır.
For i:=baslangic to bitis do
Begin
//İşleyecek olan kod satırları
//İşleyecek olan kod satırları
end;
Tek satır işleteceğiniz zamanlarda “begin-end” bloğu kullanırsanız yanlış olmayacaktır. İyice alışana kadar “begin-end” bloklarını tek satırlı durumlar içinde kullanmanızı öneririm (Alıştıktan sonra tek satırlı durumlar için bu bloğu kullanmayabilirsiniz).
Şimdi bu döngü ile ilgili basitten zora doğru örneklendirmeler yapalım. Örnekler için formunuzun üzerine tetikleme amaçlı bir button yerleştirmeniz yeterli olacaktır (Zaten kodlamadan formun üzerine eklenen kontroller hakkında bir fikriniz olacaktır).
Aşağıdaki örnekte “for” döngüsüyle “0-20” arasındaki sayıların toplamı hesaplanmaktadır.
“for” döngüsünde kullanılan sayaç değişkenini (bu örnekte “i”) muhakkak tam sayı tiplerinden bir tanesiyle tanımlamalısınız. Aksi takdirde Delphi size hata mesajı iletecek, programınızı çalıştırmayacaktır.
Aynı örneği aşağıdaki şekilde de çözebilirdiniz.
Aynı örneği aşağıdaki şekilde de çözebilirdiniz.
Burada tekrar hatırlatalım,
Form1.Caption:=FloatToStr(toplam);
Satırını hız açısından “begin-end” bloğunun dışında tutmalısınız. Sayaç bitiş değerini artırırsanız, sonuç hesaplanmasının ne kadar gecikeceğini daha rahat izleyebilirsiniz.
Şimdi örneğimizi bir adım daha zorlaştırıp, “0” dan Edit kontrolüne girilecek olan değere kadar sayıları toplayacak bir proje yapalım.
Inc() fonksiyonunda kullanacağınız değişken tam sayı tipli olmalıdır. Aksi takdirde Delphi size işlemi yapamayacağına dair uyarı mesajı verecektir. Örneği bir adım daha zorlaştırarak, Edit’lere girilen değerler arasındaki sayıların toplamını hesaplatalım.
Bu örnekte Edit1 kontrolüne girilen değer, Edit2 kontrolüne girilen değerden daha büyükse döngü hiç çalışmayacak, başlıkta “0” değeri gözükecektir. Şimdi bu soruna da kontrol koyarak örneğimizi geliştirelim.
Programda kullanılan aşağıdaki blok, sayaç bitiş değerinin sayaç başlangıç değerinden küçük girilmesi durumunda, değişkenlerin yerlerini değiştirerek başlangıç değerinin bitiş değerinden her zaman küçük olmasını (Eşitte olabilir. Eşit olması durumunda döngü işletilecektir) sağlamaktadır.
if ilk>son then //ilk sondan büyükse
begin //yerlerini değiştir
deger:=ilk;
ilk:=son;
son:=deger;
end;
Aynı şekilde “Inc(toplam,i);” satırı yerine, “toplam:=toplam+i;” de (Şayet toplamın reel sayı tanımlanma durumu varsa Inc() fonksiyonu zaten
kullanılamaz) yazabilirsiniz.
Örneğimizi biraz daha zorlaştırarak girilen iki sayı arasındaki çift sayıları toplatan bir algoritma geliştirelim.
if ilk>son then //ilk sondan büyükse
begin //yerlerini değiştir
deger:=ilk;
ilk:=son;
son:=deger;
end;
Aynı şekilde “Inc(toplam,i);” satırı yerine, “toplam:=toplam+i;” de (Şayet toplamın reel sayı tanımlanma durumu varsa Inc() fonksiyonu zaten
kullanılamaz) yazabilirsiniz.
Örneğimizi biraz daha zorlaştırarak girilen iki sayı arasındaki çift sayıları toplatan bir algoritma geliştirelim.
Bu örnekte eklenen kontrol, döngü içerisinde toplam değişkenine eklenecek olan sayının çift olup olmadığının kontrol edilmesi işlemidir. Şayet kontrol edilen sayaç değeri tek sayıysa ekleme işlemi yapılmamakta, çift sayıysa ekletilmektedir. Sonuç olarak da girilen iki sayı arasındaki değerlerin toplamı kolaylıkla hesaplatılabilmektedir. Bu soruyu “for” döngüsüyle çözmek iyi bir programcı için yanlış bir tercih olacaktır. Sebebi çok basittir, sonuç her zaman doğru çıkacaktır, fakat döngünün işletilme sayısı (Tek sayılar içinde sonuçta kontrol yapılmaktadır) iki kat fazlaolacaktır. Bu yüzden bu tip problemleri, daha sonra gösterilecek olan diğer döngülerle çözünüz.
Delphi’de “for” döngüsü içerisinde sayaç değerine step verilemektedir. Yani sayacın ikişer ikişer artması maalesef mümkün olamamaktadır. Şayet sayaç artım değeri “1” den fazla ise diğer döngüleri kullanınız. Ayrıca “for” döngüsü içerisinde sayaç değerini değiştirmenize Delphi izin vermeyecektir.
for i:=ilk to son do
begin
if i mod 2=0 then //Çift sayıysa ekle
Inc(toplam,i);
Inc(i); //Burada hata verir sayaç değerine for içerisinde manuel müdahale
//edilemez
end;
Delphi’de “for” döngüsü içerisinde sayaç değerine step verilemektedir. Yani sayacın ikişer ikişer artması maalesef mümkün olamamaktadır. Şayet sayaç artım değeri “1” den fazla ise diğer döngüleri kullanınız. Ayrıca “for” döngüsü içerisinde sayaç değerini değiştirmenize Delphi izin vermeyecektir.
for i:=ilk to son do
begin
if i mod 2=0 then //Çift sayıysa ekle
Inc(toplam,i);
Inc(i); //Burada hata verir sayaç değerine for içerisinde manuel müdahale
//edilemez
end;