职工管理系统课程设计报告.docx
《职工管理系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《职工管理系统课程设计报告.docx(40页珍藏版)》请在冰豆网上搜索。
职工管理系统课程设计报告
分类号编号
华北水利水电学院
NorthChinaInstituteofWaterConservancyandHydroelectricPower
课程设计
题目职工管理系统
院系信息工程学院
专业计算机科学与技术
姓名
学号
指导教师
2012年7月6日
1需求分析
职工管理系统是一个工作单位不可缺少的管理工具,它管理的数据对于公司的决策者和管理者来说都至关重要,所以职工管理系统应该能够为用户提供充足的信息和快捷的查询手段。
但一直以来各个公司基本上都是靠传统的人工方式来管理职工信息,这种管理方式存在着许多缺点,如:
效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于信息的查找、更新和维护都带来了不少的困难。
当今社会,信息迅速膨胀,随着各个公司的规模增大,有关信息管理工作所涉及的数据量越来越大,职工信息量也大大增加,利用传统的手工查询、登记、修改等方法的处理速度远远跟不上公司的需求,有的公司不得不靠增加人力、物力来进行信息管理。
随着计算机技术的不断提高,计算机作为知识经济时代的产物,其强大的功能已为人们深刻认识,它已进入人类社会的各个行业和领域并发挥着越来越重要的作用,成为人们工作和生活中不可缺少的一部分。
而作为计算机应用的一部分,使用计算机对职工进行管理,具有手工管理所无法比拟的优点。
例如:
检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。
这些优点能够极大地提高职工管理的效率,也是公司的科学化、正规化管理和与世界接轨的重要条件。
职工管理系统作为一种管理软件正在各公司中得到越来越广泛的应用,且已达到了良好效果。
简单的职工管理系统:
1.1问题描述
对单位的职工进行管理,包括插入、删除、查找、排序等功能。
1.2要求
职工对象包括姓名(字符串)、性别(字符)、出生年月(数字)、工作年月(数字)、学历(字符串)、职务(字符串)、住址(字符串)、电话(字符串)等信息。
(1)新增一名职工:
将新增职工对象按姓名以字典方式职工管理文件中。
(2)删除一名职工:
从职工管理文件中删除一名职工对象。
(3)查询:
从职工管理文件中查询符合某些条件的职工。
(4)修改:
检索某个职工对象,对其某些属性进行修改。
(5)排序:
按某种需要对职工对象文件进行排序。
1.3实现功能
(1)由键盘输入职工对象,以文件方式保存。
程序执行时先将文件读入内存。
(2)对职工对象中的“姓名”按字典顺序进行排序。
(3)对排序后的职工对象进行增、删、查询、修改、排序等操作。
2概要设计
2.1输入功能的实现:
要想实现职工管理系统的输入,必须要建立一个职工信息系统的抽象数据类型,其中职工信息以链表的存储方式实现。
由键盘输入职工对象,以文件方式保存。
程序执行时先将文件读入内存。
2.2系统处理功能的实现:
系统管理员根据公司的人员流动情况,在提示信息的提示下,选择相应的服务进行操作。
如对职工对象中的"姓名"按字典顺序进行排序;对排序后的职工对象进行增、删、查询、修改、排序等操作。
2.3输出功能的实现:
根据选择的操作,输出与之对应的信息。
综上可以绘制出职工管理功能的系统流程图,如图1所示
图1系统流程图
2.4系统功能结构
根据职工管理系统问题的分析和设计要求,可以得到该职工管理系统可以分为五个模块:
职工信息添加模块、职工信息修改模块、职工信息删除模块、职工信息查询模块、职工信息排序模块。
其系统功能结构如图2所示。
图2系统功能结构图
2.5模块函数构造
根据系统功能结构图的描述,可以构造出该系统的抽象数据类型和相对应的函数,其方法名和功能如表1所示。
表1函数功能表
模块
函数或数据结构
功能
链表数据类型
typedefstructEnode
定义链表结点
voidInitLst(Employee*&head)
初始化链表
系统处理模块
voidFirstInsert(Employee*&head)
插入职工信息
intDeleteByName(Employee*&head,char*name)
删除职工信息
intAlterLst(Employee*&head,char*name)
修改职工信息
intSave(Employee*&head)
保存职工信息
intLoad(Employee*&head)
加载职工信息
voidSearch(Employee*&head,int&n)
查询职工信息
voidSortByBorn(Employee*&head)
职工信息排序
输出模块
voidDisplay(Employee*&head)
显示职工信息
2.6模块间调用关系
根据需求分析和概要分析,可得出职工管理系统的各模块调用关系。
如图2所示
图3模块调用关系图
3详细设计
3.1抽象数据类型定义
(1)定义表结点(typedefstructEnode)
typedefstructEnode//职工结点类型
{
charEname[MAXSIZE];//姓名
charsex[3];//性别
charbornDate[11];//出生日期
charworkDate[11];//工作日期
chardegree[MAXSIZE];//学历
charjob[MAXSIZE];//职位
charaddress[MAXSIZE];//地址
charteleNum[12];//电话号码
Enode*next;
}Employee;
(2)初始化链表(voidInitLst(Employee*&head)
voidInitLst(Employee*&head)//初始化职工链表
{
head=(Employee*)malloc(sizeof(Employee));
head->next=NULL;
}
3.2主函数设计
(1)根据详细设计要求,可以得到主函数代码及其对应的程序流程图:
在主函数中,实现了友好的界面设计。
系统需要输入职工的基本信息:
姓名、性别、出生年月、工作年月、学历、职务、住址、电话等。
这个系统还利用键盘输入提供的主菜单服务,在主菜单中,有七种操作的调用:
新增职工信息:
voidFirstInsert(Employee*&head)//添加职工信息
查询职工信息:
voidSearch(Employee*&head,int&n)//按属性查找职工
删除职工信息:
intDeleteByName(Employee*&head,char*name)//根据姓名删除
修改职工信息:
intAlterLst(Employee*&head,char*name)//修改职工信息
职工信息排序:
voidSortByBorn(Employee*&head)//按出生日期排序(选择法)
voidSortByName(Employee*&head)//按姓名排序(冒泡法)
保存职工信息:
intSave(Employee*&head)//将职工信息保存到文件中
显示职工信息:
voidDisplay(Employee*&head)//显示职工信息
函数代码见附录
3.3查找算法设计
在查询算法中,职工管理系统提供了七种查询操作,实现了系统的人性化查询操作。
这些查询操作分别为:
对姓名进行查询,对性别进行查询,对出生年月进行查询,对工作年月进行查询,对学历进行查询,对职位进行查询,对住址进行查询,对电话进行查询等一些列操作。
查找算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。
查询算法的核心代码为:
voidSearch(Employee*&head,int&n)//按给定信息查找职工
{
if(head==NULL||head->next==NULL)
return;
intflag=0;
Employee*p=head->next;
switch(n)
{
case2:
charborn[11];
cout<<"请输入出生日期:
";
cin>>born;
cin.ignore();
while(p)
{
if(strcmp(p->bornDate,born)==0)
{
Print(p);
flag=1;
}
p=p->next;
}
if(!
flag)
cout<<"不存在此职工!
";
break;
case3:
charwork[11];
cout<<"请输入工作日期:
";
cin>>work;
cin.ignore();
while(p)
{
if(strcmp(p->workDate,born)==0)
{
Print(p);
flag=1;
}
p=p->next;
}
if(!
flag)
cout<<"不存在此职工!
";
break;
case4:
chardegree[MAXSIZE];
cout<<"请输入学历:
";
cin>>degree;
cin.ignore();
while(p)
{
if(strcmp(p->degree,degree)==0)
{
Print(p);
flag=1;
}
p=p->next;
}
if(!
flag)
cout<<"不存在此职工!
";
break;
case5:
charjob[MAXSIZE];
cout<<"请输入职位:
";
cin>>job;
cin.ignore();
while(p)
{
if(strcmp(p->job,job)==0)
{
Print(p);
flag=1;
}
p=p->next;
}
if(!
flag)
cout<<"不存在此职工!
";
break;
case6:
charaddress[MAXSIZE];
cout<<"请输入地址:
";
cin>>address;
cin.ignore();
while(p)
{
if(strcmp(p->address,address)==0)
{
Print(p);
flag=1;
}
p=p->next;
}
if(!
flag)
cout<<"不存在此职工!
";
break;
}
}
3.4显示算法设计
在显示算法设计中,需要显示所有职工的如下信息:
姓名、性别、出生年月、工作年月、学历、职务、住址、电话。
显示算法的核心代码为:
voidDisplay(Employee*&head)//显示职工信息
{
if(head->next==NULL)
{
cout<<"职工信息为空!
"<return;
}
Employee*p=head->next;
cout<<"职工信息如下:
"<cout<<"**************************************";
cout<<"**************************************"<cout.setf(ios:
:
left,ios:
:
adjustfield);
cout<cout<cout<cout<cout<cout<cout<cout<while(p)
{
cout.setf(ios:
:
left,ios:
:
adjustfield);
cout<Ename;
cout<sex;
cout<bornDate;
cout<workDate;
cout<degree;
cout<job;
cout<address;
cout<teleNum<p=p->next;
}
}
4测试与分析
测试是使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验是否满足规定的需求或弄清预期结果与实际结果之间的差别。
职工信息有:
姓名、性别、出生年月、工作年月、学历、职务、住址、电话。
在数据输入时注意数据类型:
现有6组测试数据:
姓名、性别、出生年月、工作年月、学历、职务、住址、电话
胡文云女1990-062010-11本科职工新乡1234
李明男1988-092010-11研究生经理郑州123456
思彤女1988-112011-11研究生经历郑州12435654
王芳女1990-112010-11研究生经历许昌12435654
月牙女1987-092009-11本科经理新郑123687
赵灵歌女1989-092011-11本科职工郑州123
系统运行结果:
4.1进入职工管理系统主界面:
图4进入职工管理系统主界面
4.2选择6显示文件中的所有职工信息:
图5显示职工信息
4.3选择4进入查询子菜单,查询给定信息的职工:
图6显示查询子菜单
(1)选择1查询给定姓名为李明的职工的信息:
图7显示姓名为李明的所有职工的信息
(2)选择2查询出生日期为1990-11的所有职工的信息:
图8显示出生日期为1990-11所有职工的信息
选择3查询工作日期为2010-11的所有职工的信息:
(3)选择4查询学历为研究生的所有职工的信息:
图9显示学历为研究生所有职工的信息
(4)选择5查询职位为职工的职工的信息:
图10显示职位为职工所有职工的信息
(5)选择6查询地址为郑州的所有职工的信息:
图11显示地址为郑州的所有职工的信息
五用户使用说明
进入职工管理系统,首先看到的就是欢迎界面,提示:
选择1添加职工信息,按提示,按次序依次输入职工的姓名、性别、出生年月、工作年月、学历、职务、电话的信息(注意是依次输入,中间可以用空格,tab,回车做切换输入),输完信息后自动回到主界面,根据提示:
-1.退出管理系统1.添加职工信息2.删除职工信息3.修改职工信息4.查询职工信息5.选条件排序6.显示职工信息,输入相应操作的数字,
如-1,退出职工管理系统;
如1,提示依次输入职工信息,录入完毕自动返回主界面;
如2,提示输入要删除的职工的姓名,成功正确返回,错误有提示信息删除失败;
如3,提示输入要修改信息的职工姓名,然后进行依次修改职工所有信息;
如4,提示查询方式,进入查询子菜单:
0.退出查询子菜单,回到主菜单1.按姓名查询2.按出生日期查询3.按工作日期查询,4.按学历查询5,按职位查询6按地址查询,输入相应编号进行查询;
如5,提示方式排序,进入排序子菜单:
0.退出排序系统子菜单,回到主菜单1.按姓名排序2.按出生日期排序;
如6,显示系统内所有职工信息;
6总结
本次课程设计是围绕数据结构进行。
根据问题描述可知,需要解决问题并不复杂,整个问题只需要实现一个职工管理系统功能,那就是在这个系统中实现对职工信息的插入、删除、查询、排序、修改以及保存。
但是,为了实现该功能,却需要优秀的算法和数据结构以保证实现的时间和空间效率。
把职工信息存储在一个单链表中,利用指针实现对职工信息的各项基本操作。
虽然设计的程序完成了题目描述所需要实现的功能,但是仍然存在不如人意的地方。
那就是可以排序上面多设计几个算法。
实现多角度排序。
在这个系统中没有职工序号的信息,所以允许职工姓名相同,在很大程度上面,可能是的职工信息重复。
经过这次数据结构课程设计,我们不仅及时巩固的了数据结构、算法、以及软件工程的知识,并明白数据结构和算法对于程序时间和空间性能的影响,及软件工程提供的开发流程和工具对于实现特定功能程序的重要意义。
当我们面对一个实际问题,应该迅速根据问题性质和特点抽象成特定的数据结构,当然每个问题都有可能能够抽象成多种数据结构,每种数据结构适应于不同的算法。
因此应该综合考虑这样的数据结构、算法以及它们的空间和时间效率,然后从中选择一个作为实现程序的基础。
此外,对程序的测试应该要仔细,根据模块的特点和测试阶段,采用各种软件测试方法对程序进行测试,确保各个模块的正确性和完整性,最后集成起来测试其是否正确和完整地实现了问题描述中要求的功能。
参考文献:
[1]李云清,杨庆红,揭安全.数据结构(C语言版)[M].北京:
人民邮电大学出版社,2004.6
[2]潘彦.算法设计与分析基础[M].北京:
清华大学出版社,2007.1
[3]肖梦强,曲秀清.软件工程——原理、方法与应用[M].北京:
中国水利水电出版社,2005.10
[4]吕凤翥.C++语言程序设计(第2版)[M].北京:
电子工业出版社,2007.2
[5]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2002.9
[6]谭浩强.C程序设计(第四版)[M].北京.清华大学出版社,2010.6
附录:
程序源代码:
#include
#include
#include
#include
#include
#include//头文件
#defineMAXSIZE20
typedefstructEnode
{
charEname[MAXSIZE];//姓名
charsex[3];//性别
charbornDate[11];//出生日期
charworkDate[11];//工作日期
chardegree[MAXSIZE];//学历
charjob[MAXSIZE];//职位
charaddress[MAXSIZE];//地址
charteleNum[12];//电话号码
Enode*next;
}Employee;//职工结点类型
voidInitLst(Employee*&head)//初始化职工链表
{
head=(Employee*)malloc(sizeof(Employee));
head->next=NULL;
}
intCheckSex(char*s)//检查性别是否合法
{
if(strcmp(s,"男")==0||strcmp(s,"女")==0)
return1;
else
return0;
}
intCheckName(Employee*&head,char*name)//检查姓名是否合法
{
Employee*p=head->next;
if(name==NULL)
return1;
else
while(p)
{
if(strcmp(p->Ename,name)==0)
return1;
p=p->next;
}
return0;
}
voidPrint(Employee*&p)//用以输出满足查询条件的职工信息
{
cout<cout.setf(ios:
:
left,ios:
:
adjustfield);
cout<Ename;
cout<sex;
cout<bornDate;
cout<workDate;
cout<degree;
cout<job;
cout<address;
cout<teleNum<}
voidFirstInsert(Employee*&head)//添加职工信息
{
if(head==NULL)
return;
Employee*p=(Employee*)malloc(sizeof(Employee));//生成一个新结点
p->next=NULL;
cout<<"请输入职工相关信息:
"<cin.ignore();
cout<<"||姓名:
";
cin>>p->Ename;
cin.ignore();
while(head->next!
=NULL&&CheckName(head,p->Ename))
{
cout<<"姓名重复,请重新输入:
";
cin>>p->Ename;
cin.ignore();
}
cout<<"||性别:
";
cin>>p->sex;
cin.ignore();
while(!
CheckSex(p->sex))
{
cout<<"数据不合法,请重新输入:
";
cin>>p->sex;
cin.ignore();
}
cout<<"||出生日期:
";
cin>>p->bornDate;
cin.ignore();
cout<<"||工作日期:
";
cin>>p->workDate;
cin.ignore();
cout<<"||学历:
";
cin>>p->degree;
cin.ignore();
cout<<"||职位:
";
cin>>p->job;
cin.ignore();
cout<<"||地址:
";
cin>>p->address;
cin.ignore();
cout<<"||电话号码:
";
cin>>p->teleNum;
cin.ignore();
p->next=head->next;
head->next=p;
cout<<"信息插入成功!
"<}
intDeleteByName(Employee*&