Ты почти у цели.Основная проблема вашей программы в том, что ваши операторы if
независимы, тогда как утверждение о проблемах предполагает, что их не должно быть.Измените их для операторов elif
, что будет означать, что ваша ветвь Error
выполняется только тогда, когда c
вычисляется как целое число, которого нет в наборе {1, 2, 3, 4}
.
Проблема 1: программа имеет(возможно) плохой поток управления
В большинстве языков программирования оператор if
является базовой конструкцией, используемой для условного выполнения блока кода, если выражение истинно.В следующем Python-подобном псевдокоде код за блоком if
выполняется только в том случае, если значение, полученное вычислением EXPRESSION
, истинно:
if EXPRESSION:
# Do something only if EXPRESSION is true
# Execution continues here after the "if" block irrespective of
# whether EXPRESSION was true and the body of the "if" statement
# was executed.
Вы можете дополнить операторы if
с помощью else
ветви.В этом случае мы выполняем тело оператора if
, если EXPRESSION
оценивается как true, и выполняем другой ветвь ветви (ветвь else
), если условие не оценивается как true (по законуисключенное среднее, это ложно):
if EXPRESSION:
# As before, control is passed here if EXPRESSION is true.
else:
# If EXPRESSION was false, control is passed to this arm.
# After executing either the "if" arm or the "else" arm, control
# returns to the outer scope outside the "if" statement.
Более сложная конструкция использует конструкцию else-if , чтобы позволить nest операторам if.Например, предположим, что мы внедрили простой контроллер вызовов, который пытается связаться с кем-то по его стационарному телефону, вызывает его портативный телефон, если он недоступен, и отправляет электронное письмо в противном случае.Используя знания выше, мы могли бы написать:
if answers(fixed_telephone):
# Connect to the fixed telephone to communicate
else:
if answers(portable_telephone):
# Connect to the portable telephone to communicate
else:
# Not available on either telephone. Send an email.
Как вы можете себе представить, эта логика быстро усложняется, если есть много вложенных условий «если», что не является необычным в реальных сценариях.Большинство языков программирования предоставляют конструкцию, позволяющую выводить вложенные операторы «if» на верхний уровень.В Python это elif
, и код, эквивалентный приведенному выше:
if answers(fixed_telephone):
# ...
elif answers(portable_telephone):
# ...
else:
# ...
(комментарии для краткости).
В вашем коде, как написано в настоящий момент, каждый из вашихif
операторы будут выполняться независимо , за исключением последнего if c == 4
, который упадет до ветви else
, если c
не равно 4. Как вы хотите, чтобы тесты c
быть взаимоисключающими, т.е. вы не хотите, чтобы что-либо происходило, если передан более ранний случай, и вы хотите вывести ошибку только в том случае, если none случаев было выполнено, вы должны использовать вложенные операторы if
которые лучше всего реализованы с использованием вышеупомянутой языковой конструкции elif
.
Проблема 2: программа принимает правильно сформированные целые числа
Ваша программа также принимает значения, считанные из STDIN для a
b
и c
- правильные целые числа.Если вы введете значение, которое не может быть проанализировано как целое число, оно прервется при целочисленном преобразовании в вызове int(...)
и не достигнет вашей линии print('Error')
.Это пример того, как Python вызывает исключение , потому что обнаружена проблема, от которой интерпретатор не может самостоятельно восстановиться.Поток управления не начнет выполнять блоки if
, поэтому оператор print
никогда не будет выполнен.
Если вы хотите исправить эту проблему , вам нужно пойматьОшибка, возвращаемая методом int(...)
, когда он не может проанализировать предоставленное значение как целое число.Это значит научиться ловить исключения, о которых вы можете узнать больше в документации по Python .
(Подсказка: Python вызовет встроенное исключение типа ValueError
при вводеint
не может быть проанализирован, поэтому вам нужно обернуть вызовы, которые заполняют три переменные a
, b
и c
блоком try... catch
, который перехватывает такую ошибку:
try:
a = int(input())
catch ValueError:
# Implement logic to handle this error, which may include
# returning an error from your function, setting a default
# value, or taking some action. You can optionally take
# some action locally, such as print a log message, and then
# re-raise the exception so it propagates to this method's
# callers (using the "raise" keyword).