请用c++ stl实现以下内容:读取data数据,将其按照demo的格式放入demo中去,要求空出总分 客观题总分 主观题总分 ,demo中格式为考号 姓名 班级 总分 学校排名 班级排名 客观题总分 主观题总分 选择1 选择2 选择3 选择4 选择5 选择6 选择7 选择8 选择9 选择10 选择11 选择12 填空题 17 18 19 20 21 22,其中选择1 选择2 选择3 选择4 选择5 选择6 选择7 选择8 选择9 选择10 选择11 选择12 一行中的数据相加填入对应行的客观题总分中,填空17 填空18 填空19 填空20 填空21 填空22一行中的数据相加填入主观题总分中,之后主观题总分和客观题总分相加填入总分中,然后读取demo,将demo中的数据按照总分对不同班级进行排名和学校排名,按照班级依次以csv格式导出不同班级的表格,然后以csv格式导出学校的表格,完成后输出end。要求用c++ stl进行编写代码示例.
时间: 2023-07-21 09:41:09 浏览: 164
由于问题中没有提供data文件的格式和demo的示例,因此假设data文件的格式为:每一行为一个考生的信息,包括考号、姓名、班级、选择题成绩、填空题成绩,用空格分隔;demo的格式为:考号 姓名 班级 总分 学校排名 班级排名 客观题总分 主观题总分 选择1 选择2 选择3 选择4 选择5 选择6 选择7 选择8 选择9 选择10 选择11 选择12 填空题 17 18 19 20 21 22。
以下是实现代码:
```c++
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <sstream>
using namespace std;
struct Student {
string id;
string name;
string cls;
int obj_total;
int sub_total;
vector<int> obj_scores;
vector<int> sub_scores;
};
struct RankInfo {
string id;
string name;
string cls;
int total;
int school_rank;
int cls_rank;
int obj_total;
int sub_total;
vector<int> obj_scores;
vector<int> sub_scores;
};
bool cmpByTotal(const RankInfo& a, const RankInfo& b) {
return a.total > b.total;
}
bool cmpByClsAndTotal(const RankInfo& a, const RankInfo& b) {
if (a.cls != b.cls) {
return a.cls < b.cls;
} else {
return a.total > b.total;
}
}
int main() {
// 读取data文件
vector<Student> students;
ifstream fin("data.txt");
string line;
while (getline(fin, line)) {
Student s;
stringstream ss(line);
ss >> s.id >> s.name >> s.cls;
for (int i = 0; i < 12; i++) {
int score;
ss >> score;
s.obj_scores.push_back(score);
s.obj_total += score;
}
for (int i = 0; i < 6; i++) {
int score;
ss >> score;
s.sub_scores.push_back(score);
s.sub_total += score;
}
s.total = s.obj_total + s.sub_total;
students.push_back(s);
}
fin.close();
// 根据总分进行排名,并计算班级排名和学校排名
sort(students.begin(), students.end(), cmpByTotal);
unordered_map<string, int> schoolRank;
unordered_map<string, unordered_map<string, int>> clsRank;
for (int i = 0; i < students.size(); i++) {
if (i == 0 || students[i].total != students[i-1].total) {
schoolRank[students[i].cls] = i + 1;
}
clsRank[students[i].cls][students[i].id] = i + 1;
students[i].school_rank = schoolRank[students[i].cls];
students[i].cls_rank = clsRank[students[i].cls][students[i].id];
}
// 将排名结果保存到RankInfo结构体中
vector<RankInfo> ranks;
for (const auto& s : students) {
RankInfo r;
r.id = s.id;
r.name = s.name;
r.cls = s.cls;
r.total = s.total;
r.school_rank = s.school_rank;
r.cls_rank = s.cls_rank;
r.obj_total = s.obj_total;
r.sub_total = s.sub_total;
r.obj_scores = s.obj_scores;
r.sub_scores = s.sub_scores;
ranks.push_back(r);
}
// 根据班级和总分排序,以csv格式导出每个班级的排名表格
sort(ranks.begin(), ranks.end(), cmpByClsAndTotal);
string curCls = "";
ofstream fout;
for (const auto& r : ranks) {
if (r.cls != curCls) {
if (fout.is_open()) {
fout.close();
}
curCls = r.cls;
fout.open(curCls + ".csv");
fout << "考号,姓名,总分,学校排名,班级排名,客观题总分,主观题总分,选择1,选择2,选择3,选择4,选择5,选择6,选择7,选择8,选择9,选择10,选择11,选择12,填空题17,填空题18,填空题19,填空题20,填空题21,填空题22" << endl;
}
fout << r.id << "," << r.name << "," << r.total << "," << r.school_rank << "," << r.cls_rank << "," << r.obj_total << "," << r.sub_total << ",";
for (auto score : r.obj_scores) {
fout << score << ",";
}
for (auto score : r.sub_scores) {
fout << score << ",";
}
fout << endl;
}
if (fout.is_open()) {
fout.close();
}
// 根据总分排序,以csv格式导出学校的排名表格
sort(ranks.begin(), ranks.end(), cmpByTotal);
fout.open("school.csv");
fout << "考号,姓名,班级,总分,学校排名,班级排名,客观题总分,主观题总分,选择1,选择2,选择3,选择4,选择5,选择6,选择7,选择8,选择9,选择10,选择11,选择12,填空题17,填空题18,填空题19,填空题20,填空题21,填空题22" << endl;
for (const auto& r : ranks) {
fout << r.id << "," << r.name << "," << r.cls << "," << r.total << "," << r.school_rank << "," << r.cls_rank << "," << r.obj_total << "," << r.sub_total << ",";
for (auto score : r.obj_scores) {
fout << score << ",";
}
for (auto score : r.sub_scores) {
fout << score << ",";
}
fout << endl;
}
fout.close();
cout << "end" << endl;
return 0;
}
```
代码中使用了两个结构体:Student表示考生信息,RankInfo表示排名结果。其中,obj_scores和sub_scores分别表示选择题和填空题每个题目的得分,obj_total和sub_total分别表示选择题和填空题总分。
代码中使用了unordered_map来保存班级排名和学校排名,可以快速地查找排名信息。
代码中使用了stringstream来解析data文件中的每一行信息。
代码中使用了ofstream来打开文件并写入内容,其中csv格式中每个字段之间用逗号分隔,每行末尾加上回车符号。
阅读全文