【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
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;
}

你可能感兴趣的:(oj,c++,java,算法,c++)