9512.net
甜梦文库
当前位置:首页 >> 工学 >>

人事档案管理系统课程设计


编号:

数据结构与算法课程设计 说明书

题 学 专

目: 院: 业:

人事档案管理系统 计算机科学与工程学院 计算机科学与技术

学生姓名: 学 号: 唐麟

指导教师:

2013 年 9 月 26 号





电脑已经深入到我们日常工作和生活的方方面面, 比如文字处理、 信息管理、 辅助设计、 图形图像处理、教育培训以及游戏娱乐等。Windows 系统的推出使电脑从高雅的学术殿 堂走入了寻常百姓家, 各行各业的人们无须经过特别的训练就能够使用电脑完成许许多 多复杂的工作。然而,虽然现在世界上已经充满了多如牛毛的各种软件,但它们依然不 能满足用户的各种特殊需要,人们还不得不开发适合自己特殊需求的软件。 随着企事业单位的发展,人员会越来越多,少则几十人、多则上万人。例如一个企业分 很多部门,每个部门又分为许多科或室等,而其下又分为各级领导和员工。用笔和纸传 统的手工管理档案,这中管理方式存在着不易更新、不易存放、不安全、容易丢失、难 以备份等重大缺陷,管理起来效率低下而且很可能造成管理上的混乱。而自己建立简单 的电子文档对信息管理进行管理虽然克服了以上的缺点,但查询效率较低,特别是当数 据量十分庞大时,劣势尤其明显。因此开发一个既可以存储信息,又可以进行更新、查 询、管理等功能,同时价格又能为广大消费者接受的多功能电子人事信息管理系统就显 得十分必要。

关键词:Visual C++6.0;算法;人事管理;类面向对象;链表





引言 .............................................. 1
1 系统概述 ............................................... 2 2 需求分析 ............................................... 2
2.1 系统需求 ....................................................... 2 2.2 开发环境 ....................................................... 3

3 详细设计
3.1 类的设计及分析 3.2 各功能的设计

…………………………………………4
…………………………………………… …4 …………………………………………… …6

4

所遇到的问题和分析解决 …………………………………………10

5 系统特色及关键技术 ………………………………………………11
5.1 成员函数添加的分析 5.2 直接选择排序 …………………………………………… …11 ……………………………………………………14

6 用户使用

…………………………………………………… 15

7 结论…………………………………………………………18 参考文献………………………………………………………………19

引 言 随着全球对知识和人才的重视,企业对人力资源管理重要性的认识逐渐深化,人才的全 球化竞争使企业的人力资源管理面临前所未有的挑战。在新形势下,人事档案管理系统 是一个企业单位不可缺少的部分,是适应现代企业制度,推动企业人力资源管理走向科 学化、规范化、自动化的必要条件;是应对挑战、适应环境变化、提高企业管理效率、 提升核心竞争力的关键措施。它所包含内容对于企业的决策者和管理者来说至关重要。 目前市场上的人事管理系统很多,但要找到一款真正称心、符合企业实际情况的并不容 易。由于存在这样那样的不足,使企业浪费了大量的人力、物力等大量资源,难以真正 提升企业人力资源的管理水平,提高工作效率及降低管理成本的效果也不明显。因此, 为了加快公司信息化的步伐,提高公司的管理水平,并在激烈的社会竞争中立于不败之 地,建立及完善人力资源管理系统已变得十分必要和迫切。在社会中,人力资源是企事 业单位的核心, 而对它的管理及管理软件的选用则是评价管理者管理水平的一个重要标 志。因此人力资源管理工作是企事业单位工作的一项重要任务,是提高管理质量和保障 企事业单位生产目标实现的一个重要保证。因此,人力资源管理的内容对企事业单位的 决策者和管理者来说都具有重要意义。当规模扩大以后,企事业单位人员部门增加,给 人力资源管理带来困难。 根据需求,本人事档案管理系统主要分系统管理、信息登记、信息删除、信息查询、信 息修改、信息按顺序输出、报表信息输出、系统简介等八大部分。具体要求实现:对业 务模块相关信息的添加,修改,删除以及对人员调动的管理;对考勤信息设置、管理和 查询;对工资信息设置;部门,员工工资统计查询等等。

1

系统概述 本人事档案管理系统主要分系统管理、信息登记、信息删除、信息查询、信息修

