Ana sayfa > Programlama > C++ Programlama > Döngüler

Döngüler

► Detaylı anlatım

Tek bir işlem satırını veya kod bloğunu bir defadan fazla çalıştırmak için tekrar yazmak yerine, daha pratik bir uygulama olan döngü kavramını kullanabiliriz.

Bir veya birden fazla işlem satırını, bir koşula bağlı olarak, belirli sayıda veya bir koşul sağlandığı sürece tekrarlayarak çalıştıran kalıplara döngü adı verilir.

C++'da, for, while ve do while olmak üzere 3 farklı döngü kullanılmaktadır.

for döngüsü

C++'da kullanılan 3 adet döngüden bir tanesi for döngüsüdür. Programların yazılmasında çok büyük kolaylık sağlar. for döngüsü tek bir işlem satırını veya birden fazla işlem satırından oluşan bir kod bloğunu programcının istediği sayıda tekrar etmek için kullanılır. for döngüsünün genel yapısı aşağıda gösterilmektedir:

for (ilk-değer-atama; koşul; artırma/azaltma) işlem-satırı;

for (ilk-değer-atama; koşul; artırma/azaltma) {
	işlem-satırı;
	.
	.
	.
	işlem-satırı;
}	

Bir for döngüsü içinde for deyiminin kendisi hariç toplam 4 ana bölüm vardır. Bunlardan üçü for satırında parantezler içinde yer alan ilk-değer-atama, koşul ve artırma/azaltma bölümleridir. Dördüncü ve son bölüm ise döngü içinde programın istediğimiz sayıda tekrar ettiği tek bir işlem-satırı veya kod bloğudur.

İlk değer atama bölümünde, döngüyü kontrol eden değişkene bir ilk değer verilir. İlk değer atama bölümü, program tarafından bir defaya mahsus olmak üzere sadece döngünün başlangıcında çalıştırılır. Tanımlanması gerekli değildir.

Koşul bölümünde, döngü kontrol değişkeni döngünün her tekrarında belirli bir değer ile karşılaştırılır. Eğer koşula bağlı bu kontrol doğru bir sonuç verirse döngü tekrar eder, aksi takdirde döngü sona erer ve program döngüden sonra yer alan satırdan çalışmasına devam eder. Daha açık bir ifade ile, bu bölüm döngünün devam edip etmeyeceğinin belirlendiği bölümdür. Bu nedenle, koşul bölümü döngünün her tekrarlanmasında, döngünün başlangıcında program tarafından çalıştırılır. Eğer döngü başlangıcında koşul doğru sonuç vermezse döngü hiç çalışmaz.

Artırma/azaltma bölümünde, döngü kontrol değişkeni döngünün her tekrarında belirli bir oranda artırılır veya azaltılır. Artırma/azaltma bölümü, işlem satırı veya kod bloğundan sonra ve koşul bölümünden önce program tarafından çalıştırılır.

Şimdi örnekler üzerinde döngüsüz ve döngü kullanarak yapılan tekrar işlemlerini incelemeye çalışalım:


#include <iostream>

using namespace std;

int main(void)
{
  char cd='A';
  int id;

  cout << cd << " ";
  cout << cd << " ";
  cout << cd << " ";
  cout << cd << " ";
  cout << cd << "\n";

  for (id=0; id<5; id=id+1) cout << cd << " ";

  return 0;
}

Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:

A A A A A
A A A A A

Program her satır için 'A' karakterini 5 kez ekrana yazmak için farklı bir yöntem kullanır. İlk satır için 5 işlem satırında cout fonksiyonunu, ikinci satır için ise bir for döngüsü kullanır. Burada, for döngüsünün sağladığı esnekliği daha kolay değerlendirebilmek için iki yöntem aynı program içinde kullanılmaktadır. Bu program içinde her satırda 'A' harfini 20 kez ekrana yazmak için bir değişiklik yapmak istediğimizde ilk yöntem için 15 işlem satırı eklememiz gerekir. Döngü yönteminde ise sadece for satırında yer alan 5 değerini 20 yapmak yeterlidir.

