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$。