1080 MOOC期终成绩

1080 MOOC期终成绩

在这里插入图片描述

思路:

  • 结构体:里面5个变量,分别是编号和4个成绩。创建一个10005大小的结构体列表。
  • 2个map分别存储每个学生的编程分数、期中分数
  • 三次for循环读取输入,前两次存到map里,最后一次读编号和期末成绩可以直接输入到结构体里,顺便把前两个map里的成绩也输入进结构体。
  • 对结构体列表进行排序,自己写sort的compare函数
  • 按顺序输出合格的人,若编程分数小于200或者总成绩小于60则continue跳过

坑点:

  • 总成绩要求四舍五入,算出来+0.5然后转int即可,经典转换。
  • 注意,题目要求如果有一个成绩不存在则输出为-1,但是这里其实只有期中考试的成绩是可以不存在的,编程成绩和期末考试成绩如果不存在则必然不合格。
  • 一开始我把期中考试成绩初始化为0,最后用if语句做个判断,假如期中考试成绩为0则输出-1,这导致测试点3一直错误。原因是,可能会存在考了期中但是成绩就是0的学生,这样就应该直接输出0而不是-1。后来我把期中考试成绩初始化为-1,就过了。
#include<stdio.h>
#include<iostream>
#include<map>
#include<algorithm>

using namespace std;

struct student {
	string id;
	int prog = 0;   // 编程成绩
	int midd = -1;	// 期中成绩
	int fina = 0;   // 期末成绩
	int score = 0;
} S[10005];

map<string, int> pr, mi;  // pr:学生编程成绩  mi:学生期中成绩

bool compare(student s1, student s2) {
	if (s1.score == s2.score) { return s1.id < s2.id; }
	else { return s1.score > s2.score; }
}

int main(int argc, char* argv[]) {
	int p, m, n; cin >> p >> m >> n;
	for (int i = 0; i < p; i++) {
		string s;
		int x;
		cin >> s >> x;
		pr[s] = x;
	}
	for (int i = 0; i < m; i++) {
		string s;
		int x;
		cin >> s >> x;
		mi[s] = x;
	}
	for (int i = 0; i < n; i++) {
		string s;
		int x;
		cin >> s >> x;
		S[i].id = s;
		S[i].fina = x;
		if (pr.find(s) != pr.end()) { S[i].prog = pr[s]; }
		if (mi.find(s) != mi.end()) { S[i].midd = mi[s]; }
		if (S[i].fina < S[i].midd) { S[i].score = S[i].fina * 0.6 + S[i].midd * 0.4 + 0.5; }  // 加0.5是为了四舍五入到整数
		else { S[i].score = S[i].fina; }
	}
	sort(S, S + n, compare);

	for (int i = 0; i < n; i++) {
		if (S[i].prog < 200 || S[i].prog > 900 || S[i].midd > 100 || S[i].fina > 100 || S[i].score < 60) { continue; }
		// if (S[i].midd == 0) { S[i].midd = -1; }
		cout << S[i].id << " " << S[i].prog << " " << S[i].midd << " " << S[i].fina << " " << S[i].score << endl;
	}

	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值