我正在尝试解决编程任务,但遇到了一些麻烦。该任务显示为:
考虑用于计算二次方程解的常用公式: ax2 + bx + c = 0由 x = sqrt(b±b ^ 2-4−ac / 2a) 编写程序可从命令行读取a,b和c的值。使用异常处理缺少的参数,并处理b ^ 2-4ac <0
处的无效输入我的程序如下:
from math import sqrt
import sys
try:
a = float(sys.argv[1])
b = float(sys.argv[2])
c = float(sys.argv[3])
bac = b**2 - 4*a*c
if bac < 0:
raise ValueError
except IndexError:
while True:
input("No arguments read from command line!")
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
bac = b**2 - 4*a*c
if bac > 0:
break
if bac < 0:
while True:
print("Please choose values of a,b,c so\
that b^2 - 4ac > 0")
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
bac = b**2 - 4*a*c
if bac > 0:
break
except ValueError:
while True:
input("Please choose values of a,b,c so that b^2 - 4ac > 0")
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
if bac > 0:
break
for i in range(-1,2,2): # i=-1, next loop > i=1
x = (b + i*sqrt(bac)) / (2*a)
print("x = %.2f"%(x))
似乎工作正常,但在下面的情况下却没有:
terminal >
python quadratic_roots_error2.py
No arguments read from command line!
a = ? 1
b = ? 1
c = ? 1
Please choose values of a,b,c so that b^2 - 4ac > 0
a = ? 5
b = ? 2
c = ? -3
No arguments read from command line!
a = ? 5
b = ? 2
c = ? -3
x = -0.60
x = 1.00
为什么程序会吐出消息“没有从命令行读取参数!”?我希望程序打印每个解决方案,其中b ^ 2-4ac> 0,并且每当b ^ 2-4ac <0时,我都希望消息“请选择a,b,c的值,以便b ^ 2-4 -ac> 0”像它一样进行打印。
答案 0 :(得分:4)
为什么程序会吐出消息“没有从命令行读取参数!”?
因为它正在尝试从命令行获取参数,所以没有任何内容。
“命令行”是您键入以启动程序的命令:
python quadratic_roots_error2.py
键入命令时,您可以选择提供参数,例如:
python quadratic_roots_error2.py 5 99 1000
但是您没有这样做,因此程序会打印该消息,然后从键盘读取输入。
如果您不希望打印该消息,为什么还在那里?
答案 1 :(得分:1)
当索引1处没有任何内容时,您通过调用IndexError
获得sys.argv[1]
。
正如John Gordon所提到的,sys.argv
正在寻找在调用脚本本身时给出的输入。由于调用中没有参数,在这种情况下为python quadratic_roots_error2.py
,因此索引1处的列表sys.argv
中没有任何内容。您的脚本随后抛出了IndexError
,并被捕获了在您的Except IndexError
子句中,然后遍历代码中要求A,B和C值的部分。解决问题的最快方法是替换:
a = float(sys.argv[1])
b = float(sys.argv[2])
c = float(sys.argv[3])
具有:
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
就像脚本中的其他地方一样。
答案 2 :(得分:0)
感谢您的回复!我已经考虑了它们,现在的代码如下所示:
try:
a = float(sys.argv[1])
b = float(sys.argv[2])
c = float(sys.argv[3])
except IndexError:
input("No arguments read from command line!")
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
try:
for i in range(-1,2,2):
x = (b + i*sqrt(b**2 - 4*a*c)) / (2*a)
print("x = %.2f"%(x))
except ValueError:
while True:
input("Please choose values a,b,c so that b**2 - 4*a*c > 0")
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
if b**2 - 4*a*c > 0:
for i in range(-1,2,2):
x = (b + i*sqrt(b**2 - 4*a*c)) / (2*a)
print("x = %.2f"%(x))
sys.exit(1)