改、信息按顺序输出、报表信息输出、系统简介等八大部分。具体要求实现:对业务模 块相关信息的添加,修改,删除以及对人员调动的管理;对考勤信息设置、管理和查询; 对工资信息设置;部门,员工工资统计查询等等。 2 需求分析 2.1 系统需求 在信息技术高速发展的今天, 传统的数据统计方式在处理庞大繁杂的信息量时显得力不 从心,于是,人们对于运用计算机来辅助和管理工作的需求正在逐步提高。 随着各个企业业务的逐步扩展, 企业的员工人数也在迅速增加, 由于管理人员水平有限, 导致某些员工纪录管理并不完善,特别是繁杂的员工工资管理纪录,不易查询、修改, 极易导致错误,而落后的员工管理方法随着社会的日益竞争,必将被淘汰。 由计算机来管理庞大而繁杂的企业员工纪录是非常合适的,不仅查询和修改方便,并且 效率高,速度快,完全能够满足现代化企业管理的需要,同时也更利于实现全面办公自 动化。因此开发一套企业员工工资管理系统软件势在必行。 企业员工工资管理系统是企业管理系统中的一个重要组成部分, 它为企业合理的员工调 配与编制,以及有关问题的决策能够提供各种必要的基础数据,是公司管理现代化的一 个重要方面。利用微机对庞杂而繁锁的员工工资系统实现自动化管理,是计算机公司信 息管理系统的重要内容。我在陈勇老师指导下开发了《企业员工工资管理系统》 。 《企业员工工资管理系统》旨在为商业人士及在社会团体、机构中负责管理关系的人士 提供一个功能全面、使用方便的工资管理系统,以替代传统的手工管理工资纪录,同时 利用先进信息技术为用户提供一些更为方便实用的功能。 本系统实现五种基本功能: 输入员工工资信息、 删除员工工资信息、 修改员工工资信息、 查找员工工资信息、列出所有员工工资信息。所以该工资管理系统可以分为 5 个模块, 分别为输入模块、删除模块、修改模块、查找模块、列表模块,每个模块都有其对应的 功能以及其设计。 (1)输入模块 输入模块的功能是创建存储职工工资信息的存储系统以及添加某职工的工资信息。 为实 现输入的功能,有两个方面的任务:定义结构体以及建立链表。 (2)删除模块 删除模块的功能是删除某职工的工资信息。 (3)修改模块 修改模块的功能是修改某职工的部分工资信息。 (4)查找模块 查找模块的功能就是:输出指定编号职工的工资信息;输出姓名和部门联合查询的职工 工资信息。 (5)统计模块 统计模块的功能是:统计全企业总人数及各部门的人数;统计企业的平均工资及部门的 平均工资。 (6)排序模块 排序的模块的功能是:对全企业的信息表按受教育年限及工资进行递增排序。 (7)列表模块 列表模块的功能是输出全体职工的工资信息。 程序具体功能介绍: 2.1.1 功能介绍 现在,需要存储这些人员的人事档案信息:员工编号, 员工姓名 ,年龄 ,性别 ,部 门 ,职务, 受教育年限 ,工资 ,缺勤(天) ,罚金, 个税 ,实发数。其中,人员

编号唯一,不能重复。 添加删除功能:能根据学企业人事的变动情况,添加删除记录; 查询功能:能根据编号及姓名和部门的复合查询进行查询; 编辑功能(高级) :根据查询对相应的记录进行修改,并存储; 统计功能:能根据多种参数进行人员的统计及平均工资,统计要求同时显示被统计者的 信息; 排序功能:按照受教育年限、工资进行排序; 保存功能:能对输入的数据进行相应的存储; 2 .2 系统框图 系统框架图在本设计中,将主要实现以下功能:增加记录功能,修改记录功能,删除记 录功能,以及筛选记录功能等。

主菜单

输 入 员 工 工 资 信 息

删 除 指 定 员 工 工 资 信 息

修 改 指 定 员 工 工 资 信 息

查 找 指 定 员 工 工 资 信 息

输 出 全 体 员 工 工 资 信 息

退 出

图 1 系统框架图 2.2 开发环境

