关闭

C/C++ — 实现日期计算器

标签: 日期计算器
599人阅读 评论(2) 收藏 举报
分类:

实现一个日期计算器




问题介绍:



今天突然看到一个问题看起来蛮有趣的,跟大家分享一下. 给定任意日期对该日期进行加减天数,最后得出加减后出现

的日期.以及两个日期你可以得出他们两个之间相隔多少天.(需要考虑闰年,每个月天数不同,我们需要写一个我们

直接可以使用的日期加减器)因为时间比较仓促,我也没有写界面,只有其中几个主要的函数的架构思想以及简单的调

试就发出来了.






代码实现:


#include<iostream>
#include<Windows.h>
#include<assert.h>
using namespace std;

class Date
{

public:

	Date(int year = 1997,int month = 1,int day = 1)
	:years(year)
	, months(month)
	, days(day)
	{
		assert(IScorrect());
	}

	Date& operator=(const Date& d)
	{
		if (this != &d)
		{
			years = d.years;
			months = d.months;
			days = d.days;
		}
		return *this;
	}

	Date& operator + (int day)
	{
		while (day > 365)
		{
			if (ISleapyear() && day > 366)
			{
				years++;
				day = day - 366;
			}
			else
			{
				years++;
				day = day - 365;
			}
		}
		while (day >= Getmonthsday())
		{	
			//注意这里的次序问题,一定先减 再加 最后再判断. 如果顺序错了会出BUG的.
			day = day - Getmonthsday(); 
			months++;
			if (months > 12)
			{
				years++;
				months = 1;
			}
		}

		while (day > 0)
		{	
			DateAdvance();
			day = day - 1;
			days++;
		}
		return *this;
	}

	Date& operator - (int day) //先减去一年,然后在使用加的重载,所以你只需要写一个无懈可击的加算法就够了.
	{
		while (day > 365)
		{
			if (ISleapyear() && day > 366)
			{			
				day = day - 366;
				years--;
			}
			else
			{
				day = day - 365;
				years--;
			}
		}
		if (ISleapyear())
		{
			day = 366 - day;
			years--;
		}
		else
		{
			day = 365 - day;
			years--;
		}
		operator+(day);
		return *this;
	}

	void DateAdvance() //用于出现可以进化的情况
	{
		if (days > Getmonthsday())
		{
			months++;
			days = 1;
		}
		if (months > 12)
		{
			years++;
			months = 1;
		}
	}
	
	int operator - (Date D)
	{
		int count = 0;
		if (*this > D)
		{
			while (*this != D)
			{
				D.operator+(1);
				count++;
			}
		}
		else
		{
			while (*this != D)
			{
				operator+(1);
				count++;
			}
		}
		return count;
	}

	bool ISleapyear()
	{
		if ((years % 4 == 0 && years % 100 != 0) || (years % 400 == 0))
		{
			return true;
		}
		return false;
	}
	int Getmonthsday()
	{
		int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		if (ISleapyear() && months == 2)
		{
			return 29;
		}
		return monthDays[months];
	}

	void print()
	{
		cout << "目前的时间为";
		cout << years << "." << months << "." <<days<< endl;
	}

	bool IScorrect()
	{
		if (years > 0 && ((years % 4 == 0 && years % 100 != 0) || (years % 400 == 0)) && days < 367)//闰年
		{
			if (months >0 && months < 13)
			{
				if (days > 0 && days <= Getmonthsday())
				{
					return true;
				}
			}
		}
		else if (years >0 && days < 366) //非闰年
		{
			if (months >0 && months < 13)
			{
				if (days > 0 && days <= Getmonthsday())
				{
					return true;
				}
			}
		}
		return false;
	}

	Date operator += (int day)
	{
		*this = *this + 100;
		return *this;
	}
	Date operator -= (int day)
	{
		return *this = *this - day;
	}
	inline Date& operator++()
	{
		*this += 1;
		return *this;
	}
	inline Date operator++(int)
	{
		Date tmp(*this);
		*this = *this + 1;
		return tmp;
	}

	bool operator == (const Date& d)
	{
		return (years == d.years&& months == d.months&&days == d.days);
	}

	bool operator != (const Date& d)
	{
		return !(*this == d);
	}

	bool operator >(const Date& d)
	{
		if (years > d.years ||
			(years == d.years&&months > d.months)
			|| (years == d.years&&months == d.months && days > d.days))
		{
			return true;
		}
		return false;
	}

