读取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格式导出学校的表格,要求用c++ stl进行编写代码示例
时间: 2023-07-21 19:41:01 浏览: 66
在app中读取本地的txt文本的Android demo
4星 · 用户满意度95%
这里是一个基于C++ STL的代码示例,实现了您的需求:
```c++
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct Student {
string id; // 考号
string name; // 姓名
string cls; // 班级
int score_obj; // 客观题总分
int score_subj; // 主观题总分
int score_total; // 总分
int rank_school; // 学校排名
int rank_cls; // 班级排名
vector<int> score_choice; // 选择题得分数组
vector<int> score_fill; // 填空题得分数组
};
// 读取data文件数据
vector<Student> read_data(const string& filename) {
vector<Student> students;
ifstream ifs(filename);
if (!ifs) {
cerr << "error: cannot open file " << filename << endl;
return students;
}
string line;
while (getline(ifs, line)) {
Student s;
size_t pos = 0;
// 读取考号
pos = line.find(',', pos) + 1;
s.id = line.substr(pos, line.find(',', pos) - pos);
// 读取姓名
pos = line.find(',', pos) + 1;
s.name = line.substr(pos, line.find(',', pos) - pos);
// 读取班级
pos = line.find(',', pos) + 1;
s.cls = line.substr(pos, line.find(',', pos) - pos);
// 读取选择题得分
for (int i = 0; i < 12; i++) {
pos = line.find(',', pos) + 1;
s.score_choice.push_back(stoi(line.substr(pos, line.find(',', pos) - pos)));
}
// 读取填空题得分
for (int i = 0; i < 6; i++) {
pos = line.find(',', pos) + 1;
s.score_fill.push_back(stoi(line.substr(pos, line.find(',', pos) - pos)));
}
// 计算客观题总分
s.score_obj = accumulate(s.score_choice.begin(), s.score_choice.end(), 0);
// 计算主观题总分
s.score_subj = accumulate(s.score_fill.begin(), s.score_fill.end(), 0);
// 计算总分
s.score_total = s.score_obj + s.score_subj;
students.push_back(s);
}
ifs.close();
return students;
}
// 按总分从大到小排序
void sort_by_score(vector<Student>& students) {
sort(students.begin(), students.end(), [](const Student& s1, const Student& s2) {
return s1.score_total > s2.score_total;
});
}
// 计算学校排名
void calc_rank_school(vector<Student>& students) {
int rank = 1;
for (int i = 0; i < students.size(); i++) {
if (i > 0 && students[i].score_total < students[i-1].score_total) {
rank = i + 1;
}
students[i].rank_school = rank;
}
}
// 计算班级排名
void calc_rank_cls(vector<Student>& students) {
for (int i = 0; i < students.size(); i++) {
int rank = 1;
for (int j = 0; j < students.size(); j++) {
if (students[j].cls == students[i].cls && students[j].score_total > students[i].score_total) {
rank++;
}
}
students[i].rank_cls = rank;
}
}
// 按班级导出成绩表
void export_by_cls(const vector<Student>& students) {
vector<string> cls_list;
for (const auto& s : students) {
if (find(cls_list.begin(), cls_list.end(), s.cls) == cls_list.end()) {
cls_list.push_back(s.cls);
}
}
for (const auto& cls : cls_list) {
string filename = cls + ".csv";
ofstream ofs(filename);
ofs << "考号,姓名,班级,,学校排名,班级排名,客观题总分,主观题总分,选择1,选择2,选择3,选择4,选择5,选择6,选择7,选择8,选择9,选择10,选择11,选择12,填空题17,填空题18,填空题19,填空题20,填空题21,填空题22" << endl;
for (const auto& s : students) {
if (s.cls == cls) {
ofs << s.id << "," << s.name << "," << s.cls << ",," << s.rank_school << "," << s.rank_cls << ","
<< "," << s.score_obj << "," << s.score_subj << ",";
for (int i = 0; i < 12; i++) {
ofs << s.score_choice[i] << ",";
}
for (int i = 0; i < 6; i++) {
ofs << s.score_fill[i] << ",";
}
ofs << endl;
}
}
ofs.close();
}
}
// 导出学校成绩表
void export_by_school(const vector<Student>& students) {
string filename = "school.csv";
ofstream ofs(filename);
ofs << "考号,姓名,班级,,学校排名,班级排名,客观题总分,主观题总分,选择1,选择2,选择3,选择4,选择5,选择6,选择7,选择8,选择9,选择10,选择11,选择12,填空题17,填空题18,填空题19,填空题20,填空题21,填空题22" << endl;
for (const auto& s : students) {
ofs << s.id << "," << s.name << "," << s.cls << ",," << s.rank_school << "," << s.rank_cls << ","
<< "," << s.score_obj << "," << s.score_subj << ",";
for (int i = 0; i < 12; i++) {
ofs << s.score_choice[i] << ",";
}
for (int i = 0; i < 6; i++) {
ofs << s.score_fill[i] << ",";
}
ofs << endl;
}
ofs.close();
}
int main() {
vector<Student> students = read_data("data.txt");
sort_by_score(students);
calc_rank_school(students);
calc_rank_cls(students);
export_by_cls(students);
export_by_school(students);
return 0;
}
```
该代码通过`read_data`函数读取data文件数据,并将每个考生的信息保存到一个`Student`结构体中。在读取过程中,它还计算了每个考生的客观题总分和主观题总分。读取完成后,它调用`sort_by_score`函数对考生按总分从大到小排序,并调用`calc_rank_school`和`calc_rank_cls`函数计算每个考生的学校排名和班级排名。最后,它调用`export_by_cls`和`export_by_school`函数将结果导出为csv格式的表格。
需要注意的是,该代码没有对输入数据进行有效性验证,如数据格式是否正确、数据是否完整等。在实际使用中,需要根据实际情况进行处理。
阅读全文