【C++】万年历的实现

/******************************************************************************************
Date.hpp:
	Copyright (c) Bit Software, Inc.(2013), All rights reserved.

Purpose:
	声明并实现一个万年历类【腾讯面试题】

Author:
	xxx

Created Time:
	2015-4-26
******************************************************************************************/
class Time
{
public:
	Time(int hour = 1)
	{
		_hour = hour;
	}
	Time(const Time& t)
	{
		_hour = t._hour;
	}
	Time& operator=(const Time& t)
	{
		this->_hour = t._hour;
		return *this;
	}

private:
	int _hour;
};

class Date
{
public:
	// 初始化列表进行初始化。
	Date (int year = 1900, int month = 1, int day = 1, const Time& t = 1)
	:_year(year)
	,_month(month)
	,_day(day)
	,_t(t)
	{}

	Date (const Date& d)
	:_year(d._year)
	,_month(d._month)
	,_day(d._day)
	,_t(d._t)
	{}

	Date& operator=(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
		_t = d._t;
		return *this;
	}
	void Display ()
	{
		cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
	}
public:
	//
	// 比较日期的运算符重载
	//
	bool operator == (const Date& d)
	{
		return _year == d._year && _month == d._month
			&& _day ==d._day;
	}
	bool operator != (const Date& d)
	{
		return _year != d._year || _month != d._month
			|| _day !=d._day;
	}
	bool operator > (const Date& d)
	{
		if(_year>d._year )
		{
			return 1;
		}
		else if(_year<d._year )
		{
			return 0;
		}
		else
		{
			if (_month > d._month )
			{
				return 1;
			}
			else if (_month < d._month )
			{
				return 0;
			}
			else
			{
				if(_day > d._day )
				{
					return 1;
				}

				else
				{
					return 0;
				}
			}
		}
		return 0;
	}
	bool operator >= (const Date& d)
	{
			if(_year>d._year )
		{
			return 1;
		}
		else if(_year<d._year )
		{
			return 0;
		}
		else
		{
			if (_month > d._month )
			{
				return 1;
			}
			else if (_month < d._month )
			{
				return 0;
			}
			else
			{
				if(_day >= d._day )
				{
					return 1;
				}
				else
				{
					return 0;
				}
			}
		}
		return 0;
	}

	bool operator < (const Date& d)
		{
		if(_year<d._year )
		{
			return 1;
		}
		else if(_year>d._year )
		{
			return 0;
		}
		else
		{
			if (_month < d._month )
			{
				return 1;
			}
			else if (_month > d._month )
			{
				return 0;
			}
			else
			{
				if(_day < d._day )
				{
					return 1;
				}

				else
				{
					return 0;
				}
			}
		}
		return 0;
	}
	bool operator <= (const Date& d)
			{
		if(_year<d._year )
		{
			return 1;
		}
		else if(_year>d._year )
		{
			return 0;
		}
		else
		{
			if (_month < d._month )
			{
				return 1;
			}
			else if (_month > d._month )
			{
				return 0;
			}
			else
			{
				if(_day <= d._day )
				{
					return 1;
				}

				else
				{
					return 0;
				}
			}
		}
		return 0;
	}

	//
	// 计算一个日期加减一个天数以后的日期。
	//

