2

我在 Mac OS 上使用 IDLE for Python。我在 .py 文件中写了以下内容:

import math
def main():
    print "This program finds the real solution to a quadratic"
    print

    a, b, c = input("Please enter the coefficients (a, b, c): ")

    discRoot = math.sqrt(b * b-4 * a * c)
    root1 = (-b + discRoot) / (2 * a)
    root2 = (-b - discRoot) / (2 * a)

    print
    print "The solutions are: ", root1, root2

main()

IDLE 现在永久显示:

这个程序找到了二次方程的真正解

请输入系数 (a, b, c):

当我输入 3 个数字(例如:1,2,3)时,IDLE 什么也不做。当我点击进入 IDLE 崩溃(没有崩溃报告)。

我退出并重新启动,但 IDLE 现在永久显示上述内容并且不会响应其他文件。

4

3 回答 3

2

方程 X^2 + 2x + 3 = 0 没有真正的解。ValueError当你试图取 的平方根时,你会得到 a b * b-4 * a * c,它是负数。您应该以某种方式处理此错误情况。例如,一个 try/except :

import math
def main():
    print "This program finds the real solution to a quadratic"
    print

    a, b, c = input("Please enter the coefficients (a, b, c): ")

    try:
        discRoot = math.sqrt(b * b-4 * a * c)
    except ValueError:
        print "there is no real solution."
        return
    root1 = (-b + discRoot) / (2 * a)
    root2 = (-b - discRoot) / (2 * a)

    print
    print "The solutions are: ", root1, root2

main()

或者您可以提前检测到判别式是否为负:

import math
def main():
    print "This program finds the real solution to a quadratic"
    print

    a, b, c = input("Please enter the coefficients (a, b, c): ")

    discriminant = b * b-4 * a * c
    if discriminant < 0:
        print "there is no real solution."
        return
    discRoot = math.sqrt(discriminant)
    root1 = (-b + discRoot) / (2 * a)
    root2 = (-b - discRoot) / (2 * a)

    print
    print "The solutions are: ", root1, root2

main()

结果:

This program finds the real solution to a quadratic

Please enter the coefficients (a, b, c): 1,2,3
there is no real solution.
于 2013-08-22T17:51:06.000 回答
1

math模块不支持复数。如果你import mathimport cmathmath.sqrt替换cmath.sqrt,你的脚本应该像魅力一样工作。

编辑:我刚刚读到“这个程序找到了二次方程的真正解决方案”。考虑到您只需要真正的根,您应该检查负判别式,正如凯文指出的那样。

于 2013-08-22T17:55:12.607 回答
1

我看到您的程序失败的原因是:

a, b, c = 1, 2, 3
num = b * b - 4 * a * c

print num

结果为-8。

通常,平方根内不能有负数。

就像我上面的人所说的那样, import cmath 应该可以工作。

http://mail.python.org/pipermail/tutor/2005-July/039461.html

import cmath

a, b, c = 1, 2, 3

num = cmath.sqrt(b * b - 4 * a * c)
print num

= 2.82842712475j

于 2013-08-22T18:02:36.647 回答