C Programlama Dili'ne Giriş

  Dersler
* �ns�z

* Giriş
* Veri Tipleri, De�i�kenler
* Operat�rler
* Temel G/� Fonksiyonlar�
* Temel K�t�phane Fonksiyonlar�
* Kar��la�t�rma Deyimleri
* D�ng�ler
* Fonksiyonlar I
* Fonksiyonlar II
* Diziler
* G�sterici (Pointer) Kavram�
* Katarlar (Stringler)
* Dinamik Bellek Y�netimi
* G�sterici Uygulamalar�
* Yap�lar ve Birlikler
* Dosya Y�netimi
* Bit D�zeyinde �al��mak
* Port Denetimi
* Grafik Kullan�m�
* C Makrolar�

* K�saca C++
* Derleme Se�enekleri
* Tarih-Saat Fonksiyonlar�
* Monte-Carlo Y�ntemleri
* Fortran ve C

* Yararlan�lan Kaynaklar

  C/C++ Derleyicileri
* Dev-C++
* Salford (silversoft FTN95)
* GCC
* Turbo C
* Eclipse IDE
* NetBeans IDE

  D�� Ba�lant�lar
* programlama.com
* C Programc�lar� Derne�i

* C (wikipedia)
* C++ (wikipedia)
* cplusplus.com
* koders.com
* Hot scripts

 

Ders 6: Karsilastirma Deyimleri

###################- (%95)

En son gncelleme: Wed, 30 Nov 2011 13:22:02 +0200

Giris

Program ierisinde bazen iki veya daha fazla degerin karsilastirilmasi gerekebilir. Bunun iin, btn programlama dillerinde karsilastirma deyimleri mevcuttur. C dili, if, switch ve ? olmak zere tip karsilastirma islemi yapmaya izin verir. Ancak ? bir operatrdr. if karsilastirma deyimi ile, diger programlama dilinde oldugu gibi if-else yapisi da kurulabilir. switch deyimi, bir degiskenin ierigine gre program akisini ynlendirir.


6.1   Karsilastirma Operatrleri ve Mantiksal Operatrler

Tablo 6.1'de listelenen Karsilastirma Operatrleri, sayisal degerleri veya karakterleri mukayese etmek iin kullanilir.

Tablo 6.1: Karsilastirma Operatrleri

Operatr Aiklama rnek Anlami
> byktr x > y x, y den byk m?
< kktr x < y x, y den kk m?
== esittir x == y x, y ye esit mi?
>= byk-esittir x >= y x, y den byk yada esit mi?
<= kk-esittir x <= y x, y den kk yada esit mi?
!= esit degil x != y x, y den farkli mi?

Birden ok karsilastirma islemi, Tablo 6.2'deki Mantiksal Operatrler'le birlestirilebilir.

Tablo 6.2: Mantiksal Operatrler

Operatr Aiklama rnek Anlami
&& mantiksal VE x>2 && x<y x, 2 den byk VE y den kk m?
|| mantiksal VEYA x>2 || x<y x, 2 den byk VEYA y den kk m?
! mantiksal DEGIL !(x>2) x, 2 den byk degilse

C dilinde, bir mantiksal islemin sonucu tamsayi 0 (sifir) veya baska bir deger olur. 0 olumsuz 0'dan farkli degerler olumlu olarak yorumlanir. Buna gre, asagidaki program parasinin

      ...
      int x = 1, y = 2, s, u, z;

      s = 2 > 1;
      u = x > 3;
      z = x <= y && y >0;

      printf("%d\t%d\t%d", s, u, z);
      ...
iktisi:
      1       0       1
seklinde olur. Bunun nedeni:
  • 2 her zaman 1 den byk oldugu iin s degiskenine 1,
  • x = 1 < 3 oldugu iin x degiskenine 0,
  • z = x <= y && y >0; esitligin sagtarafinin sonucu olumlu oldugu iin z degiskenine 1 atanir.

6.2   if, if-else Yapisi

Bu deyimler, kosullu islem yapan deyimlerdir. if ve else tek bir karsilastirma deyimi olup else kullanimi istege baglidir. Eger bu kosul olumlu ise if den sonraki blm yrtlr ve else den sonraki blm atlanir. Kosul olumsuz ise if den sonraki kme atlanir ve eger varsa, else den sonraki kmedeki islemler gereklestirilir.

if deyiminin yapinin genel biimi syledir:
     if(kosul)
     {
       ...                     
        deyimler; (kme)
       ...                    
     }

if deyimi kullanilirken kmenin baslangici ve bitisini gsteren, kme parantezleri kullanilmasinda kullaniciya bir esneklik sunulmustur. Eger if deyiminden sonra icra edilecek deyimler tek satirdan olusuyorsa, bu isaretlerin kullanilmasi zorunlu degildir. Yani, if deyimden sonra { ve } isaretleri kullanilmamissa, bu deyimi takip eden sadece ilk satir isleme konur. Bu durum, else if, else deyimlerinde ve daha sonra islenecek for ve while gibi dng deyimlerinde de geerlidir.

