现有学生成绩信息文件1(1.txt),内容如下:
姓名 学号 语文 数学 英语
张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47
…… ……
学生成绩信息文件2(2.txt),内容如下:
姓名 学号 语文 数学 英语
陈果 31 57 68 82
李华明 32 88 90 68
张明东 33 48 42 56
李明国 34 50 45 87
陈道亮 35 47 58 77
…… ……
试编写一个管理系统,要求如下:
1) 要求使用链表或数组等实现上述要求
2) 实现对两个文件数据进行合并,生成新文件3.txt
3) 可实现学生成绩信息的输入、修改、删除功能
4) 抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
5) 对合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)
6)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)
7)统计输出各门课程的平均分,最高分、最低分
8)统计各门课程优秀、良好、中等、及格、不及格的人数及百分比
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
string str[5] ; //定义一个str字符串来吸收文件2.txt中重复的标题
int aNum=0; //使用全局变量定义学生的人数
struct adent //构建结构体
{
char name[10]; //姓名
int id;
int chinese;
int math;
int english;
int sum;
}a[50],temp;
//实现对文件1.txt和文件2.txt数据的合并,生成文件3.txt
void Merge()
{
char* f1 = "d:\\1.txt";
char* f2 = "d:\\2.txt";
char* f3 = "d:\\3.txt";
ifstream inFile1( f1 ); //从磁盘读取文件1.txt
ifstream inFile2( f2 ); //从磁盘读取文件2.txt
ofstream outFile( f3 ); //写入信息到文件3.xtx
outFile << inFile1.rdbuf(); //把文件1.txt中的数据写入到outfile
for(int i=0;!inFile2.eof()==true;i++) //遍历文件2.txt的所有数据
{
string str;
getline(inFile2,str); //读取第一行信息放到str中
if(i==0)continue; //跳过第一行
outFile<<str<<endl; //把后面的信息放入到文件3.txt
}
inFile1.close(); //关闭文件f1
inFile2.close();
outFile.close();
ifstream f ( f3 );
cout <<"**文件已生成,合并后数据如下**"<<endl;
cout << f.rdbuf(); //输出文件3.txt
};
//把文件3.txt中的数据读出到结构体中,便于对数据的操作
void FillStruct(adent *p)
{
int i=aNum, j=0; //这里让i = aNum,假如先添加数据,后合并,则结构体下标中人数i不是从0开始计,而是从先输入的数据的个数aNum开始的
ifstream infile("D:\\3.txt",ios::in); //以读的方式打开文件3.txt
if(!infile