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

#include<iostream>
using namespace std;
class CDate
{
private:
    int year, month, day;
public:
    CDate(int y, int m, int d);
    bool isLeapYear(int year);
    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(int year)
{
    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;
    if(year>2015){
        for (int j = 2015; j < year; j++) {
            if (isLeapYear(j))
                sum += 366;
            else
                sum += 365;
        }
    }
    int a[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (isLeapYear(year))
    {
        a[2]++;
    }// 求日期的天数
    for (i = 0; i < month; i++)
    {
        sum += a[i];
    }
    return sum;
}
class soft {
    string name;
    char type, medium;
    CDate num;
public:
    soft(string name1, char type1, char medium1, int year1, int month1, int day1) :num(year1, month1, day1) {
        name = name1;
        type = type1;
        medium = medium1;
    }
    soft(soft& s):num(s.num) {
        name = s.name;
        type = 'B';
        medium = 'H';
    }
    string getname() {
        return name;
    }
    string gettype() {
        switch (type) {
            case 'O':return "original";
            case 'B':return "backup";
            case 'T':return "trial";
        }
    }
    string getmedium() {
        switch (medium) {
        case'D':return "optical disk";
        case'U':return "USB disk";
        case'H':return "hard disk";
        }
    }
    void printdate() {
        CDate stand_num(2015, 4, 7);
        if (num.getDayofYear() == 0) {
            cout << "this software has unlimited use" << endl << endl;
        }
        else if (num.getDayofYear() < stand_num.getDayofYear()) {
            cout << "this software has expired" << endl << endl;
        }
        else {
            cout << "this software is going to be expired in " << num.getDayofYear() - stand_num.getDayofYear() << " days" << endl << endl;
        }
    }
    void printsw() {
        cout << "name:" << getname() << endl;
        cout << "type:" << gettype() << endl;
        cout << "media:" << getmedium() << endl;
    }
};
int main() {
    int t, y, m, d;
    string name;
    char type, medium;
    cin >> t;
    while (t--) {
        cin >> name >> type >> medium >> y >> m >> d;
        soft sw1(name, type, medium, y, m, d);
        sw1.printsw();
        sw1.printdate();
        soft sw2(sw1);
        sw2.printsw();
        sw2.printdate();  
    }

    return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谁的BUG最难改

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值