c++ ders4 - kosullu onermeler
DESCRIPTION
koşullu önermelerTRANSCRIPT
Koşullu Önermeler(if–else)
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.
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
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)
if-else in Akış Şeması
test koşulu
doğruönermeler
doğru
sonrakiönerme
yanlış
yanlışönermeler
Ö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)
Çö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;
}
Çö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";
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
< 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)
Ö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 ! A
true false
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";
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";
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/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
İç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
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,
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.
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 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)
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