IndexError repetido en el terminal causada por excepción

votos
0

Estoy tratando de resolver una tarea de programación, y he corrió en algunos problemas. La tarea se lee:

Considere la fórmula habitual para las soluciones de la ecuación cuadrática de computación: ax2 + bx + c = 0 dada por x = sqrt (b ± b ^ 2-4ac / 2a) Escribir un programa lee los valores para a, b y c de la línea de comandos . Utilizar las excepciones para manejar argumentos que faltan, y manejar la entrada no válida en la que b ^ 2-4ac <0

Mi programa es el siguiente:

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

Parece estar funcionando bien, pero en el caso de abajo, duerma:

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

¿Por qué el programa de escupir el mensaje No hay argumentos leen desde la línea de comandos!? Quiero que el programa para imprimir todas las soluciones que b ^ 2-4ac> 0, y cuando b ^ 2-4ac <0 Quiero que el mensaje Por favor, elegir los valores de a, b, c de modo que b ^ 2 - 4ac> 0 para ser impreso, al igual que lo hace.

Publicado el 19/09/2018 a las 17:13
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
4

¿Por qué el programa de escupir el mensaje "No hay argumentos leen desde la línea de comandos!"?

Debido a que está tratando a buscar argumentos desde la línea de comandos, y no hay ninguna.

La "línea de comandos" es el comando introducido para iniciar el programa:

python quadratic_roots_error2.py

Tiene la opción de suministrar argumentos al escribir el comando, así:

python quadratic_roots_error2.py 5 99 1000

Pero no lo hace, por lo que el programa imprime el mensaje y luego lee la entrada desde el teclado.

Si no desea que el mensaje que se desea imprimir, ¿por qué es incluso allí?

Respondida el 19/09/2018 a las 17:23
fuente por usuario

votos
1

El IndexErrorque está recibiendo proviene de llamar sys.argv[1]cuando no hay nada en el índice de 1.

Como se mencionó John Gordon, sys.argvestá en busca de entradas dadas cuando el guión en sí se llama. Dado que no existen argumentos en la llamada, en este caso python quadratic_roots_error2.py, nada se coloca en la lista sys.argven el índice 1. La secuencia de comandos es entonces lanzar una IndexError, que se está atrapado en su Except IndexErrorcláusula, y después de pasar por la parte de su código que pide para los valores de a, B y C. La manera más rápida para arreglar el problema es reemplazar:

a = float(sys.argv[1])
b = float(sys.argv[2])
c = float(sys.argv[3])

con:

a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))

como si tuviera todo el resto de la secuencia de comandos.

Respondida el 19/09/2018 a las 17:31
fuente por usuario

votos
0

¡Gracias por las respuestas! Los he tomado en consideración, y el código ahora se ve así:

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)
Respondida el 21/09/2018 a las 13:48
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more