Koşullu Önermeler (if )
Koşullu Önermeler Şu ana kadarki önermelerimiz birbiri ardına sıralı bir şekilde çalışıyorlar. Aşağıdaki durumlarda nasıl çalışacaklar peki? bir koşula bağlı olarak bir önermeyi çalıştırmak istediğimizde? Örneğin: Kar yağarsa eğer, okulların tatil olacağını anons et Örneğin: Banka hesabında yeterince para varsa eğer, para ver Eğer bir koşul sağlanırsa bir önermeyi, sağlanmazsa başka bir önermeyi çalıştırmak istediğimizde? Örneğin: Eğer dolar yüksek ise, dolar sat. Değilse, dolar al. Birden fazla önerme içinden bir ya da birden fazla kritere bağlı olarak seçim yapacağız. Örneğin: Eğer dolar yüksek ve avro düşük ise, dolar sat ve avro al. Eğer dolar düşük ve avro yüksek ise, avro sat ve dolar al. Eğer her ikisi de yüksek ise, her ikisini de sat ve TL al. Bu tür koşullu önermeleri if- ile yapabiliyoruz.
Sentaks if (<koşul>) <önerme_true_1>;... <önerme_true_n>; <önerme_false_1>;... <önerme_false_n>; Eğerkoşul doğru ise önerme_true_1 önerme_true_n çalıştırılıyor, eğer koşul yanlış ise önerme_false_1 önerme_false_n çalıştırılıyor. if (<koşul>) <önerme_true_1>;... <önerme_true_n>; ve önerme_false önermeleri isteğe bağlı eğer koşul yanlışise, hiçbirşey çalıştırılmaz ve program bir sonraki önerme ile devam eder <koşul> iki parantez arasında ( ) olmalıdır
Diğer bir Sentaks ( kullanmadan) if (<koşul>) <önerme_true>; <önerme_false>; if (<koşul>) <önerme_true>; Sadece tek bir önerme var ise kullanılabilir Hiç tavsiye etmiyorum (nedenini göreceğiz)
if- in Akış Şeması test koşulu doğru yanlış doğru önermeler yanlış önermeler sonraki önerme
Örnek Đki tamsayı okuyan ve maksimumunu ekrana yazdıran bir program yazalım. Đki çözüm var if ve kullanarak sadece if kullanarak ( olmadan)
Çözüm 1 with_if_.cpp int main () int sayı1, sayı2, max; cout << Đki sayı giriniz: "; cin >> sayı1 >> sayı2; if (sayı1 > sayı2) // ilk sayı ikincisinden büyük mü kontrol et max = sayı1; // eğer öyle ise maximum ilk sayıdır max = sayı2; // değilse maximum ikinci sayıdır cout << " bu sayıların maximumu: " << max << endl; return 0;
Çözüm 2 with_if.cpp int main () int sayı1, sayı2, max; cout << Đki sayı giriniz: "; cin >> sayı1 >> sayı2; max = sayı1; // default atama - maximum ilk sayıdır if (sayı2 > max) // ikinci sayı ilkinden büyük mü kontrol et max = sayı2; // eğer öyle ise maximumu güncelle, // değilse hiçbirşey yapma cout << "maximum of these two numbers is: " << max << endl; return 0;
Boolean tip ve ifadeleri if önermesindeki koşul Boolean bir ifade olmalıdır (boolean kelimesi George Boole un adından gelmektedir) Değerler ya true (doğru) ya false(yanlış) olabilir bool da tıpkı int, double gibi kendiliğinden tiplerdendir int sıcaklık; bool sıcakmı = false; cout << sıcaklğı giriniz: ; cin >> sıcaklık; if (sıcaklık > 35) sıcakmı = true; Boolean değerlerin de nümerik karşılıkları vardır false 0, true herhangi bir sıfır olmayan değerdir if (3 * 4 8) cout << "selam"; cout << "hoşçakal" ; ekrana selam basar boolean çıktı0 sonuçverir (falseiçin) veya 1 (trueiçin) cout << (4 < 5); ekrana 1yazar
İlişkisel Operatörler İlişkisel Operatörler değerleri karşılaştırmak için kullanılırlar: < küçük mü sayı < 5 <= küçük ya da eşit sayı <= 0 > büyük mü sayı1 > sayı2 >= büyük ya da eşit sayı1 >= sayı2 == eşit mi sayı1 == 0!= eşit değil mi sayı1!= sayı2 Đki işlenen alırlar Đşlenenler sabit değer, değişken ya da ifade olabilirler Bir sürü tip için kullanılırlar nümerik karşılaştırmalar için string karşılaştırmalar için (lexicografik, yani alfabetik) boolean karşılaştırmalar için (false truedan küçüktür)
Örnekler Boolean sonuçları görmek için sabit değerlerle aşağıdaki örneklere bakalım. 23 >= 45 false 49.0 == 7*7 true 34-3!= 30+1 false string s1= "elma", s2= "armut", s3= "Elma"; s1 < s2 false s3 < s1 true Neden s3 < s2 true oldu? E nin ASCII kodu a dan küçük olduğu için Büyük harflerin kodları küçük harflerden küçüktür
Mantıksal Operatörler Boolean ifadeler mantıksal operatörler (AND, OR, NOT) kullanılarak birleştirilebilirler C++ dilinde bunlar için &&! sembolleri kullanılıyor A B A B A && B true true true true true false true false false true true false false false false false A true false! A false true
Örnek Aralık testi: verilen bir sayının 0 ile 100 arasında olup olmadığıkontrol edilecek (0 ve 100 dahil) Eğer aralıktaysa sayı, sayının doğru aralıkta olduğu mesajıverilecek. Eğer değilse, ekrandaki mesaj aralık dışı olacal. Çözüm 1: mantıksal AND operatörü kullanarak if (sayı >= 0 && sayı <= 100) cout << "sayı aralık içinde"; cout << "sayı aralık dışında"; Çözüm 2: mantıksal AND ve NOT operatörleri kullanarak if (! (sayı >= 0 && sayı <= 100) ) cout << "sayı aralık dışında"; cout << "sayı aralık içinde"; Çözüm 3: mantıksal OR operatörü kullanarak if (sayı < 0 sayı > 100) cout << "sayı aralık dışında"; cout << "sayı aralık içinde";
De Morgan Kuralları 2. ve 3. çözümleri karşılaştıralım Her iki koşul da eşdeğerdir aslında (! (sayı >= 0 && sayı <= 100) ) ( sayı < 0 sayı > 100 ) De Morgan s Kuralları der ki (a ve b boolean ifadeler olsun)! (a && b) =!a!b! (a b) =!a &&!b De Morgan a Kuralları çoklu ifadeler için de genellenebilir (örneğin, 4 boolean ifade için)! (a && b && c && d) =!a!b!c!d! (a b c d) =!a &&!b &&!c &&!d
Operatör Önceliği Üstteki operator grupları aşağıdakilere göre önceliklidirler Operatör Açıklama Associativity + -! artı ve eksi, mantıksal NOT sağdan-sola * / % çarpma, bölme ve mod soldan-sağa + - toplama, çıkarma soldan-sağa << >> stream yazma ve okuma soldan-sağa < <= > >= eşitsizlik karşılaştırma operatörleri soldan-sağa ==!= eşit, eşit olmama karşılaştırmaları soldan-sağa && mantıksal and soldan-sağa mantıksal or soldan-sağa = += -= *= /= %= atama operatörleri sağdan-sola
Operatör Önceliği Örnekleri cout << sayı1 < yıl; Sentaks hatası verir (anlaşılmaz bir mesaj şeklinde üstelik) Problem << operatörünün < üzerinde önceliği olmasıdır Beklendiği gibi derlenmez Çözüm: cout << (sayı1 < yıl); Tavsiye: her zaman cout için parantezli ifadeler kullanın Peki aralık testi yapan (0 <= sayı <= 100) ifadesine ne demeli? Sentaks hatası vermez Ama istenilen aralık testini de yapmaz çünkü hep true olur bu ifade. NEDEN?!12+5&&32/35 değeri nedir? Sonuç 0 olur
İçiçe if önermeleri if/ önermeleri diğer if/ önermelerinin içindedir Çoklu seçeneklerden seçim yapma yöntemidir Örnek: nümerik bir not girilecek ve onun değerine göre bir mesaj ekrana basılacak 0.. 50 düşük 51.. 70 ortalama 71.. 100 iyi hiçbiri geçersiz not
İçiçe if önermelerine örnek Örnek: nümerik bir not girilecek ve onun değerine göre bir mesaj ekrana basılacak 0.. 50 düşük 51.. 70 ortalama 71.. 100 iyi hiçbiri geçersiz not Çeşitli çözümler var Đlk çözüm: if lerin ardından gelen if ler if_after_if.cpp Đkinci çözüm : if lerin ardından gelen ler if_after_.cpp veya if_after_2.cpp
İçiçe if- Sentaks 1 if (<koşul_1>) if (<koşul_2>) if (<koşul_3>) <statements_hepsi_true>; < statements_true_1ve2>; <statements_true_1_>; <statements_1_false>; Eğer koşul_1 TRUE ise koşul_2 ye bakılır Eğerkoşul_2 TRUE ise koşul_3 e bakılır Eğer koşul_3 TRUE ise statements_hepsi_true çalıştırılır, Eğer koşul_3 FALSE ise statements_true_1ve2 çalıştırılır, Eğer koşul_2 FALSE ise statements_true_1_sadece çalıştırılır, Eğer koşul_1 FALSE ise statements_1_false çalıştırılır,
İçiçe if- Sentaks 2 if (<koşul_1>) <statement_1true_1>;... <statement_1true_n>; if (<koşul_2>) <statement_2true_1>;... <statement_2true_n>; if (<koşul_3>) <statement_3true_1>;... <statement_3true_n>;... <statement_allfalse_1>;... <statement_allfalse_n>; Eğer koşul_1 TRUE ise statement_1true_1 statement_1true_n çalıştırılır, Eğer koşul_1 de FALSE ise koşul_2 ye bakılır ve eğerkoşul_2 TRUE ise statement_2true_1 statement_2true_n çalıştırılır, Eğer koşul_2 de FALSE ise koşul_3 e bakılır ve eğer koşul_3 TRUE ise statement_3true_1 statement_3true_n çalıştırılır, Eğer koşul_(n-1) FALSE ise statement_allfalse_1 statement_allfalse_n çalıştırılır.
Kısa-devre Değerlendirmesi Boolean ifadeler içindeki bazıalt ifadeler değerlendirilmeyebilirler eğer ki bütün ifadenin değeri şu ana kadarki alt ifadelerden ortaya çıkmış ise Kural: Đlk (en soldaki) boolean alt ifadesini ilk önce sonuçlandır. Eğer onun değeri bütün ifadenin değerini belirlemek için yeterli ise, orada dur. Yok yeterli değil ise sağa doğru değerlendirmeye devam et. if (sayı!= 0 && skorlar/sayı < 60) cout << "dusuk ortalama" << endl; Bu örnekte, sayının değeri 0 ise, ilk alt ifade false olur ve ikinci alt ifade değerlendirilmez bile. Bu şekilde, sıfır ile bölünme hatasından da korunmuş oluruz (çünkü bu programı göçertir) Alternatif olarak sıfır ile bölme hatasından aşağıdaki gibi de kurtulabiliriz: if (sayı!= 0) if (skorlar/sayı < 60) cout << "dusuk ortalama" << endl;
Sallanan Else Problemi if ( x % 2 == 0) if ( x < 0 ) cout << x << " çift, negatif sayıdır" << endl; cout << x << " tek sayıdır" << endl; Ekrana x=4 için ne basar? Problem bu kodun pozitif çift sayılar ve sıfır için ekrana tek sayıdır mesajı yazmasıdır. Sebebi de, koddaki girintiler aksini de söylese, ikinci (içteki) if e aittir en sondaki if e aittir Çözüm: süslü parantezler kullanmaktır (sonraki slayt)
Sallanan Else Problemine Çözüm if ( x % 2 == 0) if ( x < 0 ) cout << x << " çift, negatif sayıdır " << endl; cout << x << " tek sayıdır " << endl; Şimdi ilk if e aittir if eşleştirme kuralı Her en yakınındaki birleşik blokta eşleştiği başka bir olmayan if e aittir