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日之后,则显示之后的剩余天数。具体输出信息看输出范例。

输入

测试数据的组数 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

该题主要考察拷贝构造函数的应用,题目较长,注意审题理解题意再动手

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include <iomanip>
#include<cmath>
#include<cstring>
#include<cctype>
#include<queue>
#include<set>
using namespace std;

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 y, int m, int d);
};
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;
    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;
}
void CDate::set(int y, int m, int d)
{
    year = y;
    month = m;
    day = d;
}
class sw
{
    char name[35];
    char type;
    char save;
    CDate t;//方便在这里
public:
    sw(char* n, char t, char s,int y,int m,int d);
    sw( sw& obj);
    void print();
};
void sw::print()
{
    cout << "name:" << name << endl;
    cout << "type:";
    if (type == 'O')cout << "original" << endl;
    else if (type == 'B')cout << "backup" << endl;
    else if (type == 'T')cout << "trial" << endl;
    cout << "media:";
    if (save == 'D')cout << "optical disk" << endl;
    else if (save == 'U')cout << "USB disk" << endl;
    else if (save == 'H')cout << "hard disk" << endl;
    int data1 = t.getDayofYear();
    int data2 = 97;//2015/4/7
    if (data1 == 0)
    {
        cout << "this software has unlimited use" << endl;
    }
    else if (data1 < data2)
    {
        cout << "this software has expired" << endl;
    }
    else if (data1 >= data2)
    {
        cout<<"this software is going to be expired in "<<data1-data2<<" days"<<endl;
    }
    cout << endl;
}
sw::sw( sw& obj)
{
    strcpy(name, obj.name);
    this->type = 'B';
    this->save = 'H';
    t.set(obj.t.getYear(), obj.t.getMonth(), obj.t.getDay());//嵌套
}
sw::sw(char* n, char tt, char s,int y,int m,int d)
{
    t.set(y, m, d);
    strcpy(name, n);
    type = tt;
    save = s;
}
int main()
{
    int t,y,m,d;
    char name[35];
    char type, save;
    cin >> t;
    while (t--)
    {
        cin >> name;
        cin >> type >> save;
        cin >> y >> m >> d;
        sw sw1(name, type, save,y,m,d);
        sw1.print();
        sw sw2(sw1);
        sw2.print();
    }
    return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZZZWWWFFF_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值