@egeriev

Почему выдается ошибка в данном коде?

Напишите простой калькулятор, который считывает с пользовательского ввода три строки: первое число, второе число и операцию, после чего применяет операцию к введённым числам ("первое число" "операция" "второе число") и выводит результат на экран.

Поддерживаемые операции: +, -, /, *, mod, pow, div, где
mod — это взятие остатка от деления,
pow — возведение в степень,
div — целочисленное деление.

Если выполняется деление и второе число равно 0, необходимо выводить строку "Деление на 0!".

Обратите внимание, что на вход программе приходят вещественные числа.

a = float(input())
b = float(input())
c = str(input())
if (c == '+'):
    print (a + b)
if (c=='-'):
    print (a - b)
if ( c=='*'):
    print(a*b)
if (c=='pow'):
    print(a**b) 
if (b==0.0) and (c=='mod') and (c=='/') and (c=='div'):
    print('Деление на 0!')      
elif (c=='/'):
    print (a/b)
elif (c=='mod'):
    print (a%b)      
elif (c=='div'):
    print ( a//b)


Выдает вот такую ошибку: F
ailed test #1. Runtime error:
Traceback (most recent call last):
  File "jailed_code", line 17, in <module>
    print (a%b)      
ZeroDivisionError: float modulo

Как это исправить?
  • Вопрос задан
  • 9883 просмотра
Пригласить эксперта
Ответы на вопрос 3
Astrohas
@Astrohas
Python/Django Developer
Замените условие на
if not b and ( c=='mod' or c=='/' or c=='div'):
    print("Делеение на ноль")

или лучше на
if not b and c in ['/','%', 'mod', 'div']:
    print("Делеение на ноль")


а так пара других вариантов

a = float(input())
b = float(input())
c = input()
z_div = 'Деление на ноль!"
OPERATORS = {
    "+": a + b,
    "-": a - b,
    "*": a * b,
    "/": a / b if b else z_div,
    "mod": a % b if b else z_div,
    "div": a // b if b else z_div,
    "pow": a ** b 
}
print(OPERATORS[c])

более понятный вариант, но придется вычислять все варианты.
Более python way :
a = float(input())
b = float(input())
c = input()
z_div = 'Деление на ноль!'
OPERATORS = {
    "+": lambda x, y: x + y,
    "-": lambda x, y: x - y,
    "*": lambda x, y: x * y,
    "/": lambda x, y: x / y if y else None,
    "mod": lambda x, y: x % y if y else None,
    "div": lambda x, y: x // y if y else None,
    "pow": lambda x, y: x ** y 
}
print(OPERATORS[c](a, b))

АНАЛог с eval :
a =  input()
b =  input()
c = input()

OPERATORS = {
    "+": "+",
    "-": "-",
    "*": "*",
    "/": "/",
    "mod": "%",
    "div": "//",
    "pow": "**"
}

if not float(b) and c in ['/','%', 'mod', 'div']:
    print('Деление на ноль!')
else:
    print(
        eval(
            a + OPERATORS[c] + b
        )
    )
Ответ написан
@IScream17
конкретно в вашем коде неверно условие проверки деления на 0:

if (b==0.0) and ((c=='mod') or (c=='/') or (c=='div')):

проверяем является ли второй операнд нулём, и является ли функция при этом ОДНОЙ ИЗ функций деления (а не всеми сразу).

З.Ы. привет всем, кто попал сюда со степика)))
Ответ написан
@whitest
Развивающийся сисадмин
Оставлю здесь инфу для таких же страдальцев, как я:

1) В этом задании не надо определять все эти mod, div, pow как переменные, в которых уже производится вычисление через другие переменные

Вот так НЕ НАДО:
mod = (a) % (b)
pow = (a) ** (b)
div = (a) // (b)


2) Всё задание лучше делать через один толстый if...elif...else

3) Не надо назначать обработку b == 0 в самом начале скрипта, т.к. операции типа 5 + 0 полностью корректны и нельзя их таким образом отрезать.

4) Обработку деления на ноль проще всего делать последовательно, через те же eilf:
elif (b == 0) and f == 'div':
    print('Деление на 0!')
elif f == 'div':
    print(a // b)


5) Решение через OPERATORS работает, но! Если ты не в курсе, как самостоятельно это написать из головы, не пользуйся. Потом хуже будет.

a = float(input())
b = float(input())
c = input()
z_div = 'Деление на ноль!'
OPERATORS = {
    "+": a + b,
    "-": a - b,
    "*": a * b,
    "/": a / b if b else z_div,
    "mod": a % b if b else z_div,
    "div": a // b if b else z_div,
    "pow": a ** b
}
print(OPERATORS[c])
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы