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))