本系统是在 Visual C++6.0 平台上运行的,主要运行 C 及 C++等语言。 3 详细设计 具体系统设计 3.1 结构体及类的设计与分析 3.1.1:员工结构体的建立 struct Worker_pay { int num; //员工编号 string name; //员工姓名 int age; //年龄 string sex; //性别 string department; //部门 string title; //职务 int eduage; //学历(年) float wage; //工资 int day; //缺勤天数 float allowance; //扣发工资 float tax; //个人所得税 float real_wage; //实发数 Worker_pay * next; //链表结点的指针域 }; 3.1.2:员工类的建立 class Worker { protected: Worker_pay * head; //链表的头结点指针 public: Worker(){head=NULL;} //构造函数 void Display(Worker_pay *); //输出函数 Worker_pay * Find(int); //查找函数 int ListCount(); //统计员工人数函数 void AddItem(int,string,int,string,string,string,float,float); //创建链表 并链表的插入 void RemoveItem(int); //删除函数 void ReplaceItem(int); //修改函数 void ListL(); //遍历函数 void Search(int); //查找并输出某个员工信息函数 void Real_wage(float,float); //计算函数 void Recordinfo(int,string,int,string,string,string,float,float,float,float); // 存储函数 }; 3.1.3:相关的成员函数

表 1 Worker 类说明表 名称 head Worker() void Display(Worker_pay *) Worker_pay * Find(int) int ListCount() void AddItem(int,··float,float) · void RemoveItem(int) void ReplaceItem(int) void void void void void void ListL() Listavg(string) load() sort_data(); search(sting ,string) Search(int)

属性 数据成员 成员函数 成员函数 成员函数 成员函数 成员函数 成员函数 成员函数 成员函数 成员函数 成员函数 成员函数 成员函数 成员函数

说明 链表头结点指针 缺省的构造函数,缺省值为 head=NULL 输出函数 查找函数 统计员工人数函数 创建链表并链表的插入 删除函数 修改函数 遍历函数 部门查询及统计的函数 读取文件 对员工信息进行整理的函数 复合查找并输出员工信息的函数 查找并输出某个员工信息函数 计算函数 存储函数

void Real_wage()

voidRecoreinfo(int, · · ,floa 成员函数 · t,float) 3.1.4 非成员函数的设计与分析 表 2 非成员函数说明表 名称 int Menu() char Exit() void Input(int * num,··,float * allowance) · void AddNew()

说明 用于显示主菜单 用于退出程序 用于输入员工工资信息 用 于 调 用 成 员 函 数 AddItem(int,· ·float,float)Rea · l_wage() 和 Recoreinfo(int,·· · ,float,float) 用于调用成员函数 Search(int) 用于调用成员函数 RemoveItem(int) 用 于 调 用 成 ReplaceItem(int) 员 函 数

void DoFind() void DoDelete() void DoMotify()

void List() int main() void findtavg()

用于调用成员函数 ListL() 主函数 用 于 调 用 成 员 函 数 Listavg(string) void

3.2:各功能模块设计: (1) 、新建数据文件模块: <1>、数据结构; 看各个数据信息,员工编号(int) 员工姓名 (sting),年龄 (int),性别 (string), , 部门(string) , 职务(string), 受教育年限 (int), 工资 (string), 缺勤(天)(int) , 罚金(int), 个税 (int),实发数(int),在文件中以文本形式存放,每条记录对应一 个人员的信息,可以方便信息的管理;而数据读进内存中时,可以以结构体的形式,每 一个结构体包含了一个人员的全部信息,多的人员的信息组成了一个结构体数组。定义 见结构体及类的设计与分析 (2) 、追加模块: 〈1〉[需求分析] 该模块的功能是拥护需要增加新的员工记录,从键盘输入并逐条写入到原来的文件中 去,其中输入号码是要防止号码重复,重复时报告错误,重新输入。为方便用户管理和 查看,该模块采用的方式是用先把原来文件中的数据读入内存,保存在内存中,然后在 内存中的数据后面增加新的数据, 操作完成后用写的方式打开文件, 用覆盖的方式写入。 〈2〉流程图:略; 〈3〉对应程序:void AddNew() (3)修改模块: <1>[需求分析:] 该模块的功能是显示所有信息, 考虑到记录较多, 采用分屏显示, 显示完所有的记录后, 由用户输入需要修改的人员的号码,查找成功后,显示查找结果,并询问拥护修改人员 的哪部分记录,根据用户选择修改相应的信息,然后保存修改后的结果;

<2>流程图:
用户选择要修改的数据

输入编号

是否有此编号

Y

Y

N

找到调用修改函数

提示没有找到

Y
询问用户是否继续 修改

N
返回主菜单

<3>对应的函数: void DoMotify(); (4)删除模块: 〈1〉[需求分析]: 该模块的运行方式与修改模块类似,首先分屏显示所有人员的记录,显示完所有的记录 后,由用户输入要删除的人员的号码,根据号码查找相应的记录并将结果显示出来,经 用户确认后删除,删除的方法是将文件中的数据读入内存,赋给相应的结构体,并将结 构体数组中将删除的后面的数据赋给前一个结构体,然后将相应数据写入文件并保存; 〈2〉流程图:类似添加的流程 <3>对应函数: void DoDelete(); (5) 、按编号搜索: 〈1〉[需求分析]: 该模块的功能是按照输入的人员的编号查找对应的记录,并将其显示,查找成功以后, 增加删除和修改等功能,其中删除和修改功能可以通过调用相应的函数来实现。 〈2〉流程图;

(6)按姓名和部门搜索。 <1>需求分析:该模块的功能是按照输入的人员的姓名和部门查找对应的记录,并将其 显示,查找成功以后,增加删除和修改等功能,其中删除和修改功能可以通过调用相应 的函数来实现。 <2>该模块的结构与按号码查询的结构基本相同; <3>对应函数:void DoFindbumen(); (7)输出模块; 需求分析: 该模块的功能是显示所有保存在文件中的记录。 〈2〉 、流程图;略 <3>对应函数:void List(); (8) 、排序模块; 〈1〉 、[需求分析]; 该模块的功能是要求将记录按照年龄或者来院时间进行排序,总体结构是先用 n=load ()函数将文件中的数据调入内存,然后按照选择法排序,并将结果显示出来,然后将 排序后的结果保存。 <2>流程图; 略。 <3>对应函数: void sort_data() (9)、统计模块

〈1〉 、[需求分析]; 该模块的功能是按照用户的要求统计出满足符合条件的所有记录的个数, 并将满足条件 的记录显示出来。该模块是在其他模块进行的同时进行的,没有单独列出,没有涉及到 文件的保存。 〈2〉流程图;无; 〈3〉对应函数:包含在其他函数内

4

所遇到的问题和分析解决 (1)设计初期,先完成初步构思,写出主函数。然后对主函数所涉及的各个模块进

行编程,将各个模块利用指针和链表联系起来。在环境中进行调试,应一边编译,一边 调试,并且要一个模块一个模块的调试。直至此模块完全没有错误时,在进入下一模块 的调试。不能直接输入全部的代码一次性调,这样错误会很多,并且不易找出和修改。 在完成程序的编译链接后,要用多组数据进行审查,确保做到系统无误。 设计过程中,不应忽视环境提示的警告,有时程序运行不正确与警告也有很大的关 系。这次设计中遇到很多问题都是提示类型不匹配,这时就要认真检查前面的代码,及 时改正并且认真仔细,杜绝此类错再次发生。 编写代码时应该少用全局变量,全局变量在编写试看似定义次数少,很方便。但全 局变量出错几率较大,且不易修改,每次修改时都要全面考虑,所以应避免用到。 程序调试中碰到的错误可以使自己学到知识。养成良好的编程习惯,可以节省很多 时间,避免很多不必要的错误。 (2)在编辑完整个程序后,进行调试阶段总是会数显 head 无定义。 解决办法:再类的定义是忘记声明指针 Worker_pay *head;。 (3)在写读入函数时,总是不能读入数据,经同学检查发现没有申请新的空间存放 数据。 解决办法:在读入 txt 文件时,q=new Worker_pay; q->next=NULL。 5 系统特色及关键技术 5.1:Worker 类中的成员函数 void AddItem(int,··float,float) · (1)功能:创建存储职工工资信息的存储系统以及添加某职工的工资信息。 算法思路:先定义一个结构体 Worker_pay,通过从表尾插入的方法来建立链表。首先要 先设立一个头指针(head)来存放链表的首地址,然后,不断用 new 运算符生成一个新 的结点,将这个结点链入已有的链表尾部;如果链表中还没有结点,则这个新结点将是 首结点,否则,将新结点的地址赋给原有链表的尾结点的 next 指针。 流程图:

Start

IF !head

员工工资信息 赋给head

Return

*t=head

While t&t->num! = num1

t=t->next

IF t

操作失败

Return

*p->head While p->next

p->next

员工工资信息 赋给p

Return

End

(3)代码: void Worker::AddItem(int num1,string name1 , ……) { if(!head) { head=new Worker_pay; head->num=num1; …… head->next=NULL; return; } Worker_pay * t=head; while(t&&t->num!=num1) t=t->next; if(t) { cout<<"操作失败;员工编号为"<<num1<<"的信息已经存在!!!"<<endl; return; } Worker_pay * p=head; while(p->next) p=p->next; Worker_pay * p1=new Worker_pay; …… return; }

5.2:Worker 类中的成员函数 void sort_data() (1)功能:创建存储职工工资信息的存储系统以及添加某职工的工资信息。 算法思路:运用算法课本上的直接选择排序的算法,与课本的不同之处在于,本程序是 用指针进行排序的,课本使用的数组。 直接选择排序的比较次数与文件初始状态无关,在第 i 趟排序中选出最小的记录,需做 n-i 次比较,因此总的次数为:O(N*N),文件初始状态为正序时,移动 0;最坏情况每 趟排序都要交换操作,总的移动次数是 3(n-1) 。直接选择排序的平均时间复杂度为 O (n 平方) 。算法中增加了一个辅助空间 temp,因此辅助空间为 S(n)=O(1) 。直接选 择排序是不稳定的。 主要代码:Worker_pay * p,*q,*small,*temp; temp= new Worker_pay ; for(p=head;p->next!=NULL;p=p->next) { small=p; for(q=p->next ;q!=NULL;q=q->next) if(q->eduage<small->eduage) small=q; if(small!=p) { temp->eduage=p->eduage; p->eduage=small->eduage; small->eduage=temp->eduage; …………………… } } cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚 金 个税 实发数"<<endl; while(head!=NULL) { Display(head); head=head->next; } 6 用户手册及测试结果 6.1 用户手册 运行程序时,界面刚开始出现一个主菜单及提示信息,用户通过在键盘上输入来选择某 个功能。当用户选择了某个功能,系统将跳转到所选择的功能界面,用户将可以根据提 示信息来使用该功能,当用户通过键盘输入编号为-1 时,系统将返回主界面。 6.2 测试结果 1,主菜单

2,输入,添加,删除,修改,查询:

统计

排序

7.总结: 成功之处:此系统程序虽然简单,却集结了基本的管理功能。删除,存储,统计等功能 还是较为成功的。特别是人事档案的统计管理功能,使烦琐的工作变得简单轻松。 不足之处:由于我们水平和时间有限,难免有不足和差强人意的地方。尤其是对于系统 应该配以保密性的设置,可是由于我知识积累不够,做不出来。还请迟老师海涵。 两周的数据结构与算法课程设计结束了,在这几天的时间里,我自己独立完成了一个程 序从构思结构,到编写代码,然后上机调试运行的过程,感觉自己收获很大。通过解决 一个又一个的问题,熟悉了 C++语言的应用。 在设计过程中,在编程时条理清晰是至关重要的。主函数,函数,成员函数之间的层次 关系,调用关系一定要有一个全面的把握,尤其要体会类的封装性。另外很重要的一点 就是一定要对链表的五种操作熟练的掌握。我理解了对于一个较大的程序,不可能一次 编写出一个较大的系统,通常要采取自顶向下的设计思想,先设计主函数,再通过完善 一个个的功能模块来完成程序的设计过程, 在设计过程中要充分理解整个程序的设计思 路,采用逐步细化的方式来完成整个程序。在编译,链接,调试的过程中一定要有耐心。 因为一个程序中会有很多小的错误,甚至有的问题要几个小时才能解决。遇到问题,一 定要全面分析,有时候还要向同学请教。总得来说,编程时极需要耐心的。

参考文献 C 语言大学实用教程 电子工业出版社 http://www.hxedu.com.cn 2、C++程序设计教程(第二版)高等教育出版社 3、C 语言程序设计教程 北京大学出版社

4、C 语言程序设计实例精粹 电子工业出版社 5、www.baiduwenku.com 6、陈天华编.面向对象程序设计与 Visual C++6.0 教程[M].北京:清华大学出版社,2006

程序清单:#include<iostream>
#include<string> #include<fstream> #include<iomanip> using namespace std; /*****************************************************/ /*定义一个员工信息的结构体 Worker_pay*/ struct Worker_pay { int num; //员工编号 string name; //员工姓名 int age; //年龄 string sex; //性别 string department; //部门 string title; //职务 int eduage; //学历(年) float wage; //工资 int day; //缺勤天数 float allowance; //扣发工资 float tax; //个人所得税 float real_wage; //实发数 Worker_pay * next; //链表结点的指针域 }; /*****************************************************/ /*定义一个员工类 Worker*/ class Worker { protected: Worker_pay * head;//链表的头结点指针 // Worker_pay * p; public: Worker(){head=NULL;} //构造函数 void Display(Worker_pay *); //输出函数 Worker_pay * Find(int); //查找函数 Worker_pay * Find(string,string); Worker_pay * Find(string);

int ListCount(); //统计员工人数函数 void AddItem(int,string,int,string,string,string,int,float,int,float); //创建链表并链表的插入 void RemoveItem(int); //删除函数 void ReplaceItem(int); //修改函数 void ListL(); //遍历函数 void Search(int); //查找并输出某个员工信息函数 void Search(string,string); void Search(string); void Listavg(string); void Real_wage(float,float); //计算函数 void Recordinfo(int,string,int,string,string,string,int,float,int,float,float,float); //存储函数 void paixu(string); void load(); void sort_data(); }; //Worker_pay *t; /*****************************************************/ //功能:用于统计员工人数 int Worker::ListCount() { if(!head) return 0; Worker_pay * p=head; int n=0; while(p) { n++; p=p->next; } return n; } /*****************************************************/ //功能:在链表中查找员工的编号 Worker_pay * Worker::Find(int num) { if(ListCount==0) { cout<<"列表为空,请先输入数据!!!"<<endl; return NULL; } Worker_pay * p=head; while(p) { if(p->num==num) break;

p=p->next; } if(!p) { cout<<"错误,找不到该信息!!!"<<endl; return NULL; } return p; } /*****************************************************/ /*Worker_pay * Worker::Find(string department) { if(ListCount==0) { cout<<"列表为空,请先输入数据!!!"<<endl; return NULL; } Worker_pay * p=head; while(p) { if(p->department==department) //Worker1.Listavg(department); break; p=p->next; } if(!p) { cout<<"错误,找不到该信息!!!"<<endl; return NULL; } return p; }*/ /*****************************************************/ //功能:创建链表及链表的插入 void Worker::AddItem(int num1,string name1,int age1,string sex1,string department1,string title1,int eduage1,float wage1,int day1,float allowance1) { if(!head) { head=new Worker_pay; head->num=num1; head->name=name1; head->age=age1; head->sex=sex1; head->department=department1;

