1、 88张辉灿 03 68 82 56王露 04 56 45 77陈东明 05 38 47. . 学生成绩信息文件2(2.txt),内容如下:陈果 31 57李华明 32 88 90 68张明东 33 48 42李明国 34 50 87陈道亮 35 47 58试编写一管理系统,要求如下:1)实现对两个文件数据进行合并,生成新文件3.txt2)抽取出三科成绩中有补考的学生并保存在一个新文件4.txt3)对合并后的文件3.txt中的数据按总分降序排序4)输入一个学生姓名后,能查找到此学生的信息并输出结果5)要求使用结构体,链或数组等实现上述要求.3本设计所采用的数据结构数据结构折半插入排序,直接排序
2、,通过调用函数查找,从结构体数组中查找。.4功能模块详细设计4.1 详细设计思想为了实现“学生成绩管理系统”,结合其设计要求及内容,有如下的详细设计思想。为了达到要求所说的界面美观,大方,故决定将文件1.txt和文件2.txt中的内容清晰的显示在界面上,便于使用者跟直观可见的看到程序的执行流程。首先,利用malloc函数在成绩文件的顶部申请空间,用于存放文件的标题。之后并将标题保存到hxy中。再次申请空间,有fscanf将文件的数据输入到文件中去。运用printf将成绩文件1.txt和2.txt打印到屏幕上。其次,新建一个文件3.txt。利用while循环和fprintf将文件1.txt和文件
3、2.txt存入文件3.txt中。并将文件3.txt打印到屏幕上。进行两种排序,即“直接插入排序”和“折半插入排序”。再次,利用while循环和if语句,查找出需要补考的学生,将需要补考的学生(即成绩中有不及格成绩的学生)存入文件4.txt中,并打印到屏幕上。最后,通过输入学生姓名,查找到所需要查找的学生。各模块实现:第一项:合并文件1.txt和文件2.txt#includestdlib.hstring.hchar hxy50; /成绩文件顶部的标题用hxy保存typedef struct student /单个学生成绩的记录 char name10; /姓名 int number; /学号 i
4、nt chinese; /语文 int math; /数学 int english; /英语 struct student *next;student,*gradelist;gradelist fileread(char *adress) /读取成绩文件 FILE * fp; if(fp=fopen(adress,r)=NULL) /打开文件 printf(文件打开出错); exit(0); gradelist file=(student *)malloc(sizeof(student); /申请空间 file-next=NULL; student * p=file; /操作指针 int n=
5、0; /循环标记,具体作用是在第一次循环时方便处理标题 while(!feof(fp) if(n=0) fgets(hxy,50,fp); /处理标题,并且文件指针移到第二行 if(n=1) /申请空间 (p-next)=(student *)malloc(sizeof(student); p=p-next; p- fscanf(fp,%s%d%d%d%d,p-name,&p-number,&chinese,&math,&english); /将文件的数据输入到链表中 n=1; if(fclose(fp) /关闭文件文件关闭失败 return file;void FilePrint(grade
6、list file) /将成绩文件打印到屏幕上 student *p=file;%sn,hxy); /打印标题 while(p-next!=NULL)%6s %2d %d %d %dnname,p-number,p-chinese,p-math,p- /循环打印第二项:生成新文件3.txt void merger() /合并文件 char * address1=1.txt,*address2=2.txt,*address3=3.txt; gradelist file1=fileread(address1),file2=fileread(address2); FILE *fp; if(fp=fo
7、pen(,w+)=NULL) /先新建一个3.txt,然后将1.txt和2.txt的内容输入到里面合并成绩文档失败,原因:建立文档出错 student *p1=file1,*p2=file2; fprintf(fp,%s /先输入标题 while(p1-,p1-name,p1-number,p1-chinese,p1-math,p1-/将文件1.txt 内容输入到文件3.txt中 p1=p1- while(p2-,p2-name,p2-number,p2-chinese,p2-math,p2- /输入2.txt内容输入到文件3.txt中 p2=p2- if(fclose(fp)第三项:直接插入
8、排序和折半插入排序if(i=1) /直接插入排序 for(int k=2;k=n;+k) if(L.rk.totalgradeL.rk-1.totalgrade) L.r0=L.rk; L.rk=L.rk-1; for(int j=k-2;L.r0.totalgradeL.rj.totalgrade;-j) L.rj+1=L.rj; L.rj+1=L.r0; if(i=2) /折半插入排序 int m; int low=1,high=k-1; while(low=high) m=(low+high)/2; if(L.r0.totalgrade=high+1; L.rhigh+1=L.r0; f
9、or(int q=n;q=1;q-) /将排序好的内容输入到3.txt,L.rq.name,L.rq.number,L.rq.chinese,L.rq.math,L.rq.english);第四项:查找学生void search(char *name) /按姓名查找 gradelist file=fileread( if(strcmp(name,p-name)=0)chinese,p- return;查无此人,请确定名字输入正确n流程图:. 4.2 核心代码/(以下为建立结构体struct student) /将1.txt 输入到文件3.txt中 /将2.txt输入到文件3.txt中void
10、extract() /抽取补考的成绩记录 char * address4=4.txt)=NULL) /新建文件4.txt抽取补考学生成绩记录建立新文件失败 gradelist file3=fileread(address3); student *p=file3; if(p-chinese)math)english)60) /补考条件void sort(int i) char * address3= /先将3.txt读入链表 if(remove() /删除3.txt删除文件出错 /学生个数)=NULL) /新建一个空的3.txt新建文件出错 /标题输入 n+; typedef struct /新
11、建一个结构数组 int totalgrade; gradenote; /成绩记录 typedef struct gradenote r100; /初始化了100了空间 grade_list; /待排序成绩表 grade_list L; p=file3; for(int t=1;tnext) /将链表的内容复制到结构数组里 strcpy(L.rt.name,p-name); L.rt.number=p-number; L.rt.chinese=p-chinese; L.rt.math=p-math; L.rt.english=p-english; L.rt.totalgrade=p-chines
12、e+p-math+p- if(i=1) /直接插入排序void search(char *name) /按姓名查找学生void main(void) int chioce; gradelist file1=fileread(),file2=fileread(现有成绩记录文件1n*n FilePrint(file1);现有成绩记录文件2n FilePrint(file2);第一步,合并成绩记录文件n merger();合并成功n system(PAUSE现有合并后的成绩记录文件3n gradelist file3=fileread( FilePrint(file3);第二步,抽取补考成绩记录n extract();现有补考成绩记录文件4n*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1