标签:面向对象 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