c++ ders4 - kosullu onermeler

23
Koşullu Önermeler (if–else)

Upload: semsettin-karakus

Post on 16-Jan-2016

244 views

Category:

Documents


0 download

DESCRIPTION

koşullu önermeler

TRANSCRIPT

Page 1: C++ Ders4 - Kosullu Onermeler

Koşullu Önermeler(if–else)

Page 2: C++ Ders4 - Kosullu Onermeler

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-else ile yapabiliyoruz.

Page 3: C++ Ders4 - Kosullu Onermeler

Sentaksif (<koşul>) {<önerme_true_1>;...<önerme_true_N>;

}else{<önerme_false_1>;...<önerme_false_N>;

}

� Eğer koş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>;

}

� else 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

Page 4: C++ Ders4 - Kosullu Onermeler

Diğer bir Sentaks ({ } kullanmadan)

if (<koşul>)

<önerme_true>;

else

<önerme_false>;

if (<koşul>)

<önerme_true>;

• Sadece tek bir önerme var ise kullanılabilir• Hiç tavsiye etmiyorum (nedenini göreceğiz)

Page 5: C++ Ders4 - Kosullu Onermeler

if-else in Akış Şeması

test koşulu

doğruönermeler

doğru

sonrakiönerme

yanlış

yanlışönermeler

Page 6: C++ Ders4 - Kosullu Onermeler

Örnek

� Đki tamsayı okuyan ve maksimumunu ekrana yazdıran bir program yazalım.

� Đki çözüm var� if ve else kullanarak

� sadece if kullanarak (else olmadan)

Page 7: C++ Ders4 - Kosullu Onermeler

Çözüm 1 – with_if_else.cppint 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

}

else

{

max = sayı2; // değilse maximum ikinci sayıdır

}

cout << " bu sayıların maximumu: " << max << endl;

return 0;

}

Page 8: C++ Ders4 - Kosullu Onermeler

Çö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;

}

Page 9: C++ Ders4 - Kosullu Onermeler

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";

else cout << "hoşçakal" ;

� ekrana selam basar

� boolean çıktı 0 sonuç verir (false için) veya 1 (true için)cout << (4 < 5);

� ekrana 1 yazar

Page 10: C++ Ders4 - Kosullu Onermeler

< 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

İlişkisel Operatörler� İlişkisel Operatörler değerleri karşılaştırmak için kullanılırlar:

� Đ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 true dan küçüktür)

Page 11: C++ Ders4 - Kosullu Onermeler

Ö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

Page 12: C++ Ders4 - Kosullu Onermeler

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 ! A

true false

false true

Page 13: C++ Ders4 - Kosullu Onermeler

Ö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";

elsecout << "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";

elsecout << "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";

elsecout << "sayı aralık içinde";

Page 14: C++ Ders4 - Kosullu Onermeler

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

Page 15: C++ Ders4 - Kosullu Onermeler

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

Page 16: C++ Ders4 - Kosullu Onermeler

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

Page 17: C++ Ders4 - Kosullu Onermeler

İçiçe if önermeleri� if/else önermeleri diğer if/else ö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

Page 18: C++ Ders4 - Kosullu Onermeler

İçiçe if önermelerine örnek� Örnek: nümerik bir not girilecek ve onun değerine göre bir

mesaj ekrana basılacak0 .. 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 else’ler

� if_after_else.cpp

� veya if_after_else2.cpp

Page 19: C++ Ders4 - Kosullu Onermeler

if (<koşul_1>)

{

if (<koşul_2>)

{

if (<koşul_3>)

{

<statements_hepsi_true>;

}

else

{

< statements_true_1ve2>;

}

}

else

{

<statements_true_1_>;

}

}

else

{

<statements_1_false>;

}

İçiçe if-else Sentaks 1Eğer koşul_1 TRUE ise koşul_2 ye bakılır

Eğer koşul_2 TRUE ise koşul_3 e bakılır

Eğer koşul_3 TRUE isestatements_hepsi_true çalıştırılır,

Eğer koşul_3 FALSE isestatements_true_1ve2

çalıştırılır,

Eğer koşul_2 FALSE isestatements_true_1_sadece

çalıştırılır,

Eğer koşul_1 FALSE isestatements_1_false çalıştırılır,

Page 20: C++ Ders4 - Kosullu Onermeler

if (<koşul_1>)

{

<statement_1true_1>;

...

<statement_1true_N>;

}

else if (<koşul_2>)

{

<statement_2true_1>;

...

<statement_2true_N>;

}

else if (<koşul_3>)

{

<statement_3true_1>;

...

<statement_3true_N>;

}

...

else

{

<statement_allfalse_1>;

...

<statement_allfalse_N>;

}

İçiçe if-else Sentaks 2� 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ğer koşul_2TRUE isestatement_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_3TRUE isestatement_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.

Page 21: C++ Ders4 - Kosullu Onermeler

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;}

}

Page 22: C++ Ders4 - Kosullu Onermeler

Sallanan Else Problemiif ( x % 2 == 0) if ( x < 0 )

cout << x << " çift, negatif sayıdır" << endl; else 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, else ikinci (içteki) if’e aittir� else en sondaki if’e aittir

� Çözüm: süslü parantezler kullanmaktır (sonraki slayt)

Page 23: C++ Ders4 - Kosullu Onermeler

Sallanan Else Problemine Çözümif ( x % 2 == 0) {

if ( x < 0 ) cout << x << " çift, negatif sayıdır " << endl;

}else {

cout << x << " tek sayıdır " << endl;}

� Şimdi else ilk if’e aittir

� if – else eşleştirme kuralı� Her else en yakınındaki birleşik blokta eşleştiği başka bir else olmayan

if’e aittir