PTA 宠物的生长 / 期刊收费 / 师生信息管理 C++ 多态 编程题

7-3 宠物的生长 (10分)

现在要开发一个系统,对宠物的生长状态进行管理。
给出下面的一个基类框架

class Pet
{
protected:
  string name;//姓名
int length;//身长
int weight;//体重
int current;//当前日期
public:
virtual void display(int day)=0;//输出目标日期的身长和体重
}

以Pet为基类,构建出Cat和Dog两个类:
Cat一天身长加1,体重加2。
Dog一天身长加2,体重加1。
生成上述类并编写主函数,要求主函数中有一个基类Pet指针数组,数组元素不超过10个。
Pet *pt[10];
主函数根据输入的信息,相应建立Cat类对象或Dog类对象,并给出目标日期宠物的身长和体重。
输入格式:每个测试用例占一行,每行给出宠物的基本信息,第一个为当前宠物的类型:1为Cat,2为Dog。接下来为它的名字,随后的两个数字为身长和体重,最后为测身长和体重的日期(不大于10的正整数)。最后一行为目标日期(大于10的正整数)。
要求输出目标日期宠物姓名、身长和体重
提示:应用虚函数实现多态
输入样例

1 Marry 22 12 5
2 Jack 10 9 9
1 Jim 11 8 6
11 

输出样例

Marry 28 24
Jack 14 11
Jim 16 18

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

class Pet
{
protected:
    string name;//姓名
    int length;//身长
    int weight;//体重
    int current;//当前日期
public:
    virtual void display(int day)=0;//输出目标日期的身长和体重
    virtual ~Pet() {};
    Pet(string na,int l,int w,int c)
    {
    name =na;
    length =l;
    weight=w;
    current=c;
    }
};

class Cat:public Pet
{
public:
    Cat(string na,int l,int w,int c):Pet(na,l,w,c){}

    virtual void display(int day)
    {
        day=day-current;
        cout<<name<<" "<<length+day<<" "<<weight+day*2<<endl;

    }
};

class Dog:public Pet
{

public:
    Dog(string na,int l,int w,int c):Pet(na,l,w,c){}

    virtual void display(int day)
    {
        day=day-current;
        cout<<name<<" "<<length+day*2<<" "<<weight+day*1<<endl;
    }
};

int main()
{
    Pet *pd[10];
    string str;
    int t,num,i=0,l,w,c;
    double kg;
    cin>>t;
    while(t<10){
        cin>>str>>l>>w>>c;
        if(t==1){
            pd[i]=new Cat(str,l,w,c);
        }else if(t==2){
            pd[i]=new Dog(str,l,w,c);
        }
        i++;
        cin>>t;
    }
    for(int j=0;j<i;j++){
        pd[j]->display(t);
    }

    delete *pd;
    return 0;
}

7-4 期刊收费 (10分)

邮局提供两种期刊的订阅:杂志和报纸。 给出下面基类的框架:

class Periodical {
protected:
string title; //名称
public:
virtual void display()=0;//打印收费
}

以Periodical为基类,构建Magazine和Newspaper类。
生成上述类并编写主函数,要求主函数中有一个基类Periodical指针数组,数组元素不超过10个。
Periodical *pp[10];
主函数根据输入的信息,相应建立Magazine, Newspaper类对象,对于Magazine给出订阅期数和每期价格,对于Newspaper给出订阅周数,每周出版次数和每份价格。
输入格式:每个测试用例占一行,第一项为类型,1为Magazine,2为Newspaper,第二项是名称,第三项是单价,Magazine的第四项是期数,Newspaper的第四项是订阅周数,第五项是每周出版次数。
输出时,依次打印各期刊的名称和收费(小数点后保留一位)。
输入样例:

1 AAA 12.8 6
1 BB 15 3
2 CCCC 2.1 16 3
2 DD 0.7 55 7
1 EEE 18 3
0

输出样例:

AAA 76.8
BB 45.0
CCCC 100.8
DD 269.5
EEE 54.0

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

