pta作业中有启发性的程序题
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];}
}