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 <stdio.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 <stdio.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 <stdio.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-caseyapı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