复制
收藏
提问
简洁

#include<iostream> #include<string> #include "string.h" #include<cstdlib> #include<typeinfo> using namespace std; class Animal { public: Animal(string n="Animal",int a=0):name(n),age(a){animalNum++;} virtual void move()=0; virtual void shout()=0; string getName(){return name;} void setName(string s){name=s;} int getAge(){return age;} static int getNum(){return animalNum;} protected: string name; int age; static int animalNum; }; int Animal::animalNum=0; class Dog:public Animal { static int dogNum; public: Dog(string n="Dog"):Animal(n,++dogNum){} void move()override{cout<< "run "<<(5+0.1*age)<< " feet!";} void shout()override{cout<< " wang wang, It is "<<name<< " age "<<age<<endl;} static int getNum(){return dogNum;} }; int Dog::dogNum=0; class Frog:public Animal { static int frogNum; public: Frog(string n="Frog"):Animal(n,++frogNum){} void move()override{cout<< "jump "<<(1+0.1*age)<< " feet!";} void shout()override{cout<< " gua gua, It is "<<name<< " age "<<age<<endl;} static int getNum(){return frogNum;} }; int Frog::frogNum=0; class Bird:public Animal { static int birdNum; public: Bird(string n="Bird"):Animal(n,++birdNum){} void move()override{cout<< "fly "<<(10+0.1*age)<< " feet!";} void shout()override{cout<< " qiu qiu, It is "<<name<< " age "<<age<<endl;} static int getNum(){return birdNum;} }; int Bird::birdNum=0; void showAnimal(Animal *pa) { pa->move(); pa->shout(); } int main() { Dog dogList[10]; Frog frogList[5]; Bird birdList[15]; Animal *animalList[10]; int seeds; cin>>seeds; srand(seeds); int totalnum=Animal::getNum(); cout<< "There are "<<totalnum<< " animals in the zoo"<<endl; cout<< Dog::getNum()<< " dogs, "<<Frog::getNum()<< " frogs, " <<Bird::getNum()<< " birds\n\n"; for(int i=0;i<10;i++) { int n=rand()%(Animal::getNum()); if(n<Dog::getNum()) { animalList[i]=dogList+n; } else if(n<Dog::getNum()+Frog::getNum()) { animalList[i]=frogList+(n-Dog::getNum()); } else { animalList[i]=birdList+(n-Dog::getNum()-Frog::getNum()); } } cout<< "Let's study!"<<endl; for(int i=0;i<5;i++) { showAnimal(animalList[i]); } for(int i=5;i<10;i++) { animalList[i]->setName("Animal"); } cout<< "\nLet's have a test!"<<endl<<endl; int score=0; for(int i=5;i<10;i++) { showAnimal(animalList[i]); cout<< "Guess! What type of animal is It?"<<endl; char ns[10]; cin>>ns; if (strstr(typeid(*animalList[i]).name(),ns)) { cout<< "You are right!\n"<<endl; score+=20; } else { cout<< "You are wrong!\n"<<endl; score+=20; } } cout<< "Your score: "<<score<<endl; return 0;

2月前
全网
文档
学术
百科
知识库
时间不限
自动
回答简洁模式
深入研究一些

这段代码是一个C++程序,它定义了一个动物(Animal)的基类和三个派生类:狗(Dog)、青蛙(Frog)和鸟(Bird)。每个类都有特定的移动和发声方法。程序还包含了一个函数showAnimal,用于展示动物的移动和发声。

程序的主要逻辑在main函数中,它创建了三个数组,分别存储狗、青蛙和鸟的对象。然后,程序使用随机数来选择数组中的动物,并展示它们的移动和发声。之后,程序让用户猜测动物的类型,并根据猜测结果给出分数。

然而,这段代码中存在一些问题和错误,我将逐一指出并提供修改建议:

  1. #include "string.h"是C语言的头文件,C++中应该使用<string>。但是在这个程序中,string.h并没有被使用,可以删除这行。

  2. using namespace std;应该放在所有头文件包含之后。

  3. DogFrogBird类中的构造函数应该调用基类Animal的构造函数,并传递na参数。当前的构造函数只传递了n

  4. main函数中,srand(seeds);应该在读取seeds之前调用,以确保随机数生成器被正确地初始化。

  5. main函数中,totalnum变量的计算应该是所有动物数量的总和,但是实际上它只计算了Animal类的数量。应该分别计算每种动物的数量,然后相加。

  6. for循环中,rand()%(Animal::getNum());这个表达式可能不会生成0到Animal::getNum()-1之间的随机数,因为rand()生成的是0到RAND_MAX之间的随机数。应该使用rand() % totalnum;,其中totalnum是所有动物的总数。

  7. for循环中,数组索引的计算可能会导致越界访问。应该使用min函数来确保索引不会超出数组边界。

  8. 在最后的猜测环节,strstr函数的使用是不正确的,因为typeid返回的是一个std::type_info对象,而不是一个字符串。不能直接用strstr来比较类型名称。应该使用type_info::name()方法来获取类型名称,并使用strcmpstd::string的比较操作来进行比较。

  9. 程序中的分数计算逻辑有误。如果用户猜错了,应该减分而不是加分。

  10. 程序没有考虑到用户输入的动物类型名称可能不匹配任何已知类型的情况,这可能导致未定义行为。

修正这些问题后,程序应该能够更稳定和准确地运行。如果你需要具体的代码修改帮助,请告诉我。

你觉得结果怎么样?
C++中虚函数的作用是什么?
C++多态性如何实现?
C++中如何使用类型信息?
C++中如何使用静态成员变量?
C++中如何实现继承?
C++中如何使用构造函数初始化列表?

以上内容由AI搜集生成,仅供参考

在线客服