Python-nesne tabanlı programlama mantığı ile yapmaya çalıştım ama sıkıntı yaşıyorum :)

#Bir sayının bölenlerinin toplamı kendine eşitse bu sayı mükemmel bir sayıdır.
#Örnek olarak 6 mükemmel bir sayıdır (1 + 2 + 3 = 6)
Bunu OOP mantığı ile yapmaya çalıştım ama hata veriyor yardım edebilir misiniz?

Kodlarınızı buraya kod görünümünde aktarabilir misiniz?

Görselde görünmüyor mu?Niçin buraya ekleyim?

Kodlarınızı hızlıca kopyalayabilelim diye. Görseldeki kodları kendi bilgisayarımızda test etmek için bütün kodları tek tek elle yazmak yerine, buraya kodlarınızı aktarırsınız, bize zaman kazandırmış olursunuz…

1 Like
class Mükemmel():
    mükemmel_sayılar = []
    def __init__(self):
        self.toplam = 0


    def sayı_aralığı_iste(self):
        return int(input("Sayı Aralığı(1 ile kaç arasında?): "))

    def kontrol(self):
        for i in range(1,self.sayı):
            for j in range(1,i):
                if i % j == 0:
                    self.toplam += j
        if self.toplam == i:
            self.mükemmel_sayılar.append(i)
    @classmethod
    def mükemmel_sayılar(cls):
        print([i for i in cls.mükemmel_sayılar ])

    def çalıştır(self):
        self.sayı = self.sayı_aralığı_iste()
        self.mükemmel_sayılar()

if __name__ == "__main__":
    nesne = Mükemmel()
    nesne.çalıştır()

Bundan sonra böyle yaparım.Teşekkür ederim.

Aşağıdaki kodlara bir göz atın isterseniz.

#!/usr/bin/env python3.7
# -*- coding: utf-8 -*-

class Mukemmel():
    # Sınıf metodu ve sınıf değişkeninin isimlerini
    # aynı yazmışsınız. Sınıf değişkeninin ismini
    # aşağıdaki gibi değiştirdim.
    mukemmel_sayilar_listesi = []
    
    def __init__(self):
        self.toplam = 0

    def sayi_araligi_iste(self):
        return int(input("Sayı Aralığı(1 ile kaç arasında?): "))

    def kontrol(self):
        for i in range(1, self.sayi):
            for j in range(1, i):
                if i % j == 0:
                    self.toplam += j
                    # self.toplam'a j eklenir eklenmez self.toplam'ın
                    # son değerinin i'ye eşit olup olmadığının sorgusu
                    # aynı girintide yapılır.
                    if self.toplam == i:
                        self.mukemmel_sayılar_listesi.append(i)
            # Her bir i sayısı için self.toplam'ı sıfırlamak gerekir.
            self.toplam = 0
            
    @classmethod
    def mukemmel_sayilar(cls):
        print([i for i in cls.mukemmel_sayilar_listesi])

    def calistir(self):
        self.sayi = self.sayi_araligi_iste()
        # self.kontrol() fonksiyonunu çağırmamışsınız.
        # onu da çağırmanız gerekiyor.
        self.kontrol()
        self.mukemmel_sayilar()

if __name__ == "__main__":
    nesne = Mukemmel()
    nesne.calistir()

self.toplam kısmıda yeni bişey öğrendim sayenizde.Fakat ben en baştan olayı yanlış planlamışım galiba.Çünkü çıkan sayılara bakıyorum bazıları mükemmel sayı değil.Mesela 24 sayısı.Bunu nasıl çözebiliriz?Birde en başta yazdığım kodları biraz değiştirdim fakat sayı istedikten sonra sonraki kısımlara geçmiyor bayağı uğraştım bir yerde mi hata yapıyorum acaba.

