Ders8: Döngüler
Bu tip deyimler bir kümenin belli bir koşul altında yinelenmesi için kullanılır.
while, do...while ve for olmak üzere üç tip döngü deyimi
vardır. C de diğer programlama dillerinde olduğu gibi, bu deyimlerle istenildiği kadar
iç-içe döngü yapısı kullanılabilir.
while
Tekrarlama deyimidir. Bir küme ya da deyim while kullanılarak bir çok kez yinelenebilir.
Yinelenmesi için koşul sınaması çevrim başında yapılır.
Koşul olumlu olduğu sürece çevrim yinelenir. İki veya daha çok koşul mantıksal operatörler
birleştirilerek verilebilir. Bu deyimin kullanımı Program 8.1 de gösterilmiştir.
Genel yazım biçimi:
while(koşul) { ... döngüdeki deyimler; [küme] ... }Program 8.1 : while döngüsünün kullanımı
1: /* while kullanımı */ 2: #include <stdio.h> 3: 4: main() 5: { 6: 7: int x=0; 8: 9: while(x <= 10) 10: printf("%d\n",x++); 11: 12: return 0; 14: } 0 1 2 3 4 5 6 7 8 9 10
Program 8.1 in amacı, 0-10 arasındaki sayıları ekrana yazdırmaktır.
9. satırdaki while ifadesinden 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.
do ... while
Bu deyim while dan farkı, koşulun döngü sonunda sınanmasıdır. Yani koşul
sınanmadan çevrime 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 8.2 de gösterilmiştir. Genel yazım biçimi:
do { ... döngüdeki deyimler; ... }while(koşul);Program 8.2 : do-while döngüsünün kullanımı
1: /* do-while kullanımı */ 2: #include <stdio.h> 3: 4: main() 5: { 6: int sayi; 7: 8: do 9: { 10: printf("Bir sayı girin : "); 11: scanf("%d",&sayi); 12: printf("Bu sayının iki katı : %d\n",2*sayi); 13: 14: }while( sayi>0 ); /* koşul */ 15: 16: puts("Çevrim sona erdi."); 17: 18: return 0; 19: } Bir sayı girin : 2 Bu sayının iki katı : 4 Bir sayı girin : 5 Bu sayının iki katı : 10 Bir sayı girin : 9 Bu sayının iki katı : 18 Bir sayı girin : 0 Bu sayının iki katı : 0 Çevrim sona erdi.
14. satırdaki koşul olumlu olduğu sürece (klavyeden girilen sayi > 0 olduğu sürece),
klavyeden yeni bir değer 11. satırda okunur. Aksi takdirde sayi <=0 ise
çevrimin sona erdiğine dair mesaj 16. satırdaki puts fonksiyonu ile verilir.
for
Diğer döngü deyimleri gibi bir öbeği bir çok kez tekrarlamakta 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 8.3 de gösterilmiştir
Genel yazım biçimi:
for( başlangıç ; koşul ; artım ) { ... döngüdeki deyimler; ... }Program 8.3 : for döngüsü ile faktoriyel hesabı
1: /* for döngüsünün kullanımı */ 2: #include <stdio.h> 3: 4: long faktoriyel(int n); 5: 6: main() 7: { 8: int x; 9: 10: printf("\nFaktoriyeli hesaplanacak sayı girin : "); 11: scanf("%d",&x); 12: 13: if(x<0 data-blogger-escaped-0="" data-blogger-escaped-14:="" data-blogger-escaped-15:="" data-blogger-escaped-16:="" data-blogger-escaped-17:="" data-blogger-escaped-18:="" data-blogger-escaped-19:="" data-blogger-escaped-1="" data-blogger-escaped-20:="" data-blogger-escaped-21:="" data-blogger-escaped-22:="" data-blogger-escaped-23:="" data-blogger-escaped-24:="" data-blogger-escaped-25:="" data-blogger-escaped-26:="" data-blogger-escaped-27:="" data-blogger-escaped-28:="" data-blogger-escaped-29:="" data-blogger-escaped-30:="" data-blogger-escaped-31:="" data-blogger-escaped-32:="" data-blogger-escaped-33:="" data-blogger-escaped-:="" data-blogger-escaped-ay="" data-blogger-escaped-bu="" data-blogger-escaped-d="" data-blogger-escaped-dan="" data-blogger-escaped-de="" data-blogger-escaped-else="" data-blogger-escaped-eri="" data-blogger-escaped-erini="" data-blogger-escaped-fact="" data-blogger-escaped-faktoriyel="" data-blogger-escaped-faktoriyeli="" data-blogger-escaped-for="" data-blogger-escaped-geri="" data-blogger-escaped-girin="" data-blogger-escaped-h="" data-blogger-escaped-hesaplan="" data-blogger-escaped-hesaplanacak="" data-blogger-escaped-hesaplanamaz.="" data-blogger-escaped-hesaplar="" data-blogger-escaped-i="" data-blogger-escaped-ile="" data-blogger-escaped-int="" data-blogger-escaped-k="" data-blogger-escaped-ld="" data-blogger-escaped-long="" data-blogger-escaped-n="" data-blogger-escaped-ngu="" data-blogger-escaped-printf="" data-blogger-escaped-r="" data-blogger-escaped-return="" data-blogger-escaped-say="" data-blogger-escaped-tipinde="" data-blogger-escaped-x="" dir="">3
faktoriyeli : 6 dir Faktoriyeli hesaplanacak sayı girin : 10 faktoriyeli : 3628800 dir Faktoriyeli hesaplanacak sayı girin : 0 faktoriyeli : 1 dir Faktoriyeli hesaplanacak sayı girin : -4 Sayı 0 dan hüçük; faktoriyeli hesaplanamaz.
11. satırda okunan x tamsayısının faktoriyeli 16. satırda ekrana yazdırılır. Eğer
x < 0 ise 14. satırdaki mesaj ekrana çıkar. faktoriyel() fonksiyonu
kendisine parametre olarak gelen değişkenin, facktoriyelini 27. satırdaki
for döngüsünü kullanarak hesaplar. Fonksiyonun geri dönüş değeri long tipinde
tanımlanmıştır. Çünkü faktoriyel değeri 2 bayt tan büyük bir tamsayı olabilir.
Bir programda birden çok döngü yapısı iç içe kullanılabilir. İç içe döngülerin
kullanımı Program 8.4 de gösterilmiştir.
Program 8.4 : iç-içe for döngülerinin kullanılması1: /* iç-içe for döngüleri */ 2: 3: #include <stdio.h> 4: 5: void kutu_ciz( int, int); 6: 7: main() 8: { 9: kutu_ciz( 8, 35 ); 10: 11: return 0; 12: } 13: 14: void kutu_ciz( int satir, int sutun ) 15: { 16: int sut; 17: for ( ; satir > 0; satir--) 18: { 19: for (sut = sutun; sut > 0; sut--) 20: printf("X"); 21: 22: printf("\n"); 23: } 24: } XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Program 8.4 de sadece 20. satır defalarca işleme konur. Program çalıştırıldığında
8*35=280 adet X, ekrana bastırılır. 5. satırda kutu_ciz() fonksiyonunun prototipi
tanımlanmıştır. Bu fonksiyonun parametreleri (satir, sutun) ile
çizilecek olan kutunun ebatları belirlenir. 8 satır ve 35 sütun için main() fonsiyonundan
9. satırda çağırılmıştır. 17. satırda ilk for döngüsü çevrime başlar. Fakat bir başalangıç değeri
belirtilmemiştir, çünkü bu değer(satir) fonksiyondan buraya aktarılır. 19. satırda ikinci
for döngüsü çevrime başlar ve 20. satır bu döngünün içinde değerlendirilir. Yani satir'in
herbir değeri için, bütün sutun değerleri tekrarlanır. İkinci döngü tamamlandığında 22. satırda
alt satıra geçilir ve birinci çevrim yeni bir değer için yinelenir.
printf() fonksiyonu ile desimal(taban-10) syılarıların nasıl yazdırılacağı
bundan önceki kısımlarda gösterilmişti. Program 8.5 de Hexadesimal(taban-16)
sayıların bu fonksiyon kullanılarak yazdırılması gösterilmiştir.
Program 8.5 : Desimal ve heksadecimal sayıların bastırılması1: /* 0-15 desimal sayıların, hexadesimal sayı sistemine çevrilmesi. 2: ** %d -> desimal , 10 tabanındaki sayı 3: ** %x -> hexadesimal (küçük_harf), 16 tabanındaki sayı 4: ** %X -> hexadesimal (büyük_harf), 16 tabanındaki sayı 5: */ 6: #include <stdio.h> 7: 8:: main() 9: { 10: int i; 11: 12: printf("Hex(büyük harf) Hex(küçük harf) Desimal\n"); 13: for (i=0; i<16 data-blogger-escaped-0="" data-blogger-escaped-10="" data-blogger-escaped-11="" data-blogger-escaped-12="" data-blogger-escaped-13="" data-blogger-escaped-14:="" data-blogger-escaped-14="" data-blogger-escaped-15:="" data-blogger-escaped-15="" data-blogger-escaped-16:="" data-blogger-escaped-17:="" data-blogger-escaped-1="" data-blogger-escaped-2="" data-blogger-escaped-3="" data-blogger-escaped-4="" data-blogger-escaped-5="" data-blogger-escaped-6="" data-blogger-escaped-7="" data-blogger-escaped-8="" data-blogger-escaped-9="" data-blogger-escaped-a="" data-blogger-escaped-b="" data-blogger-escaped-c="" data-blogger-escaped-d="" data-blogger-escaped-desimal="" data-blogger-escaped-e="" data-blogger-escaped-f="" data-blogger-escaped-harf="" data-blogger-escaped-hex="" data-blogger-escaped-i="" data-blogger-escaped-k="" data-blogger-escaped-n="" data-blogger-escaped-printf="" data-blogger-escaped-return="" data-blogger-escaped-x="" data-blogger-escaped-y="">
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) deki
ifadelerde, koşul hep 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.
Break
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. Örneğin:
... do{ scanf("%d",&x); if(x==0) break; printf("%d",x); }while(1); ...
yukarıdaki program parçasında, do ... while döngüsünün koşu hep
olumludur. Bu durumda döngü sonnsuzdur. Fakat döngü içinde if deyimindeki
koşul gerçekleşirse, dögü koşuluna bakılmaksızın döngü terkedilir.
bu işlemi sağlayan break deyimidir.
Continue
Bir döngü içerisinde continue deyimi ile karşılaşılırsa, ondan sonra gelen deyimler
atlanır. Yani döngü, bir sonraki çevrime girer. Örneğin:
... for(x=-50;i<=50;x++){ if(x<0 data-blogger-escaped-...="" data-blogger-escaped-alttaki="" data-blogger-escaped-atla="" data-blogger-escaped-continue="" data-blogger-escaped-f="" data-blogger-escaped-ise="" data-blogger-escaped-lt="" data-blogger-escaped-printf="" data-blogger-escaped-r="" data-blogger-escaped-sat="" data-blogger-escaped-sqrt="" data-blogger-escaped-x=""> Program parçasının çıktısı:0.000000 1.000000 1.414213 1.732050 . . . 7.071067
for ile while arasındaki fark nedir?
YanıtlaSilfor döngüsün de döngü bitirme işlemi verdiğin sınırlarla belirlenir.(sayılsal değerler)
YanıtlaSilwhile döngüsünü istediğiniz bir koşul sonucu sonlandırabilirsiniz.(özel koşullar.)