CUC程序设计重载

    技术2022-07-10  134

    文章目录

    运算符重载练习工人类01工人类02

    运算符重载练习

    Complex类为表示复数的类,两个成员函数分别为real和imag,包含构造析构函数和显示函数,按要求为Complex类重载以下几个运算符函数,并在主函数中进行测试。 1.赋值=:重载为成员函数(必须) 2.加号-:重载为友元函数 3.前置++:重载为友元函数 4.后置++:重载为友员函数 5.判断相等= = :重载为友元函数 主函数进行测试。

    #include <iostream> #include<math.h> using namespace std; class Complex { public: double real,imag; Complex(double r=0.0,double i=0.0):real(r),imag(i){} Complex operator = (Complex &a) { real=a.real,imag=a.imag; return *this; } friend Complex operator - (Complex &a,Complex &b) { return Complex(a.real-b.real,a.imag-b.imag); } friend Complex operator ++ (Complex &a,int) //后置++ { Complex tmp(a); a.real++,a.imag++; return tmp; } friend Complex &operator ++(Complex &c) { c.real++,c.imag++; return c; } friend bool operator == (Complex &a,Complex &b) { if(a.real == b.real && a.imag == b.imag) return 1; return 0; } void Print() { if(imag>0) cout<<real<<"+"<<imag<<"j"<<'\n'; if(imag<0) cout<<real<<"-"<<imag<<"j"<<'\n'; } ~Complex(){} }; int main() { Complex c1(1,2),c2; c2=c1; c2.Print(); Complex c3(2,3),c4(1,2); Complex cc; (c3-c4).Print(); Complex c6(1,2); (c6++).Print(); (++c6).Print(); Complex c7(1,2),c8(2,3),c9(1,2); cout<<(c7==c8)<<endl; cout<<(c7==c9)<<endl; return 0; }

    工人类01

    试建立一个类Worker用于描述职工,具体要求如下: (1)私有数据成员 unsigned int id: 职工号。 char name[11]:姓名 float salary: 工资。(有一符号常量为工资最低值,设为2000) int level: 技术等级(1~20级),1级为最低,每个等级差别200元 (2)公有成员函数 Worker ( ):构造函数,初始化数据成员为默认值(自动生成职工号,姓名为空,工资默认最低)。 Worker (…):构造函数(自己定义参数),用参数初始化数据成员。参数有各个数据成员。 void setName(…): 设置职工姓名 void infoList( ): 输出职工的各项信息。 void setLevel(…): 修改技术等级level的值。每增加一个等级工资增加200元。 (3)static变量total计算工资总数和函数Average()计算平均工资。 (4)设置友元函数void setReward(…),给工人。 (5)在主程序中定义N(=3)个Worker对象作为测试数据,完成对Worker类和程序的测试。 (6)在主程序中对其中某个工人发放奖金500元

    #include <iostream> #include <string.h> using namespace std; const int N = 3; int idx=0; class Worker{ public: static double total,Average(); int num=0; Worker() { id=0; name[0]='\0'; wage=2000; level=1; } Worker(char N[],int L) { idx++; strcpy(name,N); level=L; wage=2000+(L-1)*200; id=idx; } void setName(char a[]) { strcpy(name,a); } void infoList() { //wangwu ID:3 Level:3 Salary:2400 ++idx; cout<<name<<" "<<"ID:"<<id<<" "<<"Level:"<<level<<" "<<"Salary:"<<wage<<'\n'; } void setLevel(int L) { level=L; } double sum() { total+=wage; num++; } friend double setReward(Worker *a,double x) { Worker t=*a; t.wage+=x; // cout<<t.wage<<endl; *a=t; } ~Worker(){} private: unsigned int id; char name[11]; double wage; int level; }; double Worker::total=0; double Worker::Average() { return total/3.0; } int main() { Worker* pWorkerArr[N]; for(int i=0; i<N; i++) { char name[20]; cin >> name; int level; cin >> level; pWorkerArr[i] = new Worker(name,level); } for(int i=0;i<N;i++) { pWorkerArr[i]->infoList(); pWorkerArr[i]->sum(); } cout << "Total Salary = " << Worker::total ; cout << " average = " << Worker::Average()<<endl; int index; cin>>index; setReward(pWorkerArr[index],500); for( int i=0;i<N;i++) { pWorkerArr[i]->infoList(); } for(int i=0;i<N;i++) { if ( pWorkerArr[i] != NULL ) delete pWorkerArr[i]; } return 0; } #include <iostream> #include <string.h> using namespace std; const int N = 3; const int MINSALARY=2000;//!!! class Worker//建立一个类Worker用于描述职工,具体要求如下: { private: unsigned int id=0;// 职工号 char name[11];//姓名 float salary;// 工资 int level;// 技术等级(1~20级),1级为最低,每个等级差别200元 //Total Salary = 6600 average = 2200 /*(1)私有数据成员 unsigned int id: 职工号。 char name[11]:姓名 float salary: 工资。(有一符号常量为工资最低值,设为2000)//这里要设aaaa! int level: 技术等级(1~20级),1级为最低,每个等级差别200元 */ public: static float total; static int count;//? Worker(){count++; id= count; strcpy(name," ");salary=MINSALARY;}//id不是static所以不能担负起计数的任务!不要偷懒 Worker(const char* n,int l)//const!!// Worker(const char n[11],int l) {count++; id= count; level = l; strcpy(name,n); salary=2000+(l-1)*200;}//level也要初始化! ~Worker();//别忘了!析构!!还要--! void sum(){total+=salary;} void setName(const char* n){strcpy(name,n);}//const void infoList()//zhangsan ID:1 Level:1 Salary:2000 { cout<<name<<" ID:"<<id<<" Level:"<<level<<" Salary:"<<salary<<endl; } void setLevel(int l){level = l;salary=2000+(l-1)*200;} static float Average(){return total/count;}//static!!! friend void setReward(Worker *a,int k);//如果没有(Worker *a,int k)[Error] 'float Worker::salary' is private /*(2)公有成员函数 Worker ( ):构造函数,初始化数据成员为默认值(自动生成职工号???,姓名为空,工资默认最低)。 Worker (…):构造函数(自己定义参数),用参数初始化数据成员。参数有各个数据成员。 void setName(...): 设置职工姓名 void infoList( ): 输出职工的各项信息。 void setLevel(...): 修改技术等级level的值。每增加一个等级工资增加200元。 (3)static变量total计算工资总数和函数Average()计算平均工资。 (4)设置友元函数void setReward(...),给工人。 (5)在主程序中定义N(=3)个Worker对象作为测试数据,完成对Worker类和程序的测试。 (6)在主程序中对其中某个工人发放奖金500元。 */ }; float Worker::total = 0;//?[Error] 'float Worker::total' is private int Worker::count = 0; Worker::~Worker() { count--;//!!! } void setReward(Worker *a,int k)// setReward(pWorkerArr[index],500);&?*?*!!!不是引用,是传址 { a->salary+=k;//这个用法? } int main() { Worker* pWorkerArr[N]; for(int i=0; i<N; i++) { char name[20]; cin >> name; int level; cin >> level; pWorkerArr[i] = new Worker(name,level); } for(int i=0;i<N;i++) { pWorkerArr[i]->infoList(); pWorkerArr[i]->sum(); } cout << "Total Salary = " << Worker::total ; cout << " average = " << Worker::Average()<<endl; int index; cin>>index; setReward(pWorkerArr[index],500); for( int i=0;i<N;i++) { pWorkerArr[i]->infoList(); } for(int i=0;i<N;i++) { if ( pWorkerArr[i] != NULL ) delete pWorkerArr[i]; } return 0; }

    工人类02

    在工人类01的Worker类基础上,派生出两个类:PieceWorker计件工人和HourWorker计时工人。 在PieceWorker中添加数据成员piece件数(整数),假设完成每件的报酬20元,并根据piece计算薪水。 在HourWorker中添加数据成员hour计时数(浮点数),假设每个工作时的报酬50元,并根据hour计算薪水。 为Worker类设置纯虚函数GetSalary()返回工人薪水,并在派生类继承实现计件和计时工人的薪水获取函数。 工人自动编号,从1开始。给工人发奖金,金额为float。

    #include <iostream> using namespace std; #include <string.h> const int N = 10000; const int NAMECHARS = 100; const int MINSALARY=2000; class Worker { public: static float Average(); Worker(); Worker(const char* newname, int newlevel); ~Worker(); void setName(const char* newname); virtual void infoList(); void setLevel(int newlevel); friend void setReward(Worker *pWorker,float reward); void setReward(float bonus);//注意 virtual float getSalary()=0; private: unsigned int id; char name[11]; int level; static float total; static int count; protected: float salary;//? }; int Worker::count=0; float Worker::total=0; Worker::Worker() { strcpy(name,""); level=1; salary=MINSALARY; count++; id=count; total+=salary; } Worker::Worker(const char* newname, int newlevel) { strcpy(name,newname); // level=1;? salary=MINSALARY+200*(newlevel-1); level=newlevel; count++; id=count; total+=salary; } Worker::~Worker() { count--; } void Worker::setName(const char* newname) { strcpy(name,newname); } void Worker::infoList() { cout<<name<<" ID:"<<id<<" Level:"<<level; } void Worker::setLevel(int newlevel) { // salary+=200*(newlevel-level); salary+=200*(newlevel-level); total+=salary; level=newlevel; } float Worker::Average() { return total/(float)count;//强制转换 } void Worker::setReward(float bonus) { salary+=bonus; total+=bonus; } class PieceWorker:public Worker { public: PieceWorker(){} PieceWorker(const char* newname, int newlevel, int newpiece):Worker(newname,newlevel) { piece=newpiece; salary+=piece*20.0; } void setPiece(int newpiece) { salary+=(newpiece-piece)*20.0;//? piece=newpiece; } float getSalary() { return salary; } void infoList() { Worker::infoList(); cout<<" Salary:"<<PieceWorker::getSalary()<<" Piece="<<piece<<endl; } private: int piece; }; class HourWorker:public Worker { public: HourWorker(){} HourWorker(const char* newname, int newlevel, float newhour=0):Worker(newname,newlevel) { hour=newhour; salary+=50*hour; } void setHour(float newhour) { hour=newhour; salary+=50*hour;//because the salary in worker just includes the level and 2000; //but if we reset the hour,the answer will be wrong; } float getSalary() { return salary; } void infoList() { Worker::infoList(); cout<<" Salary:"<<HourWorker::getSalary(); cout<<" Hour="<<hour<<endl; } private: float hour; }; void setReward(Worker *pWorker, float reward) { pWorker->setReward(reward); } int main() { Worker* pWorkerArr[N] = {NULL}; int n; cin >> n; for(int i=0; i<n; i++) { char name[NAMECHARS+1]; int level; int choice; cin >> name >> level >> choice; switch (choice ) { case 1: { float hour; cin >> hour; if (choice%2) pWorkerArr[i] = (Worker*) new HourWorker(name,level,hour); else { HourWorker *p = new HourWorker(name, level); p->setHour(hour); pWorkerArr[i] = (Worker*)p; } } break; case 2: { int piece; cin >> piece; if (choice % 2) pWorkerArr[i] = (Worker*) new PieceWorker(name,level,piece); else { PieceWorker *p = new PieceWorker(); p->setName(name); p->setLevel(level); p->setPiece(piece); pWorkerArr[i] = (Worker*)p; } } break; } } int index; float reward; cin >> index>>reward; if (index >= 0 && index < n) setReward(pWorkerArr[index], reward); float totalSalary = 0.0f; for( int i=0;i<n;i++) { if (pWorkerArr[i] != NULL) { totalSalary += pWorkerArr[i]->getSalary(); pWorkerArr[i]->infoList(); } } cout << totalSalary << endl; for (int i = 0; i<N; i++) { if (pWorkerArr[i] != NULL) delete pWorkerArr[i]; } return 0; }
    Processed: 0.021, SQL: 9