您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 实现对两个文件数据进行合并-生成新文件3.txt
要用的请复制,要转载的请注明,要问的免了题目如下25.学生成绩管理系统现有学生成绩信息文件1.txt,内容如下姓名学号语文数学英语张明明01677882李成友02789188张辉灿03688256王露04564577陈东明05673847学生成绩信息文件2.txt,内容如下:姓名学号语文数学英语陈果31576882李华明32889068张明东33484256李明国34504587陈道亮35475877试编写一管理系统,要求如下:1)实现对两个文件数据进行合并,生成新文件3.txt2)抽取出三科成绩中有补考的学生并保存在一个新文件4.txt3)合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)4)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)5)要求使用结构体,链或数组等实现上述要求.6)采用多种方法且算法正确者,可适当加分.源代码如下#includestdio.h#includestdlib.h#includestring.hchartop[50];//成绩文件顶部的标题用top保存typedefstructstudent//单个学生成绩的记录{charname[10];//姓名intnumber;//学号intchinese;//语文intmath;//数学intenglish;//英语structstudent*next;}student,*gradelist;gradelistfileread(char*adress)//读取成绩文件{FILE*fp;if((fp=fopen(adress,r))==NULL)//打开文件{printf(文件打开出错);exit(0);}gradelistfile=(student*)malloc(sizeof(student));//申请空间file-next=NULL;student*p=file;//操作指针intn=0;//循环标记,具体作用是在第一次循环时方便处理标题while(!feof(fp)){if(n==0){fgets(top,50,fp);//处理标题,并且文件指针移到第二行}if(n==1)//申请空间{(p-next)=(student*)malloc(sizeof(student));p=p-next;p-next=NULL;}fscanf(fp,%s%d%d%d%d,p-name,&p-number,&p-chinese,&p-math,&p-english);//将文件的数据输入到链表中n=1;}if(fclose(fp))//关闭文件{printf(文件关闭失败);exit(0);}returnfile;}voidFilePrint(gradelistfile)//将成绩文件打印到屏幕上{student*p=file;printf(%s\n,top);//打印标题while(p-next!=NULL){printf(%6s%2d%d%d%d\n,p-name,p-number,p-chinese,p-math,p-english);//循环打印p=p-next;}}voidmerger()//合并文件{char*address1=1.txt,*address2=2.txt,*address3=3.txt;gradelistfile1=fileread(address1),file2=fileread(address2);FILE*fp;if((fp=fopen(3.txt,w+))==NULL)//先新建一个3.txt,然后将1.txt和2.txt的内容输入到里面{printf(合并成绩文档失败,原因:建立文档出错);exit(0);}student*p1=file1,*p2=file2;fprintf(fp,%s,top);//先输入标题while(p1-next!=NULL){fprintf(fp,%6s%2d%d%d%d\n,p1-name,p1-number,p1-chinese,p1-math,p1-english);//输入1.txtp1=p1-next;}while(p2-next!=NULL){fprintf(fp,%6s%2d%d%d%d\n,p2-name,p2-number,p2-chinese,p2-math,p2-english);//输入2.txtp2=p2-next;}if(fclose(fp)){printf(文件关闭失败);exit(0);}}voidextract()//抽取补考的成绩记录{char*address4=4.txt,*address3=3.txt;FILE*fp;if((fp=fopen(4.txt,w+))==NULL)//新建文件4.txt{printf(抽取补考学生成绩记录建立新文件失败);exit(0);}gradelistfile3=fileread(address3);student*p=file3;fprintf(fp,%s,top);//先输入标题while(p-next!=NULL){if((p-chinese)60||(p-math)60||(p-english)60)//补考条件{fprintf(fp,%6s%2d%d%d%d\n,p-name,p-number,p-chinese,p-math,p-english);}p=p-next;}if(fclose(fp)){printf(文件关闭失败);exit(0);}}voidsort(inti){char*address3=3.txt;gradelistfile3=fileread(address3);//先将3.txt读入链表student*p=file3;if(remove(3.txt))//由于排序后的内容也要保存到3.txt,故删除3.txt{printf(删除文件出错);exit(0);}intn=0;//学生个数FILE*fp;if((fp=fopen(3.txt,w+))==NULL)//新建一个空的3.txt{printf(新建文件出错);exit(0);}fprintf(fp,%s,top);//标题先输入while(p-next!=NULL){n++;p=p-next;}typedefstruct//链表不容易操作,故而新建一个结构数组{inttotalgrade;charname[10];intnumber;intchinese;intmath;intenglish;}gradenote;//成绩记录typedefstruct{gradenoter[100];//只初始化了100了空间,学生人数超过100就不能了,懒得动态分配了}grade_list;//待排序成绩表grade_listL;p=file3;for(intt=1;t=n;t++,p=p-next)//将链表的内容复制到结构数组里{strcpy(L.r[t].name,p-name);L.r[t].number=p-number;L.r[t].chinese=p-chinese;L.r[t].math=p-math;L.r[t].english=p-english;L.r[t].totalgrade=p-chinese+p-math+p-english;}if(i==1)//直接插入排序,具体思想参考《数据结构》,严蔚敏主编{for(intk=2;k=n;++k){if(L.r[k].totalgradeL.r[k-1].totalgrade){L.r[0]=L.r[k];L.r[k]=L.r[k-1];for(intj=k-2;L.r[0].totalgradeL.r[j].totalgrade;--j){L.r[j+1]=L.r[j];}L.r[j+1]=L.r[0];}}}if(i==2)//折半插入排序,参考同上{intm;for(intk=2;k=n;++k){L.r[0]=L.r[k];intlow=1,high=k-1;while(low=high){m=(low+high)/2;if(L.r[0].totalgradeL.r[m].totalgrade)high=m-1;elselow=m+1;}for(intj=k-1;j=high+1;--j)L.r[j+1]=L.r[j];L.r[high+1]=L.r[0];}}for(intq=n;q=1;q--)//将排序好的内容输入到3.txt{fprintf(fp,%6s%2d%d%d%d\n,L.r[q].name,L.r[q].number,L.r[q].chinese,L.r[q].math,L.r[q].english);}if(fclose(fp)){printf(文件关闭失败);exit(0);}}voidsearch(char*name)//按姓名查找{gradelistfile=fileread(3.txt);student*p=file;while(p-next!=NULL){if(strcmp(name,p-name)==0){printf(%6s%2d%d%d%d\n,p-name,p-number,p-chinese,p-math,p-english);return;}p=p-next;}printf(查无此人,请确定名字输入正确\n);exit(0);}voidmain(void)//本代码由武汉工业学院计科09级,百度ID轻盈流飞雪所编,转载注明,完成作业请删除此句,不懂勿问,哥很忙{intchioce;gradelistfile1=fileread(1.txt),file2=fileread(2.txt);printf(现有成绩记录文件1\n);printf(*********************************************************\n);FilePrint(file1);printf(*********************************************************\n);printf(现有成绩记录文件2\n);printf(*********************************************************\n);FilePrint(file2);printf(*********************************************************\n);printf(第一步,合并成绩记录文件\n);merger();printf(合并成功\n);system(PAUSE);printf(现有合并后的成绩记录文件3\n);printf(*********************************************************\n);gradelistfile3=fileread(3.txt);FilePrint(file3);printf(*********************************************************\n);printf(第二步,抽取补考成绩记录\n);extract();system(PAUSE);printf(现有补考成绩记录文件4\n);printf(*********************************************************\n);gradelistfile4=fileread(4.txt);FilePrint(file4);printf(*********************************************************\n);printf(第三步,对
本文标题:实现对两个文件数据进行合并-生成新文件3.txt
链接地址:https://www.777doc.com/doc-2059965 .html