head->title=title1; head->eduage=eduage1; head->wage=wage1; head->day=day1; head->allowance=allowance1; head->next=NULL; return; } Worker_pay * t=head; while(t&&t->num!=num1) t=t->next; if(t) { cout<<"操作失败;员工编号为"<<num1<<"的信息已经存在!!!"<<endl; return; } Worker_pay * p=head; while(p->next) p=p->next; Worker_pay * p1=new Worker_pay; p1->num=num1; p1->name=name1; p1->age=age1; p1->sex=sex1; p1->department=department1; p1->title=title1; p1->eduage=eduage1; p1->wage=wage1; p1->day=day1; p1->allowance=allowance1; p1->next=NULL; p->next=p1; return; } /*****************************************************/ //功能:从链表中删除一个结点 void Worker::RemoveItem(int num) { Worker_pay * t=Find(num); if(!t) return; Worker_pay * p=head; if(head=t) { head=head->next;

delete p; cout<<"成功删除员工编号为"<<num<<"的信息!"<<endl; return; } while(p->next!=t) p=p->next; Worker_pay * p1=p->next; p->next=p1->next; delete p1; cout<<"成功删除员工编号为"<<num<<"的信息!"<<endl; return; } /*****************************************************/ //功能:修改员工信息 void Worker::ReplaceItem(int num) { Worker_pay * p=Find(num); if(!p) return; cout<<"请重新输入相应信息"<<endl; cout<<"员工编号:"; cin>>p->num; cout<<"员工姓名:"; cin>>p->name; cout<<"年龄:"; cin>>p->age; cout<<"性别:"; cin>>p->sex; cout<<"部门:"; cin>>p->department; cout<<"职务:"; cin>>p->title; cout<<"学历(年):"; cin>>p->eduage; cout<<"工资(元):"; cin>>p->wage; cout<<"月缺勤天数:"; cin>>p->day; //cout<<"津贴(元):"; p->allowance=p->wage*p->day*0.01; //cin>>* allowance; return; } /*****************************************************/ //功能:输出员工信息

