PROGRAMLAMA DİLLERİNE GİRİŞ Ders 2: Koşula Göre İşlem Yapma Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği
Boolean değerler Mantık dersinden hatırlayacağımız gibi Boole cebiri sadece 0 (yanlış) ve 1 (doğru) değerleri üzerinde işlem yapmaktadır. Programlama dillerinde de sadece doğru veya yanlış değerini saklayabilen boolean türü değişkenler vardır (doğal olarak bu değişkenler için 1 bit büyüklük yeterlidir). Python’da bir değişkene True veya False değer atadıktan sonra type() fonksiyonu ile bu değişkenin türünü kontrol ederseniz <class 'bool'> yazdığını görebilirsiniz.
Örnekler >>> a = True >>> type(a) <class 'bool'> >>> b = False >>> a and b False >>> a or b True >>> a and not b >>> bool(1) True >>> a = 10 >>> a == 5 False >>> a == 10 >>> a != 5 Görüldüğü gibi karşılaştırma operatörleri ile işlem yapmak boolean sonuç döndürür
if & else Bir koşula göre işlem yapılması istendiğinde en çok kullanılan komut kümesi if & else yapısıdır: if koşul: koşul doğru ise yapılacak işlem else: koşul yanlış ise yapılacak işlem Koşulun yanlış olması durumunda yapılacak bir işlem yok ise else: satırı yazılmaz. Koşul verilirken Boole cebiri kuralları geçerlidir. Yani mantıksal (and, or, not) ve karşılaştırma (>, <, >=, <=, ==, !=) operatörleri kullanılabilir. NOT: ‘Büyük eşit’ ve ‘küçük eşit’ gibi söylenirken eşit kelimesi sonra söylendiği için yazılırken de sonra yazılmalıdır (=> ve =< şeklinde yazım yanlıştır)
Akış Şeması Elemanları Ekrana Gösterme Yazıcıdan Çıktı Başla / Bitir Koşul Veri Girişi Doğrudan Erişimli Dosya Klavyeden Veri Girişi Döngü Sıralı Erişimli Dosya İşlem Fonksiyon Çağırma Akış Yönü
Başarı Notu Hesabı Programı Neden round() kullanmayıp 0.5 puan ekleme yaparak int() kullandık? (bak: Ek bilgi 1) v = int(input("Vize Notu : ")) f = int(input("Final Notu : ")) bn = int(v * 0.3 + f * 0.7 + 0.5) print("Başarı Notu =", bn, end=' ') if bn >= 60: print("(başarılı)") else: print("(başarısız)") Başla v f bn=v*0.3+f*0.7+0.5 bn NOTLAR: 1) Eğer bn hesabında 0.5 eklemezsek 59.5 değerini 59 olarak gösterir ve «başarısız» kabul eder. 2) Hem vize hem de final negatif girilirse ve sonuç %d ile gösterilirse işlem doğru yapıldı gibi görünebilir ama neden «başarılı» print edilir? Girilen negatif değer aslında olabilecek en büyük pozitif değerden çıkarılır (2’ye göre tümleyen alma: Hesap Makinesinin «Programcı» görünümünde 10 gibi bir değer girilip +/- tuşuna basıldığında oluşan büyük binary sayı gösterilerek nedeni izah edilebilir). %d yerine %u kullanıldığında negatif tamsayı yerine pozitif karşılığını (tümleyenini) gösterir. Dev C++ üzerinde programı adım adım (F5) çalıştırarak gösterilirse öğrenci o değerleri programın nasıl kabul ettiğini görür. Bir yandan da «sonraki adım» gibi hata ayıklama işlemlerini görmüş olur. bn>=60 Evet print fonksiyonu ekrana yazdırdıktan sonra alt satıra geçer. end= ifadesi sonrası verilen string varsayılan olarak kullanılan ENTER tuşunun yerini alır. Burada alt satıra inilmesi yerine bir boşluk verilmesini istedik. Böylece daha sonra yazdırılacak olan (başarılı) veya (başarısız) notun sağında belirecek. (bak. Ek bilgi 2) Hayır "başarılı" "başarısız" Dur
Koşul içinde mantıksal operatörler Koşul bazen and (ve), or (veya), not (değil) gibi mantıksal operatörleri içeren birleşik bir mantıksal ifade olabilir: if bn >= 60 and bn < 70: print("(CC)") if bn >= 70 and bn < 80: print("(CB)") if bn >= 80 and bn < 90: print("(BB)") if bn >= 90 and bn < 95: print("(BA)") if bn >= 95: print("(AA)") VE yerine VEYA : if bn >= 60 or bn < 70: … olsaydı ??? 60'tan büyük sayılar ile 70'ten küçük sayıların kesişim değil birleşim kümesi ele alınacağı için birleşik mantıksal ifade her zaman true olacaktı. Her zaman true üreten ifadeyi içeren bir koşulun kontrolünü yapmak mantıksız olacağı için bu if'in yazılması ile yazılmaması arasında fark yoktur. Burada görüldüğü gibi if sonrası verilen koşuldan sonra : kullanılmış ama print bir alt satırda değil, hemen yanında yazılmıştır. Tek bir işlem yapılacak ise bu kullanım hata vermese de, işlemlerin alt satırda yazılması daha okunaklı olur (bak: Kod Bloğu).
elif Önceki slaytta olduğu gibi koşul yanlış olduğunda yapılacak herhangi bir işlem yoksa, else ifadesini kullanmayabiliriz. Peki aşağıdaki gibi yazarsak ne olur: if bn >= 60 and bn < 70: print("(CC)") elif bn >= 70 and bn < 80: print("(CB)") elif bn >= 80 and bn < 90: print("(BB)") elif bn >= 90 and bn < 95: print("(BA)") elif bn >= 95: print("(AA)") Bu şekilde yazıldığında ilk koşul doğru ise diğer 4 koşulu kontrol etmez, ikinci koşul doğru ise altındaki 3 koşulu kontrol etmez, … Bu sayede program daha hızlı çalışır. C, C++, C# ve JAVA dilinde else if şeklinde yazılır
Dört İşlem Programı a = int(input("İlk sayıyı girin : ")) b = int(input("İkinci sayıyı girin : ")) print("1) Toplama, 2) Çıkarma, 3) Çarpma, 4) Bölme") i = int(input("İşlemi Seçin: ")) if i == 1: print("Toplam : ", a + b) elif i == 2: print("Fark : ", a - b) elif i == 3: print("Çarpım : ", a * b) elif i == 4: print("Bölüm : ", a / b) Geçen hafta yazılan dört işlem programında işlem seçimi yoktu, iki sayı girildikten sonra tüm işlemler gösteriliyordu. Bu programda işlem seçilerek sadece o işlemin sonucu gösteriliyor.
Dört İşlem Programının Akış Şeması Başla Akış şemalarında genellikle "İlk sayıyı girin", "İkinci sayıyı girin", "İşlemi seçin" gibi ekranda kullanıcıyı bilgilendirme amaçlı çıktılara yer verilmez. Veri girişi, işlem ve sonuç çıktıları gösterilmesi yeterlidir. a b i i=1 Evet a+b Koşul (Karar) ifadelerinde "==" kullanmak gerekli değildir. Basic, Pascal gibi farklı dillerde karşılaştırma için "==" değil "=" kullanılır. Akış şemaları belirli bir dile göre yazılmadığı için "=" kullanımı daha uygundur. Hayır i=2 Evet a-b Hayır i=3 Evet a*b Hayır i=4 Evet a/b Hayır Dur
Dört İşlem Programı (Farklı Çözüm) a = int(input("İlk sayıyı girin : ")) i = input("İşlemi Seçin (+ - * /) : ") b = int(input("İkinci sayıyı girin : ")) if i == '+': print(a, '+', b, '=', a + b) elif i == '-': print(a, '-', b, '=', a - b) elif i == '*': print(a, '*', b, '=', a * b) elif i == '/': print(a, '/', b, '=', a / b) i str türünde olduğu için işlemler tek tırnak içinde yazılmalıdır Bu programda iki sayının girişinden sonra değil, ikisinin arasında işlem seçimi yapılır ve çıktı öncekine göre farklı biçimdedir print('{} / {} = {}'.format(a, b, a / b)) veya print('%d / %d = %f' % (a, b, a / b)) ile de aynı çıktı elde edililir
Klavyeden girilen 2 sayıdan birincisi büyük ise ikisini çarpan, değilse ikisini toplayan ve sonucu ekranda gösteren program Başla X = int(input("X :")) Y = int(input("Y :")) if X > Y: S = X * Y else: S = X + Y print("S =", S) X Y X>Y Evet S=X*Y Hayır S=X+Y S Dur
Kod Bloğu Yapısal programlama dillerinde program kodu bloklara ayrılır. PASCAL’da kod bloğu begin ile başlar end ile biter. C, C++, C# ve JAVA gibi dillerde ise { ile başar } ile biter. Python’da blok başı ve sonunu belirtmek için belirli bir simge veya kelime kullanılmaz. Eğer bir satır üstündeki satırdan daha sağdan başladıysa blok başlangıcı olarak, daha soldan başladıysa üstündeki satır blok bitişi olarak düşünülür. Öncesinde eşit sayıda boşluk olan (aynı sütundan başlayan) ardışık satırlar aynı blok içinde kabul edilir. ‘:’ karakteri genellikle bir bloğa başlanacağını gösterir. Bu nedenle ‘:’ karakterinden sonra ENTER tuşuna basılması, alt satırın başına bir TAB (genellikle 4 boşluk karakteri) eklenmesine neden olur. Boşluk sayısını arttırıp azaltabilirsiniz, fakat hiç boşluk kullanmadığınızda hata verecektir. Yapısal programlama dillerinde kodun daha kolay okunabilmesi için iç bloğu oluşturan satırlar dış bloktakilere göre daha sağdan başlar. Diğer dillerde bunu yapmak seçimlik iken, Python’da zorunluluktur.
if-else ile blok kullanımı Verilen koşulun sağlandığı yada sağlanmadığı durumlarda yapılacak işlem birden fazla satır kapsayacak ise yeni bir blok içinde yazılması şarttır. if koşul: koşul doğru ise yapılacak işlem1 koşul doğru ise yapılacak işlem2 else: koşul yanlış ise yapılacak işlem1 koşul yanlış ise yapılacak işlem2 Önceki program kodlarımızda if-else durumlarında tek bir işlem yapıldığı için yeni bir blok oluşturmak, yani alt satırda ve daha sağdan başlayacak şekilde yazmak gerekli değildi. İç blok 1 İç blok 2
Önceki Program (Farklı Çözüm) X = int(input("X : ")) Y = int(input("Y : ")) if X > Y: S = X * Y print("X * Y =", S) else: S = X + Y print("X + Y =", S) Başla X Y X>Y Evet Hayır S=X+Y S=X*Y S S Dur Bu programda iç blokların içerdikleri satırlar öncesinde 4 yerine 2 boşluk karakteri kullanılmıştır. Farklı bloklar farklı sayıda boşluk kullanabilir, fakat aynı bloktaki tüm satırlar aynı hizadan başlamalıdır.
Girilen 3 sayıdan en büyük olanı bulma a = int(input("a : ")) b = int(input("b : ")) c = int(input("c : ")) if a > b: if a > c: print("En büyük sayı a'dır") else: print("En büyük sayı c'dir") elif b > c: print("En büyük sayı b'dir") Başla a,b,c a>b Evet a>c Evet En büyük sayı a’dır Hayır Hayır b>c Evet En büyük sayı b’dir Hayır En büyük sayı c’dir Dur a, b, c = int(input("a : ")), int(input("b : ")), int(input("c : ")) şeklinde tek satırda çok girdi alınabilir
Programa Açıklama Satırı Ekleme Program kodunda yer alan değişkenleri, fonksiyonları, döngüleri, vs. ne için kullandığımızı açıkladığımız ilave satırlar yer alabilir. Bu satırları derleyicinin dikkate almaması için Python’da satırın başında # kullanırız. Editörler genellikle açıklamaları farklı renkte gösterirler Eğer açıklama kısa ise, farklı bir satırda yazmak yerine ilgili satırın sonuna # ilave ederek devamında açıklamayı yazmamız mümkündür: a = int(input("a : ")) # a değişkenine değer girişi Eğer birkaç satır uzunluğunda açıklama yazılmak istenirse her satırın başına # koymak yerine ilk satırın başında ve son satırın sonunda üç tane çift tırnak kullanılabilir. IDLE’da birçok satırı seçip, format menüsünde «Comment Out Region» tıklarsanız bu satırların başına 2 tane (nedense) # eklenir. Aynı menüdeki «Uncomment Region» tıklanınca da bunlar silinir.
Vücut kitle indeksi programı # Vücut kitle indeksi (VKİ), vücut ağırlığının (kg), # boy uzunluğunun (m) karesine bölünmesiyle hesaplanır boy = float(input("Boyunuz (m) : ")) kilo = float(input("Ağırlığınız (kg) : ")) vki = kilo / boy**2 print("Vücut kitle indeksi :", vki, end=' ') if vki < 20: print("(zayıf)") elif vki >= 20 and vki < 25: print("(normal)") elif vki >= 25 and vki < 30: print("(kilolu)") elif vki >= 30 and vki < 35: print("(şişman)") else: print("(obez)")
Uygulama Sorusu: Otomobil vergisi hesaplama programı Ülkemizde otomobillerin satış fiyatı belirlenirken, önce vergisiz fiyatına ÖTV ilave edilmekte, sonra çıkan fiyata bir de %18 KDV eklenmektedir. ÖTV oranları aracın silindir hacmine ve vergisiz fiyatına göre değişmektedir: Girdi olarak aracın silindir hacmini ve vergisiz fiyatını alıp çıktı olarak satış fiyatını hesaplayan programı yazınız Silindir Hacmi Vergisiz Fiyat ÖTV oranı KDV Oranı < 1600 cc < 46000 TL %45 %18 >= 46000 TL, < 80000 TL %50 >= 80000 TL %60 >= 1600 cc, < 2000 cc < 114000 TL %100 >= 114000 TL %110 >= 2000 cc %160
Ödev 1 Not Hesaplama programını değiştirin: Öğrencinin başarı notu 60’tan az ise başarı notunun yanında sadece "Başarısız" değil, "Final sınavından en az … almalıydı" mesajı da görüntülenecek. Final sınavı sonunda başarısız olan öğrenci için Bütünleme notu da istenecek. Bütünleme notu da Final gibi %70 üzerinden değerlendirilip hesaplanan başarı notu gösterilecek.
Ödev 2 Dört işlem programını değiştirin: Ondalıklı sayılar ile işlem yapılabilsin. Önce işlem seçimi yapılsın, sonra sayılar girilsin. Eğer işlem olarak bölme seçildi ise; İlk sayı yerine Bölünen, İkinci sayı yerine Bölen ifadeleri kullanılsın. Çıktı olarak Bölüm (tamsayı olarak) ve Kalan gösterilsin. Örn: 4.5 / 1.4 => Bölüm = 3, Kalan = 0.3 Sıfıra bölme yapılırsa Bölüm = sonsuz çıktısını versin (şu hali ile «division by zero» hatası alıyoruz).
Ödev 3 Vücut kitle indeksi programını değiştirin: Eğer girilen boy ve ağırlığa göre "zayıf" sonucu çıktıysa vki = 20 olması için alınması gereken kilo miktarı da yazılsın. Eğer girilen boy ve ağırlığa göre normalin üzerinde bir sonuç çıktıysa vki = 24.9 olması için verilmesi gereken kilo miktarı da yazılsın.
Ödev 4 Ülkemizde engelli vatandaşlar engellilik oranına göre otomobil alımında ÖTV ödemez veya ÖTV indirimi alırlar. Fakat %18 oranındaki KDV engelli vatandaştan da alınır. Uygulama sorusunda verilen ÖTV oranları geçerli olmak üzere, girdi olarak aracın silindir hacmini ve satış fiyatını alıp, çıktı olarak engelliye satış fiyatını hesaplayan, yani satış fiyatındaki ÖTV oranını sıfırlayan programı yazınız.
Ek bilgi 1 Python’da round fonksiyonu istikrarsız çalışmaktadır. Örneğin 4.5 için 4 sonucunu üretirken 5.5 için 6 sonucunu verir. Birçok dilde noktadan sonra 5 yukarı yuvarlanır. C dilinde printf fonksiyonu içinde float değerlerin gösterilmesi için %f işareti kullanılır ve noktadan sonra 6 hane olarak gösterilir. Python’da ise noktadan sonra 16 hane gösterilir. Eğer noktadan sonra farklı sayıda hane görmek istersek, örneğin 16 hane için %.16f kullanabiliriz. C’deki printf’e benzer bir kullanım Python’da da vardır: C: printf("%.16f", 2.8); printf("%.0f", 4.5); Python: print("%.16f" % 2.8) print("%.0f" % 4.5) Sonuç: 2.7999999999999998 4 (Python) 5 (C) Görüldüğü gibi 2.8 için iki dil de aynı yuvarlama hatasını üretirken, 4.5’in tamsayı görüntülenmesinde Python yine round() gibi hatalı çıktı üretmektedir.
Ek bilgi 2 print fonksiyonunda end= dışında sep= özel parametresi de vardır. Ayıraç (Seperator) anlamına gelir ve aralarına virgül konarak ayrılmış olan her değerin arasına konacak string belirlenir (verilmez ise boşluk karakteri konacağını geçen ders görmüştük). >>> print("a","b","c",sep="123") a123b123c >>> print("15","02","1998",sep="/") 15/02/1998 Bir string öncesi * kullanılması her karakterinin arasına bir boşluk ekler: >>> print(*"Merhaba") M e r h a b a >>> print(*"Merhaba", sep=".") M.e.r.h.a.b.a