信息科学与技术学院《程序设计实习》课程设计报告书题目:学生信息管理系统专业:计算机科学与技术班级:姓名:学号:指导老师:设计时间:目录《程序设计实习》课程设计(实训报告书 (11. 课程设计(实训计划 (32. 系统需求分析与功能设计 (43. 总体设计 (54. 算法说明(附录源代码 (85. 技术难点与分析 (166. 系统测试 (187. 心得体会 (248. 参考文献 (251.课程设计(实训计划设计一个计算机程序,实现学生信息成绩管理系统。
1.设计一个含有10个菜单项的主控菜单,这10个菜单项的内容和输入提示如下:0 返回1 输入学生信息2 显示学生信息3 查询学生信息4 更新学生信息5 添加学生信息6 删除学生信息7 计算学生成绩8 显示学生名次请选择功能编号:使用数字0~9来选择菜单项,其它输入则不起作用。
2. 在查询学生信息时,又分为按学号查询或按姓名查询。
菜单项及提示内容如下:1 按学号查询2 按姓名查询3 返回上级菜单请选择功能编号。
使用数字1~3来选择菜单项,其它输入则不起作用。
在计算学生成绩时,又可分为如下功能:计算总成绩计算平均成绩返回上级菜单请选择功能编号。
使用数字1~3来选择菜单项,其它输入则不起作用。
工作进度安排如下:前两天实现学生信息的输入、显示、查找、删除和插入等基本操作。
第三天和第四天完成学生成绩的计算和排名功能,测试并完成所有设计。
最后一天完成设计报告书。
2. 系统需求分析与功能设计需求分析:根据题目要求,设计一个初始的能暂存学生信息的系统,不需要文件的输入,输出等操作。
但程序应提供数据的查找、显示、输入、删除、添加、、更改、成绩计算和成绩排名等功能,由于查找和成绩计算可以有不同的方式,所以应提供不同的算法,最后还应提供菜单的选择功能等客户端操作。
功能设计:0 返回/退出:分两个功能,在主菜单中实现退出系统的功能;在子菜单中实现返回主菜单的功能。
在主菜单中只设计退出系统的功能,返回功能设计在各子函数中。
1 录入信息:实现第一次录入数据的功能,第一次可以添加单条数据,也可以添加多条数据。
利用尾插法建表,实现信息的输入和保存,在子函数中实现。
2 浏览信息:该功能可以实现链表中所有信息的显示,即添加好的数据。
按顺序依次输出表中所有学生信息。
3 查询信息:可以实现对ID的查找和对姓名的查找,并有返回主菜单功能。
比对要查询的项进行查询,找到即输出,姓名部分用字符串比较函数。
4 更新信息:可以按给定ID实现对某数据项的全部信息的重新输入,即起到修改数据的功。
先根据信息查询到指定项输出,确认要修改即可重新输入该生数据,修改完成保存退出。
5 添加信息:在已有数据的情况下,实现新数据的添加或者插入,添加到表的末尾。
用尾插法插入新的信息。
6 删除信息:可以按给定ID是实现对某数据项的清除。
指定ID并删除节点,释放空间,完成并退出。
7 计算学生成绩:分学生总成绩的计算和平均成绩的计算,计算完成同时显示所有学生的成绩,并有返回主菜单功能。
在输出学生信息的同时,对学生三门成绩进行计算并输出。
8 显示学生名次:按学生的总成绩进行排名,并按成绩从高到低输出显示。
依次对学生总成绩进行比较并标记名次,最后按标记从小到大输出名次信息。
3. 总体设计系统总体分为以下几个函数,main ,input ,output ,search ,refresh ,insert ,del ,count ,和sort 函数。
1、主函数主函数中完成的功能:初始化链表,建立头指针。
建立菜单界面,并实现对指定命令的响应,利用主函数来调用其他各个子函数。
说明:主函数较多较复杂,已经和主菜单函数合并,主菜单函数里还包括了两个二级菜单,并已经开始了对各个函数的调用。
学生信息管理系统录入信息浏览信息查询信息更新信息添加信息删除信息成绩计算计算排名返回/退出开始显示一系列功能选项输入n ,判断n 是否是0~8?调用与n 相应的模块NY2、各功能模块设计(1录入信息模块说明:录入可以一次录入一条或多条,所以有是否继续添加记录的提示,有则继续添加,无则返回主菜单界面。
流程图:(2浏览信息模块说明:这部分只要按顺序将链表中的记录输出即可。
流程图:(3查询信息模块说明:因为要求用两种方式查询,所以系统包含一个子菜单,在要查询数据不存在的情况下返回这层菜单。
流程图:录入系统输入一组信息是否添加完毕?返回主菜单NY 浏览系统输出所有信息(4更新信息模块说明:先显示用户要修改的数据,提示是否确认修改,不修改的话返回主菜单。
流程图:查询系统按学号查询按姓名查询返回输入查询内容数据是否存在?输出打印NY 更新系统输入学号是否存在? 输出信息确认修改? 修改信息返回主菜单NY Y N(5添加信息模块说明:该部分比较简单,添加好信息即回到主菜单。
流程图:(6删除信息模块说明:查找到知道信息即可实现删除,没找到则返回主菜单。
流程图: (7成绩计算模块说明:该部分分总成绩计算和平均成绩计算两种方式,选择任何一种即可实现输出打印。
流程图:(8计算名次模块说明:只需要执行计算并按名次输出学生信息即可。
流程图:添加系统输入新记录返回主菜单输入学号信息是否存在?删除信息返回主菜单NY 删除系统成绩计算系统总成绩计算平均成绩计算返回计算并输出计算排名系统计算名次并输出4. 算法说明建立的学生结构体:typedef struct s /*建立学生信息结构体*/{int id;char name[10];char sex;int score1;int score2;int score3;int mark;}Information;其中的mark是用来标记学生名次的,在sort函数中会用到。
主函数中采用switch函数来实现对不同命令的响应,该部分源代码如下: switch(i{case '1':input(L;break;case '2':output(L;break;case '3':search(L;break;case '4':{int id;printf("\n请输入要修改的学生学号:";scanf("%d",&id;refresh(L,id;}break;case '5':insert(L;break; /*插入(添加一个学生信息*/ case '6': /*实现删除节点功能*/{int id;if(L->next==NULL{printf("表为空!";break;}printf("\n请输入要删除的学生学号:";scanf("%d",&id;del(L,id;}break;case '7':count(L;break;case '8':sort(L;break;case '0':exit(0;break;default: ;}当需要录入信息时,选择功能1调用input函数,该函数利用尾插法建立新的节点,对节点信息进行赋值,并且为每个学生的mark值自动赋为0后,插在表尾并用尾指针指向,每完成一个信息的输入后提示是否继续添加信息。
该函数源代码如下:NodePtr input(NodePtr L /*输入新节点*/{Node *r,*s;int flag=1;char c;r=L;while(flag{if(c!='n'{s=(Node *malloc(sizeof(Node;printf("\n请输入学生学号:";scanf("%d",&s->data.id;printf("请输入学生姓名:";scanf("%s",s->;printf("请输入学生性别(f/m:"; scanf("\n%c",&s->data.sex; printf("请输入学生成绩1:"; scanf("%d",&s->data.score1; printf("请输入学生成绩2:"; scanf("%d",&s->data.score2; printf("请输入学生成绩3:"; scanf("%d",&s->data.score3;s->data.mark=0;r->next=s;r=s;printf("是否继续录入信息?(y/n"; scanf("\n%c",&c;}else{flag=0;r->next=NULL;}}return L;}当需要浏览链表中的信息是,选择功能2调用output函数,在该函数中,将头指针H->next 赋给一个新指针p,再利用循环结构依次对指针所指向的数据进行输出。
当需要进行数据的查找时,选择功能3调用search函数,进入函数的同时显示两个查找方式:按学号查找和按姓名查找。
学号查找直接用一个while循环从头依次查找指定ID,没找到指针向后移继续查找,找到的话输出该生信息。
而按姓名查找时,用strcmp函数比较输入的姓名字符串,找到即输出。
该部分源代码如下:case '2':{char NAME[10];printf("\n请输入要查询的学生姓名:";scanf("%s",NAME;while(p!=NULL{if(strcmp(NAME,(p->!=0p=p->next;else break;}if(p==NULLprintf("\n查无此人!\n";else printf("\n学号:%d\n姓名:%s\n性别:%c\n成绩1:%d\n成绩2:%d\n成绩3:%d\n\n",(p->data.id,(p->,(p->data.sex,(p->data.score1,(p->data.score 2,(p->data.score3;}break;当需要修改某生数据时,选择功能4先提示输入要修改的学生学号,输入完成将链表头指针和学号一起传给refresh函数并调用该函数。
在该函数中先利用新指针p 和循环结构搜索到指定ID 的节点并输出,提示“确认要修改?”选择y可以进行该节点信息的重新编辑,编辑完成后返回头指针并退出。