class Mükemmel():
    mükemmel_sayılar_listesi = []
    def __init__(self):
        self.toplam = 0

    def sayı_aralığı_iste(self):
        self.s1 = int(input("Aralığın Başlangıcı:"))
        self.s2 = int(input("Aralığın Bitişi:"))
        return (self.s1,self.s2)

    def kontrol(self):
        for i in range(self.s1,self.s2):
            for j in range(1,i):
                if i % j == 0:
                    self.toplam += j

                    if self.toplam == i:
                        self.mükemmel_sayılar_listesi.append(i)
            self.toplam = 0
#Buraya kadar olan kısma kadar konsolda nesne oluşturduğumda kontrol özelliği yok diyor?
    @classmethod
    def liste_göster(cls):
        return [i for i in cls.mükemmel_sayılar_listesi]

    def çalıştır(self):
        self.sayı_aralığı_iste()
        self.kontrol()
        self.liste_göster()

if __name__ == "__main__":
    nesne = Mükemmel()
    nesne.çalıştır()

Pardon bir yanlışlık yapmışım, bir kontrol edin isterseniz.

#!/usr/bin/env python3.7
# -*- coding: utf-8 -*-


class Mukemmel():   
    mukemmel_sayilar_listesi = []
    
    def __init__(self):
        self.toplam = 0

    def sayi_araligi_iste(self):
        return int(input("Sayı Aralığı(1 ile kaç arasında?): "))

    def kontrol(self):
        for i in range(1, self.sayi):
            self.toplam = 0
            for j in range(1, i):
                if i % j == 0:
                    self.toplam += j
            if self.toplam == i:
                self.mukemmel_sayilar_listesi.append(i)

    @classmethod
    def mukemmel_sayilar(cls):
        print([i for i in cls.mukemmel_sayilar_listesi])

    def calistir(self):
        self.sayi = self.sayi_araligi_iste()
        self.kontrol()
        self.mukemmel_sayilar()

if __name__ == "__main__":
    nesne = Mukemmel()
    nesne.calistir()

Dediğiniz değişikliği yaptım ve sonuç doğru çıkıyor.Fakat ben 1 le 100 arasında değilde kullanıcının istediği bir aralıkta bunu yapmak istedim ve kodları şu şekilde düzenledim fakat bu seferde sayıları istedikten sonra program bitiyor.Tam çalışmıyor?

class Mükemmel():
    mükemmel_sayılar_listesi = []
    def __init__(self):
        self.toplam = 0

    def sayı_aralığı_iste(self):
        self.s1 = int(input("Aralığın Başlangıcı:"))
        self.s2 = int(input("Aralığın Bitişi:"))
        return (self.s1,self.s2)

    def kontrol(self):
        for i in range(self.s1,self.s2):
            self.toplam = 0
            for j in range(1,i):
                if i % j == 0:
                    self.toplam += j

            if self.toplam == i:
                self.mükemmel_sayılar_listesi.append(i)

#Buraya kadar olan kısma kadar konsolda nesne oluşturduğumda nesnenin kontrol özelliği yok diyor?
    @classmethod
    def liste_göster(cls):
        return [i for i in cls.mükemmel_sayılar_listesi]

    def çalıştır(self):
        (self.s1,self.s2) = self.sayı_aralığı_iste()
        self.kontrol()
        self.liste_göster()

if __name__ == "__main__":
    nesne = Mükemmel()
    nesne.çalıştır()

Yanlış bir şey yok. self.çalıştır() fonksiyonu en son satırda self.liste_göster() fonksiyonunu çağırıyor. Listeyi geri döndürmek için print fonksiyonunu kullanırsanız listeyi ekrana yazdırmış olursunuz.

if __name__ == "__main__":
    nesne = Mükemmel()
    nesne.çalıştır()
    print(nesne.mükemmel_sayılar_listesi)

self.çalıştır() fonksiyonunda self.liste_göster() adında mükemmel sayıları geri döndüren bir fonksiyon çağırıyorsunuz. Eğer fonksiyon değer döndürüyorsa, bu fonksiyonu çalıştır fonksiyonunda boşuna çağırmayın bence, çünkü hiç bir etkisi yok.

Çok ama çok teşekkür ederim.Her sorumuza yetişiyorsunuz?Sağolun :grinning: