1、生成表示学生的类XS,提供成员函数dispXM()、dispXB()和dispNL()分别用来显示姓名、性别和年龄,并将他们全部定义为纯虚函数;生成CZS类表示初中生,包含数据成员xm、xb和nl表示学生的姓名、性别和年龄,提供成员函数dispXM()、dispXB()和dispNL()分别用来显示姓名、性别和年龄;再生成类GZS表示高中生和类DXS表示大学生,同样包含相同含义的数据成员xm、xb和nl,也包括成员函数dispXM()、dispXB()和dispNL()。
要求:(1)设计和实现基本类XS(2)设计和实现派生类CZS,GZS和DXS(3)分别生成CZS、GZS、DXS类对象(4)将CZS、GZS、DXS类对象的指针赋给指针赋给XS类的指针变量。
(5)分别用XS类的指针和引用访问dispXM()、dispXB()和dispNL()函数。
(6)观察程序结果。
#include <iostream>#include <string.h>using namespace std;class XS{public:virtual void dispXM()=0;virtual void dispXB()=0;virtual void dispNL()=0;};class CZS:public XS{public:CZS(char * m="张三",int b=1,int n=14);void dispXM();void dispXB();void dispNL();protected:char xm[9];int xb,nl;};CZS::CZS(char *m,int b,int n){strcpy(xm,m);xb=b,nl=n;}void CZS::dispXM(){cout<<"name:"<<xm<<endl;}void CZS::dispXB(){if(xb==1)cout<<"Man"<<endl;if(xb==0)cout<<"Woman"<<endl;}void CZS::dispNL(){cout<<"age:"<<nl<<endl;}class GZS:public XS{public:GZS(char * m="张三",int b=1,int n=17);void dispXM();void dispXB();void dispNL();protected:char xm[9];int xb,nl;};GZS::GZS(char *m,int b,int n){strcpy(xm,m);xb=b,nl=n;}void GZS::dispXM(){cout<<"name:"<<xm<<endl;}void GZS::dispXB(){if(xb==1)cout<<"Man"<<endl;if(xb==0)cout<<"Woman"<<endl;}void GZS::dispNL(){cout<<"age:"<<nl<<endl;}class DXS:public XS{public:DXS(char * m="张三",int b=1,int n=20);void dispXM();void dispXB();void dispNL();protected:char xm[9];int xb,nl;};DXS::DXS(char *m,int b,int n){strcpy(xm,m);xb=b,nl=n;}void DXS::dispXM(){cout<<"name:"<<xm<<endl;}void DXS::dispXB(){if(xb==1)cout<<"Man"<<endl;if(xb==0)cout<<"Woman"<<endl; }void DXS::dispNL(){cout<<"age:"<<nl<<endl;}void displayP(XS *p){p->dispXM();p->dispXB();p->dispNL();}void displayR( XS &p){p.dispXM();p.dispXB();p.dispNL();}void main(){CZS czs("赵一",1,12);GZS gzs("钱二",0,15);DXS dxs("孙三",1,18);XS *p;//定义抽象基类的指针变量pp=&czs;//将初中生对象czs的地址赋给pdisplayP(p);p=&gzs;//将高中生对象czs的地址赋给pdisplayP(p);p=&dxs;//将大学生对象czs的地址赋给pdisplayP(p);cout<<"\n----------------------------------------\n";XS &r1=czs;//定义抽象基类的引用变量r1为czs的别名displayR(r1);XS &r2=gzs;//定义抽象基类的引用变量r2为czs的别名displayR(r2);XS &r3=dxs;//定义抽象基类的引用变量r3为czs的别名displayR(r3);cout<<"\n----------------------------------------\n";}2、某小型公司主要有3类人员:经理、兼职技术人员、兼职销售员。
这些人员分别具有以下属性。
经理:姓名、编号、固定工资、当月薪水、计算月薪、显示信息兼职技术人员:姓名、编号、工作小时、每小时工资额、当月薪水、计算月薪、显示信息;兼职销售员:姓名、编号、销售额、销售额提成、当月薪水、计算月薪、显示信息要求:人员编号基数为1000,每输入一个人员信息编号顺序加1月薪计算办法是经理固定月薪8000元;兼职技术人员按100元/小时领取月薪;兼职推销员按当月销售额的4%提成。
根绝题目要求,设计一个基类employee,然后派生出technician (兼职技术人员)类、manager(经理)类和salesman(兼职销售员)类。
部分成员函数设置为虚函数将“<<”和“>>”运算符#include <iostream>#include <iomanip>#include <string.h>#include <fstream>using namespace std;const int Maxr=100;class Employee //职工类{int tag;//删除标记int no;//职工编号char name[20];char zw[20];//职工姓名int salary;//职工工资public:Employee(){}char *getname() {return name;}//获取名字int gettag() {return tag;}//获取标记int getno() {return no;}//获取编号int getsalary(){return salary;}void setzw(char q[])//设置名字{strcpy(zw,q);}void setname(char na[])//设置名字{strcpy(name,na);}void getsalary(int sa){salary=sa;}void delna(){tag=1;}//删除void addemp(int n,int sa,char *na,char *q)//增加{tag=0;no=n;salary=sa;strcpy(name,na);strcpy(zw,q);}void disp()//显示职工信息{cout < <"│" < <setw(10) < <no < <"│" < <setw(10) < <name < <"│" < <setw(10) < <salary < <"│" < <setw(10) < <zw < <"│" < <endl;cout < <"├—————┼—————┼—————┼—————┤" < <endl;}};class Database//职工数据类{int top;Employee read[Maxr];public:Database()//将职工信息从employee.txt读取到read[]中{ Employee s;top=-1;fstream file("employee.txt",ios::in);while (1){((char *)&s,sizeof(s));if (!file) break;top++;read[top]=s;}();}void clear()//删除所有{top=-1;}int addemp (int n, int sa,char *na,char*q) //增加职工{Employee *p=query(n);if (p==NULL){top++;read[top].addemp(n,sa,na,q);return 1;}return 0;}Employee *query(int empid){for (int i=0;i <=top;i++)if (read[i].getno()==empid && read[i].gettag()==0) return &read[i];return NULL;}Employee *query1(char empna[20]){for (int i=0;i <=top;i++)if ((read[i].getname()==empna) && read[i].gettag()==0)return &read[i];return NULL;}void disp() //职工信息显示{for (int i=0;i <=top;i++)read[i].disp();}void empdata();~Database() //将read[]中的信息读如到employee.txt中{fstream file("employee.txt",ios::out);for (int i=0;i <=top;i++)if (read[i].gettag()==0)((char *)&read[i],sizeof(read[i]));();}};void Database::empdata()//职工维护{int choice=1;int m=1;int b=1;char rname[20];int empid; int empsa;char q[20];Employee *r;while (choice!=0){cout < <"职工维护1:新增2:更改3:删除4:查找5:显示6:全删0:退出=>"; cin>>choice;switch (choice){case 1:cout < <setw(50) < <" ┌—————————————┐\n";cout < <setw(50) < <" │ 请选择您所需的操作│\n";cout < <setw(50) < <" │ 经理:1,并按回车键│\n";cout < <setw(50) < <" │ 业务经理:2,并按回车键│\n";cout < <setw(50) < <" │ 普通职工:3,并按回车键│\n";cout < <setw(50) < <" └—————————————┘\n";cin>>m;while(m!=0){switch(m){case 1:cout < <"输入经理编号:";cin>>empid;cout < <"输入奖金: ";cin>>empsa;cout < <"输入经理姓名:";cin>>rname;addemp(empid,8000+empsa,rname,"经理"); break;case 2:cout < <"输入业务经理编号:";cin>>empid;cout < <"输入月提成: ";cin>>empsa;cout < <"输入业务经理姓名:";cin>>rname;addemp(empid,4000+empsa,rname,"业务经理"); break;case 3:cout < <"输入职工编号:";cin>>empid;cout < <"输入工资: ";cin>>empsa;cout < <"输入职工姓名:";cin>>rname;addemp(empid,empsa,rname,"普通职工"); break;}break;}break;case 2:cout < <"输入职工编号:";cin>>empid;r=query(empid);if (r==NULL){cout < <"该职工不存在" < <endl;break;}cout < <"输入新的工资:" < <endl;cin>>empsa;r->getsalary(empsa);cout < <"请输入新的职务" < <endl;cin>>q;r->setzw(q);addemp(empid,empsa,rname,q);break;case 3:cout < <"输入职工编号:";cin>>empid;r=query(empid);if (r==NULL){cout < <"该读者不存在" < <endl;break;}r->delna();break;case 4:cout < <setw(50) < <" ┌—————————————┐\n";cout < <setw(50) < <" │ 请选择您所需的操作│\n";cout < <setw(50) < <" │ 按编号查找1,并按回车键│\n";cout < <setw(50) < <" │ 返回2,并按回车键│\n";cout < <setw(50) < <" └—————————————┘\n";cin>>b;while(b!=0){switch(b){case 1:cout < <"输入职工编号:";cin>>empid;r=query(empid);if (r==NULL){cout < <"该职工不存在" < <endl;break;}cout < <"├—————┼—————┼—————┼—————┤" < <endl;cout < <"│" < <setw(10) < <"编号" < <"│" < <setw(10) < <"姓名" < <"│" < <setw(10) < <"工资" < <"│" < <setw(10) < <"职务" < <"│" < <endl;cout < <"├—————┼—————┼—————┼—————┤" < <endl;r->disp();break;case 2:break;}break;}break;case 5:cout < <"├—————┼—————┼—————┼—————┤" < <endl;cout < <"│" < <setw(10) < <"编号" < <"│" < <setw(10) < <"姓名" < <"│" < <setw(10) < <"工资" < <"│" < <setw(10) < <"职务" < <"│" < <endl;cout < <"├—————┼—————┼—————┼—————┤" < <endl;disp();break;case 6:clear();break;}}}void main(){int choice=1;Database EmpDB;while(choice!=0){cout < <"***************************************************************************** ***" < <endl;cout < <endl;cout < <endl;cout < <setw(20) < <"******************************欢迎使用职工管理系统******************************" < <endl;cout < <endl;cout < <endl;cout < <setw(50) < <" ┌—————————————┐\n";cout < <setw(50) < <" │ 请选择您所需的操作│\n";cout < <setw(50) < <" │ │\n";cout < <setw(50) < <" │ 操作1,并按回车键│\n";cout < <setw(50) < <" │ │\n";cout < <setw(50) < <" │ 返回0,并按回车键│\n";cout < <setw(50) < <" └—————————————┘\n";cin>>choice;switch(choice){case 1:while(1){cout < <setw(20);EmpDB.empdata();break;break;}}}}3、堆栈的特点是:先进先出定义了一个堆栈类stack,包括初始化,压栈(就是将元素放在栈顶)、弹栈(取栈顶的一个元素),释放堆栈等操作要求运用模版实现,堆栈中可以根据需求放入double、int、char*等数据对象。