2017-03-03 5 views
-2

Ich arbeite an einer Hausaufgabe für meine einführende Python-Klasse. Ziel ist es, Funktionen zu definieren, die */+ - <> < => = Operatoren mit Klassenaufrufen verwenden. Dieses besondere Programm nimmt 3 Parameter self, inches, numerator, denominator und speichert den Nenner als einen Faktor von 64 (wenn es vereinfacht werden kann)Zuweisen von Operatoren zu eingebetteten Klassenfunktionen

Der Aufruf RulerUnit(2, 1, 4)"2 1/4"

zurückkehren würde ich auf dem Multiplikationsteil arbeite, und habe Probleme, wenn inches ist gleich 0

Ist inches == 0 oder inches is None?

Außerdem, je nachdem was der Fall sein kann, wenn ich eine Behauptung zuführen: assert(str(RulerUnit(2, 3, 4) * RulerUnit(0, 1, 2)) == "1 3/8")

Ein AssertionError ist abgesenkte, mein Code

print((RulerUnit(2, 3, 4) * RulerUnit(0, 1, 2)))

druckt 2 3/8

Code:

def __mul__ (self, other): 

    if self.inches == 0 and other.inches == 0: 
     newnum = self.num * other.num 
     finaldenom = self.denom * other.denom 
     finalnum = newnum % 64 
     finalinches = newnum // finaldenom 
     return RulerUnit(finalinches, finalnum, finaldenom) 

    elif self.inches == 0 and other.inches != 0: 
     newnum1 = (self.inches * self.denom) + self.num 
     finaldenom = self.denom * other.denom 
     finalnum = (newnum1 * other.num) % 64 
     finalinches = (newnum1 * other.num) // finaldenom 
     return RulerUnit(finalinches, finalnum, finaldenom) 

    elif self.inches!= 0 and other.inches == 0: 
     newnum1 = (self.inches * self.denom) + self.num 
     finaldenom = self.denom * other.denom 
     finalnum = (newnum1 * other.num) % 64 
     finalinches = (newnum1 * other.num) // finaldenom 
     return RulerUnit(finalinches, finalnum, finaldenom) 

    elif self.inches != 0 and other.inches != 0: 
     newnum1 = (self.inches * self.denom) + self.num 
     newnum2 = (other.inches * other.denom) + other.num 
     finaldenom = (self.denom * other.denom) % 64 
     finalnum = (newnum1 * newnum2) % 64 
     finalinches = (newnum1 * newnum2) // finaldenom 
     return RulerUnit(finalinches, finalnum, finaldenom) 

Antwort

0

Es gibt keine Notwendigkeit für spezielle Fälle, wenn der inches Teil eines Ihres Wertes Null ist. Sie können einfach die Null in der Berechnung verwenden, und es sollte richtig funktionieren:

def __mul__(self, other): 
    num = (self.inches * self.denom + self.num) * (other.inches * other.denom + other.num) 
    denom = self.denom * other.denom 
    inches, num = divmod(num, denom) 
    return RulerUnit(inches, num, denom) 
0

Sie sollten normalisieren, wie Sie die Werte speichern. 2 3/8 ist wirklich 19/8. Sobald Sie das tun, ist Mathematik trivial. Verwenden Sie gemischte Zahlen für Eingabe und Ausgabe, aber verwenden Sie intern reine Brüche.

class Ruler: 
    def __init__(self, inches, n, d): 
     self.n = inches*d + n 
     self.d = d 

    def __str__(self): 
     inches, n = divmod(self.n, d) 
     return "{} {}/{}".format(inches, n, self.d) 

    def __mul__(self, other): 
     return Ruler(0, self.n * other.n, self.d * other.d) 
+0

ok danke für den Vorschlag, ich werde das nutzen –

Verwandte Themen