Python Calculator Делить на ноль / площадь отриц. Int. сбой программы - PullRequest
3 голосов
/ 13 июля 2011

Хорошо, я делаю это для проекта, и всякий раз, когда я пытаюсь получить его, делю на ноль или квадратный корень отрицательное число, которое программа закрывает. Я попытался найти что-то, что я мог бы вставить в код, чтобы он отобразил сообщение, а затем снова запросить значение, но все, что я пытался вставить, приводит к немедленному закрытию программы при запуске.

Вот калькулятор, в котором ничего не вставлено, чтобы исправить сбои.

import math

def convertString(str):
    try:
        returnValue = int(str)
    except ValueError:
        returnValue = float(str)
    return returnValue

def addition(a, B):
    return convertString(a) + convertString(B)

def subtraction(a, B):
    return convertString(a) - convertString(B)

def multiplication(a, B):
    return convertString(a) * convertString(B)

def division(a, B):
    return convertString(a) / convertString(B)

def sqrt(a):
    return math.sqrt(convertString(a))

keepProgramRunning = True

print "Welcome to [Removed]'s 2011 4-H Project! This is a simple calculator coded in  Python, which is a high-level programming language. Java, C, C++, and Perl are  other high-level programming languages that you may have heard of."

while keepProgramRunning:
    print ""
    print "Please choose what you would like to do:"
    print ""
    print "1) Addition"
    print "2) Subtraction"
    print "3) Multiplication"
    print "4) Division"
    print "5) Square Root"
    print "6) Quit Program"

    choice = raw_input()    

    if choice == "1":
        numberA = raw_input("Enter your first addend: ")
        numberB = raw_input("Enter your second addend: ")
        print "The sum of those numbers is:"
        print addition(numberA, numberB)
    elif choice == "2":
        numberA = raw_input("Enter your first term: ")
        numberB = raw_input("Enter your second term: ")
        print "The difference of those numbers is:"
        print subtraction(numberA, numberB)
    elif choice == "3":
        numberA = raw_input("Enter your first factor: ")
        numberB = raw_input("Enter your second factor: ")
        print "The product of those numbers is:"
        print multiplication(numberA, numberB)
    elif choice == "4":
        numberA = raw_input("Enter your dividend: ")
        numberB = raw_input("Enter your divisor: ")
        print "The quotient of those numbers is:"
        print division(numberA, numberB)
    elif choice == "5":
        numberA = raw_input("Enter the number you wish to find the square root of: ")
        print "Your result is:"
        print sqrt(numberA)
    elif choice == "6":
        print "Goodbye! Thank you for your time spent both judging my project and those of everyone else! Have a nice day! (。◕‿◕。)"
        keepProgramRunning = False
    else:
        print "Please choose a valid option."
        print "\n"

Я не совсем уверен, что вставлять и где решать сбои, но я думаю, что проблема заключается в моем размещении.

Я пытался вставить что-то вроде этого:

except ValueError:
            print "You cannot divide by zero. Please choose another divisor."
            numberB = raw_input("Enter your divisor: ")

Будет ли это работать? Куда я вставлю это? Если это не сработает, что будет и куда пойдет?

Я пытался поставить его после

numberB = raw_input("Enter your divisor: ")

Так что этот раздел будет читать

elif choice == "4":
    numberA = raw_input("Enter your dividend: ")
    numberB = raw_input("Enter your divisor: ")
        except ValueError:
            print "You cannot divide by zero. Please choose another divisor."
            numberB = raw_input("Enter your divisor: ")
    print "The quotient of those numbers is:"
    print division(numberA, numberB)

Но, как я уже сказал, программа закроется, как только откроется, когда я попробую это сделать. Кроме того, я знаю, что если они снова введут 0, программа потерпит крах. Есть ли способ заставить его вернуться на линию, под которой он находится?

Кроме того, для закрытия программы сообщение, которое она должна отображать, не может быть прочитано, поскольку программа закрывается сразу после ее отображения или команды выполняются одновременно. В любом случае, сообщение не может быть прочитано. Есть ли способ заставить сообщение появиться в отдельном диалоговом окне, которое приведет к закрытию программы при закрытии окна? Или хотя бы способ задержать его перед закрытием?

