用C语言实现一个简单的学生成绩管理系统方案.docx
《用C语言实现一个简单的学生成绩管理系统方案.docx》由会员分享,可在线阅读,更多相关《用C语言实现一个简单的学生成绩管理系统方案.docx(20页珍藏版)》请在冰豆网上搜索。
用C语言实现一个简单的学生成绩管理系统方案
用C语言实现一个简单的学生成绩管理系统
摘要:
伴随着现代社会的发展,网络技术的不断进步,越来越多的管理工作都从传统的现实社会中发展到了网络上。
高校是使用计算机技术最早的单位,学校的各项管理工作也从现实生活走上了网络空间。
本文对学校的需求进行分析,通过使用C语言设计并实现学生成绩的管理,力求尽量简洁实用地解决学校对学生成绩的管理和学生对成绩的查询问题。
关键字:
C语言成绩管理系统程序设计
1引言
在信息时代,计算机以其极高的运算速度、巨大的数据存储容量,以及能准确地进行各种算术运算和逻辑运算的能力而成为现代化计算工具,并被广泛应用于社会各个领域。
计算机技术的高速发展已被认为是人类进入信息时代的标志。
成绩管理系统是计算机技术和信息时代的产物,是信息处理或数据处理的核心。
该系统开发的总体任务是实现学生成绩管理的系统化、规范化、自动化,以达到提高学生成绩管理效率的目的。
通过运用程序设计软件实现学生成绩管理中的多种功能,如学生成绩信息的添加、删除、查询、修改、显示、排序等。
该系统的设计充分利用计算机作为辅助工具,来实现学生考试成绩从传统的手工管理到计算机管理,并对提高管理效率和节约大量的人力、物力有一定的推动作用。
因此,开发这种管理软件很必要,本文将在分析系统的应用价值以及开发工具的基础上,用C语言来开发成绩管理系统。
2系统需求分析
2.1项目背景分析
在我国,各大中小学校的各类信息管理系统并非一个新的课题,但也有的学校根本就没有任何信息管理系统,特别是在西部贫困地区,学校的各类管理依然由手工操作来完成,这十分落后,效率极低,成本很大,而且极异出错。
随着社会的发展,信息化是社会进程的必然趋势,学校管理只有快,准,精才能发挥其价值。
2.2系统开发的目标与意义
(1)系统开发目标:
本系统是将现代化的计算机技术和传统的教学、教务工作相结合,按照学院的工作流程设计完成的。
为了使系统在学院的管理中发挥充分发挥其作用,实现工作过程的计算机化,提高工作效率和工作质量,现提出如下的系统开发目标:
①系统应具有实用性、可靠性和适用性。
②对系统中数据库的信息进行有效处理,防止数据错乱。
②能够按照用户选择的不同的条件进行简单查询。
③方便用户的操作,尽量减少用户的操作。
(2)系统开发的意义:
在各大中小学校,用计算机管理学校的信息已经越来越普遍了。
用计算机不但可以提高工作效率,而且还节省了许多人力物力财力。
提高了学校的管理能力,为此,用计算机来管理学校的信息,是非常必要的。
2.3项目需求分析
学校工作流程分析:
学校工作总体规划由教务人员在学生成绩管理系统中输入学生的基本信息并对其进行维护管理,包括对信息的增加、修改及对信息的各项处理操作等。
新的学年,教务人员首先编排班级,再对在校学生进行基本的信息录入,新生入学后由教务人员在管理系统中完成新学生信息的维护。
在每个学期开始,教务处根据班级的情况,以班为单位,为每个班级安排一个班主任,并对各科老师进行安排。
每举行一次考试后由任课老师对成绩进行录入。
班主任对本班的成绩汇总。
并进行排名,并对本年级各科成绩及总成绩进行排名。
教务处、班主任及任课老师跟据实际情况对录入的成绩进行维护管理,各位同学对以上录入的信息可以跟据自己的需要进行适当的查询。
3系统总体设计
3.1功能模块分析
学生成绩管理系统是对学生基本信息及成绩的管理。
开发工具主要采用TurboC2.0,主要用于对学生的学号、姓名等自然信息以及各项学科成绩进行增加、删除、修改、查询及保存到文件等操作。
系统给用户提供了一个简单的人机界面,使用户可以根据提示输入操作项,调用系统提供的管理功能。
学生成绩管理系统处理流程如图1。
图1系统处理流程图
主要功能设计描述如下:
(1)系统主控平台允许用户选择想要的操作,包括输入学生信息、显示学生信息、查询学生信息、修改学生信息、删除学生信息、计算成绩以及成绩的排序等。
通过输入相应的序号选择相应的操作。
(2)学生成绩信息用户根据提示输入学生的学号、姓名、以及三门课的成绩,如语文成绩、英语成绩、数学成绩等。
输入完成一条学生记录,可根据提示信息继续输入下一条学生记录或者继续其他的操作。
允许输入多条学生的成绩信息记录。
输入完的学生记录暂时保持在单链表中,等待下一步的操作。
(3)查询学生信息可以根据学号,姓名,总分从单链表中对学生所有的信息进行查询,如果没有查询到任何信息,系统会给出提示信息。
(4)修改学生信息首先提示用户输入要进行修改的操作的学号,如果单链表中有该学生的信息存在,则提示用户输入要修改的学生的基本信息、各科成绩等,并将修改结果重新存储在单链表中。
如果用户没有找到要修改的学生信息,系统将给出提示。
(5)插入学生信息对已经建立好的信息若还需增加,则对信息进行插入。
首先提示用户输入要进行插入的学号,然后在根据提示对用户信息进行完整输入。
输入完成后系统将对其进行保存。
(6)删除学生信息首先提示用户输入要删除学生的学号,系统根据用户输入的信息在单链表中查找,如果找到,直接删除该学生全部信息,如果没有找到,系统给出提示信息。
(7)计算各科成绩平均分该模块主要进行学生成绩的平均分计算,进入计算界面,系统自动对各科进行平均分计算。
(8)显示学生信息在选择了显示学生信息后,将刚输入的学生信息从单链表中调出来显示,如果没有数据,则提示无学生记录。
(9)学生成绩排序成绩信息输入完整后,根据学生的总分对学生从小到大进行排序,在显示学生信息的时候可以看到学生在班级或校的排列名次。
(10)操作完成后对操作结果进行保存。
运行完毕,退出系统。
3.2系统功能模块初始化准备
3.2.1编译预处理
“编译预处理”是C编译系统的一个组成部分。
在C编译系统对程序进行通常的编译(包括词法和语法分析、代码生成、优化等)之前,先对程序中这些特殊命令进行“预处理”,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码。
C语言提供的预处理功能主要有:
(1)宏定义;
(2)文件包含;(3)条件编译。
而本程序使用文件包含的预处理方式进行编译预处理:
#include/*标准库函数*/
#include/*标准输入、输出函数库*/
#include/*屏幕操作函数*/
#include/*字符串函数*/
3.2.2数据结构定义
学生成绩管理系统中的变量有学号,姓名,成绩等,这些数据类型各不相同,无法用简单数据类型来描述,显然要定义结构体类型。
由于学生人数很多,还需要定义数组或者链表。
数组的特点是数据在内存中顺序存放,长度必须事先指定,而学生的人数很难估计。
如果数组长度定的过大,会找出存储空间浪费,如果过小,又无法满足需求。
特别是进行插入,删除等操作时,代价较大而又容易出错。
用链表来管理学生成绩就显得比较妥当,它无需估计学生人数,进行插入删除等操作时代价较小。
C语言中,说明和使用“结构体”之前必须先定义,在编写程序之前应该对学生基本信息进行定义,在这个程序中,使用struct来定义结构体的类型为structlist,然后用它来定义变量,在定义结构体类型的时候定义一个next成员,该成员可以把学生结点进行链接。
并且通过类型定义typedef将已有的各种类型名定义成为新的类型标识符link,经类型定义后,link即可当做原类型名使用。
具体定义如下:
structlist{
intID;/*学号*/
charname[256];/*姓名*/
intchina;/*语文成绩*/
intenglish;/*英语成绩*/
intmath;/*数学成绩*/
floatsum;/*总分*/
intorder;/*排序*/
structlist*next;/*指向下一个学生的指针*/
};
typedefstructlistnode;/*自定义一个数据结构的结点*/
typedefnode*link;/*定义结点为link结构*/
3.3具体模块处理函数的实现
3.3.1菜单函数界面的设计
系统与用户交换的界面是通过菜单实现的,菜单按预定义格式显示主菜单界面,等待用户输入0-8中的任一数据,系统会根据用户的输入调用相应的功能模块,实现用户所要求的操作。
(1)本程序的菜单界面主要使用屏幕操作函数编写,欢迎界面设置为白底红字,菜单界面设置为绿底蓝字,在欢迎界面中单击任意键进入菜单操作界面。
整个系统都以光标定位函数gotoxy(x,y)固定光标的位置,在对其进行输出,从而可以使显示的文字都出现在设定的窗口内,窗口的界面设置使用画图工具制作周围的边框,边框的设置具体如下:
gotoxy(8,2);putch(0xc9);/*输入左上角边框*/
for(i=1;i<46;i++)putch(0xcd);/*输出上边框水平线*/
putch(0xbb);/*输出右上角边框*/
for(i=3;i<23;i++)
{gotoxy(8,i);putch(0xba);/*输出左垂直线*/
gotoxy(56,i);putch(0xba);}/*输出右垂直线*/
gotoxy(8,23);putch(0xc8);/*输出左下角边框*/
for(i=1;i<46;i++)putch(0xcd);/*输出下边框水平线*/
putch(0xbc);/*输出右下角边框*/
window(9,3,55,22);/*制作显示菜单的窗口*/
(2)菜单是由menu函数实现,主要通过printf函数显示一些文本选项如:
printf("<0>exittheprogram.\n");构建一个简单的字符界面,系统设置11个模块,用户通过输入关键字key从0-10之间选择相应的操作,函数通过switch调用各功能模块:
switch(key){case0:
exit(0);
case1:
head=init();break;
case2:
head=creat_list()break;
case3:
search_chengji(head);break;
case4:
head=modify_chengji(head,key);break;
case5:
head=delete_chengji(head,key);break;
case6:
head=insert_chengji(head,key);break;
case7:
average(head);break;
case8:
sort(head);break;}
case9:
printf_list(head);break;
case10:
save(head);break;
3.3.2功能函数设计
(1)初始化链表
学生成绩管理系统使用前要先将系统进行初始化操作,初始化函数init()就是将函数置空。
(2)创建学生信息函数
创建学习信息函数由creat_list函数实现,首先在创建链表之前先定义函数的基本信息并创建结构体指针head,pointer和new,设学号,排名为整形,名字设为字符型,语文,数学,英语成绩设为单精度类型,并对order和sum进行初始化,为head建立一个空结点,当head不为空,输入用户信息,然后将新输入的数据存于head指针。
程序如下:
head=(link)malloc(sizeof(node));/*建立一个新/空结点*/
if(head==NULL)
{printf("memoryallocatefailure!
!
\n");exit(0);}
else{
printf("pleaseinputID:
");
scanf("%d",&ID);head->ID=cID
printf("pleaseinputname:
");scanf("%s",&cname);
for(i=0;i<256;i++)head->name[i]=cname[i];
printf("pleaseinputchina:
");scanf("%d",&cchina);head->china=cchina;……
head->next=NULL;pointer=head;}
如果输入正确既while为真的时候为news新建立一个结点,提示用户如果要继续输入按1,输入0为退出。
新输入的数据存储到news指针里,然后把head和news里面的数据一起放到pointer,供下面操作时调用pointer的数据。
while
(1)
{news=(link)malloc(sizeof(node));
printf("Areyoucontinue?
");
printf("Ifcontinueenter'1',orreturnenter'0'...");/*输入1为继续,0为退出*/
scanf("%d",&cID);
if(cID==0)break;…
news->next=NULL;pointer->next=news;pointer=news;
创建函数时只能创建一次,因为创建的链表暂时存于head指针里,如果再次创建,要先保存否则系统会自动将head指针进行初始化数据将被清空,存放新创建的记录。
(3)查询学生成绩函数
查询函数search_chengji用来对学生的基本信息进行查询。
首先使用光标定位函数gotoxy(x,y)和printf函数制作查询的子菜单,菜单包括:
0.exit、1.searchbyID、2.searchbyname、3.searchbysum。
查询菜单设置完成后应用switch(){case1:
执行语句;break;}语句调用相应函数操作功能。
系统在调用函数时,调用自定义的辅助函数,按预定义格式显示查询成绩的子菜单界面。
用户输入的格式正确时使用while函数调用相应的功能函数。
①按学号查询,输入choose==1,key1为要查询的学号,查找系统中学号为key1的学生是否存在,如果key1==ID说明找到该学生,并标记flag=1,中断查询显示查询的结果,否则继续查找直到找到为止。
例如:
if(choose==1)
{while(pointer!
=NULL)
{if(pointer->ID-key1==0){flag=1;break;}
elsepointer=pointer->next;}}
②按名字查询,输入choose==2,sname为要查询学生的名字,查找系统中名字为sname的学生是否存在,如果strcmp(pointer->name,sname)==0说明找到该学生,并标记flag=1,中断查询显示查询的结果,否则继续向下查找直到找到名字为sname的学生。
③按学生的总成绩查询,输入choose==3,score为要查找学生的总分,查找系统中总分为score的学生是否存在,如果if(pointer->sum-score==0)说明找到该学生,并标记flag=1,中断查询显示查询的结果;否则继续向下查找直到找到总分为score的学生;
(4)修改学生成绩函数
修改函数modify_chengji是对之前所输入的信息如果出现错误,或需要更改时使用。
在编写之前先对函数进行定义,并把head的值赋给pointer,然后用简单的printf函数编写修改菜单的基本界面以及修改的内容。
用户根据提示输入要编辑的学号printf("pleaseinputnumberformodify:
");scanf("%d",&keynum),系统根据学号查找该学生的基本信息,如果寻找到该生,系统提示要修改的具体内容,根据用户需要选择相应内容进行修改,此功能应用switch(choose){case1:
执行语句;break;}语句执行。
printf("enter0exitmodefiy\n");
printf("enter1modefiyname\n");
printf("enter2modefiychina\n");
printf("enter3modefiyenglish\n");
printf("enter4modefiymath\n");
printf("PleaseEnteryouchoice:
");scanf("%d",&choose);
信息输入完成后,按任意键系统自动保存到pointer中,新信息将覆盖原有信息pointer->name[i]=xname[i],运行结束输出修改后的信息,返回到菜单。
如果没有找到,系统将中止执行。
while
(1){if(pointer->ID==key3)
{if(choose==1)
{for(i=0;i<256;i++)
pointer->name[i]=xname[i];break;}
elseif(choose==2){pointer->china=xchina;break;}
elseif(choose==3){pointer->english=xenglish;break;}
elseif(choose==4){pointer->math=xmath;break;}
}
}
if(head!
=NULL)
{printf("Preeanykeytosave");
getch();
printf_list(head);}
returnhead;}
(6)删除学生信息函数
删除函数delete_chengji在编写之前先定义2个结构体pointer和q,key2为要删除学生的学号,定义完成后对pointer赋初值,用j记录pointer的位置,将其设为整形并初始化。
从链表中删去一个节点只要改变链接的关系即可,既修改结点指针成员的值。
从链表中删除一个结点有三种情况:
删除链表的头结点,删除链表的中间结点,删除链表的尾节点。
具体情况如图2。
图2删除算法
当pointer的后面指针不为空:
①如果key2!
=pointer->ID,则把pointer的值赋给q,pointer指向下一个记录继续寻找学号key2。
while((pointer->next!
=NULL))
{if(pointer->ID!
=key2)
{q=pointer;j++;pointer=pointer->next;}
elsebreak;}
②如果key2==pointer->ID时,判断j是否为0,如果j为0说明pointer为头结点,则直接将结点删除,head指向他的下一指针。
if((pointer->ID==key2))
{if(j==0)
{head=head->next;free(pointer);}}
③如果判断j!
=0,则说明删除的结点不是头指针,结点位于中间,要删除结点pointer首先应该让q->next指向pointer->next,然后释放pointer。
执行完后系统将自动停留几秒然后返回主菜单。
(7)插入学生成绩
插入功能主要用于插入新的学生记录。
在insert_chengji函数先定义2个结构体指针pointer和news,pointer为原指针,news为新插入指针。
定义完成后对pointer初始化,然后为news建立新结点news=(link)malloc(sizeof(node)),定义完成后为news输入新数据。
插入的情况有两种既:
①如果pointer为空则直接将news的值赋给head输入系统并做为头指针;②如果pointer不为空则把news的值赋给pointer,运行如果正确且head不为空时显示输入的数据信息。
具体操作如图3。
图3插入算法
程序:
if(head!
=NULL)
{news=(link)malloc(sizeof(node));/*如果head不为空,为news指针建立一个结点*/
gotoxy(3,5);printf("pleaseinputstudentID:
");
scanf("%d",&news->ID);……}
while
(1)
{if(pointer==NULL)
{news->next=head;head=news;break;}/*如果pointer为空,news直接为头指针*/
if(pointer->ID==key3)
{news->next=pointer->next;pointer->next=news;break;}/*如果key3等于ID直接插入news*/
pointer=pointer->next;}
(8)计算各科成绩的平均分函数
计算函数average求各科的平均分。
首先为各科成绩进行初始化操作,如果pointer不为空,说明里面有数据,在对其求各科的总成绩,最后在进行平均分求值。
计算完成显示最后计算结果。
具体程序如下:
while
(1)
{achina=achina+pointer->china;/*求总分*/
aenglish=aenglish+pointer->english;
amath=amath+pointer->math;
cnt=++cnt;
if(pointer->next==NULL)break;
pointer=pointer->next;}/*求平均分*/
avechina=achina/cnt;
aveenglish=aenglish/cnt;
avemath=amath/cnt;}
(9)学生成绩排序
学生成绩排序函数sort用来对学生成绩进行按从大到小的顺序排序。
处理过程:
定义2个临时指针pointer、max,max用来存放pointer的数据,而pointer指向它的下一位。
再定义一个单精度变量fen、整形变量k和字符型变量s[256],分别存放成绩、学号、名字。
定义完成后把先对pointer初始化,用count来记录pointer的个数,然后从1开始对max和pointer进行比较。
比较一次count加1,在把count的值赋给pointer->order。
排序完成后到显示界面查看。
函数排序过程如下:
for(i=1;i{max=pointer=head;
for(j=i+1;j<=count;j++)
{max=pointer->next;
if(max->sum>pointer->sum)/*用总分对成绩进行排名*/
{fen=max->sum;max->sum=pointer->sum;pointer->sum=fen;/*总分的交换*/
k=max->ID;max->ID=pointer->ID;pointer->ID=k;/*学号的交换*/
fen=max->china;max->china=pointer->china;pointer->china=fen;/*语文成绩的交换*/
fen=max->math;max->math=pointer->math;pointer->math=fen;/*数学成绩的交换*/
fen=max->english;max->english=pointer->english;pointer->english=fen;/*英语成绩的交换*/
strcpy(s,max->name);strcpy(max->name,pointer->name);strcpy(pointer->name,s);}/*姓名的交换*/
pointer=pointer->ne