664524487C++课程设计高校工资管理系统.doc
C+课程设计1.系统概述通过设计一个较为简单的高校工资管理系统,进一步熟悉C+中类的概念、类的封装、继承的实现方式。了解系统开发的需求分析、类层次设计、模块分析、编码测试、模块组装与整体调试的全过程,加深对C+的理解与Visual C+环境的使用;逐步熟悉程序设计的方法,并养成良好的编程习惯。2.总体设计2.1职工类的设计基于C+中类的概念,类的封装,继承和抽象。编写一个Person的基类包含共有的相关信息和操作,然后使职工类都继承于此基类从而实现多态。2.2应用类的设计编写一个Person类的友元类College类来实现添加,删除,查找等功能。2.3文件的读写设计通过College类中的Save()函数来实现数据的存储,保存在Person.dat中,而通过Load()函数来实现Person.dat数据的读入。3.详细设计及系统实现3.1 Person类class Person /人员类(抽象类)protected: int No; /编号 char Name20; /姓名 char Duty; /人员类别标志(0-教师,1-实验员,2-行政人员,3-教师兼实验员,4-行政兼教师) double Salary; /基本工资 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 double Incoming()=0; /计算收入 friend class College;3.2 Teacher类class Teacher:virtual public Person /教师类protected: int Hours; /教师课时public: /为对象设置数据分为两种途径,通过)构造函数,)一般成员函数 /分开可以使得程序中应用更加灵活 /本程序采用:缺省构造+Input() Teacher() /构造函数,初始化部分数据 Duty='0' Salary=800; void Input() /键盘补充输入其它数据 cout<<"编号:" cin>>No; cout<<"姓名:" cin>>Name; cout<<"教师上学期课时:" cin>>Hours; void Input(ifstream& ifs) ifs>>No>>Name>>Duty>>Hours; void Output() cout<<No<<"t"<<Name<<"t"<<"教师"<<"tt"<<Hours<<"t"<<Incoming()<<endl; void Output(ofstream& ofs) ofs<<No<<" "<<Name<<" "<<Duty<<" "<<Hours<<endl; double Incoming() return Salary+(Hours-120)*20; ;3.3 Assistant类class Assistant:virtual public Person /实验员protected: int Allowance; int Hours;public: Assistant() Duty='1' Salary=650; Allowance=150; void Input() cout<<"编号:" cin>>No; cout<<"姓名:" cin>>Name; cout<<"实验员上学期实验课时:" cin>>Hours; void Input(ifstream& ifs) ifs>>No>>Name>>Duty>>Hours; void Output() cout<<No<<"t"<<Name<<"t"<<"实验员tt"<<Hours<<"t"<<Incoming()<<endl; void Output(ofstream& ofs) ofs<<No<<" "<<Name<<" "<<Duty<<" "<<Hours<<endl; double Incoming() return Salary+Allowance+(Hours-70)*20; ;3.4 Manager类class Manager:virtual public Person /行政人员protected: int Allowance;public: Manager() Duty='2' Salary=750; Allowance=250; void Input() cout<<"编号:" cin>>No; cout<<"姓名:" cin>>Name; void Input(ifstream& ifs) ifs>>No>>Name>>Duty; void Output() cout<<No<<"t"<<Name<<"t"<<"行政人员t"<<Incoming()<<endl; void Output(ofstream& ofs) ofs<<No<<" "<<Name<<" "<<Duty<<endl; double Incoming() return Salary+Allowance; ;3.5 Teacher_Assistant类class Teacher_Assistant:public Teacher,public Assistant /教师兼实验员public: Teacher_Assistant() Duty='3' Teacher:Salary=800; void Input() cout<<"编号:" cin>>No; cout<<"姓名:" cin>>Name;cout<<"教师上学期课时:" cin>>Teacher:Hours; cout<<"教师兼职实验员上学期实验课时:" cin>>Assistant:Hours; void Input(ifstream& ifs) ifs>>No>>Name>>Duty>>Teacher:Hours>>Assistant:Hours; void Output() cout<<No<<"t"<<Name<<"t"<<"教师兼实验员 "<<Teacher:Hours<<" " <<Assistant:Hours<<"t"<<Incoming()<<endl; void Output(ofstream& ofs) ofs<<No<<" "<<Name<<" "<<Duty<<Teacher:Hours<<" " <<Assistant:Hours<<endl; double Incoming() return Salary+(Teacher:Hours-120)*20 +Allowance+(Assistant:Hours-70)*20; ;3.6 Manager_Teacher类class Manager_Teacher:public Manager,public Teacher /行政人员兼教师public: Manager_Teacher() Duty='4' Manager:Salary=750; void Input() cout<<"编号:" cin>>No; cout<<"姓名:" cin>>Name; cout<<"行政人员兼职教师上学期课时:" cin>>Hours; void Input(ifstream& ifs) ifs>>No>>Name>>Duty>>Hours; void Output() cout<<No<<"t"<<Name<<"t"<<"行政人员兼教师 "<<Hours<<"t"<<Incoming()<<endl; void Output(ofstream& ofs) ofs<<No<<" "<<Name<<" "<<Duty<<" "<<Hours<<endl; double Incoming() return Salary+Allowance+Hours*20; ;3.7 College类3.7.1 头文件class Collegeprivate: Person *PL; void Clear(); int College:Find(int ID,Person *p1,Person *p2);public: College(); /构造 College(); /析构 void Add(); /增加职工 void Delete(); /删除职工 void Modify(); /修改职工 void Print(); /输出职工信息 void Save(); /职工信息存盘 void Load(); /职工信息装入 void Finding(); /查找职工;3.7.2 构造函数College:College() /构造函数(创建个头结点的链表) Person *p=new Teacher; PL=p; cout<<"自动装入数据.n" Load();3.7.3 析构函数College:College() /析构函数(仅保留个头结点) Person *p=PL; while(p) /逐个删除结点,包括头结点 PL=p->next; delete p; p=PL; PL=0;3.7.4 Add函数void College:Add() /增加职工 cout<<"tt*高校工资管理系统*nnn" cout<<"ntttt*增加职工,输入x结束* nn" /查找尾结点 Person *p=PL; while(p->next)p=p->next; char ch='m' /创建新结点,录入数据,连接到链表 Teacher *pt; Assistant *pa; Manager *pm; Teacher_Assistant *pta; Manager_Teacher *pmt; cout<<"职工分类码0-教师,1-实验员,2-行政人员,3-教师兼实验员,4-行政兼教师:nn" for(;ch!='x') cout<<"类别:" cin>>ch; 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; p=p->next; 3.7.5 Find函数/查找职工结点(返回-找到,-未找到.结点指针由p1返回,p2为前看指针)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;3.7.6 Clear函数void College:Clear() /清除所有的职工结点(仅保留头结点) Person *p=PL->next; while(p) PL->next=p->next; delete p; p=PL->next; 3.7.7 Delete函数void College:Delete() /删除职工 cout<<"tt*高校工资管理系统*nnn" cout<<"ntttt* 删除职工*n" int No; Person *p1,*p2; cout<<"编号:" cin>>No; if(!Find(No,&p1,&p2) cout<<"指定的人员没有找到!n" else p2->next=p1->next; /连接 delete p1; cout<<"正确删除!n" 3.7.8 Modify函数void College:Modify() /修改职工 cout<<"tt*高校工资管理系统*nnn" cout<<"ntttt* 修改职工*n" int No; Person *p1,*p2; cout<<"编号:" cin>>No; if(!Find(No,&p1,&p2) cout<<"指定的人员没有找到!n" else p1->Output(); /输出原来的职工信息(做提示) p1->Input(); /输入新的职工信息(更新) cout<<"修改完成!n" 3.7.9 Print函数void College:Print() /输出职工信息 cout<<"tt*高校工资管理系统*nnn" cout<<"n* 职工信息表*nn" cout<<"编号t姓名t岗位tt其它t工资n" Person *p=PL->next; if(!p) cout<<"无职工记录!n" return; while(p) /遍历链表,输出职工信息 p->Output(); p=p->next; 3.7.10 Save函数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"3.7.11 Load函数void College:Load() /职工信息装入 char buf81; /临时空间 char 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); else break; /关闭文件 f.close(); cout<<"Person.dat数据已装入.n"3.7.12 Finding函数void College:Finding()cout<<"tt*高校工资管理系统*nnn"cout<<"ntttt*查找职工*n"Person *p1,*p2;int ID;cout<<"编号;"cin>>ID;cout<<"nn"p1=PL->next; p2=PL; while(p1) if(p1)->No=ID) cout<<"编号t姓名t岗位tt其它t工资n" (p1)->Output(); break; /找到 else p2=p1; /继续查找 p1=(p1)->next; 3.8 界面函数char Meau()char c;int flag;dosystem("cls");flag=1; cout<<"tt*高校工资管理系统*nnn" cout<<"tttn" cout<<"ttt n" cout<<"ttt 1、增加职工 n" cout<<"ttt 2、删除职工 n"cout<<"ttt 3、查找职工 n" cout<<"ttt 4、修改职工 n" cout<<"ttt 5、输出职工信息 n"cout<<"ttt 6、数据存盘 n" cout<<"ttt 7、数据装入 n"cout<<"ttt 8、退出 n" cout<<"tttn" cout<<"nnntt请输入您的选择:" cin>>c; if(c='1'|c='2'|c='3'|c='4'|c='5'|c='6'|c='7'|c='8') flag=0;while(flag);return c;/显示主菜单,接受选择3.9 主函数void main() char ch; College c; /定义大学对象 do ch=Meau(); switch(ch) case '1': system("cls");c.Add(); cout<<"nntt按任意键结束.n"getchar();getchar();break; case '2': system("cls");c.Delete();cout<<"nntt按任意键结束.n"getchar();getchar();break; case '3': system("cls");c.Finding();cout<<"nntt按任意键结束.n"getchar();getchar();break; case '4': system("cls");c.Modify();cout<<"nntt按任意键结束.n"getchar();getchar();break; case '5': system("cls");c.Print(); cout<<"nntt按任意键结束.n"getchar();getchar();break; case '6': system("cls");c.Save(); cout<<"nntt按任意键结束.n"getchar();getchar();break; case '7': system("cls");c.Load(); cout<<"nntt按任意键结束.n"getchar();getchar(); ; while(ch!='8');4.系统评价该系统实现了职工的添加,删除,查找,显示,修改,和数据的存盘与装入操作,总体上来说功能比较全面,但仍有一些不足,如界面问题,以及程序中的许多繁琐之处。5.设计结果与分析5.1 主界面实现各种功能的选择:5.2 添加功能实现添加功能,输入“x“结束:5.3 删除功能5.4 查找功能5.5 修改功能5.6 显示功能5.7 保存功能5.8 读入功能6.设计体会与建议6.1 体会通过这次对高校工资管理系统这个实验的设计,充分感受并体会到了C+中的面对对象设计的真意,以及学习了对一个程序的分解和分工完成的方法,掌握了一点编写的技巧。实际的操作与解决问题的能力更有了大幅的提升。6.2 建议 希望在以后的课程设计中,能更多的得到老师的帮助,可以帮助我们更清晰地理清思路,以及一些编程上的技巧。7.附录7.1 成员7.2 分工1.1 课程设计的目的(1)要求学生能够熟练掌握C+语言的基本知识和技能。(2)基本掌握面向对象程序设计的基本思路和方法。(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。1.2 课程设计的背景和意义1.2.1课程设计的背景1. 理论研究基础(1)C+在C的基础上增加了面向对象的机制。(2)充分运用面向对象机制中的继承性与多态性实现函数的设计。2. 技术层面的支持运用系统为C+面向对象程序设计提供的各种设计方法和VC+系统提供的库函数实现项目的开发。1.2.2 课程设计的意义通过设计此系统,熟练掌握C+语言的基本知识和技能,基本掌握面向对象程序开发的基本思路和方法,培养学生的动手操作能力,提高自主学艺能力,能够利用所学的基本知识和技能,进行简单应用程序设计。 第2章 需求分析2.1 问题描述某公司需要存储雇员的编号、姓名、性别、所在部门,级别,并进行工资的计算。其中,雇员分为经理、技术人员、销售人员和销售经理。四类人员的月薪计算方法如下:经理拿固定月薪;技术人员按小时领取月薪;销售人员按其当月销售额的提成领取工资;销售经理既拿固定月薪也领取销售提成。设计一程序能够对公司人员进行管理,应用到继承、抽象类、虚函数、虚基类、多态和文件的输入/输出等内容。2.2 功能要求(1)基本功能1) 添加功能:程序能够任意添加上述四类人员的记录,可提供选择界面供用户选择所要添加的人员类别,要求员工的编号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加。2) 查询功能:可根据编号、姓名等信息对已添加的记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息;3) 显示功能:可显示当前系统中所有记录,每条记录占据一行。4) 编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。5)删除功能:主要实现对已添加的人员记录进行删除。如果当前系统中没有相应的人员记录,则提示“记录为空!”并返回操作;否则,输入要删除的人员的编号或姓名,根据所输入的信息删除该人员记录,如果没有找到该人员信息,则提示相应的记录不存。6) 统计功能:能根据多种参数进行人员的统计。例如,统计四类人员数量以及总数,或者统计男、女员工的数量,或者统计平均工资、最高工资、最低工资等信息。7)保存功能:可将当前系统中各类人员记录存入文件中,存入方式任意。8)读取功能:可将保存在文件中的人员信息读入到当前系统中,供用户进行使用。(2)扩展功能在完成以上基本功能的基础上,可自行进行扩展或完善,例如: 1) 添加人员记录时,考虑各种数据的有效性。2)组合查询功能的实现。3)可按人员的某些信息进行排序,例如按工资进行排序等。4)对文件的读写使用二进制信息。2.3 问题的解决方案根据系统功能要求,可以将问题解决分为以下步骤:1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;2)分析系统中的各个实体及它们之间的关系; 3)根据问题描述,设计系统的类层次; 4)完成类层次中各个类的描述; 5)完成类中各个成员函数的定义; 6)完成系统的应用模块; 7)功能调试; 8)完成系统总结报告。第3章 系统设计3.1 数据设计3.1.1 类设计设计基类以派生出各个人员类:类名人员类 Person数据成员num name sex department grade wage编号 姓名 性别 部门 级别 工资成员函数获取姓名、获取编号、获取性别的函数 输入输出的虚函数表 3.1继承基类设计经理类:类名 经理类 Manager数据成员继承于Person类成员函数输入输出函数表 3.2根据经理类设计经理管理类: 类名 经理管理类 Man_administ 数据成员ManTMAX、top经历数组 总数 成员函数添加 修改 查询 统计 显示 删除 保存 读取表 3.3设计继承于基类的销售人员类: 类名 销售人员类 Sales 数据成员销售额 提成率和基类成员 成员函数获取销售额、提成率的函数 输入输出函数表 3.4根据销售人员类涉及销售人员管理类: 类名 销售人员管理类 Sal_administ 数据成员SalTMAX top 成员函数添加 修改 查询 统计 显示 删除 保存 读取表 3.5设计继承于基类的技术人员类: 类名 技术人员类 Technicist 数据成员 hour pay2 工作时间(小时) 薪水/小时 成员函数输入输出函数表 3.6根据技术人员类设计技术人员管理类: 类名 技术人员管理类 Tec_administ 数据成员TecTMAX top 成员函数添加 修改 查询 统计 显示 删除 保存 读取表 3.7根据经理类及销售人员类设计销售经理类: 类名 销售经理类 SalesManager 数据成员 pay1 工资 成员函数输入输出函数表 3.8根据销售经理类设计销售经理管理类: 类名 销售经理管理类 SalMan_administ 数据成员SalManTMAX top 成员函数添加 修改 查询 统计 显示 删除 保存 读取表 3.93.1.2 类之间的关系每一个人员类都是其相应人员管理类的友元类,以方便人员管理类对相应人员类的访问;每一个人员管理类也都是基类的友元类,以方便对编号姓名等数据成员的访问。即:Manager类是Man_administ类的友元类;Sales类是Sal_administ的友元类;SalesManager类是SalMan_administ的友元类;Technicist类是Tec_administ的友元类;Person类是Man_administ、Sal_administ、SalMan_administ、Tec_administ类的友元类3.1.3 函数设计 系统设计了五个函数:实现经理菜单、销售人员菜单、技术人员菜单、销售经理菜单的函数和实现主菜单的函数;其中各类人员管理菜单的函数基本相同,在此只给出经理菜单的函数算法如下: void ManMenu() Man_administ m;int choice;while(choice!=0)cout<< " n *经理管理* "<<endl;cout<<"+"<<endl;cout<<"| |"<<endl;cout<<"| 1.添加 2.查找 3.修改 4.统计 5.删除 6.显示 7.保存 8.读取 0=>退出 |"<<endl;cout<<"| |"<<endl;cout<<"+