PAT 1137 Final Grading

本文介绍了一种编程成绩评定算法,该算法根据在线编程得分、期中期末考试成绩等信息综合评定学生的最终成绩,并通过结构体存储和排序实现高效计算。

在这里插入图片描述
题目大意:
题目中给了评定最终分数的机制:

  • 首先需要获得200个程序得分点
  • 如果期中成绩大于期末成绩,就用期中成绩0.4+期末成绩0.6来计算;否则直接把期末成绩作为最终成绩

题目中分别给出三个量p,m,n.
首先会给出p个学生做的在线编程的分数;紧接着是m个学生的期中成绩;最后是n个学生的期末成绩;
如果有些成绩没有的话,就输出-1.

思路:
首先在输入P个在线编码成绩时,就可以把低于200分的不进行录入,只存储200及以上的。
由于最后对于整个结果需进行多个条件的评判,所以在前面要用到结构体。该结构体里的属性为最终成绩和studentID,mid-term和final-term,point(所有成绩初始化为-1)
排序的话用一个动态数组对结构体进行存储
后续在编写代码中发现了一个点:如果一个个找student是否在需计算的队列里的话用循环太费时间了,所以选取了map先存储这些值,用find()函数来看是否在这个范围里。
然后最后把值从map传到vector时,同时计算final grade,这里final grade要不少于60;
代码:

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<unordered_map>
#include<cmath>
using namespace std;
struct student{
	string studentid;
	int point,mid,fexam,final;
};
bool cmp(student s1,student s2){
	return s1.final==s2.final?s1.studentid<s2.studentid:s1.final>s2.final;
}
int main(){
	int p,m,n;
	cin>>p>>m>>n;
	vector<student> v;
	unordered_map<string,student> ms;
	while(p--){
		string stu;
		int point;
		cin>>stu>>point;
		if(point>=200){
			student s={stu,point,-1,-1,-1};
			ms[stu]=s;
		}	
	}
	while(m--){
		string stu;
		int mid;
		cin>>stu>>mid;
		if(ms.find(stu)!=ms.end()) ms[stu].mid=mid;
	}
	while(n--){
		string stu;
		int fexam;
		cin>>stu>>fexam;
		if(ms.find(stu)!=ms.end()) ms[stu].fexam=fexam;
	}
	for(auto it=ms.begin();it!=ms.end();it++){
		if(it->second.mid>it->second.fexam) it->second.final=round(it->second.mid*0.4+it->second.fexam*0.6);
		else it->second.final=it->second.fexam;
		if(it->second.final>=60) v.push_back(it->second);
	}
	sort(v.begin(),v.end(),cmp);
	for(int i=0;i<v.size();i++) printf("%s %d %d %d %d\n",v[i].studentid.c_str(),v[i].point,v[i].mid,v[i].fexam,v[i].final);
	return 0;
}

在这里插入图片描述
精华

  • map里找元素:if(ms.find(stu)!=ms.end())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值