Bana kod yazmayı öğret baba – Bölüm 8

Eğer bu derse kadar kazasız belasız geldiyseniz, ödevleri eksiksiz yapabildiyseniz, while/if kullanmayı ve algoritma yazmayı biraz kavradıysanız doğru yoldasınız ve temelleri güzel atmışsınız demektir. Şimdi bu temelin üzerine bugün biraz daha sos katacağız. Haydi biraz biberleyelim! Unutanlar için compiler’ımız burada.

Arkadaşlar, bu noktada sizlere bir itirafta bulunmak istiyorum. Ben, hocanız Hafız Lakyab, aslında acımasız biriyim. Size geçen ders zorla while kullanarak bir sayının diğer sayıdan kalanını hesaplattım. Üstelik bunu ödev olarak verdim. Aslında bu çok kolay yapılabiliyordu. “%” denen işareti kullanarak:

sayi1 = input("Bir sayi giriniz lutfen:")
sayi1 = int(sayi1)
sayi2 = input("Bir sayi daha giriniz lutfen:")
sayi2 = int(sayi2)
print("ilk girdiginiz sayinin ikinciyle bolumunden kalan = " + str(sayi1 % sayi2))

Gördüğünüz üzere şöyle bir satır kod kullanarak bir sayının başka bir sayıdan kalanını hesaplayabiliyoruz:

kalan = ilk_sayi % ikinci_sayi

İlk derste “tekerleği yeniden icat etmeyin” demekten kastım tam olarak buydu. Yapmaya çalıştığınız şeylerin pek çok kolay yöntemi olabilir. Yazacağınız şeyleri hemen bir Google taramasıyla kontrol etmenizde fayda var.


Ödev 8.1: Kullanıcıdan bir sayı girmesini isteyen ve “%” kullanarak o sayının tek mi çift mi olduğunu ekrana yazan bir kod yazın. 


Bu kadar hesap, kitap, sayılar, işlemler falan yeter. Biraz da edebi konulara yönelelim. Bakınız Python’un daha ne güzel fonksiyonları var:

  • len(string): Bir stringin kaç karakter olduğunu hesaplayan fonksiyon. Len burada length’in (uzunluk) kısaltılması.
isim = input("Isminiz?")
harf_sayisi = len(isim)
print("Isminizde " + str(harf_sayisi) + " karakter var bosluklar dahil.")

Dikkat ederseniz yukarıdaki fonksiyon boşluklar dahil olarak tüm karakter sayısını veriyor. Önceden de söylediğimiz gibi boşluk ” ” da Python için bir harften farkı olmayan bir karakter. O yüzden len(“a b c”) gibi bir şey yazarsanız sonuç olarak 5 elde edersiniz.


Ödev 8.2: Kullanıcıdan 5 karakterli (harfli değil) bir kelime girmesini isteyen ve girene kadar devamlı tekrar soran bir kod yazın. Bitince de kullanıcının toplam kaç kelime girdiğini yazsın.


Peki kelimelerdeki boşlukları bulmaya çalışsak?

  • string.find(string):Bir stringin içinde başka bir string arayıp onun ilk bulunduğu yerin kaçıncı karakter olduğunu verir. Yalnız saymaya 0’dan başlar. Ayrıca o stringi içinde bulamazsa -1 döner. Kullanımı şöyledir: “içinde kelime/harf aradığınız string”.find(“aradığınız kelime/harf”)
sertac = "Ask bu kizilotesi, yarali muzesi, hareket edemem"
sonuc = sertac.find("kizilotesi")
print("kizilotesi'nin ilk bulundugu yer: " + str(sonuc))
sonuc = sertac.find("Ask")
print("Ask'in ilk bulundugu yer: " + str(sonuc))
sonuc = sertac.find(",")
print("virgulun ilk bulundugu yer: " + str(sonuc))
sonuc = sertac.find("?")
print("soru isaretinin ilk bulundugu yer: " + str(sonuc))

