请用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。
时间: 2023-07-21 21:43:24 浏览: 134
STL文件的读取显示.zip_STL c++_STL文件_STL读取_读取stl_读取stl文件
5星 · 资源好评率100%
好的,以下是用C++ STL实现读取data数据并按照demo格式放入demo中,计算客观题总分和主观题总分,计算总分和排名,导出表格的代码。由于您没有提供数据文件的格式和数据文件的路径,因此以下代码可能需要根据具体情况进行修改。
```c++
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
// 定义结构体存储每个学生的信息
struct Student {
string id; // 考号
string name; // 姓名
string cls; // 班级
int score; // 总分
int rank_school; // 学校排名
int rank_cls; // 班级排名
int score_obj; // 客观题总分
int score_subj; // 主观题总分
vector<int> obj; // 客观题分数
vector<int> subj; // 主观题分数
};
// 定义比较函数,用于排序
bool cmp(const Student &a, const Student &b) {
return a.score > b.score;
}
int main() {
// 读取data数据
ifstream fin("data.txt");
string line;
vector<Student> students;
while (getline(fin, line)) {
Student stu;
stringstream ss(line);
ss >> stu.id >> stu.name >> stu.cls;
for (int i = 0; i < 12; i++) {
int score;
ss >> score;
stu.obj.push_back(score);
stu.score_obj += score; // 累加客观题总分
}
for (int i = 0; i < 6; i++) {
int score;
ss >> score;
stu.subj.push_back(score);
stu.score_subj += score; // 累加主观题总分
}
stu.score = stu.score_obj + stu.score_subj; // 计算总分
students.push_back(stu); // 存储学生信息
}
fin.close();
// 按照总分排序
sort(students.begin(), students.end(), cmp);
// 计算学校排名
int rank_school = 1;
int last_score = students[0].score;
students[0].rank_school = 1;
for (int i = 1; i < students.size(); i++) {
if (students[i].score == last_score) {
students[i].rank_school = rank_school;
} else {
rank_school++;
students[i].rank_school = rank_school;
last_score = students[i].score;
}
}
// 按照班级计算排名
map<string, int> rank_cls_map; // 记录每个班级的排名
for (int i = 0; i < students.size(); i++) {
string cls = students[i].cls;
if (rank_cls_map.find(cls) == rank_cls_map.end()) { // 如果班级还没有排名,则排名为1
rank_cls_map[cls] = 1;
}
students[i].rank_cls = rank_cls_map[cls]; // 记录班级排名
rank_cls_map[cls]++; // 更新班级排名
}
// 导出表格
ofstream fout_school("school.csv");
fout_school << "考号,姓名,班级,总分,学校排名,班级排名,客观题总分,主观题总分,选择1,选择2,选择3,选择4,选择5,选择6,选择7,选择8,选择9,选择10,选择11,选择12,填空题17,填空题18,填空题19,填空题20,填空题21,填空题22" << endl;
vector<ofstream> fout_cls(students.size()); // 每个班级对应一个输出文件流
for (int i = 0; i < students.size(); i++) {
Student stu = students[i];
fout_school << stu.id << "," << stu.name << "," << stu.cls << ",," << stu.rank_school << "," << stu.rank_cls << "," << stu.score_obj << "," << stu.score_subj;
for (int j = 0; j < 12; j++) {
fout_school << "," << stu.obj[j];
}
for (int j = 0; j < 6; j++) {
fout_school << "," << stu.subj[j];
}
fout_school << endl;
if (fout_cls[stu.cls].is_open() == false) { // 如果班级对应的输出文件还没有被打开,则打开文件并输出表头
fout_cls[stu.cls].open(stu.cls + ".csv");
fout_cls[stu.cls] << "考号,姓名,班级,总分,班级排名,客观题总分,主观题总分,选择1,选择2,选择3,选择4,选择5,选择6,选择7,选择8,选择9,选择10,选择11,选择12,填空题17,填空题18,填空题19,填空题20,填空题21,填空题22" << endl;
}
fout_cls[stu.cls] << stu.id << "," << stu.name << "," << stu.cls << ",," << stu.rank_cls << "," << stu.score_obj << "," << stu.score_subj;
for (int j = 0; j < 12; j++) {
fout_cls[stu.cls] << "," << stu.obj[j];
}
for (int j = 0; j < 6; j++) {
fout_cls[stu.cls] << "," << stu.subj[j];
}
fout_cls[stu.cls] << endl;
}
fout_school.close();
for (int i = 0; i < fout_cls.size(); i++) {
fout_cls[i].close();
}
cout << "end" << endl;
return 0;
}
```
注意:以上代码中的文件读取、文件输出等操作都可能出现异常,需要根据具体情况进行错误处理。此外,如果数据量较大,以上代码可能会出现性能问题,需要进行优化。
阅读全文