UVA12412 A Typical Homework (a.k.a 师兄帮帮忙)

题目描述

*嗨,我是一名外语学院的本科生。你知道的,C 语言编程是我们大学的必修课,即使专业与计算机科学相去甚远。我一点也不喜欢这门课,因为我不擅长计算机,我甚至不想尝试写任何程序!!但我必须做作业才能及格 :( 嘘……你能帮帮我吗?请保密!!我知道你不会对一个可怜的小女孩说不的!:)* > 译者注:在这个问题中,你可以不用 C 语言完成。 ### 任务 Task 编写一个学生成绩管理系统(Student Performance Management System,SPMS)。 ### 概念 Concepts 在 SPMS 中,最多有 $100$ 名学生,每个学生都有 SID,CID,名字,四科成绩(语文 Chinese,数学 Mathematics,英语 English 和编程 Programming),总分,平均分和排名。数据含义与格式如下: - SID(学生 ID,Student ID)是一个十位十进制数字。每个学生唯一。 - CID(班级 ID,Class ID)是一个不超过 $20$ 的正整数。 - 名称是一个包含不超过 $10$ 个字母和数字的字符串且以字母开头(这样不会和 SID 产生歧义)。不同于国外的姓名格式,这个名称中不含有空格字符,只含有字母和数字。可能重名。 - 每科成绩都是一个不超过 $100$ 的正整数。 - 总分和平均分由系统自动计算,无需输入。总分为四科成绩之和,平均分为总分除以 $4$。 - 排名由系统自动生成,无需输入。一个学生的排名定义为总分比 Ta 高的学生数量再加 $1$。如,如果有四个学生总分分别为 $400,350,300,350$,则他们的排名分别为 $1,2,4,2$。 ### 主菜单 Main Menu 当你进入 SPMS 的时候,主菜单显示如下: ```plaintext Welcome to Student Performance Management System (SPMS). 1 - Add 2 - Remove 3 - Query 4 - Show ranking 5 - Show Statistics 0 - Exit ``` > 译者注: > > ```plaintext > 欢迎进入学生成绩管理系统(SPMS)。 > > 1 - 添加学生 > 2 - 删除学生 > 3 - 查询学生 > 4 - 显示排名 > 5 - 统计数据 > 0 - 退出系统 > ``` 结尾有两个换行符。 ### 添加学生 Adding a Student 当你在主菜单中选择 $1$ 的时候,会进入添加学生的模式。接着,如下操作将会一直执行,直到输入单个字符 $0$: 1. 输出 `Please enter the SID, CID, name and four scores. Enter 0 to finish.`。结尾有单个换行符。 > 译者注:请输入 SID,CID,名称和四科成绩。输入 $0$ 以结束。 3. 等待用户输入 SID,CID,姓名和四科成绩,以单个空格隔开。除了可能只输入单个字符 $0$,输入均一定有效,即输入数据均符合“概念”一节中的规定。唯一的例外是 SID 可能重复。 4. 如果 SID 重复,则输出 `Duplicated SID.`,末尾有单个换行符,并忽略此条消息。 5. 否则如果无重复,则在数据库中添加这个学生。 在用户输入单个字符 $0$ 之后,请返回主菜单(并且需要再次输出主菜单,下同)。 ### 删除学生 Removing a Student 如果你在主菜单中选择 $2$,则会进入此模式。如下操作会一直执行,直到输入单个字符 $0$: 1. 输出 `Please enter SID or name. Enter 0 to finish.`,末尾有单个换行符。 > 译者注:请输入 SID 或名称。输入 $0$ 以结束。 2. 接着输入 SID 或学生名字。除了可能只输入单个字符 $0$,输入均一定有效。 3. 删除所有匹配条件的学生,并输出 `x student(s) removed.`,末尾有单个换行符。其中 $x$ 是删除的学生数量(可能为 $0$)。如,删除了一个学生则输出 `1 student(s) removed.`,两个则输出 `2 student(s) removed.`,如果没有满足条件的学生则输出 `0 student(s) removed.`。 > 译者注:删除了 $x$ 个学生。 结束时返回主菜单。 ### 查询学生 Querying Students 进入此模式当且仅当在主菜单中选择 $3$。如下操作会一直执行直到输入单个字符 $0$: 1. 输出 `Please enter SID or name. Enter 0 to finish.`,末尾有单个换行符。 > 译者注:请输入 SID 或名称,输入 $0$ 结束。 2. 输入 SID 或学生名字。除了可能只输入单个字符 $0$,输入均一定有效。 3. 按加入数据库的时间顺序(从早到晚)每行一个输出学生的信息。顺序为排名、SID、CID、姓名、四科成绩、总分、平均分。用单个空格隔开。平均分保留两位小数。 结束时返回主菜单。 ### “显示排名”Showing the Ranklist 在主菜单中选择 $4$ 以进入此模式。程序将会输出 `Showing the ranklist hurts students' self-esteem. Don't do that.`(结尾有单个换行符)并回到主菜单。 > 译者注:显示排名会伤害学生的自尊心。不要这么干。 > > 这就是为什么标题加了双引号。 ### 输出统计数据 Showing Statistics 在住菜单中输入 $5$ 会进入此模式。 程序首先输出这样一句话:`Please enter class ID, 0 for the whole statistics.`,结尾有单个换行符。 > 译者注:输出班级 ID,特别地,如果输入 $0$ 则代表整个 SPMS 中的统计数据。 然后输出班级或者整个系统中的统计数据。格式如下: ```plaintext Chinese Average Score: x.xx Number of passed students: x Number of failed students: x Mathematics Average Score: x.xx Number of passed students: x Number of failed students: x English Average Score: x.xx Number of passed students: x Number of failed students: x Programming Average Score: x.xx Number of passed students: x Number of failed students: x Overall: Number of students who passed all subjects: x Number of students who passed 3 or more subjects: x Number of students who passed 2 or more subjects: x Number of students who passed 1 or more subjects: x Number of students who failed all subjects: x ``` > 译者注: > > ```plaintext > 语文 > 平均分: x.xx > 及格人数: x > 不及格人数: x > > 数学 > 平均分: x.xx > 及格人数: x > 不及格人数: x > > 英语 > 平均分: x.xx > 及格人数: x > 不及格人数: x > > 编程 > 平均分: x.xx > 及格人数: x > 不及格人数: x > > 全科: > 四科全部及格人数: x > 及格三科及以上人数: x > 及格两科及以上人数: x > 及格一科及以上人数: x > 四科全部不及格人数: x > ``` 注意小数必须保留两位小数。末尾有两个换行符。 及格(passed)定义为成绩不低于 $60$。 最后返回主菜单。 ### 退出 SPMS Exiting SPMS 在主菜单中选择 $0$,则程序会终止。 再次注意,在整个程序中,学科成绩和总成绩应当输出为整数,但平均成绩应当为小数点后保留两位的小数。

输入格式

从标准输入输出进行输入。输入仅有一组测试数据,结尾有一行一个单独的 $0$,且这个 $0$ 的输入是在主菜单状态下的。整个输入文件均有效,输入文件大小不超过 $10\mathrm{KB}$。

输出格式

从标准输入输出进行输出。输出在整个过程中 SPMS 输出的全部内容。你应当可以在你的机器上,用键盘和你的程序进行交互,尽管当输入输出分开的时候,这会显得像个笨蛋。

说明/提示

在格式化输出浮点数(例如平均分)时,防止浮点误差的一个好方法是加上一个很小的数(例如本题中可以取 $10^{-5}$)。否则,如果浮点误差导致结果为 $80.31499999$,则 $80.315$ 将被输出为 $80.31$。 Translated by Luogu User $\text{UID}=911054$。