Herkes sırasıyla 7, 0, 17 ve -1 cevaplarını aldı umarım? Burada find fonksiyonunun yaptığı şey, parantez içine yazdığımız ikinci string’i .find’in önüne yazdığımız ilk string’in içinde araması ve eğer bulursa ikinci stringin ilk karakterinin sırasını vermesi. Yalnız dikkat etmemiz gereken şey, burada sıralamaya 0’dan başlanması. Mesela “Aşk” direkt kelimenin en başında ve “A” bize göre birinci karakter. Ama find fonksiyonuna göre 0’ıncı. O yüzden sertac.find(“Aşk”) 1-1=0 oluyor. “kızılotesi”nin başındaki “k” harfi de 8’inci sırada o yüzden sertac.find(“kızılotesi”) de 8-1=7 oluyor. “,”‘leri arattığımız sertac.find(“,”) kısmında ise kelime içindeki 3 farklı virgülden birincinin yeri bulunuyor. Son olara bir de kelime içinde ? aratıyoruz ama yok. O yüzden find fonksiyonu -1 cevabını dönüyor.

Find fonksiyonuyla, dikkat ederseniz, iki farklı işi birden yapıyoruz. Birincisi bir kelime içinde başka bir kelime/harf var mı yok mu onu buluyoruz. Eğer fonksiyon -1 sonucunu veriyorsa yok, -1’den büyük bir sayıysa var. İkincisi, eğer varsa kelime içindeki pozisyonunu buluyoruz. Bir taşla iki kuş diye buna derim.


Ödev 8.3: Kullanıcıdan ismini girmesini isteyen ve eğer isminde “m” harfi yoksa soyadını da girmesini isteyen, onda da “m” harfi yoksa yaşını soran bir kod yazın. (Evet biraz saçma oldu ama artık idare edin.)


Ödev 8.4: Kullanıcıdan ismini girmesini isteyen ve içinde kaç farklı sesli harf olduğunu yazan, eğer sesli harf bulamazsa “Öyle isim mi olur lan!!” yazan bir kod yazın. Not: Şu ana kadar öğrendiklerimizle bu ödevin çözümü epey bir (20-30 civarı) satır kod gerektirmekte. İleride öğreneceğimiz bazı tekniklerle bunu elbette kısaltacağız. Ama elinizi korkak alıştırmayın ve yazın lütfen.


Dersin başından beridir bir fonksiyon geyiği yapıp duruyoruz. Peki nedir bu fonksiyon olayı?

Programlama dillerinde fonksiyon, aslında matematikte kullanılan fonksiyon fikriyle çalışan bir programlama hadisesi. Konuyu biraz matematiksel olarak açıklayalım öncelikle. Aramızda matematik fobisi olanlar varsa lütfen biraz sabretsinler. Bir fonksiyon örneği verelim:

f(r) = π*r2

Bir dairenin alanını hesaplayan bir fonksiyon yazdık. Bu fonksiyonun tek girdisi r, yani dairenin yarıçapı. Fonksiyonun verdiği değer f(r) ise r yarıçaplı bir dairenin alanı. Bir de dikdörtgenin çevresini hesaplayan bir fonksiyon yazalım:

f(x, y) = 2x + 2y

Bu fonksiyon da x ve y olan dikdörtgen kenar uzunluklarını alıp dikdörtgenin çevresini hesapladı bizim için. Önceki fonksiyondan tek farkı, bir girdi yerine iki tane girdi istemesi.

Şimdi biraz olayın felsefi boyutunu düşünelim. Fonksiyon dediğimiz olay aslında ufak bir makina gibi. Sizden belli girdiler istiyor ve onları alıp belli işlemlere sokup bir çıktı veriyor. Makina demiştim ama fırın demek daha doğru olur. Üzümlü kekiniz için tüm malzemelerinizi (un, yumurta, şeker, tereyağı, kuru üzüm vs.) hazırladınız, aldınız onu bir kek kalıbına döktünüz. Fırının da sıcaklığını 180 derece yaptınız ve kek kalıbını fırına soktunuz. Yarım saat sonra fırın size çok farklı bir çıktı verdi. Mis gibi bir üzümlü kek. Burada un, yumurta, tereyağı, şeker, kuru üzüm, kek kalıbı ve fırının sıcaklığı hepsi pişirme fonksiyonun girdileri, çıktısı ise “mis gibi bir üzümlü kek.” Şöyle bir şey tam olarak:

