7 Ocak 2014 Salı

Karşılaştırma Deyimleri - Ders7

Ders7: Karşılaştırma Deyimleri


C dilinde if, switch ve ? olmak üzere üç tip karşılaştırma işlemi yapılır. Ancak ? bir operatördür. if karşılaştırma deyimi ile, diğer programlarda olduğu gibi if-else yapısı kurulabilir. switch deyimi, bir değişkenin içeriğine göre program akışını yönlendirme işlemini yapar.
if, if-else Yapısı
Bu deyimler koşullu işlem yapma deyimidir. if ve else tek bir karşılaştırma deyimi olup else kullanımı isteğe bağlıdır. Eğer bu koşul olumlu ise if den sonraki bölüm yürütülür ve else den sonraki bölüm atlanır. Koşul olumsuz ise if den sonraki küme atlanır ve eğer varsa, else den sonraki kümedeki işlemler gerçekleştirilir.
      if(koşul)
      {
        ...                     
         deyimler; (küme)      
        ...                    
      }                       
Program 7.1 de basit olarak if deyiminin kullanımı gösterilmiştir. Programda bu deyim kullanılırken kümenin başngıcı ce bitişini gösteren, küme parantezleri kullanılmamıştır. Eğer if deyiminden sonra icra edilecek deyimler tek satırdan oluşuyorsa, bu işaretlerin kullanılmasına gerek yoktur. Yada if deyimden sonra { ve } işaretleri kullanılmamışsa, bu deyimi takip eden sadece ilk satır işleme konur.
Program 7.1 : if deyiminin kullanımı
1:   /* if deyiminin kullanımı */
2:
3:   #include &ltstdio.h>
4:
5:   int x, y;
6:
7:   main()
8:   {
9:       /* test etmek için iki değer girin */
10:
11:      printf("\nBir tamsayı değeri girin, x: ");
12:      scanf("%d", &x);
13:      printf("\nBir tamsayı değeri girin, y: ");
14:      scanf("%d", &y);
15:
16:      /* değerleri karşılaştır ve sonucu ekrena yaz */
17:
18:      if (x == y)
19:          printf("x, y ye eşit\n");
20:
21:      if (x > y)
22:          printf("x, y den büyük\n");
23:
24:      if (x < y)
25:          printf("x, y den küçük\n");
26:
27:      return 0;
28:  }
Bir tamsayı değeri girin, x: 100
Bir tamsayı değeri girin, y: 10
x, y den büyük
Bir tamsayı değeri girin, x: 10
Bir tamsayı değeri girin, y: 100
x, y den küçük
Bir tamsayı değeri girin, x: 10
Bir tamsayı değeri girin, y: 10
x, y ye eşit

5. satırında global olarak bildirilen x ve y tamsayı değişkenleri, 12 ve 14. satırlarda scanf fonksiyonu ile klavyeden okutulmuştur. 18, 21 ve 24. satırlarda kullanılan if deyimlerindeki koşul ifadeleri (Bkz Tablo 2.5) ile x, y sayıları karşılaştırılmış ve sonuç ekrana uygun bir biçimde gösterilmiştir.
if deyiminin else ile birlikte kullanımı şu şekildedir:
      if(koşul)
      {
       ...
        deyimler;(küme1)
       ...
      }
   
     else
     {
      ...
       deyimler;(küme2)
      ... 
     }

Program 7.2 de if-else yapısı irdelenmiştir. Bu program dijital elektronikte kullanılan VEYA mantık kapısının bir similasyonudur. İki girişli VEYA kapısının davranışı; eğer girişlerin her ikisi de 0 ise çıkış 0, aksi takdirde sonuç 1 olacak şeklindedir. VEYA kapısının görevini veya_kapisi(x,y) fonksiyonu üslenmiştir. Burada x ve y giriş değişkenleridir. Fonksiyonun geri dönüş değeri iki tanedir. Çünkü kapının çıkışı, girişlerdeki dijital seviyelere bağlı olarak, iki durumludur, (1-0).
Program 7.2 : if-else yapısı
1:  /* Dijital VEYA kapısı simulasyonu */
2:
3:  #include <stdio.h>
4:
5:  int veya_kapisi( int x,int y );
6:
7:  int x,y,z;
8:
9:  main()
10: {
11:      x = 1;  /* mantıksal 1 */
12:      y = 0;  /* mantıksal 0 */
13:
14:      z = veya_kapisi(x,y);  /* VEYA işlemi yapılıyor... */
15:
16:      printf("%d ve %d nin VEYA işlemi : %d dir\n",x,y,z);
17:
18: return 0;
20: }
21:
22: int veya_kapisi(x,y)
23: {
24:     if( x==0 && y==0 ) return 0;
25:     else return 1;
26: }

