Döngüler, programlamanın olmazsa olmazlarındandır. Döngüler dilerseniz belli bir sayıda tekrar eder, dilerseniz belli bir koşul sağlandığı sürece devam eder. C++ dilinde 3 tane temel döngü tipi vardır. Bunlar;
While
döngüsünün kullanımı aşağıdaki gibidir.
while(koşul)
{
Komut1;
Komut2;
Komut3;
...
}
while
döngüsünde, while
kelimesinden sonra gelen parantez içerisinde koşul ifadesi yer alır. Devamındaki süslü parantezlerle ayrılmış bölgeye döngü gövdesi denir. Bu bölgede tek bir komut olabileceği gibi birden çok komutta olabilir. while
döngüsünde koşul sağlandığı sürece döngü gövdesindeki komutlar çalıştırılır.
Koşul kısmına 0 yazarsanız, bu koşulun sağlanmadığı anlamına gelir ve döngü çalışmaz. Aksi olarak da 1 yazarsak koşulun her zaman sağlandığı varsayılır ve döngü sonsuz döngüye dönüşür.
while
döngüsünün örneğine geçelim. 0 ile 10 arasındaki sayıların ekrana alt alta yazdırılması:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int i = 0;
while(i<=10){
cout<<i<<endl;
i++;
}
system("pause");
return 0;
}
Örnekte sayacımız olan i
değerine ilk olarak 0 değerini atadık. Ardından i <= 10
koşuluna sahip olan while
döngüsü çalışırken 0 <= 10
ifadesinin değerinin sağlanmasından ötürü döngümüz çalıştı ve döngünün içindeki kodlarla beraber sayının değeri ekrana yazılarak, i değişkenin değeri increment(++
) operatörü ile arttırıldı ve ardından bu işlem, koşul sağlandığı sürece devam etti. En son i
değerimiz 11 olunca while
döngüsündeki koşul 11<=10
oluyor ve koşul sağlanmadığı için döngü içerisindeki kod bloku çalıştırılmadan bir sonraki ifadeye geçiyor.
Bir While döngüsü içerisinde birden çok while döngüsü olabilir.
while (koşul) {
while (koşul)
{
komut1;
komut2;
...
}
komut3;
}
Üstteki kullanım şeklini bir örnek içerisinde inceleyelim:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int i = 0, j;
while (i <= 5)
{
j = 0;
cout << "i";
while (j <= 3)
{
cout << "j";
j++;
}
i++;
cout << endl;
}
system("pause");
return 0;
}
Örneği dikkatli inceleyecek olursak; ikinci, yani içteki While
döngüsünün 24 kez işlerken ilk döngünün 6 kere işlediğini göreceksiniz. İlk döngüdeki koşulumuz i<=5
ve i
değişkeninin başlangıç değeri sıfırdır. Bu demek oluyor ki ilk döngü 6 kere dönecek. İkinci döngüde ise koşul j<=3
ve j
değişkeninin de başlangıç değeri sıfırdır, dolayısıyla içteki döngü kendi başına 4 kere tekrar eder. Fakat ikinci döngü içte olduğu için, ilk döngünün tekrar sayısı olan 6 ile çarpılır ve içteki döngü toplamda 6 x 4 = 24
kez çalışmış olur.
Sonsuz döngüler koşulun daima sağlandığı durumlarda gerçekleşir. Örneğin, koşula yazılacak sıfırdan farklı sabit sayı yazıldığı durumunda koşul doğru kabul edilir ve döngü daima tekrar eder. Bunun dışında koşul bir değişkenin değerine bağlıyken değişkenin değeri döngü içerisinde değiştirilmezse ve koşul sağlanıyorsa yine sınırsız döngü meydana gelir. İkinci bahsedilen durum genellikle programcının hatasından kaynaklanır, ilk durum ise zaman zaman sonsuz döngüyü kullanmamız gerektiği için yapılır. Bu duruma aşağıda, break
ve continue
ifadelerini anlatacağımız konu başlığında değineceğiz.
do while
döngüsünün çalışma mantığı while
döngüsüyle aynıdır. do while
döngüsünde farklı olarak koşul döngünün sonunda bulunur. while
döngüsünde koşul doğru ise komutlar işlerken; do while
döngüsünde koşul doğru olmasa bile ilk önce döngü içindeki kod bloku çalışır, ardından koşula bakılır ve koşul sağlandığı sürece bu işlem devam eder. do while
döngüsünün genel kullanımları aşağıdaki gibidir:
Tek Satırlı Kullanım:
do
komut;
while (koşul);
Çok Satırlı Kullanım:
do{
komut1;
komut2;
komut3;
...
} while(koşul);
Şimdi 2 tane örnek ile duruma biraz daha açıklık getirelim:
Örnek 1: İlk örneğimizde 3 > 5
gibi doğru olmayan bir önerme(koşul) kullanarak döngünün çalışıp çalışmayacağına bakalım.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
do {
cout << "Herkese Merhaba!" << endl;
} while (3 > 5);
system("pause");
return 0;
}
Gördüğünüz gibi 3 > 5
gibi doğru olmayan bir önerme yazmamıza rağmen döngü içerisindeki kod bloku 1 kere de olsa çalıştı.
Not: Üstteki örnekte döngü bloku içerisine tek satır kod yazmama rağmen { }
blok parantezlerini kullandım. Sizin de bu şekilde kullanmanızı tavsiye ederim, çünkü; bu şekilde kodun anlaşılabilirliği artar ve hata yapmamız zorlaşır.
Örnek 2: Şimdiki örneğimiz de ise değişken kullanarak normal tekrar eden bir do while
döngüsü yapalım.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int i = 0;
do {
cout << "Sayinin degeri: " << i << endl;
i++;
} while (i != 0 && i < 10); //i değişkeni sıfırdan farklı ve i < 10 olduğu sürece tekrar et.
system("pause");
return 0;
}
Üstteki örnekteki döngüye verdiğimiz i != 0 **&&** i < 10
koşulu ile i
değişkeninin sıfırdan farklı VE 10’dan küçük olması durumunda çalışmasını söyledik. Ancak dikkat ederseniz i
değişkeni başlangıçta sıfır değerine sahip ve bu da koşulun yerine getirilmemesi demek oluyor. Ancak döngü koşul sağlanmasa dahi 1 kez çalışacağı için koşula bağlı kalmadı ve döngünün içerisindeki kodu çalıştırdı. Döngünün içerisinde kod i
değişkeninin değerini arttırınca koşul sağlanmış oldu ve döngü çalışmaya devam etti ve i
değeri 10’dan küçük olduğu sürece işlem böyle sürdü. En sonunda i
‘nin değeri 10 olunca koşul yerine getirilmemiş oldu ve döngü tekrar etmedi.
for
döngüsünün kullanımı aşağıdaki gibidir:
for( değer ataması; Koşul; Arttırma; )
{
komut1;
komut2;
...
}
Değer ataması kısmında döngü içerisinde ve döngü koşulunu belirlerken kullanılacak değişken belirlenir. Koşul kısmı ise diğer döngülerde olduğu gibi mantıksal operatörler ile koşul belirlenir. Arttırma kısmında ise tanımlanan değişkenin arttırma (veya azaltma) işlemi uygulanır. Özetle for
döngüsünün akışı:
for
döngüsü ilk çalıştığında değer ataması kısmında belirlenen kod çalışır ve değişkenin ilk değeri belirlenmiş olur.for
döngüsünün bloku içindeki kodlar çalışır, sağlanmıyorsa döngü kırılır.Şimdi for
döngüsü kullanarak ekrana 1’den 10’a kadar olan sayıları yazdıralım:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
for (int i = 1; i <= 10; i++)
{
cout << i << endl;
}
system("pause");
return 0;
}
Üstteki kodun çıktısı aşağıdaki şekildeki gibidir:
Örnekte for
döngüsü içerisinde i
isminde ilk değeri 1
olan değişken tanımladık. Koşulu da i
değişkenin 10’dan küçük eşit olduğu sürece devam etmesini sağlayan i <= 10
mantıksal ifadesini girdik. Arttırma kısmına ise ++
operatörünü kullanrak i
değişkeninin değerini 1
arttırdık. Bu döngüyü kullanarak farklı türde örnekler yapabilirsiniz. Peki for
döngüsüne sadece koşul girersek yani değişken tanımlama(değer atama) ve arttırma işlemini yapmazsak ne olur? for
döngüsü while
döngüsü olur :) Aşağıda basit bir örnek ile bu konuya değindikten sonra for
döngüsü konusunu da bitireceğiz.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int i = 1;
for ( ; i <= 10; )
{
cout << i << endl;
i++;
}
system("pause");
return 0;
}
Üstteki kodu incelediğinizde while
döngüsü başlığındaki örnekteki gibi bir işlem yapıldığını fark edeceksiniz. Değişken tanımlama döngü dışında normal bir değişken tanımlaması gibi yapılmış. Arttırma işlemi ise döngü içerisinde yapılmış.
Kodun çıktısı ise yine üstteki örnekteki ile aynı:
Tabi böyle bir kullanımın hiçbir anlamı yoktur. Bunu kullanmak yerine while
döngüsü kullanabiliriz. Amacım sadece for
döngüsünün kullanımına dikkat çekmekti. Ayrıca ikinci kısmı yani koşul kısmı boş olan for
döngüsü de kurabilirsiniz. Koşul kısmı boş olan bir for
döngüsü sonsuz döngü oluşturacaktır.
break
ve continue
ifadeleri döngüyi kırmak(bitirmek) ve döngünün sonraki adımına atlamak için kullanılırlar. Bazı durumlarda döngünün bazı adımlarını atlamak isterken bazı durumlarda da döngüyü bitirmek isteyebiliriz. İşte bu tür durumlarda yardımımıza break
ve continue
ifadeleri koşuyor. İlk örneğimizde 3 sayısı hariç 1’den 10’a kadar olan tüm sayıları yazdıralım:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 3)
continue; //Tek satır olduğu için blok parantezi kullanmadım.
cout << i << endl;
}
system("pause");
return 0;
}
Kodun çıktısı:
Gördüğünüz gibi 3 sayısı hariç 1’den 10’a kadar olan tam sayıları yazdırdık. if
yapısını kullanarak i
değişkenin değeri 3’e eşit olduğu durumda continue
ifadesi ile sonraki kodları işlemeden döngünün bir sonraki adımına geçtik ve böylece 3 sayısı ekrana yazdırılmadı. Şimdi ise break
ifadesi için bir örnek yapalım: Bu örneğimizde kullanıcının girdiği sayıların ortalamasını veren uygulama yapacağız. Kullanıcı istediği kadar sayı girebilmesi için sonsuz bir döngü kuracağız ve sonsuz döngüyü kullanıcının isteği doğrultusunda bitireceğiz. Örneğimizde while
döngüsü ile sonsuz bir döngü yaratalım ve bu döngüden çıkmak için kullanıcıdan -1
(eksi bir) sayısının girilmesini bekleyelim. Kullanıcı -1
‘den farklı bir sayı girdiği sürece bu sayıları toplayalım ve döngünün sonunda bu girilen sayıların ortalamasını ekrana yazdıralım:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int donguSayisi = 0; //Ortalamayı hesaplamak için kaç tane sayı girildiğini tutan değişken.
float girilenSayilarinToplami = 0; //Kullanıcıdan alınan sayıların toplamını tutan değişken.
float girilenSayi = 0; //Kullanıcıdan okunan sayıyı geçici olarak tutan değişken.
cout << "Sayilari girip enter tusuna basiniz, sonucu almak icin -1 giriniz." << endl;
while (true)
{
cout << "Sayi giriniz:";
cin >> girilenSayi; //Kullanıcıdan sayıyı okuyoruz.
if (girilenSayi == -1) //Kullanıcı -1 girerse döngüyü bitiriyoruz.
{
break; //Döngüyü bitiren ifade
}
girilenSayilarinToplami += girilenSayi; //Girilen sayıyı, girilen sayıların toplamını tutan değişkene ekliyoruz.
donguSayisi++; //Döngü sayısını 1 arttırıyoruz.
}
cout << "Girilen sayilarin toplami: " << girilenSayilarinToplami << endl;
cout << "Toplam girilen sayi: " << donguSayisi << endl;
cout << "Sayilarin Ortalamasi: " << girilenSayilarinToplami / donguSayisi << endl;
system("pause");
return 0;
}
Gerekli açıklamaları yorum satırı olarak kodların yanına yazdım. Özetleyecek olursak, kullanıcının -1 yazana kadar girmiş olduğu sayıların ortalamasını alıp ekrana yazdırdık. Kodun çıktısı ise aşağıdaki gibidir:
break
ve continue
ifadelerinin basitçe örnek üzerinde kullandık. Bu ifadeler döngülerin olmazsa olmazlarındandır. Sizler de bu ifadeleri kullanarak çeşitli örnekler yapabilir ve bu ifadelerin kullanımını kavrayabilirsiniz.