Peki fırının sıcaklığını 180 değil de 250 yapsaydık? O zaman “dibi tutmuş bir üzümlü kek” elde ederdik. Peki 300 yapalım. O zaman da “kömür olmuş bir üzümlü kek denemesi” elimize geçerdi. Peki, şeker yerine tuz koysak? Onun ne olacağı benim hayal gücümün biraz dışına çıkıyor ama “mis gibi bir üzümlü kek” elde edemeyeceğimiz kesin. Peki üstüne bir de portakal rendelesek? Uff canım çekti bea! Neyse yani demek istediğim, burada kullandığımız fırında pişirme fonksiyonunun çıktısı, girdilerine göre değişiyor. Aynen matematik fonksiyonlarında olduğu gibi. Dikdörtgenin çevresini ölçen fonksiyon f(2, 1) = 6 olurken f(5, 10) = 30 oluyor.

Programlama konusuna dönecek olursak. Aslında bugün öğrendiğimiz her şey ayrı birer fonksiyon:

  • len: Verilen bir string’in kaç karakter olduğunu söyleyen bir fonksiyon. String girdi alıp integer çıktı verir.
  • find: İki tane string alır. Biri diğerinin içinde var mı diye bakar ve kaçıncı karakterde bulduğunu integer olarak verir.

Tabi bu fonksiyonlar matematikte kullanılanları epey aşıyorlar. Matematik fonksiyonlarında bir sayı giriyoruz (dairenin yarıçapı), sonuçta yine bir sayı çıkıyor. Bu fonksiyonlarda ise girdi olarak kelimeleri kullanıyoruz ve dışarı bir sayı çıkıyor. Ne acayip bi fırın la bu?

Dikkat ederseniz her fonksiyonun tanımlı bir girdi türü ve sayısı var ve bu girdilerin sayısı birden fazla olabilir. Ve de bir çıktı türü var ve evet Python’da bu çıktıların sayısı da birden fazla olabilir. Eğer fonksiyonlara gereğinden fazla veya eksik parametre sokarsak Python hemen bir hata verecektir. Fırına pişirmek için ayakkabınızı koyduğunuzu hayal edin.

Ama görüldüğü üzere kendisi hatamızın ne olduğunu da söyleyecektir. “Hocam len bir tane parametre istiyordu ama sen iki tane girdin.” O yüzden, kullanacağımız fonksiyonların ne istediğini ve ne kadar istediğini bilmemizde fayda var.

Python’da bakın daha ne kadar güzel fonksiyonlar mevcut:

  • min ve max: bir grup sayının en büyüğünü ve en küçüğünü hesaplar:
y = 12
z = 89
x = min(y, 0.45, z, -3)
print(x)
x = max(y, 0.45, z, -3)
print(x)

Ödev 8.5: Kullancıdan girdiği sayıların toplamı 100’ü geçene kadar devamlı bir sayı girmesini isteyen ve toplam 100’ü geçtiğinde o zamana kadar girilen en büyük ve en küçük sayıları ekrana yazan bir kod yazın. İpucu: girilen en küçük ve en büyük sayıları tutan birer değişken kullanıp kullanıcının girdiği her sayının değerine göre bu değişkenlerini değerini gerekirse değiştirmek mantıklı bir yöntem olacaktır.


  • abs: Bir sayının mutlak degerini alır
  • round: Sayıyı yuvarlar
x = -8.9
y = abs(x)
print(y)
z = round(y)
print(z)

Ödev 8.6: Kullancıdan yaşını girmesini isteyen, negatif bir sayı girerse onu abs ile pozitife çevirip “Bunu mu demek istemiştiniz?” diye soran bir kod yazınız.


  • isnumeric: Verilen bir string’in tamamen rakamlardan oluşup oluşmadığına bakıp cevap olarak boolean true/false döner. Eğer tamamen rakamlardan oluşuyorsa True, oluşmuyorsa False döner.
x = "343556"
sonuc = x.isnumeric()
print(sonuc)
x = "mehmet 26m"
sonuc = x.isnumeric()
print(sonuc)

Ödev 8.7: Kullancıdan yaşını girmesini isteyen, cevap olarak harf falan girerse, “Nabiyon hacı, yaş dedik?” diyerek tekrar tekrar kullanıcı bir sayı girene kadar direten süper gıcık bir program yazınız.


  • isalnum: Verilen bir string’in tamamen rakamlar ve harflerden oluşup oluşmadığına bakıp cevap olarak boolean true/false döner. Eğer tamamen rakamlar ve harflerden oluşuyorsa True, oluşmuyorsa False döner. Yani arada ,:’><!? gibi karakterler varsa False döner.
