C++面相对象的程序设计-时间日期显示程序

日期时间显示程序设计要求:

  • 定义一个时间类Time,能提供时、分、秒组成的时间,并提供时间增加的方法(按秒)。
  • 定义一个日期类Date,记录年、月、日,并提供日期增加的方法(按天)。
  • 由类Time和日期类Date,派生出DateTime类,除具有年、月、日、时、分、秒外,还增加国名和与格林威治时间的差。
  • 编一应用程序,输入年、月、日、时、分、秒,在屏幕上模拟显示一电子计时器, 不断输出下一秒的时间和日期,以及格林威治的日期和时间。
  • 计算某日期为星期几
  • 打印对象当前数据的y年m月的月历
  • 计算从出生到现在的年,月,日   
  • 显示当前系统时间和格林威志时间   
  •     注意:当对日期增加1天后,会涉及所谓的“进位”问题:首先算出本“日”所在的月份具有的天数N,若加1之后的“日”数值超过所在的月份具有的天数N时,“进位”到月,而月份若超过12时还要“进位”到年。

实现代码:

class Date {
public:
	int day, month, year;
	static const int days[];//每月天数
	Date(int y, int m, int d);
	Date(int m, int d);
	Date();//系统日期
	void SystemDate();
	void setdate(int yy, int mm,int dd);//设置日期
	void setdate(int mm, int dd);//设置日期
	bool IsLeapYear(int yy) const;//判断是否为瑞年
	int DayCalc()const;//距离基准日期的天数
	bool  IsEndofMonth()const;//是否为月末
	void calendar();//打印某年的月历
	void InDay();//日期增加一天
	const Date &operator +=(int days);//增加任意天数
	int operator - (const Date& ymd)const;//两日期之间的天数*/
	void display_date() {
		cout<< "\t\t※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※" << endl
	        <<"\t\t\t\t"<<setfill('0') << setw(2) << year << "年" 
			<< setw(2) << month << "月" << setw(2) <<day << "日" << endl;
	}
};
const int Date::days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
Date::Date(int y, int m, int d) { setdate(y, m, d); }
Date::Date(int m, int d) { setdate(m, d); }
Date::Date() { SystemDate(); }
void Date::SystemDate() {
	time_t t;
	tm *lt;
	t = time(NULL); //历史时间清空
	lt = localtime(&t);
	year = 1900 + lt->tm_year;
	month = lt->tm_mon + 1;
	day = lt->tm_mday;
}
void Date::setdate(int yy, int mm, int dd) {
	month = (mm >= 1 && mm <=12) ? mm : 1;
	year = (yy >= 1900 && yy <= 2200) ? yy : 1900;
	if (month == 2 && IsLeapYear(year))
		day = (dd >= 1 && dd <= 29) ? dd : 1;
	else day = (dd >= 1 && dd <= days[month]) ? dd : 1;
}
void Date::setdate(int mm, int dd) {
	time_t t;
	tm *lt;
	t = time(NULL); //历史时间清空
	lt = localtime(&t);
	month = (mm >= 1 && mm < 12) ? mm : 1;
	year = 1900 + lt->tm_year;
	if (month == 2 && IsLeapYear(year))
		day = (dd >= 1 && dd <= 29) ? dd : 1;
	else day = (dd >= 1 && dd <= days[month]) ? dd : 1;
}
bool Date::IsLeapYear(int y)const {
	if (y % 400 == 0 || (y % 100 != 0 && y % 4 == 0)) return true;
	return false;
}
int Date::DayCalc()const {
	int dd;
	int yy = year - 1900;
	dd = yy * 365;
	if (yy) dd += (yy - 1) / 4;
	for (int i = 1; i < month; i++)
		dd += days[i];
	if (IsLeapYear(year) && (month>2)) dd++;
	dd += day;
	return dd;
}
bool Date::IsEndofMonth() const{
	if (month == 2 && IsLeapYear(year))
		return day == 29;
	else return day == days[month];
}
void Date::calendar() {
		int cal[5][7];
		int c = 1,y,m;
		y = year;
		m = month;
		int firstday = (1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7 + 1;//蔡勒(Zeller)公式 计算y年m月的第一天是星期几
		int day[13]={ 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		if (IsLeapYear(y))
			day[2 ]= 29;
		int Day = day[m];	//计算一个月的天数			
		cout << "一"<<"\t"<<"二"<<"\t"<<"三"<<"\t"<<"四"<<"\t"<<"五"<<"\t"<<"六"<<"\t"<<"日"<<"\t"<< endl;
		for (int i = 0; i < 5; i++)	{
			for (int n = 0; n < 7; n++){
				if ((n < firstday - 1 && i == 0) || (c>Day))
					cout << " " << "\t";
				else	{	
					cal[i][n] = c; c++; 
					cout<<cal[i][n]<<"\t";
				}
			}
			cout << endl;
		}
}
void Date::InDay() {
	if(IsEndofMonth())
		if (month == 12) {
			day = 1; month = 1; year++;
		}
		else {
			day = 1; month++;
		}
	else day++;
}
const Date& Date::operator+=(int days) {
	for (int i = 0; i < days; i++)
		InDay();
	return *this;
}
int Date::operator-(const Date& ymd)const {
	int days;
	days = DayCalc() - ymd.DayCalc();
	return days;
}
class Time {
public:
	int hour, minute, second;
	Time() { SystermTime();}
	Time(int h, int m, int s) { settime(h, m, s); }
	void SystermTime();//系统时间
	void settime(int h, int m, int s);//设置时间
	void InTime();//时间增加
	void display_time() {
		cout << endl
		     <<"\t\t\t\t"<< setfill('0') << setw(2) << hour
			 << ": " << setw(2) <<minute << ": " << setw(2) << second  <<endl
		     << "\t\t※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ " << endl << endl;
	}
};
void Time::SystermTime() {
	time_t t;
	tm *lt;
	t = time(NULL); //历史时间清空
	lt = localtime(&t);
	hour = lt->tm_hour;
	minute = lt->tm_min;
	second = lt->tm_sec;
}
void Time::settime(int h, int m, int s) {
	hour = (h >= 0 && h < 24) ? h : 0;
	minute = (m >= 0 && m < 60) ? m : 0;
	second = (s >= 0 && s < 60) ? s : 0;
}
void Time::InTime() {
	if(second==59)
		if (minute == 59) {
			second = 0; minute = 0; hour++;
		}
		else {
			second = 0; minute++;
		}
	else second++;
}
class DateTime :public Date, public Time {
public:
	DateTime(int y,int m,int d,int h,int mi ,int s):Date(y,m,d),Time(h,mi,s){ }
	DateTime() { SystemDate(); SystermTime(); }
	DateTime(int y,int m,int d):Date(y,m,d),Time(){}
	void InDateTime(); //{ InTime(); InDay(); }
	void show() { display_date(); display_time(); }
};
void DateTime::InDateTime() {
	if (second == 59) {
		if (minute == 59) {
			if (hour == 23) {
				if (IsEndofMonth()) {
					if (month == 12) {
						second = 0; minute = 0; hour = 0; day = 1;  month = 1; year++;
					}
					else {
						second = 0; minute = 0; hour = 0; day = 1;  month++;
					}
				}
				else {
					second = 0; minute = 0; hour = 0; day++;
				}
			}
			else {
				second = 0; minute = 0; hour++;
			}
		}
		else {
			second = 0; minute++;
		}
	}
	else second++;
}

猜你喜欢

转载自blog.csdn.net/wmrem/article/details/79920721