《数据结构简单的职工管理系统完整版(共34页).doc》由会员分享,可在线阅读,更多相关《数据结构简单的职工管理系统完整版(共34页).doc(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上湖南涉外经济学院数据结构课程设计报告题目: 简单的职工管理系统院系名称: 计算机学院 专业名称:计算机科学与技术班 级: 计科班 学生姓名:刘兴斌学号: 30指导教师: 张建明设计起止时间:2011年11月20日2011年12月30日 完成于2011年12月29日 星期四目 录8第四章 源程序代码1129专心-专注-专业第一章 序电子信息时代由如洪水一样的凶猛,能在现实社会应用软件给我们的生活和工作带来方便和实用性就是软件存在的最大的价值。数据结构所能解决的就是这些复杂的问题简单化。数据结构是计算机专业学生学习的一门基础课程,但十分的重要。本课程系统地介绍了软件设计中
2、常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术。本课程将为整个专业的学习以及软件设计水平的提高打下良好的基础。为了学好数据结构,必须掌握编写一些在特定数据结构上的算法,并通过上机调试,更好地掌握各种数据结构及其特点。经过本次课程设计,我们对于数据结构基本理论和存储结构及算法设计将有更加深入的理解,并提高我们在实际设计操作中系统分析、结构确定、算法选择、数学建模和信息加工的能力,提高我们的C/C+语言程序设计能力,以及培养学我们编写程序设计文档的能力,为将来在实战工作中打下良好的基础。在经济发达的今天对于职工简单的管理都是有很大程度上的要求,一个工司能否较好较快的运行
3、,与职工管理的好坏分不开关系,通过该系统,将一系列的问题系统化,能够更好的管理职工。简化管理,使管理更方便,准确性、直观性和实用性更强。本着以锻炼自己的能力为目的,通过设计与制作进一步学习和掌握简单的职工管理系统的原理和使用方法。虽然在一定程度上较为简单,但也能体现在出在人员管理上的方便快捷,也体现一个领导的管理水平是不是充满艺术。第二章 系统总体功能的设计和分析1 、 问题描述根据课程设计题目的要求,由于职工信息是一定要存放在指定的文件中,所以应提供文件的输入、输出等操作;在程序中需要浏览职工的信息,应提供显示、查找、删除、插入、排序等一系列的操作;另外还应提供键盘式选择菜单实现功能选择对功
4、能要求的实现是解决管理系统的关键问题。一个管理系统能将其划分为插入、删除、查找、排序等功能。对不同的功能模块进行代码的编写实现,最后通过一定的方式的进行连接测试和最终的调用,从而完成对各部分的操作。2 、详细要求1.要求职工对象包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。(1)新增一名职工:将新增职工对象按姓名以字典方式职工管理文件中。(2)删除一名职工:从职工管理文件中删除一名职工对象。(3)查询:从职工管理文件中查询符合某些条件的职工。(4)修改:检索某个职工对象,对其某些属性进行修改。(5)排序:按某种需要对职工对象文件进行排序。3 功能分析1、实现提示职工对象数不
5、必很多,便于一次读入内存,所有操作不经过内外存交换。(1)由键盘输入职工对象,以文件方式保存。程序执行时先将文件读入内存。(2)对职工对象中的姓名按字典顺序进行排序。(3)对排序后的职工对象进行增、删、查询、修改、排序等操作。2、 系统流程分析(1)输入功能的实现:要想实现职工管理系统的输入,必须要建立一个职工信息系统的抽象数据类型,其中职工信息以链表的存储方式实现。由键盘输入职工对象,以文件方式保存。程序执行时先将文件读入内存。(2)系统处理功能的实现:系统管理员根据公司的人员流动情况,在提示信息的提示下,选择相应的服务进行操作。如对职工对象中的姓名按字典顺序进行排序;对排序后的职工对象进行
6、增、删、查询、修改、排序等操作。(3)输出的实现:根据选择的操作,输出与之对应的信息。综上可以绘制出职工管理功能的系统流程图,如图1所示图1 系统流程图3、系统功能结构根据职工管理系统问题的分析和设计要求,可以得到该职工管理系统可以分为五个模块:职工信息添加模块、职工信息修改模块、职工信息删除模块、职工信息查询模块、职工信息排序模块。其系统功能结构如图2所示。图2 系统功能结构图4、 模块函数构造根据系统功能结构图的描述,可以构造出该系统的抽象数据类型和相对应的函数,其方法名和功能如表1所示。表1 函数功能表模块函数或数据结构功能链表数据类型typedef struct Node定义链表结点t
7、ypedef struct Datatype定义职工信息ListInitiate(SLNode *head)初始化链表系统处理模块SLNode *ListInsert(SLNode *head,DataType x)插入职工信息ListDelete(SLNode *head)删除职工信息ListModify(SLNode *head)修改职工信息put(SLNode *head,FILE *fp)保存职工信息Listfind(SLNode head)查询职工信息Listpaixu(SLNode *head)职工信息排序输出模块print(SLNode *head)显示职工信息第三章 详细设计分
8、析1、 抽象数据类型定义(1)定义表结点(typedef struct Node)typedef struct Nodelong int born_time,work_time,tele_num;char sex,nameALLMAX,degreeALLMAX,jobALLMAX,addressALLMAX;struct Node *next;SLNode;(2)定义职工信息(typedef struct Datatype)typedef structlong int born_time,work_time,tele_num;char nameALLMAX,sex,degreeALLMAX,j
9、obALLMAX,addressALLMAX;DataType;(3)初始化链表(ListInitiate(SLNode *head))void ListInitiate(SLNode *head)/-链表初始化if(*head=(SLNode *)malloc(sizeof(SLNode)=NULL) exit(1);/动态分配存储空间(*head)-next=NULL;2、 主函数设计(1)根据详细设计要求,可以得到主函数代码及其对应的程序流程图:在主函数中,实现了友好的界面设计。系统需要输入职工的基本信息:姓名、性别、出生年月、工作年月、学历、职务、住址、电话等。这个系统还利用键盘输入提
10、供的主菜单服务,在主菜单中,有七种操作的调用:新增职工信息:SLNode *ListInsert(SLNode *head,DataType x)查询职工信息:Listfind(SLNode head)删除职工信息:ListDelete(SLNode *head)修改职工信息:ListModify(SLNode *head)职工信息排序:Listpaixu(SLNode *head)保存职工信息:put(SLNode *head,FILE *fp)显示职工信息:print(SLNode *head)(2)主函数程序流程图如图3所示:图 3 主函数程序流程图3、 查找算法设计在查询算法中,职工管
11、理系统提供了七种查询操作,实现了系统的人性化查询操作。这些查询操作分别为:对姓名进行查询,对性别进行查询,对出生年月进行查询,对工作年月进行查询,对学历进行查询,对职位进行查询,对住址进行查询,对电话进行查询等一些列操作。查找算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。查询算法程序流程图如图4所示:图 4 查询算法程序流程图4、 排序算法设计在排序算法中,职工管理系统提供了四种查询操作,实现了系统的基本排序操作。这些排序操作分别为:对姓名进行排序,对性别进行排序,对出生年月进行排序,对工作年月进行排序,等一些列操作。排序算法中,利用链表的指针的移
12、动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。排序的核心代码:for(q=head-next,p=head,s=p;q;s=p,p=q,q=q-next)if(p-born_timeq-born_time)/对出生年月进行排序if(head=p) head-next=q-next; head=q; q-next=p;q=head-next;p=head;elsep-next=q-next; q-next=p; s-next=q; p=q; q=p-next; flag=1;排序算法流程图如图5所示:图5 排序算法程序流程图第四章 源程序代码#include #include
13、 #include #include #include #include #include #include using namespace std; struct Employee /声明职工的结构作为链表节点。 /-数据域- string m_Code; string m_Name; unsigned short int m_Year; string m_Sex; string m_Post; string m_Department; unsigned int m_Wage; /链表节点的指针域- struct Employee* Next; ; /-个人习惯:取别名- typedef s
14、truct Employee Node; typedef Node* Link; /-函数声明- Link Create(Link Head); void Release(Link Head); Link Add(Link Head); bool Search(Link Head); Link Search_Unique(Link Head); void Display_List(Link Head); void Display_Node(Link pNode); Link Modify(Link Head); Link Del(Link Head); void Save_ByFile(Lin
15、k Head,fstream& ofile); Link Sort(Link Head); /-函数实现- Link Create(Link Head) /创建一个带头节点的空链表。 Head=(Link)new Node; if(!Head) cout分配内存失败!m_Code=; Head-m_Name=; Head-m_Year=0; Head-m_Sex=; Head-m_Post=; Head-m_Department=; Head-m_Wage=0; Head-Next=NULL; return Head; void Release(Link Head) /释放链表。 Link p
16、tr;/声明一个操作用的指针。 while(Head!=NULL) ptr=Head; Head=Head-Next; delete ptr;/释放节点资源。 Link Add(Link Head) /前插法添加数据。 Link pNew;/ 声明一个新节点。 char again; string code,name,sex,post,department; unsigned short int year; unsigned int wage; do pNew=(Link)new Node; /数据域。 coutcode; coutendlname; coutendlyear; while(c
17、in.fail() cout请输入正确的年份格式。year; coutendlsex; coutendlpost; coutendldepartment; coutendlwage; while(cin.fail() cout请输入正确的工资数据。wage; coutm_Code=code; pNew-m_Name=name; pNew-m_Year=year; pNew-m_Sex=sex; pNew-m_Post=post; pNew-m_Department=department; pNew-m_Wage=wage; /指针域。 pNew-Next=Head-Next; Head-Nex
18、t=pNew; cout数据添加成功!是否继续添加?(Y/N)again; while(again=Y|again=y); return Head; bool Search(Link Head) /查询同时满足“姓名”和“部门”的职工信息。 Link ptr; string department; string name; ptr=Head-Next; coutdepartment; coutendlname; coutendl-查询结果-endl;coutendl职工代码、姓名、出生年份、性别、职称、部门、工资m_Name=name)&(ptr-m_Department=department
19、) Display_Node(ptr);/打印满足条件的节点。 return true; ptr=ptr-Next;/查询下一节点。 cout无此职工的信息。endl; return false; Link Search_Unique_Front(Link Head) /查询满足“职工代码“的职工信息(职工代码必需唯一)。 Link ptr; string code; ptr=Head; coutcode; coutendl-查询结果-endl; coutendl职工代码、姓名、出生年份、性别、职称、部门、工资Next) if(ptr-Next-m_Code=code) /Display_No
20、de(ptr);/打印满足条件的节点。 return ptr;/注意,是返回的查询到的节点的直接前趋节点。 ptr-Next=ptr-Next-Next;/查询下一节点。 return ptr; void Display_List(Link Head) Link ptr; ptr=Head-Next; cout=所有职工信息=endl;coutendl职工代码、姓名、出生年份、性别、职称、部门、工资Next; void Display_Node(Link pNode) /在标准输出设备上输出。 coutsetw(10)leftm_Code setw(10)leftm_Name setw(10)
21、leftm_Year setw(10)leftm_Sex setw(10)leftm_Post setw(10)leftm_Department setw(10)leftm_WageNext) cout-你现在可以修改此职工的信息了-endl;coutendl职工代码、姓名、出生年份、性别、职称、部门、工资endl; /数据域。 coutcode; coutendlname; coutendlyear; while(cin.fail() cout请输入正确的年份格式。year; coutendlsex; coutendlpost; coutendldepartment; coutendlwag
22、e; while(cin.fail() cout请输入正确的工资数据。wage; coutNext-m_Code=code;/因ptr是前趋节点,所以要用ptr-Next; ptr-Next-m_Name=name; ptr-Next-m_Year=year; ptr-Next-m_Sex=sex; ptr-Next-m_Post=post; ptr-Next-m_Department=department; ptr-Next-m_Wage=wage; cout没找到此职工的记录,无法修改。Next; if(ptr) ptr_front-Next=ptr-Next; delete ptr;/删
23、除此节点。 cout没找到此职工的记录,无法删除。Next; ofile.clear();/清除文件结束状态。 while(pNode) ofilesetw(10)leftm_Code setw(10)leftm_Name setw(10)leftm_Year setw(10)leftm_Sex setw(10)leftm_Post setw(10)leftm_Department setw(10)leftm_WageNext; cout数据文件保存成功!Next=NULL)|(Head-Next-Next=NULL)/此步条件判断非常有价值。 cout数据节点数少于2个,不用排序!Next-
24、Next; ptr_F=Head; Head-Next-Next=NULL;/到此,分成了两个链表。 /第三步。 while(ptr) ptr_N=ptr-Next; ptr_F=Head;/ptr_F的归位。 while(ptr_F-Next) if(ptr-m_Wageptr_F-Next-m_Wage) ptr-Next=ptr_F-Next; ptr_F-Next=ptr; break; /if else ptr_F=ptr_F-Next; /while(ptr_F-Next) if(ptr_F-Next=NULL) ptr-Next=ptr_F-Next; ptr_F-Next=pt
25、r;/表示插到有序链表的最后面了。 ptr=ptr_N;/归位,准备下一次排序。 /while(ptr) cout从高到低,排序成功!endl; return Head; int main() Link Head=0; Head=Create(Head); fstream iofile; iofile.open(d:iofile.txt,ios_base:in|ios_base:out|ios_base:app);/文件以三种方式打开。 if(!iofile) cout打开文件失败!endl; return -1; int menu; while(1) cout*endl;cout*欢迎进入职
26、工管理系统*endl;cout*endl;coutendl;cout endl;cout 主菜单 endl; cout = endl;cout endl;cout endl; cout 1.注册职工 2.修改信息 endl; cout 3.删除信息 4.信息查询 endl;cout 5.保存文件 6.工资排行 endl;cout 7.信息显示 0.退出系统 endl;cout endl;cout endl;cout endl;cout endl; coutendlmenu; while(cin.fail() cout请选择正确的菜单选项。menu; switch(menu) case 0: c
27、out成功退出系统!endl; return 0; case 1: Head=Add(Head); break; case 2: Head=Modify(Head); break; case 3: Head=Del(Head); break; case 4: Search(Head); break; case 5: Save_ByFile(Head,iofile); break; case 6: Sort(Head); break; case 7: Display_List(Head); break; default: cout请选择正确的菜单项进行操作。多谢合作!endl; Release(
28、Head); iofile.close(); return 0; 测试是使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验是否满足规定的需求或弄清预期结果与实际结果之间的差别.系统运行结果:(1)进入职工管理系统,如图6所示:图 6主菜单选择界面(2)新增一职工信息并查询全部职工信息,如图7、8所示:图 7 新增职工信息界面图 8 查询职工信息界面(3)修改职工信息并与前面信息对照,如图9所示:图9 修改职工信息界面(4)退出系统,如图10所示:选择 0,退出职工管理系统。图10 退出职工管理系统第六章 课程设计总结本次课程设计的一切实现和代码都是围绕数据结构进行设计的操作的。根据
29、问题的描述可知,需要解决问题并不是很复杂,整个问题只需要实现简单的职工管理系统功能,那就是在这个系统中实现对职工信息的插入、删除、查询、排序、修改以及保存。但是,为了实现该功能,却需要优秀的算法和以数据结构为核心思想作为框架,以保证实现的时间最优化和空间的最大利用化。把职工信息存储在一个单链表中,利用指针实现对职工信息的各项简单的操作。程序在长久的修改和上网查询借鉴的情况下最终完成了题目描述所需要实现的功能,但仍有我认为不足的问题,还有需要改进的地方,就是还可以在排序上面多设计几个算法,实现多方位的排序。我发现在这个系统中没有职工序号或者是工作序号之类的信息,所以允许职工姓名相同,在很大程度上
30、面,可能会出现职工信息有所重复,值得思考和改进并且实现最佳功能。经过这次数据结构课程设计,我们不仅再一次的巩固了我对数据结构、算法、以及软件工程的知识的了解,并更加的明白了数据结构和算法对于程序时间和空间性能的极大影响,及软件工程提供的开发流程和工具对于实现特定功能程序的深远而重大的意义。我们面对一个最现实的问题的时候,应该迅速根据问题性质和特点抽象构成特定的数据结构,用计算机的思维方式来看待,每个问题都有可能能够抽象成多种数据结构,每种数据结构也有可能适应不同的算法。应该全面的考虑这些的数据结构、算法以及它们的空间和时间效率是不是达到最大化的应用和实现,然后从中选择一个最优的作为实现程序的基本框架进行操作和实现。此外,我认为对程序的测试要做到十分的仔细,依据模块的特点和功能,可以进行阶段性的测试和全面性的测试,采用各种软件测试方法对程序进行全方位的进行测试,确保各个模块的正确性和完整性。最终的目的是完整的实现了问题描述中要求的功能和使我们要解决的问题达到最优化解决。2011年12月29日 星期四