void Worker::Display(Worker_pay * p) { cout<<setw(3)<<p->num<<setw(9)<<p->name<<setw(9)<<p->age<<setw(5)<<p->sex<<setw(5)<<p>department<<setw(5) <<p->title<<setw(5)<<p->eduage<<setw(6)<<p->wage<<setw(6)<<p->day<<setw(8)<<p->allowance <<setw(4)<<p->tax<<setw(8)<<p->real_wage<<endl; return; } /*****************************************************/ //功能:遍历链表 void Worker::ListL() { float sum=0; float aver=0; int n=0; if(ListCount==0) { cout<<"当前列表为空,请先输入数据!"<<endl; return; } Worker_pay * p=head; cout<<"********************************** 员 工 信 息 **************************************"<<endl; cout<<"共有"<<ListCount()<<"个员工信息"<<endl; cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发数 "<<endl; while(p!=NULL) { Display(p); n++; sum+=p->wage; p=p->next; } aver=sum/n; cout<<"员工平均薪水:"<<aver<<endl; return; } /*****************************************************/ //功能:查找并输出指定员工信息 void Worker::Search(int num) { cout<<"Search......"<<endl; Worker_pay * p =Find(num); if(p)

{ cout<<"员工编号为"<<num<<"的员工工资信息:"<<endl; cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发 数"<<endl; Display(p); } cout<<endl; return; } /*****************************************************/ //功能:程序内部函数计算的信息例如个人所得税,实发数 void Worker::Real_wage(float tax,float real_wage) { if(ListCount()==0) { cout<<"当前列表为空,请先输入数据!"<<endl; return; } Worker_pay * p=head; while(p) { float q; q=p->wage-p->allowance-2000; if(q<=0) p->tax=0; else p->tax=q*0.1;

p->real_wage=q+2000-p->tax; p=p->next; } return; } /*****************************************************/ //功能:存储员工信息 void Worker::Recordinfo(int num1,string name1,int age1,string sex1,string department1,string title1,int eduage1,float wage1,int day1,float allowance1,float tax1,float real_wage1) { ofstream file1("info1.txt",ios::app); file1<<num1<<"\t"<<name1<<"\t"<<age1<<"\t"<<sex1<<"\t"<<department1<<"\t"<<title1<<"\t"<<e duage1 <<"\t"<<wage1<<"\t"<<day1<<"\t"<<allowance1<<"\t"<<tax1<<"\t"<<real_wage1<<endl; file1.close(); } void Worker::load()//读全部数据 没有完善

