《企业员工工资管理系统课程设计报告书.doc》由会员分享,可在线阅读,更多相关《企业员工工资管理系统课程设计报告书.doc(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、. .仲恺农业工程学院课程设计报告*课 程 面向对象课程设计姓 名院 (系)专业年级学 号指导教师日 期仲恺农业工程学院教务处制27 / 29目 录1 需求与功能分析12 系统框架图23 类的设计与分析24 非成员函数的设计与分析45 特色算法分析46 存在的问题与对策87 用户手册与测试结果87.1 用户手册87.2 测试结果88 心得体会119 附:程序源代码111 需求与功能分析在信息技术高速发展的今天,传统的数据统计方式在处理庞大繁杂的信息量时显得力不从心,于是,人们对于运用计算机来辅助和管理工作的需求正在逐步提高。随着各个企业业务的逐步扩展,企业的员工人数也在迅速增加,由于管理人员水
2、平有限,导致某些员工纪录管理并不完善,特别是繁杂的员工工资管理纪录,不易查询、修改,极易导致错误,而落后的员工管理方法随着社会的日益竞争,必将被淘汰。由计算机来管理庞大而繁杂的企业员工纪录是非常合适的,不仅查询和修改方便,并且效率高,速度快,完全能够满足现代化企业管理的需要,同时也更利于实现全面办公自动化。因此开发一套企业员工工资管理系统软件势在必行。企业员工工资管理系统是企业管理系统中的一个重要组成部分,它为企业合理的员工调配与编制,以与有关问题的决策能够提供各种必要的基础数据,是公司管理现代化的一个重要方面。利用微机对庞杂而繁锁的员工工资系统实现自动化管理,是计算机公司信息管理系统的重要容
3、。我在勇老师指导下开发了企业员工工资管理系统。企业员工工资管理系统旨在为商业人士与在社会团体、机构中负责管理关系的人士提供一个功能全面、使用方便的工资管理系统,以替代传统的手工管理工资纪录,同时利用先进信息技术为用户提供一些更为方便实用的功能。 本系统实现五种基本功能:输入员工工资信息、删除员工工资信息、修改员工工资信息、查找员工工资信息、列出所有员工工资信息。所以该工资管理系统可以分为5个模块,分别为输入模块、删除模块、修改模块、查找模块、列表模块,每个模块都有其对应的功能以与其设计。(1)输入模块输入模块的功能是创建存储职工工资信息的存储系统以与添加某职工的工资信息。为实现输入的功能,有两
4、个方面的任务:定义结构体以与建立链表。(2)删除模块删除模块的功能是删除某职工的工资信息。(3)修改模块修改模块的功能是修改某职工的部分工资信息。(4)查找模块查找模块的功能就是输出指定编号职工的工资信息。(5)列表模块列表模块的功能是输出当月全体职工的工资信息。2 系统框架图主菜单输入员工工资信息删除指定员工工资信息修改指定员工工资信息查找指定员工工资信息输出全体员工工资信息退出图1 系统框架图3 类的设计与分析class Workerprotected:Worker_pay * head; /链表的头结点指针public:Worker()head=NULL; /构造函数void Displ
5、ay(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
6、Recordinfo(int,string,int,string,string,string,float,float,float,float); /存储函数;表1 Worker类说明表名称属性说明head数据成员链表头结点指针Worker()成员函数缺省的构造函数,缺省值为head=NULLvoid Display(Worker_pay *)成员函数输出函数Worker_pay * Find(int)成员函数查找函数int ListCount()成员函数统计员工人数函数void AddItem(int,float,float)成员函数创建链表并链表的插入void RemoveItem(int)
7、成员函数删除函数void ReplaceItem(int)成员函数修改函数void ListL()成员函数遍历函数void Search(int)成员函数查找并输出某个员工信息函数void Real_wage()成员函数计算函数voidRecoreinfo(int,float,float)成员函数存储函数4 非成员函数的设计与分析表2 非成员函数说明表名称说明int Menu()用于显示主菜单char Exit()用于退出程序void Input(int * num,float * allowance)用于输入员工工资信息void AddNew()用于调用成员函数AddItem(int,flo
8、at,float)Real_wage()和Recoreinfo(int,float,float)void DoFind()用于调用成员函数Search(int)void DoDelete()用于调用成员函数RemoveItem(int)void DoMotify()用于调用成员函数ReplaceItem(int)void List()用于调用成员函数ListL()int main()主函数5 特色算法分析Worker类中的成员函数void AddItem(int,float,float)(1)功能:创建存储职工工资信息的存储系统以与添加某职工的工资信息。算法思路:先定义一个结构体Worker_
9、pay,通过从表尾插入的方法来建立链表。首先要先设立一个头指针(head)来存放链表的首地址,然后,不断用new运算符生成一个新的结点,将这个结点链入已有的链表尾部;如果链表中还没有结点,则这个新结点将是首结点,否则,将新结点的地址赋给原有链表的尾结点的next指针。(2)流程图:StartIF !head员工工资信息赋给headReturn*t=headWhile t&t-num!= num1t=t-nextIF t操作失败Return*p-headWhilep-nextp-next员工工资信息赋给pReturnEnd图2 流程图(3)代码:void Worker:AddItem(int n
10、um1,string name1,int age1,string sex1,string department1,string title1,float wage1,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-wage=wage1;head-allowance=allowance1;head-next=NULL;return;Wor
11、ker_pay * t=head;while(t&t-num!=num1)t=t-next;if(t)cout操作失败;员工编号为num1的信息已经存在!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-wage=wage1;p1-allowance=allowance1;p1-next=NULL;p-next=p1;return;6 存在的问题与对策(1)设计初期,
12、先完成初步构思,写出主函数。然后对主函数所涉与的各个模块进行编程,将各个模块利用指针和链表联系起来。在环境中进行调试,应一边编译,一边调试,并且要一个模块一个模块的调试。直至此模块完全没有错误时,在进入下一模块的调试。不能直接输入全部的代码一次性调,这样错误会很多,并且不易找出和修改。在完成程序的编译后,要用多组数据进行审查,确保做到系统无误。设计过程中,不应忽视环境提示的警告,有时程序运行不正确与警告也有很大的关系。这次设计中遇到很多问题都是提示类型不匹配,这时就要认真检查前面的代码,与时改正并且认真仔细,杜绝此类错再次发生。编写代码时应该少用全局变量,全局变量在编写试看似定义次数少,很方便
13、。但全局变量出错几率较大,且不易修改,每次修改时都要全面考虑,所以应避免用到。程序调试中碰到的错误可以使自己学到知识。养成良好的编程习惯,可以节省很多时间,避免很多不必要的错误。(2)在编辑完整个程序后,进行调试阶段总是会数显head无定义。解决办法:再类的定义是忘记声明指针Worker_pay *head;。7 用户手册与测试结果7.1 用户手册运行程序时,界面刚开始出现一个主菜单与提示信息,用户通过在键盘上输入来选择某个功能。当用户选择了某个功能,系统将跳转到所选择的功能界面,用户将可以根据提示信息来使用该功能,当用户通过键盘输入编号为-1时,系统将返回主界面。7.2 测试结果图3 系统主
14、界面图4 输入员工信息测试图图5 删除员工信息测试图图6 修改员工信息测试图图7 查找员工信息测试图图8 输出全体员工信息测试图图9 退出系统测试图8 心得体会经过两周的C+课程设计,我对C+语言设计有了一个更深、更全面的了解,尤其体会到了C+面向对象操作对简化程序的重要作用。下面是我的几点体会:刚拿到课题时,我一脸的茫然,看到如此庞大的工程,不知如何下手。这个工资管理系统中职工子信息竟然包含15条,以前从来没有遇到过如此多的变量。和同学讨论很久好,我发现其实可以化繁为简的,信息中15条不一定全都要,因为其中本身就有重复的,例如津贴和补贴。并且可以有一个pay的数组来处理数据。所以做任何事情都
15、必须要开动脑筋,积极思考,有时还要学会化繁为简。在编程时条理清晰是至关重要的。主函数,函数,成员函数之间的层次关系,调用关系一定要有一个全面的把握,尤其要体会类的封装性。另外很重要的一点就是一定要对链表的五种操作熟练的掌握。在编译,调试的过程中一定要有耐心。因为一个程序中会有很多小的错误,甚至有的问题要几个小时才能解决。遇到问题,一定要全面分析,有时候还要向同学请教。总得来说,编程时极需要耐心的。总之,C+课程设计为我们提供了一个综合应用所学知识,解决实际问题的平台,增强了我们实践动手的能力和工程实践能力,并且锻炼和培养了我们的自学能力,让我们对C+有了一个更全面的了解。9 附:程序源代码/*
16、/#include#include#include#includeusing namespace std;/*/*定义一个员工信息的结构体Worker_pay*/struct Worker_payint num; /员工编号string name; /员工int age; /年龄string sex; /性别string department; /部门string title; /职务float wage; /工资float allowance; /津贴float tax; /个人所得税float real_wage; /实发数Worker_pay * next; /链表结点的指针域;/*/*
17、定义一个员工类Worker*/class Workerprotected: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 ReplaceI
18、tem(int); /修改函数void ListL(); /遍历函数 void Search(int); /查找并输出某个员工信息函数void Real_wage(float,float); /计算函数void Recordinfo(int,string,int,string,string,string,float,float,float,float); /存储函数;/*/功能:用于统计员工人数int Worker:ListCount()if(!head) return 0;Worker_pay * p=head;int n=0;while(p)n+;p=p-next;return n;/*/
19、功能:在链表中查找员工的编号Worker_pay * Worker:Find(int num)if(ListCount=0)cout列表为空,请先输入数据!num=num) break;p=p-next;if(!p)cout错误,找不到该信息!num=num1;head-name=name1;head-age=age1;head-sex=sex1;head-department=department1;head-title=title1;head-wage=wage1;head-allowance=allowance1;head-next=NULL;return;Worker_pay * t=
20、head;while(t&t-num!=num1)t=t-next;if(t)cout操作失败;员工编号为num1的信息已经存在!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-wage=wage1;p1-allowance=allowance1;p1-next=NULL;p-next=p1;return;/*/功能:从链表中删除一个结点void Worker:Re
21、moveItem(int num)Worker_pay * t=Find(num);if(!t)return;Worker_pay * p=head;if(head=t)head=head-next;delete p;cout成功删除员工编号为num的信息!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
22、)return;cout请重新输入相应信息endl;coutp-num;coutp-name;coutp-age;coutp-sex;coutp-department;coutp-title;coutp-wage;coutp-allowance;return;/*/功能:输出员工信息void Worker:Display(Worker_pay * p)coutnumsetw(8)namesetw(8)agesetw(8)sexsetw(8)departmentsetw(8)titlesetw(8)wagesetw(8)allowancesetw(8)taxsetw(8)real_wageend
23、l;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员工编号 员工 年龄 性别 部门 职务 工资 津贴 个税 实发数wage;p=p-next;aver=sum/n;cout员工平均薪水:averendl;return;/*/功能:查找并输出指定员工信息void Worker:Searc
24、h(int num)coutSearch.endl;Worker_pay * p=Find(num);if(p)cout员工编号为num的员工工资信息:endl;cout员工编号 员工 年龄 性别 部门 职务 工资 津贴 个税 实发数endl;Display(p);coutendl;return;/*/功能:程序部函数计算的信息例如个人所得税,实发数void Worker:Real_wage(float tax,float real_wage)if(ListCount()=0)cout当前列表为空,请先输入数据!wagetax=0;else if(p-wage2000&p-wagetax=p-
25、wage*0.05;else if(p-wage2500&p-wagetax=p-wage*0.1-25;else if(p-wage4000&p-wagetax=p-wage*0.15-125;else if(p-wage7000&p-wagetax=p-wage*0.2-375;else if(p-wage22000&p-wagetax=p-wage*0.25-1375;else if(p-wage42000&p-wagetax=p-wage*0.3-3375;else if(p-wage62000&p-wagetax=p-wage*0.35-6375;else if(p-wage8200
26、0&p-wagetax=p-wage*0.4-10375;else p-tax=p-wage*0.45-15375;p-real_wage=p-wage+p-allowance-p-tax;p=p-next;return;/*/功能:存储员工信息void Worker:Recordinfo(int num1,string name1,int age1,string sex1,string department1,string title1,float wage1,float allowance1,float tax1,float real_wage1) ofstream file1(info1
27、.txt,ios:app);file1员工编号:num1 员工:name1 年龄:age1 性别:sex1 部门:department1 职务:title1 工资(元):wage1 津贴(元):allowance1 个人所得税(元):tax1 实发数(元):real_wage1endl;file1.close(); /*/*定义一个对象Worker1*/Worker Worker1; /*/ /*主菜单函数*/ int Menu() couttttendl;couttt 企业员工工资管理系统 tendl;couttt *主菜单* tendl;int n=1,select=-1;couttt n
28、+.输入员工信息 ttendl;couttt n+.删除指定员工编号信息ttendl;couttt n+.修改指定员工编号信息ttendl;couttt n+.查找指定员工编号信息ttendl;couttt n+.输出全体员工信息tttendl;couttt 0.退出ttttendl;coutttttendl;coutselect;return select;/*/功能:退出程序char Exit() char s;couts;return s;/*/功能:输入员工信息void Input(int * num,string * name,int * age,string * sex,strin
29、g * department,string * title,float * wage,float * allowance) cout现在输入员工信息!endl;cout* num;if(* num=-1)return;cout* name;cout* age;cout* sex;cout* department;cout* title;cout* wage;cout* allowance;return;/*/功能:把员工信息插入到链表中void AddNew() int num=0;string name;int age=0;string sex;string department;strin
30、g title;float wage=0;float allowance=0;float tax=0;float real_wage=0;cout当输入的员工编号为-1是表示结束输入endl;Input(&num,&name,&age,&sex,&department,&title,&wage,&allowance);while(num!=-1)Worker1.AddItem(num,name,age,sex,department,title,wage,allowance);Worker1.Real_wage(tax,real_wage);Worker1.Recordinfo(num,name
31、,age,sex,department,title,wage,allowance,tax,real_wage);Input(&num,&name,&age,&sex,&department,&title,&wage,&allowance);cout员工工资信息已成功存储!endl;return;/*/功能:查找指定员工编号信息void DoFind() int num;cout当输入的员工编号为-1是表示结束输入endl;docoutnum;if(num=-1)continue;Worker1.Search(num);while(num!=-1);return;/*/功能:删除指定员工编号信息void DoDelete() cout当输入的员工编号为-1是表示结束输入endl;int num;docoutnum;if(num=-1)continue;Worker1.RemoveItem(num);cout已成功删除该员工信息!endl;while(num!=-1);return;/*/功能:修改指定员工编号信息void DoMotify() cout当输入的员工编号为-1
限制150内