|
Her yönüyle C Döngüleri(Loops) - 1 |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bu yazıda bir programlama
dilinin en temel yapıları olan döngülerden olan for döngü yapısı anlatılacaktır.
Döngüler bir programlama dilinde olmazsa olmaz yapılardır. Döngüler olmadan
modern programlar yazmak imkansızdır. Döngüler bir program içerisinde belirli
işleri defalarca yapmamızı sağlayan komut bloklarıdır. Sonsuz döngüler yapabildiğimiz
gibi belirli kriterleri sağlayana kadar oluşan döngülerde yapabiliriz.
C dilinde 3 tip döngü vardır. Bunlar :
- for döngüleri
- while döngüleri
- do while döngüleri
olarak bilinirler.
Her bir döngü yapısı
ayrıntılarıyla anlatılacaktır. Bu yazımızda for döngüsünü anlatacağım.
for döngüleri
for döngüsü en çok kullanılan döngülerdir diyebiliriz. Bir for döngüsünün en temel
formu aşağıdaki gibidir.
for
(ifade1; ifade2; ifade3)
deyim1;
// yada
for
(ifade1; ifade2; ifade3) {
deyim1;
deyim2;
.......
}
|
Yukarıdaki yapının dışındaki durumlar derleme zamanında hataya sebep olur. Mesela
for döngüsü içinde ancak ve ancak iki tane noktalı virgül olmalıdır. İfadelerden
herhangi biri boş olabilir ama mutlaka noktalı virgüller konulmalıdır. for parantezinden
sonra gelen satırlar döngü bloğudur. Eğer döngü bloğu basit blok ise yani noktalı
virgülle sonlanan tek satırdan oluşuyorsa for döngüsü için açılan ve kapanan parantezleri
kullanmamıza gerek yoktur. Kullanmamızda herhangi bir sakınca yoktur. Ben şahsen
okunabilirliği artırmak için her zaman kullanmayı tercih ederim.
Şimdi bir for döngüsünün nasıl çalıştığına bakalım. Programın akışı for döngüsüne
geldiğinde döngü parantezinde bulunan ilk ifade bir defaya mahsus olmak üzere
çalıştırılır. Bundan sonraki iterasyonlarda hiçbir zaman ifade1 icra edilmeyecektir.
Herhangi bir zorunluluk olmamasına rağman ifade1 ile genellikle döngü değişkeninin
ilk değeri belirlenir. Unutmayın bu bir zorunluluk değildir, her türlü geçerli
ifadeyi(expression) burada yazabiliriz. for bloğunun sonuna gelindiğinde ifade3
icra edilir, ifade3 ile genellikle döngü değişkeninin artırılması ya da azaltılması
yapılır. Tabi bu da zorunlu olarak yapılmaz, geçerli her tür ifadeyi ifade3 yerine
yazabiliriz. ifade3 icra edildikten sonra çalıştırılma sırası ifade2 ye gelir.
ifade2 control bölgesidir. Yani döngünün geleceği ile ilgili kararlar burada alınır.
Peki bu karar nasıl alınıyor, şöyle ki; ifade2 çalıştırıldıktan sonra sıfır dışı
bir değer oluşturuluyorsa döngü devam eder aksi halde döngüden çıkılır ve programın
akışı döngü bloğundan sonraki ilk satırdan devam eder.
Şimdi for döngüsünü daha iyi anlamak için basit bir örneği adım adım inceleyelim.
Örneğimizde 1 den 3(3 dahil) e kadar olan tamsayıların toplamını hesaplayacak
bir döngü bloğu oluşturacağız. İçinizden hemen 6 cevabını verdiğinizi hissediyorum.
Evet bu kolay bir problemdi ama döngü bloğundaki tek bir karakteri değiştirerek
1 den 1000 e kadar olan tam sayılarıda toplayabileceğiz. Aşağıdaki yapıyı inceledikten
sonra programın akışının for döngüsüne geldiğinde neler olabileceğini tahmin ediniz.
Eğer zorlanıyorsanız programın altındaki adımları takip edin. Yine anlamakta zorlanıyorsanız
problemimizin akışını anlatan simülasyonu takip edin, eminim ki bu sefer anlayacaksınız.
Eğer yine anlayamadıysanız makalenin başına dönmenizi tavsiye ederim :)
#include
<stdio.h>
int main(void)
{
int
i;
int
toplam = 0;
for
(i = 1; i <= 3; i++)
toplam = toplam
+ i;
printf("Toplam
= %d", total);
return
0;
}
|
Yukarıdaki programda akış for bloğuna geldiğinde sırasıyla aşağıdaki adımlar
olur :
1-) ifade1 dediğimiz kısım çalıştırılır. ifade1 yerinde i=0; deyimi olduğu
için i değişkenine 0 değeri atanır. Bu işlem bir defa yapılacaktı hatırlarsanız.
2-) ifade2 yani kontrol ifadesine akış gelir. Kontrol ifadesi çalıştırılır.
Şu anda inin değeri 1 yani i<=3 ifadesi doğrudur. C de mantıksal doğru demek
sıfır dışı bir değer demek olduğu için ifade2 doğru bir değer , diğer bir deyişle
sıfır dışı bir değer üretir. ifade2 ile sıfır dışı bir değer üretildiği için
programın akışı for bloğuna gelir.
3-) Döngü bloğu olmadığı için for parantezlerinin altındaki ilk satır
icra edilir. Yani toplam değişkenine o andaki i değeri eklenir. Bu durumda toplam
sıfır olduğu için, ifade icra edildikten sonra toplam değişkenin değeri toplam
= 0 + 1 = 1 (i nin değeri 1 idi)
4-) Bundan sonra akış ifade3 dediğimiz bölgeye gelir, ve burada deyim
icra edilir. ifade3 ün yerinde i++; gibi bir ifade görüyorsunuz . Bu ifade ile
i değişkenin değeri 1 artırılıyor. Şu anda i nin değeri 2 oldu.
5-) Akış tekrar ifade2 nin olduğu yere gelir. Adım 2 deki işlemler aynen
tekrarlanır. 2 <=3 olduğu için döngüye devam edilir.
6-) 3.Adımdaki işlemler tekrar yapılır yani toplam değişkeninin değeri
i kadar artırılır toplam = 1 + 2 = 3 olur.
7-) Akış tekrar 4.Adımda anlatılan ifade3 bölümüne gelir, ve i nin değeri
1 artırılır. i = 3 olur.
8-) deyim2 tekrar icra edilir. 2. Adımdaki açıklamalar doğrultusunda
yine döngüye devam edilir. Çünkü 3<=3; ifadesi sıfır dışı bir değer üretir.
9-) 3. Adımdaki işlemler tekrar yapılır ve toplam = 3 + 3 = 6 olur.
(i=3 ve toplam = 3 idi).
10-) Akış tekrar ifade3 bölümüne gelir ve i değeri 1 artırılır. i = 4
olur.
11-) Programın akışı ifade2 bölümüne gelir ve kontrol ifadesi tekrar
icra edilir. Kontrol yapıldığında bu sefer önceki kontrollerden farklı bir durum
ortaya çıkar. 4 <=3 olmadığı için ifadenin çalıştırılması sonucu 0 dışında
bir değer üretilmez.Yani sıfır değeri üretilir. Bu , kuralda hatırlarsanız
döngünün sonunu getirmektedir. Bundan sonra akış for bloğunun sonundan devam
eder yani ekrana "Toplam = 6" yazılır.
Bu adımları aşağıdaki simulasyonda da görebilirsiniz. Aşağıdaki animasyonu görebilmeniz
için bilgisayarınıza Macromedia Flash player yüklü olmalıdır. www.macromedia.com
adresinden ücretsiz player edinebilirsiniz.
Sanırım for döngüsünün çalışma prensibine iyice aşina oldunuz. Şimdi for döngüsünün
çeşitli durumlarına bakalım. Yukarıda da bahsettiğimiz gibi örnekte verdiğimiz for
yapısı ve kullanım biçimi en çok kullanılan biçimdir, fakat for yapısının kullanımı
çok esnektir, istediğimiz biçimde kullanabiliriz yeter ki for parantezlerine
geçerli ifadeler yazalım, tabi ki iki tane noktalı virgülü de eksiksiz yazmamız
lazım.
Aşağıda ,yukarıdaki kullanımdan farklı olan bir döngü görüyorsunuz, bu döngünün de
çalışma prensibi aynı olduğu için tekrar anlatmama gerek yok sanırım.
char
ch;
for (ch = getch(); ch != q || ch = !=Q ; ch = getch())
birseyleryap(ch); |
Bu döngü ile kullanıcıdan
sürekli bir karakter alınıyor, ta ki kullanıcının q ve Q karakterlerini girmesine
kadar. Kullanıcı q karakterlerini girdiği zaman for döngüsünden çıkılır. Gördüğünüz
gibi bu for döngüsü ilk verdiğimiz örnekten tamamen farklı bir uygulama için
kullanılabilir.
for döngüleriyle ilgili diğer durumlar ise for döngü parantezi içindeki ifadelerin
eksik bırakılmasıdır.
k
= 0;
for (; k< 10; ++k)
printf("%d\n", k); |
Yukarıdaki kodda
görüldüğü gibi döngü değişkenine ilk değer verme işlemi döngünün dışında yapılıyor.
Bu yöntem C dilinin bir esnekliği olarak kabul edilse de okunabilirlik açıdan
kullanılmaması tercih edilebilir.
Aynı şekilde bazı durumlarda for döngüsünün 1. ve 3. kısmı da olmayabilir. Bu
durumda döngü değişkenine döngünün dışında ilk değer verildiği gibi döngü değişkeni
ile ilgili işlemler de döngü gövdesinde yapılır. Aşağıda bu duruma bir örnek
görmektesiniz.
k
= 0;
for ( ; i < 10; ) {
printf("%d\n", k);
++k;
} |
for döngüleriyle
ilgili en önemli ilginç özellik ise sonsuz döngülerdir. Sonsuz döngüler, döngü
parantezinin içinde boş ifadelerin olmasıyla yapılabilir. Yani döngü parantezindeki
bütün alanlar boş bırakılır, tabi iki tane noktalı virgüle unutmamak şartıyla.
Sonsuz bir döngünün kurulması aşağıdaki gibi olmaktadır.
for
(; ;)
sonsuzakadarbirseyleryap(); |
Yukarıdaki for
yapısından dolayı sonsuzakadarbirseyleryap adlı fonksiyonumuz adından da anlaşılacağı
gibi sonsuza kadar bir şeyler yapacaktır. Tabi bu, pratikte böyle olamaz. Sonsuza
kadar iş yapan bir alet henüz bilinmiyor. Peki o zaman bu sonsuz döngüler neden
vardır, nerelerde kullanılırlar? Şimdi kısaca bu sorulara yanıt bulmaya çalışalım.
Diyelim ki şifre korumalı bir Windows uygulaması yapıyoruz. Kullanıcı programı
çalıştırmak istediğinde şifre sorgulaması yapmak istiyoruz. Kullanıcı yanlış
şifre girdiğinde programı kapatmak yerine yeniden şifre girmesini istiyoruz.
Burdaki stratejimiz şu olmalı : Bir sonsuz döngü kurulur, sonsuz döngü içerisinde
şifre sorgulaması yapılacak fonksiyon çağrılır. Fonksiyon beklediğimiz değeri
bize döndürdüğünde sonsuz döngüden çıkılır ve işlemlere devam edilir. Peki sonsuz
döngüden çıkma nasıl olur? Şimdi de bu konuya değinelim.
Sonsuz döngüden çıkmanın 4 temel yolu vardır. Bunlar aşağıdaki gibi sıralanır.
1-) break anahtar sözcüğü ile : Bir for
döngüsünde break; ifadesi görüldüğü anda programın akışı for döngü bloğunun
sonuna gelir. Yukarıdaki örneğimize geri dönersek, şifre sorgulama fonksiyonundan
gelen değer için bir if-else karar mekanizması kurarak şifre doğrulanmadığı
takdirde for döngüsünden break anahtar sözcüğü ile çıkılır. Not: Eğer içi-içe(nested)
döngüler kullanıyorsak break anahtar sözcüğü sadece en içteki döngüden çıkacaktır.
Yani break anahtar sözcüğünün kullanıldığı for döngüsünden çıkılacaktır. Dıştaki
for döngüsü icrasına devam edecektir. break anahtar sözcüğüne ilişkin bir örnek
aşağıdaki gibi verilebilir.
#include
<stdio.h>
#define DOGRU 1;
#define YANLIS 0;
int SifreKontrol()
{
......
if (kontrol)
return DOGRU;
else
return YANLIS;
}
void main()
{
for (; ;)
if (SifreKontrol() == DOGRU);
break;
} |
Yukarıdaki örnekte
main fonksiyonu içerisindeki sonsuz döngü ile sürekli SifreKontrol fonksiyonu
çağrılıyor ve şifre doğrulandığında break anahtar sözcüğü ile sonsuz döngüden
çıkılıyor.
2-) goto anahtar sözcüğü ile : goto anahtar
sözcüğünün kullanımı çok yaygın olmamasına rağmen sonsuz döngüler de döngüden
çıkmak için kullanılabilir. goto anahtar sözcüğü genellikle programın akışını
belirli bir noktaya atlatmak için kullanılır.
3-) exit() fonksiyonu ile : Exit fonksiyonun
prototipi stdio.h başlık dosyasında tanımlanmıştır. exit fonksiyonunu çağırdığımızda
döngüden çıkacağımız gibi programımız da sonlandırılacaktır.exit fonksiyonu genellikle
programımızın beklenmedik hatalara karşı sonlandırılması amacıyla kullanılır.
4-) return anahtar sözcüğü ile : return
anahtar sözcüğü bir fonksiyonun sonlanması ve fonksiyonu çağırana bir değer
döndürmesi için kullanılır. return anahtar sözcüğü kullanıldığında eğer for
döngüsü main fonksiyonu içerisindeyse döngü biteceği gibi programımız da sonlanır,
aksi halde sadece return ifadesinin bulunduğu fonksiyon sonlanacaktır.
Döngülerle ilgili olan diğer bir önemli anahtar sözcük de continue
anahtar sözcüğüdür. Kullanımı break anahtar sözcüğü gibidir. Fakat continue
kullanıldığında döngüden çıkılmaz yalnızca continue ifedesinin görüldüğü yerden
itibaren icra edilmez. continue anahtar sözcüğünün kullanımına bir örnek verecek
olursak : 1 den 100 e kadar olan tam sayılardan 5e bölünmeyenleri ekrana yazan
bir program için kurulacak for döngüsü aşağıdaki gibidir.Tabi buradaki şartımız
döngü değişkenini birer birer artırmak olacaktır. Bizim amacımız ise continue
anahtar sözcüğünün nasıl kullanıldığını göstermek.
for
(i =0 ; i<100 ; i++)
if (i % 5 == 0);
continue;
else
printf("%d\n",i);
|
Örnekte görüldüğü
gibi döngü değişkeni olan i 5e tam bölündüğünde continue; ifadesi işletilecek
ve döngü tekrar başa dönecektir. Bu durumda döngü parantezindeki 3.ifade çalıştırılır.
Bu makalemizde for döngülerine geniş bir başlangıç yaptık. Bundan sonraki makalemizde
C dilinin diğer döngü yapıları olan while ve do-while yapılarını göreceğiz.
Makale:
Her yönüyle C Döngüleri(Loops) - 1 C ve Sistem Programlama Sefer Algan
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|