课程设计职工管理系统Word文档下载推荐.docx
《课程设计职工管理系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《课程设计职工管理系统Word文档下载推荐.docx(37页珍藏版)》请在冰点文库上搜索。
(2)对职工对象中的“姓名”按字典顺序进行排序。
(3)对排序后的职工对象进行增、删、查询、修改、排序等操作。
2.概要设计
2.1数据结构
1、输入功能的实现:
要想实现职工管理系统的输入,必须要建立一个职工信息系统的抽象数据类型,其中职工信息以链表的存储方式实现。
由键盘输入职工对象,以文件方式保存。
2、系统处理功能的实现:
系统管理员根据公司的人员流动情况,在提示信息的提示下,选择相应的服务进行操作。
如对职工对象中的"
姓名"
按字典顺序进行排序;
对排序后的职工对象进行增、删、查询、修改、排序等操作。
3、输出的实现:
根据选择的操作,输出与之对应的信息。
综上可以绘制出职工管理功能的系统流程图,如图1所示
图1系统流程图
2.2程序模块
根据职工管理系统问题的分析和设计要求,可以得到该职工管理系统可以分为五个模块:
职工信息添加模块、职工信息修改模块、职工信息删除模块、职工信息查询模块、职工信息排序模块。
其系统功能结构如图2所示。
图2系统功能结构
2.3模块函数构造
根据系统功能结构图的描述,可以构造出该系统的抽象数据类型和相对应的函数,其方法名和功能如表1所示。
表1函数功能表
模块
函数或数据结构
功能
链表数据类型
typedefstructNode
定义链表结点
typedefstructDatatype
定义职工信息
ListInitiate(SLNode*head)
初始化链表
系统处理模块
SLNode*ListInsert(SLNode*head,DataTypex)
插入职工信息
ListDelete(SLNode*head)
删除职工信息
ListModify(SLNode*head)
修改职工信息
put(SLNode*head,FILE*fp)
保存职工信息
Listfind(SLNodehead)
查询职工信息
Listpaixu(SLNode*head)
职工信息排序
输出模块
print(SLNode*head)
显示职工信息
3.详细设计
3.1抽象数据类型定义
1)定义表结点(typedefstructNode)
typedefstructNode{
longintborn_time,work_time,tele_num;
charsex,name[ALLMAX],degree[ALLMAX],job[ALLMAX],address[ALLMAX];
structNode*next;
}SLNode;
2)定义职工信息(typedefstructDatatype)
typedefstruct{
charname[ALLMAX],sex,degree[ALLMAX],job[ALLMAX],address[ALLMAX];
}DataType;
3)初始化链表(ListInitiate(SLNode**head))
voidListInitiate(SLNode**head)//---------------------------------链表初始化
{
if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
//动态分配存储空间
(*head)->
next=NULL;
}
3.2主函数设计
(1)根据详细设计要求,可以得到主函数代码及其对应的程序流程图:
在主函数中,实现了友好的界面设计。
系统需要输入职工的基本信息:
姓名、性别、出生年月、工作年月、学历、职务、住址、电话等。
这个系统还利用键盘输入提供的主菜单服务,在主菜单中,有七种操作的调用:
新增职工信息:
查询职工信息:
删除职工信息:
修改职工信息:
职工信息排序:
保存职工信息:
显示职工信息:
(2)主函数程序流程图如图3所示:
图3主函数程序流程图
3.3查找算法设计
在查询算法中,职工管理系统提供了七种查询操作,实现了系统的人性化查询操作。
这些查询操作分别为:
对姓名进行查询,对性别进行查询,对出生年月进行查询,对工作年月进行查询,对学历进行查询,对职位进行查询,对住址进行查询,对电话进行查询等一些列操作。
查找算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。
查询算法程序流程图如图4所示:
图4查询算法程序流程图
3.4排序算法设计
在排序算法中,职工管理系统提供了四种查询操作,实现了系统的基本排序操作。
这些排序操作分别为:
对姓名进行排序,对性别进行排序,对出生年月进行排序,对工作年月进行排序,等一些列操作。
排序算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。
排序的核心代码:
for(m=1;
flag&
&
m<
=n;
n++)//对姓名进行排序
{
flag=0;
for(q=head->
next,p=head,s=p;
q;
s=p,p=q,q=q->
next){
if(p->
name[0]>
q->
name[0]){
if(head==p){
head->
next=q->
next;
head=q;
q->
next=p;
q=head->
p=head;
}
else{
p->
s->
next=q;
p=q;
q=p->
}
flag=1;
}
}
}
排序算法流程图如图5所示:
显示排序菜单
无职工信息
是
0否
1
图5排序算法流程图
4.编码调试
测试是使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验是否满足规定的需求或弄清预期结果与实际结果之间的差别。
在调试查询修改功能过程中,查询的总是不正确,查询的结果显示,没有找到职工信息,最后发现查找的结点不正确,查询应该与输入的值和头结点next比较,而不是头结点。
还有就是查询结点不知道如何循环,最后又看看了记得笔记和书,才知道如何继续查找而不出错误。
修改时总是不能正确的修改,最初时修改总是修改最后输入的数据。
最后终于找到了,又是结点写错了。
排序时注意交换的先后顺序就可以了,删除时注意交换结点的顺序。
本次课程设计是围绕数据结构进行。
根据问题描述可知,需要解决问题并不复杂,整个问题只需要实现一个职工管理系统功能,那就是在这个系统中实现对职工信息的插入、删除、查询、排序、修改以及保存。
但是,为了实现该功能,却需要优秀的算法和数据结构以保证实现的时间和空间效率。
把职工信息存储在一个单链表中,利用指针实现对职工信息的各项基本操作。
虽然设计的程序完成了题目描述所需要实现的功能,但是仍然存在不如人意的地方。
那就是可以排序上面多设计几个算法。
实现多角度排序。
在这个系统中没有职工序号的信息,所以允许职工姓名相同,在很大程度上面,可能是的职工信息重复。
经过这次数据结构课程设计,我们不仅及时巩固的了数据结构、算法、以及软件工程的知识,并明白数据结构和算法对于程序时间和空间性能的影响,及软件工程提供的开发流程和工具对于实现特定功能程序的重要意义。
当我们面对一个实际问题,应该迅速根据问题性质和特点抽象成特定的数据结构,当然每个问题都有可能能够抽象成多种数据结构,每种数据结构适应于不同的算法。
因此应该综合考虑这样的数据结构、算法以及它们的空间和时间效率,然后从中选择一个作为实现程序的基础。
此外,对程序的测试应该要仔细,根据模块的特点和测试阶段,采用各种软件测试方法对程序进行测试,确保各个模块的正确性和完整性,最后集成起来测试其是否正确和完整地实现了问题描述中要求的功能。
如4,提示输入修改职工姓名,然后进行依次修改职工所有信息;
如5,提示:
0.退出排序系统,回到主菜单1.对性别进行排序2.对出生年月进行排序3.对工作年月进行排序4.对姓名进行排序,输入号码进行查询。
测试结果:
1)进入职工管理系统,如图6所示:
图6主菜单选择界面
2)新增一职工信息并查询全部职工信息,如图7、8所示:
图7新增并查询职工信息界
3)修改职工信息并与前面信息对照,如图8所示:
图8修改职工信息界面
4)按姓名排序职工信息并显示,如图9所示
图9按姓名排序职工信息并显示
5)退出系统,如图10所示:
选择0,退出职工管理系统。
图10退出职工管理系统
5.课程设计总结
总结
这次课程设计,我们从分组,组内分工,查阅资料,实验总结,这整个实验下来,学习到很多东西。
同时也增加了我对软件设计的兴趣,程序设计对我们的好处挺多。
在学习数据结构的同时也学习并巩固了许多计算机应用软件方面的知识。
以前学习C语言时对文件指针这一块的知识学习的不透,导致这次做《职工管理系统》时涉及这方面时无从下手,无奈又拿着书重新学习一遍。
的确以前学的太差劲了,基本的单链表都把我给难住了,以前总觉得编代码很枯燥,学起来没兴趣,通过这次实验我开始发现,其实用一些简单的抽象的代码,设计出实际问题,真的蛮有意思的。
做这个实验过程中遇到很多问题,如:
要对人名进行按字典查询时不知道用什么样的方法,排序字段排序算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。
之前学习的都是理论知识,当我们拿着实际问题时,不免有点慌,我们想办法把这些实际的问题抽象化,运用所学的知识抽象化为多种数据结构和算法,然后综合考虑从中选取时间和空间性能都较好的一个。
最后就是写程序一定要细心,细心,再细心!
!
两周的实验接近尾声了,刚刚接触这个实验题目时,迷茫、不知所措,我一千次一万次的问自己,怎样才能找到课堂所学与实际应用的最佳结合?
怎样才能编写出程序,经过同伴们的讨论与研究,查阅书籍,去向其他人寻求帮助,在其他人的提示下,参考并修改,才有了如今的简单达到要求的程序。
这次实验最难的就是修错,编译老是通不过,很是头疼,还好在同组人的讨论下改好了程序。
查询的总是不正确,查询的结果显示,没有找到职工信息,最后发现查找的结点不正确,查询应该与输入的值和头结点next比较,而不是头结点。
还有,修改时总是不能正确的修改,最初时修改总是修改最后输入的数据。
这次试验对于我这个新手来说,这是一次很棒的锻炼,不仅让我知道自己的不足,还让我更深一次的了解数据结构所要掌握的思想,原来理论回归实践也不是件简单的事情。
两周的课程设计很快就结束了,而自己真正的学习之路似乎才刚刚开始。
本次课程设计过程首先进行分组分工,选题,对所选题目进行需求分析、概要设计,然后到详细的进行编码、调试,到最终能够成功运行出所需要的结果,这一切都离不开小组成员之间的团结合作。
我们三人抽选到的题目是职工管理系统,对单位职工进行管理,包括插入、删除、查找、排序等功能。
当拿到题目那一刻,我想当然的以为这不是很简单么?
不就是编写几个简单的模块来对应实现其各个功能。
可是当自己真正开始着手编写程序时,才发现自己总是这样眼高手低,一头雾水,还好有同学的帮助,再通过查找教材、上网查找资料,两周的时间才算是勉强完成此次的数据结构课程设计。
通过此次课程设计,我深刻体会到了自己上课所学的那些理论知识必须要通过实践才能完全消化与掌握,这就是理论一定要与实践相结合,二者是相辅相成的。
这两周的时间,既要做课程设计,还要准备期末考试,使自己忙的有点找不着北,不想顾此失彼,想要兼顾,可是自己终究能力有限,此刻才开始深刻反省自己:
若是平常上课认真听讲的话,那么此时也不用为了期末考试而忙得焦头烂额了吧。
看到别人淡定从容,心里是欣羡的。
若不是同学的帮助,只怕自己还真就完成不了这次课程设计,团结的力量是不可估量的,再次感谢我的小组成员。
课程设计虽然结束,可自己要学习的东西还有太多太多,自己的学习之路将永无止境,只能暗暗告诫自己,要一步一个脚印,踏踏实实,勤勤恳恳的去走未来之路。
参考文献:
[1]李云清,杨庆红,揭安全.数据结构(C语言版)[M].北京:
人民邮电大学出版社,2004.6
[2]潘彦.算法设计与分析基础[M].北京:
清华大学出版社,2007.1
[3]肖梦强,曲秀清.软件工程——原理、方法与应用[M].北京:
中国水利水电出版社,2005.10
[4]吕凤翥.C++语言程序设计(第2版)[M].北京:
电子工业出版社,2007.2
[5]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2002.9
附录
实验程序:
#include<
stdio.h>
string.h>
stdlib.h>
#defineALLMAX100//总共统计的职工的人数
longintborn_date,work_date,tele_num;
charsex[ALLMAX],name[ALLMAX],degree[ALLMAX],job[ALLMAX],address[ALLMAX];
charname[ALLMAX],sex[ALLMAX],degree[ALLMAX],job[ALLMAX],address[ALLMAX];
voidListInitiate(SLNode**head)//链表初始化
SLNode*ListInsert(SLNode*head,DataTypex)//职工信息的插入
SLNode*p,*q;
p=head->
if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
q->
born_date=x.born_date;
work_date=x.work_date;
tele_num=x.tele_num;
strcpy(q->
name,x.name);
sex,x.sex);
degree,x.degree);
job,x.job);
address,x.address);
if(head->
next==NULL){//如果只有链表的头结点,没有其他的结点,直接插入在头结点后面
head->
next->
}
else{//链表非空,并且在排序中是最后一个
q->
next=p;
head->
next=q;
returnhead;
voidListDelete(SLNode*head)//职工信息的删除
SLNode*p,*s;
charx[20];
s=head;
if(head->
next==NULL){//链表为空,输出:
名单中无职工信息,无须删除!
printf("
名单中无此职工信息,无须删除!
\n"
);
return;
printf("
请输入要删除职工的姓名:
//输入要删除的人的姓名
scanf("
%s"
x);
for(p;
p;
p=p->
next){//在链表中从头到尾查找输入的人的姓名
if(strcmp(p->
name,x)==0){//如果存在,则删除,否则输出:
s->
next=p->
free(p);
printf("
删除成功!
请继续操作!
break;
}
s=p;
if(p==NULL){//链表本身为空
voidListModify(SLNode*head)//职工信息的修改
DataTypex;
SLNode*p;
职工名单无职工信息,无须修改!
请输入要修改的职工姓名:
x.name);
for(;
next)
{
if(strcmp(x.name,p->
name)==0){//查找到了该职工的信息
依次写入该职工的新信息:
请输入职工信息:
\n姓名、性别、出生年月、工作年月、学历、职务、住址、电话\n"
scanf("
%s%s%d%d%s%s%s%d"
p->
name,&
p->
sex,&
born_date,&
work_date,p->
degree,p->
job,p->
address,&
tele_num);
修改成功!
if(p==NULL)//如果链表为空
此职工不存在,无法修改其信息!
voidput(SLNode*head,FILE*fp)//职工信息的保存
if((fp=fopen("
Employee.txt"
"
a"
))==NULL){//
无法打开'
Employee.txt'
!
exit(0);
for(p=head->
fprintf(fp,"
%s%s%d%d%s%s%s%d\n"
name,p->
sex,p->
born_date,p->
address,p->
if(fclose(fp)){
无法关闭'
exit(0);
voidListfind(SLNodehead)//职工信息的查找
inti,j;
if(head.next==NULL){//链表为空
名单中无职工信息,查询失败!
//返回主菜单
pri