Program, for satırının ilk değer atama bölümünde id değişkenine 0 sayısını atar. for satırının koşul bölümünde 0<5 ifadesi doğru bir sonuç verdiği için for satırında yer alan işlem satırı çalışır ve cd değişken değeri olan 'A' karakteri ekrana yazılır. Sonra, artırma bölümü devreye girer ve id değişken değeri 1 artarak 1 değerini alır. Yine, 1<5 ifadesi doğru bir sonuç verdiği için for satırında yer alan işlem satırı çalışır ve cd değişken değeri ekrana yazılır. Döngü id değişkeni 5 değeri alana kadar devam eder. Değişken 5 değerini aldığında 5<5 ifadesi yanlış bir sonuç vereceğinden döngü sona erer.


#include <iostream>

using namespace std;

int main(void)
{
  int id;

  for (id=1; id<=10; id++) cout << id << " ";

  return 0;
}

Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:

1 2 3 4 5 6 7 8 9 10

Program, for satırının ilk değer atama bölümünde id değişkenine 1 sayısını atar. for satırının koşul bölümünde 1<=10 ifadesi doğru bir sonuç verdiği için for satırında yer alan işlem satırı çalışır ve ilk id değişken değeri olan 1 sayısı ekrana yazılır. Sonra, artırma bölümü devreye girer ve id değişken değeri 1 artarak 2 değerini alır. Yine, 2<=10 ifadesi doğru bir sonuç verdiği için for satırında yer alan işlem satırı çalışır ve id değişken değeri olan 2 sayısı ekrana yazılır. Döngü id değişkeni 10 sayısından büyük bir değer alana kadar devam eder. Değişken 11 değerini aldığında 11<=10 ifadesi yanlış bir sonuç vereceğinden döngü sona erer.

while döngüsü

C++'da kullanılan diğer bir döngü de while döngüsüdür. Döngünün genel yapısı aşağıda gösterilmektedir:

while (ifade) işlem-satırı;

while (ifade) {
	işlem-satırı;
	.
	.
	.
	işlem-satırı;
}	

Daha önce for döngüsünde gördüğümüz gibi işlem satırı yerine bir kod bloğu da kullanılabilir. Program while döngüsünün bulunduğu satıra geldiği zaman önce ifade sonucunun doğru olup olmadığını kontrol eder. Eğer ifade yanlış bir sonuç verirse döngüye hiç girmeden döngüden hemen sonra yer alan işlem satırından çalışmasına devam eder. Eğer ifade doğru bir sonuç verirse, döngüde yer alan ifade yanlış bir sonuç verene kadar, döngü içinde yer alan işlem satırlarını çalıştırır. Yani, ifade doğru olduğu sürece döngü çalışmasına devam eder. while döngüsünde ifadenin sonucu döngünün başlangıcında kontrol edildiğinden, ifadenin yanlış sonuç verdiği durumlarda döngü bir defa bile çalışmaz.

while döngüsünde, for döngüsünden farklı olarak, ilk değer atama ve artırma/azaltma bölümleri bulunmamaktadır. while döngüsünde ilk değer atama işlemi döngü öncesinde, artırma/azaltma işlemi ise döngü kod bloğu içinde yapılır.

Şimdi öğrendiklerimizi örnekler üzerinde inceleyelim:


#include <iostream>

using namespace std;

int main(void)
{
  int id=1; // Döngü kontrol değişkenine ilk değer atama

  while (id<=10) {
     cout << id << " ";
     id++; // Döngü kontrol değişkeni değer artırma
  }

  return 0;
}

Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:

1 2 3 4 5 6 7 8 9 10

