1

私がしなければならないのは、T個のテストケースを持っていることです。これは、各テストケースの「n」人の学生の平均を取得する回数であり、各テストケースの平均スコアと最高点を表示する必要があります。そのテストケースと学生の名前

これをコーディングする適切な方法を教えて、なぜそれがそのようでなければならないのかを説明できれば、私はそれを大いに感謝します!迷っています

私のコード:

t = int(input("enter number of cases: "))
def casing(t):
    for case in range (1, t+1):
        n = int(input("enter number of students: "))
        def studentmarks(n):
            total = 0
            student = "none"
            for computetotal in range(1,n+1):
                student = input("please enter student name: ")
                mark = int(input("please enter mark: ")) 
                total = total+ mark
                highestmark = mark
                if studentmark(n) > mark:
                    highestmark = mark
                    achieve = student
                    return highestmark, acheive
            return total, studentmark()[0], studentmark()[1]
        average = float((studentmarks(n)[0])/ n)
        print("average: ", average, "highest: ",studentmark(n)[1], "student: ", studentmark(n)[2])
4

2 に答える 2

1

関数宣言がなければ、そのままのコードを理解してデバッグするのがはるかに簡単になると思います。関数型プログラミング (関数オブジェクトの受け渡しなど) を行っていない限り、ネストされた関数を使用する正当な理由はほとんどありません。ここでは、関数を定義してから、すぐに関数を 1 回呼び出していますが、これはかなり無意味です。したがって、コードの簡略化されたバージョンは次のとおりです。

t = int(input("enter number of cases: "))
for _ in range (t):
    total = 0
    highest_mark = 0
    best_student = "none"

    n = int(input("enter number of students: "))

    for _ in range(n):
        student = input("please enter student name: ")
        mark = int(input("please enter mark: ")) 
        total = total+ mark
        if mark > highestmark:
            highestmark = mark
            beststudent = student

    average = total / n
    print("average: {}, highest: {}, student: {}"
          .format(average, highestmark beststudent))

studentmarkまた、コードが呼び出していたが定義されていなかった (「s」なし)という名前の関数も削除しました。それが何をしているのかを正しく解釈したかどうかはわかりませんが、そう思います。それは確かに以前は機能しなかったでしょう。

于 2012-10-09T01:59:08.850 に答える
1

これが機能しない理由はいくつかありますが、根本的な原因は、あなたの最高点が間違った場所から始まっていることだと思われます. 学生の名前とマークがタプルに含まれていることを後で期待しているように見えますが、これは良い考えですが、実際にはこのタプルをどこにも作成していません。したがって、それを作成して呼び出します。変数と変数highestの両方を置き換えます。代わりに(実際には有効な学生名である可能性があります!)として開始すると、ループの上にあります:studenthighestmarkNone"none"

total = 0
highest = None

「これは最高のものよりも高い」ロジックを次のように変更します。

if highest is None or mark > highest[1]:
    highest = (name, mark)

「まだ最高の生徒がいない場合、またはこの生徒が現在の最高生徒よりも点数が高い場合は、この生徒が最高です」と読みます。次に、戻り値を次のようにする必要があります。

return total, highest[0], highest[1]

ただし、(ユーザーがコンソールで入力できるほどの) 少量のデータしかないため、このロジックをかなり単純化できます。特定のテスト ケースのすべてのデータをタプルのリストに読み取り(student, mark)、Python のビルトインを使用して計算を行います。

def studentmarks(n):
    marks = []
    for _ in range(n):
       student = input("please enter student name: ")
       mark = int(input("please enter mark: ")) 
       marks.append(student, mark)
    return marks

# Calculations
marks = studentmarks(5)
print('Average: ', sum(result[1] for result in marks)/len(marks))
print('Highest: ', max(marks, key=lambda s: s[1])

次のようにシードします。

>>> marks
[('Fred', 4), ('Wilma', 10), ('Barney', 8), ('Wilma', 7), ('Pebbles', 6)]

平均 7.0、最大('Wilma', 10).

于 2012-10-09T02:00:26.340 に答える