学生成绩管理系统15287.docx
- 文档编号:5607042
- 上传时间:2022-12-28
- 格式:DOCX
- 页数:40
- 大小:406.20KB
学生成绩管理系统15287.docx
《学生成绩管理系统15287.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统15287.docx(40页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统15287
软件综合课程设计
学生成绩管理系统
稀疏矩阵应用
二〇一四年六月
学生成绩管理系统
一、问题陈述
现有学生成绩信息文件1(1.txt),内容如下
姓名 学号 语文 数学 英语
张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47
…. .. .. .. …
学生成绩信息文件2(2.txt),内容如下:
姓名 学号 语文 数学 英语
陈果 31 57 68 82
李华明 32 88 90 68
张明东 33 48 42 56
李明国 34 50 45 87
陈道亮 35 47 58 77
…. .. .. .. …
试编写一管理系统,要求如下:
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()退出。
main
findout()
sortfile()
findoutstudent()
exit()
Unitedfile()
Kuaisu()
Maopao()
Xuanzhe()
derectfindoutstudent()
autofindoutstudent()
四、详细设计
1.把1.txt和2.txt文件中的内容放到3.txt文件中。
调用Unitedfile()文件,打开文件1和文件3,从1.txt中读入学生数据进结构体,把结构体中学生数据放到文件3中。
关闭文件1,从2.txt中读入学生数据进结构体,把结构体中学生数据放到文件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.chinese<60||stud.english<60||stud.math<60)
{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<<"请选择排序方法:
"< cout<<"1.选择排序"< cout<<"2.快速排序"< cout<<"3.冒泡排序"< cin>>c; 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;j stud[j].sum=stud[j].chinese+stud[j].math+stud[j].english; for(j=0;j {max1=j; sum1=stud[j].sum; for(k=j+1;k { sum2=stud[k].sum; if(sum1 {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;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;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;i {k=i; for(j=i+1;j {if(stud[j].sum>stud[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;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<<"请选择查找方法"< cout<<"1.从文件3中直接查找"< cout<<"2.在运行第三步的基础上查找"< cin>>c; cout<<"请输入学生姓名: "; if(sign1==0&&c=='2') {cout<<"请执行操作3后再执行此项操作! "< return;} switch(c) {case'1': derectfindoutstudent();//从文件3中直接查找 break; case'2': autofindoutstudent();//从结构体数据中直接查找 break;} } 4.1从文件3中直接查找 voidderectfindoutstudent(){ charNAME[30]; intflag=0; FILE*fp; fp=fopen("d: \\3.txt","r"); cin>>NAME; while(fscanf(fp,"%s%s%d%d%d%d",stud[1].name,stud[1].id,&stud[1].chinese,&stud[1].math,&stud[1].english,&stud[1].sum)! =EOF) {if(strcmp(stud[1].name,NAME)==0) {flag=1; cout<<"*******姓名*******学号*******语文*******数学*******英语*******总分*******"< cout<<""< cout< break; } } if(flag==0) cout<<"无此学生相关信息"< fclose(fp); } 4.2在运行第三步的基础上查找 voidautofindoutstudent()//从结构体数组中查找 {intn,flag=0,k; charName[30]; i=0; FILE*fp; fp=fopen("d: \\3.txt","r"); while(fscanf(fp,"%s%s%d%d%d%d",stud[1].name,stud[1].id,&stud[1].chinese,&stud[1].math,&stud[1].english,&stud[1].sum)! =EOF) {i++; }n=i-1; cin>>Name; for(k=1;k<=n;k++) {if(strcmp(stud[k].name,Name)==0) { flag=1; cout<<"*******姓名*******学号*******语文*******数学*******英语*******总分*******"< cout<<""< cout< break; } } if(flag==0) cout<<"无此学生相关信息"< fclose(fp);} 五、程序代码 #include usingnamespacestd; #defineSIZE100 typedefstruct { charname[8]; charid[2]; intchinese; intmath; intenglish; intsum; }Student; Studentstud[SIZE]; inti; intsign=0,sign1=0,sign2=0,sign3=0; voidUnitedfile() {FILE*fp,*p; Studentstud; fp=fopen("d: \\1.txt","r");//以读的方式打开1.txt p=fopen("d: \\3.txt","w");//以写的方式打开3.txt 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); }//读取1.txt的数据进入结构体中,写入3.txt,继续读取直结束 fclose(fp);//关闭文件1.txt fp=fopen("d: \\2.txt","r");//以写的方式打开2.txt 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); } 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.chinese<60||stud.english<60||stud.math<60) { fprintf(p,"%-6s%-6s%-6d%-6d%-6d\n",stud.name,stud.id,stud.chinese,stud.math,stud.english); } } fclose(fp); fclose(p); } voidxuanze()//对合并后的文件3.txt中的数据按总分降序排序 { 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++; }//从3.txt中读入数据进结构体数组stud中 fclose(fp); for(j=0;j stud[j].sum=stud[j].chinese+stud[j].math+stud[j].english; for(j=0;j {max1=j; sum1=stud[j].sum; for(k=j+1;k {sum2=stud[k].sum; if(sum1 {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;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); } 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;i { k=i; for(j=i+1;j { if(stud[j].sum>stud[k].sum) k=j;} temp=stud[i]; stud[i]=stud[k]; stud[k]=temp;} fp=fopen("d: \\3.txt","w");//将排序后的数据写入3.txt中 for(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统 15287