7-2 输出成绩信息

7-2 输出成绩信息

分数 8
作者 殷伟凤
单位 浙江传媒学院
输入学生的学号、姓名、性别、三门课程成绩,以“#”结束,其中学号、姓名和性别为字符串,成绩可以是整数或浮点数。

按学号顺序输出学生的学号、姓名、性别和平均成绩,以空格隔开。

并依次列出每门课程的平均成绩、最高成绩、最低成绩、不及格人数。

若只输入“#”,则输出“没有学生信息!”

提示:其中平均成绩保留两位小数,如成绩为x,则以int(x*100)/100的形式输出

输入格式:

每一行输入一个学生的学号、姓名、性别和三门课程成绩,最后一行输入“#”

输出格式:

按学号顺序输出学生的学号、姓名、性别和平均成绩,以空格隔开。一行表示一个学生

然后输出一个空行

输出每门课程的平均成绩、最高成绩、最低成绩、不及格人数。一行表示一门课程

输入样例:

在这里给出一组输入。例如:

abc10 ccc 男 100 50 90
aaca01 aaa 女 90 90 90
bcd1002 bbb 男 80 86 89
1004 ddd 女 59 45 98
#

输出样例:

在这里给出相应的输出。例如:

1004 ddd 女 67.33
aaca01 aaa 女 90.0
abc10 ccc 男 80.0
bcd1002 bbb 男 85.0

82.25 100 59 1
67.75 90 45 2
91.75 98 89 0

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

解题思路

输入
首先接收数据的时候需要注意,成绩可能是小数也可能是整数,那么我们需要对精度做一个处理,最好是用eval这个函数来接收,这样能确保精度不丢失,同时,输出的时候不需要进行转换。另外需要判断没有输入的情况,此时输出“没有学生信息!”。

统计成绩
题目中有两种平均成绩,一个是每一个人的平均成绩(三科之和),还有一个是科目的平均成绩。
我们需要统计的全部信息为:

  1. 学生的学号
  2. 姓名
  3. 性别
  4. 平均成绩
  5. 每门课程的平均成绩
  6. 最高成绩
  7. 最低成绩
  8. 不及格人数

存储结构设计
可见,我们需要统计的内容较多,这里我们分上半部分和下半部分统计,前四项用一个容器list类型即可,后四项使用字典类型,这里举例如下结构:

上半部分的存储结构设计
top = ['202062476' '黄宏哲', ['男',100,99,95]]

#下半部分存储结构设计
#第一门科目代表字典的键 `1`
#第一个值为list类型,里面嵌套一个list和另外一个元素,其中前台的list有四个元素即为科目所有成绩,另外那个元素为不及格人数。
bottom = {1:[[100,90,80,50],1],2:[100,90,80,70],0,3:[100,90,80,70],0}

代码实现

import sys


def get_unqualified(l: list) -> int:
    count = 0
    for i in l:
        if i < 60:
            count += 1
    return count


class Student:
    def __init__(self):
        self.items = {}
        self.print_top = []
        self.print_bottom = []
        self.man = 0

        # 初始化
        for _ in range(1, 4):
            self.items[_] = [[], 0]

    def __str__(self):
        self.input()
        self.count()
        self.print_top.sort()
        message = ["\n".join(self.print_top), '', "\n".join(self.print_bottom)]
        return "\n".join(message)

    def count(self):

        for i in self.items:
            ave = sum(self.items[i][0]) / self.man
            unqualified = get_unqualified(self.items[i][0])
            min_ = min(self.items[i][0])
            max_ = max(self.items[i][0])
            bottom = f'{int(ave * 100) / 100} {max_} {min_} {unqualified}'
            self.print_bottom.append(bottom)

    def input(self):

        while 1:
            line = input()
            if line == '#':
                break
            else:
                self.man += 1
                student_id = line.split()[0]
                name = line.split()[1]
                sex = line.split()[2]
                course1 = eval(line.split()[3])
                course2 = eval(line.split()[4])
                course3 = eval(line.split()[5])
                p_course = course1 + course2 + course3
                p_ave_ = p_course / 3
                p_ave = "{}".format(int(p_ave_ * 100) / 100)
                self.print_top.append(" ".join([student_id, name, sex, p_ave]))
                self.items[1][0].append(course1)
                self.items[2][0].append(course2)
                self.items[3][0].append(course3)
        # 判断没有输入的情况
        if self.man == 0:
            print('没有学生信息!')
            sys.exit(0)


print(Student())

posted @ 2022-11-23 10:35  蠢蛋快跑  阅读(592)  评论(0)    收藏  举报