	bool operator < (const Date& d)
	{
		return !(*this > d);
	}

	bool operator >= (const Date& d)
	{
		return (*this == d) && (*this > d);
	}

	bool operator <= (const Date& d)
	{
		return (*this == d) && (*this < d);
	}

private:
	int years;
	int months;
	int days;
};

void Test()
{
	Date d1(2012, 4, 5);
	Date d2(2013, 4, 5);
	d1.print();
 	/*d1 = d1 - 400;*/
	d1.print();
	cout << d1 - d2 << endl;
	d1.print();
	system("pause");
}




总结:


日期类对我们掌握面向对象这里还是一个蛮重要的知识,你至少要能很熟练很正确地自己快速写出这个整个框架,然后

一个一个实现函数,我只能说很重要,很重要,很重要大家一定要掌握.

2
0
查看评论

【c++巩固练习】c++实现日期计算器、日期万年历(日期类)

日期计算器的功能: 1.可以计算两个日期之间相距多少天。例:2016.5.1-2016.4.1 =  30 2.可以计算一个日期经过n天后的那个日期是什么。例:2016.5.1+40 = 2016.6.10 代码实现如下:(环境:vs2013   语言:c++) 1...
  • XHfight
  • XHfight
  • 2016-07-08 17:00
  • 1619

c++实现计算器功能

有一个作业,需要用C++程序模拟苹果手机的计算器功能,包括加减乘除以及删除(C)和存储(A)
  • sf2020520
  • sf2020520
  • 2018-01-16 20:55
  • 54

C++日期计算器的实现

test.h#include<iostream> using namespace std;class Date { friend void print_date(int year, int month);//打印日历 friend ostream& operato...
  • m0_37968340
  • m0_37968340
  • 2017-07-06 14:28
  • 872

c/c++实现简单计算器

#include#includeusing namespace std;int main(){double number1=0.0;double number2 =0.0;char operation =0;coutnumber1>>operation>>number2;co...
  • yangle4695
  • yangle4695
  • 2016-04-04 22:22
  • 513

小程序之计算器 【C++ STL栈实现】 + 【C 数组模拟栈实现】 【适用VC, DEV, codeblack】

自己写的小程序,记录一下:     #include #include #include #include #include using namespace std; int in = 0, out = 0; void input() { system("c...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015-06-13 21:19
  • 1477

用二叉树实现计算器

#include #include #include #include #include using namespace std; bool IsOperator(string mystring)   //判断字符串是否是运算符 { if (mystring == &...
  • u012459917
  • u012459917
  • 2013-12-19 10:27
  • 1904

【C++】日期类+日期万年历+日期计算器

对于日期类,我们主要实现一下日期类的基本函数,构造,拷贝构造,运算符的重载,析构。当然这里运算符的重载需要实现的还是挺多的,如:=、、=、等#include  using namespace std; class Date { public:  &...
  • zangyuanan320
  • zangyuanan320
  • 2016-05-30 15:04
  • 232

【C++】C++顺序栈实现的计算器

实现原理 该计算器数据存储是通过声明一个栈模板,来创建一个int类型和char类型的栈。int栈存储表达式中的数字,char类型的栈存储表达式中的运算符。   在输入表达式时,通过在表达式首尾添加“#”来使程序建立表达式的结束条件。当首尾“#”相遇时,即表达式已经计算完成,最后输出结...
  • White_Idiot
  • White_Idiot
  • 2016-09-08 14:05
  • 7230

c++栈实现简单计算器

/* 栈实现计算器,主要思路就是设置一个符号栈和一个数字栈,在字符串首尾各加一个'#',然后扫描字符串, * 如果是数字进数字栈,如果是运算符号先判断符号优先级,若栈外符号优先级大于栈内符号优先级则进栈, * 小于栈内优先级则符号栈出栈一位,数字栈出栈两位进行计算,结果重新存...
  • Anwel
  • Anwel
  • 2017-10-10 13:50
  • 287

C++实现“简单计算器”

C++实现“简单计算器”。
  • JIEJINQUANIL
  • JIEJINQUANIL
  • 2016-05-14 13:34
  • 6346
    个人资料
    • 访问:100509次
    • 积分:2867
    • 等级:
    • 排名:第14626名
    • 原创:164篇
    • 转载:17篇
    • 译文:0篇
    • 评论:174条
    最新评论