- 28 Nis 2020
- 930
- 227
- 314
Giriş
Program içerisinde bazen iki veya daha fazla değerin karşılaştırılması gerekebilir. Bunun için, bütün programlama dillerinde karşılaştırma deyimleri mevcuttur. C dili, if, switch ve ? olmak üzere üç tip karşılaştırma işlemi yapmaya izin verir. Ancak ? bir operatördür. if karşılaştırma deyimi ile, diğer programlama dilinde olduğu gibi if-else yapısı da kurulabilir. switch deyimi, bir değişkenin içeriğine göre program akışını yönlendirir.
6.1 Karşılaştırma Operatörleri ve Mantıksal Operatörler
Tablo 6.1'de listelenen Karşılaştırma Operatörleri, sayısal değerleri veya karakterleri mukayese etmek için kullanılır.
Tablo 6.1: Karşılaştırma Operatörleri
Birden çok karşılaştırma işlemi, Tablo 6.2'deki Mantıksal Operatörler'le birleştirilebilir.
Tablo 6.2: Mantıksal Operatörler
C dilinde, bir mantıksal işlemin sonucu tamsayı 0 (sıfır) veya başka bir değer olur. 0 olumsuz 0'dan farklı değerler olumlu olarak yorumlanır. Buna göre, aşağıdaki program parçasının
...
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);
...
çıktısı:
1 0 1
şeklinde olur. Bunun nedeni:
Bu deyimler, koşullu işlem yapan deyimlerdir. 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 deyiminin yapının genel biçimi şöyledir:
if(koşul)
{
...
deyimler; (küme)
...
}
if deyimi kullanılırken kümenin başlangıcı ve bitişini gösteren, küme parantezleri kullanılmasında kullanıcıya bir esneklik sunulmuştur. Eğer if deyiminden sonra icra edilecek deyimler tek satırdan oluşuyorsa, bu işaretlerin kullanılması zorunlu değildir. Yani, if deyimden sonra { ve } işaretleri kullanılmamışsa, bu deyimi takip eden sadece ilk satır işleme konur. Bu durum, else if, else deyimlerinde ve daha sonra işlenecek for ve while gibi döngü deyimlerinde de geçerlidir.
Buna göre aşağıdaki kullanım
if(x == y){
puts("x ve y esit");
}
ile
if(x == y)
puts("x ve y esit");
eşdeğerdir.
if deyiminin else ile birlikte kullanımı şu şekildedir:
if(koşul){
...
deyimler; (küme1)
...
}
else{
...
deyimler; (küme2)
...
}
Bu yapının kullanılmasına dair bir örnek Program 6.1'de gösterilmiştir. Program, klavyeden girilen bir tamsayının çift olup olmadığını sınar. Bilindiği gibi, çift sayılar, 2 ile kalansız bölünebilen sayılardır.
Program 6.1: if-else deyiminin kullanımı
ÇIKTI
Mantıksal Operatörler kullanarak birden çok karşılaştırma birleştirilebilir. Buna iyi bir örnek Program 6.2'de gösterilmiştir. Program, bir yılın artık yıl olup olmadığını sınar. Bir yıl içinde, Şubat ayı 29 gün olursa o yıl artık yıl olarak adlandırılır. Artık yıl peryodik olarak 4 yılda bir gelir. Genel kanı "bir yıl 4 ile tam bölünebirse o yıl artık yıldır" şeklindedir. Fakat 1996 artık yıl iken 1800 artık yıl değildir. Genel sorgulama söyle olmalıdır: Eğer bir yıl
Program 6.2: if-else deyiminin kullanımı
ÇIKTI
Eğer program içinde kullanılacak koşulların sayısı ikiden çok ise aşağıdaki yapı kullanılır:
if(koşul_1)
{
...
deyimler; (küme_1)
...
}
else if(koşul_2)
{
...
deyimler; (küme_2)
...
}
.
.
.
else if(koşul_n-1)
{
...
deyimler; (küme_n-1)
...
}
else
{
...
deyimler; (küme_n)
...
}
Program 6.3, ax2 + bx + c = 0 formundaki ikinci dereceden bir polinomun köklerini hesaplamaktadır. Programda delta değerinin sıfırdan 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 klasik bir örnektir.
Program 6.3: if, else if, else yapısı
ÇIKTI
ÇIKTI
6.3 switch - case Yapısı
Bu deyim bir değişkenin içeriğine bakarak, programın akışını bir çok seçenekten birine yönlendirir. case (durum) deyiminden sonra değişkenin durumu belirlenir ve takip eden gelen satırlar (deyimler) işleme konur. 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(değişken)
{
case sabit1:
...
deyimler;
...
case sabit2:
...
deyimler;
...
.
.
.
case sabitn:
...
deyimler;
...
default:
...
hata deyimleri veya varsayılan deyimler;
...
}
Program Program 6.4'te switch deyiminin basit bir kullanımı gösterilmiştir.
Program 6.4: switch-case yapısının kullanımı
ÇIKTI
ÇIKTI
ÇIKTI
ÇIKTI
Programda, klavyeden okunan tek bir karakter değişkenin içeriğine bakılıp uygun dallanmalar yaptırılmıştır. 11. 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 basmadiniz gibi. Fakat 'a' karakterleri girildiğinde ekrana her üç durumda yazdırılmaktadır. Bunun sebebi, case 'a': durumunda sırasıyla 16, 18 ve 20. satırların işleme konmasıdır. Bunu engellemek için 16. satırdan sonra programın başka bir yere yönlendirilmesi gerekir. Bu yönlendirme, Bölüm 7'de anlatılacak olan break deyimi ile yapılı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 6.4'te case 'a': durumu için 16, 18 ve 20. satırlar da işleme konumuştu. Eğer klavyeden 'a' karakterini girip ekrana sadece a harfine bastiniz iletisi yazdırılmak isteniyorsa, 20. satıra break deyimi ilave edilmelidir. break deyiminin kullanımı Program 6.5'te gösterilmiştir.
Program 6.5: switch-case yapısı ve break kullanımı
ÇIKTI
ÇIKTI
Program 6.6 switch-case yapısın farklı bir kullanımı ile ilgili bir örnektir. Programda, önce iki sayı isteniyor ardından yapılan seçimle bu sayıların toplamı, farkı, çarpımı veya oranı ekrana yazdırılıyor.
Program 6.6: switch-case yapısı ve break kullanımı
ÇIKTI
ÇIKTI
switch-case yapısı if-else yapısının bir alternatifidir. Yani, Program 6.6'daki switch-case kısmı, if-else yapısı ile de aşağıdaki gibi yazılabilirdi. İnceleyiniz.
6.4 ? Karşılaştırma Operatörü
Bu operatör, 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 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 6.7 ? karşılaştırma operatörünün basit bir kullanımını göstermektedir.
Program 6.7: ? ve if kullanımı
ÇIKTI
ÇIKTI
12. satırdaki if deyimindeki koşul biraz farklıdır. Genel olarak koşul bu şekilde bildirilirse, koşulun 0 dan farklı olup olmadığı sınanır. Yani:
if(y)
ile
if( y != 0 )
aynı anlamdadır.
Bu kullanım çok yagındır. Eğer y, 0 dan farklı ise koşul olumlu olarak değerlendirilecektir. 13. satırda ? ile bir sınama yapılmaktadır. Eğer y, x den büyük ise z değişkenine x/y, aksi takdirde x*y değeri atanmaktadır. Eğer y = 0 ise z değişkenine 0 değeri atanmaktadır.
Program içerisinde bazen iki veya daha fazla değerin karşılaştırılması gerekebilir. Bunun için, bütün programlama dillerinde karşılaştırma deyimleri mevcuttur. C dili, if, switch ve ? olmak üzere üç tip karşılaştırma işlemi yapmaya izin verir. Ancak ? bir operatördür. if karşılaştırma deyimi ile, diğer programlama dilinde olduğu gibi if-else yapısı da kurulabilir. switch deyimi, bir değişkenin içeriğine göre program akışını yönlendirir.
6.1 Karşılaştırma Operatörleri ve Mantıksal Operatörler
Tablo 6.1'de listelenen Karşılaştırma Operatörleri, sayısal değerleri veya karakterleri mukayese etmek için kullanılır.
Tablo 6.1: Karşılaştırma Operatörleri
Resimleri görmek için kayıtlı olmalısınız
Birden çok karşılaştırma işlemi, Tablo 6.2'deki Mantıksal Operatörler'le birleştirilebilir.
Tablo 6.2: Mantıksal Operatörler
Resimleri görmek için kayıtlı olmalısınız
C dilinde, bir mantıksal işlemin sonucu tamsayı 0 (sıfır) veya başka bir değer olur. 0 olumsuz 0'dan farklı değerler olumlu olarak yorumlanır. Buna göre, aşağıdaki program parçasının
...
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);
...
çıktısı:
1 0 1
şeklinde olur. Bunun nedeni:
- 2 her zaman 1 den büyük olduğu için s değişkenine 1,
- x = 1 < 3 olduğu için x değişkenine 0,
- z = x <= y && y >0; eşitliğin sağtarafının sonucu olumlu olduğu için z değişkenine 1 atanır.
Bu deyimler, koşullu işlem yapan deyimlerdir. 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 deyiminin yapının genel biçimi şöyledir:
if(koşul)
{
...
deyimler; (küme)
...
}
if deyimi kullanılırken kümenin başlangıcı ve bitişini gösteren, küme parantezleri kullanılmasında kullanıcıya bir esneklik sunulmuştur. Eğer if deyiminden sonra icra edilecek deyimler tek satırdan oluşuyorsa, bu işaretlerin kullanılması zorunlu değildir. Yani, if deyimden sonra { ve } işaretleri kullanılmamışsa, bu deyimi takip eden sadece ilk satır işleme konur. Bu durum, else if, else deyimlerinde ve daha sonra işlenecek for ve while gibi döngü deyimlerinde de geçerlidir.
Buna göre aşağıdaki kullanım
if(x == y){
puts("x ve y esit");
}
ile
if(x == y)
puts("x ve y esit");
eşdeğerdir.
if deyiminin else ile birlikte kullanımı şu şekildedir:
if(koşul){
...
deyimler; (küme1)
...
}
else{
...
deyimler; (küme2)
...
}
Bu yapının kullanılmasına dair bir örnek Program 6.1'de gösterilmiştir. Program, klavyeden girilen bir tamsayının çift olup olmadığını sınar. Bilindiği gibi, çift sayılar, 2 ile kalansız bölünebilen sayılardır.
Program 6.1: if-else deyiminin kullanımı
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
Mantıksal Operatörler kullanarak birden çok karşılaştırma birleştirilebilir. Buna iyi bir örnek Program 6.2'de gösterilmiştir. Program, bir yılın artık yıl olup olmadığını sınar. Bir yıl içinde, Şubat ayı 29 gün olursa o yıl artık yıl olarak adlandırılır. Artık yıl peryodik olarak 4 yılda bir gelir. Genel kanı "bir yıl 4 ile tam bölünebirse o yıl artık yıldır" şeklindedir. Fakat 1996 artık yıl iken 1800 artık yıl değildir. Genel sorgulama söyle olmalıdır: Eğer bir yıl
- 4 ile tam bölünüyorsa VE 100'e tam bölünmüyorsa VEYA
- 400 'e tam bölünüryorsa
Program 6.2: if-else deyiminin kullanımı
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
Eğer program içinde kullanılacak koşulların sayısı ikiden çok ise aşağıdaki yapı kullanılır:
if(koşul_1)
{
...
deyimler; (küme_1)
...
}
else if(koşul_2)
{
...
deyimler; (küme_2)
...
}
.
.
.
else if(koşul_n-1)
{
...
deyimler; (küme_n-1)
...
}
else
{
...
deyimler; (küme_n)
...
}
Program 6.3, ax2 + bx + c = 0 formundaki ikinci dereceden bir polinomun köklerini hesaplamaktadır. Programda delta değerinin sıfırdan 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 klasik bir örnektir.
Program 6.3: if, else if, else yapısı
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
6.3 switch - case Yapısı
Bu deyim bir değişkenin içeriğine bakarak, programın akışını bir çok seçenekten birine yönlendirir. case (durum) deyiminden sonra değişkenin durumu belirlenir ve takip eden gelen satırlar (deyimler) işleme konur. 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(değişken)
{
case sabit1:
...
deyimler;
...
case sabit2:
...
deyimler;
...
.
.
.
case sabitn:
...
deyimler;
...
default:
...
hata deyimleri veya varsayılan deyimler;
...
}
Program Program 6.4'te switch deyiminin basit bir kullanımı gösterilmiştir.
Program 6.4: switch-case yapısının kullanımı
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
Programda, klavyeden okunan tek bir karakter değişkenin içeriğine bakılıp uygun dallanmalar yaptırılmıştır. 11. 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 basmadiniz gibi. Fakat 'a' karakterleri girildiğinde ekrana her üç durumda yazdırılmaktadır. Bunun sebebi, case 'a': durumunda sırasıyla 16, 18 ve 20. satırların işleme konmasıdır. Bunu engellemek için 16. satırdan sonra programın başka bir yere yönlendirilmesi gerekir. Bu yönlendirme, Bölüm 7'de anlatılacak olan break deyimi ile yapılı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 6.4'te case 'a': durumu için 16, 18 ve 20. satırlar da işleme konumuştu. Eğer klavyeden 'a' karakterini girip ekrana sadece a harfine bastiniz iletisi yazdırılmak isteniyorsa, 20. satıra break deyimi ilave edilmelidir. break deyiminin kullanımı Program 6.5'te gösterilmiştir.
Program 6.5: switch-case yapısı ve break kullanımı
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
Program 6.6 switch-case yapısın farklı bir kullanımı ile ilgili bir örnektir. Programda, önce iki sayı isteniyor ardından yapılan seçimle bu sayıların toplamı, farkı, çarpımı veya oranı ekrana yazdırılıyor.
Program 6.6: switch-case yapısı ve break kullanımı
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
switch-case yapısı if-else yapısının bir alternatifidir. Yani, Program 6.6'daki switch-case kısmı, if-else yapısı ile de aşağıdaki gibi yazılabilirdi. İnceleyiniz.
Resimleri görmek için kayıtlı olmalısınız
6.4 ? Karşılaştırma Operatörü
Bu operatör, 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 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 6.7 ? karşılaştırma operatörünün basit bir kullanımını göstermektedir.
Program 6.7: ? ve if kullanımı
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
ÇIKTI
Resimleri görmek için kayıtlı olmalısınız
12. satırdaki if deyimindeki koşul biraz farklıdır. Genel olarak koşul bu şekilde bildirilirse, koşulun 0 dan farklı olup olmadığı sınanır. Yani:
if(y)
ile
if( y != 0 )
aynı anlamdadır.
Bu kullanım çok yagındır. Eğer y, 0 dan farklı ise koşul olumlu olarak değerlendirilecektir. 13. satırda ? ile bir sınama yapılmaktadır. Eğer y, x den büyük ise z değişkenine x/y, aksi takdirde x*y değeri atanmaktadır. Eğer y = 0 ise z değişkenine 0 değeri atanmaktadır.