数据结构课程设计之职工工资管理系统2.docx
《数据结构课程设计之职工工资管理系统2.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之职工工资管理系统2.docx(40页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之职工工资管理系统2
**大学
数据结构课程设计报告
题目:
院(系):
计算机工程学院
学生姓名:
班级:
学号:
起迄日期:
2011.6.20-2011.7.01
指导教师:
指导教师评语:
成绩:
签名:
年月日
2010—2011年度第2学期
一、需求分析
1.问题描述
对单位的职工进行管理,包括插入、删除、查找、排序等功能。
2.基本功能要求
职工对象包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。
(1)新增一名职工:
将新增职工对象按姓名以字典方式职工管理文件中。
(2)删除一名职工:
从职工管理文件中删除一名职工对象。
(3)查询:
从职工管理文件中查询符合某些条件的职工。
(4)修改:
检索某个职工对象,对其某些属性进行修改。
(5)排序:
按某种需要对职工对象文件进行排序。
3.输入和输出
输入和输出,根据输入提示,输入数字或输入长度最长10字符串
二、概要设计
1.设计思路
根据职工管理系统问题的描述和详细需求分析,要达到上述功能,链表的数据结构来存储职工信息,并对其进行相应的插入、删除、修改、查询、排序、保存等操作。
(1)输入功能的实现:
要想实现职工管理系统的输入,必须要建立一个职工信息系统的抽象数据类型,其中职工信息以链表的存储方式实现。
(2)系统处理功能的实现:
系统管理员根据公司的人员流动情况,在提示信息的提示下,选择相应的服务进行操作。
(3)输出的实现:
根据选择的操作,输出与之对应的信息。
(4)根据职工管理系统问题的分析和设计要求,可以得到该职工管理系统可以分为五个模块:
职工信息添加模块、职工信息修改模块、职工信息删除模块、职工信息查询模块、职工信息排序模块
2.数据结构设计
依据给定的数据格式,个人信息由九个字段来组成,即编号、姓名、性别、生日、学历、工龄,职务、电话和住址,外加一个判断关键字。
使用线性结构来组织数据,因为数据占据空间比较大,要对表中某项数据进行操作,所以使用链表比较方便。
(1)定义头结点
typedefstructnode
{
charid[10];charname[10];charsex[10];charbirth[10]chargl[10];
charxueli[10];charzhiwu[10];charphone[10];charaddress[10];
structnode*next;
}node,*linklist;
(2)基本操作操作
intinitlist(linklist&L)//建立链表
intcreatlist(linklist&L)//创建职工信息:
intdel(linklist&L,charid[10])//删除职工信息:
intsearchid(linklist&L,charid[10])//查找职工信息
voiddisplay(linklist&L)//显示职工信息:
3.软件结构设计
(1)
模块
函数或数据结构
功能
链表数据类型
typedefstructNode
定义链表结点
intinitlist(linklist&L)
初始化链表
函数列表
intcreatlist(linklist&L)
创建职工信息
intxinlist(linklist&L)
新增员工信息
intdel(linklist&L,charid[10])
删除职工信息
intxiugai(linklist&L,charid[10])
修改职工信息
voidsave(linklist&L)
保存职工信息
intsearchid(linklist&L,charid[10])
查询职工信息
intsearchid(linklist&L,charname[10])
查询职工信息
voidsortgl(linklist&L)(按工龄)
职工信息排序
voidsortnm(linklist&L)(按名字字典)
职工信息排序
voidsortid(linklist&L)(按编号)
职工信息排序
node*load(node*L)
载入员工信息
voiddisplay(linklist&L)
显示员工信息
三、详细设计
1.程序中所用到的函数原型,操作实现
//初始化链表
intinitlist(linklist&L)
{L=(linklist)malloc(sizeof(node));
if(!
L)
return(0);
L->next=NULL;
return1;}
//创建链表信息
intcreatlist(linklist&L)
{linklistp;
p=(linklist)malloc(sizeof(node));
scanf(q->data);}
p->next=L->next;
L->next=p;
return(0);}
//显示函数实现
voiddisplay(linklist&L)
{linklistp;
for(p=L->next;p;p=p->next)
{printf(p-.>data)//输出职工信息
}
}
//删除
intdel(linklist&L,chara[10])//按id删除4
{node*p,*r;声明节点指针
p=L->next;r=L;
while(p)//节点不为空
{if(strcmp(p->a,a)==0)
{i=1;r->next=p->next;
free(p);//释放查找到的节点
printf("删除成功\n");
break;}
r=p;
p=p->next;
}
if(i==0)printf("找不到需要删除的信息!
\n");
return1;
}
//查找操作的实现
intsearchid(linklist&L,chara[10])
{
node*p;
p=L;
while(p)
{
if(strcmp(p->a,a)==0)
{printf(p-.>data)//输出职工信息}
p=p->next;
}
return1;
}
2.主函数和其他函数的伪码算法;
2.
(1)主函数的伪码
voidmain()
{linklistL;initlist(L);
while(x)//
{scanf(y)//输入选择数字
switch(y)
{case1:
creatlist(L);break;
case2:
scanf(,&id);//输入员工编号
xiugai(L,id);//调用修改函数
case3:
scanf("%s",&id);//输入删除员工编号
del(L,id);//调用删除函数
case4:
scanf(,&a);//请输入查询方式
if(a==1)
{scanf(&id);//输入员工编号
searchid(L,id);//调用查找函数
if(a==2)
{scanf(&name);//输入查询员工姓名
searchname(L,name);//调用查找函数}
case5:
scanf("%d",&k)//输入排序方式
switch(k)//输入选择
{case1:
sortid(L)//调用排序函数
case2:
sortnm(L)//调用排序函数
case3:
sortgl(L)//调用排序函数}
case6:
display(L)//调用显示函数
case7:
save(L);///调用保存函数
case8:
xinlist(L);//调用修改函数
case9:
L=load(L);调用载入函数}
2.1新增信息
intxinlist(linklist&L)//职工信息的插入姓名并按照升序排列
{q=(linklist)malloc(sizeof(node));//申请新节点
{
scanf(,q->data)//输入员工信息
}
if(L->next==NULL)//如果只有链表的头结点,没有其他的结点,直接插入在头结点后面
{L->next=q;q->next=NULL;}
else{if(strcmp(L->next->name,q->name)>0)//位于链表头结点之后的位置
{q->next=L->next;L->next=q;}
for(p=L->next;p;p=p->next)
{if(p->next!
=NULL)
{if(strcmp(p->name,q->name)<0&&strcmp(p->next->name,q->name)>0)//位于两个结点之间
{q->next=p->next;p->next=q;}
elseif(strcmp(p->name,q->name)<0&&p->next==NULL)//链表非空,并且在排序中是最后一个
{p->next=q;q->next=NULL;break;}
}
}
}return(0);
}
2.2修改信息
intxiugai(linklist&L,chara[10])
{node*p;//声明节点指针
p=L;
while(p)
{if(strcmp(p->a,a)==0)//查找符合要求的员工信息
{i=1;//找到后i=i,做标志
scanf(q->data)//输入员工信息
p=p->next;}
if(i==0)
printf("不存在修改的学生!
\n");
else
printf("修改成功!
\n");
return1;
}
2.3排序信息程序
voidsort(linklist&L)
{
linklistLa;//声明节点指针
linklistp,q,m;//声明节点指针
La=(linklist)malloc(sizeof(node));申请新节点
La->next=NULL;
while(L->next)
{for(q=L->next,p=L->next;p->next;p=p->next)//依次选出工龄最大的节点
{if((strcmp(p->next->a,q->a))>0)
{m=p;q=p->next;}
}
if(q==L->next)//删除符合的节点
{L->next=L->next->next;}
else
{m->next=q->next;}
q->next=La->next;//建立新链表
La->next=q;
}
L=La;
display(L);//调用显示函数
}
2.4保存信息伪码
voidsave(linklist&L)//7保存
{
FILE*fp;//定义指向文件的指针
node*p;//定义移动指针
scanf(outfile)//提示文件名格式信息
if((fp=fopen(outfile,"wb"))==NULL)//为输出打开一个二进制文件,如没有则建立
{printf("cannotopenfile\n");
exit
(1);
}p=L;//移动指针从头指针开始
while(p!
=NULL)//如p不为空
{fwrite(p,sizeof(node),1,fp);//写入一条记录
p=p->next;//指针后移}
fclose(fp);//关闭文件
}
2.5载入信息伪码
node*load(node*L)//9载入信息
{
node*p,*q,*h=NULL;//定义记录指针变量
FILE*fp;//定义指向文件的指针
charinfile[10];//保存文件名
scanf,infile);//输入文件名
if((fp=fopen(infile,"rb"))==NULL)//打开一个二进制文件,为读方式
{exit
(1);}
p=(node*)malloc(sizeof(node));//申请空间
h=p;//申请到空间,将其作为头指针
while(!
feof(fp))//循环读数据直到文件尾结束
{if(1!
=fread(p,sizeof(node),1,fp))
break;//如果没读到数据,跳出循环
p->next=(node*)malloc(sizeof(node));//为下一个结点申请空间
q=p;//保存当前结点的指针,作为下一结点的前驱
p=p->next;//指针后移,新读入数据链到当前表尾}
q->next=NULL;//最后一个结点的后继指针为空
fclose(fp);//关闭文件
returnh;/*返回头指针*/}
3.1新增信息
在新增信息中,对按姓名关键字的链表进行插入新节点。
分三种情况进行插入,第一,当链表为空直接插在头结点后面;第二,当插入位置在两个节点之间;第三,插入的位置在链表的最后。
3.2删除算法设计
在删除操作中,将需要删除的节点的关键字依次与链表中每个节点的关键字作比较,找到后,删除该节点,找不到输出删除位置不合理。
3.3查询算法
在查询算法中,职工管理系统提供了2种查询操作,实现了系统的人性化查询操作。
这些查询操作分别为:
对姓名进行查询,编号进行查询,些列操作。
查找算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。
查询算法程序流程图如图4所示:
3.4排序算法设计
在排序算法中,职工管理系统提供了三种查询操作,实现了系统的基本排序操作。
这些排序操作分别为:
对姓名进行排序,对性别进行排序,对出生年月进行排序,对工作年月进行排序,等一些列操作。
排序算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。
排序算法流程图如图5所示:
图5排序算法程序流程图
3.5修改函数
在修改操作中,将需要修改的节点的关键字依次与链表中每个节点的关键字作比较,找到后,输入需要修改的节点信息节点,输出“修改成功”,找不到
出“该员工不存在”。
01
4.函数调用关系图
四.调试分析
1.编写的程序实现了,
将新增职工对象按姓名以字典方式职工管理文件中,删除一名职工:
从职工管理文件中删除一名职工对象,可以选择用编号或姓名查询职工;检索某个职工对象,对其某些属性进行修改。
按需要对职工对象的姓名,工龄,编号进行进行排序,按照用户的需要连续添加n个信息将链表信息依次存入文件,将存入文件的信息读入内存,进行各种操作
2.程序的性能分析
新增:
新增信息的算法中,用直接查找的算法,找到后直接插入时间复杂度总体为O(n)
删除:
删除的算法,依次把所删除信息的关键字与链表中的关键字依次对比,找到后删除,时间复杂度为O(n).
修改:
依次将修改信息的关键字与链表中的信息对比,找到后,输入改变后的信息。
时间复杂度为O(n)。
查找:
按用户需要,依次将查找信息的关键字与链表中的信息对比,找到后,输入改变后的信息。
时间复杂度为O(n)。
创建:
根据用户需求,依次输入n个信息,时间复杂度为O(n)。
排序:
:
用的是选择排序的算法,以此将包含最大关键字的节点选出来,然后逆向建立一条新链表,关键字间的比较次数均为n(n-1)/2,建立单链表的时间复杂度为O(n),总时间复杂度为O(n^2).
保存:
依次将链表中的信息读入文件中,时间复杂度为O(n)。
载入:
依次从文件中读入内存中n个信息,并且建立链表,时间复杂度为O(n)。
3.上机过程中出现的问题及其解决方案;
(1)删除的时候,当删除的职工编号不存在时,会出现运行错误,增加了一个标记变量,当没找到时,标记变量值不变,输出“找不到找不到需要删除的信息”。
在查找和修改程序中,找不到职工信息也出现了错误,同样用上述办法解决。
(2)新增职工信息中,需要将插入的信息关键字与链表中的信息的关键字进行对比,当比前小比后大就插入它们中间,但如果链表中只有一个信息,出现错误。
解决办法:
1.先判断链表是否为空,为空直接插入2.是否在第一个结点之前,插入,3.是否在最后一个位置,确定插入位置插入信息。
(3)当按修改删除信息时,职工姓名可能相同,造成删除错误.解决办法:
在结点数据中加入一个职工编号关键字,每个职工编号唯一,如学生学号,按编号进行删除,减少错误。
(4)从文件中读入内存时,读一个显示一个,不能用链表的方法进行查找,删除等操作.解决办法:
将读入信息的时候,直接读入结点数据中,然后建立来年链表,进行操作。
4.程序中可以改进的地方说明
在排序中,按三种关键字排序,都是用的选择排序,可以用冒泡等其它排序方法改进。
在查找中,使用的直接查找,如果存的数据比较多,可以先进行排序,连标有序后再进行折半查找。
5.程序中可以扩充的功能及设计实现假想。
可以按各种关键字进行排序,查找,在排序程序中调整排序的关键字,参照其它关键字的排序需程序进行编写扩充。
五、测试结果
2.选择1后输入员工信息
3.显示员工信息
4.按姓名排序后的显示信息
.5.新增员工信息
6.新增员工插入了排序后的员工信息中
7.删除信息
9.查询信息
10.保存信息
11.载入信息
当调用修改函数时,输入信息出错
当调用删除函数时,输入信息出错
当调用查找函数时,输入信息出错
6.用户手册
七、体会与自我评价
《数据结构》是计算机专业一门重要的基础课程,在学习本课程较系统地介绍了程序设计中常用的数据结构以及相应的存储结构和实现算法,本课程将为整个专业的学习以及软件设计水平的提高打下良好的基础而且是计算机考研的。
想要学好学好《数据结构》,并通过实践上机调试,来掌握编写一些在特定数据结构上的算法,并通过实践上机调试,更好地掌握各种数据结构及其特点,
经过本次课程设计,我对数据结构基本理论和存储结构及算法设计将有了更深入的理解,并提高我们在实际设计操作中系统分析、结构确定、算法选择、数学建模和信息加工的能力,提高我们的C/C++语言程序设计能力。
我觉得职工管理系统现实生活中,有很大的实际意义,公司里都使用职工管理,来使整个公司的管理更为有效,当然,自己做的职工管理系统比较简单,只是一个大系统的缩影。
这次课程设计是围绕数据结构进行。
根据问题描述可知,需要解决问题并不很复杂,整个问题只需要实现一个职工管理系统功能,那就是在这个系统中实现对职工信息的插入、删除、查询、排序、修改以及保存,载入等基本功能。
但是,为了实现该功能,却需要优秀的算法和数据结构以保证实现的时间和空间效率。
把职工信息存储在一个单链表中,利用指针实现对职工信息的各项基本操作。
虽然设计的程序完成了题目描述所需要实现的功能,但是仍然存在不如人意的地方。
那就是可以排序上面多设计几个算法。
实现多角度排序。
经过这次数据结构课程设计,我们不仅及时巩固的了数据结构、算法知识,并了解了数据结构和算法对于程序时间和空间性能的影响,及软件的开发流程。
当我们面对一个实际问题,应该迅速根据问题性质和特点抽象成特定的数据结构,当然每个问题都有可能能够抽象成多种数据结构,每种数据结构适应于不同的算法。
因此应该综合考虑这样的数据结构、算法以及它们的空间和时间效率,然后从中选择一个作为实现程序的基础。
此外,对程序的测试应该要仔细,根据模块的特点和测试阶段,采用各种软件测试方法对程序进行测试,确保各个模块的正确性和完整性,最后集成起来测试其是否正确和完整地实现了整个系统的功能。
源代码
#include
#include
#include
#include
typedefstructnode//定义结点类型
{
charid[10];
charname[10];
charsex[10];
charbirth[10];
chargl[10];
charxueli[10];
charzhiwu[10];
charphone[10];
charaddress[10];
structnode*next;
}node,*linklist;
//头插法生成单链表1
intcreatlist(linklist&L)
{
linklistp;
p=(linklist)malloc(sizeof(node));//生成新结点
if(!
p)
{
return(0);
}
else
{
printf("请输入员工编号\n");
scanf("%s",p->id);
printf("请输入员工姓名\n");
scanf("%s",p->name);
printf("请输入员工性别\n");
scanf("%s",p->sex);
printf("请输入员工生日\n");
scanf("%s",p->birth);
printf("请输入员工龄\n");
scanf("%s",p->gl);
printf("请输入员工学历\n");
scanf("%s",p->xueli);
printf("请输入员工职务\n");
scanf("%s",p->zhiwu);
printf("请输入员工电话\n");
scanf("%s",p->phone);
printf("请输入员工地址\n");
scanf("%s",p->address);
}
p->next=L->next;
L->next=p;
return(0);}
//初始化单链表2
intinitlist(linklist&L)
{
L=(linklist)malloc(sizeof(node));
if(!
L)
return(0);
L->next=NULL;
return1;
}
//显示所有员工信息3
voiddisplay(linklist&L)
{
linklistp;
for(p=L->next;p;p=p->next)
{
printf("编号%-10s",p->id);
printf("姓名%-10s",p->name);
printf("性别%-10s",p->sex);
printf("生日