1
【知識點】:多態
函數接口定義:
以Student為基類,構建GroupA, GroupB和GroupC三個類
裁判測試程序樣例:
#include<iostream>
#include <string>
using namespace std;/* 請在這里填寫答案 */int main()
{const int Size=50;string num, name;int i,ty,s1,s2,s3,s4,s5;char gs;Student *pS[Size];int count=0;for(i=0;i<Size;i++){cin>>ty;if(ty==0) break;cin>>num>>name>>s1>>s2;switch(ty){case 1:pS[count++]=new GroupA(num, name, s1, s2); break;case 2:cin>>gs; pS[count++]=new GroupB(num, name, s1,s2, gs); break;case 3:cin>>s3>>s4>>s5; pS[count++]=new GroupC(num, name, s1,s2,s3,s4,s5); break;} }for(i=0;i<count;i++) {pS[i]->display();delete pS[i];}return 0;
}
?
【難點】:要記錄A,B兩類當中平均分最高的人,以便后面A,B類自己比較以及C類比較
【啟發點】:用函數來獲取A,B類當中的最高分
class Student
{public:string NO;string name;Student(string n,string na):NO(n),name(na){}virtual void display()=0;
};
double getAwardLine();
class GroupA:public Student
{public:static double highestavg;int s1,s2;float avg;GroupA(string n,string na,int a1,int a2):Student(n,na),s1(a1),s2(a2){avg=(s1+s2)/2.0;//先找出A類當中平均分最高的 if(avg>highestavg)highestavg=avg;}double getavg(){return (s1+s2)/2.0;}virtual void display(){if(getavg() == getAwardLine())cout << NO << " " << name << endl;}
};double GroupA::highestavg=0;
class GroupB:public Student
{public:static double highestavg;int s1,s2;char gs;float avg;GroupB(string n,string na,int a1,int a2,char g):Student(n,na),s1(a1),s2(a2),gs(g){avg=(s1+s2)/2.0;//同樣找出B類當中平均分最高的 if(avg>highestavg)highestavg=avg;}double getavg(){return (s1+s2)/2.0;}char getgs(){return gs;}virtual void display(){//在B類當中可以直接比較A,B類的最高分哪個更高作為獲獎線 double awardLine = (GroupA::highestavg > GroupB::highestavg) ? GroupA::highestavg : GroupB::highestavg;if(getavg()==awardLine||getavg()>=awardLine*0.7&&gs=='A')cout<<NO<<" "<<name<<endl;}
};
double GroupB::highestavg=0;
class GroupC:public Student
{public:int s1,s2,s3,s4,s5;float avg;GroupC(string n,string na,int a1,int a2,int a3,int a4,int a5):Student(n,na),s1(a1),s2(a2),s3(a3),s4(a4),s5(a5){avg=(s1+s2+s3+s4+s5)/5.0;}double getavg(){return(s1+s2+s3+s4+s5)/5.0;}virtual void display(){double awardLine = (GroupA::highestavg > GroupB::highestavg) ? GroupA::highestavg : GroupB::highestavg;if(getavg()>=awardLine*0.9)cout<<NO<<" "<<name<<endl;}};
//使用函數來獲取A,B類當中最高分,可以避免在A類中使用B類數據時B類還未完全定義而造成的報錯
double getAwardLine() {return (GroupA::highestavg > GroupB::highestavg) ? GroupA::highestavg : GroupB::highestavg;
}
2
【知識點】:應用虛函數實現多態
?
寫各個派生類:
class Drink
{protected:int NO;int amount;//數量public:virtual void display()=0;//輸出提供時間Drink(int n,int a):NO(n),amount(a){}
};
//本地茶每份要50秒,其它茶要20秒;
class Tea:public Drink
{public:int area;Tea(int n,int a,int ar):Drink(n,a),area(ar){}virtual void display(){if(area==1)cout<<NO<<" "<<50*amount<<endl;elsecout<<NO<<" "<<20*amount<<endl;}};
//現磨咖啡要加120秒,其它咖啡加20秒;
class Coffee:public Drink
{
public:
int jgdm;
Coffee(int n,int a,int j):Drink(n,a),jgdm(j){}virtual void display(){if(jgdm==1)cout<<NO<<" "<<120*amount<<endl;elsecout<<NO<<" "<<20*amount<<endl;}
};
//牛奶每份10秒。
class Milk:public Drink
{public:Milk(int n,int a):Drink(n,a){}virtual void display(){ cout<<NO<<" "<<10*amount<<endl;}
};
【啟發點】:對輸入輸出的處理
int main()
{//基類的指針數組用來存放各個飲品,數組里的每一個元素都是一個基類指針//基類指針可以指向派生類的對象 Drink *pd[10];int type;int n;int a;int ar;int j;int cnt=0;//對輸入的處理 while(cin>>type&&type!=0){if(type==1){cin>>n>>a>>ar;pd[cnt++]=new Tea(n,a,ar);}else if(type==2){cin>>n>>a>>j;pd[cnt++]=new Coffee(n,a,j);}else if(type==3){cin>>n>>a;pd[cnt++]=new Milk(n,a);}}for(int i=0;i<cnt;i++){pd[i]->display();delete pd[i];}
}
?