学生成绩管理系统.docx
- 文档编号:14256843
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:45
- 大小:748.91KB
学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(45页珍藏版)》请在冰点文库上搜索。
学生成绩管理系统
嵌入式程序课程设计报告
题目学生成绩管理系统
院系
专业班级
学生姓名
学生学号
指导教师
2010年12月28日
目 录
湖北经济学院课程设计任务书I
目 录II
1.设计目的1
1.1概述1
1.2功能描述1
2.总体设计2
2.1主控main()函数执行流程2
2.2输入记录模块3
2.3查询记录模块3
2.4更新记录模块4
2.5统计记录模块5
2.6输出记录模块5
3.详细设计5
3.1数据结构设计5
3.2函数功能描述6
4.调试与测试8
5.源程序清单和执行结果9
5.1源程序清单9
5.2执行结果27
课程设计体会32
参考文献33
1.设计目的
1.1概述
在一个学期的C语言学习及后续的嵌入式程序课程设计中,我们对这门应用最广泛的计算机高级编程语言有了逐步的认识和掌握。
通过本课程设计,使自己更加系统地理解C语言的基本概念,熟练掌握利用C语言进行程序设计的原理和方法,分析和解决实际应用问题,进一步加深巩固所学专业的基础理论知识,理论联系实际,进一步培养自己分析问题解决问题的能力。
此项目主要考察我们对结构体、单链表、文件操作,对C语言基本知识点的掌握以及对程序的调试。
所以完成项目并不简单,需要我们耐心地应对设计过程中出现的每一个问题。
1.2功能描述
成绩管理系统主要由以下五大功能模块组成,如图1所示。
(1)输入记录模块。
输入记录模块主要完成将数据存入单链表中的工作。
在此成绩管理系统中,记录可以从二
制形式存储的数据文件中读入,也可以从键盘逐个输入学生记录。
学生记录由学生的基本信息和成绩信息字段构成。
当从数据文件读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复制到单链表中。
(2)查询记录模块。
查询记录模块主要完成在单链表中查找满足相关条件的学生记录。
在此学生管理系统中,用户可以按照学生的学号或姓名在单链表中进行查找。
若找到该学生的记录,则返回指向该学生记录的指针。
否则,返回一个值为NULL的空指针,并打印出未找到该学生记录的提示信息。
(3)更新记录模块。
更新记录模块主要完成对学生记录的维护。
在此成绩管理系统中,它实现了对学生记录的修改、删除、插入和排序操作。
一般而言,系统进行了这些操作以后,需要将修改的数据存入源程序文件。
(4)统计记录模块。
统计记录模块主要完成对各门功课最高分和不及格人数的统计。
(5)输出记录模块。
输出记录模块主要完成两个任务。
第一,它实现对学生记录的存盘操作,即将单链表中的各节点中存储的学生记录信息写入数据文件中。
第二,它将实现将单链表中存储的学生记录信息以表格的形式在屏幕上打印出来。
图1学生成绩管理系统功能模块图
2.总体设计
2.1主控main()函数执行流程
本学生成绩管理系统执行流程如图2所示。
它先以可读写的方式打开数据文件,此文件默认为“c:
\student”,若该文件不存在,则新建此文件。
当打开文件操作成功后,从文件中一次读出一条记录,添加到新建的单链表中,然后执行显示主菜单和进入主循环操作,进行按键判断。
在判断键值时,有效的输入为0至9之间的任意数值,其他输入都被视为错误按键。
若输入为0(即变量select=0),它会继续判断是否在对记录进行了更新操作后进行了存盘操作,若未存盘,则全局变量saveflag=1,系统会提示用户是否要进行数据存盘操作,用户输入Y或y,系统会进行存盘操作。
最后,系统执行退出学生成绩管理系统的操作。
若选择1,则调用Add()函数,执行增加学生记录操作;
若选择2,则调用Del()函数,执行删除学生记录操作;
若选择3.,则调用Qur()函数,执行查询学生记录操作;
若选择4,则调用Modify()函数,执行修改学生记录操作;
若选择5,则调用Insert()函数,执行插入学生记录操作;
若选择6,则调用Tongji()函数,执行统计学生记录操作;
若选择7,则调用Sort()函数,执行按降序排序学生记录的操作;
若选择8,则调用Save()函数,执行将学生记录存入磁盘中的数据文件的操作;
若选择9,则调用Disp()函数,执行将学生记录以表格形式打印输出至屏幕的操作;
若输入0~9以外的数值,则调用Wrong()函数,给出按键错误的提示。
图2主控函数执行流程图
2.2输入记录模块
输入记录模块主要实现将数据存入单链表中。
这部分的操作较为简单。
当从数据文件中读出记录时,它调用了fread(p,sizeof(Node),1,fp)文件读取函数,执行一次从文件中读取一条学生成绩记录信息存入指针变量p所指的节点中的操作,并且这个操作在main()函数中执行,即当成绩管理系统进入显示菜单界面时,该操作已经执行了。
若该文件中没有数据,系统会提示单链表为空,没有任何学生记录可操作,此时,用户应选择1,调用Add(l)函数,进行学生记录的输入,即完成在单链表1中添加节点的操作。
值得一提的是,这里的字符串和数值的输入分别采用了函数来实现,在函数中完成输入数据任务,并对数据进行条件判断,直到满足条件为止,这样大大减少了代码的重复和冗余,符合模块化程序设计的特点。
2.3查询记录模块
查询记录模块主要实现了在单链表中按学号或姓名查找满足相关条件的学生记录。
在查询函数Qur(l)中,l为指向保存了学生成绩信息的单链表的首地址的指针变量。
为了遵循模块化编程的原则,我们将在单链表中进行的指针定位操作设计成了一个单独的函数Node*Locate(Linkl,charfindmess[],charnameornum[]),参数findmess[]保存要查找的具体内容,nameornum[]保存要查找的字段(值为字符串类型的num或者name),若找到该记录,则返回指向该节点的指针;否则,返回一个空指针。
2.4更新记录模块
此模块主要实现了对学生记录的修改、删除、插入和排序操作。
因为学生记录是以单链表的结构形式储存的,所以这些操作都在单链表中完成。
下面分别介绍这4个功能模块。
(1)修改记录
修改记录操作需要对单链表中目标节点的数据域中的值进行修改,它分两步完成。
第一步,输入要修改的学号,输入后调用定位函数Locate()在单链表中逐个对节点数据域中的学号字段的值进行比较,直到找到该学生的学生记录;第二步,若找到该学生记录,修改除学号之外的各字段的值,并将存盘标记变量saveflag置1,表示已经对记录进行了修改,但还未执行存盘操作。
(2)删除记录
删除记录操作完成删除指定学号或姓名的学生记录,它也分两步完成。
第一步,输入要删除的学号或姓名,输入后调用定位函数Locate()在单链表中逐个对节点数据域中学号或姓名字段的值进行比较,直到找到该学生学号或姓名的学生记录,返回指向该学生记录的节点指针;第二步,若找到该学生记录,将该学生记录所在节点的前驱结点的指针域指向目标节点的后继结点。
(3)插入记录
插入记录完成在指定学号的随后位置插入新的学生记录。
首先,它要求用户输入某个学生的学号,新的记录将插入在该学生记录之后;然后,提示用户输入一条新的学生记录的信息,这些信息保存在新节点的数据域中;最后,将该节点插入在指定位置学号之后。
它的具体插入执行过程如图3所示,图中q为位置学号所在节点的指针变量,其中,p为q所指节点的后继结点的指针变量,q->next=p,指针变量i指向新纪录所在的节点,为插入节点i,依次执行的操作为:
i->next=q->next;q->next=i。
图3单链表中插入学生记录节点示意图
(4)排序记录
有关排序的算法有很多,如冒泡排序、排入排序等。
针对单链表结构的特点,我们采用插入排序算法实现按总分的从从高到低对学生成绩进行排序,排序完成之后,即可按顺序给名次字段赋值。
在单链表中,实现插入排序的基本步骤如下。
新建一个单链表l,用来保存排序结果,其初值为待排序单链表中的头结点。
从待排序链表中取下一个节点,将其总分字段值与单链表l中的各节点中总分字段的值进行比较,直到在链表l中找到总分小于它的节点。
若找到此节点,系统将待排序链表中取出的节点插入此节点之前,作为其前驱。
否则,将取出的节点放在单链表l的尾部。
重复第
步,直到从待排序链表取出的节点的指针域为NULL,即此节点为单链表的尾部节点,排序完成。
2.5统计记录模块
该模块的实现比较简单,它主要通过循环读取指针变量p所指的当前节点的数据域中各字段的值,并对各个成绩字段进行逐个判断的形式,完成单科最高分学生的查找和各科不及格人数的统计。
2.6输出记录模块
当把记录输出至文件时,调用fwrite(p,sizeof(Node),1,fp)函数,将p指针所指节点中的各字段值,写入文件指针fp所指的文件。
当把记录输出至屏幕时,调用voidDisp(Linkl)函数,将单链表l中存储的学生记录信息以表格的形式在屏幕上打印出来。
3.详细设计
3.1数据结构设计
(1)学生成绩信息结构体
typedefstructstudent
{
charnum[10];
charname[15];
intcgrade;
intmgrade;
integrade;
inttotal;
floatave;
intmingci;
};
结构体sudent将用于存储学生的基本信息,它将作为单链表的数据域。
为了简化程序,我们只取了3门成绩。
其各字段的值的含义如下。
■num[10]:
保存学号。
■name[15]:
保存姓名。
■cgrade:
保存C语言成绩。
■mgrade:
保存数学成绩。
■egrade:
保存英语成绩。
■total:
保存总分。
■ave:
保存平均分。
■mingci:
保存名次。
(2)单链表Node结构体
typedefstructnode
{
structstudentdata;
structnode*next;
}Node,*Link;
这样定义了一个单链表的结构,结构标记为node,data为student结构类型的数据,作为单链表结构中的数据域,next为单链表中的指针域,用来存储其直接后继结点的地址。
Node为node类型的结构体变量,*Link为node类型的指针变量。
3.2函数功能描述
(1)printheader()
函数原型:
voidprintheader()
Printheader()函数用于在以表格形式显示学生记录时,打印输出表头信息。
(2)printdata()
函数原型:
voidprintdata(Node*pp)
Printdata()函数用于在以表格形式显示学生记录时,打印输出单链表pp中的学生信息。
(3)stringput()
函数原型:
voidstringput(char*t,intlens,char*notice)
stringput()函数用于输入字符串,并进行字符串长度验证(长度 t用于保存输入的字符串,因为是以指针形式传递的,所以t相当于该函数的返回值。 notice用于保存printf()中的提示信息。 (4)Numberinput() 函数原型: intnumberinput(char*notice) Numberinput()函数用于输入数值型数据,notice用于保存printf()输出的提示信息,该函数返回用户输入的整型数据。 (5)Disp() 函数原型: voidDisp(Linkl) Disp()函数用于显示单链表l中存储的学生记录,内容为student结构中定义的内容。 (6)函数原型: Node*Locate(Linkl,charfindmess[],charnameornum[]) Locate()函数用于定位链表中符合要求的节点,并返回指向该节点的指针。 参数findmess[]保存要查找的具体内容,nameornum[]保存按什么字段在单链表l中查找。 (7)Add() 函数原型: voidAdd(Linkl) Add()函数用于在单链表l中增加学生记录的节点。 (8)Qur() 函数原型: voidQur(Linkl) Qur()函数用于在单链表l中按学号或姓名查找满足条件的学生记录, 并显示出来。 (9)Del() 函数原型: voidDel(Linkl) Del()函数用于先在单链表l中找到满足条件的学生记录的节点,然后删除该节点。 (10)Modify() 函数原型: voidModify(Linkl) Modify()函数用于在单链表中修改学生记录。 (11)Insert() 函数原型: voidInsert(Linkl) Insert()函数用于在单链表l中插入学生记录。 (12)Tongji()void 函数原型: voidTongji(Linkl) Tongji()函数用于在单链表l中完成学生记录的统计工作,统计该班的总分第一名、单科第一名和各科不及格人数。 (13)Sort() 函数原型: voidSort(Linkl) Sort()函数用于在单链表l中完成插入排序算法实现单链表的按总分字段的降序排序。 (14)Save() 函数原型: voidSave(Linkl) Save()函数用于将单链表l中的数据写入磁盘中的数据文件。 (15)主函数main() 整个成绩管理系统控制部分。 其详细说明可参考图2。 4.调试与测试 编译结果如图4所示。 对源代码进行调试修改。 修改后如图5所示。 voidmenu()/*主菜单*/ { system("cls");/*调用DOS命令,清屏.与clrscr()功能相同*/ //textcolor(10);/*在文本模式中选择新的字符颜色*/ //gotoxy(10,5);/*在文本窗口中设置光标*/ cprintf("TheStudents'GradeManagementSystem\n"); //gotoxy(10,8); cprintf("*************************Menu********************************\n"); //gotoxy(10,9); cprintf("*1inputrecord2deleterecord*\n"); //gotoxy(10,10); cprintf("*3searchrecord4modifyrecord*\n"); //gotoxy(10,11); cprintf("*5insertrecord6countrecord*\n"); //gotoxy(10,12); cprintf("*7sortreord8saverecord*\n"); //gotoxy(10,13); cprintf("*9displayrecord0quitsystem*\n"); //gotoxy(10,14); cprintf("*************************************************************\n"); /*cprintf()送格式化输出至文本窗口屏幕中*/} 图4编译结果 图5修改后编译结果 5.源程序清单和执行结果 5.1源程序清单 1.程序预处理 包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。 #include"stdio.h"/*标准输入输出函数库*/ #include"stdlib.h"/*标准函数库*/ #include"string.h"/*字符串函数库*/ #include"conio.h"/*屏幕操作函数库*/ #defineHEADER1"----------------------------STUDENT----------------------------------\n" #defineHEADER2"|number|name|Comp|Math|Eng|sum|ave|mici|\n" #defineHEADER3"|---------------|---------------|----|----|----|--------|-------|-----|" #defineFORMAT"|%-10s|%-15s|%4d|%4d|%4d|%4d|%.2f|%4d|\n" #defineDATAp->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingci #defineEND"---------------------------------------------------------------------\n" intsaveflag=0;/*是否需要存盘的标志变量*/ /*定义与学生有关的数据结构*/ typedefstructstudent/*标记为student*/ { charnum[10]; charname[15]; intcgrade; intmgrade; integrade; inttotal; floatave; intmingci; }; /*定义每条记录或结点的数据结构,标记为: node*/ typedefstructnode { structstudentdata;/*数据域*/ structnode*next;/*指针域*/ }Node,*Link;/*Node为node类型的结构变量,*Link为node类型的指针变量*/ 2.主菜单界面 用户进入成绩管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。 此代码被main()函数调用。 voidmenu() { system("cls");/*调用DOS命令,清屏.与clrscr()功能相同*/ cprintf("TheStudents'GradeManagementSystem\n"); cprintf("*************************Menu********************************\n"); cprintf("*1inputrecord2deleterecord*\n"); cprintf("*3searchrecord4modifyrecord*\n"); cprintf("*5insertrecord6countrecord*\n"); cprintf("*7sortreord8saverecord*\n"); cprintf("*9displayrecord0quitsystem*\n"); cprintf("*************************************************************\n"); /*cprintf()送格式化输出至文本窗口屏幕中*/ } 3.主函数main() Main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。 详细分析可参考图2。 voidmain() { Linkl;/*定义链表*/ FILE*fp;/*文件指针*/ intselect;/*保存选择结果变量*/ charch;/*保存(y,Y,n,N)*/ intcount=0;/*保存文件中的记录条数(或结点个数)*/ Node*p,*r;/*定义记录指针变量*/ l=(Node*)malloc(sizeof(Node)); if(! l) { printf("\nallocatememoryfailure");/*如没有申请到,打印提示信息*/ return;/*返回主界面*/ } l->next=NULL; r=l; fp=fopen("C: \\student","ab+");/*以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*/ if(fp==NULL) { printf("\n=====>cannotopenfile! \n"); exit(0); } while(! feof(fp)) { p=(Node*)malloc(sizeof(Node)); if(! p) { printf("memorymallocfailure! \n");/*没有申请成功*/ exit(0);/*退出*/ } if(fread(p,sizeof(Node),1,fp)==1)/*一次从文件中读取一条学生成绩记录*/ { p->next=NULL; r->next=p; r=p;/*r指针向后移一个位置*/ count++; } } fclose(fp);/*关闭文件*/ printf("\n=====>openfilesucess,thetotalrecordsnumberis: %d.\n",count); menu(); while (1) { system("cls"); menu(); p=r; printf("\nPleaseEnteryourchoice(0~9): ");/*显示提示信息*/ scanf("%d",&select); if(select==0) { if(saveflag==1)/*若对链表的数据有修改且未进行存盘操作,则此标志为1*/ {getchar(); printf("\n=====>Whethersavethemodifiedrecordtofile? (y/n): "); scanf("%c",&ch); if(ch=='y'||ch=='Y') Save(l); } printf("=====>thankyouforuseness! "); getchar(); break; } switch(select) { case1: Add(l);break;/*增加学生记录*/ case2: Del(l);break;/*删除学生记录*/ case3: Qur(l);break;/*查询学生记录*/ case4: Modify(l);break;/*修改学生记录*/ case5: Insert(l);break;/*插入学生记录*/ case6: Tongji(l);break;/*统计学生记录*/ case7: Sort(l);break;/*排序学生记录*/ case8: Save(l);break
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统