Buna gre asagidaki kullanim

      if(x == y){
        puts("x ve y esit");
      }
ile
      if(x == y)
        puts("x ve y esit");
esdegerdir.

if deyiminin else ile birlikte kullanimi su sekildedir:

      if(kosul){
        ...
        deyimler; (kme1)     
        ...
      }
   
      else{
        ...
        deyimler; (kme2)
        ... 
      }

Bu yapinin kullanilmasina dair bir rnek Program 6.1'de gsterilmistir. Program, klavyeden girilen bir tamsayinin ift olup olmadigini sinar. Bilindigi gibi, ift sayilar, 2 ile kalansiz blnebilen sayilardir.

Program 6.1: if-else deyiminin kullanimi
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
/* 06prg01.c
   Klavyeden girilen bir sayinin ift olup olmadigini sinar. */

#include <stdio.h>

int main()
{
      int sayi;

      printf("Bir sayi girin: ");
      scanf("%d",&sayi);


      if (sayi % 2 == 0)
          printf("sayi cifttir.\n");
      else
          printf("sayi tektir.\n");

  return 0;
}

IKTI

Bir sayi girin: 3
sayi tektir.

Mantiksal Operatrler kullanarak birden ok karsilastirma birlestirilebilir. Buna iyi bir rnek Program 6.2'de gsterilmistir. Program, bir yilin artik yil olup olmadigini sinar. Bir yil iinde, ubat ayi 29 gn olursa o yil artik yil olarak adlandirilir. Artik yil peryodik olarak 4 yilda bir gelir. Genel kani "bir yil 4 ile tam blnebirse o yil artik yildir" seklindedir. Fakat 1996 artik yil iken 1800 artik yil degildir. Genel sorgulama syle olmalidir: Eger bir yil

  • 4 ile tam blnyorsa VE 100'e tam blnmyorsa VEYA
  • 400 'e tam blnryorsa

o yil artik yildir.

Program 6.2: if-else deyiminin kullanimi
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
/* 06prg02.c: Bir yilin artik yil olup olmadigini sinar. */

#include <stdio.h>

void main()
{
  int yil;

  printf("Bir yil girin: ");
  scanf("%d",&yil);

  if( yil % 4 == 0 && yil % 100 != 0 || yil % 400 == 0 ) 
       printf("%d artik yil\n",yil);

  else
      printf("%d artik yil degil\n",yil);

}

IKTI

Bir yil girin: 1996
1996 artik yil

Eger program iinde kullanilacak kosullarin sayisi ikiden ok ise asagidaki yapi kullanilir:

      if(kosul_1)
      {
        ...
        deyimler; (kme_1)           
        ...
      }
      else if(kosul_2)
      {
        ...
        deyimler; (kme_2)
        ...
      }
      .
      .
      .
      else if(kosul_n-1)
      {
        ...
        deyimler; (kme_n-1)
        ...
      }
      else
      {
        ...
        deyimler; (kme_n)
        ...
      }

Program 6.3, ax2 + bx + c = 0 formundaki ikinci dereceden bir polinomun kklerini hesaplamaktadir. Programda delta degerinin sifirdan kk olmasi durumda kklerin karmasik sayiya dnsecegide gz nne alinmistir. Bu program if, else if ve else yapisi gstermek iin klasik bir rnektir.

Program 6.3: if, else if, else yapisi
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
 /* 06prg03.c:
    ax*x + bx + c = 0 denkleminin (karmasik sayili kkler dahil) zm */

#include <stdio.h>
#include <math.h>

int main()
{
    float a, b, c, delta, x1, x2, x, kok_delta;

    printf("a, b, c degerlerini girin:\n");
    scanf("%f %f %f",&a,&b,&c);

    delta = b*b - 4.0*a*c;

    if( delta > 0.0 ){
       x1 = ( -b + sqrt(delta) )/( 2.0*a );
       x2 = ( -b - sqrt(delta) )/( 2.0*a );

       printf("\nReel kokler:");
       printf("\nx1 = %f",x1);
       printf("\nx2 = %f",x2);
    } 
    else if( delta < 0.0 ){
       kok_delta = ( sqrt(-delta) ) / (2.0*a);
       x = -0.5*b/a;

       printf("\nKarmasik kokler:");
       printf("\nx1 = %f + (%f)i", x, kok_delta);
       printf("\nx2 = %f - (%f)i", x, kok_delta);
    }
    else{
       x = -0.5*b/a;

       printf("\nKokler esit:");
       printf("\nx1 = x2 = %f",x);
    }

  return 0;
}

