学生成绩管理系统38.docx
《学生成绩管理系统38.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统38.docx(40页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统38
软件综合课程设计
学生成绩管理系统
稀疏矩阵应用
二〇一四年六月
学生成绩管理系统
一、问题述
现有学生成绩信息文件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,st