题目描述
软件作为一种对象也可以用类来描述,软件的属性包括软件名称、类型
(分别用O、T和B表示原版、试用版还是备份)、有效截至日期(用CDate类
子对象表示)和存储介质(分别用D、H和U表示光盘、磁盘和U盘)等。软件
拷贝可通过拷贝构造函数来实现,此时在拷贝构造函数中软件类型改
成“B”, 存储介质改为"H",其它不变。试完成该类的拷贝构造、构造和
打印(包括从2015年4月7日算起有效期还有多少天,是否过期)成员函数
的实现。
当输入软件有效截止日期是0年0月0日,表示无日期限制,为unlimited;
当输入日期在2015年4月7日之前,则是过期,表示为expired;如果输入
日期在2015年4月7日之后,则显示之后的剩余天数。具体输出信息看输出范例。
输入
测试数据的组数 t
第一个软件名称
第一个软件类型 第一个软件介质类型 第一个软件有效期年 月 日
第二个软件名称
第二个软件类型 第二个软件介质类型 第二个软件有效期年 月 日
......
注意:软件名称最大长度为30;
输出
name: 第一个软件名称
type: 第一个软件类型
media: 第一个软件介质类型
第一个软件2015-4-7后的有效天数
name: 第一个软件名称
type: backup
media: hard disk
第一个软件2015-4-7后的有效天数
......
输入样例1
3
Photoshop_CS5
O D 0 0 0
Audition_3.0
B U 2015 2 3
Visual_Studio_2010
T H 2015 5 5
输出样例1
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
该题主要考察拷贝构造函数的应用,题目较长,注意审题理解题意再动手
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include <iomanip>
#include<cmath>
#include<cstring>
#include<cctype>
#include<queue>
#include<set>
using namespace std;
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 y, int m, int d);
};
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;
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;
}
void CDate::set(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
class sw
{
char name[35];
char type;
char save;
CDate t;//方便在这里
public:
sw(char* n, char t, char s,int y,int m,int d);
sw( sw& obj);
void print();
};
void sw::print()
{
cout << "name:" << name << endl;
cout << "type:";
if (type == 'O')cout << "original" << endl;
else if (type == 'B')cout << "backup" << endl;
else if (type == 'T')cout << "trial" << endl;
cout << "media:";
if (save == 'D')cout << "optical disk" << endl;
else if (save == 'U')cout << "USB disk" << endl;
else if (save == 'H')cout << "hard disk" << endl;
int data1 = t.getDayofYear();
int data2 = 97;//2015/4/7
if (data1 == 0)
{
cout << "this software has unlimited use" << endl;
}
else if (data1 < data2)
{
cout << "this software has expired" << endl;
}
else if (data1 >= data2)
{
cout<<"this software is going to be expired in "<<data1-data2<<" days"<<endl;
}
cout << endl;
}
sw::sw( sw& obj)
{
strcpy(name, obj.name);
this->type = 'B';
this->save = 'H';
t.set(obj.t.getYear(), obj.t.getMonth(), obj.t.getDay());//嵌套
}
sw::sw(char* n, char tt, char s,int y,int m,int d)
{
t.set(y, m, d);
strcpy(name, n);
type = tt;
save = s;
}
int main()
{
int t,y,m,d;
char name[35];
char type, save;
cin >> t;
while (t--)
{
cin >> name;
cin >> type >> save;
cin >> y >> m >> d;
sw sw1(name, type, save,y,m,d);
sw1.print();
sw sw2(sw1);
sw2.print();
}
return 0;
}