IKTI

a, b, c degerlerini girin:
2 4 -8

Reel kokler:
x1 = 1.236068
x2 = -3.236068

IKTI

a, b, c degerlerini girin:
1 1 1

Karmasik kokler:
x1 = -0.500000 + (0.866025)i
x2 = -0.500000 - (0.866025)i


6.3   switch - case Yapisi

Bu deyim bir degiskenin ierigine bakarak, programin akisini bir ok seenekten birine ynlendirir. case (durum) deyiminden sonra degiskenin durumu belirlenir ve takip eden gelen satirlar (deyimler) isleme konur. Btn durumlarin aksi sz konu oldugunda gereklestirilmesi istenen deyimler default deyiminden sonraki kisimda bildirilir. Genel yazim biimi:

      switch(degisken)
      {
           case sabit1:
              ...
              deyimler;
               ...
           case sabit2:
               ...
               deyimler;
               ...
           .
           .
           .
           case sabitn:
               ...
               deyimler;
               ...
           default:
               ...
               hata deyimleri veya varsayilan deyimler;
               ...
      }

Program Program 6.4'te switch deyiminin basit bir kullanimi gsterilmistir.

Program 6.4: switch-case yapisinin kullanimi
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
/* 06prg04.c: switch - case yapisinin kullanimi */

#include <stdio.h>

int main(void)
{
    char kr;

    printf("Lutfen bir karakter girin\n");

    kr = getchar(); /* tek bir karakterin okunmasi */

    switch (kr)
    {
       case 'a':
          printf("a harfine bastiniz\n");
       case 'b':
          printf("b harfine bastiniz\n");
       default:
          printf("a veya b ye basmadiniz\n");
    }

return 0;
}

IKTI

Lutfen bir karakter girin
a
a harfine bastiniz
b harfine bastiniz
a veya b ye basmadiniz

IKTI

Lutfen bir karakter girin
b
b harfine bastiniz
a veya b ye basmadiniz

IKTI

 
Lutfen bir karakter girin
k
a veya b ye basmadiniz

IKTI

Ltfen bir karakter girin
c
a veya b ye basmadiniz

Programda, klavyeden okunan tek bir karakter degiskenin ierigine bakilip uygun dallanmalar yaptirilmistir. 11. satirda degisken getchar() fonksiyonu ile okutulmustur. Eger 'a' veya 'b' karakterlerinden biri girilirse, ekrana bu harflerin girildigine dair mesaj yazilacak, aksi takdirde bu karakterin disinda bir karakterin giris olarak kullanildigi gsteren bir mesaj yazilacaktir. rnegin 'c' karakteri klavyeden girilmis ise a veya b ye basmadiniz gibi. Fakat 'a' karakterleri girildiginde ekrana her durumda yazdirilmaktadir. Bunun sebebi, case 'a': durumunda sirasiyla 16, 18 ve 20. satirlarin isleme konmasidir. Bunu engellemek iin 16. satirdan sonra programin baska bir yere ynlendirilmesi gerekir. Bu ynlendirme, Blm 7'de anlatilacak olan break deyimi ile yapilir. Derleyici bu deyim ile karsilastiginda, bulundugu yapinin iinden kosulsuz olarak ayrilir ve takip eden isleme baslar[1].

Program 6.4'te case 'a': durumu iin 16, 18 ve 20. satirlar da isleme konumustu. Eger klavyeden 'a' karakterini girip ekrana sadece a harfine bastiniz iletisi yazdirilmak isteniyorsa, 20. satira break deyimi ilave edilmelidir. break deyiminin kullanimi Program 6.5'te gsterilmistir.

Program 6.5: switch-case yapisi ve break kullanimi
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
/* 06prg05.c: switch - case yapisi ve break kullanimi */

#include <stdio.h>

int main(void)
{
     char kr;

     printf("Lutfen bir karakter girin\n");

     kr = getchar(); /* tek bir karakterin okunmasi */

     switch (kr)
     {
       case 'a':
          printf("a harfine bastiniz\n");
          break;
       case 'b':
          printf("b harfine bastiniz\n");
          break;
       default:
          printf("a veya b ye basmadiniz\n");
          break;
     }

return 0;
}

IKTI

Lutfen bir karakter girin
a
a harfine bastiniz

IKTI

Lutfen bir karakter girin
k
a veya b ye basmadiniz

Program 6.6 switch-case yapisin farkli bir kullanimi ile ilgili bir rnektir. Programda, nce iki sayi isteniyor ardindan yapilan seimle bu sayilarin toplami, farki, arpimi veya orani ekrana yazdiriliyor.

