0

目標: * 数値の合計が 179 を超えるまで、正の数値の入力を繰り返し要求する Python プログラムを作成します。ソリューションで少なくとも 3 つのモジュール/関数を使用します。* 入力した最大数は 42 を超えることはできません。 * 数の合計が 179 を超える場合は、入力した最大数と入力した最小数の合計を出力してください。

特に「input_numbers」モジュールについては、いくつかのガイダンスが必要です。これを行うには、数値ごとに変数を作成するよりも簡単な方法があるはずです。コードは完全ではありません。他の 2 つのモジュールはまだ開始していません。前もって感謝します。

def input_numbers():
    while True:
        num1 = raw_input("Enter a positive integer no greater than 42 ")
        if num1 <= 0:
            print "That is not a positive integer.  Try again "
        elif num1 > 42:
            print "The number cannot exceed 42.  Try again "

        num2 = raw_input("Enter another positive integer ")
            if num2 <= 0:
                print "That is not a positive integer.  Try again "
        elif num2 > 42:
            print "The number cannot exceed 42.  Try again " 

        num3 = raw_input("Enter another positive integer ")
        if num3 <= 0:
            print "That is not a positive integer.  Try again "
        elif num3 > 42:
            print "The number cannot exceed 42.  Try again "

        num4 = raw_input("Enter another positive integer ")
        if num4 <= 0:
            print "That is not a positive integer.  Try again "
        elif num4 > 42:
            print "The number cannot exceed 42.  Try again "

        num5 = raw_input("Enter another positive integer ")
        if num5 <= 0:
            print "That is not a positive integer.  Try again "
        elif num5 > 42:
            print "The number cannot exceed 42.  Try again "
        elif sum(num1, num2, num3, num4, num5) > 179:
            print_numbers()

add_numbers()

def add_numbers():
print_numbers()

def print_numbers():

input_numbers()
4

7 に答える 7

4

プログラムの各ステップをカプセル化することで、3 つの機能要件すべてを取り除くことができます。ループを関数内に置くのではなく、main にループを制御させ、関数呼び出しとの間でデータをやり取りすることでフローを制御します。

input_numbers()関数を少し作り直してみましょう。

def get_input_number():
    num = int(raw_input("Enter a positive integer no greater than 42 "))
    if num <= 0 or num > 42:
        print "Invalid input.  Try again "
        get_input_number()
    else: 
        return num

したがって、input_numbers にループと入力処理および検証を制御させる代わりに、その名前が示すとおりに実行させます。つまり、入力を要求し、検証し、問題がなければ呼び出し元に値を返します。 、しかし、それが悪い場合は、メッセージを書き込み、ユーザーが適切な入力を入力できるように自分自身を再度呼び出します。

次に設定する機能は、要件のリストからそのままです。ユーザーが入力するすべての数字から、最大のものを見つける必要があります。言語だけから、一連の数字を調べていると判断できるため、リストを分割するのに適した場所です。すべてのユーザー入力をリストに格納すると仮定すると、そのリストを関数に渡して操作を実行できます。

def get_greatest_number(input_list):
    highest = input_list[0]
    for i in input_list:
        if i > highest:
            highest = i
    return highest

リストの最初の要素を変数に設定し、highestリスト内の他のすべての要素をその初期値に対してチェックします。highestより大きな要素が見つかった場合は、より大きな要素に変数を再割り当てします。リスト内の各要素に対してこれを行うと、highest 内の数値がまさに最高の数値になるので、それをメイン プログラムに返します。

同様に、最小のものを見つけるために同じことができます。

def get_smallest_number(input_list):
    smallest = input_list[0]
    for i in input_list:
        if i < smallest:
            smallest = i
    return smallest

最後に、メインループに到達します。ここでは、空のリストを宣言して、number_listすべての数値を格納します。そして、その合計をループ条件として使用します。

if __name__ == '__main__':
    number_list = []
    while sum(number_list) < 179:
        number_list.append(get_input_number())

ループの本体で、get_input_number() を呼び出し、その結果を作成したリストに追加します。リスト内の数値の合計が 179 を超えると、while ループが終了し、最終的にユーザーに結果を表示できます。

    print 
    print '-------------------------'
    print 'total of numbers entered: %d' % sum(number_list)
    print 'greatest number entered: %d' % get_greatest_number(number_list)
    print 'smallest number entered: %d' % get_smallest_number(number_list)

ここでget_greatest_numberget_smallest_numberを作成し、それらに引数として数値のリストを渡します。リストをループしてから、適切な値を print ステートメントに返します。

于 2012-09-23T23:39:30.133 に答える
2

はい、もちろん、数値ごとに変数を作成するよりも良い方法があります。それらをリストに格納します。それらをリストに格納すると、それらの合計と最高値と最低値を簡単に見つけることができます (これには組み込み関数があります)。

さらなるヒントとして、2 つのループを使用し、1 つをもう 1 つ内側に使用することをお勧めします。外側のループでは、合計が 179 を超えるまで、ユーザーは数字を入力し続けます。内側のループでは、 1 から 42 までの範囲になるまで、ユーザーは1 つの数字を入力し続けます。