{ Worker_pay *t; t=new Worker_pay; ifstream in("info1.txt"); if(!in) { cout<<"文件打开失败!"<<endl; } Worker_pay *q; head=t; //int ii ; if(!in.eof()) { //in>>t->num>>p->name>>p->age>>p->sex>>p->department>>p->title>>p->eduage>>p->wage>>p->day >>p->allowance>>p->tax>>p->real_wage; in>>t->num>>t->name>>t->age>>t->sex>>t->department>>t->title>>t->eduage>>t->wage>>t->day> >t->allowance>>t->tax>>t->real_wage; } else cout<<"文件为空!请先建立数据!"<<endl; while(!in.eof()) { q=new Worker_pay; q->next=NULL; t->next=q; t=t->next; in>>t->num>>t->name>>t->age>>t->sex>>t->department>>t->title>>t->eduage>>t->wage>>t->day>>t-> allowance>>t->tax>>t->real_wage; //in>>p->num>>p->name>>p->age>>p->sex>>p->department>>p->title>>p->eduage>>p->wage>>p->day >>p->allowance>>p->tax>>p->real_wage; cout<<"读入……;"<<endl; //in>>p->No>>p->Name>>p->Area>>p->EntyPrice>>p->NumStockpile>>p->NumPut>>p->SalePrice; } /*while(t) {head->next=t; t=t->next; cout<<"???"<<endl; }

/*while(t) { head=t; t=t->next; head=head->next; cout<<"???"<<endl; }*/ in.close();

} /*****************************************************/ /*定义一个对象 Worker1*/ Worker Worker1; /*****************************************************/ /*****************************************************/ //功能:退出程序 char Exit() { char s; cout<<"确定要退出程序吗?[Y/N]:"; cin>>s; return s; } /*****************************************************/ //功能:输入员工信息 void Input(int * num,string * name,int * age,string * sex,string * department,string * title,int *eduage,float * wage,int *day,float * allowance) { cout<<"现在输入员工信息!"<<endl; cout<<"员工编号:"; cin>>* num; if(* num==-1)return; cout<<"员工姓名:"; cin>>* name; cout<<"年龄:"; cin>>* age; cout<<"性别:"; cin>>* sex; cout<<"部门:"; cin>>* department; cout<<"职务:"; cin>>* title;

cout<<"学历(年):"; cin>>*eduage; cout<<"工资(元):"; cin>>* wage; cout<<"月缺勤天数:"; cin>>*day; *allowance=(*wage)*(*day)*0.01; return; } /*****************************************************/ //功能:把员工信息插入到链表中 void AddNew() { int num=0; string name; int age=0; string sex; string department; string title; int eduage=0; int day=0; float wage=0; float allowance=0; float tax=0; float real_wage=0; cout<<"当输入的员工编号为-1 是表示结束输入"<<endl; Input(&num,&name,&age,&sex,&department,&title,&eduage,&wage,&day,&allowance); while(num!=-1) { Worker1.AddItem(num,name,age,sex,department,title,eduage,wage,day,allowance); Worker1.Real_wage(tax,real_wage); Worker1.Recordinfo(num,name,age,sex,department,title,eduage,wage,day,allowance,tax,real_wage); Input(&num,&name,&age,&sex,&department,&title,&eduage,&wage,&day,&allowance); } cout<<"员工工资信息已成功存储!!!"<<endl; return; } /*****************************************************/ //用名字和部门查找信息 Worker_pay * Worker::Find(string name,string department) { if(ListCount==0) {

cout<<"列表为空,请先输入数据!!!"<<endl; return NULL; } Worker_pay * p=head; while(p) { if(p->name==name && p->department==department) break; p=p->next; } if(!p) { cout<<"错误,找不到该信息!!!"<<endl; return NULL; } return p; /*if(!p) { cout<<"错误,找不到该信息!!!"<<endl; return NULL; } return p;*/ } void Worker::Search(string name,string department) { cout<<"Search......"<<endl; Worker_pay * p=Find(name,department); if(p) { cout<<"员工姓名为"<<name<<"部门为"<<department<<"的员工工资信息:"<<endl; cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发 数"<<endl; Display(p); } cout<<endl; return; } /*void Worker::Search(string department) { cout<<"Search......"<<endl; Worker_pay * p=Find(department); if(p) {

//cout<<"员工姓名为"<<name<<"部门为"<<department<<"的员工工资信息:"<<endl; //cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发 数"<<endl; //Display(p); } cout<<endl; return; }*/ void DoFindbumen() { string department; string name; cout<<"当输入的员工姓名和部门都为-1 是表示结束输入"<<endl; do{ cout<<"请输入要查找的员工的姓名和部门:"; cin>>name>>department; if(name=="-1")continue; Worker1.Search(name,department); }while(name!="-1"); return; } //功能:查找指定员工编号信息 void DoFindbianhao() { int num; cout<<"当输入的员工编号为-1 是表示结束输入"<<endl; do{ cout<<"请输入要查找的员工的编号:"; cin>>num; if(num==-1)continue; Worker1.Search(num); }while(num!=-1); return; } /*****************************************************/ //功能:删除指定员工编号信息 void DoDelete() { cout<<"当输入的员工编号为-1 是表示结束输入"<<endl; int num; do { cout<<"请输入要删除的员工的编号:"; cin>>num;

if(num==-1)continue; Worker1.RemoveItem(num); cout<<"已成功删除该员工信息!!!"<<endl; }while(num!=-1); return; } /*****************************************************/ //功能:修改指定员工编号信息 void DoMotify() { cout<<"当输入的员工编号为-1 是表示结束输入"<<endl; int num; do { cout<<"请输入要修改的员工的编号:"; cin>>num; if(num==-1)continue; Worker1.ReplaceItem(num); }while(num!=-1); cout<<"已成功修改该员工信息!!!"<<endl; return; } /*****************************************************/ //功能:输出全体员工信息 void List() { Worker1.ListL(); } /*****************************************************/ //功能:统计各部门 平均工资 /*void Worker::Listavg(string department) { float sum=0; float avg=0; if(!head) return ; Worker_pay * p=head; int n=0; //cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发数 "<<endl; while(p) { if (p->department==department) { // cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发