x = "343556"
sonuc = x.isalnum()
print(sonuc)
x = "343556-3434?"
sonuc = x.isalnum()
print(sonuc)
x = "mehmet26m"
sonuc = x.isalnum()
print(sonuc)
x = "mehmet 26m"
sonuc = x.isalnum()
print(sonuc)

Peki len, min, max, input, print gibi şeyler nasıl çalışıyor? Ben len(“kelime”) yazdığımda Python nasıl “hadi len?” demiyor da “Bu string’in kaç karakter olduğunu hesaplamam gerekiyor” diyor? Bunu sonraki dersimizde konuşacağız. Ama tabii ki bir yeni ödev daha patlatalım kapatmadan.


Ödev 8.8: Kullanıcıya sırasıyla adını, soyadını, adresini ve telefon numarasını soran bir program yazın. Program kullanıcı bunları girdikten sonra aşağıdaki kontrolleri sırayla yapsın ve ilgili hataları versin:

    • Eğer isim 20 karakterden uzunsa -> “İsim kısmına sadece ismi giriniz. Soyadı birazdan soruyoruz.”
    • Adında boşluk varsa (mesela Mehmet Ali) -> “Lütfen sadece kullanmak istediğiniz adınızı giriniz.”
    • Eğer isim + soyad 40 karakterden uzunsa -> “Oha veritabanını mı göçerteceksin, öyle uzun isim soyad kombinasyonu mu olur?”
    • Eğer adresi 10 karakterden kısaysa -> “O kadar kısa adres olmaz olamaz imkansız?”
  • Eğer telefon numarasına harfli karakterler girdiyse veya 10 karakter değilse -> “Telefon numarasına lütfen abuk subuk değerler girmeyiniz.”

Eğer girdiler yukarıdaki tüm kontrollerden sağsalim geçtiyse ekrana “Teşekkür ederiz sayın [buraya isim + soyad gelecek], adresinizi ve telefon numaranızı kaydettik. İyi günler!” yazsın.


Bu bölümü kapatmadan son bir not. Bugün ve önceden öğrendiğimiz fonksiyonlar ve değişik yöntemlerin hiçbirini ezbere aklınızda tutmanıza gerek yok. Sadece ihtiyacınız olduğunda onları nerede bulacağınızı bilmeniz yeterli. Mesela bir sonraki bölümlerde bu fonksiyonları kullanmanız gereken ödev soruları olacaktır. En basit yöntem, gelin bu sayfayı açın ve ilgili kısmı kopyalayıp yapıştırın. Hiçbir şeyi ezberlemenize gerek yok. Sadece onları nerede bulacağınızı bilin yeter.

Ve tabii ki çözümlerle kapatıyoruz. Sevgiler!


Ödev 7.1 çözüm

say = 0
while(say <= 478):
  say = say + 1
  print("naber la?")

Ödev 7.2 çözüm

verilen_sayi = input("Bir sayi giriniz lutfen:")
verilen_sayi = int(verilen_sayi)
say = 0
while(True):
  say = say + 1
  print("naber la?")
  if say == verilen_sayi:
    break

Ödev 7.3 çözüm

verilen_sayi = input("Bir sayi giriniz lutfen:")
verilen_sayi = int(verilen_sayi)
say = 0
while(say < verilen_sayi):
  say = say + 3
  print(say)

Ödev 7.4 çözüm

verilen_sayi = input("Bir sayi giriniz lutfen:")
verilen_sayi = int(verilen_sayi)
say = verilen_sayi
while(True):
  say = say - 5
  print(say)
  if say <= 0:
    break

Ödev 7.5 çözüm

verilen_sayi = input("Bir sayi giriniz lutfen:")
verilen_sayi = int(verilen_sayi)
say = verilen_sayi
toplam = 0
while(say > 0):
  say = say - 1
  toplam = toplam + say
print("Girdiginiz sayidan kucuk tum sayilarin toplami = "+ str(toplam))

Ödev 7.6 çözüm

verilen_sayi = input("Bir sayi giriniz lutfen:")
verilen_sayi = int(verilen_sayi)
say = 1
teklerin_toplami = 0
while(True):
  teklerin_toplami = teklerin_toplami + say
  say = say + 2
  if say >= verilen_sayi or say >= 38:
    break
