6 Ocak 2014 Pazartesi

C dili Döngüler - Ders8


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 &ltstdio.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

2 yorum:

  1. for ile while arasındaki fark nedir?

    YanıtlaSil
  2. for döngüsün de döngü bitirme işlemi verdiğin sınırlarla belirlenir.(sayılsal değerler)
    while döngüsünü istediğiniz bir koşul sonucu sonlandırabilirsiniz.(özel koşullar.)

    YanıtlaSil