UVA12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
简要题意
这道题就是要你维护一个学生成绩管理系统。
代码实现
程序设计
为了方便输出,我们定义了 println 函数:
void println(string s){
cout<<s<<'\n';
}
学生信息维护我用了一个结构体 Student:
struct Student{
string sid,name;
int cid;
int chinese,mathematics,english,programming;
bool operator==(const Student &x) const{
return sid==x.sid && cid==x.cid && chinese==x.chinese && mathematics==x.mathematics && english==x.english && programming == x.programming;
}
};
存储学生我用了一个 vector(主存储)和一个 map(辅助存储,用于判断是否有重复的 SID):
vector<Student> v;
map<string,bool> duplicated;
然后就是主程序了:
#define judge(a,func) case a:func();break;
signed main(){
// freopen("1.out","w",stdout);
while(1){
main_menu();
int op;
cin>>op;
switch(op){
judge(1,add);
judge(2,remove);
judge(3,query);
judge(4,show_ranking);
judge(5,show_statisitics);
case 0:return 0;
}
}
}
主菜单部分
输出主菜单的部分,并不需要太大的难度。
void main_menu(){
println("Welcome to Student Performance Management System (SPMS).");
println("");
println("1 - Add");
println("2 - Remove");
println("3 - Query");
println("4 - Show ranking");
println("5 - Show Statistics");
println("0 - Exit");
println("");
}
添加学生部分
这一部分我们先读入学生信息,判 \(0\) 后再判重,如果都通过了就加进去。然后尾递归。
void add(){
println("Please enter the SID, CID, name and four scores. Enter 0 to finish.");
string sid;
cin>>sid;
if(sid=="0")return;
Student student;
student.sid=sid;
cin>>student.cid>>student.name>>student.chinese>>student.mathematics>>student.english>>student.programming;
if(duplicated[sid]){
println("Duplicated SID.");
}
else{
duplicated[sid]=1;
v.push_back(student);
}
add();
}
删除学生部分
这一部分先遍历所有学生,如果存在满足要求的学生就放进一个栈里。最后一个一个将栈中的元素取消存在 SID 标并删除。
void remove(){
println("Please enter SID or name. Enter 0 to finish.");
string str;
cin>>str;
stack<vector<Student>::iterator> removing;
if(str=="0")return;
int tot=0;
for(auto ite=v.begin();ite!=v.end();ite++){
if((*ite).sid==str || (*ite).name==str){
tot++;
duplicated[(*ite).sid]=0;
removing.push(ite);
}
}
while(!removing.empty()){
v.erase(removing.top());
removing.pop();
}
cout<<tot;
println(" student(s) removed.");
remove();
}
查询学生部分
码量较大的部分。我们先遍历所有学生,如果有满足条件的话:先将这个学生所在的班级的所有学生取出来,然后排一遍序,找到这个学生的排名,再输出信息。
int total(Student x){
return x.chinese+x.english+x.mathematics+x.programming;
}
void query(){
println("Please enter SID or name. Enter 0 to finish.");
string str;
cin>>str;
if(str=="0")return;
for(Student i : v){
if(i.sid==str || i.name==str){
vector<Student> same_class;
for(Student j : v){
same_class.push_back(j);
}
sort(same_class.begin(),same_class.end(),[&](const Student &x,const Student &y){
return x.chinese+x.mathematics+x.english+x.programming>y.chinese+y.mathematics+y.english+y.programming;
});
int ret=0;
for(vector<Student>::size_type j=0;j<same_class.size();j++){
if(j>0&&total(same_class[j])==total(same_class[j-1])){}
else ret=j+1;
if(same_class[j]==i){
break;
}
}
cout<<ret<<' '<<i.sid<<' '<<i.cid<<' '<<i.name<<' ';
cout<<i.chinese<<' '<<i.mathematics<<' '<<i.english<<' '<<i.programming<<' ';
cout<<(i.chinese+i.mathematics+i.english+i.programming)<<' ';
printf("%.2lf\n",((double)((i.chinese+i.mathematics+i.english+i.programming))/4.0)+1e-5);
}
}
query();
}
显示排名部分
这一部分最简单,由于本题不需要我们输出排名,我们只需要输出提示信息即可。
void show_ranking(){
println("Showing the ranklist hurts students' self-esteem. Don't do that.");
}
班级统计部分
码量最大的部分。但是思维偏简单,直接遍历班级的学生(如果 CID 时 \(0\) 就是所有的学生)
,找到没有及格的和及格的,进行计数即可。
void show_statisitics(){
println("Please enter class ID, 0 for the whole statistics.");
int cid;cin>>cid;
int passed=0,failed=0;
double aver=0;
int cnt=0;
for(Student i : v){
if(i.cid!=cid&&cid!=0)continue;
cnt++;
}
{
println("Chinese");
for(Student i : v){
if(i.cid!=cid&&cid!=0)continue;
aver += i.chinese;
passed += (i.chinese >= 60);
failed += (i.chinese < 60);
}
aver /= cnt;
cout<<"Average Score: ";
printf("%.2lf\n",aver+1e-5);
cout<<"Number of passed students: "<<passed<<'\n';
cout<<"Number of failed students: "<<failed<<'\n';
println("");
}
{
aver=0;failed=0;passed=0;
println("Mathematics");
for(Student i : v){
if(i.cid!=cid&&cid!=0)continue;
aver += i.mathematics;
passed += (i.mathematics >= 60);
failed += (i.mathematics < 60);
}
aver /= cnt;
cout<<"Average Score: ";
printf("%.2lf\n",aver+1e-5);
cout<<"Number of passed students: "<<passed<<'\n';
cout<<"Number of failed students: "<<failed<<'\n';
println("");
}
{
aver=0;failed=0;passed=0;
println("English");
for(Student i : v){
if(i.cid!=cid&&cid!=0)continue;
aver += i.english;
passed += (i.english >= 60);
failed += (i.english < 60);
}
aver /= cnt;
cout<<"Average Score: ";
printf("%.2lf\n",aver+1e-5);
cout<<"Number of passed students: "<<passed<<'\n';
cout<<"Number of failed students: "<<failed<<'\n';
println("");
}
{
aver=0;failed=0;passed=0;
println("Programming");
for(Student i : v){
if(i.cid!=cid&&cid!=0)continue;
aver += i.programming;
passed += (i.programming >= 60);
failed += (i.programming < 60);
}
aver /= cnt;
cout<<"Average Score: ";
printf("%.2lf\n",aver+1e-5);
cout<<"Number of passed students: "<<passed<<'\n';
cout<<"Number of failed students: "<<failed<<'\n';
println("");
}
println("Overall:");
int all=0,one=0,two=0,three=0,failed_all=0;
for(Student i : v){
if(i.cid!=cid&&cid!=0)continue;
int ret = (int)(i.chinese>=60)+(int)(i.mathematics>=60)+(int)(i.english>=60)+(int)(i.programming>=60);
if(ret>=1)one++;
if(ret>=2)two++;
if(ret>=3)three++;
if(ret>=4)all++;
if(ret==0)failed_all++;
}
cout<<"Number of students who passed all subjects: "<<all<<'\n';
cout<<"Number of students who passed 3 or more subjects: "<<three<<'\n';
cout<<"Number of students who passed 2 or more subjects: "<<two<<'\n';
cout<<"Number of students who passed 1 or more subjects: "<<one<<'\n';
cout<<"Number of students who failed all subjects: "<<failed_all<<'\n';
println("");
}
写在最后
这一道题,个人感觉并不是很难,\(30\) 分钟码代码 + \(20\) 分调试就做出来了。(最后发现时引号问题和删除问题)写完之后头脑清醒很多,收获了一个 UVA 调试工具 uDebug,还提升了英语水平(没有中文翻译,纯看英文题面)。
UVA12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)的更多相关文章
- 【例题4-6 uva12412】A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 训练编程的题. 原题中没有除0的数据,所以别担心你的代码是因为除0错了. 多半跟我一样. 也是因为没有+eps 就是比如你要算tot ...
- UVA12412 师兄帮帮忙 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang) 题解
Content 自己去看题面去. Solution 算不上很繁琐的一道大模拟. 首先,既然是输出 \(0\) 才退出,那么在此之前程序应当会执行菜单 \(\Rightarrow\) 子操作 \(\Ri ...
- UVA 12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
题目链接:https://vjudge.net/problem/UVA-12412 题目大意 略. 分析 比较大规模的模拟,注意输入输出,浮点数精度,还有排名相同的输出顺序,还有一些边界情况处理. 代 ...
- A Typical Homework(学生信息管理系统)
A Typical Homework(a.k.a Shi Xiong Bang Bang Mang) Hi, I am an undergraduate student in institute of ...
- 五、Pandas玩转数据
Series的简单运算 import numpy as np import pandas as pd s1=pd.Series([1,2,3],index=['A','B','C']) print(s ...
- Radio Basics for RFID
Radio Basics for RFID The following is excerpted from Chapter 3: Radio Basics for UHF RFID from the ...
- [IR] Compression
关系:Vocabulary vs. collection size Heaps’ law: M = kTbM is the size of the vocabulary, T is the numbe ...
- php中文转拼音2
<?php /** * strtopinyin.php * * @name 汉字字符转拼音 * @author Kudosharry * @version v1.0 * */ class Str ...
- PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)
PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++: 欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...
- Python 小白的新手教程(一)
本文是 python 入门级别的基础知识,包括数据类型和变量.输入输出.字符串和编码.list tuple dict set .条件判断.循环.函数.切片 迭代 列表生成器 生成器 迭代器等. 参考课 ...
随机推荐
- PHP redis有序集合实现分页
<?php //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //设置 redis 字符 ...
- 齐博x1更新了 提供一个部分用户期待已久的功能,修改主题后变为待审
如下图所示,你可以设置哪些用户组修改主题后,就会把原来已审核通过的主题,变为未审核.适合所有频道.
- django 生产环境部署手册
Django 是 python 的 web 框架,以下是其部署到生产环境的详细步骤,包含 Apache 和 nginx 版本. 部署环境 操作系统:centeros7.3 数据库:MySQL5.6.5 ...
- 沁恒CH32V003F4P6 开发板上手报告和Win10环境配置
CH32V003 沁恒最近推出的低价CH32V003系列, 基于青稞RISC-V2A内核, 48MHz主频, 2KB SRAM, 16KB Flash, 工作电压兼容3.3V和5V. 主要参数如下 S ...
- openssh编译rpm包(防火防盗防漏扫)
参考链接:https://www.jianshu.com/p/0882b0502960 openssh下载链接: wget https://cdn.openbsd.org/pub/OpenBSD/Op ...
- <三>使用类模板实现STL Vector
使用类模板实现STL Vector,点击查看代码 #include <iostream> using namespace std; template<typename T> c ...
- 基于python的数学建模---机场航线设计
数据集 拿走: 链接:https://pan.baidu.com/s/1zH5xhpEmx2_u5qO9W4gCkw 提取码:2wl5 数据集来自航空业,有一些关于航线的基本信息.有某段旅程的起始点和 ...
- PP视频(PPTV聚力)web接口分析
前言 前几天我想看一个番剧, 正好搜索到了 PP视频,我才知道PP视频就是PPTV聚力,我想把番剧下载下来,结果发现视频竟然不是m3u8格式,而是多段mp4,所以简单的写了个脚本,可以在不登录的情况下 ...
- Golang反射修改变量值
1. 前言 前面的随笔Golang反射获取变量类型和值分享了如何通过反射获取变量的类型和值, 也就是Golang反射三大定律中的前两个,即从interface{}到反射对象和从反射对象到interfa ...
- 【Hive】概念、安装、数据类型、DDL、DML操作、查询操作、函数、压缩存储、分区分桶、实战Top-N、调优(fetch抓取)、执行计划
一.概念 1.介绍 基于Hadoop的数据仓库工具,将结构化数据映射为一张表,可以通过类SQL方式查询 本质:将HQL转换成MapReduce程序 Hive中具有HQL对应的MapReduce模板 存 ...