class Periodical
{
protected:
    string title; //名称
    double price;
public:
    virtual void display()=0;//打印收费
    virtual ~Periodical() {};
    Periodical(string t,double p)
    {
        title=t;
        price=p;
    }
};

class Magazine:public Periodical
{
    double qs;
public:
    Magazine(string t,double p,double q):Periodical(t,p)
    {
        qs=q;
    }

    virtual void display()
    {
        cout<<title<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<price*qs<<endl;

    }
};

class Newspaper:public Periodical
{
double zs,cs;
public:
    Newspaper(string t,double p,double q,double c):Periodical(t,p)
    {
        zs=q;
        cs=c;
    }

    virtual void display()
    {
        cout<<title<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<price*zs*cs<<endl;
    }
};

int main()
{
    Periodical *pd[10];
    string s;
    int t,num,i=0;
    double kg,p,q,c;
    cin>>t;
    while(t){
        cin>>s>>p;
        if(t==1){
            cin>>q;
            pd[i]=new Magazine(s,p,q);
        }else if(t==2){
            cin>>q>>c;
            pd[i]=new Newspaper(s,p,q,c);
        }
        pd[i]->display();
        i++;
        cin>>t;
    }
    delete *pd;
    return 0;
}

7-5 师生信息管理 (10分)

给出下面的一个基类框架


class Person
{
protected:
int NO;//编号
public:
virtual void display()=0;//输出相关信息
}

以Person为基类,构建出Student、Teacher两个类。
生成上述类并编写主函数,要求主函数中有一个基类Person指针数组,数组元素不超过10个。
Person *pp[10];
主函数根据输入的信息,相应建立Student, Teacher类对象,对于Student给出期末5门课的成绩(为整数,缺考的科目填-1), 对于Teacher则给出近3年,每年发表的论文数量。
输入格式:每个测试用例占一行,第一项为人员类型,1为Student,2为Teacher.接下来为编号(0-9999),接下来Student是5门课程成绩,Teacher是3年的论文数。最后一行为0,表示输入的结束。
要求输出编号,以及Student缺考的科目数和已考科目的平均分(保留1位小数,已考科目数为0时,不输出平均分),Teacher的3年论文总数。
提示:应用虚函数实现多态
输入样例

1 19 -1 -1 -1 -1 -1
1 125 78 66 -1 95 88
2 68 3 0 7
2 52 0 0 0
1 6999 32 95 100 88 74
0 

输出样例

19 5
125 1 81.8
68 10
52 0
6999 0 77.8

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

class Person
{
protected:
    int NO;//编号
public:
    virtual void display()=0;//输出相关信息
    Person(int n){NO=n;}
    virtual ~Person(){};
};

class Student:public Person
{
    double pj;
    int num=0;
public:
    Student(int n,int n1,int n2,int n3,int n4,int n5):Person(n)
    {
        if(n1==-1) num++;
        else pj+=n1;
        if(n2==-1) num++;
        else pj+=n2;
        if(n3==-1) num++;
        else pj+=n3;
        if(n4==-1) num++;
        else pj+=n4;
        if(n5==-1) num++;
        else pj+=n5;
        pj=pj/(5-num);
    }

    virtual void display()
    {
        cout<<NO<<" "<<num;
         if(num!=5){
            cout<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<pj;
         }
         cout<<endl;
    }
};

class Teacher:public Person
{
int num;
public:
    Teacher(int n,int n1,int n2,int n3):Person(n)
    {
        num=n1+n2+n3;
    }

    virtual void display()
    {
        cout<<NO<<" "<<num<<endl;
    }
};

int main()
{
    Person *pd[10];
    string s;
    int t,n,i=0,n1,n2,n3,n4,n5;
    cin>>t;
    while(t){
        cin>>n;
        if(t==1){
            cin>>n1>>n2>>n3>>n4>>n5;
            pd[i]=new Student(n,n1,n2,n3,n4,n5);
        }else if(t==2){
            cin>>n1>>n2>>n3;
            pd[i]=new Teacher(n,n1,n2,n3);
        }
        pd[i]->display();
        i++;
        cin>>t;
    }
    delete *pd;
    return 0;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值