学生成绩管理程序设计报告.docx
《学生成绩管理程序设计报告.docx》由会员分享,可在线阅读,更多相关《学生成绩管理程序设计报告.docx(35页珍藏版)》请在冰豆网上搜索。
学生成绩管理程序设计报告
1引言
1.1编写目的
课程设计提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼分析解决实际问题的能力。
提高适应实际,实践编程的能力。
数据结构课程设计主要是培养利用系统综合C语言和数据结构进行程序设计的能力。
同时数据结构是计算机类专业的核心课程,这门课可以为理解、开发和应用程序提供方法和技术。
同时对于学生的逻辑思维培养和程序设计思想的建立有着重要影响
本次课题设计重点掌握系统设计的基本思想方法,并培养和提升规范化软件设计的能力。
学生成绩管理系统的主要目的是建立学生成绩信息以及学生基本信息的管理平台实现学生查询成绩,修改资料功能,对成绩信息和课程学号班级的单个或批量添加修改删除等功能,方便,快捷进行查询的系统。
1.2背景
在知识爆炸的年代,科技快速发展的当今社会,各个不同种类的学生成绩系统层出不穷,然而在众多学生成绩管理系统中中,功能多样性便成为人们关注的焦点。
同时,电脑语言的种类也日新月异,各种工作的效率也相应的大幅提高。
为了方便学校对学生的管理,学生成绩管理系统对学生乃至学校教育系统的完善都有至关重要的作用。
为此,我们特开发此学籍管理信息系统。
2总体设计
2.1问题及要求
学生成绩管理系统是对教师教育教学的辅助工具,能使教师快捷方便准确的了解学生成绩的信息。
实现功能:
输入、输出、插入、删除、查找、追加、读入、显示、保存、拷贝、排序、索引、分类合计、退出。
程序简洁,使用,准确的完成功能。
2.2实现功能
(1)录入功能:
登陆之后,录入学生的学号,姓名,成绩的信息。
(2)显示功能:
显示所录入的信息。
(3)排序功能:
对学生成绩进行排序。
(4)插入功能:
向原有的信息中插入数据元素。
(5)删除功能:
删除原有信息中的数据元素。
(6)查找功能:
按名字查找信息。
(7)统计功能:
显示出成绩最高的,最低的学生信息和平均成绩。
(8)读入功能:
从文件中读入数据。
(9)保存功能:
将数据存入文件。
(10)退出功能:
进行完毕后,退出。
3算法思想及详细设计
3.1算法思想
在完成学生成绩管理的过程中,需要对结构体,指针,文件的操作,以及C语言算法的熟练掌握和较强的设计能力。
主要应用了顺序存储结构,应用数组对信息的录入和显示。
结点之间的逻辑关系没有占有额外的空间,实现了对结点的随机存储。
如果需要大幅度的修改的话可应有链式存储结构。
3.2函数调用关系
函数调用关系如图1
图1函数调用关系图
3.3模块划分
(1).声明类型,定义函数
进行函数声明,定义所有用到的函数。
#include/*引用库函数*/
#include
#include
#include
typedefstruct/*定义结构体数组*/
{
charnum[10];/*学号*/
charname[20];/*姓名*/
intscore;/*成绩*/
}Student;
Studentstu[80];/*结构体数组变量*/
intInput(Studentstud[],intn)
voidDisplay(Studentstud[],intn)
voidSort_by_num(Studentstud[],intn)
intInsert_a_record(Studentstud[],intn)
Sort_by_num(stud,n)
voidQuery_a_record(Studentstud[],intn)
voidStatistic(Studentstud[],intn)
intAddfromText(Studentstud[],intn)
voidWritetoText(Studentstud[],intn)
(2).输入成绩
应用while语句进行录入
intInput(Studentstud[],intn)/*输入若干条记录*/
{inti=0;
charsign,x[10];/*x[10]为清除多余的数据所用*/
while(sign!
='n'&&sign!
='N')/*判断*/
{printf("\t\t\t学生学号:
");/*交互输入*/
scanf("\t\t\t%s",stud[n+i].num);
printf("\t\t\t学生姓名:
");
scanf("\t\t\t%s",stud[n+i].name);
printf("\t\t\t学生分数:
");
scanf("\t\t\t%d",&stud[n+i].score);
gets(x);/*清除多余的输入*/
printf("\t\t\t是否继续添加?
(Y/N)");
scanf("\t\t\t%c",&sign);/*输入判断*/
i++;
}
图2录入学生信息
(3)输出成绩表
应用for和if语句进行成绩输出
voidDisplay(Studentstud[],intn)/*显示所有记录*/
{
inti;
printf("\t\t\t-----------------------------------\n");/*格式头*/
printf("\t\t\t学号姓名分数\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;i{
printf("\t\t\t%-16s%-15s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);
if(i>1&&i%10==0)/*每十个暂停*/
{printf("\t\t\t-----------------------------------\n");/*格式*/
printf("\t\t\t");
system("pause");
printf("\t\t\t-----------------------------------\n");
}
}
图3输出学生信息
(4)按成绩的高低进行排序
运用冒泡排序法进行排序,同时调用输出函数输出
voidSort_by_num(Studentstud[],intn)/*按学号排序*/
{inti,j,*p,*q,s;
chart[10];
for(i=0;ifor(j=0;jif(strcmp(stud[j].num,stud[j+1].num)>0)
{strcpy(t,stud[j+1].num);
strcpy(stud[j+1].num,stud[j].num);
strcpy(stud[j].num,t);
strcpy(t,stud[j+1].name);
strcpy(stud[j+1].name,stud[j].name);
strcpy(stud[j].name,t);
p=&stud[j+1].score;
q=&stud[j].score;
s=*p;
*p=*q;
*q=s;
}
Display(stu,n);
}
图4排序
(5)插入删除记录
应有gets()进行查找,调用输出函数进行输出。
intInsert_a_record(Studentstud[],intn)/*插入一条记录*/
{charx[10];/*清除多余输入所用*/
printf("\t\t\t学生学号:
");/*交互式输入*/
scanf("\t\t\t%s",stud[n].num);
printf("\t\t\t学生姓名:
");
scanf("\t\t\t%s",stud[n].name);
printf("\t\t\t学生成绩:
");
scanf("\t\t\t%d",&stud[n].score);
gets(x);
n++;
Sort_by_num(stud,n);/*调用排序函数*/
printf("\t\t\t插入成功!
\n");/*返回成功信息*/
return(n);
}
图5记录删除
(6)查找
应用姓名查找,通过while和if语句完成查找,同时输出
voidQuery_a_record(Studentstud[],intn)/*查找并显示一个记录*/
{chars[20];
inti=0;
printf("\t\t\t查找者姓名:
");/*交互式输入*/
scanf("\t\t\t%s",s);
while(strcmp(stud[i].name,s)!
=0&&iif(i==n)
{printf("\t\t\t输入失败!
\n");/*输入失败信息*/
return;
}
printf("\t\t\t学号:
%s\n",stud[i].num);/*输出该学生信息*/
printf("\t\t\t分数:
%d\n",stud[i].score);
}
图6按姓名查找
(7)输出统计信息
循环语句加判定,输出最大值最小值还有平均值
voidStatistic(Studentstud[],intn)/*输出统计信息*/
{inti,j=0,k=0,sum=0;
doubleaver;/*成绩平均值*/
for(i=0;i{
sum+=stud[i].score;
if(stud[j].score>stud[i].score)j=i;
if(stud[k].score}
aver=1.0*sum/n;
printf("\t\t\t共有记录%d\n",n);/*总共记录数*/
printf("\t\t\t最高分数:
\n");/*最高分*/
printf("\t\t\t学号:
%s姓名:
%s分数:
%d\n",stud[j].num,stud[j].name,stud[j].score);
printf("\t\t\t最低分:
\n");/*最低分*/
printf("\t\t\t学号:
%s姓名:
%s分数:
%d\n",stud[k].num,stud[k].name,stud[k].score);
printf("\t\t\t平均分%5.2f\n",aver);/*平均分*/
}
(8)从文件中读入数据
intAddfromText(Studentstud[],intn)/*从文件中读入数据*/
{inti=0,num;
FILE*fp;/*定义文件指针*/
charfilename[20];/*定义文件名*/
printf("\t\t\t所读入文件:
");
scanf("\t\t\t%s",filename);/*输入文件名*/
if((fp=fopen(filename,"rb"))==NULL)/*打开文件*/
{printf("\t\t\t打开文件失败\n");/*打开失败信息*/
printf("\t\t\t");
system("pause");
return(n);
}
fscanf(fp,"%d",&num);/*读入总记录量*/
while(i{
fscanf(fp,"%s%s%d",stud[n+i].num,stud[n+i].name,&stud[n+i].score);
i++;
}
n+=num;
fclose(fp);/*关闭文件*/
printf("\t\t\t成功!
\n");
printf("\t\t\t");
system("pause");
return(n);
}
停止
读入数据
图9从文件中记录
voidWritetoText(Studentstud[],intn)/*将所有记录写入文件*/
{
inti=0;
FILE*fp;/*定义文件指针*/
charfilename[20];/*定义文件名*/
printf("\t\t\t保存数据\n");/*输入文件名*/
printf("\t\t\t输入文件名:
");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,"w"))==NULL)/*打开文件*/
{
printf("\t\t\t打开文件失败\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n);/*循环写入数据*/
while(i{
fprintf(fp,"%-16s%-15s%d\n",stud[i].num,stud[i].name,stud[i].score);i++;
}
fclose(fp);/*关闭文件*/
printf("成功!
\n");/*返回成功信息*/
}
停止
写入数据
图10保存记录
(9)主函数
此过程用了多分支选择语句switch完成对各个被调函数的调用,并显示结果。
voidmain()/*主函数*/
{
intn=0;
for(;;)
{
switch(menu_select())/*选择判断*/
{
case1:
printf("\t\t\t输入\n");/*输入若干条记录*/
n=Input(stu,n);
break;
case2:
printf("\t\t\t显示\n");/*显示所有记录*/
Display(stu,n);
break;
case3:
printf("\t\t\t排序\n");
Sort_by_num(stu,n);/*按学号排序*/
printf("\t\t\t排序成功!
\n");
printf("\t\t\t");
system("pause");
break;
case4:
printf("\t\t\t插入\n");
n=Insert_a_record(stu,n);/*插入一条记录*/
printf("\t\t\t");
system("pause");
break;
case5:
printf("\t\t\t删除\n");
n=Delete_a_record(stu,n);/*按姓名查找,删除一条记录*/
printf("\t\t\t");
system("pause");
break;
case6:
printf("\t\t\t查找\n");
Query_a_record(stu,n);/*查找并显示一个记录*/
printf("\t\t\t");
system("pause");
break;
case7:
printf("\t\t\t统计\n");
Statistic(stu,n);/*新增功能,输出统计信息*/
printf("\t\t\t");
system("pause");
break;
case8:
printf("\t\t\t从文件中读入数据\n");
n=AddfromText(stu,n);/*新增功能,输出统计信息*/
break;
case9:
printf("\t\t\t保存数据\n");
WritetoText(stu,n);/*循环写入数据*/
printf("\t\t\t");
system("pause");
break;
case0:
printf("\t\t\t谢谢使用,再见!
\n");/*结束程序*/
printf("\t\t\t");
system("pause");
exit(0);
}
}
}
3.4程序界面效果
(1)主界面见图1
图1主界面
(2)输入数据后的界面见图2
图2输入数据后的界面
(3)排序后的界面见图3
图3排序后的界面
(4)插入记录的界面见图4
图4插入记录的界面
(5)删除记录的界面见图5
图5删除记录的界面
(6)查找记录的界面见图6
图6查找记录的界面
(7)统计后的界面见图7
图7统计后的界面
(8)读入不成功时的界面见图8
图8读入不成功时的界面
(9)保存成功时的界面见图9
图9保存成功时的界面
(10)退出界面见图10
图10退出界面
4总结
这次实习主要考察我们对结构体,指针,文件的操作,以及C语言算法的掌握,所以完成此道题目要求较强的设计能力,尤其是要有一种大局观的意识。
如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验。
菜单中的每一个选项都对应一个子程序,子程序的算法几乎囊获了所有C语言学过的技巧,下面就各个子程序中的功能进行说明:
功能1和4的算法相似,输入一条记录到结构体中去,其中有一部很关键,就是通过gets将所有的多余的字符,回车读去,否则就会出错。
功能2是显示所有的记录,通过循环输出,格式也比较重要。
功能3为按学号排序,因为学号定义成了字符数组的形式,因此在运用冒泡法进行排序的时候,要用到strcmp,strcpy等函数。
功能5为按姓名删除记录,先输入姓名,再一一比较,如果没有则返回失败信息,如果找到就将此记录都向前移一位,返回n-1。
功能6的算法在5中就已经体现了,输入姓名,一一比较。
功能7的功能,考虑到学生成绩的统计功能,可以得出所有的记录个数,最高、最低、平均分,并输出相关的学生信息等。
功能8和9是对文件的操作,提前准备好数据。
通过实习,我们更深入的了解了课本的知识,同时也学习到得了许多课本以外的知识,丰富了我的视野:
在遇到不懂或是没有头绪的时候,我们懂得了自己,主动学习得习惯,经过自己的努力的得到的知识,让我们更加珍惜,更加有成就感,同时也更加激起了我们学习的兴趣。
在这次实习中我们付出了很多,但我们收获了更多,我坚信收获是与付出成正比的,幸福的汗水流淌中孕育中我们的快乐。
感谢老师给了我们这次难得而宝贵的实习机会。
附录
源程序代码
#include/*引用库函数*/
#include
#include
#include
typedefstruct/*定义结构体数组*/
{
charnum[10];/*学号*/
charname[20];/*姓名*/
intscore;/*成绩*/
}Student;
Studentstu[80];/*结构体数组变量*/
intmenu_select()/*菜单函数*/
{
charc;
do{
system("cls");/*运行前清屏*/
printf("\t\t********欢迎使用学生成绩查询系统*********\n");/*菜单选择*/
printf("\t\t*1.输入\n");
printf("\t\t*2.显示\n");
printf("\t\t*3.排序\n");
printf("\t\t*4.插入\n");
printf("\t\t*5.删除\n");
printf("\t\t*6.查找\n");
printf("\t\t*7.统计\n");
printf("\t\t*8.读入\n");
printf("\t\t*9.保存\n");
printf("\t\t*0.退出\n");
printf("\t\t*****************************************\n");
printf("\t\t\t请选择(0-9):
");
c=getchar();/*读入选择*/
}while(c<'0'||c>'9');
return(c-'0');/*返回选择*/
}
intInput(Studentstud[],intn)/*输入若干条记录*/
{inti=0;
charsign,x[10];/*x[10]为清除多余的数据所用*/
while(sign!
='n'&&sign!
='N')/*判断*/
{printf("\t\t\t学生学号:
");/*交互输入*/
scanf("\t\t\t%s",stud[n+i].num);
printf("\t\t\t学生姓名:
");
scanf("\t\t\t%s",stud[n+i].name);
printf("\t\t\t学生分数:
");
scanf("\t\t\t%d",&stud[n+i].score);
gets(x);/*清除多余的输入*/
printf("\t\t\t是否继续添加?
(Y/N)");
scanf("\t\t\t%c",&sign);/*输入判断*/
i++;
}
return(n+i);
}
voidDisplay(Studentstud[],intn)/*显示所有记录*/
{
inti;
printf("\t\t\t-----------------------------------\n");/*格式头*/
printf("\t\t\t学号姓名分数\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;i{
printf("\t\t\t%-16s%-15s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);
if(i>1&&i%10==0)/*每十个暂停*/
{printf("\t\t\t-----------------------------------\n");/*格式*/
printf("\t\t\t");
system("pause");
printf("\t\t\t--------------