D. 软件备份(拷贝构造函数)

aa

#include<iostream>
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 11;
	}
	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 == 11)
	{
		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 na[30];//名字
		char type;//类型
		char media;//介质
		int year, month, day;
		cin >> na >> type >> media >> year >> month >> day;
		CDate date(year, month, day);  //先构造日期
		Software my_software(na, type, media, date);//再构造软件类
		my_software.print();//打印信息
		Software copy_software(my_software);//拷贝构造
		copy_software.print();

	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值