需要开发一个系统,对宠物的生长状态进行管理。给出下面的基类框架:
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为Cat,2为Dog)、名字、身长、体重、最后测量的日期。
输出
要求输出目标日期宠物姓名、身长和体重(结果要求保留小数点后2位)。若测量日期小于开始日期,输出”error”。
输入样例1
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
输出样例1
error
jerry after 5 day: length=6.00,weight=6.50
tom after 27 day: length=5.70,weight=9.40
#include<iostream>
#include<cstring>
#include<iomanip>
using namespace std;
class CDate {
private:
int year;
int month;
int day;
public:
CDate(){}
CDate(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
int compare(CDate& p)//计算相差天数
{
int temp1 = 0; int temp2 = 0;
int m[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//非闰年年份各月天数
int n[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };//闰年年份各月天数
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))//判断闰年
{
for (int i = 0; i < month - 1; i++)//加前面月份的天数
{
temp1 += n[i];
}
}
else {
for (int i = 0; i < month - 1; i++)
{
temp1 += m[i];
}
}
if ((p.year % 4 == 0 && p.year % 100 != 0) || (p.year % 400 == 0))
{
for (int i = 0; i < p.month - 1; i++)//同理
{
temp2 += n[i];
}
}
else {
for (int i = 0; i < p.month - 1; i++)
{
temp2 += m[i];
}
}
temp1 += day;//加输出月份的日期
temp2 += p.day;
if (year == p.year)//年份相等直接相减
{
return temp2 - temp1;
}
else if (year > p.year)//年份不相等
{
return -1;
}
else//同理
{
int min = year;
int max = p.year;
while (max - min)
{
if ((min % 4 == 0 && min % 100 != 0) || (min % 400 == 0))
{
temp2 += 366;
}
else
{
temp2 += 365;
}
min++;
}
return temp2 - temp1;
}
}
};
class Pet
{
protected:
string name;//姓名
float length;//身长
float weight;//体重
CDate current;//开始记录时间
//(日期类CDate包含年、月、日三个私有数据,其他方法根据需要自拟。)
public:
Pet(){}
void set(string n,float l,float w,CDate c)
{
name = n;
length = l;
weight = w;
current = c;
}
virtual void display(CDate day) = 0;//输出目标日期时宠物的身长和体重
};
class Cat: public Pet {
virtual void display(CDate day)
{
int d;
d = current.compare(day);
if (d < 0)
{
cout << "error" << endl;
}
else
{
length = length + d * 0.10;
weight = weight + d * 0.20;
cout << name << " after " << d << " day: length=" <<fixed<< setprecision(2) << length << ",weight=" << fixed << setprecision(2) << weight << endl;
}
//jerry after 5 day: length = 6.00, weight = 6.50
}
};
class Dog :public Pet {
virtual void display(CDate day)
{
int d;
d = current.compare(day);
if (d < 0)
{
cout << "error"<<endl;
}else {
length = length + d * 0.20;
weight = weight + d * 0.10;
cout << name << " after " << d << " day: length=" <<fixed<< setprecision(2) << length << ",weight=" << fixed << setprecision(2) << weight << endl;
}
}
};
int main()
{
string name;
float length;//身长
float weight;//体重
Pet* pt;
int t;
cin >> t;
int year, month, day;
cin >> year >> month >> day;
CDate s(year,month,day);
while (t--)
{
int type;
cin >> type;
if (type == 1)
{
cin >> name>>length >> weight >> year >> month >> day;
CDate d(year,month,day);
Cat c;
c.set(name, length, weight, s);
pt = &c;
pt->display(d);
}
else {
cin >> name >> length >> weight >> year >> month >> day;
CDate d(year, month, day);
Dog c;
c.set(name, length, weight, s);
pt = &c;
pt->display(d);
}
}
return 0;
}
//以Pet为基类,构建出Cat和Dog两个类:
//
//Cat一天身长加0.1,体重加0.2。
//
//Dog一天身长加0.2,体重加0.1。
//
//生成上述类并编写主函数,要求主函数中有一个基类指针,用于测试子类数据。
//
//主函数根据输入的信息,相应建立Cat类对象或Dog类对象,并给出测量日期时宠物的身长和体重。