据成员,然后根据分析分别声明相应类型的成员函数,又因为数据成员为私有成员,若要调用或修改只能调用函数,所以另直接定义八个成员函数以实现这部分获取、修改功能。最后还要定义构造函数以实现对数据成员的快速赋值,包括没有参数,年月日皆为1,只一个参数对年赋值,月日为1,两个参数对年月赋值,日为1,三个参数对年月日赋值,星期直接通过函数计算可得。成员函数累计24个,基本如下:
class Date //定义日期类 { private: int Year; int Month; int Day; int Week; public:
Date(){Year=1;Month=1;Day=1;} //构造函数,经初始化数据成员 Date(int y){Year=y;Month=1;Day=1;} Date(int y,int m){Year=y;Month=m;Day=1;} Date(int y,int m,int d){Year=y;Month=m;Day=d;}
void SetYear(int y){Year=y;} //设置年份 void SetMonth(int m){Month=m;} //设置月份 void SetDay(int d){Day=d;} //设置日份 void SetWeek(int w){Week=w;} //设置星期 int GetYear() const {return Year;} //获取年份 int GetMonth() const {return Month;} //获取月份 int GetDay() const {return Day;} //获取日份 int GetWeek() const {return Week;} //设置星期
static bool JudgeYear(int y) //判断某年是否为润年(平年) { }
int GetMonthDays(int m); //判断某年某月实有天数 int GetYearDays(int y); //判断某年实有天数
if(y%4==0 && y0!=0 || y@0==0)
return true; return false; else
4
int DateToNum(); //判断某年到1年1月1日实有天数 Date NumToDate(int); //由1年1月1日至指定日期实有天数返回日期 void OutMonth(int r); //月份输出 void OutWeek(int r); //星期输出
void AllShow(); //输出某年全年日历 void WAllShow(); //文件输出某年全年日历 void MonthShow(); //输出某年某月日历 void WMonthShow(); //输出某年某月日历 void WeekShow(); //输出某年某月某日星期日历 };
3. 定义平润年的判断,只需要获取指定的年份,能过“能被4整除不能被100整除是润年和能被400整除是润年”判断即可,是润年返回True,否则返回False,直接在类内定义。
static bool JudgeYear(int y) //判断某年是否为润年(平年) { }
4. 定义任意年份的实有天数判断,只需要判断指定年份是否为润年,是则返回366,否则365。
int Date::GetYearDays(int y) //判断某年实有天数 {
if(JudgeYear(y)) };
5. 定义任意月的实有天数判断,需要获取指定的年份与月份,能过判断月份,大月返回31天,小月返回30天,2月还需要通过判断年份是否为润年返回相应值,润年返回29天,平年返回28天。
int Date::GetMonthDays(int m) //判断某年某月实有天数 { int n;
return 366; return 365; else
//调用JudgeYear(int y)判断平润年
if(y%4==0 && y0!=0 || y@0==0)
return true; return false; else
5
switch(m) {
//判断月份
case 1: case 3: case 5: case 7: case 8: case 10:case 12: } return n; };
6. 定义任意年到1年1月1日的实有天数,定义一个用于存放总天数的n,赋初值为0,通过循环先与指定年份前1年到公元1年所有年份的总天数相加,每次循环都需要调用任意年份的实有天数判断函数获取某年的总天数;指定年份前x年所有年份总天数相加完成后,再通过循环与指定月份前1月到1月所有月份总天数相加,期间也要计算个个月的总天数;最后与指定日期的天数相加,返回n的值即可。
int Date::DateToNum() //判断某年到1年1月1日实有天数 { int y,n=0;
for(y=1;y n+=GetYearDays(y); n+=GetMonthDays(m); for(int m=1;m 7. 定义由到1年1月1日的实有天数计算对应日期,此过程与定义任意年到1年1月1日的实有天数类似,只不过是一个反向过程。也需要能过年份天数判断,月份天数判断,判断总天数中最多含有多少年,多少月,最后还剩多少日,以Date类型返回。 n=31;break; n=30;break; if(JudgeYear(GetYear())) n=29; n=28; else //不是润年返回28年 break; //调用JudgeYear(int y)判断平润年 //是润年返回29年 case 4: case 6: case 9: case 11: case 2: 6 Date Date::NumToDate(int da) { int y,m,d,rest=da; //由实有天数返回日期 for(y=1,rest;rest>GetYearDays(y);y++) rest-=GetYearDays(y); rest-=GetMonthDays(m); for(m=1,rest;rest>GetMonthDays(m);m++) d=rest; return Date(y,m,d); }; 8. 定义判断任意日期对应的星期,此过程只需要计算出指定日期到公元1年1月1日的实有天数,然后除7取余即可,其余数就是对应的星期。 9. 定义显示年日历,此函数目的在于输入全年日历。具体实现如下:定义4个变量,分别存放指定年份的1月1日到公元1年1月1日的实有天数,可调用函数实现,此年份中某月1号对应的星期,可调用函数计算此年某月1号到公元1年1月1日的实有天数除7取余实现,另两个用于循环。共有两层循环,第一层循环共计12次,一年只有12个月,第二层循环次数由当前要输出的月份的总天数判断。第二层循环内又嵌套二个循环,第一个条件为某月1号是星期几则输出几个tab空格,第二层循环用于输出日历,能过输出的日期加上之前的空格数除7余0作为换行条件,以实现以星期布局。主要部分也就如此,另外日历前后的横线、星期、年月份直接输出,或调用函数输出即可。此次编写,也把月份的输出重定义了一个函数,由获取一个月份,输出大写月份,由switch语句实现。 void Date::AllShow() //输出某年全年日历 { int n,morday,wek,j; morday=DateToNum(); cout<<\ \年\for(n=1;n<=12;n++) { cout<<\cout<<\ \OutMonth(n); cout<<\星期日 星期一 星期二 星期三 星期四 星期五 星期六\wek=morday%7; 7