- 期中考前小练习5
按以下要求编写程序
题目说明
请各位考生从课程信息发布网站下载数据文件input.txt,然后将两个数据文件手动保存在D盘根目录下。该文件中的数据以文本形式存储,其中包含了若干个同学的期中考试成绩记录,每个人最多有三门课,分别为Math、English和C++,每门课的成绩占一行,每行包括学号、课程名称和成绩,三者之间用‘\t’分开。
请按要求依次完成如下操作:
1、 编写一个函数ReadFile。读取input.txt文件中的所有记录,并将它们存放在struct mark结构体类型的marks向量中。
2、 编写一个函数ShowData。显示第1步中生成的marks向量的前5条。要求学号占15列左对齐,课程名称占10列左对齐,成绩占8列右对齐,本函数如果调用时不指定显示条数,则显示marks向量的前3条(当数据不足3条时,则全部显示)。
3、 编写一个函数Filter,将marks向量中所有不合法的数据删除,所谓不合法的数据就是考试成绩小于0或者大于100,然后在屏幕上显示删除的条数。
4、 编写一个函数FillData,将marks向量中所有数据按学号和课程名称汇总到struct student类型的向量stus中,汇总规则是:1)在stus中每个学号的学生只有一个元素;2)在stus中每个元素有三个成绩;3)汇总时如果某个学号在marks中不足三个成绩,对应stus中元素的对应成绩数据填0。
5、 编写一个函数SortData,对向量stus按照三门课的总分从高到低排序,当总分相同时,按照学号从小到大排序。
6、 编写一个函数ShowData,将stus向量中的最后5行数据显示在屏幕上(如果不足5行,则显示全部),要求学号占15列左对齐,Math成绩占5列右对齐,English占5列右对齐,C++占5列右对齐。
7、 编写一个函数WriteFile。将经过第5步处理的向量stus中所有数据写入到指定文本文件result.txt中,要求学号占15列左对齐,Math成绩占5列右对齐,English占5列右对齐,C++占5列右对齐。。
8、
涉及结构体定义如下:
struct mark
{
string xh;//学号
string kc;//课程名称
int cj;//成绩
};
struct student
{
string xh; //学号
int math; //数学成绩
int english; //英语成绩
int cplusplus; //C++成绩
};
main函数如下:
int main()
{
vector <struct mark> marks;
ReadFile("d:\\input.txt", marks); //读取文件的数据到marks
cout << "数据总条数为:" << marks.size() << endl; //显示数据总数
ShowData(marks,5);
int count=Filter(marks);//删除其中不合法的数据
cout << "合计删除了" << count << "条不合法成绩" << endl;
vector<struct student> stus=FillData(marks);
cout <<"汇总结果合计有"<< stus.size()<<"人"<< endl;
SortData (stus.begin(), stus.end(), cmp);
cout << "总分最低的5人信息为" << endl;
ShowData(stus,5);
WriteFile("d:\\res.txt",stus);
return 0;
}
注意: 不允许修改main函数,每修改一处,扣3分;
#include<iostream>
#include<string>
#include<vector>
#include<fstream>
#include<sstream>
#include<iomanip>
#include <algorithm>
using namespace std;
struct mark
{
string xh;//学号
string kc;//课程名称
int cj;//成绩
};
struct student
{
string xh; //学号
int math; //数学成绩
int english; //英语成绩
int cplusplus; //C++成绩
};
void ReadFile(string name, vector <struct mark>& marks) {
marks.clear();
ifstream file(name, ios::in);
while (!file.eof()) {
string temp;
getline(file, temp);
istringstream ss(temp);
string tempxh;
string tempkc;
int tempcj;
ss >> tempxh >> tempkc >> tempcj;
struct mark tempmark = {
tempxh,tempkc,tempcj };
marks.push_back(tempmark);
}
file.close();
}
void ShowData(vector <struct mark> &marks, int n=3) {
if (signed(marks.size(