【c++】2020大一下期中考前小练习5

  • 期中考前小练习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(
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值