任务要求
功能要求:
(1)提供菜单方式选择,假定输入的年份在1940-2040年之间。
(2)输入一个年份,输出是在屏幕上显示该年的日历。
(3)输入年月,输出该月的日历,如图2-1所示:
图2- 1 月日历
(4)输入年份、月份、日期,计算得到的是这一天据今天有多少天,星期几。
(5)输入公历的年月日,输出农历年月日。
(6)输入农历节气,输出当年农历的年月日及公历年月日。可以假定只涉及年份是1940年到2040年。
总体设计
将文件三部分 Date.h、main.cpp、Date.cpp
1) Date.h:包括函数的声明。
2) main.cpp:包含调用与模拟交互界面的函数代码
3) Date.cpp:
//输入输入一个年份,输出是在屏幕上显示该年的日历。
void print_annual_calendar(int year)
//输入年月,输出该月的日历。
void print_monthly_calendar(int year,int month)
//输入年份、月份、日期,计算得到的是这一天据今天有多少天,星期几。
void print_number_week(int year,int month ,int day)
//输入公历,显示农历。
void gregorian_to_lunar (int year,int month,int day)
//输入农历节气,输出当年农历的年月日和公历年月日。
void solar_term(char *str)
详细设计说明
(1) 查询距今多少天,星期几?
①计算某一日期到1939年1月1日的天数:getDaysTo1939(int year, int month, int day)
- 判断是否是闰年(平年365天,闰年366天),函数如表4-1所示:
表4- 1 isLeapYear函数
定义函数 |
bool isLeapYear(int year) |
返回值 |
若year年是闰年返回true,否则返回false |
参数说明 |
year参数是要判断的年份 |
- 判断某年某月有多少天?函数如表4-2所示:
表4- 2 getDaysOfMonth函数
定义函数 |
int getDaysOfMonth(int year,int month) |
返回值 |
返回year年month月的天数 |
参数说明 |
year、month参数分别是要查询的年、月 |
例如:计算2020年8月14日到1939年1月1日的天数。首先1939-2019年是整数年,直接判断是否是闰年,然后增加天数。2020年不是整年,但1-7月是整数月,根据年、月获取当月天数累加。最后再加天数day,便得出相距与1939年1月1日的天数。
②计算查询日期距今天多少天?getDaysOfMonthToToday(int year, int month, int day) ,函数如表4-3所示:
- 通过函数获取系统时间,通过getDaysTo1939(),获取系统时间距1939年1月1日的天数num1。
- 使用键盘输入的日期,通过getDaysTo1939(),获取输入日期距1939年1月1日的天数num2。
- 使用num1-num2计算输入日期距今天的天数,正数为已过去时间,负数为未来时间。
表4- 3 getDaysOfMonthToToday函数
定义函数 |
int getDaysOfMonthToToday(int year,int month,int day) |
返回值 |
返回距今天数,正值为过去,负值为未来 |
参数说明 |
year、month、day 分别为要查询的年、月、日 |
③计算输入日期是星期几:getDayOfWeek(int year,int month,int day) ,函数如表4-4所示:
- 知道1939年1月1日是星期日,然后计算查询日期与1939年距离多少天,然后利用(天数%7)获取余数,得出星期属性。
表4- 4 getDayOfWeek函数
定义函数 |
String getDayOfWeek(int year,int month,int day) |
返回值 |
返回字符串星期数 |
参数说明 |
year、month、day 分别为要查询的年、月、日 |
(2) 打印月日历
- 获取当月1日是星期几,通过getDayOfWeek1()获取当月一号是星期几,然后通过打印空格使得当月1日,停在所对应的星期下方,函数如表4-5所示:
表4- 5 getDayOfWeek1函数
定义函数 |
int getDayOfWeek1(int year,int month,int day) |
返回值 |
返回星期数,0代表星期天 |
参数说明 |
year、month、day 分别为要查询的年、月、日 |
- 获取当月天数,通过getDaysOfMonth()获取,打印完最后一天时间便结束,函数如表4-6所示:
表4- 6 getDaysOfMonth函数
定义函数 |
int getDaysOfMonth(int year,int month) |
返回值 |
返回year年month月天数 |
参数说明 |
year、month分别为要查询的年、月 |
(3) 打印年日历
① 打印季度日历,函数如表4-7所示:
- 首先打印日历头信息三遍(由于是按照季度输出,一行包含三个月),格式:(月份 SUN MON SUN MON TUE WED THU FRI SAT)
- 依次打印日历的第一行,每月的第一日对应的星期数,通过打印空格来调整。
- 依次打印连续的日期。最后一行,日期与日期之间依然要使用空格来调整位置。
表4- 7 print_seasons_calendar函数
定义函数 |
void print_seasons_calendar(int year,int num) |
返回值 |
无返回值 |
参数说明 |
year、num分别为要打印的年、季度,num可取1,2,3,4 |
① 打印年日历,函数如表4-8所示:
- 通过for循环打印四个季度的日历,便完成年日历的输出。
表4- 8 print_annual_calendar函数
定义函数 |
void print_annual_calendar(int year) |
返回值 |
无返回值 |
参数说明 |
year为要打印的年份 |
(4) 公历转农历
① 计算输入的时间距离1939年1月1日的天数。
② 获取农历年天数(通过农历数据表查询):getDayOfNongYear(int year)
- 获取农历年是否为闰年,返回闰月月份,函数如表4-9所示:
表4- 9 isNongLeapYear函数
定义函数 |
int isNongLeapYear(int year) |
返回值 |
返回农历year年闰月月份,0表示不闰 |
参数说明 |
year为要查询的年 |
- 获取每个月有多少天,函数如表4-10所示:
表4- 10 getDaysOfMonthOfNongMonth函数
定义函数 |
int getDaysOfMonthOfNongMonth(int year,int month) |
返回值 |
返回农历year年month月的天数 |
参数说明 |
year、month分别为要查询的年、月 |
- 获取闰月大小,函数如表4-11所示:
表4- 11 is_large_month函数
定义函数 |
bool is_large_month(int year) |
返回值 |
闰大月返回true,闰小月返回false |
参数说明 |
year为要查询的年 |
③ 计算农历日期,函数如表4-12所示:
- 由于1939年1月1日农历往往是1938年,所以首先减去公历1939年1月1日到农历1939年正月初一的天数。
- 循环计算便得出农历日期。日期的文字形式可以保存在数组中进行拼接输出。
表4- 12 gregorian_to_lunar函数
定义函数 |
void gregorian_to_lunar (int year,int month,int day) |
返回值 |
无返回值 |
参数说明 |
year、month、day分别为要转换的年、月、日 |
(5) 查询节气时间,函数如表4-13所示:
- 计算二十四节气对应的公历日期(通过寿星公式计算)
- 得出公历日期,直接使用公历转农历函数,打印农历日期。
表4- 13 solar_term函数
定义函数 |
void solar_term(int year,char* str) |
返回值 |
无返回值 |
参数说明 |
year代表要查询的年份,str表示查询的节气名称,如立秋。 |
调试与测试
(1) 交互界面显示
(2) 打印年日历
图3- 2 年日历
(3) 打印月日历
图3- 3 月日历
(4) 查询距今多少天,星期几?
图3- 4 距今天数,星期数
(5) 公历转农历
图3- 5 公历转农历
(6) 查询节气时间
图3- 6 查询二十四节气
代码实现
看到有人直接复制全部内容,到百度文库卖文档,我放github了。
Github:handsometaoa/Calendar: C++ 实现的日历 (github.com)
原文链接: https://www.cnblogs.com/handsometaoa/p/13588549.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/202148
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!