【C++】类练习题,编写程序,用于日期的相关计算

**

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;
}

程序运行截图
在这里插入图片描述
本人大一,看见一个题目,就把他写了一下,并且稍微做了一下优化,算法和代码略微粗糙,希望各路大神多多指点

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值