当前位置: 首页 > news >正文

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];}
}

 

相关文章:

  • pytorch checkpointing
  • AD创建元件符号
  • 蓝桥杯 17. 通电
  • 嵌入式硬件设计全解析:从架构到实战
  • C/C++滑动窗口算法深度解析与实战指南
  • 89. 格雷编码
  • 时间同步服务
  • 签名去背景图像处理实例
  • Qwen3的“混合推理”是如何实现的
  • 黑马点评大总结
  • 在Excel中轻松处理嵌套JSON数据:json-to-excel插件使用指南
  • Vue3核心语法速成
  • 慢sql处理流程和常见案例
  • 20250505下载VLC for Android
  • git上常用的12个月份对应的英语单词以及月份英语缩写形式
  • 矩阵快速幂 快速求解递推公式
  • 二重指针和二维数组
  • 力扣119题解
  • 机场围界报警系统的研究与应用
  • 深入理解 CSS Flex 布局:代码实例解析
  • 伊朗港口爆炸事故遇难人数最终确定为57人
  • 经济日报:合力推进民企与毕业生双向奔赴
  • 大众、学术和政治三重框架下的“汉末之变”
  • 五四青年节|青春韵脚
  • 安徽安庆市委书记张祥安调研假日经济和旅游安全工作
  • 2025上海车展圆满闭幕,共接待海内外观众101万人次