2017-02-02 5 views
0

私はプログラミングに慣れておらず、入力された数字が偶数か奇数かを判断する簡単なプログラムを作った。また、入力された数値が浮動小数点ではなく整数であるかどうかをチェックする関数を作成しました。なぜこのプログラムはメッセージを複数回出力しますか?

ユーザが数字を入力した場合、ほとんどの場合プログラムが正しく実行されますが、ユーザが複数の数字を最初に入力した場合は数字が奇数か偶数かを示すメッセージが複数回印刷されます。なぜそれが起こるのですか?

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

一部のfloat nでは 'n%2'とは何ですか?あなたのプログラムをデバッグするのを助けるために、 'print '{}は数字の' .format(x) 'を別の場所に置いてみてください。 –

+0

use str.isdigit – YOU

+0

Python 2を使用しているときに 'input'を' raw_input'に変更します。 'input'はPython 3を使用するときの正しい関数です。 – Evert

答えて

2

even_oddは、から(yの名前で)再び呼び出されます。だからあなたはその出力を何度も見るのです。

check_intの後にeven_oddを続けるために必要と思われると思います。これは必要ではありません。関数が終了すると、関数が呼び出された場所から自動的にプログラムが続行されます。

だけで、check_intからyパラメータを削除行y()を削除し、check_int(given_number)check_int(given_number, even_odd)を変更します。

2

問題は、あなたのプログラムをループする秘訣の再帰を使用していることです。浮動小数点を受け取ったら、check_intに電話してメッセージを印刷し、次にを入力機能に再発させます。これは、スタック上の最初の呼び出しに戻ります。最終的に整数を取得すると、check_intは正常ですが、floatのパリティを処理するためにまだ待機しているeven_oddに戻ります。それは出力の余分なラインを生成するものです。

非整数として何かを拒否した場合は、入力にループバックするか、後でパリティを確認しないでください。

整数を取得するまでループする場合は、別の外側ループとして記述します。

0

コードにはいくつかの問題があります。

まず、elifは必要ありません。 given_number % 2 !=0がfalseの場合、反対の条件は常にTrueになります。したがって、!= 0の反対は0です。

また、関数をコールバックとして渡さないでください。あなたが書いた方法は、あなたのプログラムをクラッシュさせる可能性があります。 loopsについてもっと読むことをお勧めします。

乾杯!

関連する問題