2013-11-07 3 views
0

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

Вот мой код:

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

Посмотрите, как вы объединяете утверждения; вдавливание важно – crownedzero

+0

Вот вам задуматься: вы можете поместить свой код ввода и проверки в функцию, называя его как для стороны a, так и для стороны b. –

+0

Я хотел бы показать вам способ использования опрятных функций. Надеюсь, вы можете это сделать :) –

ответ

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 

Пожалуйста, обратите внимание, что алгоритм имеет запустить по крайней мере один раз.

Это в основном, как psuedocode должен выглядеть как. Итак, это случай, когда вы можете использовать контур цикла 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() 
+1

Что такое: if __name__ == '__main__': main() do? – Domecraft

+0

@Domecraft Этот вопрос задавался несколько раз. Вот [хороший ответ] (http://stackoverflow.com/questions/419163/what-does-if-name-main-do). –

+0

@GamesBrainiac lol у нас была та же идея, что и ломать ее – crownedzero

3

Вы пропустили один 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 + "." 
2

Старайтесь избегать использования вложенных 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, 
) 
+0

Хотя это делает работу, это не помогает OP понять, что он сделал не так, и как избежать это в будущем, т. е. фактически не решает проблему, и не отвечает на вопрос ОП (строго говоря). Добавление дополнительной информации было бы очень полезно. – Matt

+0

@crownedzero исправил это для вас. Сделал это так, что он делает поплавок на одной линии плюс проверяет, меньше или равен нулю – Domecraft

+0

@mHurley: сделал ответ в ответ –

0

отказ от ответственности: Я использую другую версию 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 сначала изначально, так что вы можете выполнять циклы while (иначе вы получите ошибку, интерпретатор не знает о a, b до этой точки). Затем он повторяет утверждения, запрашивающие a, b соответственно, пока вы не получите действительный ввод (действительный в общем смысле, мы не проверяем ошибки, что произойдет, если вы используете строку ??>. <) Теперь печать немного фанки, Я определенно посмотрю в документы Python и посмотрю, что такое% d% s и т. Д. Затем мы передаем возврат метода (см. Def py_theorem вверху) к строке вместе с единицей. Заметим, что функция принимает два аргумента a, b соответственно.