【C++OJ拷贝构造】软件备份(拷贝构造函数)

【C++OJ拷贝构造】软件备份(拷贝构造函数)

题目描述

软件作为一种对象也可以用类来描述,软件的属性包括软件名称、类型(分别用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) { year = y; month = m; day = d; }
bool isLeapYear() { return (year%4 == 0 && year%100 != 0) || year%400 == 0; }
int getYear() { return year; }
int getMonth() { return month; }
int getDay() { return day; }
int getDayofYear() //计算日期从当年1月1日算起的天数
{
int i, sum=day;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

if (isLeapYear())
for(i=0;i<month;i++) sum +=b[i];
else
for(i=0;i<month;i++) sum +=a[i];

return sum;
}
};

输入

测试数据的组数 t

第一个软件名称

第一个软件类型 第一个软件介质类型 第一个软件有效期年 月 日

第二个软件名称

第二个软件类型 第二个软件介质类型 第二个软件有效期年 月 日

输出

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>
#include <cstring>
#include <iomanip>
using namespace std;

class CDate
{
private:
    int year, month, day;

public:
    CDate() {} //无参构造函数
    CDate(int y, int m, int d)
    {
        year = y;
        month = m;
        day = d;
    }
    void set(int y, int m, int d)
    {
        year = y;
        month = m;
        day = d;
    }
    bool isLeapYear() { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; }
    int getYear() { return year; }
    int getMonth() { return month; }
    int getDay() { return day; }
    int getDayofYear() //计算日期从当年1月1日算起的天数
    {

        int i, sum = day;
        int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int b[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        if (isLeapYear())
            for (i = 0; i < month; i++)
                sum += b[i];
        else
            for (i = 0; i < month; i++)
                sum += a[i];

        return sum;
    }
};

class soft
{
private:
    char *name;
    char type;  //类型(分别用O、T和B表示原版、试用版还是备份)
    CDate d1;   //效截至日期(用CDate类子对象表示)
    char store; //存储介质(分别用D、H和U表示光盘、磁盘和U盘)
public:
    soft(char *n, char t, char s, int y, int m, int d) //构造函数
    {
        name = new char[strlen(n) + 1];
        strcpy(name, n);
        type = t;
        store = s;
        d1.set(y, m, d);
    }
    soft(soft &s1) //拷贝构造函数
    {
        name = new char[strlen(s1.name) + 1]; //要new一个新空间存放指针,完成深拷贝
        strcpy(name, s1.name);
        type = 'B';  //软件类型改成“B”
        store = 'H'; //存储介质改为"H"
        d1 = s1.d1;  //其它不变
    }
    void print() //打印
    {
        cout << "name:" << name << endl;
        switch (type)
        {
        case 'O':
            cout << "type:original" << endl;
            break;
        case 'T':
            cout << "type:trial" << endl;
            break;
        case 'B':
            cout << "type:backup" << endl;
            break;
        }
        switch (store)
        {
        case 'D':
            cout << "media:optical disk" << endl;
            break;
        case 'H':
            cout << "media:hard disk" << endl;
            break;
        case 'U':
            cout << "media:USB disk" << endl;
            break;
        }
        if (d1.getDay() == 0 && d1.getMonth() == 0 && d1.getYear() == 0)
            cout << "this software has unlimited use" << endl;
        else if ((d1.getYear() >= 2015 && d1.getMonth() >= 4 && d1.getDay() >= 7) || (d1.getYear() >= 2015 && d1.getMonth() > 4))
        {
            cout << "this software is going to be expired in " << d1.getDayofYear() - 97 << " days" << endl; //一年的天数减去到4月7日的天数
        }
        else
        {
            cout << "this software has expired" << endl;
        }
    }

    ~soft() //析构函数,释放new的name空间
    {
        delete[] name;
    }
};

int main()
{
    int t;
    cin >> t;
    int y, d, m;
    char name[100], type, store;

    while (t--)
    {
        cin >> name >> type >> store >> y >> m >> d;
        soft s2(name, type, store, y, m, d);
        s2.print();
        cout << endl;
        soft s3(s2);
        s3.print();
        cout << endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ferry_xie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值