数"<<endl; Display(p); sum += p->real_wage; n++; } p=p->next; } avg=sum/n; cout<<"平均工资(实得):"<<avg<<"元"<<endl; }*/ /*void Findavg() { string department; cout<<"当输入的部门为-1 是表示结束输入"<<endl; do{ cout<<"请输入要查找的部门:"; cin>>department; if(department=="-1")continue; Worker1.Listavg(department); }while(department!="-1"); return; }*/ /* void Worker:: searchall() { Worker_pay *p=head; string a[100]; int i=1 while(p!=NULL) string[i]=p->department; i++; p=p->next; for(int n;n<=i;n++) {if(p->next!=string[n]) } } */ /*****************************************************/ /*****************************************************/ /*****************************************************/

/*主菜单函数*/ int Menu() { cout<<"\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\t"<<endl; cout<<"\t\t~ 企业员工工资管理系统 \t~"<<endl; cout<<"\t\t~ *******主菜单******* \t~"<<endl; int n=1,select=-1; cout<<"\t\t~ "<<n++<<".输入员工信息 \t\t~"<<endl; cout<<"\t\t~ "<<n++<<".删除指定员工编号信息 \t\t~"<<endl; cout<<"\t\t~ "<<n++<<".修改指定员工编号信息 \t\t~"<<endl; cout<<"\t\t~ "<<n++<<".查找指定员工编号信息 \t\t~"<<endl; cout<<"\t\t~ "<<n++<<".姓名和部门复合查询信息\t\t~"<<endl; cout<<"\t\t~ "<<n++<<".输出全体员工信息 \t\t~"<<endl; cout<<"\t\t~ "<<n++<<".某部门平均工资及信息 \t\t~"<<endl; cout<<"\t\t~ "<<n++<<".某部门员工工资排序 \t\t~"<<endl; cout<<"\t\t~ "<<n++<<".读入文件 \t\t~"<<endl; cout<<"\t\t~ "<<n++<<".员工不同条件下的排序 \t\t~"<<endl; cout<<"\t\t~ 0.退出\t\t\t\t~"<<endl; cout<<"\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\t\t"<<endl; cout<<"[请选择 0-6(输入相应数字)]:"; cin>>select; return select; }

/*****************************************************/ //功能 //功能:用于统计某部门平均工资 void Worker::Listavg(string department) { float sum=0; float avg=0; if(!head) return ; Worker_pay * p=head; int n=0; cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发数 "<<endl; while(p!=NULL) { if (p->department==department) { // cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发 数"<<endl;

