何文培241311030综合设计实训报告终极版副本 2Word格式.docx
《何文培241311030综合设计实训报告终极版副本 2Word格式.docx》由会员分享,可在线阅读,更多相关《何文培241311030综合设计实训报告终极版副本 2Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
![何文培241311030综合设计实训报告终极版副本 2Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/23/e6d42c9d-fdb4-4260-ae95-40547712b96a/e6d42c9d-fdb4-4260-ae95-40547712b96a1.gif)
1.系统功能:
本实训的题目是学生成绩管理系统,实现的是对学生成绩的系统管理。
包括学生信息的创建、删除、插入或添加、保存、格式化输出;
学生信息,成绩的修改或更新、成绩的统计、汇总、排序。
检索及输出。
2.对系统通过单链表实现对学生成绩的管理。
具有如下功能:
(1)输入记录
(2)从表中删除记录
(3)按照姓名查找所有记录
(4)将单链表中的记录保存到文件
(5)从文件中读入记录
(6)计算所有学生的总分和平均分
(7)插入记录到表中
(8)复制文件
(9)排序
(10)添加记录到文件中
(11)索引
(12)分类合计
四,系统环境
1.运行环境
硬件环境:
CPU80386内存32MB、硬盘200MB以上微机
软件环境:
MS-DOS5.0以上操作系统/WINDOWS9X以上系统Turboc2.0集成环境,UCDOS汉字系统visualC++以上
图:
上图是学生信息管理系统的流程图。
(1)数据结构
链表是线性表中的一种,线性表中分为顺序存储结构和链式结构。
线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素物理位置上相邻,因此可以随机查找表中的没一个元素,。
Typedefstructz{
Charno[11]
Charname[15]
Intscore[n]
Floatsum
Floataverage;
Intorder;
Structz1*next;
}
Student;
(2)main()主函数
主函数是程序的入口,采用模块化的设计。
首先在主程序种打印欢迎界面,声明一些必要的变量,作为一无限循环程序,循环体作为一开关语句,该语句设置一个断点,其中条件值通过调用过主菜单函数得到的返回值。
根据该值,调用相应的功能函数。
同时设置一个断点,当返回值为一定条件是结束程序。
(3)memnu_select()函数
为了美化界面,制作单边框窗口,窗口中显示主菜单。
通过putch()输出图形符号的ASCII码值(十六进制),到达显示的目。
Putch(0xda)
Putch(0xc4)
对菜单的选项的选择是利用移动光标按回车键进行选择。
4init()初始化
单链表需要一个头指针来指向表的第一个结点面对单链表的访问是从头指针开始的。
初始化单链表为空,用null表示,该值在文件stdlib.h中定义为常数0.
5creat()创建链表
当用户选择输入增加记录后,进入该函数,输入学生信息,并把信息输入链表。
在输入过程中,有相关的提示。
当输入@的时候,会出现弹出到主菜单,在生成单链时,每次新输入的结点都放在表头,这样最先输入的结点存放在表头,这样最先输入的结点存放在最后。
(7).append()追加记录到文件尾
当想要在文件尾增加一条记录时使用该函数,首先输入新结点信息,然后输入要追加的文件名,按追加方式打开文件,将新信息写入文件。
(8).insert()插入结点
在指定结点前面插入新结点,申请空间得到指针info,输入新结点信息,存放info中,设链表头指针为h,p为指定结点的指针,q为P的前驱指针。
从头结点开始循环移动指针p查找指定结点,查找和插入时分两种情况处理:
1).指针p为空,如果p等于h,说明链表为空,则新结点即为头结点,修改指针h=info。
否则,说明表中没有指定结点,则新结点插入在表尾部,此是q把指的结点是最后一个结点,所以修改指针q->
next=info。
2).指针p不为空,如果p等于h,说明新结点插入在当前第一个结点之前,为新的头结点,修改指针info->
next=p,h=info。
否则,说明新结点的位置应在q和p两个结点之间,修改指针info->
next=p,q->
(9).print()显示所有记录
采用顺序访问的方法显示和查找记录,定义一个指向结点的临时变量p,初值为单链表的头指针,输出指针所记录的数据后,将指针后移一个记录,直到p指针值为空,则所有记录输出完毕。
(10).search()查找结点
按照姓名来查找记录。
从头结点开始顺序查找,若没有记录显示没有,遇到一个匹配的记录则显示此记录,后到尾结点结束。
(11).save()保存记录到文件
将学生信息保存到指定的文件中。
按照文件读写要求,先定义一个只想文件的指针,输入要保存的磁盘文件名,如果输入的是绝对路径,则文件保存到指定的位置;
如果只要文件名,则文件保存在TC默认的路径。
如果文件打不开,则退出程序,否则选择一种写文件方式,打开文件。
如果文件打不开,则退出程序,否则选择一种写入文件方式,从链表的头指针。
开始,顺序将记录写入文件,直到所有记录写完,标志就是移动指针空。
(12).load()从文件中加载记录
按照文件读写要求,先定义一个指向文件的指针,输入要读入数据的磁盘文件名,然后确定文件的打开方式。
如果文件打不开,则退出函数,否则选择一种读文件方式,从文件头开始,将记录写入内存,直到文件尾。
文件打开方式和读入方式的确定要依据输出文件是二进制文件,块写操作,读入也应设置为二进制打开方式,块读取方式。
每读入一条记录,都要做好指链接关系,本函数将新结点链接到当前链表的尾部,链表的顺序和文件保存的顺序一致。
(13).copy()备份文件
将文件读写功能结合到一起,先输入源文件名,再输入目标文件名,然后利用文件读写函数将源文件中的信息写到目标文件中,以达到备份文件的目的。
(14).computer()计算所有学生的课程的总成绩成绩和总平均成绩
(15).sort()排序
本函数实现按总分排序的功能。
在算法上,选择直接插入算法,即:
每步将一个待排序的按其排序码值的大小插到前面已经排好序的表中,直到全部插入为止。
先将链表的头结点看作是已经排好序的结点,然后取下一个结点作为待排序的结点,插入到已排好序的表中。
具体做法为:
(1.先将原表头结点作为新排好序表的头结点h,原表下一个节点作为原表头结点h1。
(2.原表头结点为待排序结点,将其总分与新表结点的总分进行比较,如果待排序结点总分大,则插在表头,否则插在其后,原表头结点移一位。
(3.重复第二步,即将原表头结点的总分与新表结点的总分进行比较,如果待排序结点总分小,则移动新表指针,直到找到合适的位置将其插入。
当原表为空时,所有结点排序完毕。
排好序后,系统自动将名次数据写入结点数据域的order中。
(16).index()索引
定义临时工指针后,将原表的头指针的下一个结点作为指针,再使第一个结点定义为新表的头结点。
当原表不为空时,进行排序。
(17).total()分类合计
追加班别信息,对各班的总成绩和总平均成绩进行平均成绩统计并显示。
(18).exit()退出程序
4.系统的界面设计
(1)主菜单
(2)创建链表
(3)删除记录
(4)显示全部记录
(5)查找记录
(6)保存文件
(7)读文件
(8)计算总分和平均分
(9)插入记录
(10)复制文件
(11)排序
(12)追加记录
(13)索引
(14)分类合计
5.系统实现
1.使用的语言
C语言
2.模块代码实现(以下举3例为参考)
模块1
模块名称:
创建链表
输入:
学号,姓名,成绩
输出:
输出一个二维表
模块代码:
STUDENT*create()
{
inti;
floats;
STUDENT*h=NULL,*info;
for(;
;
)
info=(STUDENT*)malloc(sizeof(STUDENT));
if(!
info)
printf("
\noutofmemory"
);
returnNULL;
}
inputs("
enterno:
"
info->
no,11);
if(info->
no[0]=='
@'
)break;
entername:
info->
name,15);
printf("
pleaseinput%dscore\n"
N);
s=0;
for(i=0;
i<
N;
i++)
do{
score%d:
i+1);
scanf("
%d"
&
info->
score[i]);
score[i]>
100||info->
score[i]<
0)
baddate,repeatinput\n"
}
while(info->
0);
s=s+info->
score[i];
info->
sum=s;
average=(float)s/N;
order=0;
right=h;
h=info;
return(h);
模块2
从表中删除一个记录
输入需要删除的学生学号
输出要删除学生信息二维表
STUDENT*delete(STUDENT*h)
STUDENT*p,*q;
chars[11];
clrscr();
pleasedeleteno\n"
scanf("
%s"
s);
q=p=h;
while(strcmp(p->
no,s)&
&
p!
=NULL)
{
q=p;
p=p->
right;
if(p==NULL)
\nlistno%sstudent\n"
else
***********************************havefound************************\n"
|no|name|sc1|sc2|sc3|sum|ave|order|\n"
|-----------|---------------|----|----|----|------|------|-----|\n"
printf("
|%-11s|%-15s|%4d|%4d|%4d|%-6.2f|%-6.2f|%5d|\n"
p->
no,
p->
name,p->
score[0],p->
score[1],p->
score[2],p->
sum,
average,p->
order);
******************************************end************************\n"
getch();
if(p==h)
h=p->
else
q->
right=p->
free(p);
printf("
\nhavedeleteno%sstudent\n"
donotforgetsave\n"
return(h);
模块3
按姓名查找学生记录
输入学生姓名
以二维表的形式输出查询到的信息
voidsearch(STUDENT*h)
STUDENT*p;
chars[15];
pleaseenternameforsearch\n"
p=h;
while(strcmp(p->
name,s)&
p=p->
if(p==NULL)
else
{
\n\n***********************************havefound************************\n"
p->
sum,p->
3.集成测试
各个模块间的相互关联和借口测试
1.创建链表、显示链表、从链表中删除信息、按名查找、插入之间的集成测试
当创建完成一个链表是,按显示链表,则以二维表的形式显示创建链表的信息;
当要从链表删除一个学生的信息时,输入要删除学生的学号,显示删除成功,再按显示链表,则显示删除后的信息;
当要查找信息时,输入查找学生的姓名,则显示要查找的学生信息;
插入学生信息时,输入在某个学生学号之前插入,再输入插入学生的信息,插入完成后,按显示,则显示插入完成后的链表。
以上测试表面:
创建链表、显示链表、从链表中删除信息、按名查找、插入之间的接口和联系是正确的。
说明该集成测试成功。
2.创建链表、显示、保存、载入、排序、分类合计、追加之间的集成测试
当完成了一个链表的创建后,按显示,在窗口中显示该链表的信息;
排序后,按显示,此时会显示排序后的信息,在排序栏会有学生成绩名次;
分类合计后,按显示,此时会显示各个班级的总分和均分;
按保存时,会提醒你输入保存路径,若路径无误,回车后保存成功;
按加载,提醒输入加载路径,若输入路径无误,则加载成功,且按显示后悔显示载入的学生信息;
排序分类显示均正常;
追加,会提醒输入添加的学生信息,输入完成后,提醒输入追加文件,若文件路径无误,则追加成功,按显示,则显示更新后的信息。
以上测试说明创建链表、显示、保存、载入、分类合计、追加之间的联系正常,接口无误。
说明测试成功!
六、总结
这次实训,我主要是负责前期工作的准备,了解相关的链表形式,数据结构,函数类型等的研究。
下面我来总结一下这几个发那个面的感想。
数据结构:
链表是线形表的一种,线形表分为顺序存储结构和链式存储结构。
这二者的共同点就是可以对表的添加,删除,查找,排序等操作比较方便,所以我们采用的是链表的形式来存储学生的相关信息。
线性顺序存储结构的特点是逻辑关系上的相邻的两个元素物理位置上也相邻,所他可以随机存取表中的任一元素。
链式存储结构的特点是用一组任意的存储单元存储线形表的数据元素。
我说一下在创建链表的时候的相关注意的事项,我们一般是用creat()函数来创建链表的,当用户选择输入添加的记录后,进入该函数,输入了学生的序号,学号,姓名,还有相关的信息后。
并在这个过程中把信息加入了链表。
注意的是,在输入的过程中,有相关的提示,入学号我们先定的是10位,字符型。
同时对某些信息做了限定,就拿分数来说吧,如果输入的分数不在0—100之间的话,系统就会显示“baddata”的提示,这是提示我们从新输入。
在输入的过程中,如果想要结束输入学生的信息时,就在”enterno”时输入”@”。
当输入结束了以后。
回到主菜单的界面,按“3“。
再按enter键,就会显示出我们所输入的学生信息的具体情况。
并计算出了学生的总成绩,平均成绩,并将学生的名次置0.再等待排序结束后就赋予新值。
特别注意的是,我们对生成链表时结点的存入顺序的理解,开始的时候我们理解的是,每次新输入的结点放在表的后面,然后最先输入的结点存依次放在后面。
后来在老师的知道下我们对程序进行了理解,在总结了许多的程序的规律的时候,认识当初的理解是错误的,其实,数据输入结束后返回链表的头指针到方函数。
在生成链表时,没次新输入的结点放在表头,这样使得最先输入的结点存放在最后。
除了在程序的分析过程中,我学到的相关的处理问题的能力外,我更多的学到的是团队方面的,管理方面的能力。
一个好的团队,领导者的能力很重要,我是我们这四人小团队的小组长。
实话,我在程序方面的理解能力是大大的不足的,我主要偏重的是协调和管理团队的开发进度和交流能力。
一个好的领导,应该有也下几点能力:
1:
有相当丰富的专业知识
2:
有发现问题的能力,
3:
能把计划变成现实的能力。
4:
良好的交际,沟通,团队协作能力。
最后我想说的是:
我们毕竟只是初学者,这样的程序对我们来说难度还是太大,也至于在最初的时候我对这一切是茫然的,最后慢慢的摸索,我逐渐知道了一些知识。
我自认为我没有编程的天赋,今后也不准备向这方面发展,但我在校期间还是会加油的学习。