学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(24页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统
《高级语言程序设计》课程设计报告
题目学生成绩管理系统
专业物联网工程
年级2015级
姓名陈开松、吴竹、饶钦、彭婷
指导教师崔忠伟
6月18日至7月1日共2周
二○一六年六月
数学与计算机科学学院
课程设计任务及成绩
角色
成员姓名
承担分工任务
组长:
吴竹
吴竹
饶钦
彭婷
陈开松
陈开松:
菜单函数输出函数
彭婷:
显示函数查询函数
饶钦:
保存函数读取函数
吴竹:
插入信息成绩排序
课程设计任务
设计“学生成绩管理系统”,实现学生成绩的录入、显示、查找、添加、保存以及成绩排序等功能模块。
要求功能选择用菜单实现,数据输入和结果输出要求用文件存放。
成绩
成绩:
指导教师签字:
目录
1设计目的4
2功能描述4
3总体设计4
4程序实现5
5小结6
参考文献7
学生成绩管理系统
1设计目的
由于要录入、读取、保存学生成绩信息,因而要实现文件的输入输出功能;要求用户可以查询各个学生的成绩,并且可以添加学生成绩信息等,因而要提供查找和添加功能;另外,还应该提供键盘式选择菜单以实现功能选择。
2功能描述
1.学生成绩的录入:
即输入一个学生的所有信息。
2.显示:
完成每一个学生信息的输出显示功能
3.查找:
根据学生的学号查询。
4.添加:
插入学生信息是在原来设定的的N个学生基础上又增加学生的信息中。
5.成绩排序:
按学生平均成绩由高到低进行排序。
6.文件的保存:
将结构体成员中的信息按指定的格式输出到fp1指向的文件
7.文件的读取:
读入完成关闭文件,然后后再调用输出函数显示读取的数据
3总体设计
3.1功能模块设计
1、主控main()函数执行流程
把学生的学号、姓名、科目成绩、平均成绩作为结构体成员,存放若干学生信息用结构体数组。
用while循环控制功能菜单的选择,swith中设置相应的功能模块函数调用,调用完一个函数后然后返回while进行判断,结果为真则进行功能菜单的选择,如果条件为假则终止函数
2、添加信息模块
输入数据模块具体算法
首先是声明结构体,然后定义结构体数组,确定需输入学生的个数,即结构体数组的长度,数组的每一个元素都包含结构体中的所有成员,即一个学生的所有信息。
用for循环遍历分别输入每一个学生的:
学号、姓名、英语成绩、c语言成绩、高等数学成绩,计算平均成绩。
循环结束完后即完成了数据的录入操作。
【输入学生数据模块】:
学生信息输出模块具体算法
输出学生数据跟输入学生信息类似,用for循环遍历结构体中的每一个成员,设置输出格式,就能完成每一个学生信息的输出显示功能。
【显示学生数据模块】:
学生信息查询模块具体算法
查询原理是,根据学生的学号查询。
定义一个变量接收要查询学生的学号,然后用for循环中嵌套if语句遍历查找结构体成员中的学号成员,如果查到相等的学号,执行输出语句,输出该学生的所有信息,最后执行break终止循环。
如果未找到匹配的学号则N值>=N,此时执行提示语句,“无该学生信息!
”,最后结束循环到功能选择菜单。
【查询信息模块】:
学生成绩排序模块排序集体算法
按学生平均成绩由高到低进行排序。
用选择排序的方法进行排序,排序成功后再调用输出函数,实现学生平均成成绩由高到低的信息的输出。
【数据排序模块】:
保存学生信息模块具体算法
首先定义一个结构体指针变量fp1,然后将文件指向打开文件的信息区,设置打开文件方式为写方式,如果打开文件失败则执行提示语句,如果打开文件成功执行fprintf函数,将结构体成员中的信息按指定的格式输出到fp1指向的文件中,关闭文件,然后返回到功能选项菜单。
【数据保存模块】:
读取数据模块具体算法
与保存数据模块原理一样,首先定义文件指针变量fp2,将fp2指向要读取数据的文件,设置打开方式为读。
如果文件打开失败则执行提示语句,如果打开成功则执行下面的读入数据操作,读入完成关闭文件,然后后再调用输出函数显示读取的数据,最后返回到菜单功能选择。
【数据读取模块】:
插入学生信息模块具体算法
插入学生信息是在原来设定的的N个学生基础上又增加学生的信息,原理为插入的第一个学生是结构体数组的第N个元素。
定义整型变量,可实现选择添加几个学生的信息,用for循环遍历输入,信息输入完成后执行提示语句,即完成了学生信息的插入功能。
【数据插入模块】:
3.2数据结构设计
1、学生信息结构体
把学生的学号、姓名、科目成绩、平均成绩作为结构体成员,存放若干学生信息用结构体数组。
structStudent//声明结构体,成员表列包括下列成员:
{
intnum;//学号
charname[20];//姓名
floatEng;//英语成绩
floatc;//c语言成绩
floatmath;//高等数学
floataver;//平均成绩
}sdu[100];//定义结构体数组,数组长度为100,数组的每一个元素都包含结构体的所有成员数据
3.3函数功能描述
1、Input()
函数原型:
voidInput(structStudentsdu[])
作用:
学生成绩的录入:
即输入一个学生的所有信息。
并且求出学生成绩总分与均分。
2、Print()
函数原型:
voidPrint(structStudentsdu[])
作用:
输出显示:
完成每一个学生信息的输出显示功能
3、Search()
函数原型:
voidSearch(structStudentsdu[])
作用:
查找信息:
根据学生的学号查询。
4、Order()
函数原型:
oidOrder(structStudentsdu[])
作用:
成绩排序:
按学生平均成绩由高到低进行排序。
5、Save()
函数原型:
voidSave()
作用:
文件的保存:
将结构体成员中的信息按指定的格式输出到fp1指向的文件
6、Read()
函数原型:
voidRead()
作用:
输出显示:
完成每一个学生信息的输出显示功能
7、Insert()
函数原型:
voidInsert()
作用:
文件的读取:
读入完成关闭文件,然后后再调用输出函数显示读取的数据。
8、Menu()
函数原型:
intMenu
作用:
定义整型菜单选项,并且显示菜单功能。
表3.3.1函数功能描述表表3.3.1函数功能描述表
函数名
函数原型
功能简单描述
设计者
Input()
voidInput(structStudentsdu[])
学生成绩的录入:
即输入一个学生的所有信息。
并且求出学生成绩总分与均分。
陈开松
Print()
voidPrint(structStudentsdu[])
输出显示:
完成每一个学生信息的输出显示功能
彭婷
Searc()
voidSearch(structStudentsdu[])
查找信息:
根据学生的学号查询。
彭婷
Order()
voidOrder(structStudentsdu[])
成绩排序:
按学生平均成绩由高到低进行排序。
吴竹
Save()
voidSave()
文件的保存:
将结构体成员中的信息按指定的格式输出到fp1指向的文件
饶钦
Read()
voidRead()
文件的读取:
读入完成关闭文件,然后后再调用输出函数显示读取的数据。
饶钦
Insert()
voidInsert()
添加:
插入学生信息是在原来设定的的N个学生基础上又增加学生的信息中。
吴竹
Menu()
intMenu
定义整型菜单选项,并且显示菜单功能。
陈开松
4程序实现
4.1源码分析
#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("*************************************************************************\n");
printf("请录入学生信息:
学号姓名英语c语言高等数学(数据之间用空格隔开):
\n");
N=N+temp;//插入后的学生个数
for(j=0,i=(N-temp);i{
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;
}
printf("*******************************插入成功!
*******************************\n");//插入成功后的提示语句
}
表4.1系统设计遇到问题及解决方案
函数名
设计者
设计中出现的问题描述
解决途径
Insert(插入)
吴竹
在函数运行时不能实现动态的添加
通过小组讨论得出:
数组的长度可以用宏定义的方式定义,而可以定义一个长度较大的常数
Search(查询)
彭婷
查找不准确
通过查找资料得出:
选择学号查找。
每一个学生的学号唯一,这样查询出来的结果准确。
4.2运行结果
菜单展示:
1.输入功能展示:
2.显示功能展示:
3.查询功能展示:
4.成绩排序功能展示:
5.保存功能展示:
6.读取数据功能展示:
7.插入学生信息功能展示:
5小结
本次课程设计之前,我感觉学的东西很少,很零散,不知该怎么融合到一起,就要课程设计,是不是太难为我们了。
刚看到题目时,我一脸茫然,完全不知道如何下手、从哪里下手,没有一点思绪。
但是我明白,这是一个很好的锻炼机会。
第一周基本上都是在看书,把基本知识再熟悉一边。
到了第二周的时候,还是没有思路,就看了看老师发的例题,从这道例题上我得到了不少启发,然后我把整个程序的思