1、include#include #include #include #include using namespace std;string str5 ; /定义一个str字符串来吸收文件2.txt中重复的标题int aNum=0; /使用全局变量定义学生的人数struct adent /构建结构体 char name10; /姓名 int id; int chinese; int math; int english; int sum;a50,temp;/实现对文件1.txt和文件2.txt数据的合并,生成文件3.txtvoid Merge() char* f1 = d:1.txt; char*
2、 f2 = d:2.txt;char* f3 = d:3.txt;ifstream inFile1( f1 ); /从磁盘读取文件1.txtifstream inFile2( f2 ); /从磁盘读取文件2.txtofstream outFile( f3 ); /写入信息到文件3.xtxoutFile inFile1.rdbuf(); /把文件1.txt中的数据写入到outfilefor(int i=0;!inFile2.eof()=true;i+) /遍历文件2.txt的所有数据 string str; getline(inFile2,str); /读取第一行信息放到str中 if(i=0)
3、continue; /跳过第一行 outFilestrendl; /把后面的信息放入到文件3.txtinFile1.close(); /关闭文件f1inFile2.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开始计,而是从先输入的数据
4、的个数aNum开始的ifstream infile(D:3.txt,ios:in); /以读的方式打开文件3.txt if(!infile) /测试是否成功打开 cerropen error!endl; exit(1); while(!infile.eof() /遍历infile,只把数据写入进去,过滤掉第一行的头标题 while(jstrj; j+; /把磁盘中的文件读出来写入到结构体中 infile pi.name pi.id pi.chinese pi.math pi.english; aNum+; i+; aNum=aNum-1; /数据读完后因光标移到下一行,等于是多读了一行,所以真
5、实的人数要比计数减一(不知道理解的对不?) infile.close(); /关闭文件 ;/抽取出三科成绩中有补考的学生并保存在一个新文件4.txtint FailList(adent *p) /*如果先开始进行的操作不是合并或者添加数据,那么其他的操作将无法进行,因为结构体中没有学生数据,返回主菜单*/ if(aNum=0) cout请先合并或者输入数据endl; return 0; ofstream in; in.open(d:4.txt,ios:trunc); /如不空则清空 in补考名单endl; /用插入器()从文件输入 for(int i=0;iaNum;i+) if(pi.chi
6、nese60|pi.english60|pi.math60) inpi.namet; ;void sum(adent *p) /求总和 for(int i=0;iaNum;i+) pi.sum=pi.chinese+pi.english+pi.math; void traversal(adent *p) /遍历输出学生数据 cout姓名t学号t语文t数学t英语t总分endl; for(int i=0;iaNum;i+) coutpi.nametpi.idtpi.chinesetpi.mathtpi.englishtpi.sumendl; /对学生总分按照从高到低的顺序排列int Sort(ad
7、ent *p) if(aNum=0) cout请先合并或者输入数据endl; return 3; sum(p); int flag=0; /设标识位 do cout请输入排序方式,输入“1”冒泡排序, 输入“2”直接插入排序flag; if(flag=1)/冒泡 for(int i=0;iaNum-1;+i) /外层循环 for(int k=i;kaNum-1;+k) /内层循环 if(pk.sum pk+1.sum) /按照从大到小的顺序进行排列 temp = pk; pk = pk+1; pk+1 = temp; traversal(p); /输出排序后的结果 return 1; if(f
8、lag=2)/直接插入 for(int i=1;i=0 & temp.sumpj.sum) /直到越界或者把哨兵的值和j的值进行比较 pj+1=pj; /如果J的值比哨兵的值小,则把j的值向后移动 j-; /j向前移,循环进行比较 pj+1=temp; /直到找到temp的值比j的值小,就把哨兵里的值放在j得后面 traversal(p); return 1; if(flag!=1 & flag!=2) cout输入错误,请重新输入; flag=3;while(flag=3);/输入一个学生姓名后,能查找到此学生的信息并输出结果int Select(adent *p) if(aNum=0) c
9、out请先合并或者输入数据endl; return 3; int i=0;coutsname; while(iaNum) if(strcmp(sname,pi.name)=0) /通过字符串的比较来搜索要查找的姓名 cout姓名t学号t语文t数学t英语endl; coutpi.nametpi.idtpi.chinesetpi.mathtpi.englishendl; return 1; else i+; if(i=aNum) cout无此学生返回主菜单endl; return 0; /while/统计输出各门课程的平均分,最高分、最低分/统计各门课程优秀、良好、中等、及格、不及格的人数及百分比
10、int Statistics(adent *p) if(aNum=0) cout请先合并或者输入数据endl; return 0; int flag=0; cout请输入您想进行统计的科目,语文输入“1”,数学输入“2”,英语输入“3”flag; if(flag=1) float tempmax=0,tempmin=100,tempsum=0,tempgood=0,tempnormal=0,tempbad=0; for(int i=0;itempmax)tempmax=pi.chinese; /找到最高分 if(pi.chinese=85)tempgood+; /找到优秀的人数 if(pi.c
11、hinese=60 &pi.chinese85)tempnormal+; /中等的人数 if(pi.chinese60)tempbad+; /不及格的人数 tempsum=tempsum+pi.chinese; /语文的总分 cout语文成绩平均分为:setprecision(4)tempsum/aNumt最高分为:tempmaxt最低分为:tempminendl; cout优秀的人数:tempgood 普通的人数:tempnormal 不及格的人数:tempbadendl; cout优秀(大于等于85)百分比为:setprecision(4)tempgood/aNum*100t中等(60到8
12、5之间)百分比为:tempnormal/aNum*100t不及格(小于60)百分比为:tempbad/aNum*100endl; if(flag=2) float tempmax=0,tempmin=100,tempsum=0,tempgood=0,tempnormal=0,tempbad=0; for(int i=0;itempmax)tempmax=pi.math; if(pi.math=85)tempgood+; if(pi.math=60 & pi.math85)tempnormal+; if(pi.math60)tempbad+; tempsum=tempsum+pi.math; c
13、out数学成绩平均分为:setprecision(4)tempsum/aNumt最高分为:tempmaxt最低分为:tempminendl; cout优秀的人数:tempgood 普通的人数:tempnormal 不及格的人数:tempbadendl; cout优秀(大于等于85)百分比为:setprecision(4)tempgood/aNum*100t中等(60到85之间)百分比为:tempnormal/aNum*100t不及格(小于60)百分比为:tempbad/aNum*100endl; if(flag=3) float tempmax=0,tempmin=100,tempsum=0,
14、tempgood=0,tempnormal=0,tempbad=0; for(int i=0;itempmax)tempmax=pi.english; if(pi.english=85)tempgood+; if(pi.english=60 &pi.english85)tempnormal+; if(pi.english60)tempbad+; tempsum=tempsum+pi.english; cout英语成绩平均分为:setprecision(4)tempsum/aNumt最高分为:tempmaxt最低分为:tempminendl; cout优秀的人数:tempgood 普通的人数:t
15、empnormal 不及格的人数:tempbadendl; cout优秀(大于等于85)百分比为:setprecision(4)tempgood/aNum*100t中等(60到85之间)百分比为:tempnormal/aNum*100t不及格(小于60)百分比为:tempbad/aNum*100endl; ;/添加数据void adda(adent *p) int aid=0,ac=0,am=0,ae=0;char aname10; cout请输入学号:aid; paNum.id=aid; cout请输入姓名:aname; strcpy(paNum.name,aname); cout请输入语文
16、成绩:ac; paNum.chinese=ac; cout请输入数学成绩:am; paNum.math=am; cout请输入英语成绩:ae; paNum.english=ae; cout录入成功endl; aNum+; /学生人数/删除数据int dela(adent *p) if(aNum=0) cout请先合并或者输入数据endl; return 3; int i=0,aid=0;cout请输入要删除学生的学号aid;while(iaNum) if(pi.id=aid) /找到要删除的id for(int j=i;jaNum-1;j+) pi=pi+1; /向前移动一位 aNum-; /
17、人数减一 cout删除成功endl; return 1; else i+; if(i=aNum) cout无此学生返回主菜单endl; return 0; /while/修改数据int altera(adent *p) if(aNum=0) cout请先合并或者输入数据endl; return 3; int aid=0,ac=0,am=0,ae=0,i=0;char aname10; cout请输入要修改学生的学号aid; while(iaNum) if(pi.id=aid) cout请输入新姓名:aname; strcpy(paNum.name,aname); cout请输入新语文成绩:ac
18、; paNum.chinese=ac; cout请输入新数学成绩:am; paNum.math=am; cout请输入新英语成绩:ae; paNum.english=ae; cout修改成功endl; return 1; else i+; if(i=aNum) cout无此学生返回主菜单endl; return 0; /while/菜单void menu()cout-学生成绩管理系统-endl;cout 1:对文件进行合并生成3.txt(在D盘下)endl;cout 2:添加数据endl;cout 3:修改数据endl;cout 4:删除数据endl;cout 5:按姓名查找某一学生成绩end
19、l;cout 6:生成需补考学生名单4.txt(在D盘下)endl; cout 7:对学生成绩进行排序endl;cout 8:进行各科成绩的统计(平均分,最高分,最低分,成绩层次分布)endl;cout 9:退出endl;cout-endl;/主函数void main()system(color 79); /系统颜色int choice;do menu(); cout请输入您需要操作对应阿拉伯数字(19)choice; switch(choice) case 1: Merge(); FillStruct(a); break; case 2: adda(a); break; case 3: al
20、tera(a); break; case 4: dela(a); break; case 5: Select(a); break; case 6: FailList(a); break; case 7: Sort(a); break; case 8: Statistics(a); break; case 9: exit(0); break; /switch while(1); #include #include #include #include using namespace std;string str5; /定义一个str字符串来吸收文件2.txt中重复的标题int aNum = 0;
21、/使用全局变量定义学生的人数struct adent /构建结构体 char name10; /姓名 int id; int chinese; int math; int english; int sum;a50, temp;/实现对文件1.txt和文件2.txt数据的合并,生成文件3.txtvoid 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
22、 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); /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1