题目描述
软件作为一种对象也可以用类来描述,软件的属性包括软件名称、类型(分别用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后的有效天数
......
样例查看模式
正常显示查看格式
输入样例1 <-复制
3\n
Photoshop_CS5\n
O D 0 0 0\n
Audition_3.0\n
B U 2015 2 3\n
Visual_Studio_2010\n
T H 2015 5 5
输出样例1
name:Photoshop_CS5\n
type:original\n
media:optical disk\n
this software has unlimited use\n
\n
name:Photoshop_CS5\n
type:backup\n
media:hard disk\n
this software has unlimited use\n
\n
name:Audition_3.0\n
type:backup\n
media:USB disk\n
this software has expired\n
\n
name:Audition_3.0\n
type:backup\n
media:hard disk\n
this software has expired\n
\n
name:Visual_Studio_2010\n
type:trial\n
media:hard disk\n
this software is going to be expired in 28 days\n
\n
name:Visual_Studio_2010\n
type:backup\n
media:hard disk\n
this software is going to be expired in 28 days
#include<iostream>
using namespace std;
//软件的属性包括软件名称、类型(分别用O、T和B表示原版、试用版还是备份)、
//有效截至日期(用CDate类子对象表示)
//和存储介质(分别用D、H和U表示光盘、磁盘和U盘)等。
class CDate
{
private:
int year, month, day;
public:
CDate(){}
CDate(int y, int m, int d);
bool isLeapYear();
int getYear();
int getMonth();
int getDay();
int getDayofYear();
void set(int year, int month, int day)
{
this->year = year;
this->month = month;
this->day = day;
}
};
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;
}
class soft
{
private:
char name[20];
char type;
CDate c;
char deposit;
public:
soft(){}
soft(char* name, char type, CDate c1, char deposit)
{
int len = strlen(name);
for (int i = 0; i < len; i++)
{
this->name[i] = name[i];
}
this->name[len] = '\0';
this->type = type;
c.set(c1.getYear(), c1.getMonth(), c1.getDay());
this->deposit = deposit;
}
soft(soft& s)
{
int len = strlen(s.name);
for (int i = 0; i < len; i++)
{
this->name[i] = s.name[i];
}
this->name[len] = '\0';
this->type = 'B';
c = s.c;
this->deposit = 'H';
}
void date()//判断日期
{
CDate c2(2015, 4, 7);//判断是否过期的标志
if (c.getYear() == 0 && c.getMonth() == 0 && c.getDay() == 0)
{
cout << "this software has unlimited use" << endl;
}
else if (c.getYear() < 2015 || c.getYear() == 2015 && c.getDayofYear() < c2.getDayofYear())
{
cout << "this software has expired" << endl;
}
else
{
cout << "this software is going to be expired in " << c.getDayofYear() - c2.getDayofYear() << " days" << endl;
}
}
void print()
{
cout << "name:";
int len = strlen(name);
for (int i = 0; i < len; i++)
{
cout << name[i];
}
cout << endl;
cout << "type:";
//O、T和B表示原版、试用版还是备份
if (type == 'O')
{
cout << "original" << endl;
}
else if (type == 'B')
{
cout << "backup" << endl;
}
else
{
cout << "trial" << endl;
}
cout << "media:";
switch (deposit) {
case 'D':cout << "media:optical disk" << endl; break;
case 'H':cout << "media:hard disk" << endl; break;
case 'U':cout << "media:USB disk" << endl; break;
}
}
};
/// <summary>
/// 当输入软件有效截止日期是0年0月0日,表示无日期限制,为unlimited;
/// 当输入日期在2015年4月7日之前,则是过期,表示为expired;
/// 如果输入日期在2015年4月7日之后,则显示之后的剩余天数。
/// </summary>
/// <returns></returns>
int main()
{
int t;
cin >> t;
char name[30];
char type;
int year;
int month;
int day;
char deposit;
while (t--)
{
cin >> name;
cin >> type;
cin >> deposit;
cin >> year >> month >> day;
CDate c(year, month, day);
soft s(name, type, c, deposit);
s.print();
s.date();
soft s1(s);
s1.print();
s1.date();
cout << endl;
}
return 0;
}