for Döngüsü
while döngüsü ile aynı işe yarar. Yararı, döngü ile ilgili bütün tanımların tek satırda yapılmasıdır.
for döngüsü foreach döngüsünden çok daha az kullanılır. Buna rağmen, for döngüsünün nasıl işlediği de iyi bilinmelidir. foreach döngüsünü daha sonraki bir bölümde göreceğiz.
while'ın bölümleri
Hatırlarsak, while döngüsü tek bir koşul denetler ve o koşul doğru olduğu sürece döngüye devam eder. Örneğin 1'den 10'a kadar olan bütün tamsayıları yazdıran bir döngü "sayı 11'den küçük olduğu sürece" şeklinde kodlanabilir:
while (sayı < 11)
O döngünün ilerletilmesi, sayı'nın döngü içinde bir arttırılması ile sağlanabilir:
++sayı;
Kodun derlenebilmesi için sayı'nın while'dan önce tanımlanmış olması gerekir:
int sayı = 1;
Döngünün asıl işlemlerini de sayarsak, bütün bölümlerine değinmiş oluruz:
writeln(sayı);
Bu dört işlemi döngünün hazırlığı, devam etme koşulunun denetimi, asıl işlemleri, ve ilerletilmesi olarak açıklayabiliriz:
int sayı = 1; // ← hazırlık while (sayı < 11) { // ← devam koşulu writeln(sayı); // ← asıl işlemler ++sayı; // ← döngünün ilerletilmesi }
while döngüsü sırasında bu bölümler şu sırada işletilirler:
hazırlık koşul denetimi asıl işlemler ilerletilmesi koşul denetimi asıl işlemler ilerletilmesi ...
Hatırlayacağınız gibi, bir break deyimi veya atılmış olan bir hata da döngünün sonlanmasını sağlayabilir.
for'un bölümleri
for döngüsü bu dört işlemden üçünü tek bir tanıma indirgeyen deyimdir. Bu işlemlerin üçü de for deyiminin parantezi içinde, ve aralarında noktalı virgül olacak şekilde yazılırlar. Asıl işlemler ise kapsam içindedir:
for (/* hazırlık */; /* devam koşulu */; /* ilerletilmesi */) { /* asıl işlemler */ }
Yukarıdaki while döngüsü for ile yazıldığında çok daha düzenli bir hale gelir:
for (int sayı = 1; sayı < 11; ++sayı) { writeln(sayı); }
Bu, özellikle döngü kapsamının kalabalık olduğu durumlarda çok yararlıdır: döngüyü ilerleten işlem, kapsam içindeki diğer ifadeler arasında kaybolmak yerine, for ile aynı satırda durur ve kolayca görülür.
for döngüsünün bölümleri de while'ın bölümleriyle aynı sırada işletilirler.
break ve continue deyimleri for döngüsünde de aynı şekilde çalışırlar.
while ve for döngüleri arasındaki tek fark, for'un hazırlık bölümünde tanımlanmış olan değişkenin isim alanıdır. Bunu aşağıda açıklıyorum.
Çok sık olarak döngüyü ilerletmek için bir tamsayı kullanılır, ama öyle olması gerekmez. Ayrıca, döngü değişkeni arttırılmak yerine başka bir biçimde de değiştirilebilir. Örneğin belirli bir değer aralığındaki kesirli sayıların sürekli olarak yarılarını gösteren bir döngü şöyle yazılabilir:
for (double sayı = 1; sayı > 0.001; sayı /= 2) { writeln(sayı); }
Birden fazla döngü değişkeni gerektiğinde küme parantezleri içinde tanımlanırlar. Örneğin, aşağıdaki döngü, türleri farklı olan iki değişken tanımlamaktadır:
for ({ int i = 0; double d = 0.5; } i < 10; ++i) { writeln("i: ", i, ", d: ", d); d /= 2; }
Hazırlık bölümü, işaretlenmiş olan küme parantezlerinin arasındaki bölgedir. Dikkat ederseniz, hazırlık bölümüyle koşulun arasında noktalı virgül bulunmaz.
Döngünün üç bölümü de boş bırakılabilir
Gereken durumlarda isteğe bağlı olarak, bu bölümler boş bırakılabilir:
- Bazen hazırlık için bir değişken tanımlamak gerekmez çünkü zaten tanımlanmış olan bir değişken kullanılacaktır
- Bazen döngüyü sonlandırmak için döngü koşulu yerine döngü içindeki
breaksatırlarından yararlanılır - Bazen döngüyü ilerletme adımı belirli koşullara bağlı olarak döngü içinde yapılabilir
Bütün bölümler boş bırakıldığında, for döngüsü sonsuza kadar anlamına gelir:
for ( ; ; ) { // ... }
Öyle bir döngü, örneğin ya hiç çıkılmayacak şekilde, veya belirli bir koşul gerçekleştiğinde break ile çıkılacak şekilde tasarlanmış olabilir.
Döngü değişkeninin geçerli olduğu kapsam
for ile while'ın tek farkı, döngü hazırlığı sırasında tanımlanan ismin geçerlilik alanıdır: for döngüsünün hazırlık bölgesinde tanımlanan isim, yalnızca döngü içindeki kapsamda geçerlidir (ve onun içindekilerde), dışarıdaki kapsamda değil:
for (int i = 0; i < 5; ++i) { // ... } writeln(i); // ← derleme HATASI // i burada geçerli değildir
while döngüsünde ise, isim while'ın da içinde bulunduğu kapsamda tanımlanmış olduğu için, while'dan çıkıldığında da geçerliliğini korur:
int i = 0; while (i < 5) { // ... ++i; } writeln(i); // ← 'i' burada hâlâ geçerlidir
for döngüsünün bu ismin geçerlilik alanını küçük tutuyor olması, bir önceki bölümün sonunda anlatılanlara benzer şekilde, programcılık hatası risklerini de azaltır.
Problemler
-
İç içe iki
fordöngüsü kullanarak, ekrana satır ve sütun numaralarını gösteren 9'a 9'luk bir tablo yazdırın:0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8 2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8 3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 3,8 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 4,8 5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7 5,8 6,0 6,1 6,2 6,3 6,4 6,5 6,6 6,7 6,8 7,0 7,1 7,2 7,3 7,4 7,5 7,6 7,7 7,8 8,0 8,1 8,2 8,3 8,4 8,5 8,6 8,7 8,8
- Bir veya daha fazla
fordöngüsü kullanarak ve*karakterini gereken sayıda yazdırarak geometrik şekiller çizdirin:* ** *** **** *****
******** ******** ******** ******** ********vs.
Kitaplar
Forum
Tanıtım
İletişim
Hakları