成绩管理系统程序设计实验报告.docx

上传人:啊飒飒 文档编号:11095756 上传时间:2021-06-30 格式:DOCX 页数:42 大小:1.96MB
返回 下载 相关 举报
成绩管理系统程序设计实验报告.docx_第1页
第1页 / 共42页
成绩管理系统程序设计实验报告.docx_第2页
第2页 / 共42页
成绩管理系统程序设计实验报告.docx_第3页
第3页 / 共42页
成绩管理系统程序设计实验报告.docx_第4页
第4页 / 共42页
成绩管理系统程序设计实验报告.docx_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《成绩管理系统程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《成绩管理系统程序设计实验报告.docx(42页珍藏版)》请在三一文库上搜索。

1、北京航空航天大学 北海学院实验报告学院:软件与信息工程学院专业班级:软件工程 3 班课程:学生成绩管理系统程序设计实践指导老师:学号及姓名:曹宁N3090120301 刘朝卿N3090120303 刘惠N3090120304 张姝N3090120305 陈锋一实验目的: 通过课程设计,提高自己动手的能力,让实践和理论相结合,进一步巩固 语言程序设计的课程内容,掌握工程软件的基本设计方法。 学会将知识应用于实践,提高分析和解决问题的能力,加强综合能力。 为以后计算机的学习打下坚实的基础,有利于毕业时做毕业设计。二实验内容: 运用结构体和共用体,以及单链表和循环的知识点编辑一个简单的学生基本 信息

2、管理系统,使之能够完成学生基本信息的录入、修改、插入、查询、排 序、打印、退出操作。 执行编译操作,并根据提示调试此程序,排除所有的错误和警告。直到编译 成功为止。 执行运行操作,直到全部程序能够运行成功为止。 做完后请老师检查,并能回答老师所提的相关问题。三. 需求分析:1. 该学生信息管理系统能够完成基本的信息处理,如录入,保存,读取,输出, 修改,删除,添加,统计,排序等项目操作。实现统计用户的总分和平均分。 能够查看单个用户的各科成绩2. 每个模块的功能如下:a) 录入模块:可先后输入学号,姓名,高数成绩,计算机成绩,英语成 绩;b) 保存模块:用于数据存盘处理,如果用户没有专门进行此

3、操作且对数 据有修改,在退出时系统会提示用户存盘。c) 查询模块:用于按编号或姓名来查询用户记录d) 输出模块:可输出读取的学生信息与平均成绩;e) 修改模块:用于修改用户记录。先按输入的编号查询到该记录,然后提示用户修改编号之外的值,但是编号不能修改;f) 删除模块:可删除所读取的学生信息;g) 插入模块:用于插入记录。即按编号查询到要插入的结点的位置,然后在该编号之后插入一个新结点;h) 排序模块:利用插入排序实现单链表的按总分字段的降序排序,格式 是从高到低;i) 统计模块:用于分别统计该班的总分第一名和单科第一及各科不及格 的人数;j) 退出模块:可直接退出学生信息管理系统; 该学生信

4、息管理系统是在 VC+的环境下运行的。该信息系统要测试的数据如下: 录入模块:学号姓名高数英语 计算机1 XXX 99 80 992 XXX 99 89 893 XX 67 70 584 XXX 78 67 78 保存模块:输入文件名即可保存于该文件; 查询模块:输入相应的文件名可调出相应的学生信息; 输出模块:可输出录入,修改,删除,添加后的学生信息; 修改模块: 修改信息( 3 XX 67 70 58 ) 删除模块:删除信息( 2 XX 99 89 89) 添加模块:添加信息(5 XXX 78 87 89) 排序模块:按平均成绩由小到大排列并输出,如下:学号姓名高数英语计算机 平均成绩3

5、XX 67 70 58 65.0000004 xxx 78 67 78 74.0000005 XXX 78 87 89 84.0000001 xxx 99 80 99 92.000000 统计模块:统计该班的总分第一名和单科第一及各科不及格的人数, 如下: 退出模块:输入 0 即可退出系统;四 . 概要设计: 主函数结构图:录入删除插入统计输出修改删除保存排序退出 模块功能详细说明;A. 录入模块: 录入基本信息;B. 保存模块:输入文件名即可保存于该文件;C. 读取模块:输入相应的文件名可调出相应的学生信息;D. 输出模块:可输出录入,修改,删除,添加后的学生 信息;E. 修改模块: 修改学

