一、题目描述
需要开发一个系统,对宠物的生长状态进行管理。给出下面的基类框架:
class Pet
{ protected:
string name;//姓名
float length;//身长
float weight;//体重
CDate current;//开始记录时间
(日期类CDate包含年、月、日三个私有数据,其他方法根据需要自拟。)
public:
virtual void display(CDate day)=0;//输出目标日期时宠物的身长和体重
}
以Pet为基类,构建出Cat和Dog两个类:
Cat一天身长加0.1,体重加0.2。
Dog一天身长加0.2,体重加0.1。
生成上述类并编写主函数,要求主函数中有一个基类指针Pet *pt,用于测试子类数据。
主函数根据输入的信息,相应建立Cat类对象或Dog类对象,并给出测量日期时宠物的身长和体重。
二、输入与输出
1.输入
第一行为测试次数
第二行是开始记录日期
从第三行起,每个测试用例占一行,每行给出宠物的基本信息:宠物的类型(1为Cat,2为Dog)、名字、身长、体重、最后测量的日期。
3
2019 5 5
1 tony 10 10 2018 12 30
2 jerry 5 6 2019 5 10
1 tom 3 4 2019 6 1
2.输出
要求输出目标日期宠物姓名、身长和体重(结果要求保留小数点后2位)。若测量日期小于开始日期,输出”error”。
error
jerry after 5 day: length=6.00,weight=6.50
tom after 27 day: length=5.70,weight=9.40
三、参考代码
#include <iostream>
#include <vector>
#include<string>
#include<cmath>
#include <memory>
#include<iomanip>
using namespace std;
class date
{
private:
int year, mon, day;
public:
date(){}
void set(int y, int m, int d)
{
year = y;
mon = m;
day = d;
}
date(int y, int m, int d)
{
year = y;
mon = m;
day = d;
}
friend int days(const date& a, const date& b)
{
const int mons1[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
const int mons2[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
int ad = a.year * 10000 + a.mon * 1000 + a.day;
int bd = b.year * 10000 + b.mon * 1000 + b.day;
if (ad > bd)
{
return 0;
}
else
{
ad = 0;
bd = 0;
if (a.year % 400 == 0 || (a.year % 4 == 0 && a.year % 100 != 0))
{
for (int i = 0; i < a.mon-1; i++)
{
ad += mons2[i];
}
for (int i = 0; i < a.mon-1; i++)
{
bd += mons2[i];
}
ad += a.day;
bd += b.day;
return bd - ad;
}
else
{
for (int i = 0; i < a.mon-1; i++)
{
ad += mons1[i];
}
for (int i = 0; i < b.mon-1; i++)
{
bd += mons1[i];
}
ad += a.day;
bd += b.day;
return bd - ad;
}
}
}
};
class pet
{
protected:
string name;
float len;
float wei;
date now;
public:
pet(string n, float l, float w, date n1)
{
name = n;
len = l;
wei = w;
now = n1;
}
virtual void display(date day) = 0;
};
class cat :public pet
{
public:
cat(string n, float l, float w, date n1):pet(n,l,w,n1){}
void display(date ago)
{
int lon = days(ago, now);
if (lon)
{
cout << name << " after " << lon << " day: length=" << fixed << setprecision(2) << len+lon*0.1 << ",weight=" << fixed << setprecision(2) << wei+lon*0.2 << endl;
}
else
{
cout << "error" << endl;
}
}
};
class dog :public pet
{
public:
dog(string n, float l, float w, date n1) :pet(n, l, w, n1) {}
void display(date ago)
{
int lon = days(ago, now);
if (lon)
{
cout << name << " after " << lon << " day: length=" << fixed << setprecision(2) << len + lon * 0.2 << ",weight=" << fixed << setprecision(2) << wei + lon * 0.1 << endl;
}
else
{
cout << "error" << endl;
}
}
};
int main()
{
int sum;
cin >> sum;
int y, m, d;
string n;
int len, wei;
cin >> y >> m >> d;
date ago(y, m, d);
int id;
pet* pt;
while (sum--)
{
cin >> id;
cin >> n >> len >> wei;
cin >> y >> m >> d;
date now(y, m, d);
if (id == 1)
{
pt = new cat (n, len, wei, now);
pt->display(ago);
}
else
{
pt=new dog(n, len, wei, now);
pt->display(ago);
}
}
}