11. ve 12. satırlarda tamsayı olarak tanımlanan x ve y değişkenlerine sırasıyla 1 ve 0 değerleri atanmıştır. z değişkenine ise veya_kapisi(x,y) fonksiyonun geri dönüş değeri atanmıştır. 24. satırda, Tablo 2.5 te verilen mantıksal VE operatörü ile iki farklı durum tek koşul yapısında birleştirilmiştir. Bu şekilde bütün mantık kapıları tanımlanırsa, bir çok dijital elektronik devryi tasarlamak mümkün olur. Bu yolla 8x1 Multiplexer oluşturabilirmisiniz?
Eğer program içinde kullanılacak koşulların sayısı 2 den çok ise şu yapı kullanılır:
      if(koşul)
      {
       ...
        deyimler;(küme1)
       ...
      }
   
     else if
     {
      ...
       deyimler;(küme2)
      ... 
     }
     else if
     {
      ...
       deyimler;(küme3)
      ... 
     }
     .
     .
     .
     else
     {
      ...
       deyimler;(kümeN)
      ... 
     }
Program 7.3 , ikinci dereceden bir polinomun köklerini hesaplamaktadır. Programda delta değerinin 0 dan küçük olması durumda köklerin karmaşık sayıya dönüşeceğide göz önüne alınmıştır. Bu program if, else if ve else yapısı göstermek için oldukça iyi bir örnektir.
Program 7.3 : if, else if, else

yapısı
1:  /* Diskirminant hesabı. 
2:  ** ax^2 + bx + c = 0 denkleminin, 
3:  ** karmaşık sayılı kökler dahil, çözümü.
4:  */
5:   #include <stdio.h>
6:   #include <math.h>   /* sqrt için */
7:   
8:   float a,b,c,delta,x1,x2,x,kok_delta;
9:   main()
10:  {
11:        printf("a, b, c değerlerini girin:\n");
12:        scanf("%f %f %f",&a,&b,&c);
13:
14:        delta = b*b - 4*a*c;
15:
16:        if( delta > 0.0 )
17:        {
18:               x1 = ( -b + sqrt(delta) )/( 2*a );
19:               x2 = ( -b - sqrt(delta) )/( 2*a );
20:
21:               printf("\nReel kökler :");
22:               printf("\nx1 = %f ve x2 = %f",x1,x2);
23:        }
24:
25:        else if( delta < 0.0 )
26:        {
27:               kok_delta = ( sqrt(-delta) ) / (2*a);
28:               x = -0.5*b/a;
29:
30:               printf("\nKarmaşık kökler :");
31:               printf("\nx1 = %f + %fi  ve  x2 = %f - %fi",x,kok_delta,x,kok_delta);
32:        }
33:
34:        else
35:        {
36:               x = -0.5*b/a;
37:
38:               printf("\nKökler eşit :");
39:               printf("\nx1 = x2 = %f",x);
40:        }
41:
42:  return 0;
43:  }
a, b, c değerlerini girin:
2. 3.5 -4.89
Reel kökler :
x1 = 0.916822 ve x2 = -2.666822

a, b, c değerlerini girin:
4. 4. 1.
Kökler eşit :
x1 = x2 = -0.500000

a, b, c değerlerini girin:
1. 1. 1.
Karmaşık kökler :
x1 = -0.500000 + 0.866025i  ve  x2 = -0.500000 - 0.866025i
12. satırda denklemin reel katsayıları a, b ve c klavyeden okunmaktadır. Daha sonra delta değerinin üç farklı durumu için elde edilecek kökler hesaplanır. 25. satırdaki delta değerinin 0 dan küçük olduğu durum, reel olmayan kökleri hesaplamak için kullanılır.
switch - case Yapısı
Bu deyim bir değişkenin içeriğine bakarak, programın akışını bir çok seçenekten birine yönlendiren bir deyimdir. case(durum) deyiminden sonra değişkenin durumu yazılır ve akabinde gelen satır işlenir. Bütün durumların aksi söz konu olduğunda gerçekleştirilmesi istenen deyimler default deyiminden sonraki kısımda bildirilir. Genel yazım biçimi;
      switch(degisken)
      {
             case sabit1:
                ...
                deyimler;
                 ...
             case sabit2:
                 ...
                 deyimler;
                 ...
             .
             .
             .
             case sabitN :
                 ...
                 deyimler;
                 ...
             default:
                 ...
                 varsayılan_deyimler;
                 ...
      }
