数据结构课程设计报告课题名称学生成绩管理系统姓名学院系科班级指导老师日期2013年1月17日2目录一、问题描述………………………………………………3二、基本要求………………………………………………3三、设计目的…………………………………………………4四、概念设计…………………………………………………4五、详细设计…………………………………………………51主要数据结构…………………………………………52模块功能………………………………………………53调用关系………………………………………………5六、源程序……………………………………………………5七、测试结果…………………………………………………12八、心得体会…………………………………………………15九、参考文献…………………………………………………163学生成绩管理系统一、问题描述现有学生成绩信息文件1(1.txt),内容如下姓名学号语文数学英语张明明01677882李成友02789188张辉灿03688256王露04564577陈东明05673847….......…学生成绩信息文件2(2.txt),内容如下:姓名学号语文数学英语陈果31576882李华明32889068张明东33484256李明国34504587陈道亮35475877….......…二、基本要求试编写一管理系统,要求如下:1)实现对两个文件数据进行合并,生成新文件3.txt2)抽取出三科成绩中有补考的学生并保存在一个新文件4.txt43)对合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)4)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)5)要求使用结构体和数组实现上述要求.三、设计目的1)培养学生综合程序设计的能力,训练学生灵活应用所学数据结构知识,独立完成问题分析、总体设计、详细设计和编程实现等软件开发全过程的综合实践能力。2)巩固、深化学生的理论知识,提高编程水平,培养严谨的科学态度和良好的学习作风。为今后学习其他计算机课程打下基础。3)将书本上的理论知识和工作、生产实际有机地结合起来,从而锻炼学生分析问题、解决实际问题的能力,提高编程序能力和创新意识。四、概要设计学生成绩管理系统读取文件1读取文件2合并两文件放在文件3把补考的放在文件4退出查找文件中的人信息5五、详细设计1)主要数据结构:structstudent{charname[6];intnum;longintchi;longintmath;longinteng;longintsum;};2)模块功能:合并模板、提取模板、排序模板、查询模板、模块功能1、生成文件3:实现对两个文件数据进行合并,生成新文件3.txt;2、查看文件3:显示文件3里的所有信息;3、生成文件补考文件4:抽取出三科成绩中有补考的学生并保存在一个新文件4.txt;4、查看文件4:显示文件4里的所有信息;5、排序后的文件3:对合并后的文件3.txt中的数据按总分降序排序(冒泡、插入);6、查找学生信息:按姓名查找学生的信息并输出结果(顺序、折半);3)调用关系主函数可调用其它函数六、源程序#includestdio.h#includestdlib.hstructstudent{charname[6];intnum;longintchi;longintmath;longinteng;longintsum;};structstudentstu1[100],stu2[100],stu3[100],stu4[100],t,tmp;FILE*fp;inti,j;6voidcreat1()//对1.txt的成绩进行读取{inti;for(i=1;i=5;i++)fscanf(fp,%s%d%ld%ld%ld,stu1[i].name,&stu1[i].num,&stu1[i].chi,&stu1[i].math,&stu1[i].eng);printf(\n1.txt中学生的成绩如下:\n);printf(姓名学号语文数学英语\n);for(i=1;i=5;i++)printf(%s%d%ld%ld%ld\n,stu1[i].name,stu1[i].num,stu1[i].chi,stu1[i].math,stu1[i].eng);}voidcreat2()//对2.txt的成绩进行读取{inti;for(j=1;j=5;j++)fscanf(fp,%s%d%ld%ld%ld,stu2[j].name,&stu2[j].num,&stu2[j].chi,&stu2[j].math,&stu2[j].eng);printf(\n2.txt中学生的成绩如下:\n);printf(姓名学号语文数学英语\n);for(j=1;j=5;j++)printf(%s%d%ld%ld%ld\n,stu2[j].name,stu2[j].num,stu2[j].chi,stu2[j].math,stu2[j].eng);}voidhb()//把合并后的成绩赋值到新的结构体数组stu3[a]中{inti;for(i=1;i=5;i++){stu3[i]=stu1[i];}for(i=6;i=6+j;i++){stu3[i]=stu2[i-5];}printf(\n3.txt中所有学生的成绩名单:\n);printf(姓名学号语文数学英语总分\n);7for(i=1;i=10;i++){stu3[i].sum=stu3[i].math+stu3[i].eng+stu3[i].chi;printf(%s%d%ld%ld%ld%ld\n,stu3[i].name,stu3[i].num,stu3[i].chi,stu3[i].math,stu3[i].eng,stu3[i].sum);fprintf(fp,%s%d%ld%ld%ld%ld\n,stu3[i].name,stu3[i].num,stu3[i].chi,stu3[i].math,stu3[i].eng,stu3[i].sum);}}intextract()//把成绩中需要补考的学生成绩保存在数组stu4[j]中{intj;j=1;for(i=1;i=10;i++){if(stu3[i].math60||stu3[i].eng60||stu3[i].chi60){stu4[j]=stu3[i];j++;}}printf(\n补考学生成绩名单如下:\n);printf(姓名学号语文数学英语\n);for(i=1;ij;i++){fprintf(fp,%5s%3d%4d%4d%4\n,stu4[i].name,stu4[i].num,stu4[i].chi,stu4[i].math,stu4[i].eng);printf(%5s%3d%4d%4d%4d\n,stu4[i].name,stu4[i].num,stu4[i].chi,stu4[i].math,stu4[i].eng);}}voidsort1()//冒泡排序{for(i=1;i=10;i++){for(j=i+1;j=10;j++){8if(stu3[j].sumstu3[i].sum){t=stu3[j];stu3[j]=stu3[i];stu3[i]=t;}}}printf(\n按总分由高到低排序(冒泡)后的成绩如下:\n);printf(姓名学号语文数学英语总分\n);for(i=1;i=10;i++)printf(%s%d%ld%ld%ld%ld\n,stu3[i].name,stu3[i].num,stu3[i].chi,stu3[i].math,stu3[i].eng,stu3[i].sum);}voidsort2()//插入排序{for(i=2;i=10;i++){if(stu3[i].sumstu3[i-1].sum){tmp=stu3[i];stu3[i]=stu3[i-1];for(j=i-1;j0&&tmp.sumstu3[j].sum;j--)stu3[j+1]=stu3[j];stu3[j+1]=tmp;}}printf(\n按总分由高到低排序(插入)后的成绩如下:\n);printf(姓名学号语文数学英语总分\n);for(i=1;i=10;i++)printf(%s%d%ld%ld%ld%ld\n,stu3[i].name,stu3[i].num,stu3[i].chi,stu3[i].math,stu3[i].eng,stu3[i].sum);}voidsearch1()//名字查找方式(顺序查找){charfname[6];printf(\n请输入要查找学生的姓名:);scanf(%s,&fname);for(i=1;i=10;i++){if(!strcmp(stu3[i].name,fname)){printf(\n你所查找(名字顺序)的学生成绩如下:\n);9printf(姓名学号语文数学英语总分\n);printf(%s%d%ld%ld%ld%ld\n,stu3[i].name,stu3[i].num,stu3[i].chi,stu3[i].math,stu3[i].eng,stu3[i].sum);}}}voidsearch2()//名字查找方式(折半查找){charfname[6];intmid,low=1;inthigh=10;printf(\n请输入要查找的学生的姓名:);scanf(%s,&fname);while(low=high){mid=(low+high)/2;{if(strcmp(stu3[mid].name,fname)==0)break;elseif(strcmp(fname,stu3[mid].name)0)high=mid;elselow=mid;}}printf(\n你所查找(名字折半)的学生成绩如下:\n);printf(姓名学号语文数学英语总分\n);printf(%s%d%ld%ld%ld%ld\n,stu3[mid].name,stu3[mid].num,stu3[mid].chi,stu3[mid].math,stu3[mid].eng,stu3[mid].sum);}voidmain(){chardigit;printf(***************************系统功能菜单*******************************\n);printf(---------------------------------------------------------\n);printf(************************************************************\n);printf(*1.读取3.txt的成绩(合并)**2.读取4.txt的成绩10(补考)*\n);printf(************************************************************\n);printf(*3.按总分排序(冒泡)**4.按总分排序(插入)*\n);printf(************************************************************\n);printf(*5.按名字查找(顺序)**6.按名字查找(折半)*\n);printf(************************************************************\n);printf(*7.退出系统*\n);printf(************************************************************\n);printf(--------------------------------------------------