Program, 1'den 10'a kadar olan sayıları ekrana yazar. Döngü kontrol değişkeninin başlangıç değerini döngüden önce verir. Değişken değerinin artırılması ise while döngüsüne bağlı kod bloğu içinde yapılır. while döngüsü id değişkeni 10 sayısından büyük bir değer alana kadar çalışır.

Aynı programı aşağıdaki şekilde de yazabiliriz:


#include <stdio.h>

int main(void)
{
  int id=1;

  while (id<=10) cout << id++ << " ";
  
  return 0;
}

do while döngüsü

C++'da kullanılan döngülerden sonuncusu do while döngüsüdür. Döngünün genel yapısı aşağıda gösterilmektedir:

do {
   işlem-satırı;
   .
   .
   .
   işlem-satırı;
} while (ifade);

Program do döngüsüne geldiğinde hiç bir koşula bağlı olmadan direk olarak döngüye giriş yapar. Döngünün içinde yer alan işlem satırlarını çalıştırır. Eğer döngünün son satırında yer alan while deyimi ile ilgili ifade doğru sonuç vermez ise döngü sona erer. do döngüsünde eğer sadece tek bir işlem satırı tekrarlanacaksa { } işaretlerine gerek yoktur. Döngü, while satırındaki ifade sonucu doğru olduğu sürece çalışmasına devam eder.

do döngüsünde koşul kontrolü döngü sonunda yapıldığından koşul sağlanmasa bile döngü en az bir defa çalışır. Bu yönü ile do döngüsü for ve while döngülerinden farklıdır.

Şimdi öğrendiklerimizi bir örnek üzerinde inceleyelim:


#include <iostream>

using namespace std;

int main(void)
{
  int id=1; // Döngü kontrol değişkeni ilk değer atama

  do {
     cout << id++ << " ";
  } while (id<=10);

  return 0;
}

Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:

1 2 3 4 5 6 7 8 9 10

Program, 1'den 10'a kadar olan sayıları ekrana yazar. Döngü kontrol değişkeninin başlangıç değerini döngüden önce verir. Değişken değerinin artırılması ise do while döngüsüne bağlı kod bloğu içinde yapılır. Döngü id1 değişkeni 10 sayısından büyük bir değer alana kadar çalışır. Döngüye giriş için herhangi bir koşula gerek olmadığına, sadece sonraki tekrarlar için koşul sağlanması gerektiğine dikkat ediniz.

for, while ve do while döngülerinin birlikte incelenmesi

C++'da kullanılan 3 farklı döngü inceledik. Şimdi, bu üç döngünün özelliklerini aşağıdaki örnekler üzerinde tekrar gözden geçirelim:


#include <iostream>

using namespace std;

int main(void)
{
  int id;

  for (id=1; id<11; id++) cout << id << " ";

  cout << "\n";
  id=1;
  for ( ; id<11; ) cout << id++ << " ";

  cout << "\n";
  id=1;
  while (id<11) {
     cout << id++ << " ";
  }

  cout << "\n";
  id=1;
  do {
     cout << id++ << " ";
  } while (id<11);

  return 0;
}

Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

Program, for döngüsünü iki defa, while ve do while döngülerini ise birer defa kullanarak, 1-10 arasındaki sayıları dört defa ekrana yazar. İlk for döngüsünde, ilk değer atama, koşul ve kontrol değişkeni artırma işlemlerini, ikinci for döngüsünde ise, sadece koşul işlemini for işlem satırında yapar.

Döngülerle ilgili olarak 3 temel kavram bulunmaktadır:

1. İlk değer atama
2. Koşul
3. Artırma (Azaltma)

* for döngüsünde bütün kavramlar for satırında yer alan parantezler içinde tanımlanabileceği gibi, ilk değer atama bölümü döngü öncesinde ve artırma/azaltma bölümü döngü kod bloğu içinde tanımlanabilir.

* while döngüsünde ilk değer atama bölümü döngü öncesinde, koşul bölümü while satırında yer alan parantezler içinde, artırma/azaltma bölümü ise koşul sağlandığı takdirde çalışan kod bloğunun içinde tanımlanır.

