码迷,mamicode.com
首页 > 其他好文 > 详细

输入一个日期,判断这个日期在一年中是哪一天,是星期几,计算两个日期间的天数,使用字符串输出日期

时间:2015-05-05 12:42:19      阅读:570      评论:0      收藏:0      [点我收藏+]

标签:面向对象   c++   判断日期   判断闰年   计算一个日期是一年中的第几天   

之前写了一个博文(http://blog.csdn.net/shiwazone/article/details/45053739)是用基本函数实现的,这次使用类的设计方法,也就是面向对象的方法改写一下,并加入了日期转换成字符串的实现。这里的程序也可以解决编程珠玑习题3.4的问题。

#include"calendar.h"
int main()
{
	Time t;
	t.initialTime();
	t.Show();
	t.StrShow();
	Time t1;
	t1.initialTime();
	t1.StrShow();
	Time t2;
	t2.initialTime();
	t2.StrShow();
	cout << "The days between t1 and t2 is: " << t1.countdays(t2)<<endl;
	cout << "The days between t2 and t1 is: " << t2.countdays(t1)<<endl;
	return 0;
}
#ifndef CANLENDAR_H
#define CANLENDAA_H
#include<iostream>
#include<string>
using namespace std;
string ntos(int t);//数字转换成字符
class Time
{
private:
	int year;
	int month;
	int day;
	unsigned int weekday;
	int Weekdaycount()const;//计算当日是星期几
	int Daycount()const;//计算当日是公元第多少天
	int Daysyearcount()const;//计算当日是该年的第多少天
	bool isleapyear()const;//判断该年是不是闰年
	bool check()const;//检查时间格式是否正确
	void numtostr(string &sy, string &sm, string &sd, string &sw)const;//数字日期转换成字符日期
	
public:
	void initialTime();//输入初始化时间
	void Show()const;//显示时间信息
	void StrShow()const;//使用字符串的表达显示日期
	int countdays(const Time & t2)const;//计算两个日期间的天数
};
int Time::Weekdaycount()const//计算当日是星期几
{
	return Daycount() % 7;
}
int Time::Daycount()const//计算当日是公元第多少天
{
	int days = 0;
	days = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100
		+ (year - 1) / 400 + Daysyearcount();
	return days;
}
int Time::Daysyearcount()const//计算当日是该年的第多少天
{
	int days = 0;
	int mtemp = month - 1;
	while (mtemp > 0)
	{
		switch (mtemp)
		{
		case(1) :
		case(3) :
		case(5) :
		case(7) :
		case(8) :
		case(10) :
		case(12) :
				 days += 31; break;
		case(4) :
		case(6) :
		case(9) :
		case(11) :
				 days += 30; break;
		case(2) :
			days += 28; break;
		default:
			break;
		}
		--mtemp;
	}
	if (isleapyear())++days;//如果是闰年,再加上一天
	return days + day;//返回计算的天数加上当月的天数
}
bool Time::isleapyear()const//判断该年是不是闰年
{
	if (year % 4 == 0 && year % 100 != 0) return true;//年是四的倍数而且不是100的倍数,是闰年
	if (year % 400 == 0)return true;
	else return false;
}
bool Time::check()const//检查时间格式是否正确
{
	if (year <= 0 || (month <= 0 || month>12) || day <= 0) return false;
	else{
		if (( month == 1 ||  month == 3 ||  month == 5 ||  month == 7
			||  month == 8 ||  month == 10 ||  month == 12) &&  day > 31)return false;
		else
		{
			if (( month == 4 ||  month == 6 ||  month == 9 ||  month == 11
				) &&  day > 30)return false;
			else
			{
				if ( month == 2) {
					if (isleapyear()) {
						if ( day > 29)return false; else return true;
					}
					else
					{
						if ( day > 28)return false; else return true;
					}
				}
			}
		}
	}
}
void Time::numtostr(string &sy, string &sm, string &sd, string &sw)const//数字日期转换成字符日期
{
	sy = ntos(year / 1000) + ntos(year / 100 - 10 * (year / 1000)) 
		+ ntos(year / 10 - 10 * (year / 100)) + ntos(year % 10);
	sd = ntos(day / 10) + ntos(day % 10);
	switch (month)
	{
	case(1) : sm = "January"; break;
	case(2) : sm = "February"; break;
	case(3) : sm = "March"; break;
	case(4) : sm = "April"; break;
	case(5) : sm = "May"; break;
	case(6) : sm = "June"; break;
	case(7) : sm = "July"; break;
	case(8) : sm = "August"; break;
	case(9) : sm = "September"; break;
	case(10) : sm = "October"; break;
	case(11) : sm = "November"; break;
	case(12) : sm = "December"; break;
	default:break;
	}
	switch (weekday)
	{
	case(1) : sw = "Monday"; break;
	case(2) : sw = "Tuesday"; break;
	case(3) : sw = "Wednesday"; break;
	case(4) : sw = "Thursday"; break;
	case(5) : sw = "Friday"; break;
	case(6) : sw = "Saturday"; break;
	case(7) : sw = "Sunday"; break;
	default:break;
	}
}

void Time::initialTime()//输入初始化时间
{
	cout << "Enter the Time (year,month,day):\n";
	cin >> year;
	cin.get();
	cin >> month;
	cin.get();
	cin >> day;
	cin.get();
	if (!check()){ cout << "Try again:\n"; initialTime(); }
	else
		weekday = Weekdaycount();
}
void Time::Show()const//显示时间信息
{
	cout << "Year: " << year << "\t";
	cout << "Month: " << month << "\t";
	cout << "Day: " << day << "\t";
	cout << "Weekday: " << weekday << endl;
	cout << "This is a ";
	if (isleapyear())cout << "leap"; else cout << "nonleap";
	cout << " year.\n";
	cout << "Today is the " << Daysyearcount() << " days of the year.\n";
}
void Time::StrShow()const//使用字符串的表达显示日期
{
	string st, sy, sm, sd, sw;
	numtostr( sy, sm, sd, sw);
	st = sy + " / " + sm + " / " + sd + " ," + "Today is " + sw + " .";
	string::iterator it = st.begin();
	for (; it != st.end(); ++it)
		cout << *it;
	cout << endl;
	cout << "This is a ";
	if (isleapyear())cout << "leap"; else cout << "nonleap";
	cout << " year.\n";
	cout << "Today is the " << Daysyearcount() << " days of the year.\n";
}
int Time::countdays(const Time & t2)const//计算两个日期间的天数
{
	int t = Daycount() - t2.Daycount();
	if (t < 0) return -t;
	return t;
}

string ntos(int t)//数字转换成字符
{
	switch (t)
	{
	case(0) : return "0";
	case(1) : return "1";
	case(2) : return "2";
	case(3) : return "3";
	case(4) : return "4";
	case(5) : return "5";
	case(6) : return "6";
	case(7) : return "7";
	case(8) : return "8";
	case(9) : return "9";
	default:break;
	}
}
#endif

技术分享
如需转载,请注明出处。

输入一个日期,判断这个日期在一年中是哪一天,是星期几,计算两个日期间的天数,使用字符串输出日期

标签:面向对象   c++   判断日期   判断闰年   计算一个日期是一年中的第几天   

原文地址:http://blog.csdn.net/shiwazone/article/details/45499697

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!