程序设计实习课程设计实训报告书.docx
- 文档编号:29294469
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:18
- 大小:24.37KB
程序设计实习课程设计实训报告书.docx
《程序设计实习课程设计实训报告书.docx》由会员分享,可在线阅读,更多相关《程序设计实习课程设计实训报告书.docx(18页珍藏版)》请在冰豆网上搜索。
程序设计实习课程设计实训报告书
信息科学与技术学院《程序设计实习》课程设计报告书
题目:
学生信息管理系统
专业:
计算机科学与技术
班级:
姓名:
学号:
指导老师:
设计时间:
目录
《程序设计实习》课程设计(实训报告书(1
1.课程设计(实训计划(3
2.系统需求分析与功能设计(4
3.总体设计(5
4.算法说明(附录源代码(8
5.技术难点与分析(16
6.系统测试(18
7.心得体会(24
8.参考文献(25
1.课程设计(实训计划
设计一个计算机程序,实现学生信息成绩管理系统。
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相应的模块
N
Y
2、各功能模块设计
(1录入信息模块
说明:
录入可以一次录入一条或多条,所以有是否继续添加记录的提示,有则继续添加,无则返回主菜单界面。
流程图:
(2浏览信息模块
说明:
这部分只要按顺序将链表中的记录输出即可。
流程图:
(3查询信息模块
说明:
因为要求用两种方式查询,所以系统包含一个子菜单,在要查询数据不存在的情况下返回这层菜单。
流程图:
录入系统
输入一组信息
是否添加完毕?
返回主菜单
N
Y浏览系统
输出所有信息
(4更新信息模块
说明:
先显示用户要修改的数据,提示是否确认修改,不修改的话返回主菜单。
流程图:
查询系统
按学号查询按姓名查询返回
输入查询内容
数据是否存在?
输出打印
N
Y更新系统
输入学号
是否存在?
输出信息
确认修改?
修改信息
返回主菜单
N
YYN
(5添加信息模块
说明:
该部分比较简单,添加好信息即回到主菜单。
流程图:
(6删除信息模块
说明:
查找到知道信息即可实现删除,没找到则返回主菜单。
流程图:
(7成绩计算模块
说明:
该部分分总成绩计算和平均成绩计算两种方式,选择任何一种即可实现输出打印。
流程图:
(8计算名次模块
说明:
只需要执行计算并按名次输出学生信息即可。
流程图:
添加系统
输入新记录
返回主菜单
输入学号
信息是否存在?
删除信息
返回主菜单
N
Y删除系统
成绩计算系统总成绩计算
平均成绩计算
返回
计算并输出
计算排名系统
计算名次并输出4.算法说明
建立的学生结构体:
typedefstructs/*建立学生信息结构体*/
{
intid;
charname[10];
charsex;
intscore1;
intscore2;
intscore3;
intmark;
}Information;
其中的mark是用来标记学生名次的,在sort函数中会用到。
主函数中采用switch函数来实现对不同命令的响应,该部分源代码如下:
switch(i
{
case'1':
input(L;break;
case'2':
output(L;break;
case'3':
search(L;break;
case'4':
{
intid;
printf("\n请输入要修改的学生学号:
";
scanf("%d",&id;
refresh(L,id;
}break;
case'5':
insert(L;break;/*插入(添加一个学生信息*/
case'6':
/*实现删除节点功能*/
{
intid;
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后,插在表尾并用尾指针指向,每完成一个信息的输入后提示是否继续添加信息。
该函数源代码如下:
NodePtrinput(NodePtrL/*输入新节点*/
{
Node*r,*s;
intflag=1;
charc;
r=L;
while(flag
{
if(c!
='n'
{
s=(Node*malloc(sizeof(Node;
printf("\n请输入学生学号:
";
scanf("%d",&s->data.id;
printf("请输入学生姓名:
";
scanf("%s",s->data.name;
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;
}
}
returnL;
}
当需要浏览链表中的信息是,选择功能2调用output函数,在该函数中,将头指针H->next赋给一个新指针p,再利用循环结构依次对指针所指向的数据进行输出。
当需要进行数据的查找时,选择功能3调用search函数,进入函数的同时显示两个查找方式:
按学号查找和按姓名查找。
学号查找直接用一个while循环从头依次查找指定ID,没找到指针向后移继续查找,找到的话输出该生信息。
而按姓名查找时,用strcmp函数比较输入的姓名字符串,找到即输出。
该部分源代码如下:
case'2':
{
charNAME[10];
printf("\n请输入要查询的学生姓名:
";
scanf("%s",NAME;
while(p!
=NULL
{
if(strcmp(NAME,(p->data.name!
=0
p=p->next;
elsebreak;
}
if(p==NULL
printf("\n查无此人!
\n";
elseprintf("\n学号:
%d\n姓名:
%s\n性别:
%c\n成绩1:
%d\n成绩2:
%d\n成绩
3:
%d\n\n",(p->data.id,(p->data.name,(p->data.sex,(p->data.score1,(p->data.score2,(p->data.score3;
}break;
当需要修改某生数据时,选择功能4先提示输入要修改的学生学号,输入完成将链表头指针和学号一起传给refresh函数并调用该函数。
在该函数中先利用新指针p和循环结构搜索到指定ID的节点并输出,提示“确认要修改?
”选择y可以进行该节点信息的重新编辑,编辑完成后返回头指针并退出。
当需要新添加学生信息时,选择功能5调用insert函数,在该函数中,需要先找到尾节点并把它用r指向,源代码部分如下:
Node*pre,*s,*r;
intflag=1;
charc;
pre=L;
while(pre->next!
=NULL
{
pre=pre->next;
}
r=pre;
如此,在找到尾节点点后,即可用尾插法将新添加的数据插入到表尾实现数据的插入。
插入完成后,返回头指针并退出。
当需要删除某学生信息时,选择功能6先提示输入要删除的学生学号,输入完成将链表头指针和学号一起传给del函数并调用该函数。
在该函数中先利用新指针p和循环结构搜索到指定ID的节点,没找到继续向后查找,找到的话实现删除,删除节点的关键代码如下:
{
r=p->next;
p->next=p->next->next;
free(r;
printf("\n删除成功!
\n";
}
这里要处理好指针的指向,最后记得释放删除的空间。
当需要计算学生的成绩时,选择功能7调用count函数,进入函数的同时显示两个计算方式:
按总成绩和按平均成绩计算。
选择计算总成绩的话,直接用个循环依次把链表中的数据输出,只是在输出格式中加入总成绩项,然后将它赋值为三门成绩总和并输出。
相同道理,选自计算平均成绩的话,将输出格式改为平均成绩项,并将它赋值尾三门成绩平均分并输出。
当需要计算学生的名次时,选择功能8调用sort函数,在该函数中,建立h和p指针同时指向头结点,然后让利用循环结构和p的后移让h中的总成绩依次和其后所有节点总成绩比较,当遇到比自己大的节点时,自身的mark值自增1,相反,当遇到比自己小的节点时,该节点mark值自增1,比较完一轮之后,将h=h->next,然后又开始新一轮的比较……如此计算到最后一个节点为止,此时每个节点的mark值就是自身名次的标号:
从0到n。
最后利用名次标号由小到大输出信息,实现排序功能。
该部分代码如下:
voidsort(NodePtrH/*按总成绩进行排序并输出*/
{
inti=0;
NodePtrp=H->next;
NodePtrh=p;
while(h!
=NULL
{
NodePtrp=h->next;
while(p!
=NULL
{
if(((h->data.score1+(h->data.score2+(h->data.score3<((p->data.score1+(p->data.score2+(p->data.score3
h->data.mark++;
else(p->data.mark++;
p=p->next;
}
h=h->next;
}
p=H->next;
h=p;
while(p!
=NULL
{
if((p->data.mark!
=i
p=p->next;
else
{
printf("\n第%d名",i+1;
printf("学号:
%d姓名:
%s性别:
%c总成绩:
%d平均成绩:
%f\n",(p->data.id,(p->data.name,(p->data.sex,(p->data.score1+(p->data.score2+(p->data.score3,(float((p->data.score1+(p->data.score2+(p->data.score3/3;
i++;
p=h;
}
}
}
5.技术难点与分析
技术难点一:
如何实现一次运行可实现多个功能?
分析:
如果仅仅在开始运行时给出一个功能菜单,那么在做完了某个功能的操作后,程序也就运行完毕并退出,不能继续执行其他功能。
而解决此问题的最好的方法就是可以在每次完成一个操作后回到初始的功能菜单,即实现功能菜单的循环。
可以考虑用while函数进行真循环,将菜单和switch中的所有case写进while中,在每一个操作结束后都回到菜单,等候下一次的命令,而想要退出系统只需给功能0添加上一个退出程序的函数exit0即可。
相关源代码如下:
while(1
{
printf("\n\n-------------学生信息管理系统---------------\n\n";
printf("1录入信息6删除信息\n\n2浏览信息7计算学生成绩\n\n3查询信息8显示学生名次\n\n4更新信息0返回/退出\n\n5添加信息\n\n";
printf("请按要求输入序号0-8:
";
scanf("\n%c",&i;
if(i<'0'||i>'8'
{
printf("\n输入非法!
\n";continue;
}
else
{
switch(i
{
case'1':
input(L;break;
case'2':
output(L;break;
case'3':
search(L;break;
case'4':
{
intid;
printf("\n请输入要修改的学生学号:
";
scanf("%d",&id;
refresh(L,id;
}break;
case'5':
insert(L;break;/*插入(添加一个学生信息*/
case'6':
/*实现删除节点功能*/
{
intid;
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:
;
}
}
}
技术难点二:
如何对学生的成绩进行排名并按名次输出?
分析:
因为所有的学生信息都是用链表的形式进行存储和连接的,所以要按分数对链表中得节点重新排序的话是非常麻烦的。
所以在此考虑为所有学生的信息结构体中添加一个mark项,在每次输入一个新节点数据时自动为其mark赋值为0。
而在排序函数中,利用mark的值来记录每个学生成绩比较后的名次情况。
具体算法是从第一个学生节点开始依次和其后所有节点进行总成绩比较,遇到比自己大的自身mark自增1,相反则对方的mark自增1,比较完一轮又从第二个节点依次和其后的节点比较,这样反复进行比较直到最后一个节点为止。
最后总成绩最高的节点mark值依旧为0,而次高的节点mark值被赋为1……,利用这个mark值进行链表的查找输出,最后即可让程序按成绩从高到低输出学生信息。
具体代码见算法说明最后sort部分的说明。
6.系统测试
现设计1组学生信息,他们的信息分别是:
学号姓名性别成绩1成绩2成绩3
1Alexf919497
2Billym909293
3Candyf776188
4Jackm747863
5Johnm508895
先将前四位同学的信息一次性输入,5号同学数据用作新插入的数据。
菜单界面如下:
先用功能1将1-4号学生信息输入,输入界面如下:
输入完毕后,进行信息的浏览,也就是显示,选择功能2,效果如图:
接着可以进行学生信息的查询,选择功能3,进入子菜单界面:
先按学号查询一下2号同学的信息,效果如图:
然后按姓名查询一下Jack的信息,如图:
按0返回后,可以进行更新信息的功能,这里我们准备把4号Jack的姓名改为Danny,性别改为女,其他不变,如图:
确认修改后,对4号同学的信息进行重新编辑:
接着把5号John的信息添加进去,选择功能5并进行插入:
然后我们把2号同学的信息删除,选择功能6并输入ID:
此时,我们看一下进行了上述所有操作后,输出的信息效果:
选择功能7进入成绩计算子菜单:
计算所有学生的总成绩和平均成绩:
返回后,我们选择功能8实现学生名次的输出:
最后,选择0退出系统:
7.心得体会
其实说实话,心得体会本来是想从网上直接拷一份过来的,但是想想,这是唯一可以说一下个人感受的地方,是唯一一个能抒发一下情绪的地方,所有就决定纯手动的写写这次实验的一些……RT。
首先这次实验的时间其实不长,要再短时间内吧一个学生信息管理系统做出来对自己来说稍稍有些困难,但还好之前的数据结构期末考试交过一份学生通讯录的程序,所以这次以上次程序为模板,再在里面添加了一些新的功能,才能让我从容不迫的完成整个程序。
其实程序的编写是练得越多越熟练,也会学得更多,但是平时并花什么时间在这上面,所以渐渐的会变的生疏,恰好这次有这么一次实训,所以之前就决定要认真对待这次它,以便重新复习一下c语言里面的一些重要的东西。
很认真地投入了程序好几天,坚持下来,发现自己也渐渐变的熟练,思考问题的方式也变得更专业,能独立解决程序中得错误,并且独立实现自己的算法。
总之,此次实训收获不菲。
至于该程序的后期嘛,我决定可以从一下几方面继续改进:
首先是进一步完善程序界面的观赏性,当然源代码的格式也必须要清楚,美观。
然后是程序中对一些命令的处理,对一些边缘问题的处理要考虑到。
最后是最好能设计出图形界面,把信息存入进文件当中,真正实现信息的存储与管理,做成成品,可以供客户使用。
8.参考文献
[1]杨路明.C语言程序设计教程.2版.北京:
北京邮电大学出版社,2005.
[1]耿国华.数据结构——c语言描述.北京:
高等教育出版社,2005.7.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 实习 课程设计 报告书