于 2012-09-23T22:52:29.103 に答える
1
def get_int(prompt=''):
    while True:
        try:
            return int(raw_input(prompt))
        except ValueError:
            pass

def get_values():
    values = []
    total  = 0
    while total <= 179:
        val = get_int('Enter a positive integer <= 42: ')
        if 0 <= val <= 42:
            values.append(val)
            total += val
    return values

def print_info(values):
    print 'Sum is {}'.format(sum(values))
    print 'Largest value is {}'.format(max(values))
    print 'Smallest value is {}'.format(min(values))

def main():
    values = get_values()
    print_info(values)

if __name__=="__main__":
    main()
于 2012-09-23T23:36:17.427 に答える
0

答えてくれたみんなに感謝します。私は次のコードを書きましたが、最後のモジュールを除いてほぼ完全に機能します。最初の実行後に(0を押して)プログラムを終了すると、プログラムは終了しますが、2回目に実行した場合、0を押しても終了しません。プログラムの最初に戻ります。どうしてか分かりません。

注:割り当てには、コードに組み込む必要のあるさまざまな要件があります。したがって、不要なモジュール、グローバル変数、およびコメント。

maxNum = 42  # declares global variable maxNum
target = 179  # declares global variable target

def user_input():  # prompts user to input a number 42 or less until all add up to 179
    x = 0
    nums = []    
    while sum(nums) <= target:
        nums.append(int(raw_input("Enter a number: ")))
        if int(nums[x]) > int(maxNum):
            print "Number cannot exceed 42."
            user_input()
        else:
            x += 1
    print_nums(nums,x)

def print_nums(nums,x):  # prints the sum of the numbers, the smallest, and the largest 
    print "Sum of all numbers is", sum(nums)
    nums.sort()
    x -= 1
    print "Largest number entered is", nums[x]
    print "Smallest number entered is", nums[0]
    decide()

def decide():  # allows user to continue the program or exit 
    exit = raw_input("<9 to enter a new set of number.  0 to exit.> ")
    while True:
        if int(exit) == 0:
            return
        elif int(exit) == 9:
            user_input()

user_input()
于 2012-09-25T09:34:54.070 に答える
0

ループ内で数を繰り返しポーリングし、入力をリストに追加できます。

def input_numbers():
    user_inputs = []  # a list of all user's inputs
    while True:
        num = raw_input("Enter a positive integer no greater than 42 ")
        try:
            num = int(num)  # convert input string to integer
            if num <= 0:
                print "That is not a positive integer.  Try again "
            elif num > 42:
                print "The number cannot exceed 42.  Try again "
            user_inputs.append(num)
        except ValueError:  # conversion to integer may fail (e.g. int('string') ?)
            print 'Not a Number:', num

        if some_condition_regarding(user_inputs):
            break  # eventually break out of infinite while loop
于 2012-09-23T22:56:55.050 に答える
0

ここにいくつかのよく知られたトリックがあります:

    def min_and_max(your_num_list)
        min=your_num_list[0]
        max=your_num_list[0]
        for num in your_num_list:
            if num < min:
                min=num
            if max > num
                max=num
        return min,max
于 2012-09-23T22:57:23.547 に答える
0

スタンドアロンの Python プログラムを作成する場合は、メイン関数を使用することをお勧めします。いくつかの単体テストを簡単に追加したり、他のモジュールから関数やクラスを使用したり (インポートした場合) などを行うことができます。

また、他の人がすでに言ったように、ユーザーが有効な数値を入力するたびに (数値の合計が 179 を超えるまで) リストを作成し、それに新しい要素を追加することをお勧めします。ユーザーが間違った値を入力した場合は、リストに何も追加せずに次の反復にスキップします (そのため、ユーザーは数値を再度入力するよう求められます)。

したがって、基本的には次のようになります。

def validate_entered_number(num):
    """
    Checks if the number is positive and is less or equal to 42.
    Returns True if the number matches these conditions,
    otherwise it returns False.
    """
    if num < 0:
        print "That is not a positive integer."
        return False

    if num > 42:
        print "The number cannot exceed 42."
        return False

    return True

def main():
    entered_numbers = []

    while True:
        try:
            num = int(raw_input("Enter a positive integer less or equal to 42: "))
        except ValueError:
            print "You should enter a number"
            continue
        if validate_entered_number(num):
            entered_numbers.append(num)
            if sum(entered_numbers) > 179:
                print "The sum of the numbers is %s" % sum(entered_numbers)
                print "The smallest number entered is %s" % min(entered_numbers)
                print "The largest number entered is %s" % max(entered_numbers)
                return

if __name__ == "__main__":
    main()

実際、数値の合計、最小の数値、最大の数値を 3 つの変数に保存し、反復ごとにこれらの変数を更新する (合計に現在の数値を追加し、それを現在知られている最小数と最大数を調べ、必要に応じて対応する変数を更新します)。ただし、この場合、保持できる最大のリストは 180 要素のみです (すべての数値が 1 で、ユーザーが 0 を入力しないか、プログラムを変更した場合)。 0 の入力を拒否します)。これは、Python のリストの要素の数が非常に少ないためです。ただし、非常に大量の数値を処理する必要がある場合は、このようなソリューションに切り替えることをお勧めします.

于 2012-09-23T23:05:48.963 に答える