Udemy Kursundan Anlamadığım Soru Çözümleri!

Kursu almaya yeni başladım 20 gün kadar oluyor, önceden de hiç bir programlama tecrübem yok. Her bölümün sonundaki soruları yapabilmeye özen gösteriyorum, ancak fonksiyonlar bölümünün sonunda sorulan ebob ve ekok bulma problemlerini yapamadım ve hocanın ödev çözümlerinde verdiği kodları da anlamadım. Anlamamda yardımcı olabilir misiniz? Hocanın yazdığı kodlar şuana kadar öğrendiklerimizden ibaret o yüzde ilerki seviye yapıları kullanmamış olabilir. Şuana kadar işlediğimiz konu başlıkları:

Soru: Kullanıcıdan 2 tane sayı alarak bu sayıların en büyük ortak bölenini (EBOB) dönen bir tane fonksiyon yazın.

Çözüm:
def ebob_bulma(sayı1,sayı2):

    i = 1
    ebob = 1
    while (i <= sayı1 and i <= sayı2 ):

        if ( not (sayı1 % i) and not (sayı2 % i)):
            ebob = i
        i += 1
    return ebob
sayı1 = int(input("Sayı-1:"))
sayı2 = int(input("Sayı-2:"))

print("Ebob:",ebob_bulma(sayı1,sayı2))

Soru: Kullanıcıdan 2 tane sayı alarak bu sayıların en küçük ortak katlarını (EKOK) dönen bir tane fonksiyon yazın.

Çözüm:
def ekok_bulma(sayı1,sayı2):

    i = 2
    ekok = 1
    while True:
        if (sayı1 % i == 0 and sayı2 % i == 0):
            ekok *= i

            sayı1 //= i
            sayı2 //= i


        elif (sayı1 % i ==  0 and sayı2 % i != 0):
            ekok *= i

            sayı1 //= i


        elif (sayı1 % i != 0 and sayı2 % i == 0):
            ekok *= i

            sayı2 //= i
        else:
            i += 1
        if (sayı1 == 1 and sayı2 == 1):
            break
    return ekok

sayı1 = int(input("Sayı-1:"))
sayı2 = int(input("Sayı-2:"))

print("Ekok:",ekok_bulma(sayı1,sayı2))
print("Çıkmak için 'q' tuşuna basınız...")

def tambolen(ebob1,ebob2):
    tam_liste = []
    tam_liste2 = []
    for i in range(1,ebob1):
        if ebob1 % i == 0:
            tam_liste.append(i)
    for x in range(1,ebob2):
        if ebob2 % x == 0:
            tam_liste2.append(x)

    new_liste = []
    for element in tam_liste:
        if element in tam_liste2:
            new_liste.append(element)

    
    return new_liste[-1]

while True:
    sayı1 = input("Sayı giriniz:")
    if sayı1 == "q":
        print("Programdan çıkılıyor...")
        break
    else:
        sayı1 = int(sayı1)
        sayı2 = int(input("Sayı giriniz:"))
        print("ebob:",tambolen(sayı1,sayı2))

Bu benim ebob bulma kodum ama sadece ebob(12,24)'ü “6” olarak buluyor(12 olması gerekiyor), diğer sayılar için normal çalışıyor. Belki başka sayıları da yanlış buluyor olabilir ama test ettim bulamadım.

1 Beğeni

ebob’un sayilardan birine esit oldugu durumda bulamadigini tahmin ettim, ve hakli ciktim. “Edge case” veya “boundary” condition dedigimiz uç durumlardan biri. Potansiyel olarak test edilebilecek digerleri:

(ebob, sayi1, sayi2) uclusunden birinin, ikisinin veya ucunun negatif oldugu, 0 oldugu, 1 oldugu, bir digerine esit oldugu durumlardan gecerli olanlari.

range yari-acik, yani ikinci parametresinin bir oncesinde bitiyor.

Senin kodundan daha basit duruyorlar, anlamadigin spesifik bir nokta var mi?

Ilki i 1’den sonsuza giderken ortak bolen bulursa ebob’a atiyor. Son attigi en buyuk oluyor.

Ikincisi de i 2’den baslayip sayilar 2’ye bolundugu surece bolup ekok’u 2 ile carpiyor. Sonra bunu 3, 4, 5… potansiyel carpanlariyla, sayilar 1 olana kadar tekrar ediyor.

Özet olarak,girilen sayıları işleme dahil etmiyor.

EBOB ve EKOK bulmanın çok daha basit yolları var bu arada:

1 Beğeni

for i in range(1, ebob1+1):

+1 ekleyince program doğru çalıştı, teşekkür ederim.

bunu:

else:
            i += 1

ile mi sağlıyor? 3,4,5 olarak devam etmesini ve çarpmaya devam etmesini?

ve;
ekokta

sayı1 //= i
sayı2 //= i

neden ikiye tam bölmeye çalışıyor. Ve kodun ortak olanlardan en büyük sayıyı anladığı kısım hangisi? Sanırım bir şeyleri kaçırıyorum.

çok soru soruyorum ama bir de ebob da burada:

if ( not (sayı1 % i) and not (sayı2 % i))

tam olarak ne amaçlanıyor. Kafamda Türkçeye çeviremedim, tam anladığımı düşünmüyorum.

Kodu alıntılayarak bahsettiğin yeri gösterebilir misin?

Koşunuzda girilen sayıları da işleme alan bir yer yok.Girdileri de Ebob hesaplamada kullanmalısınız.

1 Beğeni

Evet, i kotu bir isim olmus. Ben olsam carpan/factor derdim.

Ikiye tam bolunebilecegini (sayi1 % i == 0) biliyor zaten. // kullanmasinin nedeni 4 / 2 = 1.999999998 gibi komik floating point hatalarini engellemek.

Ikiye bir kere bolmedigini hatirlatirim. Bolebildigi surece bolmeye devam ediyor. i=3’e gectiginde sayilarin icindeki butun 2 carpanlari ekok’e gecmis oluyor. i=4 hic calismiyor, i=5 5 carpanlarini buluyor… Sadece asallardan ilerlese yeterdi aslinda.

Anlamiyor, hesapliyor. ebob = iki sayinin asal carpanlarinin kesisimi, onu buluyor.

Kotu yazilmis. (sayi1 % i != 0) and (sayi2 % i != 0) daha anlasilabilir olurdu sanirim. Veya bolunmez(sayi1, i) and bolunmez(sayi2, i).

Sormuyorsun, ve cevaplara ayni enerjiyi gosterdigin surece sorun degil :slight_smile:

1 Beğeni

Bu şekilde açıklanınca fark ettim, ben kendi ebob kodumu yazarken önce tam bölenleri bir listeye, sonra ortak tam bölenleri bir listeye ve sonunda en büyük sayıyı return olarak döndürmeye çalıştım. Ve hocanın ekok kodunu da bu şekilde anlamaya çalıştım. Önce girilen sayının katlarını alıp ortak olanları bir yere almasını ve en büyüğü bulmasını bekliyordum. Ama hoca ekokun kodunu derslerde öğrendiğimiz gibi asal çarpanlara böldürerek, buldurmuş. Kodu yanlış okumaya çalışıyormuşum, çok teşekkür ederim yardımlarınız için.