c switch case etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
c switch case etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
 Bu yazımızda c programlamada ve diğer çoğu programlama dilinde kullanılan switch-case yapılarını inceleyeceğiz ve örnekler yaparak pekiştireceğiz. 

switch Çoklu Seçim İfadesi


İf değimi doğru veya yanlış olmak üzere iki seçeneğe sahiptir. Oysa switch deyimi belli bir ifadenin çeşitli sayısal değerlerine karşı farklı işlemlerin yapılması için kullanılır.

switch(ifade){
    case <sabit_ifadesi1>: ..........................[break];
    case <sabit_ifadesi1>: ..........................[break];
    case <sabit_ifadesi1>: ..........................[break];
    ...
    [default: ..........;]
}

switch, case ve default birer anahtar sözcüktür. Derleyici switch parantezinin içerisindek ifadenin sayısal değerini hesaplar. Eğer bu değere eşit olan bir case ifadesi bulunursa programının akışını oraya yönlendirir. Eğer böyle bir ifade yoksa program akışı default ile belirtilen kısma geçer. Örneğin:

switch(n){
    case 1: printf("bir\n");
    case 2: printf("iki\n");
    case 3: printf("uc\n");
    case 4: printf("dort\n");
    case 5: printf("bes\n");
    default: printf("hicbiri");
}

Burada n = 1 ise programın akışı case 1: kısmına yönlendirilir. Akış buradan sırayla aşağıya inerek devam edecektir. Dolayısıyla ekranda:

bir
iki
uc
dort
bes
hicbiri

yazılarını görürsünüz. Döngülerden çıkmak için kullanılan break anahtar sözcüğü switch içerisinden çıkmak için de kullanılabilir. Bu durumda bir case ifadesi break ile sonlandırılırsa programın akışı diğer case ifadelerine geçmez.

switch(n){
    case 1: printf("bir\n");break;
    case 2: printf("iki\n");break;
    case 3: printf("uc\n");break;
    case 4: printf("dort\n");break;
    case 5: printf("bes\n");break;
    default: printf("hicbiri");break;
}

case anahtar sözcüğünün yanındaki ifadenin sabit ifade olması zorunludur. Çünkü derleyici derleme zamanında case ifadelerinin sayısal değerlerini hesaplamak zorundadır. Aşağıdaki örneği inceleyelim:


switch(x-1){
    case 8: .........break;
    case 12: ........break;
    case y-3: .......break;
    default:..............;
}

Burada son case ifadesi sabit olmadığı için switch geçersizdir. Birden fazla sayısal değer için aynı işlemlerin yapılması isteniyorsa aşağıdaki gibi bir yol izleyebilirsiniz. Bunun daha kısa yapılış yöntemi yoktur.

switch(vmode){
    case 2: 
    case 7: 
        vseg = 0xb000;break;
    case 3:  
        vseg = 0xb800;break;
    default: 
        printf("lutfen video modunu degistiriniz");
}

Yukarıdaki örnekte vmode değişkenin 2 ve 7 değerleri için aynı işlemler yapılmaktadır. 
default anahtar sözcüğünün sonda olması ve case sabitlerinin artan sırada olması zorunluluk değildir. Yani yukarıdaki örnek şöylede düzenlenebilirdi.

switch(vmode){
    default: 
        printf("lutfen video modunu degistiriniz");
     case 3:  
        vseg = 0xb800;break;
    case 7: 
    case 2: 
        vseg = 0xb000;break;
}
   
    
switch deyiminin son case ifadesi için break gerekmediğine dikkat ediniz. Diğer kontrol değimlerinde olduğu gibi  switch deyimi yalnızca bir deyim içeriyorsa bloklama yapmaya gerek yoktur.

Aşağıdaki örneği inceleyelim:

