【程序填空】宠物管理

169 阅读3分钟

​持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

题目描述

已知宠物类Pet的定义如下代码。宠物猫类Cat和宠物狗类Dog都是类Pet的派生类

类Cat增加数据成员:姓名(字符串)、食物(字符串),重载输出函数print,输出格式参考样例

类Dog增加数据成员:姓名(字符串)、犬大小(int),重载输出函数print,其中输出犬大小信息时,会根据犬大小值的1\2\3对应输出small\medium\big,输出格式参考样例

其他参考框架代码

#include
#include
#include
using namespace std;

class Pet { //基类,也是抽象类
protected:
string kind; //宠物类型
int ID; //宠物编号,固定长度为5位正整数
public:
Pet(): kind("unset"), ID(-1) { }
virtual void set(string tk, int ti)=0; //宠物必须设置类型和编号
virtual void print() { cout<<"NONE"<<endl; }
};

//完成类Cat和类Dog的填空

//主函数和输出的全局函数如下:
void print_pet(Pet &pr)
{ pr.print(); }

int main()
{ string tk, ts, tf;
int t, ti, tt;
char ptype;
cin>>t;
while (t--)
{ cin>>ptype;
if (ptype=='C')
{ cin>>tk>>ti>>ts>>tf; //类型、编号、姓名、食物
Cat cc(ts, tf);
cc.set(tk, ti);
print_pet(cc);
}
if (ptype=='D')
{ cin>>tk>>ti>>ts>>tt; //类型、编号、姓名、犬大小
Dog dd(ts, tt);
dd.set(tk, ti);
print_pet(dd);
}
}

return 0;
}

输入

第一行输入t表示有t个宠物

接着输入t行,每行包含5个参数,含义如下:

第一个参数是单个大写字母表示宠物类型(C表示宠物猫,D表示宠物狗)

如果是宠物猫,接着的四个参数分别是:类型、编号、姓名、食物

如果是宠物猫,接着的四个参数分别是:类型、编号、姓名、犬大小

根据管理需要,宠物编号ID是固定5位正整数,不足5位则高位补0,且猫Cat编号首位为1,狗Dog编号首位为2

假设编号的输入数据不超过4位,例如输入猫的编号是33,则最后生成的猫编号是10033;例如输入狗的编号是44,则最后生成的狗编号是20044

输出

输出t行

每行都是调用全局函数print_pet实现输出

输入样例1

4
C Cat 1 mimi fish
D Dog 2 lucky 2
D Chihuahua 3 wawa 1
C Garfield 4 fifi fishcan

输出样例1

Cat's ID=10001
mimi likes fish
Dog's ID=20002
lucky is medium
Chihuahua's ID=20003
wawa is small
Garfield's ID=10004
fifi likes fishcan

思路分析

对于程序填空题,我们需要通过观察主函数的类的创建看看有没有传入什么参数,还有类对象成员函数的调用情况,以及输出样例来确定我们补充的代码。

题目中谈到宠物编号的生成,可以直接通过相加的方法,猫咪从10000开始加,狗崽从20000开始加。

AC代码

class Cat :public Pet
{
protected:
    string name, food;
public:
    Cat(string name,string food):name(name),food(food){
    }
    virtual void set(string tk, int ti)
    {
        kind = tk;
        ID = 10000 + ti;
    }
    virtual void print()
    {
        cout << kind << "'s ID=" << ID << endl << name << " likes " << food << endl;
    }
};
class Dog :public Pet
{
protected:
    string name;
    int howbigisit;
public:
    Dog(string name,int big):name(name),howbigisit(big){
    }
    virtual void set(string tk, int ti)
    {
        kind = tk;
        ID = 20000 + ti;
    }
    virtual void print()
    {
        cout << kind << "'s ID=" << ID << endl << name << " is ";
        if (howbigisit == 1)
            cout << "small" << endl;
        else if (howbigisit = 2)
            cout << "medium" << endl;
        else
            cout << "big" << endl;
    }
};