cpp春实验四
实验目的
模拟动物园的经营,包含类:
- $Money$,该类用于货币流通,包含美元美分的互换,总金额的计算,重载运算符等操作
- $Animal$,作为抽象函数,包含虚函数,是其他水三个动物类的父类,包含进食,身体数据等成员
- $Person$,作为抽象函数,包含人的基本要素,如姓,名,年龄等
- $Elephant$,作为$Animal$的子类,包含了大象的独特数据和进食类的相关函数
- $Giraffe$,作为$Animal$的子类,包含了长颈鹿的独特数据和进食类的相关函数
- $Monkey$,作为$Animal$的子类,包含了猴子的独特数据和进食类的相关函数
- $AnimalEnclosure$,该类用于统一三种动物,包含兽栏的清洁度,兽栏的开闭,兽栏的打扫,数据的返回和三种动物的对象等元素
- $Visitor$,作为$Person$的子类,包含了游客的独特信息:id
- $Zookeeper $,作为$Person$的子类,包含了清理工的行为:打扫,和对应的成员变量。存在结束判定
- $Foodseller$,作为Person的子类,包含了食品售卖商的行为:售卖水果,维护一个水果数目数组,包含了类$Money$,用于交易。存在结束判定
- $Child$,作为$Visitor$的子类,包含了孩子的行为:喂食。
- $Adult$,作为$Visitor$的子类,包含了成人的行为:购票,购买食物。维护一个孩子的动态数组
- $Zoo$,该类用于实验动物园的运营。包含$Zookeeper $,$Foodseller$,和$Adult$的动态数组。含有两个函数实现动物园的一天运营和长期运营。
- $foodmoney$,价目表,静态数据成员
- $feedfood()$,多态的实现
实验步骤
$Money$
这个类是动物园货币流的基础,包含了
int dollars;//拆分的美元 |
四个数据成员,实现了总金额在美分和美元间的转换
void turn_dol();//得到单位美元 |
以上为返回数据类函数和金额转换函数
Money& operator+(const double& q);//重载运算符+ |
为重载函数
Money& Money::operator+(const double& q)//重载运算符+ |
实现如上
Money(); |
构造函数和析构函数
其中,默认构造函数还会调用
void Money::writeIN(int a, int b)//写入美元美分 |
完成初始化
实现如下
Money::Money()//初始设置为0 |
$Animal$
这个类是大象,长颈鹿,猴三种动物实现的基础
double weight; |
有如上的数据成员
virtual int remost()=0;//返回最值 |
同时构建虚函数,对动物每天能吃到的食物的最大值和已经吃了的食物的值进行记录
Animal::Animal()//先初始化,后子类初始化,覆盖 |
构造与析构如上
$Elephant$&$Giraffe$&$Monkey $
继承自$Animal$,为三种动物之一
int remost();//返回最值 |
有函数成员如上
int Elephant::remost() |
实现如上,这样设计是为了每日结算时统一结算数量,以便对兽栏进行修改。
$AnimalEnclosure$
是兽栏类,该类将包含三种动物组合,可以实现三个兽栏的开闭,清理,统计。
string name; |
有数据成员如上,$closeday$用于记录兽栏关闭的时间,$openclose$用来反馈开闭状态,$cleanlevel$用来记录兽栏的清洁度水平,$closetime$用来记录关闭的总次数。
AnimalEnclosure::AnimalEnclosure()//构造初始 |
构造和析构函数
int re_cle();//返回清洁度 |
以上为数据返回和修改函数
void AnimalEnclosure::check1(int i) |
该函数用于每日检查兽栏状态,若关闭时间为1,则说明时间够了,次数+1,状态为开,时常归0
bool AnimalEnclosure::check2(int i)//检查,每日结束时检查,清洁度小于2000的为开,大于2000变为关。 |
对总体进行检查,若清洁度大于设定值,则闭馆修正,返回false,这意味着要调用zookeeper的函数了。否则舍设置状态为开(防止漏算。
void AnimalEnclosure::close(int i) |
每日结束后对兽栏进行检查,作为播报的一部份
$Person$
是游客类,清理工类和水果商类实现的基础。
会在创建时自动生成姓名和年龄
Person::Person() { |
有构造和析构函数如上,构造时将从两个数组中随机组成名字
string name; |
作为姓与名的组合数组,名字将从中产生
$Visitor$
该类是成人和孩子类的基础。将为会游客赋值于id
Visitor::Visitor() { |
构造函数与析构函数
void Visitor::writeID() |
后续对id判断时可以依此函数进行重写
$Zookeeper$
该类对兽栏进行维护,同时会在每日结算时对$Zookeeper$的打扫日常进行判断,如已达上限,则动物园停止经营。
Zookeeper::Zookeeper() |
构造与析构
void Zookeeper::writeday(int a) |
用于返回和写入信息
bool Zookeeper::check() |
该函数会在每日结算时进行检查
$Foodseller$
该类作为zoo中常驻的类,每天开始都需要与游客互动,对他维护的食物数目数组进行修改,同时其资产也会增加。
Foodseller::Foodseller()//构造函数 |
构造函数,对价目表和数目表初始化
int* foodarry();//传出食物数量数组 |
返回数组等成员的函数
bool Foodseller::check() |
每日结束时进行信息检查,若触发则进行结算
$Child$
该类继承自类$Visitor$,每个孩子都会维护一个自己持有的食物的数组。
Child::Child() |
构造与析构
virtual void write_age();//年龄 |
返回数据的函数
void Child::feed(AnimalEnclosure *animalEnclosure)//默认顺序,将孩子的食物分配完 |
首先对兽栏的清洁度进行操作,即writecle函数。然后调用use函数,连接到feed函数,统一接口后对每个动物的食物进行写访问。
$Adults$
成人类,有$Child$的动态数组,有购票和购买食物的行为
Adults::Adults()//构造函数 |
构造函数:生成钱包内的美元数,和随行的孩子数,然后创建孩子的动态数组。
析构函数:检查指针是否为空再释放,防止悬挂
void Adults::buyticket()//初始购票 |
购票,包含成人的和孩子的
void Adults::feed(AnimalEnclosure animalEnclosure[]) |
间接调用feed函数,依此对三种动物的食物进行操作
void Adults::buyfood(int* a,int &b)//a为数量,b为价格 |
成人的购买食物函数,传入商人的食物数组,根据购买的食物进行操作。然后,对买的三种食物分别求取平均值,分配给孩子。
$Zoo$
作为动物园运行的基础,该类将包含食品商,清理工,兽栏数组和成年人的动态数组,以及分别模拟一天和长期的函数。
void Zoo::oneday()//模拟第一天 |
仅模拟一天
void Zoo::allday() |
每天模拟开始时,根据随机数得到成人的数组,完成购票($buyticket$),购买食物($buyfood$),喂养($feed$)三个步骤,然后对每个数据进行检查,如不符合,则经营结束。此外,还要释放内存,并重写为nullptr,以便下次赋值。
实验代码
$Zoo.h$
|
$Zoo.cpp$
|
$main.cpp$
|
实验反思与改进
- 多态的构建并不完善,因为从child调用函数,所以可以更改为从child得到数据,随后由animal调用函数
- 相关功能可完善,比如动物类还有一些数据成员关联到函数。
- 动态数组的释放需要慎重考量,释放时记得判断是否为空。
- 清洁工的最大打扫天数可随游戏天数变化而变化
输出展示
清理工廉勇上班了 |