int yilingunu(int gun, int ay){

    int ygun= gun;
    
    switch(ay-1){   
        case 11: ygun += 30;
        case 10: ygun += 31;
        case 9: ygun += 30;
        case 8: ygun += 31;
        case 7: ygun += 31;
        case 6: ygun += 30;
        case 5: ygun += 31;
        case 4: ygun += 30;
        case 3: ygun += 31;
        case 2: ygun += 28;
        case 1: ygun += 31;
    }
    return ygun;
}
void main(){
    printf("%d\n, yilingunu(31,12));
}

yilingunu fonksiyonu ay ve gün ile belirlenen yıl içerisindeki bir tarihin yılın kaçıncı günü olduğunu bulunuyor. (Şubat ayının 28 çektiği varsayılıyor). switch içerisinde kümülatif toplam yapabilmek için break kullanılmadığına dikkat ediniz.


Örnekler

1) Hesap makinesi yapımı:

#include <stdio.h>

int main() {

  char op;
  double first, second;
  printf("Enter an operator (+, -, *, /): ");
  scanf("%c", &op);
  printf("Enter two operands: ");
  scanf("%lf %lf", &first, &second);

  switch (op) {
    case '+':
      printf("%.1lf + %.1lf = %.1lf", first, second, first + second);
      break;
    case '-':
      printf("%.1lf - %.1lf = %.1lf", first, second, first - second);
      break;
    case '*':
      printf("%.1lf * %.1lf = %.1lf", first, second, first * second);
      break;
    case '/':
      printf("%.1lf / %.1lf = %.1lf", first, second, first / second);
      break;
    // operator doesn't match any case constant
    default:
      printf("Error! operator is not correct");
  }

  return 0;
}

Ekran Çıktısı:

Enter an operator (+, -, *, /):
Enter two operands: 1.5
4.5
1.5 * 4.5 = 6.8


2) İç içe switch-case örneği:


#include <stdio.h>

int main() {
int a = 5;
int b = 10;
switch (a) {  //Outer switch

 case 25/5:
             switch (b) {  // Inner switch. 
               case 100/10:
                     printf("I am inside two switches!!\n");
                     break;
               default:
                     printf("me too!\n");
             }
             break;
 default:
             printf("I am default\n");
}
}

Ekran Çıktısı:

 I am inside two switches!! 


3)  Basit bir ATM yapalım. Bu ATM de sadece para çekme, para yatırma ve bakiye sorgula işlemleri olsun. Her bir durum için farklı komutlar yazarak bu yapıyı kuracağız.


#include <stdio.h>
 
main()
{
    int bakiye = 1000;
    int islem,tutar;
    
    printf("Bakiyeniz: %d",bakiye);
    printf("\n\n**** ISLEMLER ****\n");
    printf("1. Para Cekme\n");
    printf("2. Para Yatirma\n");
    printf("3. Para Bakiye Sorgulama\n");
    printf("4. Kart Iade\n");
    
    printf("Isleminizi seciniz : ");
    scanf("%d",&islem);
    
    switch(islem){
        case 1:
                   printf("Bakiyeniz : %d\n",bakiye);
                   printf("Cekmek istediginiz tutari giriniz : ");
                   scanf("%d",&tutar);
                   if(tutar>1000){
                   printf("Yetersiz bakiye tekrar giriniz !!");
                   scanf("%d",&tutar);
            }
                     bakiye -= tutar;
                     printf("Yeni Bakiyeniz : %d",bakiye);
                     break;
        case 2:
                     printf("Bakiyeniz : %d\n",bakiye);
                     printf("Yatirmak istediginiz tutari giriniz : ");
                     scanf("%d",&tutar);
                     bakiye += tutar;
                     printf("Yeni Bakiyeniz : %d",bakiye);
                     break;
        case 3:
                     printf("Bakiyeniz : %d\n",bakiye);
                     break; 
        case 4:
                 printf("Kartinizi almayi unutmayin!");
                     break;                 
    }
 
}

Ekran Çıktısı:














Kaynaklar:
A'dan Z'ye C Kılavuzu - Kaan Aslan
https://www.scaler.com/topics/switch-case-in-c/
https://www.programiz.com/c-programming/examples/calculator-switch-case
https://www.kodbloklari.com/c-dilinde-switch-case-yapisi/