	int GetMonDay(int year,int month)
	{
		static int array[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
		if((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0))
		{
			array[2] = 29;
		}
	return array[month];
	}

	Date operator+(int day)
	{
		Date tmp(*this);
		tmp._day += day;
		while(tmp._day > GetMonDay(tmp._year,tmp._month))
		{
			tmp._day -= GetMonDay(tmp._year,tmp._month);
			if(tmp._month ==12)
			{
				++tmp._year;
				tmp._month = 1;
			}
			else
				tmp._month ++;
		}
		return tmp;
	}

	Date operator-(int day)
	{
		Date tmp(*this);
		tmp._day -= day;
		while(tmp._day < 1)
		{
			if(tmp._month ==1)
			{
				tmp._month = 12;
				tmp._year --;
				tmp._day += 31;
			}
			else {
				tmp._month --;
				tmp._day += GetMonDay(tmp._year,tmp._month);
			}

		}
		return tmp;
	}
	Date& operator-=(int day)
	{
		_day -= day;
		while(_day < 1)
		{
			if(_month == 1)
			{
				_year--;
				_month = 12;
				_day += GetMonDay(_year,_month);
			}
		}
		return *this;
	}
	Date& operator+=(int day)
	{
		_day += day;
		while(_day > GetMonDay(_year,_month))
		{
			_day = _day - GetMonDay(_year,_month);
			if(_month == 12)
			{
				_year++;
				_month = 1;

			}
			else
			{
				_month++;
			}
		}
		return *this;
	}

	const Date& operator++()	// 前置++
	{
		_day++;
		if(_day > GetMonDay(_year,_month))
		{
			if(_month == 12)
			{
				_year++;
				_month = 1;
				_day = 1;
			}
			else
			{
				_month++;
			    _day =1;
			}
		}
		return *this;
	}
	Date operator++(int)		// 后置++
	{
		Date tmp(*this);
		_day ++;
		if(_day > GetMonDay(_year,_month))
		{
			if(_month ==12)
			{
				_year++;
				_month = 1;
				_day =1;
			}
			else
			{
				_month ++;
				_day =1;
			}
		}
		return tmp;
	}
	const Date& operator--()	// 前置--
	{
		_day--;
		if(_day < 1)
		{
			if(_month == 1)
			{
				_year--;
				_month = 12;
				_day = 31;
			}
			else
			{
				_month--;
				_day = GetMonDay(_year,_month);
			}
		}
		return *this;
	}
	Date operator--(int)		// 后置--
	{
		Date tmp(*this);
		_day --;
		if(_day < 1)
		{
			if(_month == 1)
			{
				_year--;
				_month = 12;
				_day = 31;
			}
			else
			{
				_month--;
				_day = GetMonDay(_year,_month);
			}
			return tmp;
		}

	}
	//
	// 两个日期相加没有意义
	// 计算两个日期相减以后的差的天数
	//
	int operator-(const Date& d)
	{
		if(*this > d)
		{
			Date d1 = d;//xiao
			Date d2 =*this;//da
		}
	}
private:
	int _year;
	int _month;
	int _day;

	//const int _testConst;
	//int& _testRef;
	Time _t;
};

void TestDate()
{
	Date d1(2015,1,1);
	d1.Display ();
	//Date d2(2015,8,18);
	//d2.Display();
	/*int ret = (d1==d2);
	cout<<ret<<endl;
	int ret = (d1!=d2);
	cout<<ret<<endl;
	int ret = (d1<=d2);
	cout<<ret<<endl;*/
    d1+=40;
	d1.Display();

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 08:48:43

【C++】万年历的实现的相关文章

算法,java代码实现打印万年历

万年历 以1900年1月1号星期一为时间原点 星期日 第一天 星期一 第二天 星期二 第三天 星期三 第四天 星期四 第五天 星期五 第六天 星期六 第七天 1.计算出当前日期距离原点的天数(例:2016/9/18) 2015到1900之间有多少个瑞年和平年-->count1 2016年一月到八月的总天数-->count2 本月的一号 count = count1+count2+1 2.计算出本月的一号是一周的第几天 k = count%7;(打印一号前面有多少空格) 3.计算出该月有多少天

结对项目 万年历

一.题目简介 所选项目名称:万年历. 项目需求描述,主要指应实现的主要功能. 实现了日历的查询,方便使用.界面主要是由查询输入部分和结果显示部分两部分组成. 查询输入:①一个文本域,用于输入年份. ②一个选择下拉列表框:用于选择月份. ③ 一个选择按钮:用来选择查询事件. 四.代码地址  https://github.com/huangjingyi/wannianli/blob/master/wannianli   五.结对分工过程 首先应该是结对编程可提高效率,结对编程的时候,两个人可以分开做

万年历算法的实现(C语言--gcc编译)

/** cal.c * * 现行的格里历是从儒略历演化而来的.儒略历每4年一个润年,润年366天,平年365天.* 如果从公元1年算的话,那么凡是能够被4整除的都是润年.从天文角度看,儒略历这种 * 历法是有误差的,到16世纪误差已经达到了10天.1582年,罗马教皇对儒略历进行了 * 一次校定,该年的10-5到10-14这10天被抹掉,并规定凡不能被400整除的世纪年不再 * 算为润年,校定之后的儒略历即为现行的格里历. * * 但是英国直到1752年才开始使用格里历,此时时间误差已经达到了1

万年历制作

#include<iostream>#include<iomanip> using namespace std; void printMonth(int year, int month);void printMonthTitle(int year, int month);void printMonthName(int month);void printMonthBody(int year, int month);int getStartDay(int year, int month

第一阶段测试题大题整理(冒泡排序,去重,万年历)以及改错--2017-03-26

1.冒泡排序法: 五星级重点 <script> var arr=Array(); for(var i=0;i<=5;i++){ var j=prompt("请输入第"+i+"个数"); j=parseInt(j); arr.push(j); } for(var x=0;x<arr.length;x++){ for(var y=x+1;y<arr.length;y++){ if(arr[x]<arr[y]){ var temp=ar

php万年历

上图是效果,刚学php,写个万年历玩玩- <!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>php万年历</title>    <style>        #dusk{            text-align:center;            padding-top:50px;        }        h1{

冒泡排序,去重,万年历

一.冒泡排序法 <script> var arr=Array(); for(var i=0;i<=5;i++){ var j=prompt("请输入第"+i+"个数"); j=parseInt(j); arr.push(j); } for(var x=0;x<arr.length;x++){ for(var y=x+1;y<arr.length;y++){ if(arr[x]<arr[y]){ var temp=arr[x];  

基于至简设计法实现的万年历功能

一.  功能描述 1.上板复位后从元年1月1号开始计数,为方便上板调试,将一天的时间压缩为1秒: 2.按键用于设置日历,按下按键0进入设置状态,再次按下按键0退出设置状态: 3.按键1来选择想要设置的年月日的各个位: 4.按键2在设置状态进行计数设置,每按下一次数码管显示数字加1: 5.平年365天(52周+1天),闰年366天(52周+2天).平年2月28天,闰年2月29天. 6.闰年:每400年整一闰,或每4年且不为百年的一闰.即能被400整除,或不能被100整除但能被4整除的年份为闰年.

在线万年历

在线万年历 1.概述 在计算机没有普及的年代,要查找多年前某天对应的农历日期,就不得不翻阅一本厚厚的万年历进行查询.如今,随着计算机网络的普及,只要利用任意搜索引擎搜索“在线万年历”就可以搜索出很多功能强大的万年历.本实例向大家介绍的是在线万年历的实现过程,通过本程序可以查询从1901年到2049年中任何一天的具体的农历日期.节日.星期等信息.在线万年历可以作为一个单独的程序来运行也可以嵌套在某网站中作为一个子模块来实现.例如将在线万年历系统嵌套在留言板模块中,在“备忘录”子模块中添加万年历功能

javascript版万年历

1 <!DOCTYPE html PUBLIC "-//W3C//Dtd XHTML 1.0 transitional//EN" "http://www.w3.org/tr/xhtml1/Dtd/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="