6、生信息;F. 删除模块:只要输入要删除的学生学号,就可删除该学生的有关信息,以后输出时就不再显示 该学生的信息;G. 添加模块:添加学生信息;H. 统计(排序)模块:按平均成绩由小到大排列并输出; I. 退出模块:推出系统;五、详细设计及运行结果流程图, 函数之间相互调用的图示 ,程序设计及编码, 运行结果。 各模块的程序控制图:Y是录入基本信息录入模块否继续录结束入NY保存基本信息 并输入保存的保存模块文件名N结束Y输入保存的文 件名,即可读取模块是否读取结束N查询模块输 出 所 录 入 的 学生成绩信息结束输入英语Y要修数学修改模块是否修改改的学号C 语言平均成绩结束NY输入删除学号删除模

7、块结束NY是输入添加信息添加模块否继续添结束加N统计模块按学生成绩由低到高排列结束 函数之间相互调用的图示:主函数调用读取调 用 录 入函 数调 用 修 改 函 数调 用 查 询 函 数调 用 删 除 函 数调 用 保 存 函 数调 用 保 存 函 数调 用 保 存 函 数结束结束结束结束模块调 用 排 序 函 数调 用 添 加 函 数调 用 查 找 函 数调用输出函数调 用 保 存 函 数结束结束结束、(3)各模块流程图开始录入模块head-next=NULL;p2=head;输入学生成绩信息p2-next=p1;p2=p1;继 续 输 入(Y/N)?NYreturn head开始申请结点输

8、入新增学生信息假p=headhead=NULL假q-next!=NULL真q=q-nextp-next=head-next;head-next=p;return head查询学生信息:开始p1=head输入学生学号 xx!=p1-num&p1-next!=NULL真p1=p1-nextx=p1-num真输出学生信息输出无信息返回主菜单学生信息的删除:开始输入要删除学生的学号 numberhead=NULLNp1=headNumber!=p1-num&p1-next!=NULLYP2=p1;p1=p1-nextNnumber=p1-numYNp1=headhead=p1-next;free(p1

9、) p2-next=p1-next;free(p1)Nsum-输出学生总人数无此学生信息 测试与行结果 A录入模块:B删除模块:C查询模块:D修改模块:E插入模块:F统计模块:G排序模块:H保存模块:源代码:/*对用户的有效信息进行输入、排序等操作 实现统计用户的总分和平均分能够查看单个用户的各科成绩 */#include stdio.h#include stdlib.h#include string.h#include conio.h/*标准输入输出函数库 */ /*标准函数库 */*字符串函数库 */*屏幕操作函数库*/#define HEADER1 (#) -STUDENT- () n#

10、define HEADER4 W E L C O M E B A B Y !n#define HEADER2 | number | name |Eng|Math|Comp | sum | ave |mici | n#define HEADER3 |-|-|-|-|-|-|-|-|#define FORMAT | %-10s |%-15s|%4d|%4d|%4d| %4d | %.2f |%4d |n#define DATAp-data.num,p-data.name,p-data.egrade,p-data.mgrade,p-data.cgrade,p-data.total,p-data.av

11、e,p-data.mingci#define END- nint saveflag=0;/*是否需要存盘的标志变量 */*定义与学生有关的数据结构 */typedef struct student/*标记为student*/char num10;char name15;int cgrade;int mgrade;int egrade;int total;float ave;int mingci;/*学号 */*姓名 */ /*C语言成绩*/ /*数学成绩 */ /*英语成绩 */ /*总分 */ /*平均分 */ /*名次 */;/*定义每条记录或结点的数据结构,标记为: node*/ typ

