类的声明.h
#pragma once
#include<iostream>
using namespace std;
class Date
{
int Year, Month, Day;
int JudgeYear(int Year);
Date ChangeDate(int Days);
int ChangeDays(int Year, int Month, int Day);
friend void Test(int decision);
friend ostream& operator<<(ostream& cout, Date D);
public:
Date();
int MonthDays(int n,int flag);
Date(int m_Year, int m_Month, int m_Date);
//某日期加上一个天数得到新的日期
Date operator + (Date D)
{
Date D2;
D2.Year = Year + D.Year;
D2.Month = Month + D.Month;
D2.Day = Day + D.Day;
int flag = Date::JudgeYear(Year);
if (D2.Day > MonthDays(Month, flag))
{
Month++;
Day = Day % MonthDays(Month - 1, flag);
}
do{
Month = Month % 12;
D2.Year++;
} while (D2.Month > 12);
return D2;
}
//某日期减去一个天数得到新的日期
Date &operator - (Date D)
{
Date D2;
D2.Year = Year - D.Year;
D2.Month = Month -D.Month;
D2.Day = Day - D.Day;
int flag = Date::JudgeYear(Year);
if (D2.Day <0)
{
Month--;
D2.Day = Day + MonthDays(Month, flag);
}
do {
D2.Month += 12;
D2.Year--;
} while (D2.Month < 0);
return D2;
}
};
成员函数.cpp
#include"类的声明.h"
Date::Date()
{
Year = 0;
Month = 0;
Day = 0;
}
Date::Date(int m_Year, int m_Month, int m_Day)
{
Year = m_Year;
Month = m_Month;
Day = m_Day;
}
//判断年份是否是闰年
int Date::JudgeYear(int Year)
{
if ((Year % 4 == 0 && Year % 400 != 0) || Year % 400 == 0)
return 1;
else return 0;
}
//返回不同月份的天数
int Date::MonthDays(int n,int flag)
{
switch (n)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
return 31;
break;
case 2:if (flag == 1)
return 29;
else
return 28;
break;
default:return 30;
break;
}
}
//将指定的0年0月0日起的天数转换成对应的日期的函数
Date Date::ChangeDate(int Days)
{
int sum = 0;
int monthdays[2][12] = { {31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31} };
if (Days / (365 * 3) == 0||Days%(365*3)==0)
{
Year = Days / 365;
int x = Days % 365;
int i = 0;
for (i = 0;i < 12;i++)
{
sum = sum + monthdays[0][i];
if (x < sum)
break;
}
Month = i + 1;
Day = x%(sum-monthdays[0][i]);
}
if (Days / (365*3) >= 1)
{
if (Days / (365 * 3) == 1)
{
Year = Days / 365+1;
int x = Days % 365;
int i = 0;
for (i = 0;i < 12;i++)
{
sum = sum + monthdays[1][i];
if (x < sum)
break;
}
Month = i + 1;
Day = x % (sum - monthdays[1][i]);
}
else
{
int x = Days % (365 * 3 + 366);
Year = Days / (365 * 3 + 366) * 4 + Days % (365 * 3 + 366) / 365+1;
int i = 0;
for (i = 0;i < 12;i++)
{
sum = sum + monthdays[0][i];
if(x < sum)
break;
}
Month = i + 1;
Day = monthdays[0][i] - (sum % x);
}
}
return *this;
}
//将指定日期转换成从0年0月0日起的天数的函数
int Date::ChangeDays(int Year, int Month, int Day)
{
int days = 0;int eve = 0;
int flag = Date::JudgeYear(Year);
for (int i = 0;i < Month;i++)
{
eve = MonthDays(i, flag);
days = days + eve;
}
if (Year <= 4)
{
days = days + Day;
}
if (Year > 4)
{
int n = Year / 4;
int y = Year % 4;
days = days + n * (365 * 3 + 366) + 365 * (y - 1);
}
return days;
}
ostream& operator<<(ostream& cout, Date D)
{
cout << "年份:" << D.Year << "\n" << "月份:" << D.Month << "\n" << "日期:" << D.Day << endl;
return cout;
}
主函数实现.cpp
#include "类的声明.h"
void Test(int decision)
{
Date D;
Date D1;
switch (decision)
{
//1.某日期加上一个天数得到新的日期
case 1:
int Year, Month, Day, days;
cout << "输入所要操作的日期:" << "\n" << "年份:" << endl;
cin >> Year;
cout << "月份:" << endl;
cin >> Month;
cout << "日期" << endl;
cin >> Day;
cout << "输入要加上的天数" << endl;
cin >> days;
D.Date::Date(Year, Month, Day);
D1.Date::ChangeDate(days);
D.operator+(D1);
cout << "新的日期为" << D << endl;
break;
//2.某日期减去一个天数得到新的日期
case 2:
int Days;
cout << "输入要转换的天数" << endl;
cin >> Days;
D.Date::ChangeDate(Days);
D.operator+(D1);
cout << "新的日期为" << "\t" << D;
break;
//3.计算两个日期的天数差
case 3:
Date D1, D2;
cout << "输入要相减的两个日期的年月日:" << endl;
int y1, m1, d1, y2, m2, d2;
cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
D1 = Date::Date(y1, m1, d1);
D2 = Date::Date(y2, m2, d2);
Date D3 = D1.operator-(D2);
days = D3.ChangeDays(D3.Year, D3.Month, D3.Day);
cout << "相差的天数为:" << days << endl;
}
}
int main()
{
Date D(0, 0, 0);
int decision;
cout << "输入要进行的操作:" << "\n" << "1.某日期加上一个天数得到新的日期" << "\n" << "2.某日期减去一个天数得到新的日期" << "\n"
<< "3.计算两个日期的天数差" << endl;
cin >> decision;
Test(decision);
}
为什么这段代码运行到一半就会显示未初始化的异常,应该怎么修改?