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;
}
本文详细介绍了C++中的日期类CDate,包括构造函数、闰年判断和日期计算功能。同时展示了如何创建和操作包含日期限制的软件类,以及拷贝构造和过期检查的方法。

1054

被折叠的 条评论
为什么被折叠?



