【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后的有效天数

......

样例查看模式

正常显示查看格式

输入样例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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值