大学生计算机数据结构课程设计.docx
《大学生计算机数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《大学生计算机数据结构课程设计.docx(32页珍藏版)》请在冰点文库上搜索。
![大学生计算机数据结构课程设计.docx](https://file1.bingdoc.com/fileroot1/2023-6/23/1faa861d-13c3-432e-a2ce-da379b05ab29/1faa861d-13c3-432e-a2ce-da379b05ab291.gif)
大学生计算机数据结构课程设计
淮海工学院计算机工程学院
课程设计报告
设计名称:
数据结构课程设计
选题名称:
简单的员工管理系统
成绩:
指导教师评语:
签名:
年月日
1.课程设计目的
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
2.课程设计任务与要求:
任务
根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。
设计题目从任务书所列选题表中选取,每班每题不得超过2人。
学生自选课题
学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。
学生自选课题需在18周前报课程设计指导教师批准方可生效。
要求:
1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
4、每位同学需提交可独立运行的程序;
5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);
6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
3.课程设计说明书
一需求分析
该程序是模拟企业单位中员工的管理系统,实现员工的添加、删除、查询、修改、排序等基本业务。
此程序规定:
(1)能够向系统中输入每个员工的基本信息,包括编号、姓名、性别、出生年月、学历、职务、电话、住址等信息,并保存记录;
(2)用户能够按编号、姓名查询员工信息;
(3)用户能够实现员工插入(加入新员工的基本信息)、删除(按编号删除已离职的员工的信息)、查询(按特定条件查询员工)、修改(按编号对某个员工的某项信息进行修改)、排序(按特定条件对所有的员工的信息进行排序)操作。
二概要设计
●系统用到的抽象数据类型定义:
1、单链表的抽象数据类型定义:
ADTLinkList{
数据元素:
D={ai|ai∈D0,i=1,2,…,n,n≥0,D0为某一数据对象}
关系:
S={|ai,ai+1∈D0,i=1,2,…,n-1}
基本操作:
(1)InitList(L)
(2)DestroyList(L)
(3)ClearList(L)
(4)EmptyList(L)
(5)ListLength(L)
(6)Locate(L,e)
(7)GetData(L,i)
(8)InsList(L,i,e)
(9)DelList(L,i,&e)
}ADTLinkList
2、字符串的抽象数据类型定义:
ADTString{
数据对象:
D={ai|ai∈CharacterSet,i=1,2,…,n;n≧0}
数据关系:
R={|ai-1,ai∈D,i=2,…,n;n≧0}
基本操作:
(1)StrAsign(S,chars)
(2)StrInsert(S,pos,T)
(3)StrDelete(S,pos,len)
(4)StrCopy(S,T)
(5)StrEmpty(S)
(6)StrCompare(S,T)
(7)StrLength(S)
(8)StrClear(S)
(9)StrCat(S,T)
(10)SubString(Sub,S,pos,len)
(11)StrIndex(S,pos,T)
(12)StrReplace(S,T,V)
(13)StrDestroy(S)
}ADTString
●系统中的子程序和功能说明:
1、typedefstructNode定义链表结点
2、typedefstructDatatype定义职工信息
3、ListInitiate(SLNode**head)链表初始化
4、SLNode*ListInsert(SLNode*head,DataTypex)
职工信息的插入姓名并按照字典升序排列
5、print(SLNode*head)职工信息的输出
6、printLink(SLNode*head)职工信息的显示
7、ListDelete(SLNode*head)职工信息的删除
8、ListModify(SLNode*head)职工信息的修改
9、Listfind(SLNodehead)职工信息的查找
10、Listpaixu(SLNode*head)职工信息的排序
11、main()主函数
●各程序模块之间的调用关系(子程序编号见上):
主函数可调用子程序2,6,7,8,9,10
子程序6可调用子程序5
子程序7,9,10可调用子程序6
●功能实现过程
voidFindbyName(SLNodehead)//按姓名查找职工
{
if(链表为空)
{
输出("名单中无职工信息,查询失败!
");
返回主菜单
}
输出("请输入姓名:
");
输入姓名;
if(如果存在这个人)
{
输出该员工信息;
}
if(没有找到输入的信息)
输出("职工名单中不存在此人!
");
否则,输出("查询成功!
继续操作!
");
}
voidDeletebyNum(Worker&wor,charDeleteNum[])//按编号删除员工信息
{
if(记录中没有此员工)
输出“对不起,没有此人信息!
”;
if(记录中有此此人)
{
把此员工共各项信息置为空;
输出“成功删除此员工信息!
”;
}
}
voidListModify(SLNode*head)//职工信息的修改
{
if(名单为空)
{
输出("职工名单无职工信息,无须修改!
");
}
输出("请输入要修改的职工姓名:
");
输入职工姓名;
if(查找到了该职工的信息)
{
输出("依次写入该职工的新信息:
");
输出("请输入职工信息:
姓名、性别、出生年月、工作年月、学历、职务、住址、电话\n");
按格式输入员工各项新的信息;
输出("修改成功!
请继续操作!
");
}
}
if(没有此员工)
输出("此职工不存在,无法修改其信息!
");
}
voidListpaixu(SLNode*head)//按姓名对职工信息进行排序
{
if(职工链表为空)
输出("名单中无职工信息,无法排序!
");
else
统计职工人数;
对全部职工信息按姓名进行排序;
输出("排好序的信息如下:
");
输出排好序的员工信息;
}
●系统程序功能流程图
三详细设计
SLNode*ListInsert(SLNode*head,DataTypex)//职工信息的插入姓名并按照升序排列
{
SLNode*p,*q,*s;
p=head->next;
if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL)
exit
(1);//动态分配存储空间
q->born_date=x.born_date;
q->work_date=x.work_date;
q->tele_num=x.tele_num;
strcpy(q->name,x.name);
q->sex=x.sex;
strcpy(q->degree,x.degree);
strcpy(q->job,x.job);
strcpy(q->address,x.address);
if(head->next==NULL)
{//如果只有链表的头结点,没有其他的结点,直接插入在头结点后面
head->next=q;
head->next->next=NULL;
}
else
{//链表非空
for(;p;p=p->next)
{
if(p->next!
=NULL)
{
if(strcmp(p->name,x.name)<0&&strcmp(p->next->name,x.name)>0)
{//位于两个结点之间
s=p->next;
p->next=q;
q->next=s;
break;
}
//elseif(strcmp(p->name,x.name)==0)break;//如果姓名相同则不插入信息
}
elseif(strcmp(p->name,x.name)<0&&p->next==NULL)
{//链表非空,并且在排序中是最后一个
p->next=q;
q->next=NULL;
break;
}
if(strcmp(p->name,x.name)>0)
{//位于链表头结点之后的位置
s=head->next;
head->next=q;
q->next=s;
break;
}
}
}
returnhead;
}
voidListDelete(SLNode*head)//职工信息的删除
{
SLNode*p,*s;
charx[20];
s=head;
p=head->next;
if(head->next==NULL)
{
printf("名单中无此职工信息,无须删除!
\n");
return;
}
printf("请输入要删除职工的姓名:
\n");
scanf("%s",x);
for(p;p;p=p->next)
{
if(strcmp(p->name,x)==0)
{
s->next=p->next;
free(p);
printf("删除成功!
请继续操作!
\n");
printLink(head);
break;
}
s=p;
}
if(p==NULL)
printf("名单中无此职工信息,无须删除!
\n");
}
voidListModify(SLNode*head)//职工信息的修改
{
DataTypex;
SLNode*p;
p=head->next;
if(p==NULL)
{
printf("职工名单无职工信息,无须修改!
\n");
return;
}
printf("请输入要修改的职工姓名:
\n");
scanf("%s",x.name);
for(;p;p=p->next)
{
if(strcmp(x.name,p->name)==0)
{
printf("依次写入该职工的新信息:
\n");
printf("请输入职工信息:
\n编号、姓名、性别、出生年月、学历、职务、住址、电话\n");
scanf("%ld%s%c%ld%s%s%s%ld",&x.work_num,x.name,&x.sex,&x.born_date,x.degree,x.job,x.address,&x.tele_num);
printf("修改成功!
请继续操作!
\n");
break;
}
}
if(p==NULL)
printf("此职工不存在,无法修改其信息!
\n");
}
voidListfind(SLNodehead)//按编号查找职工
{
inti,j;
SLNode*p;
DataTypex;
if(head.next==NULL)//链表为空
{
printf("名单中无职工信息,查询失败!
\n");
return;
}
//返回主菜单
p=head.next;
printf("请输入编号:
");
scanf("%ld",&x.work_num);
j=0;
for(p;p;p=p->next){
if(p->work_num==x.work_num){
++j;
printf("\n编号、性别、出生年月、学历、职务、住址、电话\n");
printf("%ld%s%c%ld%s%s%s%ld\n",p->work_num,p->name,p->sex,p->born_date,p->degree,p->job,p->address,p->tele_num);
}
}
if(j==0)
printf("职工名单中没有这个编号的!
\n");
elseprintf("查询成功!
请继续操作!
\n");
}
四设计与调试分析
测试是使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验是否满足规定的需求或弄清预期结果与实际结果之间的差别。
在调试查询修改功能过程中,查询的结果显示,没有找到职工信息,最后发现查找的结点不正确,查询应该与输入的值和头结点next比较。
此外查询结点不知道如何循环,反复修改程序才知道如何继续查找而不出错误。
本次课程设计是围绕数据结构进行。
根据问题描述可知,需要解决问题并不复杂,整个问题只需要实现一个职工管理系统功能,那就是在这个系统中实现对职工信息的插入、删除、查询、排序、修改以及保存。
但是,为了实现该功能,却需要优秀的算法和数据结构以保证实现的时间和空间效率。
把职工信息存储在一个单链表中,利用指针实现对职工信息的各项基本操作。
虽然设计的程序完成了题目描述所需要实现的功能,但是仍然存在不如人意的地方。
可以排序上面多设计几个算法,实现多角度排序。
经过这次数据结构课程设计,我们不仅及时巩固的了数据结构、算法、以及软件工程的知识,并明白数据结构和算法对于程序时间和空间性能的影响,及软件工程提供的开发流程和工具对于实现特定功能程序的重要意义。
当我们面对一个实际问题,应该迅速根据问题性质和特点抽象成特定的数据结构,当然每个问题都有可能能够抽象成多种数据结构,每种数据结构适应于不同的算法。
因此应该综合考虑这样的数据结构、算法以及它们的空间和时间效率,然后从中选择一个作为实现程序的基础。
此外,对程序的测试应该要仔细,根据模块的特点和测试阶段,采用各种软件测试方法对程序进行测试,确保各个模块的正确性和完整性,最后集成起来测试其是否正确和完整地实现了问题描述中要求的功能。
五用户手册
1、运行程序,首先会出现职工管理系统主界面。
主界面包括六个选项:
退出管理系统、增加职工信息、删除职工信息、查询职工信息、修改职工信息、职工信息的排序。
2、首先选择选项1,进行新员工的录入,包括员工的编号、姓名、性别等多项信息;待输入若干个员工信息后,所有员工的信息能全部显示出来;
3、选择选项2——删除某个职工的信息,里面是需要输入删除职工的名字,删除后还显示剩余的职工信息;若输入的姓名不存在,系统则会提示“此人不存在,不需要进行删除!
”;
4、选择选项3——查询职工的信息,会出现一个子菜单,有四个选项:
0--退出查询子系统、1--对姓名进行查询、2--按编号进行查询、3--按员工电话进行查询。
选择0时,回退出查询子菜单,返回到系统主界面;选择1后,需要输入姓名,然后可查询出该职工的所有信息;同样,选择2或3选项后,输入相应的编号或电话,即可得出对应的职工的信息;
5、选择选项4——修改职工信息,输入所需修改的职工姓名,之后就可以重新输入该职工的所有项目信息,输入完成后会显示修改成功;
6、选择选项5——按特点条件排序,里面也是会出现一个子菜单,包括0—退出排序系统,返回主系统,1—按照编号进行排序,2—按照姓名进行排序。
分别选择1或2后按回车键,系统会自动将职工的排序信息全部显示出来。
若输入其他信息,如“3”或“a”,系统会提示输入有误,并自动返回排序的菜单界面;
7、选择选项0——退出管理系统,则会提示提示“您已经成功退出职工管理系统,谢谢使用!
”,此时已退出该员工管理系统,不能再进行信息输入。
六测试成果
1、系统主界面及功能1的截图:
2、按姓名查询职工界面
3、按编号查询职工界面
4、按电话查询职工界面
5、按编号进行职工信息的排序
6、按姓名进行职工信息的排序
7、删除职工信息
8、修改职工信息
9、正常退出职工管理系统
七附录(源程序清单)
#include
#include
#include
#defineALLMAX100//总共统计的职工的人数
typedefstructNode
{
longintborn_date,tele_num,work_num;
charsex,name[ALLMAX],degree[ALLMAX],job[ALLMAX],address[ALLMAX];
structNode*next;
}SLNode;
typedefstruct
{
longintborn_date,work_num,tele_num;
charname[ALLMAX],sex,degree[ALLMAX],job[ALLMAX],address[ALLMAX];
}DataType;
voidListInitiate(SLNode**head)//链表初始化
{
if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL)
exit
(1);//动态分配存储空间
(*head)->next=NULL;
}
//职工信息的插入姓名并按照字典升序排列
SLNode*ListInsert(SLNode*head,DataTypex)
{
SLNode*p,*q,*s;
p=head->next;
if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL)
exit
(1);
q->born_date=x.born_date;
q->work_num=x.work_num;
q->tele_num=x.tele_num;
strcpy(q->name,x.name);
q->sex=x.sex;
strcpy(q->degree,x.degree);
strcpy(q->job,x.job);
strcpy(q->address,x.address);
if(head->next==NULL)
{//如果只有链表的头结点,没有其他的结点,直接插入在头结点后面
head->next=q;
head->next->next=NULL;
}
else
{//链表非空
for(;p;p=p->next)
{
if(p->next!
=NULL)
{
if(strcmp(p->name,x.name)<0&&strcmp(p->next->name,x.name)>0)
{//位于两个结点之间
s=p->next;
p->next=q;
q->next=s;
break;
}
//elseif(strcmp(p->name,x.name)==0)break;//如果姓名相同则不插入信息
}
elseif(strcmp(p->name,x.name)<0&&p->next==NULL)
{//链表非空,并且在排序中是最后一个
p->next=q;
q->next=NULL;
break;
}
if(strcmp(p->name,x.name)>0)
{//位于链表头结点之后的位置
s=head->next;
head->next=q;
q->next=s;
break;
}
}
}
returnhead;
}
voidprint(SLNode*head)//职工信息的显示
{
for(SLNode*p=head->next;p;p=p->next)//输出所有职工的信息
printf("%ld%s%c%ld%s%s%s%ld\n",p->work_num,p->name,p->sex,p->born_date,p->degree,p->job,p->address,p->tele_num);
}
voidprintLink(SLNode*head)//职工信息的显示
{
printf("职工名单:
\n编号、姓名、性别、出生年月、学历、职务、住址、电话\n");
print(head);
}
voidListDelete(SLNode*head)//职工信息的删除
{
SLNode*p,*s;
charx[20];
s=head;
p=head->next;
if(head->next==NULL)
{
printf("名单中无此职工信息,无须删除!
\n");
return;
}
printf("请输入要删除职工的姓名:
\n");
scanf("%s",x);
for(p;p;p=p->next)
{
if(strcmp(p->name,x)==0)
{
s->next=p->next;
free(p);
printf("删除成功!
请继续操作!
\n");
printLink(head);
break;
}
s=p;
}
if(p==NULL)
printf("名单中无此职工信息,无须删除!
\n");
}
voidListModify(SLNode*head)//职工信息的修改
{
DataTypex;
SLNode*p;
p=head->next;
if(p=