2016-08-27 2 views
0

Ich bekomme diese Nachricht von Zeit zu Zeit. Ich habe alle Variationen versucht, ändere die Art, wie ich die sqrt benutze, mache es Schritt für Schritt .. etc Aber immer noch dieser Fehler taucht auf. Es könnte ein Anfängerfehler sein, den ich nicht bemerke, da ich neu bei Python und Ubuntu bin. Das ist mein Quellcode :-(ein sehr einfaches Programm)ValueError: Math-Domain-Fehler, erscheint immer wieder

#To find the area of a triangle 
a=input("Input the side 'a' of a triangle ") 
b=input("Input the side 'b' of a trianlge ") 
c=input("Input the side 'c' of a triangle ") 
from math import * 
s=(a+b+c)/2 
sq=(s*(s-a)*(s-b)*(s-c)) 
area=(sqrt(sq)) 
perimeter=2*(a+b) 
print "Area = ", area 
print "perimeter=", perimeter 

und das ist der Fehler i

Traceback (most recent call last): 

    line 8, in <module> 

    area=(sqrt(sq)) 

ValueError: math domain error 
+1

Das passiert, wenn die Werte für "a", "b" und "c" kein Dreieck bilden, z. a = 2, b = 4, c = 10. – user3386109

Antwort

3

Wie andere haben darauf hingewiesen, Ihre Berechnung für Bereich Formel Heron wird die Quadratwurzel aus einer negativen Zahl beinhaltet, wenn die drei „Seiten“ nicht tatsächlich ein Dreieck bilden. Eine Antwort zeigte, wie man das mit der Ausnahmebehandlung handhabt. Dies trifft jedoch nicht zu, wenn die drei "Seiten" ein degeneriertes Dreieck bilden, eines mit der Fläche Null und somit kein traditionelles Dreieck. Ein Beispiel dafür wäre a=1, b=2, c=3. Die Ausnahme wartet auch, bis Sie versuchen, die Berechnung zu finden, um das Problem zu finden. Ein anderer Ansatz besteht darin, die Werte vor den Berechnungen zu überprüfen, wodurch das Problem sofort gefunden wird und Sie entscheiden können, ob Sie ein degeneriertes Dreieck akzeptieren oder nicht. Hier ist ein Weg, um zu überprüfen:

a=input("Input the side 'a' of a triangle ") 
b=input("Input the side 'b' of a triangle ") 
c=input("Input the side 'c' of a triangle ") 
if a + b <= c or b + c <= a or c + a <= b: 
    print('Those values do not form a triangle.') 
else: 
    # calculate 

Hier ist erneut die Kontrolle, mit nur zwei Ungleichheiten eher als die traditionellen drei:

if min(a,b,c) <= 0 or sum(a,b,c) <= 2*max(a,b,c): 
    print('Those values do not form a triangle.') 
else: 
    # calculate 

Wenn Sie entarteten Dreiecke zu ermöglichen, entfernen Sie die Gleichheitszeichen in der Kontrollen.

+0

Vielen Dank! Das hat geholfen. – steve

+0

Gern geschehen. Zeigen Sie auf dieser Seite jedoch Ihre Wertschätzung, indem Sie alle nützlichen Antworten aufwerten. Sie tun dies, indem Sie auf den Pfeil oben links in der Antwort klicken. Akzeptieren Sie außerdem die beste Antwort, indem Sie auf das Häkchen oben links in der Antwort klicken. Das ist besser als danke in einem Kommentar zu sagen. Es hilft auch anderen zu sehen, dass Ihre Frage beantwortet wurde. Bitte akzeptiere entweder diese Antwort oder die andere. Beides sind gute Antworten - ich werde mich nicht schlecht fühlen, wenn Sie den anderen akzeptieren. –

2

Wenn a, b, c bilden kein Dreieck, Quadrat erhalte wird herauskommen, um -ve zu sein. Überprüfen Sie, ob s*(s-a)*(s-b)*(s-c) positiv ist, da sqrt (-ve Nummer) eine komplexe Zahl ist.

Um dieses Problem zu beheben, können Sie die Ausnahmebehandlung verwenden.

try: 
    a=input("Input the side 'a' of a triangle ") 
    b=input("Input the side 'b' of a trianlge ") 
    c=input("Input the side 'c' of a triangle ") 
    from math import * 
    s=(a+b+c)/2 
    sq=(s*(s-a)*(s-b)*(s-c)) 
    area=(sqrt(sq)) 
    perimeter=2*(a+b) 
    print "Area = ", area 
    print "perimeter=", perimeter 
except ValueError: 
    print "Invalid sides of a triangle" 
Verwandte Themen