学生成绩管理系统稀疏矩阵应用二〇一四年六月软件综合课程设计学生成绩管理系统一、问题陈述现有学生成绩信息文件1(1.txt),内容如下姓名学号语文数学英语张明明01677882李成友02789188张辉灿03688256王露04564577陈东明05673847….......…学生成绩信息文件2(2.txt),内容如下:姓名学号语文数学英语陈果31576882李华明32889068张明东33484256李明国34504587陈道亮35475877….......…试编写一管理系统,要求如下:1)实现对两个文件数据进行合并,生成新文件3.txt。2)抽取出三科成绩中有补考的学生并保存在一个新文件4.txt。3)合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)。4)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)。5)要求使用结构体,链或数组等实现上述要求。6)采用多种方法且算法正确者,可适当加分。二、需求分析本系统要求实现具体的五项功能,根据提供的这五项功能,运行时系统提供了相应的功能菜单,选择不同的选项来实现相应的功能。1.采用了读文件和写文件的方式,边读边写,合并两个文件成为一个文件。2.采用结构体数组存入从文件中读入的数据,再通过对于数据中的相关成绩判断该学生是否需要补考,如果需要补考则将其信息写入另外一个文件。3.采用快速排序、选择排序、冒泡排序的方法按总分对学生数据进行排序。4.采用了二种查找的方法找到学生信息并输出。5.通过调用函数exit(0)退出程序。三、概要设计1、实现对文件1.txt和文件2.txt数据进行合并,生成新文件3.txt。调用函数Unitedfile()来实现,函数以读的方式打开1.txt文件,以写的方式打开3.txt文件,从1.txt读入一个数据并写入3.txt文件,直到遇到1.txt文件结束。关闭1.txt文件,再以读的方式打开2.txt文件,用上述方式直到遇到2.txt文件结束。关闭2.txt,3.txt文件。实现对于文件的合并。2、抽取出三科成绩中有补考的学生并保存在一个新文件4.txt。调用函数findout()来实现。函数以读的方式打开3.txt文件,以写的方式打开4.txt文件。读入3.txt文件的一个数据到结构体stud中,判断学生信息中语文、数学和英语成绩中是否有不及格的,如果有,则将数据写入4.txt中,直至遇到3.txt文件结束。3、对合并后的文件3.txt中的数据按总分降序排序。调用函数sortfile()来实现。函数提供了三种排序方法,通过调用函数kuaisu()来实现快速排序,通过调用函数xuanze()来实现选择排序,通过调用函数maopao()来实现冒泡排序。4、输入一个学生姓名后,能查找到此学生的信息并输出结果。调用函数findoutstudent()来实现。函数也提供了两种查找方法:(1)通过调用函数derectfindoutstudent()实现从文件从3.txt中逐个读入数据,再进行查找判断,如果找到所需要的数据,则查找结束,否则继续查找直至文件结束。(2)autofindoutstudent()在进行第三步的过程中,已经把3.txt中的学生数据读入了结构体数组当中,调用函autofindoutstudent()直接从结构体中进行查找。5、通过调用函数exit()退出。四、详细设计1.把1.txt和2.txt文件中的内容放到3.txt文件中。调用Unitedfile()文件,打开文件1和文件3,从1.txt中读入学生数据进结构体,把结构体中学生数据放到文件3中。关闭文件1,从2.txt中读入学mainfindout()sortfile()findoutstudent()exit()Unitedfile()Kuaisu()Maopao()Xuanzhe()derectfindoutstudent()autofindoutstudent()生数据进结构体,把结构体中学生数据放到文件3中。关闭文件2和文件3。voidUnitedfile(){FILE*fp,*p;Studentstud;fp=fopen(d:\\1.txt,r);p=fopen(d:\\3.txt,w);while(fscanf(fp,%s%s%d%d%d,stud.name,stud.id,&stud.chinese,&stud.math,&stud.english)!=EOF){fprintf(p,%-6s%-6s%-6d%-6d%-6d\n,stud.name,stud.id,stud.chinese,stud.math,stud.english);}fclose(fp);fp=fopen(d:\\2.txt,r);while(fscanf(fp,%s%s%d%d%d,stud.name,stud.id,&stud.chinese,&stud.math,&stud.english)!=EOF){fprintf(p,%-6s%-6s%-6d%-6d%-6d\n,stud.name,stud.id,stud.chinese,stud.math,stud.english);}fclose(fp);fclose(p);}2.抽取出三科成绩中有分数低于60分的学生并保存在一个新文件4.txt从3.txt中读入学生数据进结构体,判断是否有不及格的课程,如果有,则写入文件4.txt中voidfindout(){FILE*fp,*p;Studentstud;fp=fopen(d:\\3.txt,r);p=fopen(d:\\4.txt,w);while(fscanf(fp,%s%s%d%d%d,stud.name,stud.id,&stud.chinese,&stud.math,&stud.english)!=EOF){if(stud.chinese60||stud.english60||stud.math60){fprintf(p,%-6s%-6s%-6d%-6d%-6d\n,stud.name,stud.id,stud.chinese,stud.math,stud.english);}}fclose(fp);fclose(p);}3.对文件3.txt中的数据按总分以降序进行排序(三种方法:选择排序、快速排序、冒泡排序)voidsortfile(){charc;cout请选择排序方法:endl;cout1.选择排序endl;cout2.快速排序endl;cout3.冒泡排序endl;cinc;switch(c){case'1':xuanze();//选择排序break;case'2':kuaisu();//快速排序break;case'3':maopao();//直接插入排序break;}}3.1选择排序voidxuanze(){intj,k,max1,sum1,sum2,q;i=0;Studenttemp;FILE*fp;fp=fopen(d:\\3.txt,r);i=0;while(fscanf(fp,%s%s%d%d%d,stud[i].name,stud[i].id,&stud[i].chinese,&stud[i].math,&stud[i].english)!=EOF){i++;}fclose(fp);for(j=0;ji;j++)stud[j].sum=stud[j].chinese+stud[j].math+stud[j].english;for(j=0;ji-1;j++)//对结构体数组中的数据进行选择排序{max1=j;sum1=stud[j].sum;for(k=j+1;ki;k++){sum2=stud[k].sum;if(sum1sum2){max1=k;sum1=sum2;}}if(max1!=j){temp=stud[max1];stud[max1]=stud[j];stud[j]=temp;}stud[j].sum=sum1;}fp=fopen(d:\\3.txt,w);//将排序后的数据写入3.txt中for(q=0;qi;q++){fprintf(fp,%-8s%-8s%-8d%-8d%-8d%-8d\n,stud[q].name,stud[q].id,stud[q].chinese,stud[q].math,stud[q].english,stud[q].sum);}fclose(fp);}3.2快速排序voidkuaisu(){inti,low,high;FILE*fp;fp=fopen(d:\\3.txt,r);i=0;while(fscanf(fp,%s%s%d%d%d,stud[i].name,stud[i].id,&stud[i].chinese,&stud[i].math,&stud[i].english)!=EOF){stud[i].sum=stud[i].chinese+stud[i].math+stud[i].english;i++;}fclose(fp);low=0;high=i-1;QSort(low,high);//快速排序fp=fopen(d:\\3.txt,w);//将排序后的数据写入3.txt中for(intj=0;ji;j++){fprintf(fp,%-8s%-8s%-8d%-8d%-8d%-8d\n,stud[j].name,stud[j].id,stud[j].chinese,stud[j].math,stud[j].english,stud[j].sum);}fclose(fp);}3.3冒泡排序voidmaopao(){intj,k,q;Studenttemp;FILE*fp;fp=fopen(d:\\3.txt,r);i=0;while(fscanf(fp,%s%s%d%d%d,stud[i].name,stud[i].id,&stud[i].chinese,&stud[i].math,&stud[i].english)!=EOF){stud[i].sum=stud[i].chinese+stud[i].math+stud[i].english;i++;}intn=i;for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++){if(stud[j].sumstud[k].sum)k=j;}temp=stud[i];stud[i]=stud[k];stud[k]=temp;}fp=fopen(d:\\3.txt,w);//将排序后的数据写入3.txt中for(q=0;qn;q++){fprintf(fp,%-8s%-8s%-8d%-8d%-8d%-8d\n,stud[q].name,stud[q].id,stud[q].chinese,stud[q].math,stud[q].english,stud[q].sum);}fclose(fp);}4.输入一个学生姓名后,能查找到此学生的信息并输出结果。(1、从文件3中直接查找;2、在运行第三步的基本上查找)voidfindoutstudent()//提供两种查找方法{charc;cout请选择查找方法endl;cout1.从文件3中直接查找endl;cout2.在运行第三步的基础上查找endl;cinc;cout请输入学生姓名:;if(sign1==0&&c=='2'){cout请执行操作3后再执行此项操作!endl;return;}switch(c){case'1':derectfindoutstudent();//从文件3中直接查找break;case'2':autofindoutstudent();//从结构体数据中直接查找break;}}4.1从文件3中直接查找voidderectfindoutstudent(){charNAME[30];intflag=0;FILE*fp;fp=