> 文章列表 > 【id:52】【20分】D. 软件备份(拷贝构造函数)

【id:52】【20分】D. 软件备份(拷贝构造函数)

【id:52】【20分】D. 软件备份(拷贝构造函数)

题目描述

软件作为一种对象也可以用类来描述,软件的属性包括软件名称、类型(分别用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<iostream>
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;
}