企业工资管理系统课程设计.doc
广东海洋大学课程设计报告课 程 企业工资管理系统姓 名 *院 (系) 计算机科学与技术学 号 目 录1 需求与功能分析12 系统框架图23 类的设计与分析24 非成员函数的设计与分析45 特色算法分析46 存在的问题及对策87 用户手册及测试结果87.1 用户手册87.2 测试结果88 心得体会119 附:程序源代码111 需求与功能分析在信息技术高速发展的今天,传统的数据统计方式在处理庞大繁杂的信息量时显得力不从心,于是,人们对于运用计算机来辅助和管理工作的需求正在逐步提高。随着各个企业业务的逐步扩展,企业的员工人数也在迅速增加,由于管理人员水平有限,导致某些员工纪录管理并不完善,特别是繁杂的员工工资管理纪录,不易查询、修改,极易导致错误,而落后的员工管理方法随着社会的日益竞争,必将被淘汰。由计算机来管理庞大而繁杂的企业员工纪录是非常合适的,不仅查询和修改方便,并且效率高,速度快,完全能够满足现代化企业管理的需要,同时也更利于实现全面办公自动化。因此开发一套企业员工工资管理系统软件势在必行。本系统实现五种基本功能:输入员工工资信息、删除员工工资信息、修改员工工资信息、查找员工工资信息、列出所有员工工资信息。所以该工资管理系统可以分为5个模块,分别为输入模块、删除模块、修改模块、查找模块、列表模块,每个模块都有其对应的功能以及其设计。(1)输入模块输入模块的功能是创建存储职工工资信息的存储系统以及添加某职工的工资信息。为实现输入的功能,有两个方面的任务:定义结构体以及建立链表。(2)删除模块删除模块的功能是删除某职工的工资信息。(3)修改模块修改模块的功能是修改某职工的部分工资信息。(4)查找模块查找模块的功能就是输出指定编号职工的工资信息。(5)列表模块列表模块的功能是输出当月全体职工的工资信息。2 系统框架图主菜单输入员工工资信息删除指定员工工资信息修改指定员工工资信息查找指定员工工资信息输出全体员工工资信息退出 图1 系统框架图3 类的设计与分析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 ReplaceItem(int); /修改函数void ListL(); /遍历函数 void Search(int); /查找并输出某个员工信息函数void Real_wage(float,float); /计算函数void 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)成员函数删除函数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,···float,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_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 num1,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;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->wage=wage1;p1->allowance=allowance1;p1->next=NULL;p->next=p1;return;6 存在的问题及对策(1)设计初期,先完成初步构思,写出主函数。然后对主函数所涉及的各个模块进行编程,将各个模块利用指针和链表联系起来。在环境中进行调试,应一边编译,一边调试,并且要一个模块一个模块的调试。直至此模块完全没有错误时,在进入下一模块的调试。不能直接输入全部的代码一次性调,这样错误会很多,并且不易找出和修改。在完成程序的编译链接后,要用多组数据进行审查,确保做到系统无误。设计过程中,不应忽视环境提示的警告,有时程序运行不正确与警告也有很大的关系。这次设计中遇到很多问题都是提示类型不匹配,这时就要认真检查前面的代码,及时改正并且认真仔细,杜绝此类错再次发生。编写代码时应该少用全局变量,全局变量在编写试看似定义次数少,很方便。但全局变量出错几率较大,且不易修改,每次修改时都要全面考虑,所以应避免用到。程序调试中碰到的错误可以使自己学到知识。养成良好的编程习惯,可以节省很多时间,避免很多不必要的错误。(2)在编辑完整个程序后,进行调试阶段总是会数显head无定义。解决办法:再类的定义是忘记声明指针Worker_pay *head;。7 用户手册及测试结果 7.1 用户手册运行程序时,界面刚开始出现一个主菜单及提示信息,用户通过在键盘上输入来选择某个功能。当用户选择了某个功能,系统将跳转到所选择的功能界面,用户将可以根据提示信息来使用该功能,当用户通过键盘输入编号为-1时,系统将返回主界面。 7.2 测试结果图3 系统主界面图4 输入员工信息测试图图5 删除员工信息测试图图6 修改员工信息测试图图7 查找员工信息测试图图8 输出全体员工信息测试图图9 退出系统测试图8 心得体会经过两周的C+课程设计,我对C+语言设计有了一个更深、更全面的了解,尤其体会到了C+面向对象操作对简化程序的重要作用。下面是我的几点体会:1拿 到课题时,我一脸的茫然,看到如此庞大的工程,不知如何下手。和同学讨论很久,我发现其实可以化繁为简的。所以做任何事情都必须要开动脑筋,积极思考,有时还要学会化繁为简。2、很重要的一点就是一定要对链表的3种操作熟练的掌握。3、在编译,链接,调试的过程中一定要有耐心。因为一个程序中会有很多小的错误,甚至有的问题要几个小时才能解决。遇到问题,一定要全面分析,有时候还要向同学请教。总得来说,编程时极需要耐心的。总之,C+课程设计为我们提供了一个综合应用所学知识,解决实际问题的平台,增强了我们实践动手的能力和工程实践能力,并且锻炼和培养了我们的自学能力,让我们对C+有了一个更全面的了解。9 附:程序源代码#include <iostream>#include<string>#include<fstream>#include<iomanip>using 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; /链表结点的指针域;/*/*定义一个员工类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 ReplaceItem(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;/*/功能:在链表中查找员工的编号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;/*/功能:创建链表及链表的插入void Worker:AddItem(int num1,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;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->wage=wage1;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->wage;cout<<"津贴(元):"cin>>p->allowance;return;/*/功能:输出员工信息void Worker:Display(Worker_pay * p)cout<<p->num<<setw(8)<<p->name<<setw(8)<<p->age<<setw(8)<<p->sex<<setw(8)<<p->department<<setw(8)<<p->title<<setw(8)<<p->wage<<setw(8)<<p->allowance<<setw(8)<<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)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)if(p->wage<=2000)p->tax=0;else if(p->wage>2000&&p->wage<=2500)p->tax=p->wage*0.05;else if(p->wage>2500&&p->wage<=4000)p->tax=p->wage*0.1-25;else if(p->wage>4000&&p->wage<=7000)p->tax=p->wage*0.15-125;else if(p->wage>7000&&p->wage<=22000)p->tax=p->wage*0.2-375;else if(p->wage>22000&&p->wage<=42000)p->tax=p->wage*0.25-1375;else if(p->wage>42000&&p->wage<=62000)p->tax=p->wage*0.3-3375;else if(p->wage>62000&&p->wage<=82000)p->tax=p->wage*0.35-6375;else if(p->wage>82000&&p->wage<=)p->tax=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.txt",ios:app);file1<<"员工编号:"<<num1<<" 员工姓名:"<<name1<<" 年龄:"<<age1<<" 性别:"<<sex1<<" 部门:"<<department1<<" 职务:"<<title1 <<" 工资(元):"<<wage1<<" 津贴(元):"<<allowance1<<" 个人所得税(元):"<<tax1<<" 实发数(元):"<<real_wage1<<endl;file1.close(); /*/*定义一个对象Worker1*/Worker Worker1; /*/ /*主菜单函数*/ int Menu() cout<<"ttt"<<endl;cout<<"tt 企业员工工资管理系统 t"<<endl;cout<<"tt *主菜单* t"<<endl;int n=1,select=-1;cout<<"tt "<<n+<<".输入员工信息 tt"<<endl;cout<<"tt "<<n+<<".删除指定员工编号信息tt"<<endl;cout<<"tt "<<n+<<".修改指定员工编号信息tt"<<endl;cout<<"tt "<<n+<<".查找指定员工编号信息tt"<<endl;cout<<"tt "<<n+<<".输出全体员工信息ttt"<<endl;cout<<"tt 0.退出tttt"<<endl;cout<<"tttt"<<endl;cout<<"请选择05(输入相应数字):"cin>>select;return select;/*/功能:退出程序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,float * wage,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>>* wage;cout<<"津贴(元):"cin>>* allowance;return;/*/功能:把员工信息插入到链表中void AddNew() int num=0;string name;int age=0;string sex;string department;string 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,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;docout<<"请输入要查找的员工的编号:"cin>>num;if(num=-1)continue;Worker1.Search(num);while(num!=-1);return;/*/功能:删除指定员工编号信息void DoDelete() cout<<"当输入的员工编号为-1是表示结束输入"<<endl;int num;docout<<"请输入要删除的员工的编号:"cin>>num;if(num=-1)continue;Worker1.RemoveItem(num);cout<<"已成功删除该员工信息!"<<endl;while(num!=-1);return;/*/功能:修改指定员工编号信息void DoMotify() cout<<"当输入的员工编号为-1是表示结束输入"<<endl;int num;docout<<"请输入要修改的员工的编号:"cin>>num;if(num=-1)continue;Worker1.ReplaceItem(num);while(num!=-1);cout<<"已成功修改该员工信息!"<<endl;return;/*/功能:输出全体员工信息void List() Worker1.ListL();/*/*主函数*/int main() int select;char s;while(1)select=Menu();switch(sel