日期时间显示程序设计要求:
- 定义一个时间类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++;
}