题目描述
软件作为一种对象也可以用类来描述,软件的属性包括软件名称、类型(分别用O、T和B表示原版、试用版还是备份)、有效截至日期(用CDate类子对象表示)和存储介质(分别用D、H和U表示光盘、磁盘和U盘)等。软件拷贝可通过拷贝构造函数来实现,此时在拷贝构造函数中软件类型改成“B”, 存储介质改为"H",其它不变。试完成该类的拷贝构造、构造和打印(包括从2015年4月7日算起有效期还有多少天,是否过期)成员函数的实现。
当输入软件有效截止日期是0年0月0日,表示无日期限制,为unlimited;当输入日期在2015年4月7日之前,则是过期,表示为expired;如果输入日期在2015年4月7日之后,则显示之后的剩余天数。具体输出信息看输出范例。
附CDate类的实现:
class CDate
{
private:
int year, month, day;
public:
CDate(int y, int m, int d);
bool isLeapYear();
int getYear();
int getMonth();
int getDay();
int getDayofYear();
};
CDate::CDate(int y, int m, int d)
{
year = y, month = m,day = d;
}
bool CDate::isLeapYear()
{
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
int CDate::getYear()
{
return year;
}
int CDate::getMonth()
{
return month;
}
int CDate::getDay()
{
return day;
}
int CDate::getDayofYear()
{
int i, sum = day;
int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear())
{
a[2]++;
}
// 求日期的天数
for (i = 0; i < month; i++)
{
sum += a[i];
}
return sum;
}
输入
测试数据的组数 t
第一个软件名称
第一个软件类型 第一个软件介质类型 第一个软件有效期年 月 日
第二个软件名称
第二个软件类型 第二个软件介质类型 第二个软件有效期年 月 日
......
注意:软件名称最大长度为30;
输出
name: 第一个软件名称
type: 第一个软件类型
media: 第一个软件介质类型
第一个软件2015-4-7后的有效天数
name: 第一个软件名称
type: backup
media: hard disk
第一个软件2015-4-7后的有效天数
......
输入样例
3
Photoshop_CS5
O D 0 0 0
Audition_3.0
B U 2015 2 3
Visual_Studio_2010
T H 2015 5 5
输出样例
name:Photoshop_CS5
type:original
media:optical disk
this software has unlimited use
name:Photoshop_CS5
type:backup
media:hard disk
this software has unlimited use
name:Audition_3.0
type:backup
media:USB disk
this software has expired
name:Audition_3.0
type:backup
media:hard disk
this software has expired
name:Visual_Studio_2010
type:trial
media:hard disk
this software is going to be expired in 28 days
name:Visual_Studio_2010
type:backup
media:hard disk
this software is going to be expired in 28 days
#include
using namespace std;
//构造日期
class CDate
{
private:
int year, month, day;//年月日
public:
CDate(int y, int m, int d);//构造函数
CDate();//必须要加的
bool isLeapYear();
int getYear();
int getMonth();
int getDay();
int getDayofYear();
};
//必须要加的
CDate::CDate()
{
}
//构造函数
CDate::CDate(int y, int m, int d)
{
year = y, month = m, day = d;
}
//判断闰年
bool CDate::isLeapYear()
{
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
//获取年月日
int CDate::getYear()
{
return year;
}
int CDate::getMonth()
{
return month;
}
int CDate::getDay()
{
return day;
}
int CDate::getDayofYear()//求该年 已经过了多少天
{
int i, sum = day;//这个月的天数赋值给sum
//月份对应天数
int a[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (isLeapYear())//闰年情况
{
a[2]++;//2月 有29天
}
// 求日期的天数
//一月加到上一个月 因为这个月的天数在开头已经赋值给sum了
for (i = 0; i < month; i++)
{
sum += a[i];
}
return sum;//求该年 已经过了多少天
}
//构造软件函数
class Software
{
private:
char* name;//名字
char m_type;//类型
CDate limit_day;//日期
char m_media;//介质
public:
Software(char* p, char type, char media, CDate day);//构造函数
~Software(); //析构函数
Software(const Software& s);//拷贝构造函数
void print();
int calculate();//计算
};
//构造函数——将外界的值 传入对象里面
Software::Software(char* p, char type, char media, CDate day)
{
int n = 0;
//计算传入的数组p[]有多少元素——计算字符数——计算名字长度
for (int i = 0; p[i] != '\0'; i++)
{
n++; //计算字符数
}
//动态数组创建
name = new char[n + 1]; //记得最后还有'\0'
//拷贝数组
for (int i = 0; i < n; i++)
{
name[i] = p[i]; //逐一拷贝
}
name[n] = '\0';//记得最后还有'\0'
//逐一赋值
m_type = type;
m_media = media;
limit_day = day;
}
//析构函数
Software::~Software()
{
delete[]name;//删除动态数组
}
//拷贝构造
//此时在拷贝构造函数中软件类型改成“B”, 存储介质改为"H",其它不变。
Software::Software(const Software& s) :limit_day(s.limit_day)//:limit_day(s.limit_day) 把这个对象的limitday赋值成s对象里面的limitday
{
//此处赋值原理同上 (构造函数那里)
int n = 0;
for (int i = 0; s.name[i] != '\0'; i++)
{
n++;
}
name = new char[n + 1];
for (int i = 0; i < n; i++)
{
name[i] = s.name[i];
}
name[n] = '\0';
//此时在拷贝构造函数中软件类型改成“B”, 存储介质改为"H",其它不变。
m_type = 'B';
m_media = 'H';
}
int Software::calculate()//判断是否过期
{
if (limit_day.getYear() == 0 && limit_day.getMonth() == 0 && limit_day.getDay() == 0)
{
return 1;
}
else if (limit_day.getYear() <= 2015 && limit_day.getMonth() <= 4 && limit_day.getDay() < 7)
{
return 2;
}
else //计算剩余几天过期
{
//15年单独算
if (limit_day.getYear() == 2015)
{
int result = 0;
CDate date(2015, 4, 7);
result = limit_day.getDayofYear() - date.getDayofYear();
return result;
}
else//16年之后
{
int Y = limit_day.getYear();//Y 年份
int result = 0;
CDate date(2015, 4, 7);
result = limit_day.getDayofYear() + 365 - date.getDayofYear();//算15年的剩下日子 和最后一年过去的日子
//补中间的年份 日子
for (int i = 2016; i < Y; i++)
{
result += 365;
//year % 4 == 0 && year % 100 != 0) || year % 400 == 0
//闰年多一天
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
{
result++;
}
}
return result;
}
}
}
void Software::print()
{
cout << "name:" << name << endl;
cout << "type:";
if (m_type == 'O')
{
cout << "original" << endl;
}
else if (m_type == 'B')
{
cout << "backup" << endl;
}
else
{
cout << "trial" << endl;
}
cout << "media:";
if (m_media == 'D')
{
cout << "optical disk" << endl;
}
else if (m_media == 'H')
{
cout << "hard disk" << endl;
}
else
{
cout << "USB disk" << endl;
}
int flag = this->calculate();//this->calculate()这个对象的calculate函数
if (flag == 1)
{
cout << "this software has unlimited use" << endl;
}
else if (flag == 2)
{
cout << "this software has expired" << endl;
}
else
{
cout << "this software is going to be expired in " << flag << " days" << endl;
}
cout << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
char p[30];//名字
char type;//类型
char media;//介质
int year, month, day;
cin >> p >> type >> media >> year >> month >> day;
CDate date(year, month, day); //先构造日期
Software my_software(p, type, media, date);//再构造软件类
my_software.print();//打印信息
Software copy_software(my_software);//拷贝构造
copy_software.print();
}
// system("pause");
return 0;
}