print("Girdiginiz sayidan ve 38'den kucuk tum tek sayilarin toplami = "+ str(teklerin_toplami))

Ödev 7.7 çözüm

say = 0
while(True):
  girilen_sayi = input("100 ve 200 arasinda bir sayi giriniz lutfen:")
  girilen_sayi = int(girilen_sayi)  
  say = say + 1
  if girilen_sayi < 100: 
    print("Bu sayi 100'den kucuk") 
  elif girilen_sayi > 200:
    print("Bu sayi 200'den bucuk")
  else:
    break
print("Toplam " + str(say) + " sayi girdiniz.")

Ödev 7.8 çözüm

sayi = input("Bir sayi giriniz lutfen:")
ilk_girilen_sayi = sayi
sayi = int(sayi)
while(True):
  sayi = sayi - 2
  if sayi < 2:
    break
if sayi == 1:
  print("Girdiginiz sayi " + ilk_girilen_sayi + " tek")
else:
  print("Girdiginiz sayi " + ilk_girilen_sayi + " cift")

Ödev 7.9 çözüm

sayi1 = input("Bir sayi giriniz lutfen:")
sayi1 = int(sayi1)
sayi2 = input("Bir sayi daha giriniz lutfen:")
sayi2 = int(sayi2)
while(True):
  sayi1 = sayi1 - sayi2
  if sayi1 < sayi2:
    break
print("ilk girdiginiz sayinin ikinciyle bolumunden kalan = " + str(sayi1))

Ödev 7.10 çözüm

verilen_sayi = input("Bir sayi giriniz lutfen:")
verilen_sayi = int(verilen_sayi)
carpim_sayisi = 1
while(True):
  carpim_sayisi = carpim_sayisi + 1
  sonuc = carpim_sayisi * verilen_sayi
  if sonuc < 1000: 
    kaydedilen_sonuc = sonuc 
  if sonuc > 1000:
    break
print("Cevab: " + str(kaydedilen_sonuc))

Ödev 7.11 çözüm

verilen_sayi = input("Bir sayi giriniz lutfen:")
verilen_sayi = int(verilen_sayi)
say = 0
while(True):
  say = say + 1
  if say * say == verilen_sayi:
    print("Verdiginiz sayi tam kare")
    break
  elif say * say > verilen_sayi:
    print("Verdiginiz sayi tam kare degil")
    break

Ödev 7.12 çözüm

say = 0
en_buyuk_sayi = 0
while(True):
  girilen_sayi = input("100 ve 200 arasinda bir sayi giriniz lutfen:")
  girilen_sayi = int(girilen_sayi)  
  say = say + 1
  if girilen_sayi > en_buyuk_sayi:
    en_buyuk_sayi = girilen_sayi
  if girilen_sayi <= 200 and girilen_sayi >= 100:
    break
print("Toplam " + str(say) + " sayi girdiniz.")
print("Ayrica su ana kadar girdiginiz en buyuk sayi:  " + str(en_buyuk_sayi))
The following two tabs change content below.

Hafız Lakyab

BNGL'nin ilk zamanlarında şakalı komiklikli yazılarını esirgemeyen Hafız son zamanlarda yatış pozisyonuna geçerek yattığı yerden Civilization’dır, Europa Universalis’tir oyunlara sardırmıştır. Eğer bir gün dünyayı ele geçirebilirse uzmanı olmadığı konularda yazılarına devam edecektir. Ayrıca, şarkıları tersten söyleyebildiğini biliyor muydunuz?

2 thoughts on “Bana kod yazmayı öğret baba – Bölüm 8

  • 26 Nisan 2019 at 22:16
    Permalink

    Merhabalar ödev 7.3’de bir sorun var galiba,

    verilen_sayi = input(“Bir sayi giriniz lutfen:”)
    verilen_sayi = int(verilen_sayi)
    say = 0
    while(say +3 < verilen_sayi):
    say = say + 3
    print(say)

    sorunu bu şekilde çözdüm, kolay gelsin.

    Reply
  • 19 Aralık 2019 at 02:45
    Permalink

    Merhaba,

    Oncelikle cok tesekkurler, anlatiminiz cok guzel. Acaba yeni dersler olamya devam edecek mi? Cevremdeki bi kac arkadasima da tavsiye ettim, 8 dersimizi odevleriyle tamamladik ve merakla devaminin gelmesini bekliyoruz

    Reply

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.