onsan@home:~$

Switch Case Yapısı C Programlama

Switch case ifadeleri, uzun ve içiçe koşullu ifadelerin (if statements) yerine geçebilirler. Anahtarın (switch) içine verilen değişken değeri, her bir durumu takip eden değerle karşılaştırılır ve bir değer değişkenin değeriyle eşleştiğinde yani doğru durumu -doğru kasayı da diyebiliriz-  bulduğunda, bilgisayar bu noktadan itibaren programı yürütmeye devam eder.

Örneğin bir oyunda ana menü tasarlıyorsunuz ve kullanıcı eğer ;
1’e basarsa oyun kaldığı yerden başlayacak,
2’ye basarsa oyuna baştan başlayacak,
3’e basarsa ayarlara girecek,
4’e basarsa oyundan çıkacak.

Bu ihtimalleri hesaplamak için şimdiye kadar öğrendiğimiz ifadelerden if-else yapısını kullanarak bir çözüm elde edebiliriz. 4 adet if ifadesi işimizi görecektir. İşte bu gibi durumlarda kullanabileceğimiz bir diğer yapı da switch case yapısıdır. Kafalar daha fazla karışmadan switch case yapısının temel yapısını inceleyelim:

switch ( <değişken> ) {
case ilk-değer:
  Eğer ilk-değer == <değişken> ise buradaki kodlar çalıştırılır.
  break;
case diğer-değer:
  Eğer diğer-değer == <değişken> ise buradaki kodlar çalıştırılır.
  break;
...
default:
  Eğer hiçbir değer <değişken> değeri ile eşleşmiyorsa buradaki kodlar çalıştırılır.
  break;
}

Switch’in içerisinde bulunan değer bir değişkendir yani bir durumdur. Altında bulunan case, kendi değeri (ilk-deger) ile switch’in değeri () eşit ise iki noktadan sonrasının çalıştırılacağını söyler. Break ifadesi, case içerisindeki kodlar yürütüldükten sonra yapıyı sonlandırmayı sağlar. Break, içinde bulunduğu ve genellikle kıvırcık parantezlerle çevrili kod bloğunu kıran bir anahtar kelimedir. Bu sayede break ifadesi, programı, mevcut bloğun altındaki kodların -yani diğer case durumlarının- da çalıştırılmasından korur. Eğer break ifadesi koyulmasaydı, program mevcut case bloğundan başlayarak diğer bütün case ifadelerini de çalıştıracaktı ve bu hiç istemediğimiz bir durumdur. Switch case ifadeleri ile ilgili not edilmesi gerek bir diğer önemli husus da, case değerlerinin sabit tam sayı değerleri olmak zorunda olduklarıdır. Malesef şu şekilde bir kullanım doğru değildir:

int a = 10;
int b = 10;
int c = 20;

switch ( a ) {
case b:
  /* Kod */
  break;
case c:
  /* Kod */
  break;
default:
  /* Kod */
  break;
}

Bu arada switch case yapısında default durumu opsiyoneldir, isterseniz kodunuza eklemeyebilirsiniz. Ancak beklenmeyen bir durum ile karşılaşılması halinde başa çıkmak için kodumuza genellikle dahil ediyoruz. Eğer yapıya beklenmeyen bir girdi saptanırsa, default case kullanarak bir uyarıda bulunmak faydalı olabilir. Switch case yapıları eğer şartlar uygunsa, uzun if ifadelerine iyi bir alternatiftir. Sıklıkla kullanıcıdan girdi alınırken kullanılır. Aşağıda switch case yapısının nasıl kullanılacağını gösteren bir örnek var.

#include <stdio.h>

void playgame()
{
    printf( "Oyunu oyna fonksiyonu çağrıldı" );
}
void loadgame()
{
    printf( "Oyunu yükle fonksiyonu çağrıldı" );
}
void options()
{
    printf( "Ayarlar fonksiyonu çağrıldı" );
}
	
int main()
{
    int input;

    printf( "1. Play game\n" );  // Oyunu başlat
    printf( "2. Load game\n" );  // Oyunu yükle
    printf( "3. Options\n" );    // Ayarlar
    printf( "4. Exit\n" );       // Çıkış
    printf( "Selection: " );     // Seçim:
    scanf( "%d", &input );
    switch ( input ) {
        case 1:            /* İki nokta kullanılıyor, noktalı virgül değil */
            playgame();
            break;
        case 2:          
            loadgame();
            break;
        case 3:         
            options();
            break;
        case 4:        
            printf( "Oynadığınız için teşekkürler! Çıkış yapılıyor...\n" );
            break;
        default:   //  1, 2, 3 veya 4 dışındaki seçimler geçersiz seçim sayılıyor.
            printf( "Geçersiz seçim, çıkış yapılıyor!\n" );
            break;
    }
    getchar();

}

Bu program derlenebilir ancak fonksiyonların gövdeleri doldurulana kadar tam olarak doğru çalışmayacaktır. Bu örnek basit olmasına karşın girdi işlemeye güzel bir modeldir. Eğer bunu anlamakta zorlandıysanız case ifadeleri yerine if ifadeleri koymayı deneyin. Program tek sefer çalışıyor. Eğer bunu birden fazla kez göstermek isterseniz, örneğin geçersiz seçim halinde tekrar menüyü kullanıcıya göstermek isterseniz, tüm switch case yapısını bir sonsuz döngü içerisine alabilirsiniz. Şayet çıkış seçimi yani 4 değeri girilirse break anahtar kelimesi ile oluşturmuş olduğunuz sonsuz döngüyü kırabilirsiniz.