* do döngüsünde ise, ilk değer atama bölümü döngü öncesinde, koşul bölümü döngü sonundaki while satırında yer alan parantezler içinde, artırma/azaltma bölümü ise döngüye bağlı kod bloğu içinde tanımlanır.

do döngüsünün diğer döngülerden en büyük farkı, koşul kontrolü döngü sonunda yapıldığı için, koşul sağlanmasa bile döngünün en az bir kez çalışmasıdır. for ve while döngüleri ise, koşul sağlanmadığı takdirde hiç çalışmaz.

İhtiyacımıza bağlı olarak bu döngülerden herhangi birini kullanmak tamamen tercihe bağlıdır. Program içinde kullanma yerine bağlı olarak bu döngülerden hangisinin daha yararlı ve pratik olacağına karar verebiliriz.

break deyimi

Normal koşullarda, bir döngü koşul bölümü doğru sonuç verdiği sürece çalışmasına devam eder. Ancak, döngü kod bloğu içinde özel bir tanımlama yaparak da döngüyü sona erdirebiliriz. Bu işlemi gerçekleştirmek için break deyimini kullanabiliriz.

Bir döngüyü, döngünün koşul bölümüne bağlı kalmaksızın sona erdirmek için break deyimi kullanılır. break deyimi döngüye bağlı kod bloğunun herhangi bir işlem satırında yer alabilir. Program kod bloğunda break deyimini görür görmez, döngü başlangıç koşulu sağlanmış olsa bile, döngüden çıkar ve döngüden sonra gelen ilk işlem satırından çalışmasına devam eder. break deyimi C++'deki her 3 döngü ile kullanılabilir. İç içe döngülerde break deyimi kullanıldığında sadece içinde kullanıldığı döngüden çıkışı sağlar. Şimdi, break deyiminin kullanılmasını örnekler üzerinde incelemeye çalışalım:


#include <iostream>

using namespace std;

int main(void)
{
  int id;

  for (id=1; id<=20; id++) {
       cout << id << " ";
       if (id==15) break;
  }

  return 0;
}

Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Program, break işlem satırı tanımlanmadığında 1'den 20'ye kadar olan sayıları ekrana yazar. Ancak, for döngüsüne bağlı kod bloğunun ikinci satırında kullanılmış olan break deyimi kullanıldığı için, program for döngüsünde id değişkenine 15 değerini atadığında if satırında koşul doğru sonuç verdiğinde, break deyimi devreye gireceğinden, döngü hemen sona erer. Eğer break deyimi printf() fonksiyon işlem satırından önce yazılmış olsaydı, program 15 sayısını da yazmadan döngü sona erecekti.

continue deyimi

continue deyimi, bir döngünün herhangi bir satırından itibaren döngünün geri kalan işlem satırlarını çalıştırmadan, döngünün baş tarafına dönme olanağı sağlar.

do ve while döngülerinde, program continue deyimi ile karşılaştığında, koşul bölümünü kontrol eder ve döngünün çalışmasını devam ettirir. for döngüsünde ise, artırma ve koşul bölümünü çalıştırdıktan sonra döngünün çalışmasını devam ettirir. Şimdi continue deyiminin kullanılmasını bir örnek üzerinde incelemeye çalışalım:


#include <iostream>

using namespace std;

int main(void)
{
  int id;

  for (id=0; id<20; id++) {
       if (id%2==0) continue;  
       cout << id << " ";
  }
  
  return 0;
}

Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:

1 3 5 7 9 11 13 15 17 19

Program, for döngüsü içindeki continue deyiminden dolayı, döngünün ilk satırında eğer id değişken değeri çift bir sayı ise geri kalan kalan satırları devre dışı bırakarak, değişken değerini ekrana yazmadan, bir sonraki döngü değeri ile çalışmasına devam eder.