12、edef struct nodestruct student data;struct node *next;/*数据域*/ /*指针域*/Node,*Link;/*Node为node类型的结构变量, *Link为node类型的指针变量 */void menu() /*主菜单*/ system(cls);/*调用DOS命令,清屏.与clrscr()功能相同 */*在文本模式中选择新的字符颜色 */*在文本窗口中设置光标*/printf( The Students Grade Management System nn );printf( *_为您服务是俺的荣幸! _* nn);printf( _

13、菜单_ nnn);printf( * 1 input (_O Not find this student!n);void Disp(Link l) /*显示单链表 l中存储的学生记录,内容为student结构中定义的内容*/Node *p;p=l-next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才 有学生信息*/if(!p) /*p=NULL,NUll在stdlib中定义为*/printf(n= Not student record!n);getchar();return;printf(nn);printheader(); /*输出表格头部 */w

14、hile(p)/*逐条输出链表中存储的学生信息 */printdata(p);p=p-next;/*移动至下一个结点 */printf(HEADER3);getchar();Node* Locate(Link l,char findmess,char nameornum)Node *r;if(strcmp(nameornum,num)=0) /*按学号查询 */r=l-next;while(r)if(strcmp(r-data.num,findmess)=0) /*若找到findmess值的学号*/ return r;r=r-next;else if(strcmp(nameornum,name

15、 )=0) /*按姓名查询*/r=l-next;while(r)if(strcmp(r-data.name,findmess)=0)return r;r=r-next;/*若找到 findmess值的学生姓名*/return 0; /*若未找到,返回一个空指针 */*输入字符串,并进行长度验证 (长度lens)printf(n exceed the required length! n); /*进行长度校验,超过 lens 值重新输入*/while(strlen(n)lens);strcpy(t,n); /*将输入的字符串拷贝到字符串 t中*/*输入分数,分数100 | t100 | tnex

16、t;system(cls);Disp(l); /*先打印出已有的学生信息 */while(r-next!=NULL)r=r-next; /*将指针移至于链表最末尾,准备添加记录 */while(1) /*一次可输入多条记录,直至输入学号为的记录结点添加操作 */while(1) /*输入学号,保证该学号没有被使用,若输入学号为,则退出添加记录操作*/stringinput(num,10,input number(press 0return menu):); /*格式化输入学号并检验 */ flag=0;if(strcmp(num,0)=0) /*输入为,则退出添加操作,返回主界面 */retu

17、rn;s=l-next;while(s) /*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号 */if(strcmp(s-data.num,num)=0)flag=1;break;s=s-next;if(flag=1) /*提示用户是否重新输入 */ getchar();printf(=The number %s is not existing,try again?(y/n):,num); scanf(%c,&ch);if(ch=y|ch=Y)continue;elsereturn;elsebreak;p=(Node *)malloc(sizeof(Node); /*申请内存空

18、间*/if(!p)printf(n allocate memory failure ); /*如没有申请到,打印提示信息 */return ;/*返回主界面*/strcpy(p-data.num,num); /*将字符串 num拷贝到p-data.num中*/stringinput(p-data.name,15, Name:);p-data.cgrade=numberinput( C language Score0-100:); /*输入并检验分数,分数必须在之间*/p-data.mgrade=numberinput( Math Score0-100:);/*输入并检验分数,分数必须在之间 *

19、/p-data.egrade=numberinput( English Score0-100:); /*输入并检验分数,分数必须在之间 */ p-data.total=p-data.egrade+p-data.cgrade+p-data.mgrade; /*计算总分*/p-data.ave=(float)(p-data.total/3);/*计算平均分 */p-data.mingci=0;p-next=NULL; /*表明这是链表的尾部结点 */r-next=p;r=p;saveflag=1;return ;/*将新建的结点加入链表尾部中 */void Qur(Link l) /*按学号或姓名

20、,查询学生记录 */int select; /*1:按学号查,:按姓名查,其他:返回主界面(菜单) */ char searchinput20; /*保存用户输入的查询内容 */Node *p;if(!l-next) /*若链表为空*/system(cls);printf(n=No student record!n );getchar();return;system(cls);printf(n =1 Search by number =2 Search by namen ); printf( please choice1,2:);scanf(%d,&select);if(select=1)/*

21、按学号查询 */stringinput(searchinput,10, input the existing student number:); p=Locate(l,searchinput,num);/*在l中查找学号为searchinput值的节点,并返回节点的指针 */ if(p) /*若p!=NULL*/printheader();printdata(p);printf(END);printf(press any key to return);getchar();elseNofind();getchar();else if(select=2) /*按姓名查询 */stringinput

22、(searchinput,15, input the existing student name:); p=Locate(l,searchinput,name);if(p)printheader();printdata(p);printf(END);printf(press any key to return);getchar();elseNofind();getchar();elseWrong();getchar();/*删除学生记录:先找到保存该学生记录的节点,然后删除该节点 */void Del(Link l)int sel;Node *p,*r;char findmess20;if(!

23、l-next) system(cls);printf(n=No student record!n );getchar();return;system(cls);Disp(l);printf(n =1 Delete by number =2 Delete by namen ); printf( please choice1,2: );scanf(%d,&sel);if(sel=1)stringinput(findmess,10, input the existing student number:); p=Locate(l,findmess, num);if(p) /*p!=NULL*/r=l;

24、while(r-next!=p)r=r-next;r-next=p-next;/*将p所指节点从链表中去除*/free(p); /*释放内存空间 */printf(n=delete success!n);getchar();saveflag=1;elseNofind();getchar();else if(sel=2) /*先按姓名查询到该记录所在的节点 */stringinput(findmess,15, input the existing student name);p=Locate(l,findmess, name);if(p)r=l;while(r-next!=p)r=r-next;

25、r-next=p-next;free(p);printf(n=delete success!n);getchar();saveflag=1;elseNofind();getchar();elseWrong();getchar();/*修改学生记录。先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改 */ void Modify(Link l)Node *p;char findmess20;if(!l-next) system(cls);printf(n=No student record!n );getchar();return;system(cls);printf(mod

26、ify student recorder);Disp(l);stringinput(findmess,10, input the existing student number:); /*输入并检验该学号*/ p=Locate(l,findmess,num); /*查询到该节点*/if(p) /*若p!=NULL,表明已经找到该节点 */printf(Number:%s,n,p-data.num);printf(Name:%s,p-data.name);stringinput(p-data.name,15, input new name:);printf(C language score:%d

27、, ,p-data.cgrade);p-data.cgrade=numberinput( C language Score0-100:);printf(Math score:%d,p-data.mgrade);p-data.mgrade=numberinput( Math Score0-100:);printf(English score:%d,p-data.egrade);p-data.egrade=numberinput( English Score0-100:);p-data.total=p-data.egrade+p-data.cgrade+p-data.mgrade;p-data.a

28、ve=(float)(p-data.total/3);p-data.mingci=0;printf(n=modify success!n);Disp(l);saveflag=1;elseNofind();getchar();/*插入记录:按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。 */ void Insert(Link l)Link p,v,newinfo; /*p指向插入位置,newinfo指新插入记录*/char ch,num10,s10;int flag=0;v=l-next;system(cls);/*s保存插入点位置之前的学号 ,num保存输入的新记录的学号 *

29、/Disp(l);while(1) stringinput(s,10, please input insert location after the Number:); flag=0;v=l-next;while(v) /*查询该学号是否存在, flag=1表示该学号存在 */if(strcmp(v-data.num,s)=0) flag=1;break;v=v-next;if(flag=1)break; /*若学号存在,则进行插入之前的新记录的输入操作 */else getchar();printf(n=The number %s is not existing,try again?(y/n

30、): ,s); scanf(%c,&ch);if(ch=y|ch=Y)continue;elsereturn;/*以下新记录的输入操作与 Add()相同*/stringinput(num,10,input new student Number:);v=l-next;while(v)if(strcmp(v-data.num,num)=0)printf(=Sorry,the new number:%s is existing !n ,num); printheader();printdata(v);printf(n);getchar();return;v=v-next;newinfo=(Node

31、*)malloc(sizeof(Node);if(!newinfo)printf(n allocate memory failure ); /*如没有申请到,打印提示信息 */return ;/*返回主界面*/strcpy(newinfo-data.num,num);stringinput(newinfo-data.name,15, Name:);newinfo-data.cgrade=numberinput( C language Score0-100:); newinfo-data.mgrade=numberinput( Math Score0-100:);newinfo-data.egr

32、ade=numberinput( English Score0-100:);newinfo-data.total=newinfo-data.egrade+newinfo-data.cgrade+newinfo-data.mgrade;newinfo-data.ave=(float)(newinfo-data.total/3);newinfo-data.mingci=0;newinfo-next=NULL;saveflag=1; /*在 main()有对该全局变量的判断,若为 ,则进行存盘操作*/*将指针赋值给p,因为 l中的头节点的下一个节点才实际保存着学生的记录 */p=l-next;whi

33、le(1)if(strcmp(p-data.num,s)=0) /*在链表中插入一个节点 */newinfo-next=p-next;p-next=newinfo;break;p=p-next;Disp(l);printf(nn);getchar();/*统计该班的总分第一名和单科第一 ,和各科不及格人数*/void Tongji(Link l)Node *pm,*pe,*pc,*pt; /*用于指向分数最高的节点 */Node *r=l-next;int countc=0,countm=0,counte=0; /*保存三门成绩中不及格的人数 */if(!r) system(cls);prin

34、tf(n=Not student record!n);getchar();return ;system(cls);Disp(l);pm=pe=pc=pt=r;while(r)if(r-data.cgradedata.mgradedata.egradedata.cgrade=pc-data.cgrade) pc=r;if(r-data.mgrade=pm-data.mgrade) pm=r;if(r-data.egrade=pe-data.egrade) pe=r;if(r-data.total=pt-data.total) pt=r;r=r-next;printf(n-the TongJiresult-n );printf(C Language60:%d (ren)n ,countc);printf(Math 60:%d (ren)n ,countm);printf(English 60:%d (ren)n ,counte);printf(-

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1