Obiektowe zaprogramowanie ułamków i schemat hornera - problem

0

Witam serdecznie, jestem studentem pierwszego roku i dostałem zadanie stworzenia programu obliczającego wielomiany dowolnego stopnia oraz zaimplementowania arytmetyki ułamków. Zadanie z grubsza zrobiłem tylko jest parę błędów których nie rozumiem, nie do końca umiem zaimplementować hornera by działał oraz nie jestem pewien czy dobrze zaimplementowałem klasę pierwiastków (potrzebne mi jest tylko ich dodawania, mnożenie i negacja na dobrą sprawę). Zależy mi żeby kod ten sprawdził ktoś bardziej doświadczony w temacie ode mnie i doradził co powinienem zmienić. Pierwszy raz programowałem coś obiektowo stąd te wszystkie problemy. Niżej podam mój kod.

class Fraction:

    def __init__(self,top,bottom):
        self.num = top
        self.den = bottom
        if self.num < 0 and self.den > 0:
            self.num = self.num
            self.den = self.den
        elif self.den < 0 or self.den < 0 and self.num < 0:
            self.num = -self.num
            self.num = -self.num
        else:
            self.num = self.num
            self.den = self.den
    def shorten(self):
        if self.den == 1:
            return self.num
        elif self.num % self.den == 0:
            return self.num // self.den
        elif self.num == self.den:
            return 1
        else:
            return Fraction(self.num, self.den)

    def __str__(self):

        return "({}/{})".format(self.num, self.den)


    def __add__(self, other):
        if type(other) is Fraction:
            newnum = self.num * other.den + self.den * other.num
            newden = self.den * other.den
            biggestCommonDivider = euklides(newnum,newden)
            return Fraction(newnum//biggestCommonDivider, newden//biggestCommonDivider).shorten()
        else:
            try:
                other = int(other)
                return(Fraction(other*self.den + self.num, self.den))#.shorten()
            except ValueError:
                raise Exception("Wrong Value")
    def __mul__(self, other):
        if type(other) is Fraction:
            newnum = self.num * other.num
            newden = self.den * other.den
            biggestCommonDivider = euklides(newnum, newden)
            return Fraction(newnum//biggestCommonDivider, newden//biggestCommonDivider).shorten()
        else:
            try:
                other=int(other)
                return Fraction(self.num*other,self.den)#.shorten()
            except ValueError:
                raise Exception("Wrong Value")
    def __neg__(self):
        newnum = -self.num
        newden = self.den
        biggestCommonDivider = euklides(newnum, newden)
        return Fraction(newnum // biggestCommonDivider, newden // biggestCommonDivider).shorten()
    def __eq__(self, other):
        firstnum = self.num * other.den
        secondnum = other.num * self.den
        return firstnum == secondnum
    def __iter__(self):
        self.num=self.num
        self.den=self.den

    __radd__ = __add__
    __repr__ = __str__
    __rmul__ = __mul__
    def value(self):
        return float(self.num/self.den)
def euklides(m, n):
    while m % n != 0:
        oldm = m
        oldn = n

        m = oldn
        n = oldm % oldn
    return n
def Horner(x,wspolczynnikiWielomianu):
    rezultat = wspolczynnikiWielomianu[0]
    kopiaWielomian = []
    for i in wspolczynnikiWielomianu:
        rezultat = rezultat * x + i
        kopiaWielomian.append(rezultat)
    if kopiaWielomian[-1] == 0:
        wiel.append(kopiaWielomian[-1])
    kopiaWielomian[:] = []
    rezultat = wspolczynnikiWielomianu[0]
    for j in wspolczynnikiWielomianu:
        x = -x
        rezultat = rezultat * x + j
        kopiaWielomian.append(rezultat)
    if kopiaWielomian[-1] == 0:
        wiel.append(kopiaWielomian[-1])
    kopiaWielomian[:] = []
    rezultat = wspolczynnikiWielomianu[0]
    return rezultat

# ######################################################################################################################
WielomianLen=int(input("Podaj stopien wielomianu: ")) #wspolczynnikow wielomianu jest tyle ile stopni+ a0
wspolczynnikiWielomianu=[]
tablicaDzielnikowA0=[]
tablicaDzielnikowAn=[]
potentialDividers = []
wiel = []
index = int(0)
for i in range(WielomianLen+1):
    wspolczynnikiWielomianu.append(int(input("Podaj wszystkie wspolczynniki calkowite wielomianu: \n")))
#print("Twoj wielomian wyglada nastepujaco: \n")
#print()
p=wspolczynnikiWielomianu[-1]
if p<0:
    p=-p
q=wspolczynnikiWielomianu[0]
if q <0:
    q=-q
a0=wspolczynnikiWielomianu[-1]
an=wspolczynnikiWielomianu[0]
#print(p,q)

for i in range(p*10):
    i+=1
    if a0%i==0:
        if a0<0:
            tablicaDzielnikowA0.append(-i)
        else:
            tablicaDzielnikowA0.append(i)
       # print(i, a0 % i)
    else:
        i+=1
for i in range(p*10):
    i+=1
    if an%i==0:
        if an<0:
            tablicaDzielnikowAn.append(-i)
       # print(i, an % i)
        else:
            tablicaDzielnikowAn.append(i)
    else:
        i+=1
if len(tablicaDzielnikowA0) < len(tablicaDzielnikowAn):
    i = 0
    while i <= len(tablicaDzielnikowAn):
        divider = Fraction(tablicaDzielnikowA0[index], tablicaDzielnikowAn[i])
        potentialDividers.append(divider)
        dlugoscTablicyDzielnikowAn = int(len(tablicaDzielnikowAn))
        i += 1
        if i == dlugoscTablicyDzielnikowAn:
            index += 1
            i = 0
        if index == len(tablicaDzielnikowA0):
            break
if len(tablicaDzielnikowA0) >= len(tablicaDzielnikowAn):
    i = 0
    while i <= len(tablicaDzielnikowA0):
        divider = Fraction(tablicaDzielnikowA0[i], tablicaDzielnikowAn[index])
        potentialDividers.append(divider)
        dlugoscTablicyDzielnikowA0 = int(len(tablicaDzielnikowA0))
        i += 1
        if i == dlugoscTablicyDzielnikowA0:
            index += 1
            i = 0
        if index == len(tablicaDzielnikowAn):
            break
        #if index == len(tablicaDzielnikowAn):
         #   break
#print("Dzielniki wyrazy wolnego a(0) (nasze p) : "+ str(tablicaDzielnikowA0))
#print("Dzielniki wspolczynnika a(n) przy najwyzszej potedze (nasze q) : "+ str(tablicaDzielnikowAn))
print("Potencjalne pierwiastki naszego wielomianu to: ")
for i in range(len(potentialDividers)):
    print(potentialDividers[i])
################################ H O R N E R ################################

for i in range(len(wspolczynnikiWielomianu)):
    Horner(potentialDividers[i],wspolczynnikiWielomianu)
    print(Horner(potentialDividers[i],wspolczynnikiWielomianu))


0

obliczającego wielomiany dowolnego stopnia

Rozwiń tę myśl.

oraz zaimplementowania arytmetyki ułamków

Tę również,

1 użytkowników online, w tym zalogowanych: 0, gości: 1