《面向对象程序设计》课程设计报告姓名:叶小波姚旺富李成班级:信管082信息工程学院信息管理系二〇一一年一月题目:建立企业工资计算及管理系统一、题目要求:采用面向对象程序设计思想,利用文本文件来存储数据,实现数据的输入,处理,查询(按姓名,编号,职业,对应员工工资分布情况查询)等功能,并自动计算出工资。
二、需求分析:实现数据的输入及处理、编辑、管理、查询(按姓名,编号,职业,对应员工工资分布情况查询)数据输入的-------根据题意,输入员工的信息,包括职业,姓名,编号及对应的工资处理数据,系统会进行处理。
查询-------根据题意,按照姓名、编号、职业、对应员工工资分布情况进行查询三、设计思路:1、对象设计:抽象类employee,对应产生3个派生类technician, salesman, manager, 再把salesman,manager,salesman与manager作为虚基类派生出一个salesmanager类,从而避免二义性问题。
2、Technician,salesman,manager,salesmanager都用将用到pay()与display()两个函数,而且都是派生得到,于是在基类中设置了虚函数pay()与display().3、函数的设计:设置了6个函数,分别为添加员工及工资计算,按姓名查询,按编号查询,按职业查询,对应员工工资分布情况查询,查看所有员工信息4、6个函数分别设为类的友元函数,可以访问私有成员。
5、采用文本文件存储数据。
四、详细设计:1.类定义://///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class employee //雇员类类中函数:employee() //雇员构造函数virtual void pay()=0 /雇员工资计算虚函数virtual void display()=0 //雇员工资显示虚函数friend void add(); //添加员工及工资计算友元函数friend void visitname() ; //按姓名查询友元函数friend void visitnum() ; //按标号查询友元函数friend void visitprofession(); //按职业查询友元函数friend void searchpay() ; //对应员工工资分布情况查询友元函数friend void outpay(); //打印员工工资friend void outpay();~ employee() //雇员析构函数变量:no //编号name[20] //姓名salary //工资/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////class technician //兼职技术人员类类中函数:technician() //兼职技术人员构造函数void pay() //兼职技术人员工资计算函数void display() //兼职技术人员工资函数~technician() ///兼职技术人员析构函数friend void add(); //添加员工及工资计算友元函数friend void visitname() ; //按姓名查询友元函数friend void visitnum() ; //按标号查询友元函数friend void visitprofession(); //按职业查询友元函数friend void searchpay() ; //对应员工工资分布情况查询友元函数friend void outpay(); //打印员工工资变量:no //编号name[20] //姓名salary //工资hourlyrate //每小时的工作费用workhours //工作时间/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// salesman类中函数:salesman() //销售人员构造函数virtual void pay()=0 /销售人员工资计算虚函数virtual void display()=0 //销售人员工资显示虚函数friend void add(); //添加员工及工资计算友元函数friend void visitname() ; //按姓名查询友元函数friend void visitnum() ; //按标号查询友元函数friend void visitprofession(); //按职业查询友元函数friend void searchpay() ; //对应员工工资分布情况查询友元函数friend void outpay(); //打印员工工资~ salesman() //销售人员析构函数变量:no //编号name[20] //姓名salary //工资commrate //提成sales //销售量/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// manager类中函数:manager() //经理构造函数virtual void pay()=0 //经理工资计算函数virtual void display()=0 //经理工资显示函数~ manager() //经理析构函数friend void add(); //添加员工及工资计算友元函数friend void visitname() ; //按姓名查询友元函数friend void visitnum() ; //按标号查询友元函数friend void visitprofession(); //按职业查询友元函数friend void searchpay() ; //对应员工工资分布情况查询友元函数friend void outpay(); //打印员工工资变量:no //编号name[20] //姓名salary //工资monthlypay //月工资/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class salesmanager //销售经理类中函数:employee() //销售经理构造函数virtual void pay()=0 //销售经理计算函数virtual void display()=0 //销售经理工资显示函数friend void add(); //添加员工及工资计算友元函数friend void visitname() ; //按姓名查询友元函数friend void visitnum() ; //按标号查询友元函数friend void visitprofession(); //按职业查询友元函数friend void searchpay() ; //对应员工工资分布情况查询友元函数friend void outpay(); //打印员工工资~ employee() //销售经理析构函数变量:no //编号name[20] //姓名salary //工资monthlypay //月工资sales //销售量2.变量定义:manager *m[50]; //经理指针technician *t[50]; //兼职技术人员指针数组salesman *s[50]; //销售人员指针数组salesmanager *sm[50]; //销售经理指针数组outfile //文件名snum //销售人员数量tnum //兼职技术人员数量mnum //经理人数量smnum //销售经理人数量3、重要函数:void add(); //添加员工及工资计算void visitname() ; //按姓名查询void visitnum() ; //按标号查询void visitprofession(); //按职业查询void searchpay() ; //对应员工工资分布情况查询void outpay(); //打印员工工资重要类CArray是内存管理的类。
可以在任意位置插入数据,删除数据,并自动重新排好。
这样给程序带来了不少方便Carchive允许一个二进制(通常为磁盘存储)的形式保存一个对象的复杂网络。
把归档的对象看成一种二进制流,归档与文件有关,并允许写缓冲区及从硬盘读出或读入数据。
B.界面流程:1.主页面2.添加成员与工资计算3.按编号查询4.按职业查询5.按对应职业员工分布情况查询6.输出所有员工工资六、调试分析:调试过程中一些常见的小错误就不说了。
调试中主要遇到的问题有二1:定义了类的变量数组,放在主函数之外时,不能编译成功,于是定义类的指针变量数组进行操作,就可以在类外进行了。
2;两个基类派生出一个类时,出现二义性问题,用虚基类解决了。
3.部分函数不能调用类中的私有成员,用友元函数得以解决。
七、心得体会:经过一星期的课程实习,重设计到实现,虽然花费了不少时间,但也学到了很多。
主要总结以下几点:1:运用面向对象程序设计的思想。
并将文件读入,读出,多态,派生,虚基类,虚函数,合理整合并运用在代码中,实现程序。
2.程序代码实现是个耐性,细心的过程,写完一段,调试一段,遇到问题,分析问题,解决问题,事半功倍。
3.提高了动手能力。
课程设计虽然技术了,C++是一块很大的领域,还有很多地方和知识点不了解,要我们不断地学习,探索,思考,提高我们的能力。
八、源代码:#include<iostream.h>#include<fstream.h>#include<stdlib.h>#include<string.h>class employee{protected:int no;char name[20];float salary;public:employee(){cout<<"职工编号:";cin>>no;cout<<"职工姓名";cin>>name;salary=0;}virtual void pay()=0;virtual void display()=0;friend void add(); //添加员工及工资计算friend void visitname() ; //按姓名查询friend void visitnum() ; //按标号查询friend void visitprofession(); //按职业查询friend void searchpay() ; //对应员工工资分布情况查询friend void outpay();~employee(){};};class technician:public employee{private:float hourlyrate;int workhours;public:technician(){hourlyrate=100;}void pay(){cout<<name<<"本月工作时数:";cin>>workhours;salary=hourlyrate*workhours;}void display(){cout<<"兼职技术人员"<<name<<"(编号为"<<no<<")"<<"本月工资:"<<salary<<endl;}friend void add(); //添加员工及工资计算friend void visitname() ; //按姓名查询friend void visitnum() ; //按标号查询friend void visitprofession(); //按职业查询friend void searchpay() ; //对应员工工资分布情况查询friend void outpay();~technician(){};};class salesman:virtual public employee{protected:float commrate;float sales;public:salesman(){commrate=0.4;}void pay(){cout<<name<<"本月销售额:";cin>>sales;salary=sales*commrate;}void display(){cout<<"销售员"<<name<<"(编号为"<<no<<")"<<"本月工资:"<<salary<<endl;}friend void add(); //添加员工及工资计算friend void visitname() ; //按姓名查询friend void visitnum() ; //按标号查询friend void visitprofession(); //按职业查询friend void searchpay() ; //对应员工工资分布情况查询friend void outpay();~salesman(){};};class manager:virtual public employee{protected:float monthlypay;manger(){monthlypay=8000;}void pay(){salary=8000;}void display(){cout<<"经理"<<name<<"(编号为"<<no<<")"<<"本月工资:"<<salary<<endl;}friend void add(); //添加员工及工资计算friend void visitname() ; //按姓名查询friend void visitnum() ; //按标号查询friend void visitprofession(); //按职业查询friend void searchpay() ; //对应员工工资分布情况查询friend void outpay();~manager(){};};class salesmanager:public manager,public salesman{salemanager(){monthlypay=5000;commrate=0.05;}void pay(){cout<<name<<"所管部门月销售量";cin>>sales;salary=5000+commrate*sales;}void display(){cout<<"销售经理"<<name<<"(编号为"<<no<<")"<<"本月工资:"<<salary<<endl;}friend void add(); //添加员工及工资计算friend void visitname() ; //按姓名查询friend void visitnum() ; //按标号查询friend void visitprofession(); //按职业查询friend void searchpay() ; //对应员工工资分布情况查询friend void outpay(); //答应员工工资~salesmanager(){};int option,flag,i,no,k;float salary;char name[20];fstream outfile;manager *m[50];technician *t[50];salesman *s[50];salesmanager *sm[50];int mnum=0,tnum=0,smnum=0,snum=0,j=0,profession=0;void add(); //添加员工及工资计算void visitname() ; //按姓名查询void visitnum() ; //按标号查询void visitprofession(); //按职业查询void searchpay() ; //对应员工工资分布情况查询void outpay();void main(){cout<<"请选择您需要的操作!"<<endl;cout<<"\t\t\t*****************************"<<endl;cout<<"\t\t\t** 企业职工工资计算及管理系统**"<<endl;cout<<"\t\t\t*****************************"<<endl;cout<<"\t\t\t**1、添加员工及工资计算**"<<endl; cout<<"\t\t\t**2、按姓名查询**"<<endl; cout<<"\t\t\t**3、按标号查询**"<<endl; cout<<"\t\t\t**4、按职业查询**"<<endl; cout<<"\t\t\t**5、对应职业员工工资分布情况查询**"<<endl; cout<<"\t\t\t**6、输出所有员工的工资**"<<endl; cout<<"\t\t\t**0、退出系统**"<<endl; cout<<"\t\t\t*****************************"<<endl;cout<<"选择0-7数字进行操作"<<endl;cin>>option;outfile.open("text",ios::out);if(!outfile){cout<<"text can't open"<<endl;exit(1);}while(option!=0){switch(option){case 1: //添加员工及工资计算{break;}case 2: //按姓名查查询{visitname();break;}case 3: //按标号查询{visitnum();break;}case 4: //按职业查询{visitprofession();break;}case 5: // 对应员工工资分布情况查询{searchpay();break;case 6:{outpay();break;}}cout<<"请输入操作代码(1 添加员工及工资计算/2按姓名查询/3按编号查询/4 按职业查询5/对应职业员工工资分布情况查询/6 输出所有员工的工资/0 退出系统)"<<endl;cin>>option;}outfile.close();}void add(){flag=1;while(flag!=0){cout<<"员工身份: 1:销售员2:兼职技术人员3:经理4:销售经理0:退出添加请选择"<<endl;cin>>flag;switch(flag){{t[tnum]=new technician;t[tnum]->pay();t[tnum]->display();outfile<<"兼职技术人员"<<t[tnum]->name<<"(编号为"<<t[tnum]->no<<")"<<"本月工资:"<<t[tnum]->salary<<endl;tnum++;j++;break;}case 1:{s[snum]=new salesman;s[snum]->pay();s[snum]->display();outfile<<"销售员"<<s[snum]->name<<"(编号为"<<s[snum]->no<<")"<<"本月工资:"<<s[snum]->salary<<endl;snum++;j++;break;}case 3:m[mnum]=new manager;m[mnum]->pay();m[mnum]->display();outfile<<"经理"<<m[mnum]->name<<"(编号为"<<m[mnum]->no<<")"<<"本月工资:"<<m[mnum]->salary<<endl;mnum++;j++;break;}case 4:{sm[smnum]=new salesmanager;sm[smnum]->pay();sm[smnum]->display();outfile<<"销售经理"<<sm[smnum]->name<<"(编号为"<<sm[smnum]->no<<")"<<"本月工资:"<<sm[smnum]->salary<<endl;smnum++;j++;break;}}}void visitname(){cout<<"请输入要查询的姓名:";cin>>name;int sign[4]={0};for(i=0;i<snum;i++){if(strcmp(s[i]->name,name)==0){cout<<"销售员"<<s[i]->name<<"(编号为"<<s[i]->no<<")"<<"本月工资:"<<s[i]->salary<<endl;break;}}if(i<snum)return;elsesign[0]=1;for(i=0;i<tnum;i++){if(strcmp(t[i]->name,name)==0){"<<t[i]->no<<")"<<"本月工资:"<<t[i]->salary<<endl;break;}}if(i<tnum)return;elsesign[1]=1;for(i=0;i<mnum;i++){if(strcmp(m[i]->name,name)==0){cout<<"经理"<<m[i]->name<<"(编号为"<<m[i]->no<<")"<<"本月工资:"<<m[i]->salary<<endl;break;}}if(i<mnum)return ;elsesign[2]=1;for(i=0;i<smnum;i++){if(strcmp(sm[i]->name,name)==0)"<<sm[i]->no<<")"<<"本月工资:"<<sm[i]->salary<<endl;break;}}if(i<smnum)return;elsesign[3]=1;if(sign[0]&&sign[1]&&sign[2]&&sign[3]){cout<<"该人不存在,请确认!"<<endl;}}void visitnum()//按编号查询{cout<<"请输入要查询编号:";cin>>no;int sign[4]={0};for(i=0;i<snum;i++){if(s[i]->no==no)"<<s[i]->no<<")"<<"本月工资:"<<s[i]->salary<<endl;break;}}if(i<snum)return;elsesign[0]=1;for(i=0;i<tnum;i++){if(t[i]->no==no){cout<<"兼职技术人员"<<t[i]->name<<"(编号为"<<t[i]->no<<")"<<"本月工资:"<<t[i]->salary<<endl;break;}}if(i<tnum)return;elsesign[1]=1;for(i=0;i<mnum;i++){if(m[i]->no==no){cout<<"经理"<<m[i]->name<<"(编号为"<<m[i]->no<<")"<<"本月工资:"<<m[i]->salary<<endl;break;}}if(i<mnum)return;elsesign[2]=1;for(i=0;i<smnum;i++){if(sm[i]->no==no){cout<<"销售经理"<<sm[i]->name<<"(编号为"<<sm[i]->no<<")"<<"本月工资:"<<sm[i]->salary<<endl;break;}}if(i<smnum)return;elsesign[3]=1;if(sign[0]&&sign[1]&&sign[2]&&sign[3]){cout<<"该人不存在,请确认!"<<endl;}}void visitprofession() //按职业查询{cout<<"请选择要查询的职业";cout<<"1:销售员2:兼职技术人员3:经理4:销售经理"<<endl;cin>>profession;switch(profession){case 1:{if(snum==0){cout<<"无销售人员信息,请确认!"<<endl;}else{cout<<"销售人员信息如下:"<<endl;for(i=0;i<snum;i++){cout<<"销售员"<<s[i]->name<<"(编号为"<<s[i]->no<<")"<<"本月工资:"<<s[i]->salary<<endl;}}break;}case 2:{if(tnum==0){cout<<"无兼职技术人员信息,请确认!"<<endl;}else{cout<<"兼职技术人员信息如下:"<<endl;for(i=0;i<tnum;i++){cout<<"兼职技术人员"<<t[i]->name<<"(编号为"<<t[i]->no<<")"<<"本月工资:"<<t[i]->salary<<endl;}}break;}case 3:{if(mnum==0){cout<<"无经理人员信息,请确认!"<<endl;}else{cout<<"经理人员信息如下:"<<endl;for(i=0;i<mnum;i++){cout<<"经理"<<m[i]->name<<"(编号为"<<m[i]->no<<")"<<"本月工资:"<<m[i]->salary<<endl;}}break;}case 4:{if(smnum==0){cout<<"无销售经理信息,请确认!"<<endl;}else{cout<<"销售经理信息如下:"<<endl;for(i=0;i<smnum;i++){cout<<"销售经理"<<sm[i]->name<<"(编号为"<<sm[i]->no<<")"<<"本月工资:"<<sm[i]->salary<<endl;}}break;}}}void searchpay() //对应员工工资分布情况查询{int flag;cout<<"请选择要职业,给出对应的分布情况"<<endl;cout<<"1:销售员,2:兼职技术人员3:经理4:销售经理,请选择"<<endl;cin>>flag;switch(flag){case 1:{if(snum==0){cout<<"无销售员信息,请确认!";break;}for(i=0;i<snum-1;i++){k=i;for(j=i+1;j<snum;j++){if(s[j]->salary<s[k]->salary){k=j;}}strcpy(name,s[i]->name);strcpy(s[i]->name,s[k]->name);strcpy(s[k]->name,name);salary=s[i]->salary;s[i]->salary=s[k]->salary;s[k]->salary=salary;no=s[i]->no;s[i]->no=s[k]->no;s[k]->no=no;}for(i=0;i<snum;i++){cout<<"销售员"<<s[i]->name<<"(编号为"<<s[i]->no<<")"<<"本月工资:"<<s[i]->salary<<endl;}break;}case 2:{if(tnum==0){cout<<"无兼职技术人员信息,请确认!";break;}for(i=0;i<tnum-1;i++){k=i;for(j=i+1;j<tnum;j++){if(t[j]->salary<t[k]->salary){k=j;}}strcpy(name,t[i]->name);strcpy(t[i]->name,t[k]->name);strcpy(t[k]->name,name);salary=t[i]->salary;t[i]->salary=t[k]->salary;t[k]->salary=salary;no=t[i]->no;t[i]->no=t[k]->no;t[k]->no=no;}for(i=0;i<tnum;i++){cout<<"兼职技术人员"<<t[i]->name<<"(编号为"<<t[i]->no<<")"<<"本月工资:"<<t[i]->salary<<endl;}break;}case 3:{if(snum==0){cout<<"无经理人员信息,请确认!";break;}for(i=0;i<mnum-1;i++){k=i;for(j=i+1;j<mnum;j++){if(m[j]->salary<m[k]->salary){k=j;}}strcpy(name,m[i]->name);strcpy(m[i]->name,m[k]->name);strcpy(m[k]->name,name);salary=m[i]->salary;m[i]->salary=m[k]->salary;m[k]->salary=salary;no=m[i]->no;m[i]->no=m[k]->no;m[k]->no=no;}for(i=0;i<tnum;i++){cout<<"经理"<<m[i]->name<<"(编号为"<<m[i]->no<<")"<<"本月工资:"<<m[i]->salary<<endl;}}case 4:{if(smnum==0){cout<<"无销售经理人员信息,请确认!";break;}for(i=0;i<smnum-1;i++){k=i;for(j=i+1;j<smnum;j++){if(sm[j]->salary<sm[k]->salary){k=j;}}strcpy(name,sm[i]->name);strcpy(sm[i]->name,sm[k]->name);strcpy(sm[k]->name,name);salary=sm[i]->salary;sm[i]->salary=sm[k]->salary;sm[k]->salary=salary;no=sm[i]->no;sm[i]->no=sm[k]->no;sm[k]->no=no;}for(i=0;i<tnum;i++){cout<<"销售经理"<<m[i]->name<<"(编号为"<<m[i]->no<<")"<<"本月工资:"<<m[i]->salary<<endl;}}break;}}void outpay(){if(snum==0&&tnum==0&&mnum==0&&smnum==0)cout<<"没有员工的数据,请确认!"<<endl;else{for(i=0;i<snum;i++){cout<<"销售员"<<s[i]->name<<"(编号为"<<s[i]->no<<")"<<"本月工资:"<<s[i]->salary<<endl;}for(i=0;i<tnum;i++){cout<<"兼职技术人员"<<t[i]->name<<"(编号为"<<t[i]->no<<")"<<"本月工资:"<<t[i]->salary<<endl;}for(i=0;i<mnum;i++){cout<<"经理"<<m[i]->name<<"(编号为"<<m[i]->no<<")"<<"本月工资:"<<m[i]->salary<<endl;}for(i=0;i<smnum;i++){cout<<"销售经理"<<sm[i]->name<<"(编号为"<<sm[i]->no<<")"<<"本月工资:"<<sm[i]->salary<<endl;}}}。