Program Program 7.4 te switch fonksiyonun basit bir kullanımı gösterilmiştir.
Program 7.4 : switch-case yapısının kullanımı
1:  /* switch - case yapısının kullanımı */
2:  #include &ltstdio.h>
3:
4:  main()
5:  {
6:     char kr;
7:
8:     printf("Lütfen bir karakter girin\n");
9:     kr = getchar(); /* tek bir karakterin okunması */
10:
11:    switch (kr){
12:       case 'a':
13:          printf("a harfine bastınız\n");
14:       case 'b':
15:          printf("b harfine bastınız\n");
16:       default:
17:          printf("a veya b ye basmadınız\n");
18:    }
19: return 0;
20: }
Lütfen bir karakter girin
c
a veya b ye basmadınız

Lütfen bir karakter girin
a
a harfine bastınız
b harfine bastınız
a veya b ye basmadınız

Lütfen bir karakter girin
b
b harfine bastınız
a veya b ye basmadınız

Program 7.4 te klavyeden okunan tek bir karakter değişkenin içeriğine bakılıp uygun dallanmalar yaptırılmıştır. 9. satırda değişken getchar() fonksiyonu ile okutulmuştur. Eğer a veya b karakterlerinden biri girilirse, ekrana bu harflerin girildiğine dair mesaj yazılacak, aksi takdirde bu karakterin dışında bir karakterin giriş olarak kullanıldığı gösteren bir mesaj yazılacaktır. Örneğin c karakteri klavyeden girilmiş ise a veya b ye basmadınız gibi. Fakat a karakterleri girildiğinde ekrana her üç durumda yazdırılmaktadır. Bunun sebebi, case 'a': durumunda sırasıyla 13, 15 ve 17. satırların işleme konmasıdır. Bunu engellemek için 13. satırdan sonra programın başka bir yere yönlendirilmesi gerekir. Bu yönlendirme bir sonraki derste anlatılacak olan break deyimi ile yapılır. break bir işlemin sona erdirilmesi için kullanılan bir deyimdir. (Bkz Program 7.5 ).
Program 7.4 te case 'a': durumu için 13, 15 ve 17. satırlar da işleme konumuştu. Eğer klavyeden a değişkeni girip ekrana sadece a harfine bastınız iletisi yazdırılmak isteniyorsa, 13. satıra break deyimi ilave edilmelidir. break deyiminin kullanımı Program 7.5 te verilmiştir.
Program 7.5 : switch-case yapısı ve break kullanımı
1:  /* switch - case yapısı ve break kullanımı */
2:  #include &ltstdio.h>
3:
4:  main()
5:  {
6:     char kr;
7:
8:     printf("Lütfen bir karakter girin\n");
9:     kr = getchar(); /* tek bir karakterin okunması */
10:
11:    switch (kr){
12:       case 'a':
13:          printf("a harfine bastınız\n");break;
14:       case 'b':
15:          printf("b harfine bastınız\n");break;
16:       default:
17:          printf("a veya b ye basmadınız\n");break;
18:    }
19: return 0;
20: }
Lütfen bir karakter girin
a
a harfine basırınız

