c++课程设计高校工资管理系统.doc
任务书一、设计题目高校工资管理系统二、主要内容三、具体要求及应提交的材料高校有五类职工:教师,实验员,行政人员,教师兼职实验员,行政人员兼职教师。为了实现工资发放的自动功能,现要求编写程序来自动完成此功能。同时注意生成的相关数据结果以文件方式存放在硬盘中。程序应具备从键盘录入,文件的可继续录入,任意职工的工资查询(可由职工编号和职工姓名来实现),如若有职工由于工作调动,则可进行相对应的删除工作。相关信息: 每一学期将学校职工的本学期任职情况及上学期工作的相关情况输入计算机,则本学期职工的月工资按程序处理后的结果发放,其中职工的工资计算方法如下:其中工资的基本构成如下: 教师: 基本工资+课时费; 实验员: 基本工资+实验室补助; 行政人员: 基本工资+行政补贴; 教师兼职实验员: 基本工资+课时费+实验室补助; 行政人员兼职教师:基本工资+行政补贴+课时费;(其中: 1.课时费:教师每一学期的基本工作量为120,实验员每学期基本工作量为70,行政人员没有基本工作量,每节课时费为20元;课时费=(上学期工作量-基本工作量)*20; 注意:如果上学期基本工作量没完成,则其(上学期工作量-基本工作量)*20为负值。 2.基本工资:教师800元,实验员650元,行政人员750元。 3.行政补贴:250元。 4.实验室补助:150元。)四、主要技术路线提示五、进度安排六、推荐参考资料(不少于3篇)1 引 言1.1 问题的提出随着高等学校的快速发展,高校规模越来越大,教职工的数量也越来越多,高校工资管理更加的复杂化,儿工资管理是一项琐碎、复杂而又十分细致的工作,工资计算、发放、核算的工作量很大,这就会耗费工作人员大量的时间和精力,计算机进行工资发放工作,不仅能够保证工资核算准确无误,而且还可以利用计算机对有关工资的各种信息进行统计,服务于财政部门其他发面的核算和财务处理,同时计算机具有着手工管理嗦无法比拟的优点。高校工资管理系统便是以计算机为工具,通过对工资管理所需的信息管理,优化了管理体系,使其高效化、智能化,也提高了透明度和互动性。2. 程序的主要功能2.1添加功能可以从键盘或文件录入职工的相应信息。2.2删除功能能够对指定的职工信息进行删除。2.3 显示功能能够显示职工编号、姓名、类别、本学期任职情况和工资等信息。2.4查找功能根据你键入的职工编号,显示其详细信息。2.5计算功能 根据你键入的职工相关信息自动计算其工资功能。3 程序运行平台4 总体设计5 模块分析5.1 添加模块系统将提示用户输入新添加的职员的信息,插入在链表中。void College:Add() /增加职工 Person *p=PL; while(p->next)p=p->next; int ch; cout<<"输入职工分类码0-教师,1-实验员,2-行政人员,3-教师兼实验员,4-行政兼教师:n" cin>>ch; Teacher *pt; /创建新结点,录入数据,连接到链表 Assistant *pa; Manager *pm; Teacher_Assistant *pta; Manager_Teacher *pmt; switch(ch) case 0: pt=new Teacher; pt->Input(); p->next=pt; break; case 1: pa=new Assistant; pa->Input(); p->next=pa; break; case 2: pm=new Manager; pm->Input(); p->next=pm; break; case 3: pta=new Teacher_Assistant;pta->Input(); p->next=pta; break; case 4: pmt=new Manager_Teacher; pmt->Input(); p->next=pmt; break; default: return; 输入需要添加的教职工类别ch (0-教师,1-实验员,2-行政人员,3-教师兼实验员,4-行政兼教师) 创建新结点,录入数据,连接到链表 switch(ch)case0:pt=new Teacher; pt->Input();p->next=pt; break;case 1: pa=new Assistant; pa->Input(); p->next=pa; break;case 2: pm=new Manager; pm->Input();p->next=pm; break;case 3: pta=new Teacher_Assistant;pta->Input();p->next=pta; break;case 4: pmt=new Manager_Teacher; pmt->Input(); p->next=pmt;break;5.2 显示模块显示模块将输出所有职员的主要资料 。void College:Print() /显示输出职工信息cout<<"n* 职工信息表 *n" cout<<"编号 姓名 岗位 课时 收入情况n" Person *p=PL->next; if(!p)cout<<"无职工记录!n" return; while(p) /找到并输出职工信息p->Output(); p=p->next; Person *p=PL->next; true !p falsecout<<"无职工记录!n" return;p->Output(); p=p->next;/找到并输出职工信息5.3 删除模块首先由用户输入要删除的单个职员姓名,然后调用删除函数,删除该名职员的资料。int College:Find(int ID,Person *p1,Person *p2) /查找职工结点*p1=PL->next; *p2=PL; while(*p1)if(*p1)->no=ID) break; /找到else *p2=*p1; /继续查找 *p1=(*p1)->next;return *p1?1:0;void College:Delete() /删除职工cout<<"n* 删除职工 *n"int no; Person *p1,*p2; cout<<"编号:" cin>>no; if(!Find(no,&p1,&p2)cout<<"指定的人员没有找到!n"elsep2->next=p1->next; /连接delete p1; cout<<"正确删除!n" 由输入的职工编号查找职工结点 找到 未找到p2->next=p1->next; /连接delete p1;cout<<"正确删除!n"cout<<"指定的人员没有找到!n"5.4 查找模块首先由用户输入要查找的职员姓名,然后系统用查找函数查找,然后系统就调用输出函数,输出所查找的职员资料。int College:Find(int ID,Person *p1,Person *p2) /查找职工结点*p1=PL->next; *p2=PL; while(*p1)if(*p1)->no=ID) break; /找到else *p2=*p1; /继续查找 *p1=(*p1)->next;return *p1?1:0;void College:Find1() /查询职工信息cout<<"n* 查询职工 *n"int no; Person *p1,*p2; cout<<"编号:" cin>>no; if(!Find(no,&p1,&p2)cout<<"指定的人员没有找到!n"elsecout<<"编号 姓名 岗位 课时 收入情况n"cout<<setw(4)<<p1->no<<setw(6)<<p1->name<<setw(4)<<p1->duty<<setw(8)<<p1->hours<<setw(8)<<p1->Incoming()<<endl; 由输入的职工编号查找职工结点 找到 未找到按照格式输出所查找到的职工相关信息cout<<"指定的人员没有找到!n"结论通过这次课程设计,我对C+又有了更深一步的了解,尤其是关于指针、链表等数据结构,还有类的使用,基本上可以灵活运用指针数组了。类与对象的使用使程序更加模块化,与客观世界的联系也更为紧密。在编写程序之前对自己所要编写的程序所要实现的功能,使用什么结构等要有大致的构思,这样在编写时思路才会更清晰,程序出错的几率降低,程序总体上的考虑也能更周全、运行更顺畅。 附 录附录1 源程序代码#include <iostream.h>#include <iomanip.h>#include <stdlib.h>#include <string.h>#include <conio.h>#include <fstream.h>const int P=20;class Person /定义抽象类protected:int no; /编号 char name20; /姓名 int duty; /人员类别:0-教师,1-实验员,2-行政人员,3-教师兼实验员,4-行政兼教师 int hours; /基本工作量Person *next; /指针域public:Person() /构造基类next=0; /指针域设为空virtual Person() /基类虚析构virtual void Input()=0; /从键盘输入数据 virtual void Input(ifstream& ifs)=0; /从文件输入数据 virtual void Output()=0; /向屏幕输出数据 virtual void Output(ofstream& ofs)=0; /向文件输出数据 virtual int Incoming()=0; /计算收入 friend class College;class Teacher:virtual public Person /教师类public: Teacher() /构造函数,初始化部分数据duty=0; void Input() /键盘补充输入其它数据cout<<"编号:" cin>>no; cout<<"姓名:" cin>>name; cout<<"教师上学期课时:" cin>>hours; void Input(ifstream& ifs) /从文件输入数据ifs>>no>>name>>duty>>hours; void Output()cout<<setw(4)<<no<<setw(6)<<name<<setw(4)<<duty<<setw(8)<<hours<<setw(8)<<Incoming()<<endl; void Output(ofstream& ofs) ofs<<setw(4)<<no<<setw(6)<<name<<setw(4)<<duty<<setw(8)<<hours<<setw(8)<<endl; int Incoming() /计算教师工资 return hours*P-1600; ;class Assistant:virtual public Person /实验员类public: Assistant()duty=1; void Input() cout<<"编号:" cin>>no; cout<<"姓名:" cin>>name; cout<<"实验员上学期课时:" cin>>hours; void Input(ifstream& ifs) ifs>>no>>name>>duty>>hours; void Output() cout<<setw(4)<<no<<setw(6)<<name<<setw(4)<<duty<<setw(8)<<hours<<setw(8)<<Incoming()<<endl; void Output(ofstream& ofs) ofs<<setw(4)<<no<<setw(6)<<name<<setw(4)<<duty<<setw(8)<<hours<<setw(8)<<endl; int Incoming() return hours*P-600; ;class Manager:virtual public Person /行政人员类public:Manager()duty=2;hours=0; void Input()cout<<"编号:"cin>>no; cout<<"姓名:" cin>>name; void Input(ifstream& ifs) ifs>>no>>name>>duty; void Output() cout<<setw(4)<<no<<setw(6)<<name<<setw(4)<<duty<<setw(8)<<hours<<setw(8)<<Incoming()<<endl; void Output(ofstream& ofs) ofs<<setw(4)<<no<<setw(6)<<name<<setw(4)<<duty<<hours<<setw(8)<<endl; int Incoming() return 1000;class Teacher_Assistant:public Teacher,public Assistant /教师兼实验员类public:Teacher_Assistant() duty=3; void Input()cout<<"编号:" cin>>no; cout<<"姓名:" cin>>name; cout<<"教师兼职实验员上学期实验课时:" cin>>Teacher:hours; void Input(ifstream& ifs) ifs>>no>>name>>duty>>Teacher:hours; void Output() cout<<setw(4)<<no<<setw(6)<<name<<setw(4)<<duty<<setw(8)<<Teacher:hours<<setw(8)<<Incoming()<<endl; void Output(ofstream& ofs) ofs<<setw(4)<<no<<setw(6)<<name<<setw(4)<<duty<<setw(8)<<Teacher:hours<<setw(8)<<endl; int Incoming() /计算工资 return 1450+Teacher:hours*P;class Manager_Teacher:public Manager,public Teacher /行政人员兼教师类public:Manager_Teacher()duty=4; void Input() cout<<"编号:" cin>>no; cout<<"姓名:" cin>>name; cout<<"行政人员兼职教师上学期课时:" cin>>Manager:hours; void Input(ifstream& ifs) ifs>>no>>name>>duty>>Manager:hours; void Output()cout<<setw(4)<<no<<setw(6)<<name<<setw(4)<<duty<<setw(8)<<Manager:hours<<setw(8)<<Incoming()<<endl; void Output(ofstream& ofs) ofs<<setw(4)<<no<<setw(6)<<name<<setw(4)<<duty<<setw(8)<<Manager:hours<<setw(8)<<endl; int Incoming() /计算工资 return 1000+Manager:hours*P;class Collegeprivate:Person *PL; void Clear(); int College:Find(int ID,Person *p1,Person *p2);public: College(); /构造函数 void Add(); /增加职工函数 void Delete(); /删除职工函数 void Modify(); /修改职工函数 void Print(); /输出职工信息函数 void Save(); /职工信息存盘函数 void Load(); /职工信息装入函数void Find1(); /查找职工信息函数 College(); /析构函数;College:College() /构造函数(创建1个头结点的链表)Person *p=new Teacher; PL=p; Load();College:College() /析构函数(仅保留1个头结点) Person *p=PL;while(p) /逐个删除结点,包括头结点PL=p->next; delete p; p=PL;PL=0;void College:Add() /增加职工 Person *p=PL; while(p->next)p=p->next; int ch; cout<<"输入职工分类码0-教师,1-实验员,2-行政人员,3-教师兼实验员,4-行政兼教师:n" cin>>ch; Teacher *pt; /创建新结点,录入数据,连接到链表 Assistant *pa; Manager *pm; Teacher_Assistant *pta; Manager_Teacher *pmt; switch(ch) case 0: pt=new Teacher; pt->Input(); p->next=pt; break; case 1: pa=new Assistant; pa->Input(); p->next=pa; break; case 2: pm=new Manager; pm->Input(); p->next=pm; break; case 3: pta=new Teacher_Assistant;pta->Input(); p->next=pta; break; case 4: pmt=new Manager_Teacher; pmt->Input(); p->next=pmt; break; default: return;void College:Clear() /清除职工结点,仅保留头结点Person *p=PL->next; while(p) PL->next=p->next; delete p; p->next=PL->next;int College:Find(int ID,Person *p1,Person *p2) /查找职工结点*p1=PL->next; *p2=PL; while(*p1)if(*p1)->no=ID) break; /找到else *p2=*p1; /继续查找 *p1=(*p1)->next;return *p1?1:0;void College:Delete() /删除职工 cout<<"n* 删除职工 *n" int no; Person *p1,*p2; cout<<"编号:" cin>>no; if(!Find(no,&p1,&p2)cout<<"指定的人员没有找到!n"elsep2->next=p1->next; /连接delete p1; cout<<"正确删除!n"void College:Find1() /查询职工信息cout<<"n* 查询职工 *n"int no; Person *p1,*p2; cout<<"编号:" cin>>no; if(!Find(no,&p1,&p2)cout<<"指定的人员没有找到!n"elsecout<<"编号 姓名 岗位 课时 收入情况n"cout<<setw(4)<<p1->no<<setw(6)<<p1->name<<setw(4)<<p1->duty<<setw(8)<<p1->hours<<setw(8)<<p1->Incoming()<<endl;void College:Print() /输出职工信息cout<<"n* 职工信息表 *n" cout<<"编号 姓名 岗位 课时 收入情况n" Person *p=PL->next; if(!p)cout<<"无职工记录!n" return; while(p) /找到并输出职工信息p->Output(); p=p->next;void College:Save() /职工信息存盘ofstream f("Person.dat",ios:out); /打开文件 /遍历输出至文件Person *p=PL->next; while(p) p->Output(f); p=p->next;f.close(); /关闭文件cout<<"职工信息已经保存在Person.dat.n"void College:Load() /职工信息装入 char buf81; /临时空间 int duty; /人员类型 Person *p2; /新建结点的指针 long t; /读写位置 Clear(); /清除现有结点(保留头结点)ifstream f("Person.dat",ios:in); /打开文件Person *p=PL; /尾结点指针while(1)t=f.tellg() /读取人员类型f>>buf>>buf>>duty;if(f)switch(duty) /根据人员类型创建新结点 case 0: p2=new Teacher; break; case 1: p2=new Assistant; break; case 2: p2=new Manager; break; case 3: p2=new Teacher_Assistant; break; case 4: p2=new Manager_Teacher; break; default: f.close(); return;p->next=p2;p=p->next;f.seekg(t);p->Input(f); elsebreak; f.close(); /关闭文件void main()int i,j;char ch; College c; /定义大学对象 do /显示主菜单 cout<<"|-菜单-|n" cout<<"1增加教职工信息n" cout<<"2删除教职工信息n" cout<<"3输出教职工信息n" cout<<"4查询教职工信息n"cout<<"5数据存盘n" cout<<"0结束"<<endl; cout<<"|-|"<<endl; cout<<"输入14应的操作 ,输入0 结束"<<endl; cin>>ch; system("cls");switch(ch)case '1':cout<<"n* 增加职工 *n"cout<<"请输入需要增加的职工数:"cin>>i;for(j=1;j<=i;j+) c.Add(); break; case '2':c.Delete();break; case '3':c.Print();break; case '4':c.Find1();break; case '5':c.Save();break; default :breakwhile(ch!='0');