2019上机第一题

读入xml文本,按成绩大小由大到小排序输出成txt

xml文件格式如下所示

<grades>
<grade>
<id>2019001</id>
<name>张三</name>
<course>机器学习</course>
<score>85</score>
</grade>
<grade>
<id>2019002</id>
<name>李四</name>
<course>操作系统</course>
<score>90</score>
</grade>
<grade>
<id>2019003</id>
<name>王五</name>
<course>数据结构</course>
<score>95</score>
</grade>
</grades>

c++代码实现

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>  // 包含了 sort() 函数

using namespace std;

// 定义一个结构体 Grade,用于保存每个学生的成绩信息
struct Grade {
    string id;  // 学号
    string name;  // 姓名
    string course;  // 课程名
    int score;  // 分数
};

// 定义一个比较函数 cmp,用于将 Grade 结构体按照分数从大到小排序
bool cmp(const Grade& a, const Grade& b) {
    return a.score > b.score;
}

int main() {
    vector<Grade> grades;  // 定义一个 vector,用于保存所有的学生成绩信息
    ifstream fin("grades.xml");  // 打开 grades.xml 文件
    string line;
    while (getline(fin, line)) {  // 逐行读取文件中的内容
        if (line.find("<grade>") != string::npos) {  // 如果当前行包含 "<grade>",说明这是一个学生的成绩信息
            Grade grade;
            getline(fin, line);  // 读取下一行文本,即 <id> 标签中的内容
            grade.id = line.substr(4, line.length() - 9);  // 提取出学生的学号,注意去掉前面的 "<id>" 和后面的 "</id>"
            getline(fin, line);  // 读取下一行文本,即 <name> 标签中的内容
            grade.name = line.substr(6, line.length() - 13);  // 提取出学生的姓名,注意去掉前面的 "<name>" 和后面的 "</name>"
            getline(fin, line);  // 读取下一行文本,即 <course> 标签中的内容
            grade.course = line.substr(8, line.length() - 17);  // 提取出学生的课程名,注意去掉前面的 "<course>" 和后面的 "</course>"
            getline(fin, line);  // 读取下一行文本,即 <score> 标签中的内容
            grade.score = stoi(line.substr(7, line.length() - 15));  // 提取出学生的分数,注意去掉前面的 "<score>" 和后面的 "</score>",并将字符串转换成整数
            grades.push_back(grade);  // 将该学生的成绩信息添加到 grades 中
        }
    }
    fin.close();  // 关闭文件
    sort(grades.begin(), grades.end(), cmp);  // 使用 sort() 函数对 grades 中的元素按照分数从大到小排序
    ofstream fout("grades.txt");  // 打开 grades.txt 文件
    for (auto grade : grades) {  // 遍历 grades 中的每一个元素
        fout << grade.id << "," << grade.name << "," << grade.course << "," << grade.score << endl;  // 将该学生的成绩信息输出到 grades.txt 文件中,用逗号隔开各个字段
    }
    fout.close();  // 关闭文件
    return 0;
}

生成的txt文件如下所示
在这里插入图片描述

2018年反向操作(有编码问题,不太会)

#include<bits/stdc++.h>
using namespace std;
struct Grade
{
    string id;
    string name;
    string course;
    string score;
};
int main()
{
    vector<Grade> grades;
    ifstream fin("grades.txt");
    string line;
    while(getline(fin,line))
    {
        Grade g;
        vector<int> x;
        for(int i=0;i<line.size();i++)
        {
            if(line[i]==',')
                x.push_back(i);
            //cout<<line[i];
        }
        //cout<<endl;
        //cout<<x.size()<<endl;
        g.id=line.substr(0, x[0]);
        g.name=line.substr(x[0]+1, x[1]);
        //cout<<g.name<<endl;
        g.course=line.substr(x[1]+1, x[2]);
        //cout<<g.course<<endl;
        g.score=line.substr(x[2]+1, line.length());
        grades.push_back(g);
    }
    fin.close();
    ofstream fout("newgrades.xml");
    fout<<"<grades>"<<endl;
    for(int i=0;i<3;i++)
    {
        fout<<"<grade>"<<endl;
        fout<<"<id>"<<grades[i].id<<" </id>"<<endl;
        fout<<"<name>"<<grades[i].name<<" </name>"<<endl;
        fout<<"<course>"<<grades[i].course<<" </course>"<<endl;
        fout<<"<score>"<<grades[i].score<<" </score>"<<endl;
        fout<<"</grade>"<<endl;
    }
    fout<<"</grades>"<<endl;
    fout.close();
    //cout<<grades[0].id<<endl<<grades[0].name<<endl<<grades[0].course<<endl<<grades[0].score;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值