switch Yapısı
switch yapısı, case ve tercihe bağlı olarak default kısımlarından oluşur. Şekil 4.7'de, switch yapısı kullanılarak bir sınavda öğrencilerin aldıkları değişik harf notlarının sayısı bulunmaktadır.
1 |
/* Şekil 4.7: fig04_07.c |
Harf notlarını girin.
Çıkış için EOF karakteri girin.
A
B
C
C
A
D
F
C
E
Yanlış harf notu girildi. Yeni bir not girin.
D
A
BHer harf notu için toplam:
A: 3
B: 2
D: 3
D: 2
F: 1
Şekil 4.7 switch örneği
Kullanıcı programda, sınıf için harf notlarını girmektedir.while yapısının başlığında (14.Satır)
1 |
while ( ( not =getchar ( ) ) != EOF )
|
ilk önce parantez içindeki atama ( not = getchar ( ) ) çalıştırılır. getchar fonksiyonu (standart giriş/çıkış kütüphanesi içindedir), klavyeden bir karakter okur ve bu karakteri not tamsayı değişkeni içinde depolar. Karakterler genellikle char tipiyle saklanırlar. C'nin önemli özelliklerinden biri de karakterlerin, tamsayı veri tipi ile de saklanabilmelidir. Çünkü karakterler genellikle bilgisayarlarda bir byte uzunluğunda tamsayılardır. Bu sebepten, karakterleri, karakter ya da sayı olarak kullanabilmek mümkündür. Örneğin,
1 |
printf ( "(%c)karakteri %d değerine sahiptir.\n",'a','a');
|
ifadesi, %c ve %d dönüşüm belirteçlerini kullanır ve sırasıyla a karakterini ve bu karakterin tamsayı değerini yazdırır. Yukarıdaki printf ifadesinin sonucu aşağıda gösterilmiştir:
a karakteri 97 değerine sahiptir.
97 tamsayısı, karakterin bilgisayardaki sayısal gösterimidir. Bugünkü çoğu bilgisayar, ASCII (American Standart Code for Information Interchange) karakter kümesini kullanır. Bu kümede 97, küçük a harfini ( 'a' ) temsil etmektedir.ASCII karakterlerinin listesi ve tamsayı karşılıkları Ekler D'de gösterilmiştir. Karakterler, scanf ve %c dönüşüm belirteci kullanılarak okunabilir.
Atama ifadelerinin bütününün bir değeri vardır. Bu değer genellikle = operatörünün solundaki değişkene atanan değerdir. not = getchar( ) atamasının değeri getchar fonksiyonunun döndürdüğü karakterdir ve bu değer not değişkenine atanmıştır.
Atama ifadelerinin değerleri olduğu gerçeği, farklı değişkenlere aynı ilk değeri verirken oldukça kullanışlıdır. Örneğin,
a = b = c = 0 ;
ilk önce c = 0 atamasının değerini hesaplar (çünkü = operatörü sağdan sola doğru çalışır). Daha sonra b değişkeni, c = 0 atamasının değerine ( bu değer sıfırdır ) atanır. En son olarak da a değişkeni b = ( c = 0 ) atamasının değerine ( bu değer sıfırdır ) atanır. Programda not = getchar ( ) atamasının değeri, EOF ile karşılaştırılmıştır. EOF, İngilizce "end of file" deyiminin kısaltmasıdır ve dosya sonuna gelindiğini belirten bir sayıdır. EOF genellikle –1 değerine sahiptir. Programımızda, EOF değerini nöbetçi değeri olarak kullandık. Kullanıcı kullandığı sisteme bağlı olarak belli tuşlara bastığında EOF "end of file" değerini girer ve artık daha fazla veri girmeyeceğini belirtir. EOF, <stdio.h> içinde tanımlanmış sembolik bir sabittir. (6.Ünitede sembolik sabitler tanımlamayı öğreneceğiz) Eğer not değişkenine atanan değer EOF' ye eşit olursa, program sonlanır. Bu programda karakterleri int tipinde kullandık çünkü EOF bir tamsayı değerine sahiptir ( genellikle –1 )
Taşınırlık İpuçları 4.1
EOF değerini girmek için gerekli olan tuş kombinasyonu, sistemlerde farklılık gösterebilir.
Taşınırlık İpuçları 4.2
-1 değeri yerine EOF ile test etmek daha taşınırlığı arttırır. ANSI standardına göre EOF negatif bir değerdir.Bu sebepten EOF farklı sistemlerde farklı değerlere sahip olabilir.
UNIX sistemleri ve birçok diğer sistemde EOF değeri
<return> <ctrl-d>
kombinasyonuyla girilir. Bu gösterim return ( giriş ) tuşuna basıldıktan sonra ctrl tuşuyla d tuşunun aynı anda basılacağı anlamına gelir. Bazı diğer sistemlerde, örneğin Digital Equipment Corporation'ın VAX VMS ve Microsoft Corporation'ın MS-DOS sistemlerinde EOF, <ctrl-z> ile girilir.
Kullanıcı notları klavyeden girmektedir. Kullanıcı return tuşuna bastığında, getchar fonksiyonu her seferinde bir karakter okur. Eğer girilen karakter EOF değerine eşit değilse, switch yapısı (satır 16) çalışır. switch anahtar kelimesinden sonra, not değişkeni parantez içinde yazılır. Bu, kontrol deyimi olarak adlandırılır. Bu deyimin değeri, case kısımlarının her biriyle karşılaştırılır. Kullanıcının not değeri olarak C harfini girdiğini düşünelim.C otomatik olarak switch içindeki her case kısmıyla karşılaştırılır. Eğer eşleme gerçekleşirse (case 'C' : ), o case kısmındaki ifadeler çalıştırılır. C harfi girilmesi durumunda cSay değişkeni bir arttırılır ve break ifadesi sayesinde switch yapısından çıkılır.
break ifadesi, programın switch yapısından sonraki ilk ifadeyle devam etmesini sağlatır. Eğer break yapısı kullanılmazsa, switch yapısı içindeki tüm case kısımları birlikte çalışır. Eğer break yapısı switch yapısı içinde hiçbir yerde kullanılmamışsa, yapıdaki herhangi bir eşlemede geride kalan tüm case kısımları birlikte çalışır ( Bu bazı durumlarda kullanışlı olabilir ). Eğer herhangi bir eşleme olmazsa, default kısmı çalıştırılır ve bir hata mesajı yazdırılır.
Her case kısmı bir ya da daha fazla işlem içerebilir. switch yapısı diğer kontrol yapılarından farklıdır; switch içindeki case kısımlarına yazılacak işlemleri küme parantezine almaya gerek yoktur. switch çoklu seçim yapısının ( her case kısmında bir break yer aldığı düşünülmüştür ) akış grafiği, Şekil 4.8'de gösterilmiştir.
Akış grafiğinde görüldüğü üzere, her case kısmının sonunda yer alan break ifadesi switch yapısından çıkılmasını sağlamaktadır. Bu akış grafiğinde de (çember ve akış çizgileri dışında) yalnızca dikdörtgen ve elmas sembollerinin bulunduğuna dikkat ediniz. Bir kez daha programcının, algoritma oluşturmak için, istediği kadar switch yapısını diğer kontrol yapılarının üzerine dizebileceğini ya da içlerine yuvalayabileceğini hatırlayınız. Programcı algoritmasını tamamlayabilmek için dikdörtgen ve elmas sembollerinin içlerini tamamlayacaktır.
Genel Programlama Hataları 4.5
switch yapısında gerekli yerlerde break kullanmamak
İyi Programlama Alıştırmaları 4.12
switch yapılarının default kısmını içermesini sağlayın.switch yapısında test edilmeyen case yapıları ihmal edilir.default kullanmak programcının istisnai durumları işleyebilmesine yardımcı olur.Bazı durumlarda default kısmını kullanmaya gerek olmayabilir.
İyi Programlama Alıştırmaları 4.13
case ve default kısımları switch yapısında istenen sırada yer alabilir ancak default kısmını yapının sonunda kullanmak iyi bir alışkanlıktır.
İyi Programlama Alıştırmaları 4.14
switch yapılarında default kısmı yapının en sonuna yerleştirildiğinde break ifadesine gerek kalmaz. Ancak bazı programcılar case kısımlarıyla uyumun bozulmaması için default kısmında da break kullanırlar.
Şekil 4.7'deki switch yapısında
case '\n': case ' ':
break;
satırları, programın boşluk karakterini ve yeni satır karakterlerini atlamasını sağlatır. Karakterleri teker teker okumak bazı problemler yaratabilir. Programın karakterleri okuyabilmesi için, karakter yazıldıktan sonra return(giriş) tuşuna basılmalıdır. Bu, yeni satır karakterinin işlemek istediğimiz karakterin arkasına yerleştirilmesine sebep olur. Sıklıkla, bu yeni satır karakteri programın doğru olarak çalışabilmesi için özel olarak işlenmelidir. Programımızda yukarıdaki kodları switch yapısında kullanarak, yeni satır ya da boşluk karakterlerinin girilmesi durumunda default kısmındaki hata mesajının yazdırılmasını engellemiş olduk.
Genel Programlama Hataları 4.6
Karakter okurken yeni satır karakterlerini özel olarak işlememek mantık hatalarına sebep olabilir.
İyi Programlama Alıştırmaları 4.15
Karakter okurken yeni satır karakterlerini işleyecek kodlar yazmayı unutmayın
Şekil 4.7'de, bazı case kısımlarının birlikte kullanıldıklarına dikkat ediniz. ( case:'D' : case 'd':) Bu, birlikte listelenen case kısımları için aynı işlemlerin yapılacağını göstermektedir.
switch yapısını kullanırken, bu yapının karakter ya da tamsayı sabitleri gibi yalnızca sabit deyimlerin test edilmesinde kullanılabileceğini hatırlayınız. Karakter sabitleri, karakterin tek tırnak içine yazılmasıyla (örneğin, 'A') oluşturulurlar. Tamsayı sabitleri, tamsayı değerlerinin kendisidir. Örneğimizde karakter sabitlerinin kullandık. Karakterlerin gerçekte küçük tamsayı değerleri olduğunu hatırlayınız.
C gibi taşınılabilir diller, esnek veri tipi çeşitlerine sahip olmalıdır. Farklı uygulamalar, farklı büyüklüklerde tamsayılara ihtiyaç duyulabilir. C, tamsayıları temsil edebilmek için bir çok veri tipine sahiptir. Her tip için tamsayıların kullanılabileceği aralık kullanılan bilgisayarın yapısına bağlıdır. int ve char tipinin yanında C, short (short int için kullanılan kısaltmadır) ve long (long int için kullanılan kısaltmadır) tiplerine de sahiptir. ANSI standardı, short tamsayılar için en küçük aralığı 32767 olarak belirlemiştir. Fakat bazı uygulamalar için daha büyük tamsayılara ihtiyaç duyulur. Bu tür uygulamalar için long tipi genelde uygun olur. Standarda göre long tipindeki tamsayılar için en küçük aralık 2147483647 olarak belirlenmiştir. Çoğu bilgisayarda int tipi short ya da long ile eşittir. Standarda göre int için sayıların alabileceği değer aralığı en az short için belirlenen değer aralığı kadar olmalı ve long tipi için belirlenen değer aralığını geçmemelidir. char veri tipi 127 aralığındaki tamsayıları ya da bilgisayarın karakter setinde bulunan karakterleri temsil etmek için kullanılabilir.
Taşınırlık İpuçları 4.3
int farklı sistemlerde farklılık gösterebildiğinden, eğer kullanacağınız değerlerin 32767 aralığı dışında olmasını bekliyorsanız ve programınızı farklı sistemlerde kullanabilmeyi istiyorsanız long tamsayıları kullanın.
Performans İpuçları 4.1
Hafızanın sınırlı ya da hızın gerekli olduğu performansa yönelik durumlarda küçük tamsayı boyutları kullanmak gerekebilir.
Bilinmesi Gerekli
Arduino

Arduino ile bilgisayar programlarınızı gerçek dünyaya taşıyabilirsiniz.
İlk Transistör

Bell laboratuvarlarında icat edilen ilk transistör







