c语言课程设计学生成绩管理系统七大功能模块.docx
《c语言课程设计学生成绩管理系统七大功能模块.docx》由会员分享,可在线阅读,更多相关《c语言课程设计学生成绩管理系统七大功能模块.docx(25页珍藏版)》请在冰点文库上搜索。
c语言课程设计学生成绩管理系统七大功能模块
中国地质大学
本科生课程论文封面
课程名称c语言课程设计
教师姓名陈伟涛
本科生姓名
本科生学号20111000013
本科生专业安全工程
所在院系工程
类别:
本科生
日期:
2013-1-12
课程设计评语
对课程论文的评语:
平时成绩:
课程论文成绩:
总成绩:
评阅人签名:
注:
1、无评阅人签名成绩无效;
2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;
3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。
1.课程论文题目
学生成绩管理系统:
【要求】
设计“学生成绩管理系统”,实现学生成绩的录入、显示、查找、添加、保存以与成绩排序等功能模块。
要求功能选择用菜单实现,数据输入和结果输出要求用文件存放。
原始数据文件格式(具体数据自行编写):
学号姓名英语c语言高等数学平均成绩
1张三75858080
2李四............
2.程序设计思路
【思考】
(1)需求分析
由于要录入、读取、保存学生成绩信息,因而要实现文件的输入输出功能;要求用户可以查询各个学生的成绩,并且可以添加学生成绩信息等,因而要提供查找和添加功能;另外,还应该提供键盘式选择菜单以实现功能选择。
(2)总体设计
可以将这个系统的设计分为数据输入、数据显示、数据查找、成绩排序、保存数据、读取数据、数据插入7个模块。
(3)数据结构
把学生的学号、姓名、科目成绩、平均成绩作为结构体成员,存放若干学生信息用结构体数组。
3.功能模块图
【输入学生数据模块】:
【显示学生数据模块】:
【查询信息模块】:
【数据排序模块】:
【数据保存模块】:
【数据读取模块】:
【数据插入模块】:
4.
数据结构设计
把学生的学号、姓名、科目成绩、平均成绩作为结构体成员,存放若干学生信息用结构体数组。
用while循环控制功能菜单的选择,swith中设置相应的功能模块函数调用,调用完一个函数后然后返回while进行判断,结果为真则进行功能菜单的选择,如果条件为假则终止函数。
5.算法设计
(1)总体设计
把学生的学号、姓名、科目成绩、平均成绩作为结构体成员,存放若干个学生的信息用结构体数组。
将要实现的功能分为一个一个的函数模块,需实现哪个供的语句时就调用该功能语句。
而要实现菜单式的功能选择又需要while中嵌套swith语句,即调用完一个函数后进行while判断,while中的条件控制语句如果为真,则执行功能选项,然后进行swith判断,符合case几的选项就调用相应的函数,然后再进行while判断,直到不符合条件是跳出循环,结束函数。
这样就实现了函数的菜单式功能选择并得到相应的结果。
(2)各个功能模块的设计
各个函数功能模块实现不同的功能,且互相不影响。
加入需同时实现二个或两个以上的函数就同时调用函数,这与函数模块之间互相独立互不影响不矛盾,而且这样写思路清晰,程序可读性高,不易出错,能够插入你想要的模块功能而不影响其他的函数和整体。
(3)输入数据模块具体算法
首先是声明结构体,然后定义结构体数组,确定需输入学生的个数,即结构体数组的长度,数组的每一个元素都包含结构体中的所有成员,即一个学生的所有信息。
用for循环遍历分别输入每一个学生的:
学号、姓名、英语成绩、c语言成绩、高等数学成绩,计算平均成绩。
循环结束完后即完成了数据的录入操作。
代码如下:
voidinput(structStudentsdu[])
{
inti;
printf("请录入学生信息:
学号姓名英语c语言高等数学(数据之间用空格隔开):
\n");
for(i=0;i{scanf("%d%s%f%f%f",&sdu[i].num,sdu[i].name,&sdu[i].Eng,&sdu[i].c,&sdu[i].math);
sdu[i].aver=(sdu[i].Eng+sdu[i].c+sdu[i].math)/3;
}
}
(4)学生信息输出模块具体算法
输出学生数据跟输入学生信息类似,用for循环遍历结构体中的每一个成员,设置输出格式,就能完成每一个学生信息的输出显示功能。
代码如下:
voidprint(structStudentsdu[])
{inti;
for(i=0;iprintf("%3d%8s%8.1f%8.1f%8.1f%10.1f\n",sdu[i].num,sdu[i].name,sdu[i].Eng,sdu[i].c,sdu[i].math,sdu[i].aver);
}}
(5)学生信息查询模块具体算法
查询原理是,根据学生的学号查询。
定义一个变量接收要查询学生的学号,然后用for循环中嵌套if语句遍历查找结构体成员中的学号成员,如果查到相等的学号,执行输出语句,输出该学生的所有信息,最后执行break终止循环。
如果未找到匹配的学号则N值>=N,此时执行提示语句,“无该学生信息!
”,最后结束循环到功能选择菜单。
代码如下:
voidsearch(structStudentsdu[])
{
inti,num_get;printf("请输入要查询的学生的学号:
");
scanf("%d",&num_get);
for(i=0;iif(num_get==sdu[i].num){printf("%3d%8s%8.1f%8.1f%8.1f%10.1f\n",sdu[i].num,sdu[i].name,sdu[i].Eng,sdu[i].c,sdu[i].math,sdu[i].aver);
break;}
if(i>=N)
printf("无该学生信息!
\n");
}
(5)学生成绩排序模块排序集体算法
按学生平均成绩由高到低进行排序。
用选择排序的方法进行排序,排序成功后再调用输出函数,实现学生平均成成绩由高到低的信息的输出。
代码如下:
voidorder(structStudentsdu[])
{
inti,k,j;
structStudenttemp;
for(i=0;i{
k=i;
for(j=1;j{
if(sdu[i].averk=j;
}
if(k!
=i)
{
temp=sdu[i];sdu[i]=sdu[k];sdu[k]=temp;
}
}
}
(6)保存学生信息模块具体算法
首先定义一个结构体指针变量fp1,然后将文件指向打开文件的信息区,设置打开文件方式为写方式,如果打开文件失败则执行提示语句,如果打开文件成功执行fprintf函数,将结构体成员中的信息按指定的格式输出到fp1指向的文件中,关闭文件,然后返回到功能选项菜单。
代码如下:
voidsave()
{
FILE*fp1;
inti;
if((fp1=fopen("student.txt","w"))==NULL)
{
printf("cannotopenfile\n");
return;
}
fprintf(fp1,"%s",tips);
for(i=0;ifprintf(fp1,"%3d%8s%8.1f%8.1f%8.1f%10.1f\n",sdu[i].num,sdu[i].name,sdu[i].Eng,sdu[i].c,sdu[i].math,sdu[i].aver);
fclose(fp1);
}
(7)读取数据模块具体算法
与保存数据模块原理一样,首先定义文件指针变量fp2,将fp2指向要读取数据的文件,设置打开方式为读。
如果文件打开失败则执行提示语句,如果打开成功则执行下面的读入数据操作,读入完成关闭文件,然后后再调用输出函数显示读取的数据,最后返回到菜单功能选择。
代码如下:
voidread()
{
FILE*fp2;
inti;
if((fp2=fopen("student.txt","r"))==NULL)
{
printf("cannotopenthisfile!
\n");
return0;
}
for(i=0;tips[i]!
=0;i++)
fscanf(fp2,"%c",&tips[i]);
for(i=0;!
feof(fp2);i++)
{
fscanf(fp2,"%d%s%f%f%f%f",&sdu[i].num,&sdu[i].name,&sdu[i].Eng,&sdu[i].c,&sdu[i].math,&sdu[i].aver);
}
fclose(fp2);
}
(8)插入学生信息模块具体算法
插入学生信息是在原来设定的的N个学生基础上又增加学生的信息,原理为插入的第一个学生是结构体数组的第N个元素。
定义整型变量,可实现选择添加几个学生的信息,用for循环遍历输入,信息输入完成后执行提示语句,即完成了学生信息的插入功能。
代码如下:
voidinsert()
{
inti,j,temp;
printf("请输入插入的学生个数:
");
scanf("%d",&temp);
N=N+temp;
for(j=0,i=(N-temp);i//插入后是从最开始设置N个学生的第N个开始遍历输入学生数据数据,否则前面的数据被覆盖
{
scanf("%d%s%f%f%f",&sdu[N-temp+j].num,sdu[N-temp+j].name,&sdu[N-temp+j].Eng,&sdu[N-temp+j].c,&sdu[N-temp+j].math);
sdu[N-temp+j].aver=(sdu[N-temp+j].Eng+sdu[N-temp+j].c+sdu[N-temp+j].math)/3;
}
}
注意:
为了节省篇幅程序模块中的大多注释都已删除,如有不明白的地方可参考源程序中的注释!
6.程序代码
#include
structStudent//声明结构体,成员表列包括下列成员:
{
intnum;//学号
charname[20];//姓名
floatEng;//英语成绩
floatc;//c语言成绩
floatmath;//高等数学
floataver;//平均成绩
}sdu[100];//定义结构体数组,数组长度为100,数组的每一个元素都包含结构体的所有成员数据
intN=3;//定义一个全局变量N,用来控制需输入的学生的个数,为了节省时间这里设置数组长度为3
chartips[]="学号姓名英语c语言高等数学平均成绩:
\n";//定义数组,目的是当学生信息存到文件的同时将该文件存到文件中,起提示作用
intmain()
{
voidinput(structStudentsdu[]);//声明输入学生信息函数
voidprint(structStudentsdu[]);//声明输出学生信息函数
voidsearch(structStudent*p);//声明查找学生信息函数
voidorder(structStudentsdu[]);//声明学生平均成绩排序函数
voidsave();//声明保存学生信息函数函数
voidread();//声明从保存文件中读取学生信息函数
voidinsert();//声明插入学生信息函数
intmenu;//定义整型菜单选项
/*菜单功能提示性模块*/
printf("*************************************************************************\n");
printf("**\n");
printf("*输入学生数据(请输入1)输出学生信息(请输入2)*\n");
printf("**\n");
printf("**\n");
printf("**\n");
printf("*查询(请输入3)成绩排序(请输入4)*\n");
printf("**\n");
printf("**\n");
printf("**\n");
printf("*将学生信息保存到文件中(请输入5)从文件中读取学生信息(请输入6)*\n");
printf("**\n");
printf("**\n");
printf("**\n");
printf("*插入学生信息(请输入7)*\n");
printf("**\n");
printf("*************************************************************************\n");
menu=1;//菜单选项变量初始化为1,目的是进入while下面的switch语句选择
while(menu>=1&&menu<=7)//该系统要实现七个功能,每一个数字代表一个函数模块
{
printf("请输入功能选项:
");
scanf("%d",&menu);
switch(menu)
{
case1:
input(sdu);//当选择1时,调用输入学生信息函数
break;
case2:
print(sdu);//当选择2时,调用输出学生信息函数
break;
case3:
search(sdu);//当选择3时,调用查询学生信息函数
break;
case4:
order(sdu);
print(sdu);//当选择4时,调用学生平均成绩排序函数和输出学生信息函数
break;
case5:
save();//当选择5时,调用保存学生信息函数
break;
case6:
read();//当选择6时,调用读取学生信息函数和输出学生信息函数
print(sdu);
break;
case7:
insert();//当选择7时,调用插入学生信息函数
break;
default:
printf("error!
\n");//当选择不在1--7范围内时,执行该语句,终止switch语句,然后跳出循环,函数结束
break;
}
}
return0;
}
/*定义输入学生信息模块*/
voidinput(structStudentsdu[])
{
inti;
printf("*************************************************************************\n");
printf("请录入学生信息:
学号姓名英语c语言高等数学(数据之间用空格隔开):
\n");//该语句为提示性语句
for(i=0;i{
scanf("%d%s%f%f%f",&sdu[i].num,sdu[i].name,&sdu[i].Eng,&sdu[i].c,&sdu[i].math);
sdu[i].aver=(sdu[i].Eng+sdu[i].c+sdu[i].math)/3;
}
printf("********************************输入完成*******************************\n");
}//输入完学生信息后的提示语句,以便进入下一个功能选项
/*定义输出学生信息模块*/
voidprint(structStudentsdu[])
{
inti;
printf("*******************************输出结果为******************************\n");
printf("学号姓名英语c语言高等数学平均成绩\n");
for(i=0;i{
printf("%3d%8s%8.1f%8.1f%8.1f%10.1f\n",sdu[i].num,sdu[i].name,sdu[i].Eng,sdu[i].c,sdu[i].math,sdu[i].aver);
}//3d%8s%8.1f%8.1f%8.1f%10.1为输出格式,定义数据的域宽
}
/*定义查询学生信息模块*/
voidsearch(structStudentsdu[])
{
inti,num_get;//定义num_get整型变量,用来接收需查询的学生的学号
printf("请输入要查询的学生的学号:
");
scanf("%d",&num_get);
for(i=0;iif(num_get==sdu[i].num)//遍历查找,如果输入的学号与成员中的某个学号相等则执行下面的提示语句和输出该学生的信息,最后break结束循环
{
printf("*****************************所查学生信息为****************************\n");
printf("学号姓名英语c语言高等数学平均成绩\n");
printf("%3d%8s%8.1f%8.1f%8.1f%10.1f\n",sdu[i].num,sdu[i].name,sdu[i].Eng,sdu[i].c,sdu[i].math,sdu[i].aver);
break;
}
if(i>=N)
printf("无该学生信息!
\n");//当i的值>=N时则表示未查找到相应的学生的学号,则执行提示该语句
}
/*定义学生成绩排序模块*/
voidorder(structStudentsdu[])
{
inti,k,j;
structStudenttemp;
for(i=0;i{
k=i;
for(j=1;j{
if(sdu[i].averk=j;
}
if(k!
=i)
{
temp=sdu[i];sdu[i]=sdu[k];sdu[k]=temp;
}
}
printf("***********************成绩从高到低排序结果为**************************\n");//排序成功后的提示性语句
}
/*定义保存学生信息模块*/
voidsave()
{
FILE*fp1;//定义文件指针变量fp1
inti;
if((fp1=fopen("student.txt","w"))==NULL)//将fp1指向所打开的student.txt文件的信息区,打开文件方式为写
{
printf("cannotopenfile\n");//如果文件打开失败则提示该语句
return;
}
fprintf(fp1,"%s",tips);//将主函数前的提示性语句保存到打开的文件中
for(i=0;ifprintf(fp1,"%3d%8s%8.1f%8.1f%8.1f%10.1f\n",sdu[i].num,sdu[i].name,sdu[i].Eng,sdu[i].c,sdu[i].math,sdu[i].aver);
//将变量中的学生信息按预定的格式存入到打开的文件中
fclose(fp1);//保存成功后关闭文件
printf("************************已将学生的信息保存到文件中*********************\n");
}//信息保存成功的提示性语句
/*读取保存在文件中的学生信息模块*/
voidread()
{
FILE*fp2;
inti;
if((fp2=fopen("student.txt","r"))==NULL)//将fp2指针指向文件的信息区,打开方式为读
{
printf("cannotopenthisfile!
\n");//打开文件失败的提示语句
return0;
}
for(i=0;tips[i]!
=0;i++)//遍历从保存的文件中读取文件中的提示语句
fscanf(fp2,"%c",&tips[i]);//读取该提示信息是为了能够顺利读取存入的学生信息,实际输出时并未输出该提示语句
for(i=0;!
feof(fp2);i++)
{
fscanf(fp2,"%d%s%f%f%f%f",&sdu[i].num,&sdu[i].name,&sdu[i].Eng,&sdu[i].c,&sdu[i].math,&sdu[i].aver);
}//遍历读取保存在文件中的学生信息
fclose(fp2);//读取成功后关闭文件
printf("***************************从文件中读取的数据**************************\n");
}//读取成功后的提示语句
/*定义插入学生信息模块*/
voidinsert()
{
inti,j,temp;//定义temp整型变量,目的是动态选择插入学生个数
printf("请输入插入的学生个数:
");
scanf("%d",&temp);//输入需插入的学生的个数
printf("**********************************************