Döngü (loop) deyimleri, bir kümenin belli bir koşul altında
tekrar edilmesi için kullanılır. C programlama dilinde, while,
do...while ve for olmak üzere üç tip döngü deyimi vardır.
Diğer programlama dillerinde olduğu gibi, bu deyimlerle istenildiği kadar iç-içe
döngü yapısı kullanılabilir.
7.1 while Döngüsü
Tekrarlama deyimidir. Bir küme ya da deyim while
kullanılarak bir çok kez yinelenebilir. Yinelenmesi için koşul sınaması döngüye
girilmeden yapılır. Koşul olumlu olduğu sürece çevrim yinelenir. Bu deyimin
kullanımı Program 7.1 de gösterilmiştir. Genel yazım biçimi:
while(koşul) { ... döngüdeki deyimler; [küme] ... }
Program 7.1: while döngüsü
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
|
/* 07prg01.c: while döngüsü */
#include <stdio.h>
main()
{
int x=0;
while(x <= 10)
printf("%d\n",x++);
return 0;
}
|
ÇIKTI
0
1
2
3
4
5
6
7
8
9
10
|
Program 7.1, 0-10 arasındaki sayıları ekrana yazdırmaktır. 9.
satırdaki while deyiminden sonra { işareti kullanılmamıştır.
Bu durumda, sadece takip eden satır (10. satır) döngünün içine dahil
edilir.
7.2 do ... while Döngüsü
Bu deyimin while deyiminden farkı, koşulun döngü
sonunda sınanmasıdır. Yani koşul sınanmadan döngüye girilir ve döngü kümesi en
az bir kez yürütülür. Koşul olumsuz ise döngüden sonraki satıra geçilir. Bu
deyimin kullanımı Program 7.2 de gösterilmiştir. Genel yazım biçimi:
do{ ... döngüdeki deyimler; ... }while(koşul);
Program 7.2: do-while döngüsü
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
|
/* 07prg02.c: do-while yapısı */
#include <stdio.h>
main()
{
int sayi;
do
{
printf("Bir sayi girin : ");
scanf("%d",&sayi);
printf("iki kati : %d\n",2*sayi);
}while( sayi>0 ); /* koşul */
puts("Döngü sona erdi.");
return 0;
}
|
ÇIKTI
Bir sayi girin : 1
iki kati : 2
Bir sayi girin : 3
iki kati : 6
Bir sayi girin : 4
iki kati : 8
Bir sayi girin : -3
iki kati : -6
Cevrim sona erdi.
|
15. satırdaki koşul olumlu olduğu sürece (sayi>0
olduğu sürece), klavyeden yeni bir değer 12. satırda okunur. Aksi takdirde
(sayi<=0 ise) çevrimin sona erdiğine dair mesajla program sonlanır.
7.3 for Döngüsü
Bu deyim, diğer döngü deyimleri gibi bir kümeyi bir çok kez
tekrarlamak için kullanılır. Koşul sınaması while da olduğu gibi
döngüye girmeden yapılır. Bu döngü deyimin içinde diğerlerinden farklı olarak
başlangıç değeri ve döngü sayacına sahip olmasıdır. Bu deyimin kullanımı Program
7.3 de gösterilmiştir Genel yazım biçimi:
for( başlangıç ; koşul ; artım ) { ... döngüdeki deyimler; ... }
Program 7.3: for döngüsü
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
|
/* 07prg03.c: for döngüsü ile faktoriyel hesabı. */
#include <stdio.h>
int main()
{
long i, n, faktor;
printf("Faktoriyeli hesaplanacak sayi girin : ");
scanf("%ld",&n);
faktor=1;
for(i=1; i<=n; i++){
faktor *= i; /* n! = 1 x 2 x 3 x ... x n */
}
printf("%ld! = %ld\n", n, faktor);
return 0;
}
|
ÇIKTI
Faktoriyeli hesaplanacak sayi girin : 4
4! = 24
|
ÇIKTI
Faktoriyeli hesaplanacak sayi girin : 15
15! = 2004310016
|
Program da faktoriyel hesabı 16. satırda gerçekleştirilmiştir.
Faktöriyel, bilindiği gibi n! = 1x2x3x ... xn tanımlanır. Gerçekte
15! = 1307674368000 olmasına rağmen, program 15! = 2004310016 olarak
hesaplamıştır. Sizce bunun sebebi nedir? Cevap için bkz: Bölüm 2.
Program 7.3'de döngüye girilmeden, faktor = 1 atması
yapılmıştır.
faktor = 1; for(i=1; i<=n; i++) faktor *= i;
Bu döngü öncesi ilk değer ataması, döngünün başlangıç kısmında
şu şekilde de yapılabilir:
for(faktor=1, i=1; i<=n; i++) faktor *= i;
printf fonksiyonu ile desimal (taban-10) sayılarıların
nasıl yazdırılacağı bundan önceki kısımlarda gösterilmişti. Program 7.4'te 0-15
arası desimal sayıların Oktal (taban-8) ve Heksadesimal (taban-16) karşılıkları
ile printf kullanılarak yazdırılması gösterilmiştir.
Program 7.4: Sayı sistemi
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
|
/* 07prg04.c: Sayı sistemi
%d : desimal 10 tabanındaki sayı
%o : oktal 8 tabanındaki sayı
%x : hexadesimal 16 tabanındaki sayı (küçük harf)
%X : hexadesimal 16 tabanındaki sayı (büyük harf) */
#include <stdio.h>
int main()
{
int i;
for (i=0; i<16; i++)
printf("%2d %2o %x %X\n", i,i,i,i);
return 0;
}
|
ÇIKTI
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6
7 7 7 7
8 10 8 8
9 11 9 9
10 12 a A
11 13 b B
12 14 c C
13 15 d D
14 16 e E
15 17 f F
|
7.4 İç içe Geçmiş Döngüler
Bir program içinde birbiri içine geçmiş birden çok döngü de
kullanılabilir. Bu durumda (bütün programlama dillerinde olduğu gibi) önce
içteki döngü, daha sonra dıştaki döngü icra edilir.
Üç basamaklı, basamaklarının küpleri toplamı kendisine eşit
olan tam sayılara Armstrong sayı denir. Örneğin: 371 bir Armstrong sayıdır çünkü
3^3 + 7^3 + 1^3 = 371. Program 7.5'de iç içe geçmiş üç for döngüsü ile
bütün Armstrong sayıları bulup ekrana yazar. İnceleyiniz.
Program 7.5: iç-içe for döngüleri
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
|
/* 07prg05.c:
Üç basamaklı, basamaklarının küpleri toplamı kendisine eşit olan tam
sayılara Armstrong sayı denir. Örneğin: 371 = 3^3 + 7^3 + 1^3.
Bu program İç-içe geçmiş 3 döngü ile bütün Aramstrong sayıları bulur. */
#include <stdio.h>
int main()
{
int a,b,c, kup, sayi, k=1;
for(a=1; a<=9; a++)
for(b=0; b<=9; b++)
for(c=0; c<=9; c++)
{
sayi = 100*a + 10*b + c; /* sayi = abc (üç basamaklı) */
kup = a*a*a + b*b*b + c*c*c; /* kup = a^3+b^3+c^3 */
if( sayi==kup ) printf("%d. %d\n",k++,sayi);
}
return 0;
}
|
ÇIKTI
1. 153
2. 370
3. 371
4. 407
|
7.5 Sonsuz Döngü
Bir döngü işlemini sonsuz kere tekrarlarsa bu döngü sonzuz
döngü olarak adlandırılır. Böyle bir döngü için, koşul çok önemlidir. Örneğin
while döngüsü için:
... while(1) { printf("Sonsuz döngü içindeyim...\n"); } ...yada
... while(7>3) { printf("Sonsuz döngü içindeyim...\n"); } ...
Her iki durumda da çevrimler, sonsuz döngü durumundadır. Çünkü
while(1) ve while(7>3) ifadelerdeki koşullar daima
olumludur. Bu durumda çevrim sonsuz döngüye girer.
for döngüsünde, başlangıç, koşul ve artım
parametrelerinden herhangi birini kullanmak isteğe bağlıdır. Her hangi biri
verilmediğinde döngünün nasıl davranacağı iyi yorumlanmalıdır. Örneğin
for döngüsünün hiçbir parametresi verilmezse, döngü sonsuz çevrime
girer. Yani:
for(;;) printf("Sonsuz döngü içindeyim...\n");gibi.
7.6 break Deyimi
Bir C programında, bir işlem gerçekleştirilirken, işlemin sona
erdirilmesi bu deyim ile yapılır. Örneğin, döngü deyimleri içindekiler
yürütülürken, çevrimin, koşuldan bağımsız kesin olarak sonlanması gerektiğinde
bu deyim kullanılır. Mesela:
... do{ scanf("%d",&x); if(x==0) break; printf("%f",1.0/x); }while(1); ...
Yukarıdaki program parçasında, do ... while
döngüsündeki koşul daima olumludur. Bu durumda döngü sonsuzdur. Fakat döngü
içinde if deyimindeki koşul gerçekleşirse, döngü koşuluna bakılmaksızın
terkedilir. Bu işlemi sağlayan break deyimidir.
Program 7.6 klavyeden girilen sayı pozitif olduğu sürece
sayının faktoriyelini hesaplar. Sayı negatif olduğunda döngü break ile
sonlandırılır. Inceleyiniz.
Program 7.6: break deyiminin kullanımı
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
|
/* 07prg06.c: n>=0 olduğu sürece n! değerini hesaplar */
#include <stdio.h>
int main()
{
long int i,n,faktor;
while(1) /* sonsuz döngü */
{
printf("Faktoriyeli hesaplanacak sayi girin : ");
scanf("%ld",&n);
if(n<0) break; /* döngüyü sonlandır */
for(faktor=1, i=1; i<=n; i++)
faktor *= i;
printf("%ld! = %ld\n",n,faktor);
}
return 0;
}
|
ÇIKTI
Faktoriyeli hesaplanacak sayi girin : 2
2! = 2
Faktoriyeli hesaplanacak sayi girin : 3
3! = 6
Faktoriyeli hesaplanacak sayi girin : 5
5! = 120
Faktoriyeli hesaplanacak sayi girin : 9
9! = 362880
Faktoriyeli hesaplanacak sayi girin : 0
0! = 1
Faktoriyeli hesaplanacak sayi girin : -4
|
7.7 continue Deyimi
Bir döngü içerisinde continue deyimi ile
karşılaşılırsa, ondan sonra gelen deyimler atlanır ve döngü bir sonraki çevrime
girer. Örneğin:
... for(x=-50;i<=50;x++) { if(x<0) continue; /* x<0 ise alttaki satırı atla */ printf("%d\t%f",x,sqrt(x)); } ...Program parçasının çıktısı:
0 0.000000 1 1.000000 2 1.414213 3 1.732050 . . . . . . 50 7.071067
Program 7.7, x, y'den farklı olmak üzere |x|+|y|<=3
eşitsizliğini sağlayan tamsayı çiftlerini bulup ekrana yazar. Bu eşitsizliği
sağlayan toplam 22 çift vardır. Programda, her bir çift parantez içinde
yazdırılmıştır. İnceleyiniz.
Program 7.7: continue deyiminin kullanımı
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
|
/* 07prg07.c:
x, y'den farklı olmak üzere |x|+|y|<=3 eşitsizliğini sağlayan
tamsayı çiftlerini ekrana yazar */
#include <stdio.h>
int main()
{
int x,y,k=1;
for (x=-3;x<=3;x++)
for (y=-3;y<=3;y++)
{
/* x=y ise yeni çevrime gir, alt satırları atla */
if(x==y) continue;
if( abs(x)+abs(y)<=3 )
printf("%2d. (%2d,%2d)\n",k++,x,y);
}
return 0;
}
|
ÇIKTI
1. (-3, 0)
2. (-2,-1)
3. (-2, 0)
4. (-2, 1)
5. (-1,-2)
6. (-1, 0)
7. (-1, 1)
8. (-1, 2)
9. ( 0,-3)
10. ( 0,-2)
11. ( 0,-1)
12. ( 0, 1)
13. ( 0, 2)
14. ( 0, 3)
15. ( 1,-2)
16. ( 1,-1)
17. ( 1, 0)
18. ( 1, 2)
19. ( 2,-1)
20. ( 2, 0)
21. ( 2, 1)
22. ( 3, 0)
|
Hiç yorum yok:
Yorum Gönder