**
C++类练习题:实现一个用于日期计算的程序
**
*题目:编写程序
1.可以判断闰年
2.可以计算两个日的间隔天数
3.可以计算一个日期加上一定天数后的新日期
题目分析:
判断闰年:
四年一闰,一百年不闰,四百年再闰
计算日期间隔的天数 :
分别计算两个日期在当年的天数
再计算两个年份间隔的时间
计算加上一定天数后的新日期
加和后如果超过当前月份
月份加一
月份加和超过12
年份加一
采用了多文件结构
自定义头文件,类的定义
//自定义头文件,类的定义
#ifndef Class
#define Class //为了防止头文件被重复包含
class Date //Date类
{
public:
Date(int year = 1900, int month = 1, int day = 1) //默认构造函数
{
d_year = year;
d_month = month;
d_day = day;
}
void SetDate(int, int, int); //设置年、月、日
void SetYear(int); //设置年
void SetMonth(int); //设置月
void SetDay(int); //设置日
void GetDate(int, int, int);
int GetYear();
int GetMonth();
int GetDay();
void PrintDate();
static int IsLeapYear(int); //判断闰年
Date NewDate(Date, int); //判断加一定天数后的新日期
friend int DateComp(Date, Date); //比较两个类的年份的大小
static int GetSkip(Date, Date); //用于获得两个日期的时间间隔
private:
static const int d_monthDays[2][12]; //二维数组用于区分闰年和平年
int d_year;
int d_month;
int d_day;
};
#endif
设置日期函数的定义
#include<iostream>
#include"ClassDate.h"
using namespace std;
void Date::SetDate(int y, int m, int d) //设置日期
{
if (y < 1500 || y>2500)
{
cout << "Year is wrong !!!(将自动初始化为1900年)";
return;
}
if (m < 0 || m>12)
{
cout << "Month is wrong !!!(将自动初始化为1月)";
return;
}
if (d<0 || d>d_monthDays[Date::IsLeapYear(y)][m - 1])
{
cout << "Day is wrong !!!(将自动初始化为1日)";
return;
}
d_year = y;
d_month = m;
d_day = d;
}
设置年、月、日函数的定义
#include<iostream>
#include"ClassDate.h"
using namespace std;
void Date::SetYear(int y)
{
if (y < 1500 || y>2500)
{
cerr << "Year is wrong !!!(将自动初始化为1900年)";
return;
}
d_year = y;
}
void Date::SetMonth(int m)
{
if (m < 0 || m>12)
{
cerr << "Month is wrong !!!(将自动初始化为1月)";
return;
}
d_month = m;
}
void Date::SetDay(int d)
{
if (d<0 || d>d_monthDays[Date::IsLeapYear(d_year)][d_month - 1])
{
cerr << "Day is wrong !!!(将自动初始化为1日)";
return;
}
d_day = d;
}
所有获得函数的定义
#include<iostream>
#include"ClassDate.h"
using namespace std;
void Date::GetDate(int y, int m, int d) { y = d_year; m = d_month; d = d_day; }
int Date::GetYear() { return d_year; }
int Date::GetMonth() { return d_month; }
int Date::GetDay() { return d_day; }
判断闰年和输出函数的定义
#include<iostream>
#include"ClassDate.h"
using namespace std;
int Date::IsLeapYear(int y)
{
if (y % 4 == 0 || y % 400 == 0 && y % 100 != 0)
return 1;
else
return 0;
}
void Date::PrintDate()
{
cout << d_year << "年" << d_month << "月" << d_day << "日" << endl;
}
用于计算新日期的函数的定义
//函数用于计算加一定天数后的新日期
#include<iostream>
#include"ClassDate.h"
using namespace std;
Date Date::NewDate(Date x, int days) //形参为对象和整型的变量
{
Date tmpDate; //定义临时对象
int d = x.d_day; //定义三个整数分别获取年、月、日
int m = x.d_month;
int y = x.d_year;
int monthday;
if (days >= 0) //days>0,向后推迟日期
{
while (true)
{
monthday = Date::d_monthDays[Date::IsLeapYear(y)][m - 1];
if (d + days <= monthday) //如果加和之后没有超过当前月份,就直接退出
break;
days -= monthday - d; //如果超过了,则计算超过了几天
m++; //月份加一
if (m == 13) //月份如超过12
{
y++; //年份加一
m = 1;
}
d = 0;
}
tmpDate.SetDate(y, m, d + days); //调用设置日期函数
}
else
{
days = -days;
while (true)
{
if (d > days)
break;
days -= d;
m--;
if (m == 0)
{
y--;
m = 12;
}
monthday = Date::d_monthDays[Date::IsLeapYear(y)][m - 1];
d = monthday;
}
tmpDate.SetYear(y);
tmpDate.SetMonth(m);
tmpDate.SetDay(d - days);
}
return tmpDate; //最后返回一个对象
}
两个日期所间隔的天数的函数的定义
//函数用于计算两个日期相隔的天数
#include<iostream>
#include<cmath>
#include"ClassDate.h"
int Date::GetSkip(Date dt1, Date dt2)
{
int days1 = 0, days2 = 0, years = 0, skip = 0, i, flag;
Date tmp1, tmp2; //定义两个临时对象
flag = DateComp(dt1, dt2); //调用比较函数,比较两个对象所有的年份的大小
if (flag >= 0) //通过if语句,总是将年份最大的那个赋给tmp1
{
tmp1 = dt1;
tmp2 = dt2;
}
else
{
tmp1 = dt2;
tmp2 = dt1;
}
for (i = 1; i < tmp1.d_month; i++)
days1 += Date::d_monthDays[Date::IsLeapYear(tmp1.d_year)][i - 1];
days1 += tmp1.d_day; //计算这个日期在这一年的天数
for (i = 1; i < tmp2.d_month; i++)
days2 += Date::d_monthDays[Date::IsLeapYear(tmp2.d_year)][i - 1];
days2 += tmp2.d_day;
for (i = tmp2.d_year; i < tmp1.d_year; i++) //计算两个年份相差的天数
{
if (Date::IsLeapYear(i))
years += 366;
else
years += 365;
}
skip = abs(years + days1 - days2); //无论大小,调用绝对值函数使间隔日期为正数
return skip; //返回这个值
}
int DateComp(Date dt1, Date dt2)
{
if (dt1.d_year >= dt2.d_year)
return 1;
else
return -1;
}
主函数
#include<iostream>
#include"ClassDate.h"
using namespace std;
const int Date::d_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 } };
int main()
{
cout << "+-+-+-+-+-+-+-+-+-+" << endl;
cout << " 日期计算器 " << endl;
cout << "+-+-+-+-+-+-+-+-+-+" << endl;
while (true)
{
cout << endl;
int f;
cout << "请选择功能: " << endl;
cout << "\t1.判断闰年 " << endl;
cout << "\t2.计算增加/减少天数后的新日期" << endl;
cout << "\t3.计算两个日期的间隔天数" << endl;
cout << "\t0.退出程序" << endl;
cin >> f;
if (f == 1)
{
Date dt;
int year;
cout << "请输入年份:" << endl;
cin >> year;
dt.SetYear(year);
if (dt.IsLeapYear(dt.GetYear()))
{
cout << dt.GetYear() << "年为闰年" << endl;
}
else
cout << dt.GetYear() << "年为平年" << endl;
}
if (f == 2)
{
Date dt;
int y, m, d, days;
cout << "请输入日期:(年/月/日用空格隔开)" << endl;
cin >> y >> m >> d;
dt.SetDate(y, m, d);
cout << "请输入需要增加或减少的天数:" << endl;
cin >> days;
cout << "变更后的新日期:";
dt.NewDate(dt, days).PrintDate();
}
if (f == 3)
{
Date dt_1, dt_2;
int y1, m1, d1, y2, m2, d2;
cout << "请输入第一个日期:(年/月/日用空格隔开)" << endl;
cin >> y1 >> m1 >> d1;
dt_1.SetDate(y1, m1, d1);
cout << "请输入第二个日期:(年/月/日用空格隔开)" << endl;
cin >> y2 >> m2 >> d2;
dt_2.SetDate(y2, m2, d2);
cout << "相差:" << Date::GetSkip(dt_1, dt_2) << "天" << endl;
}
if (f == 0)
break;
}
system("pause");
return 0;
}
程序运行截图
本人大一,看见一个题目,就把他写了一下,并且稍微做了一下优化,算法和代码略微粗糙,希望各路大神多多指点