Display(p); sum += p->real_wage; n++; } p=p->next; } if(n!=0) { avg=sum/n; cout<<"平均工资(实得):"<<avg<<"元"<<endl; } else cout<<"信息错误!!!!!"<<endl; } void Findavg() { string department; cout<<"当输入的部门为-1 是表示结束输入"<<endl; do{ cout<<"请输入要查找的部门:"; cin>>department; if(department=="-1")continue; /* Worker_pay * p=head; while(p) { if(p->department==department) break; p=p->next; } if(!p) { cout<<"错误,没有该部门!!!"<<endl; cout<<"重新输入:" cin>>cin>>department; if(department=="-1")continue; }*/ //Worker_pay * p=search(department); Worker1.Listavg(department); }while(department!="-1"); return;

} /*****************************************************/ //部门内部排序 /*void Worker::paixu(string department)

{ // //

if(!head) return ; Worker_pay * p,*temp,*t,*g; // Worker_pay * q,*small; g=NULL; temp= new Worker_pay ; p=head; g->next=t; //t= new Worker_pay; while(p!=NULL) { t= new Worker_pay; if (p->department==department)

{ cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发 数"<<endl; t= new Worker_pay; t->num=p->num ; t->name=p->name; t->age=p->age; t->sex=p->sex; t->department=p->department; t->title=p->title; t->wage=p->wage; t->eduage=p->eduage; t->day=p->day; t->allowance=p->allowance; t->real_wage=p->real_wage; t=t->next; } p=p->next; } if(g->next=NULL) return; else

{

/*for(t=g->next;t->next!=NULL;t=t->next) { small=t; for(q=t->next ;q!=NULL;q=q->next) if(q->wage<small->wage)

small=q; if(small!=t) { temp->eduage=t->eduage; t->eduage=small->eduage; small->eduage=temp->eduage; temp->num=t->num; t->num=small->num; small->num=temp->num;

temp->name=t->name; t->name=small->name; small->name=temp->name; temp->age=t->age; t->age=small->age; small->age=temp->age; temp->sex=t->sex; t->sex=small->sex; small->sex=temp->sex; temp->department=t->department; t->department=small->department; small->department=temp->department; temp->title=t->title; t->title=small->title; small->title=temp->title;

temp->wage=t->wage; t->wage=small->wage; small->wage=temp->wage; temp->day=t->day; t->day=small->day; small->day=temp->day; temp->allowance=t->allowance; t->allowance=small->allowance;

small->allowance=temp->allowance; temp->tax=t->tax; t->tax=small->tax; small->tax=temp->tax; temp->real_wage=t->real_wage; t->real_wage=small->real_wage; small->real_wage=temp->real_wage;

}

} while(!g) {g->next=t; t=t->next; } cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发数 "<<endl; while(g!=NULL) { Display(g); g=head->next; }*/ //cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实 发数"<<endl; // while(!=NULL) // { Display(t); // t=t->next; //} /*} }*/ /*void order() { string department; cout<<"当输入的部门为-1 是表示结束输入"<<endl; do{ cout<<"请输入要查找的部门:"; cin>>department; if(department=="-1")continue; Worker1.paixu(department); }while(department!="-1"); return;

}*/ /*****************************************************/ //排序 void Worker:: sort_data() { cout<<"请输入您需要排序的项目: 1 学历,2 工资"<<endl; int choice; cin>>choice; Worker_pay * p,*q,*small,*temp; temp= new Worker_pay ; //head->next=p; switch (choice) { case 1 :

for(p=head;p->next!=NULL;p=p->next) { small=p; for(q=p->next ;q!=NULL;q=q->next) if(q->eduage<small->eduage) small=q; if(small!=p) { temp->eduage=p->eduage; p->eduage=small->eduage; small->eduage=temp->eduage; temp->num=p->num; p->num=small->num; small->num=temp->num;

temp->name=p->name; p->name=small->name; small->name=temp->name; temp->age=p->age; p->age=small->age; small->age=temp->age; temp->sex=p->sex;

p->sex=small->sex; small->sex=temp->sex; temp->department=p->department; p->department=small->department; small->department=temp->department; temp->title=p->title; p->title=small->title; small->title=temp->title;

temp->wage=p->wage; p->wage=small->wage; small->wage=temp->wage; temp->day=p->day; p->day=small->day; small->day=temp->day; temp->allowance=p->allowance; p->allowance=small->allowance; small->allowance=temp->allowance; temp->tax=p->tax; p->tax=small->tax; small->tax=temp->tax; temp->real_wage=p->real_wage; p->real_wage=small->real_wage; small->real_wage=temp->real_wage;

}

} cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发 数"<<endl; while(head!=NULL) { Display(head); head=head->next; } //cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发数

"<<endl; /* while(!p) {head->next=p; p=p->next; } p->next;*/ /*while(!p){ Display(p); p=p->next;}*/ break; case 2 :

for(p=head;p->next!=NULL;p=p->next) { small=p; for(q=p->next ;q!=NULL;q=q->next) if(q->wage<small->wage) small=q; if(small!=p) { temp->eduage=p->eduage; p->eduage=small->eduage; small->eduage=temp->eduage; temp->num=p->num; p->num=small->num; small->num=temp->num;

temp->name=p->name; p->name=small->name; small->name=temp->name; temp->age=p->age; p->age=small->age; small->age=temp->age; temp->sex=p->sex; p->sex=small->sex; small->sex=temp->sex; temp->department=p->department;

p->department=small->department; small->department=temp->department; temp->title=p->title; p->title=small->title; small->title=temp->title;

temp->wage=p->wage; p->wage=small->wage; small->wage=temp->wage; temp->day=p->day; p->day=small->day; small->day=temp->day; temp->allowance=p->allowance; p->allowance=small->allowance; small->allowance=temp->allowance; temp->tax=p->tax; p->tax=small->tax; small->tax=temp->tax; temp->real_wage=p->real_wage; p->real_wage=small->real_wage; small->real_wage=temp->real_wage;

}

} cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发数 "<<endl; while(head->next!=NULL) { Display(head->next); head->next=head->next->next; } //cout<<"员工编号 员工姓名 年龄 性别 部门 职务 学历 工资 缺勤(天) 罚金 个税 实发数 "<<endl; /*while(!p) {head->next=p; p=p->next; } p=head->next;*/

/*while(!p){ Display(p); p=p->next;}*/ break; default: cout<<"无效输入!"<<endl; } } /*****************************************************/ /*主函数*/ int main() { // Worker Worker1; //Worker mail; int select; char s; while(1) { select=Menu(); switch(select) { case 0: s=Exit(); if(s=='y'||s=='Y')return 0; break; case 1: //添加 AddNew(); break; case 2: //删除 DoDelete(); break; case 3: //修改 DoMotify(); break; case 4: //编号查询 DoFindbianhao(); break; case 5: //复合查询 DoFindbumen(); break; case 6: List(); //输出全部信息 break;

case 7: Findavg(); break; // case 8: // order(); // break; case 9: Worker1.load(); break; case 10: Worker1.sort_data(); break; default: cout<<"无效输入!"<<endl; } } return 0; }

//部门平均工资 //部门内排序

//读文件

//依据学历及工资递增排序


赞助商链接

更多相关文章:
数据库课程设计 企业人事档案管理_图文
数据库课程设计 企业人事档案管理 - 软件学院 课程设计报告书 课程设计报告书 课程名称 设计题目 专业班级 学姓号名 数据库原理及应用 企业人事档案管理 财升本 ...
更多相关标签:

All rights reserved Powered by 甜梦文库 9512.net

copyright ©right 2010-2021。
甜梦文库内容来自网络,如有侵犯请联系客服。zhit325@126.com|网站地图