请用c++ stl实现以下内容:读取data.txt数据,将其按照demo.xls的格式放入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 15:41:25 浏览: 63
好的,以下是代码示例:
```c++
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
// 学生信息结构体
struct Student {
string id; // 考号
string name; // 姓名
string cls; // 班级
int score; // 总分
int schRank; // 学校排名
int clsRank; // 班级排名
int objScore; // 客观题总分
int subScore; // 主观题总分
vector<int> objAnswers; // 客观题答案
vector<string> subAnswers; // 主观题答案
};
// 读取客观题答案
vector<int> readObjAnswers(string line) {
vector<int> answers;
istringstream iss(line);
string answer;
while (iss >> answer) {
answers.push_back(stoi(answer));
}
return answers;
}
// 读取主观题答案
vector<string> readSubAnswers(string line) {
vector<string> answers;
istringstream iss(line);
string answer;
while (iss >> answer) {
answers.push_back(answer);
}
return answers;
}
// 计算客观题总分
int calcObjScore(vector<int>& answers) {
return accumulate(answers.begin(), answers.end(), 0);
}
// 计算主观题总分
int calcSubScore(vector<string>& answers) {
int score = 0;
for (string answer : answers) {
score += stoi(answer);
}
return score;
}
// 读取数据文件
vector<Student> readDataFile(string filename) {
ifstream ifs(filename);
if (!ifs) {
throw runtime_error("Cannot open file " + filename);
}
vector<Student> students;
string line;
while (getline(ifs, line)) {
Student s;
istringstream iss(line);
iss >> s.id >> s.name >> s.cls;
s.objAnswers = readObjAnswers(line.substr(23, 26));
s.objScore = calcObjScore(s.objAnswers);
s.subAnswers = readSubAnswers(line.substr(50));
s.subScore = calcSubScore(s.subAnswers);
s.score = s.objScore + s.subScore;
students.push_back(s);
}
ifs.close();
return students;
}
// 按总分排序
bool compareStudents(const Student& s1, const Student& s2) {
return s1.score > s2.score;
}
// 计算排名
void calcRank(vector<Student>& students) {
sort(students.begin(), students.end(), compareStudents);
for (int i = 0; i < students.size(); i++) {
if (i == 0 || students[i].score != students[i - 1].score) {
students[i].schRank = i + 1;
} else {
students[i].schRank = students[i - 1].schRank;
}
}
map<string, vector<Student>> clsMap;
for (Student s : students) {
clsMap[s.cls].push_back(s);
}
for (auto& p : clsMap) {
auto& clsStudents = p.second;
sort(clsStudents.begin(), clsStudents.end(), compareStudents);
for (int i = 0; i < clsStudents.size(); i++) {
if (i == 0 || clsStudents[i].score != clsStudents[i - 1].score) {
clsStudents[i].clsRank = i + 1;
} else {
clsStudents[i].clsRank = clsStudents[i - 1].clsRank;
}
}
}
}
// 导出 CSV 文件
void exportCsv(vector<Student>& students, string filename) {
ofstream ofs(filename);
if (!ofs) {
throw runtime_error("Cannot create file " + filename);
}
// 写入表头
ofs << "考号,姓名,班级,总分,学校排名,班级排名,客观题总分,主观题总分,选择1,选择2,选择3,选择4,选择5,选择6,选择7,选择8,选择9,选择10,选择11,选择12,填空题17,填空题18,填空题19,填空题20,填空题21,填空题22" << endl;
// 写入学生数据
for (Student s : students) {
ofs << s.id << "," << s.name << "," << s.cls << "," << s.score << "," << s.schRank << "," << s.clsRank << "," << s.objScore << "," << s.subScore;
for (int answer : s.objAnswers) {
ofs << "," << answer;
}
for (string answer : s.subAnswers) {
ofs << "," << answer;
}
ofs << endl;
}
ofs.close();
}
// 主函数
int main() {
try {
// 读取数据文件
vector<Student> students = readDataFile("data.txt");
// 计算排名
calcRank(students);
// 写入 demo 文件
exportCsv(students, "demo.csv");
// 按班级导出 CSV 文件
map<string, vector<Student>> clsMap;
for (Student s : students) {
clsMap[s.cls].push_back(s);
}
for (auto& p : clsMap) {
auto& clsStudents = p.second;
string filename = p.first + ".csv";
exportCsv(clsStudents, filename);
}
// 导出学校 CSV 文件
exportCsv(students, "school.csv");
cout << "end" << endl;
} catch (exception& e) {
cerr << e.what() << endl;
}
return 0;
}
```
代码中使用了 ifstream、ofstream、istringstream、ostringstream 等类和相关函数来实现文件读写和字符串操作。计算客观题总分和主观题总分使用了 accumulate 和 stoi 函数。对每个学生的总分进行排序使用了 sort 函数,计算排名使用了 map 存储每个班级的学生信息,并依次对每个班级的学生信息进行排序和排名计算。将学生信息写入 CSV 文件使用了 ofstream 类,导出不同班级的表格使用了 map 存储每个班级的学生信息,并依次将每个班级的信息写入对应的 CSV 文件中。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)