Program 6.6: switch-case yapisi ve break kullanimi
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
/* 06prg06.c: switch-case yapisi */

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
      int   secim;
      float x,y, sonuc;

      printf("Iki sayi girin: ");
      scanf("%f %f",&x,&y);

      puts("*** Menu ***");
      puts("[1] Toplama");
      puts("[2] Cikarma");
      puts("[3] Carpma");
      puts("[4] Bolme");

      printf("Seciminiz: ");
      scanf("%d",&secim);

      switch( secim )
      {
         case 1: 
                sonuc = x + y;
                printf("Toplam = %f\n",sonuc);
                break;
         case 2:
                sonuc = x-y;
                printf("Fark = %f\n",sonuc);
                break;
         case 3:
                sonuc = x * y;
                printf("Carpim = %f\n",sonuc);
                break;
         case 4:
                sonuc = x/y;
                printf("Oran = %f\n",sonuc);
                break;
        default:
                puts("Yanlis secim !\a");
     }

  return 0;
}

IKTI

Iki sayi girin: 3 8
*** Menu ***
[1] Toplama
[2] Cikarma
[3] Carpma
[4] Bolme
Seciminiz: 1
Toplam = 11.000000

IKTI

Iki sayi girin: 3 8
*** Menu ***
[1] Toplama
[2] Cikarma
[3] Carpma
[4] Bolme
Seciminiz: 7
Yanlis secim !

switch-case yapisi if-else yapisinin bir alternatifidir. Yani, Program 6.6'daki switch-case kismi, if-else yapisi ile de asagidaki gibi yazilabilirdi. Inceleyiniz.

switch( secim )
{
         case 1: 
                sonuc = x + y;
                printf("Toplam = %f\n",sonuc);
                break;
         case 2:
                sonuc = x-y;
                printf("Fark = %f\n",sonuc);
                break;
         case 3:
                sonuc = x * y;
                printf("Carpim = %f\n",sonuc);
                break;
         case 4:
                sonuc = x/y;
                printf("Oran = %f\n",sonuc);
                break;
         default:
                puts("Yanlis secim !\a");
}
 if(secim == 1){
                sonuc = x + y;
                printf("Toplam = %f\n",sonuc);
 }
 else if(secim == 2){
                sonuc = x-y;
                printf("Fark = %f\n",sonuc);
 }
 else if(secim == 3 ){
                sonuc = x * y;
                printf("Carpim = %f\n",sonuc);
 }
 else if(secim == 4){
                sonuc = x/y;
                printf("Oran = %f\n",sonuc);
 }
 else{
                puts("Yanlis secim !\a");
 }

6.4   ? Karsilastirma Operatr

Bu operatr, if-else karsilastirma deyiminin yaptigi isi sinirli olarak yapan bir operatrdr. Genel yazim biimi:

      (kosul) ? deyim1 : deyim2;

Ilk nce kosul sinanir. Eger kosul olumluysa deyim1 aksi takdirde deyim2 degerlendirilir. deyim1 ve deyim2 de atama islemi yapilamaz. Ancak kosul deyiminde atama islemi yapilabilir. deyim1 ve deyim2 yerine fonksiyon da kullanilabilir. Asagida bu deyimin kullanimina ait rnekler verilmistir.

      x = ( a > b ) ? a : b;

Yukaridaki ifadede kosul a'nin b'den byk olmasidir. Eger olumluysa x adli degiskene a, degilse b degeri atanir. Bu sekilde kullanim if-else yapisi ile kurulmak istenirse:

      if( a > b )  x = a;
      else         x = b;

seklinde olacaktir. Program 6.7 ? karsilastirma operatrnn basit bir kullanimini gstermektedir.

Program 6.7: ? ve if kullanimi
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
/* 06prg07.c: ? ve if-else yapisinin kullanimi */

#include <stdio.h>

int main(void)
{
    float x, y, z;

    printf("x : "); scanf("%f",&x);
    printf("y : "); scanf("%f",&y);

      if(y)                        /* y, 0'dan farkli mi? */
        z = ( y > x ) ? x/y : x*y; /* y>x ise z = x/y, degilse z = x*y  */
      else
        z = 0.0;

    printf("z = %f\n",z);

 return 0;
}

IKTI

x : 3
y : 5
z = 0.600000

IKTI

x : 11
y : 0
z = 0.000000

12. satirdaki if deyimindeki kosul biraz farklidir. Genel olarak kosul bu sekilde bildirilirse, kosulun 0 dan farkli olup olmadigi sinanir. Yani:

      if(y)
ile
      if( y != 0 )
ayni anlamdadir.

Bu kullanim ok yagindir. Eger y, 0 dan farkli ise kosul olumlu olarak degerlendirilecektir. 13. satirda ? ile bir sinama yapilmaktadir. Eger y, x den byk ise z degiskenine x/y, aksi takdirde x*y degeri atanmaktadir. Eger y = 0 ise z degiskenine 0 degeri atanmaktadir.



Powered by PHP