Пожалуйста, поправьте меня, если я неправильно понял терминологию. Я все еще немного новичок в этом.

И, как всегда, (конструктивная) обратная связь для любой части программы всегда приветствуется.

Ответы [ 5 ]

3 голосов
/ 13 июля 2011

Проблема в том, что вы пытаетесь поймать исключение перед его выбросом. Вместо этого попробуйте это:

elif choice == "4":
    numberA = raw_input("Enter your dividend: ")
    numberB = raw_input("Enter your divisor: ")
    while float(numberB) == 0:
        print "You cannot divide by zero. Please choose another divisor."
        numberB = raw_input("Enter your divisor: ")
    print "The quotient of those numbers is:"
    print division(numberA, numberB)
2 голосов
/ 13 июля 2011

Вот ваш ответ без обработки исключений.По сути, вы просто делаете этот сомнительный ввод в начале бесконечного цикла, но обрываетесь, когда обнаруживаете, что все входные данные хороши.

Для вашего квадратного корня:

elif choice == "5":
    while True:
        numberA = raw_input("Enter the number you wish to find the square root of: ")
        if float(numberA) >= 0:
            break
        print "Cannot take the square root of a negative number."
    print "Your result is:", sqrt(numberA)

и дляделение:

elif choice == "4":
    numberA = raw_input("Enter your dividend: ")
    while True:
        numberB = raw_input("Enter your divisor: ")
        if numberB != "0":
            break
        print "You cannot divide by zero. Please choose another divisor."
    print "The quotient of those numbers is:", division(numberA, numberB)

И чтобы ваша программа зависла до закрытия:

elif choice == "6":
    print "Goodbye! Thank you for your time spent both judging my project and those of everyone else! Have a nice day! (。◕‿◕。)"
    raw_input('')
    keepProgramRunning = False

Приветствия!

1 голос
/ 13 июля 2011

Вы должны использовать исключения, как вы уже делаете в convertString.

try:
    result = division(numberA, numberB)
    print "The quotient of those numbers is:"
    print result
except ZeroDivisionError:
    print "You cannot divide by zero. Please choose another divisor."
0 голосов
/ 13 июля 2011

Это не отвечает на ваш вопрос по кодированию, но я думаю, что стоит прокомментировать.

sqrt : квадратный корень из отрицательного числа является мнимым числом. Python поддерживает комплексные числа с complex(real_part, imaginary_part).

так что ваш расчет sqrt может быть записан как:

elif choice == "5":
    numberA = raw_input("Enter the number you wish to find the square root of: ")
    numberA = float(numberA)
    if numberA < 0:
        sqrt_numberA = complex(0, sqrt(abs(numberA)))
    else:
        sqrt_numberA = sqrt(numberA)

    print "Your result is:", sqrt_numberA

деление : деление на 0 бесконечно. Python обозначает бесконечность с помощью «inf». Фактически, он возвращает 'inf' с числами, превышающими 1E309:

>>> 1E309
inf

и деление двух из этих чисел дает 'nan'

>>> 1E309/1E309
nan

чтобы вы могли написать:

elif choice == "4":
    numberA = raw_input("Enter your dividend: ")
    numberB = raw_input("Enter your divisor: ")
    try: 
        div = division(numberA, numberB)
    except ZeroDivisionError:
        div = 'inf'

    print "The quotient of those numbers is:", div

этот код должен быть дополнительно расширен до return -inf, когда число A отрицательно, и учитывать такие ситуации, как 0/0

0 голосов
/ 13 июля 2011

Ваш формат оператора try:...except: неверный.Попробуйте это:

elif choice == "4":
    numberA = raw_input("Enter your dividend: ")
    numberB = raw_input("Enter your divisor: ")
    print "The quotient of those numbers is:"
    try:
        print division(numberA, numberB)
    except ZeroDivisionError:
        print "You cannot divide by zero. Please choose another divisor."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...