Остановите Python до самого последнего заявления

StackOverflow https://stackoverflow.com/questions/19842500

  •  29-07-2022
  •  | 
  •  

Вопрос

В настоящее время я пишу программу, которая решит теорему Пифагора. Тем не менее, у меня есть ошибка в программе. Всякий раз, когда я вкладываю отрицательное число для длины A или B, он распечатывает «A не может быть меньше нуля», но все равно идет вперед и решает для C и распечатывает длину C, даже если пользователь еще не вводит B. Как я могу сделать так, чтобы, когда пользователь вводит отрицательное число, он распечатывает оператор «A не может быть меньше нуля», а затем снова переходит к вводу длины для стороны, вместо того, как сейчас там, где после печати утверждение, он перенаправляет до конца?

Вот мой код:

 import math
    print"This program will solve the pythagorean theorem for you"
    unit=raw_input('Enter the unit you will be using')
    a=float(raw_input('Enter the length of side a'))
    if a<=0:
      print"A cannot be less than zero"
    else:
        b=float(raw_input('Enter the length of side b'))
    if b<=0:
      print"B cannot be less than zero"
    else:
        c2=(a**2)+(b**2)
        c=math.sqrt(c2)
        c=str(c)
        print "The length of side C is: "+ c + " " + unit + "."
Это было полезно?

Решение 2

Ну, с самого начала, если вы хотите постоянно проверять свои входы, вам придется использовать цикл. Как и в Psuedocode для алгоритма должен быть:

Loop Begin
Check the value of a and b
If a or b is less than 0 then ask for input again
Otherwise, continue

Обратите внимание, что алгоритм имеет бежать как минимум однажды.

Это в основном то, как псевдокод должен выглядит как. Итак, это случай, когда вы можете использовать do-while конструкция петли. В Python нет ничего подобного, поэтому мы подражать Это:

import math


def take_in():
    a = raw_input("Enter the value of side a -> ")
    b = raw_input("Enter the value of side b -> ")

    # Trying to convert to a float
    try:
        a, b = float(a), float(b)
        # If successfully converted, then we return
        if a > 0 and b > 0:
            return a, b
    except ValueError:
        pass
    # If we cannot return, then we return false, with a nice comment

    print "Invalid input"
    return False


def main():
    # Calling the function at least once
    valid = take_in()

    # While we are not getting valid input, we keep calling the function
    while not valid:
        # Assigning the value to valid
        valid = take_in()

    # Breaking the return tuple into a and b
    a, b = valid
    print math.sqrt(a ** 2 + b ** 2)


if __name__ == '__main__':
    main()

Другие советы

Вы пропустили один уровень Indentatino. Попробуйте так:

if a<0:
  print"A cannot be less than zero"
else:
    b=raw_input('Enter the length of side b')
    b=float(b)
    if b<0:
        print"B cannot be less than zero"
    else:
        c2=(a**2)+(b**2)
        c=math.sqrt(c2)
        c=str(c)
        print "The length of side C is: "+ c + " " + unit + "."

Старайтесь не использовать вложенные if При разработке программного потока. Это приводит к такому ошибку (отсутствует один уровень отступа). Большие куски кода внутри if блоки и много вложенных if Блоки затрудняют следовать программе и рассуждать.

Вместо этого вы можете спросить еще раз, пока ввод не будет действителен:

a = -1
while a < 0:
    try:
        a=float(raw_input('Enter the length of side a'))
    except ValueError:
        pass
    if a<0:
        print "A cannot be less than zero"

Совет Фреда хорош, оберните его в функцию повторного использования:

def validate(initial, prompt, test, message, typecast=str):
    value = initial
    while not test(value):
        try:
            value = typecast(raw_input(prompt))
        except ValueError:
            print "Invalid value"
            continue

        if not test(value):
            print message
            continue

        return value

Затем используйте:

a = validate(
    initial = -1, 
    prompt = 'Enter the length of side A', 
    test = lambda x: x >= 0,
    message = "A cannot be less than zero",
    typecast = float
)
b = validate(
    initial = -1, 
    prompt = 'Enter the length of side B', 
    test = lambda x: x >= 0,
    message = "B cannot be less than zero",
    typecast = float,
)

Отказ от ответственности: я использую другую версию Python, чтобы пробег мог различаться

import math

a = 0
b = 0

def py_theorem(a, b):
    return(a**2 + b**2)


unit = raw_input('Enter the unit you will be using: ')

while a <= 0:
a = float(raw_input('Enter the length of side A: '))
if a <= 0:
    print('A cannot be less than 0.')

while b <= 0:
b = float(raw_input('Enter the length of side B: '))
if b <= 0:
    print('B cannot be less than 0.')

print('The length of the 3rd side C is %d %s') % (py_theorem(a,b), unit)

Теперь, если вы посмотрите на мой код A, b изначально 0, чтобы вы могли выполнить петли while (в противном случае вы получаете ошибку, интерпретатор не знает о A, B до этого момента). Затем он повторяет операторы, запрашивающие A, B соответственно, пока вы не получите допустимый ввод (действительный в общем смысле, мы не делаем проверку ошибок, что произойдет, если вы используете строку? Я бы определенно посмотрел в документы Python и посмотрел, что такое %D %S и т. Д. Затем мы передаем возврат метода (см. Def Py_theorem вверх) в строку вместе с устройством. Обратите внимание, что функция принимает два аргумента A, B соответственно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top