Program 7.5 in Program 7.4 ten farkı 13, 15 ve 17. satırların sonuna break deyimlerinin konmuş olmasıdır. Derleyici bu deyim ile karşılaştığında, bulunduğu yapının içinden koşulsuz olarak ayrılır ve takip eden işleme başlar. Program 7.5 te break ile switch - case yapısı terkedilmiştir.
Program 7.6 switch-case yapısın fonksiyonlarla kullanımı ile ilgili önemli bir örnektir. Programda, menü puts fonksiyonları kullanılarak ekrana yazdırılmış ve arkasından bir karakter okunarak, menüden hangisinin seçildiği kr değişkenine aktarılmıştır; switch-case yapısı ile uygun olan fonksiyonlara dallandırılmıştır.
Program 7.6 : switch-case
yapısının fonksiyonlarla kullanımı
1:  /* switch-case yapısının fonksiyonlarla kullanımı */
2:
3:  #include <stdio.h>
4:
5:  char menu(void);
6:  int topla( int a,int b );
7:  int carp( int a,int b );
8:
9:  main()
10: {
11:      char oku;
12:      int x,y,sonuc;
13:
14:      x = 10;  /* x e bir değer atanıyor */
15:      y = 20;  /* y e bir değer atanıyor */
15:
16:      oku = menu();
17:      switch( oku )
18:      {
19:            case '1':
20:                 sonuc = topla(x,y);
21:                 printf("Toplamları : %d",sonuc);
22:                 break;
23:            case '2':
24:                 sonuc = carp(x,y);
25:                 printf("Çarpımları : %d",sonuc);
26:                 break;
27:            case '3':
28:                 printf("Program sonu...");
29:                 exit();
30:      }
31:  }
32:
33: /* menu fonksiyonu */
34: char menu(void)
35: {
36:      char kr;
37:      puts("[1]. Toplama");
38:      puts("[2]. Carpma");
39:      puts("[3]. Çıkış");
40:      puts("Seçiminiz ?");
41:
42:      kr = getchar();
43:      return kr;
44: }
45:
46: /* topla fonksiyonu */
47: int topla( int a,int b )
48: {
49:   return (a+b);
50: }
51:
52: /* carp fonksiyonu */
53: int carp( int a,int b )
54: {
55:  return (a*b);
56: }
[1]. Toplama
[2]. Çarpma
[3]. Çıkış
Seçiminiz ?
1
Toplamları : 30
Program 7.6 da 14. ve 15. satırlarda tanımlanan x ve y tamsayılarına başlangıç değerleri atanmıştır (x ve y scanf fonksiyonu ile klavyeden okutulabilirdi). oku karakter değişkenine menu fonksiyonunun geri dönüş değeri (kr) atanmış ve switch fonksiyonuna 17. satırda parametre olarak aktarılmıştır. 19. satırdaki durum gerçekleştiğinde x ve y sayılarının toplamları topla fonksiyonu ile sonuc değişkenine aktarılmıştır. Bu değişkenin içeriği 21. satırda ekrana yazılmıştır. 22. satırdaki break deyimi ile switch-case yapısı terkedilmiştir. Yani switch deyiminden sonraki satır (main fonksiyonuna ait } işareti) işleme konuştur. Program sonlanmıştır. Aynı şeyler 23. satırdaki durum içinde geçerlidir. 27. satırdaki durum gerçekleştiğinde ekrana Program sonu... ifadesi yazılır ve exit() fonksiyonu ile şartsız olarak program sonlandırılır.
? Karşılaştırma Operatörü
C dilinde if-else karşılaştırma deyiminin yaptığı işi sınırlı olarak yapan bir operatördür. Genel yazım biçimi:
      (koşul) ? deyim1 : deyim2;
İlk önce koşul sınanır. Eğer koşul olumluysa (1 ise) deyim1 aksi takdirde deyim2 değerlendirilir. deyim1 ve deyim2 de atama işlemi yapılamaz. Ancak koşul deyiminde atama işlemi yapılabilir. deyim1 ve deyim2 yerine fonksiyon da kullanılabilir. Aşağıda bu deyimin kullanımına ait örnekler verilmiştir.
      x = ( a > b ) ? a : b;
Yukarıdaki ifadede koşul a'nın b'den büyük olmasıdır. Eğer olumluysa x adlı değişkene a, değilse b değeri atanır. Bu şekilde kullanım if-else yapısı ile kurulmak istenirse:
     if( a > b )  x = a;
     else         x = b;
şeklinde olacaktır.
Program 7.7 : ? - if-else yapısının kullanımı
1:  /* ? ve if-else yapısının kullanımı */
2:  #include <stdio.h>
3:
4:  main()
5:  {
6:       int x,y,z;
7:
8:       printf("x : ");scanf("%d",&x); /* x okunuyor */
9:       printf("y : ");scanf("%d",&y); /* y okunuyor */
10:
11:      if( x )  /* x 0 dan farklı mı? */
12:        z = ( y > x ) ? x*y : x+y;   /* y>x ise z=x*y, değilse z=x/y */
13:      else
14:        z = 0;
15:
16:      printf("z = %d",z);
17:
18: return 0;
19: }
x : 0
y : 6
z = 0

x : 5
y : 9
z = 45

x : 8
y : 2
z = 10

Hiç yorum yok:

Yorum Gönder