Programlamada en çok kullanılan özelliklerden biri de döngülerdir. Döngüler aracılığı ile belli şartlar gerçekleşinceye kadar veya gerçekleştikçe bir komut parçasını çalıştırmak mümkündür. Bir programda bir komut parçasının belli koşullar gerçekleştikçe veya gerçekleşinceye kadar defalarca icra etmesi gerekebilir. Bu defalarca çalışmayı sağlayan komutlara döngü (çevrim) yapıları denir. Döngü (loop) deyimleri, bir kümenin belli bir koşul altında tekrar edilmesi için kullanılır.
Döngü (loop) deyimleri, bir işlemi yerine getiren kod kümesinin belli bir koşul altında tekrar edilmesi için kullanılır.
Bir değişken belirli bir değerden başlayıp, son değeri alıncaya kadar belirtilen işlemler tekrarlanır.
Örn: n! değerinin hesaplanması (faktöriyel)
Genellikle bir programlama dilinde birden fazla döngü çeşidi bulunmaktadır. Döngü çeşitleri kullanım yerlerine göre kolaylıklar sağlamaktadır.Döngü yapıları genelde karşımıza iki tür olarak çıkar. Çalışma sayısının belli olduğu durumlarda sayaçlı döngüler, döngü sayısının değişken olduğu durumlarda ise koşullu döngüler kullanılır. C programlama dilinde sayaçlı döngü yapısına for döngüsü, koşullu döngü yapısına while ve do-while döngüleri örnek olarak verilebilir.
C programlama dilinde:
for,
while,
do...while
olmak üzere üç tip döngü deyimi vardır.
Diğer programlama dillerinde olduğu gibi, bu deyimlerle istenildiği kadar iç-içe döngü yapısı kullanılabilir.
14 Ekim 2016 Cuma
10 Ekim 2016 Pazartesi
? 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, olumsuzsa 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.
Örnek:
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ğeri atanır, Olumsuzsa x adlı değişkene b değeri atanır.
Örneğin if-else bloğu ile gösterimi:
if (a > b)
x = a;
else
x = b;
Örnek:
int sayi = 15;
x = ( sayi < 10 ) ? printf("yazi1") : printf("yazi2");
Genel yazım biçimi:
(koşul) ? deyim1 : deyim2;
İlk önce koşul sınanır. Eğer koşul olumluysa deyim1, olumsuzsa 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.
Örnek:
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ğeri atanır, Olumsuzsa x adlı değişkene b değeri atanır.
Örneğin if-else bloğu ile gösterimi:
if (a > b)
x = a;
else
x = b;
Örnek:
int sayi = 15;
x = ( sayi < 10 ) ? printf("yazi1") : printf("yazi2");
if-else ve switch-case Kullanımlarının Karşılaştırması
1. İşlevsellik: C programlama dilinde switch-case deyimi sadece char ve int veri türlerini destekler. Bu durum if-else deyimine göre dezavantajdır. switch-case deyimlerinde aralık kontrolü (x > 1000) yapılamaması yine bir dezavantajdır.
2. Performans: Her iki karşılaştırma deyiminin kullanımı farklı derleyicilerde ve farklı programlama dillerinde farklı performans sonuçları üretebilir. Genelde switch-case kullanımı daha performanslı çalışır.
3. Okunabilirlik: switch-case deyimlerinin kod okunabilirliği her zaman daha yüksektir.
2. Performans: Her iki karşılaştırma deyiminin kullanımı farklı derleyicilerde ve farklı programlama dillerinde farklı performans sonuçları üretebilir. Genelde switch-case kullanımı daha performanslı çalışır.
3. Okunabilirlik: switch-case deyimlerinin kod okunabilirliği her zaman daha yüksektir.
switch-case Kullanım Hataları
break deyiminin kullanılmasının unutulması.
switch-case bloğundaki { } sembollerinin kullanımlarının unutulması.
default deyiminin ve içeriğinin kullanımının unutulması.
Kontrol edilen değişken ile verilen sabitlerin farklı tipte olması.
int ve char veri türleri dışında değişken tanımlamaya çalışmak (double, string)
switch-case bloğundaki { } sembollerinin kullanımlarının unutulması.
default deyiminin ve içeriğinin kullanımının unutulması.
Kontrol edilen değişken ile verilen sabitlerin farklı tipte olması.
int ve char veri türleri dışında değişken tanımlamaya çalışmak (double, string)
switch…case Bloğu
Switch-case yapısı, bir değişkenin aldığı değerlere bağlı olarak program akışındaki belirli işlemlerin yerine getirilmesini sağlar. Aslında bu tür işlemleri if deyimi yardımıyla yerine getirebiliriz. Ancak bazı uygulamalarda if deyiminin kullanılması programın karmaşıklığını artırabilir ve okunabilirliğini azaltabilir.
Eğer bir değişkenin aldığı değer belirli sabitlerle karşılaştırılacak ve bunun sonucunda farklı işlemler yapılacak ise if deyimi yerine switch deyimi kullanmamız daha sağlıklı olacaktır. Önemli bir nokta, switch-case yapısı sadece char ve int veri türleri için kullanılabilir.
Bir değişkenin aldığı değerlere bağlı olarak, program akışındaki belirli işlemlerin yaptırılmasını sağlar.
Aslında bu tür işlemleri if deyimi yardımıyla yerine getirebiliriz.
Ancak bazı uygulamalarda if deyiminin kullanılması programın karmaşıklığını artırabilir ve okunabilirliğini azaltabilir.
Eğer bir değişkenin değeri belirli sabitlerle karşılaştırılacak ve bunun sonucunda farklı işlemler yapılacak ise if deyimi yerine switch deyimi kullanmamız daha sağlıklı olacaktır.
Sadece char ve int veri türleri için kullanılabilir.
Yazım Şekli
switch (değişken) {
case sabit1:
deyim1
break;
case sabit2:
deyim2
break;
…
case sabitn:
deyimn
break;
default:
deyimd;
}
değişken değeri sabit1 değerine eşitse deyim1 çalıştırılır ve break kullanılarak bloktan çıkış yapılır.
değişken değeri herhangi bir sabite eşit değilse default sabitinin deyimi deyimd çalışır.
Eğer bir değişkenin aldığı değer belirli sabitlerle karşılaştırılacak ve bunun sonucunda farklı işlemler yapılacak ise if deyimi yerine switch deyimi kullanmamız daha sağlıklı olacaktır. Önemli bir nokta, switch-case yapısı sadece char ve int veri türleri için kullanılabilir.
Bir değişkenin aldığı değerlere bağlı olarak, program akışındaki belirli işlemlerin yaptırılmasını sağlar.
Aslında bu tür işlemleri if deyimi yardımıyla yerine getirebiliriz.
Ancak bazı uygulamalarda if deyiminin kullanılması programın karmaşıklığını artırabilir ve okunabilirliğini azaltabilir.
Eğer bir değişkenin değeri belirli sabitlerle karşılaştırılacak ve bunun sonucunda farklı işlemler yapılacak ise if deyimi yerine switch deyimi kullanmamız daha sağlıklı olacaktır.
Sadece char ve int veri türleri için kullanılabilir.
Yazım Şekli
switch (değişken) {
case sabit1:
deyim1
break;
case sabit2:
deyim2
break;
…
case sabitn:
deyimn
break;
default:
deyimd;
}
değişken değeri sabit1 değerine eşitse deyim1 çalıştırılır ve break kullanılarak bloktan çıkış yapılır.
değişken değeri herhangi bir sabite eşit değilse default sabitinin deyimi deyimd çalışır.
if-else Kullanım Hataları
Hata-1
if sayi==10 //Söz dizimi hatası
printf ("Girilen sayi 10\n");
Koşul ifadesinde ( ) sembolleri kullanılmadığı için “syntax error” hatası alınır (Söz dizimi hatası).
Hata-2
if (sayi==10); //Boş ifade
printf ("Girilen sayi 10\n");
Koşul ifadesinden sonra ; sembolü kullanılmıştır. C derleyicisi için boş bir ifadedir. Sonraki satır bu satırdan bağımsızdır.
Hata-3
if (10<=sayi<=50) //Mantıksal Hata
Sonucu her zaman doğru olan mantıksal bir hatadır.
Koşul ifadesi soldan sağa doğru değerlendirilir. sayi değişkenin değeri 10 ile karşılaştırılır.
10’dan küçükse false yani 0 sonucu döner,
10’dan büyükse true yani 1 sonucu döner,
Her iki durum da (0 veya 1 sonucu) dönen değer 50’den küçük olacağı için bu ifade her zaman doğru sonuç verir.
Bunun yerine ((sayi>=10) && (sayi<=50)) koşul ifadesi kullanılmalıdır.
Hata 4
if (sayi=10) //Mantıksal Hata
Sonucu her zaman doğru olan mantıksal bir hatadır.
Koşul ifadesinde karşılaştırma operatörü == yerine, atama operatörü = kullanılmıştır.
Atama sonucunda 10 değeri oluşur.
10 değeri 0’dan büyük olduğu için sonuç “true” dönecektir ve bu da yanlış bir sonuç üretecektir.
Atama operatörü yerine, == karşılaştırma operatörü kullanılmalıdır.
if sayi==10 //Söz dizimi hatası
printf ("Girilen sayi 10\n");
Koşul ifadesinde ( ) sembolleri kullanılmadığı için “syntax error” hatası alınır (Söz dizimi hatası).
Hata-2
if (sayi==10); //Boş ifade
printf ("Girilen sayi 10\n");
Koşul ifadesinden sonra ; sembolü kullanılmıştır. C derleyicisi için boş bir ifadedir. Sonraki satır bu satırdan bağımsızdır.
Hata-3
if (10<=sayi<=50) //Mantıksal Hata
Sonucu her zaman doğru olan mantıksal bir hatadır.
Koşul ifadesi soldan sağa doğru değerlendirilir. sayi değişkenin değeri 10 ile karşılaştırılır.
10’dan küçükse false yani 0 sonucu döner,
10’dan büyükse true yani 1 sonucu döner,
Her iki durum da (0 veya 1 sonucu) dönen değer 50’den küçük olacağı için bu ifade her zaman doğru sonuç verir.
Bunun yerine ((sayi>=10) && (sayi<=50)) koşul ifadesi kullanılmalıdır.
Hata 4
if (sayi=10) //Mantıksal Hata
Sonucu her zaman doğru olan mantıksal bir hatadır.
Koşul ifadesinde karşılaştırma operatörü == yerine, atama operatörü = kullanılmıştır.
Atama sonucunda 10 değeri oluşur.
10 değeri 0’dan büyük olduğu için sonuç “true” dönecektir ve bu da yanlış bir sonuç üretecektir.
Atama operatörü yerine, == karşılaştırma operatörü kullanılmalıdır.
Koşullarda Hızlı Değerlendirme
C programlamada, koşulların mantıksal değerlendirmelerinde, beklenilen değere ulaşıldığında koşulun tamamı değerlendirilmeden koşuldan çıkılır.
VEYA kullanımında koşulun ilk kısmı DOĞRU (true) ise koşulun tamamı DOĞRU olacağı için koşulun ikinci kısmı değerlendirilmez.
VE kullanımında koşulun ilk kısmı YANLIŞ (false) ise koşulun tamamı YANLIŞ olacağı için koşulun ikinci kısmı değerlendirilmez.
Örnek: if ((a>b) && (a<c)) eğer (a>b) YANLIŞ ise (a<c) değerlendirilmez.
Örnek: if ((a>b) || (a<c)) eğer (a>b) DOĞRU ise (a<c) değerlendirilmez.
Yazdığınız programın performansı açısından koşulların nasıl değerlendirildiğini iyi bilip, ona göre koşul sırası koymamız gerekmektedir.
Örnek: if ((ögrenci_no==12345) && (ögrenci_isim="Veli"))
Bu örnekte en hızlı şekilde YANLIŞ (false) sonucu almak istiyorsak, en çok seçilebilir olan koşulu en sola yani başlangıca koymamız gerekmektedir.
VEYA kullanımında koşulun ilk kısmı DOĞRU (true) ise koşulun tamamı DOĞRU olacağı için koşulun ikinci kısmı değerlendirilmez.
VE kullanımında koşulun ilk kısmı YANLIŞ (false) ise koşulun tamamı YANLIŞ olacağı için koşulun ikinci kısmı değerlendirilmez.
Örnek: if ((a>b) && (a<c)) eğer (a>b) YANLIŞ ise (a<c) değerlendirilmez.
Örnek: if ((a>b) || (a<c)) eğer (a>b) DOĞRU ise (a<c) değerlendirilmez.
Yazdığınız programın performansı açısından koşulların nasıl değerlendirildiğini iyi bilip, ona göre koşul sırası koymamız gerekmektedir.
Örnek: if ((ögrenci_no==12345) && (ögrenci_isim="Veli"))
Bu örnekte en hızlı şekilde YANLIŞ (false) sonucu almak istiyorsak, en çok seçilebilir olan koşulu en sola yani başlangıca koymamız gerekmektedir.
İç içe if…else Blokları (Nested If)
if-else yapıları içerisine başka if-else yapıları yerleştirerek birden fazla koşul aynı anda test edilebilir.
if (sayi < 0)
printf("Negatif sayı girdiniz\n");
else
if (sayi > 0)
printf("Pozitif bir sayı girdiniz\n");
else
printf("Sıfır sayısını girdiniz\n");
Diğer bir kullanım şekli aşağıdaki gibidir:
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)
}
Örnek: Girilen notun harf karşılığını bulma
Girilen not;
60 ile 65 arasındaysa DD
65 ile 70 arasındaysa DC
70 ile 75 arasındaysa CC
75 ile 80 arasındaysa CB
80 ile 85 arasındaysa BB
85 ile 90 arasındaysa BA
90 ile 100 arasındaysa AA
yazdıran bir program yazalım. Bunların dışındaysa «Uygun değer girmediniz!» şeklinde uyarı verip, programdan çıkacak.
Cevap:
Standart C kütüphanesinde bulunan printf() fonksiyonu, değişkenlerin tuttuğu değerleri, onların adreslerini veya bir mesajı ekrana belli bir formatta yazdırmak için kullanılan fonksiyondur.
scanf() fonksiyonu klavyeden veri okumak için kullanılan fonksiyondur.
if (sayi < 0)
printf("Negatif sayı girdiniz\n");
else
if (sayi > 0)
printf("Pozitif bir sayı girdiniz\n");
else
printf("Sıfır sayısını girdiniz\n");
Diğer bir kullanım şekli aşağıdaki gibidir:
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)
}
Örnek: Girilen notun harf karşılığını bulma
Girilen not;
60 ile 65 arasındaysa DD
65 ile 70 arasındaysa DC
70 ile 75 arasındaysa CC
75 ile 80 arasındaysa CB
80 ile 85 arasındaysa BB
85 ile 90 arasındaysa BA
90 ile 100 arasındaysa AA
yazdıran bir program yazalım. Bunların dışındaysa «Uygun değer girmediniz!» şeklinde uyarı verip, programdan çıkacak.
Cevap:
Standart C kütüphanesinde bulunan printf() fonksiyonu, değişkenlerin tuttuğu değerleri, onların adreslerini veya bir mesajı ekrana belli bir formatta yazdırmak için kullanılan fonksiyondur.
scanf() fonksiyonu klavyeden veri okumak için kullanılan fonksiyondur.
if…else Bloğu
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)
{ Doğru ise İşlem1}
else
{ Yanlış ise İşlem2}
Aşağıdaki her iki örnek aynı işlemi gerçekleştirmektedir. Tek fark birinci örnekte { } sembollerinin kullanılmasıdır. Tek satır deyim içeren bloklarda, { } sembollerinin kullanılmasına gerek yoktur.
if (sayi < 0) {
printf("Negatif sayı girdiniz\n");
}
else {
printf("Sıfır veya pozitif bir sayı girdiniz\n");
}
if (sayi < 0)
printf("Negatif sayı girdiniz\n");
else
printf("Sıfır veya pozitif bir sayı girdiniz\n");
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)
{ Doğru ise İşlem1}
else
{ Yanlış ise İşlem2}
Aşağıdaki her iki örnek aynı işlemi gerçekleştirmektedir. Tek fark birinci örnekte { } sembollerinin kullanılmasıdır. Tek satır deyim içeren bloklarda, { } sembollerinin kullanılmasına gerek yoktur.
if (sayi < 0) {
printf("Negatif sayı girdiniz\n");
}
else {
printf("Sıfır veya pozitif bir sayı girdiniz\n");
}
if (sayi < 0)
printf("Negatif sayı girdiniz\n");
else
printf("Sıfır veya pozitif bir sayı girdiniz\n");
Kaydol:
Kayıtlar (Atom)