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

我认为如果没有函数声明,代码会更容易理解和调试。除非您正在执行函数式编程(例如传递函数对象),否则很少有充分的理由使用嵌套函数。在这里,您定义了函数,然后立即调用它们一次,这是毫无意义的。因此,这是您的代码的简化版本:

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- 它同时替换了studenthighestmark变量。开始它None而不是"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 回答