2017-02-02 2 views
0

Я новичок в программировании и сделал простую программу, чтобы определить, был ли введенный пользователем номер четным или нечетным. Я также создал функцию, которая проверяет, является ли введенное число целым, а не float.Почему эта программа печатает сообщение более одного раза?

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

def check_int(x,y): 
    if x != int(x): 
     print "The number is not an integer" 
     y() 
    else: 
     print "The number is an integer" 

def even_odd(): 
    given_number = input("Please type an integer: ") 
    check_int(given_number, even_odd) 
    if (given_number % 2) != 0: 
     print "The number is odd" 
    elif (given_number % 2) == 0: 
     print "The number is even" 

even_odd() 
+0

Что такое 'n% 2' для некоторого плавающего n? Чтобы отладить вашу программу, попробуйте 'print '{} - это число'.формат (x)' в разных местах. –

+0

use str.isdigit – YOU

+0

Изменить 'input' на' raw_input', когда вы используете Python 2. 'input' является правильной функцией при использовании Python 3. – Evert

ответ

2

even_odd еще раз (check_int) (под названием y). Вот почему вы видите его вывод несколько раз.

Я полагаю, вы считаете, что это необходимо для продолжения с even_odd после того, как check_int закончен. Это необязательно. Когда функция завершена, программа автоматически продолжается с того места, где была вызвана функция.

Просто удалите параметр y из check_int, удалить строку y() и изменить check_int(given_number, even_odd) к check_int(given_number).

2

Проблема в том, что вы использовали тайную версию рекурсии для прокрутки вашей программы. Когда вы получаете поплавок, вы вызываете check_int, распечатайте сообщение, а затем повторите входную функцию. Это оставляет висящий возврат к вашему первому вызову в стеке. Когда вы, наконец, получите целое число, вы обычно оставляете check_int, но затем возвращайтесь к even_odd, который все еще ожидает обработки четности поплавков. Вот что создает дополнительные линии вывода.

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

def check_int(x,y): 
    return x != int(x) 

def even_odd(): 
    given_number = input("Please type an integer: ") 
    if check_int(given_number, even_odd): 
     print "The number is not an integer" 
    else: 
     print "The number is an integer" 
     # Check parity 
     if (given_number % 2) != 0: 
      print "The number is odd" 
     elif (given_number % 2) == 0: 
      print "The number is even" 

even_odd() 

Если вы хотите зацикливать до тех пор, пока не получите целое число, напишите это как отдельный внешний цикл.

0

В коде есть пара проблем.

Прежде всего, вам не нужен elif. Если given_number % 2 !=0 является ложным, то противоположное условие всегда будет True. Таким образом, противоположность != 0 составляет 0.

Также не передавайте функцию в качестве обратного вызова. То, как вы его написали, может привести к сбою вашей программы. Я предлагаю вам узнать больше о loops.

ура!

Смежные вопросы