c语言学生成绩管理系统.docx
《c语言学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《c语言学生成绩管理系统.docx(32页珍藏版)》请在冰豆网上搜索。
c语言学生成绩管理系统
摘要
利用所学过的C语言知识,采用结构化程序设计方法,设计一个学生成绩管理档案程序,该程序的主要功能为:
0将表格初始化,1建立学生成绩表格,2从表中删除原有纪录,3显示单链表中所有记录,4按照姓名查找纪录,5计算所有学生的总分和均分,6插入纪录到表中,7复制文件,8将所有学生成绩排序,9分类合计,10退出。
该系统功能完善,界面友好,短小经用,使用方便,即使是不熟悉计算机也可以自如的使用该系统。
通过上机调试运行与模拟操作,完成对学生成绩的管理,减轻管理人员的劳动强度,提高一个学校的自动化管理水平。
关键词:
学生成绩管理;结构化程序设计;调试运行;功能完善
第一章概述1
1.1项目背景1
1.2工作环境1
第二章系统分析2
2.1系统需求分析2
2.2系统功能分析2
2.2.1模块实现算法2
2.2.2进入主菜单。
3
2.2.3建立学生表格3
2.2.4从表中删除原有纪录3
2.2.5显示单链表中所有记录3
2.2.6按照姓名查找纪录3
2.2.7计算所有学生的总分和均分4
2.2.8插入纪录到表中4
2.2.9复制文件4
将所有学生成绩排序5
分类合计:
5
退出5
第三章总体设计6
3.1软件描述6
3.2设计方法6
3.3软件结构6
3.4文件及函数组成7
第五章使用说明10
第六章工作总结16
参考文献(参考书或论文或文章)17
附录源代码18
第一章概述
现今已步入高速发展的时代,电脑技术发展日新月异,时代潮流也不断变革,竞争越发激烈,时间就是金钱,但是就是在一些琐碎的事上面浪费了大量的时间,例如查询资料之类.如果我们把浪费的时间用于其他方面,势必会有更大的收益.应此需求,为使广大教师掌握更多的时间,相应的开发出此软件—学生成绩管理软件系统.而编写详细设计说明书是软件开发过程必不可少的部分,其目的是为了使开发人员在完成概要设计说明书的基础上完成概要设计规定的各项模块的具体实现的设计工作。
本软件属于绿色软件,适合任何层次的用户,因此本说明书的预期读者范围相当广。
1.1项目背景
一、软件名称
学生成绩管理
二、相关单位
主要是学校用于学校的成绩管理
1.2工作环境
A.一台586以上的微机及兼容
B.内存16MB(最好32MB内存)
C.VGA彩显一台
第二章系统分析
2.1系统需求分析
随着网络经济时代的到来,社会飞速的发展,人们的生活发生着日新月异的变化,高新技术正驱赶着人们生活的脚步,人们对工作生活的要求也日益提高,特别是计算机的应用及普及到经济和社会生活的各个领域。
使原本的旧的管理方法越来越不适应现在社会的发展。
许多人还停留在以前的手工操作,随着各个学校的规模增大,有关学生成绩管理工作所涉及的数据量越来越大,有的学校不得不靠增加人力、物力来进行学生成绩管理,但手工管理具有效率底、,这大大地阻碍了人类经济的发展。
为了适应现代社会人们高度强烈的时间观念,用计算机对学校学生成绩进行管理已逐步取代了传统的管理方式。
学生成绩查询系统对学校加强学生成绩管理有着极其重要的作用。
由于各个大学都在持续扩招,学生的数量日益庞大,传统的手工成绩管理不仅工作量大,而且容易出现问题。
从而需要对学生成绩管理等工作方面提高精确度。
经过我对学校情况和师生需求的的具体分析,初步设计了一套有关“学生成绩管理”的程序,希望可以帮助学校改善以往需求紧张的管理系统,为广大师生提供方便,节省时间,提高工作效率,从而树立良好的办学形象。
学校具体需求分析
学生:
对各科成绩的查询及查看本班成绩排名。
老师:
输入并维护所教科目的学生成绩,计算本科的成绩排名、本科成绩在班上的排名。
班主任:
输入并维护本班的基本信息,对本班的各科成绩汇总,计算各科成绩的总分,排名,本班平均分等需求。
输出学生的基本信息,各科的成绩及各科成绩的部分,各科成绩的排名,总分的排名情况。
教务处:
学校全体成员的信息管理,对考试科目,时间及对所考科目的编号等进行具体的管理,并对任课老师,班主任等输入的信息进行存库,对学生的信息进行必要的维护,可打印学生的所有信息。
2.2系统功能分析
在本章中,我使用模块等分析法进行系统功能分析。
按任意键进入主菜单
2-1进入主菜单模块
2.2.3建立学生表格,算法实现模式,如图2-2所示:
N返回主模块
Y
N返回主模块
Y
Y任意键返回主模块
2-2建立学生表格模块
2.2.4从表中删除原有纪录模块,算法,如图2-3所示:
N返回主模块
Y
N返回主模块
Y
Y任意键返回主模块
2-3删除原有纪录模块
N返回主模块
Y
N返回主模块
Y
Y任意键返回主模块
2-4显示纪录模块
N返回主模块
Y
N返回主模块
Y
Y任意键返回主模块
2-5查找模块
N返回主模块
Y
Y任意键返回主模块
2-6计算模块
N返回主模块
Y
N返回主模块
Y
Y任意键返回主模块
2-7插入纪录模块
N返回主模块
Y
N返回主模块
Y
Y任意键返回主模块
2-8复制模块
N返回主模块
Y
Y任意键返回主模块
2-9排序模块
N返回主模块
Y
Y任意键返回主模块
2-10分类合计模块
。
第三章总体设计
3.1软件描述
该程序的主要功能为:
0将表格初始化,1建立学生成绩表格,2从表中删除原有纪录,3显示单链表中所有记录,4按照姓名查找纪录,5计算所有学生的总分和均分,6插入纪录到表中,7复制文件,8将所有学生成绩排序,9分类合计,10退出。
另外,该程序主要调用了:
I/O函数(stdio.h),其他说明(stdib.h),字符串函数(string.h),屏幕操作函数(conio.h),内存操作函数(mem.h),字符操作函数(ctype.h),动态地址分配函数(alloc.h),定义常数。
3.2设计方法
本软件采用传统的软件开发生命周期的方法,采用自定向下,逐步求精的结构化的软件设计方法。
3.3软件结构
根据以上模块可得到总体结构系统才层次图,如图3-1所示:
3-1总体结构系统层次图
3.4文件及函数组成
如表1-1所示:
表3-1主要函数
函数名
功能
Init()
初始化函数
Create()
创建链表
Delete(STUDENT*h)
删除记录
Print(STUDENT*h)
显示所有记录
Search(STUDENT*h)
查找学生成绩
Computer(STUDENT*h)
计算学生的总分和均分
Insert(STUDENT *h)
插入记录
Copy()
复制文件
Sort(STUDENT *h)
按姓名开头字母排序
Total(STUDENT*h)
分类合计
Menu_select()
主菜单函数
1.显示内存动态记录数据函数
函数原型:
voidcreate()
功能:
显示内存里的记录
参数:
记录数组和记录条数
要求:
报告是否有记录及记录成绩内容
2.输入信息函数
函数原型:
intinputs(char*prompt,char*s,intcount)
功能:
添加记录
参数:
结构体数组.
要求:
如果内存已经存在记录.则将新记录追加在记录尾部,如果还没有建立记录链表,则建立链表并从尾部开始追加记录.
3.删除记录函数
函数原型:
intdelete(STUDENT*h)
功能:
删除内存链表中的指定结点
参数:
记录数组和记录条数,成绩
要求:
给出相关信息
4.按序号显示记录函数
函数原型:
voidprint(STUDENT*h)
功能:
根据用户需求输出记录
要求:
判断内存中记录的序号与输入的是否相等,如果相等则输出,否则关闭文件
5.查找函数
函数原型:
intsearch()
功能:
根据用户需要输出记录
参数:
记录数组和记录成绩以及姓名s
要求:
判断内存中记录的名字与输入的是否相等,如果相等则输出,否则提前结束
6.计算函数
函数原型:
intComputer(STUDENT*h)
功能:
根据用户需要计算总分和学生平均成绩
参数:
记录数和计算
要求:
内存中记录数进行相加和平均数运算
7.插入记录函数
函数原型:
intinsert(STUDENT*h)
功能:
根据用户指定将信息插入特定位置
参数:
结构体数组和记录数
要求:
输入信息
8.复制文件函数
函数原型:
voidcopy()
功能:
复制记录
要求:
判断所要文件是否能打开,打不开则退出,能打开则读出文件中记录并复制
9.排序函数
函数原型:
voidsort(STUDENT*h)
功能:
将记录进行排序
参数:
结构体数组和记录数
要求:
比较内存中记录,判断大小并进行交换,交换后显示排序成功
10.分类合计函数
函数原型:
voidTotal(STUDENT*h)
功能:
分类存放
参数:
结构体数组和记录数
要求:
在内存中分类存放各班不同的记录数和计算后得到的记录数
11.菜单函数
函数原型:
menu_select()
功能:
控制程序
要求:
管理菜单命令并完成初始化
第四章程序调试
在设计该程序的时候我采用了结构化程序方法编辑,并在源代码的基础上添加了中文注释。
但是在该系统的编写过程中仍然有许多错误,主要的有:
注释文字的排版,定义错误,句式的语法错误。
在完善程序时,我将源代码先打印下来反复的捉摸和研究,力图在上机运行时先改正一些低级错误.如缺少”;”之类.在仔细检查之后,将源代码上机调试—进行编译,在编译和连接过程中发现错误,屏幕上显示了出错信息,根据提示找到出错的位置,加以改正……直到顺利显示我预期的。
1、首先,在本次调试过程中我碰到了在上机前根本没有想到的错误:
在注释的时候,注释文字应写在一起中间不能有中断,不能再其中包含c语言的语句。
否则会引起错误,例如格式不正确或是多了字符等。
2、缺少变量定义或是定义位置不正确;
由于该程序相对来讲稍有些长,前后有些变量很难联系起来,但是在错误信息的提示下一般还是很是可以找到。
不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。
为减少这样的错误我后来还是用不同的变量名来表示,结果引起的那些错误解决了。
3、句式的语法错误;
大多的语法错误在通过书本参考下能够修改。
主要是平时看书不仔细、不太注意而产生的。
如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式与使用的情况不太注意而造成不匹配;还有漏掉形参的定义是值不能传递等等。
这些语法错误有信息框的提示一般是能够排除的。
编译、连接的成功并不意味着程序的最终成功。
逻辑上的错误机器不易检查出来,这时需要对数据结果进行分析。
这种错误的查找是最难的,需要编程序的人有相当的耐心和细心去把问题找出来。
这也是本次程序编辑过程中碰到的最大的难题。
往往运行之后得不到另人满意的结果,此时解决的方法一则可以用“分段检查”的方法,在程序的不同位置设几个printf函数语句,输出有关变量的值,逐段往下检查,或用debug进行调试,对检查出的错误进行修改,当调试完毕将设置的printf都删去。
若在程序中找不到问题,则再来考虑算法是否逻辑严谨,再进行修改。
如此循环往复,直到最后程序运行成功。
在本次程序编辑过程中,我就是常遇到编译能通过,能够运行程序,但是总在输入、删除等操作完之后再想去看数据文件中存在的数据记录的时候,却一条记录也显示不出来,我怀疑是哪个对方对n变量的定义或使用出错了,于是在每个主要函数的操作过程中添加了printf语句用来显示n的变化,例如在执行某个函数前添加插入语句显示n的起始值,在执行完该个函数后再添加插入语句显示此时n的结果值,观察n的变化是否正确,如果错误了,也就说明该函数编写过程有错。
诸如这样的调试方法,不断缩小检查范围,最后将错误找到,进行修改。
所以到最后我找到了错误,及时改正,终于把程序完成了,一切功能显示正常。
以上是调试的全过程。
第五章使用说明
首先进入界面时,根据屏幕上的提示pressanykeyentermenu……即是按任意键均可进入主菜单,考虑到学生成绩大多由老师输入和调用,所以这里对使用者没有要求也就没有添加密码的必要。
在进入主菜单时可以看到这样的画面,如图4-1所示:
4-1主菜单
从0到10共有11个功能键。
此时应该根据提示”Enteryourchoice(0-10):
”选择自己需要用的功能,例如:
在提示后按1再回车(Enter键)的话就会进入编辑。
在主菜单上的11个功能分别是:
0initlist将表格初始化:
使用0后,系统会将原有的一切记录全部删去,所有的恢复到位使用时。
一切在主菜单上完成。
1Enterlist建立学生成绩表格:
使用1后,在界面上会要求你输入学号no,姓名name和成绩score1、2、3。
如果已经输入完毕只要在下一个no后输入!
再按回车键即可,此时就会回到主菜单,如图4-2所示:
4-2输入界面
2Deletearecordfromlist从表中删除原有纪录:
使用2后,会进入子界面,提示语会告诉你输入你要删除的信息的学生的学号,然后会出现“listno**student”这就表示删除成功,如果没有这个学生的信息则会跳过步执行但是还是会输出上述的句子,如图4-3所示:
4-3显示删除界面
3printlist显示单链表中所有记录:
如果是在执行完5以后,那么总分和均分一栏就不会空白,而是会输出计算后的数据,如图4-4所示:
4-4打印数出界面
4Searchrecordfromlist按照姓名查找纪录:
根据提示”pleaseenterstudents’nameforsearch”输入学生的拼音拼写的姓名,如图4-5所示:
4-5查找界面
5computethescore计算所有学生的总分和均分:
按5后,系统会自动计算然后输出结果,如图4-6所示:
4-6计算界面
6insertrecordtolist插入纪录到表中:
使用6时,要输入你想插到哪一个学生前,只需输入他的学号。
然后,在提示语的提醒下输入要插入学生的学号,姓名和成绩。
然后再进入打印界面,此时可以看到已经将09插入到02前。
如图4-7所示:
4-7插入后界面
7copythefiletonewfile复制文件:
执行完7后,会根据使用者输入的地址和命名生成文本文档存储。
8sorttomakenewfile将所有学生成绩排序:
在完成后,会出现”sortsuccess!
”
如果想看结果的话,可以在执行完这一步后在执行3,这样就可以看到排序后的结果。
9totalonnomber分类合计,如图4-9所示:
4-9分类合计界面
10Quit退出模块,在主菜单上实行。
如图4-10所示:
4-10退出界面
第六章工作总结
在这次的编程过程中,我不仅在C语言的学习上有了很大的提高而且也培养了我的毅力、耐心、决心和学习能力。
短短的两周,我自己都不敢相信可以弄好一个对我而言一个大而功能相对而言还可以的程序。
但是不得不说在这个程序中仍然有许多的缺陷,诸如:
计算均分时只能计算三门的总均分;无法将文件以文档或是表格形式存储;排序、删除等必须以一种形式先查找学生信息然后再实行操作并不多样化。
总之,在这个过程中我还面对了程序无法执行,改错时怎么也找不到错误在哪里的困境;但我还是在老师和同学们的帮助下完成了这个程序。
可以说我的心情是相当的激动,相信有了这样的经历后我能够更加娴熟的面对各种情况。
注:
课程设计以来的感想、心得、经验、收获、有待改进的方面。
不超过一页。
参考文献(参考书或论文或文章)
[1]黄明等.21世纪进阶辅导C语言程序设计.大连理工大学出版社,2005:
45—208
[2]马靖善等.C语言程序设计.清华大学出版社,2005:
23—145
附录源代码
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#include"mem.h"
#include"ctype.h"
#include"alloc.h"
#defineN3
typedefstructz1
{
charno[11];
charname[20];
intscore[N];
floatsum;
floataverage;
intorder;
structz1*next;
}STUDENT;
STUDENT*init();
STUDENT*create();
STUDENT*delete(STUDENT*h);
voidprint(STUDENT*h);
voidsearch(STUDENT*h);
voidsave(STUDENT*h);
STUDENT*load();
voidcomputer(STUDENT*h);
STUDENT*insert(STUDENT*h);
voidappend();
voidcopy();
STUDENT*sort(STUDENT*h);
voidtotal(STUDENT*h);
intmenu_select();
main()
{
inti;
STUDENT*head;
head=init();
clrscr();
for(;;)
{
switch(menu_select())
case0:
head=init();break;
case1:
head=create();break;
case2:
head=delete(head);break;
case3:
print(head);break;
case4:
search(head);break;
case5:
computer(head);break;
case6:
head=insert(head);break;
case7:
copy();break;
case8:
head=sort(head);break;
case9:
total(head);break;
case10:
exit(0);
}
}
}
menu_select()
{
char*menu[]={"***************MENU***************",
"0.initlist",
"1.Enterlist",
"2.Deletearecordfromlist",
"3.printlist",
"4.Searchrecordonname",
"5.computethescore",
"6.insertrecordtolist",
"7.copythefiletonewfile",/*复制文件*/
"8.sorttomakenewfile",/*排序*/
"9.totalonnomber",/*分类合计*/
"10.Quit"};/*退出*/
chars[3];
intc,i;
gotoxy(1,25);
printf("pressanykeyentermenu......\n");
getch();
clrscr();
gotoxy(1,1);
textcolor(BLUE);
textbackground(WHITE);
gotoxy(10,2);
putch(0xc9);
for(i=1;i<44;i++)
putch(0xcd);
putch(0xbb);
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba);
gotoxy(54,i);putch(0xba);
}/*输出右垂直线*/
gotoxy(10,20);putch(0xc8);
for(i=1;i<44;i++)
putch(0xcd);
putch(0xbc);
window(11,3,53,19);
clrscr();
for(i=0;i<16;i++)
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(GREEN);
window(1,1,80,25);
gotoxy(10,21);
do{
printf("\nEnteryouchoice(0~10):
");
scanf("%s",s);
c=atoi(s);
}while(c<0||c>10);
returnc;
}
STUDENT*init()
{
returnNULL;
}
STUDENT*create()
{
inti;ints;
STUDENT*h=NULL,*info;
for(;;)
{
info=(STUDENT*)malloc(sizeof(STUDENT));
if(!
info)
{
printf("\noutofmemory");
returnNULL;
}
inputs("enterno:
",info->no,11);
if(info->no[0]=='!
')break;
inputs("enterstudents'name:
",info->name,20);
printf("pleaseinput%dscore\n",N);
s=0;
for(i=0;ido{
printf("score%d:
",i+1);
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)
printf("Dataisbad,repeatinput\n");
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i];
}
info->sum=s;
info->average=(float)s/N;
info->order=0;
info->next=h;
h=info;
}
return(h);
}
inputs(c