c++实验6-D(1786)动物爱好者

这篇文章描述了一个编程问题,要求定义两个类:Animal类,包含动物的名称和数量属性,以及AnimalList类,用于存储多种动物的信息。AnimalList类应支持通过名称获取动物数量的操作。问题强调不能使用STL,并提供了输入输出示例以及代码框架。
摘要由CSDN通过智能技术生成

Problem D: 动物爱好者

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 3687  Solved: 2799
[Submit][Status]

Description

某人是一个狂热的动物爱好者,豢养了大量的各种动物。现在请定义两个类:

1. Animal类:

(1)string name和int  num属性表示该种动物的名称和数量。

(2)无参构造函数。

(3)void setAnimal(string,int)方法,用于设置一个动物的相关属性。

(4)int getNum() const和string getName() const方法用于获得该动物的数量和名称。

(5)重载的赋值运算符=。

2. AnimalList类:

(1)Animal *animalList和int numOfAnimal属性,用于表示该人豢养的所有动物的列表以及动物的种类数。

(2)构造函数AnimalList(Animal *animals, int n)。

(3)重载的下标运算符[],int operator[](string name),用于返回参数name指定名称的动物的数量,当不存在这种动物时,返回-1。

 

Input

第一行M>0表示有M种动物,之后有M行,每行第一个字符串表示动物名称,第二个整数是该种动物的数量。

之后一个N>0表示有N个测试用的动物名称,之后又有N行,每行是一个动物名。

 

Output

输出共N行,格式见样例。

 

Sample Input

5 Dog 5 Bird 10 Cat 11 Duck 1 Sparrow 66 6 Dog Bird Cat Duck Sparrow Bull

Sample Output

There are 5 Dogs. There are 10 Birds. There are 11 Cats. There are 1 Ducks. There are 66 Sparrows. There is none Bull.

HINT

 

注意:不能使用STL。

 

Append Code

append.cc,

int main()
{
    int cases;
    string name;
    int num;
    cin>>cases;
    Animal animals[cases];
    for (int i = 0; i < cases; i++)
    {
        cin>>name>>num;
        animals[i].setAnimal(name, num);
    }
    AnimalList animalList(animals, cases);
 
    cin>>cases;
    for (int i = 0; i < cases; i++)
    {
        cin>>name;
        if (animalList[name] != -1)
            cout<<"There are "<<animalList[name]<<" "<<name<<"s."<<endl;
        else
            cout<<"There is none "<<name<<"."<<endl;
    }
    return 0;
}

答案:

#include<iostream>
using namespace std;
class Animal
{
private:
    string name;
    int n;
public:
    Animal():name(" "),n(0){}
    void setAnimal(string s,int nn)
    {
        name=s;
        n=nn;
    }
    int getNum() const
    {
        return n;
    }
    string getName() const
    {
        return name;
    }
    Animal& operator=(const Animal& p)
    {
        if(p.name==name)
            return *this;
    }
};
class AnimalList
{
private:
    Animal *aa;
    int nn;
public:
    AnimalList(Animal* a, int n):aa(a),nn(n){}
    int operator[](string name)
    {
        for(int i=0;i<nn;++i)
        {
          if(name==aa[i].getName())
                return aa[i].getNum();
        }
          return -1;
    }
    ~AnimalList(){delete []aa;}


};

int main()
{
    int cases;
    string name;
    int num;
    cin>>cases;
    Animal animals[cases];
    for (int i = 0; i < cases; i++)
    {
        cin>>name>>num;
        animals[i].setAnimal(name, num);
    }
    AnimalList animalList(animals, cases);

    cin>>cases;
    for (int i = 0; i < cases; i++)
    {
        cin>>name;
        if (animalList[name] != -1)
            cout<<"There are "<<animalList[name]<<" "<<name<<"s."<<endl;
        else
            cout<<"There is none "<<name<<"."<<endl;
    }
    return 0;
}

分析:

1.重载赋值函数(=):

返回值类型 & operator=(const 类& p,...) ;

使用场景:类内有指针,或者动态分配内存(有string类指针或数组)

通常返回本类对象的引用;

第一个参数通常加const,防止改变右值;

可以有多个参数

除第一个参数外的参数要赋初值

 

2重载下标运算符[]:

返回值类型 &  operator[ ] (参数即下标类型,原则上可为任意数据类型) const

只能作为类的非静态函数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值