腊月初八啦~~

           腊月初八要吃8宝饭,,,

  早上上班, 同事说今天是腊月初八了, 要吃8宝饭... 

  立即打电话回家, 让家人买8宝粥, 嘻嘻, 晚上回家吃~~

实验内容:万年历 实验目标: (1)日期查询:输入公历年、月、日,能够查询该天是星期几,农历日期。如果是节气、节日,同时显示出来; (2)月历显示:输入公历年、月,列出该月月历,包含农历日期、节气、节日信息; (3)年历显示:输入公历年份,设计一种格式,能够较美观地列出该年12个月的年历,包含农历日期、节气、节日信息。 日期查询数据样例: 输入:2025 1 31 输出:星期五 正月初三 输入:2025 3 5 输出:星期三 二月初六 惊蛰 输入:2025 8 1 输出:星期五 闰六月初八 建军节 输出:2019 2 4 输出:星期一 腊月三十 立春 除夕 说明:各输入输出项之间,均以空格分隔。 如果不是节气与节日,输出农历日期后结束,后面不留空格。 其中,农历月份为正月、二月、三月、四月、五月、六月、七月、月、九月、十月、冬月、腊月,前面可能有“闰”字; 农历日期为初一、初二、…、初十、十一、十二、…、十九、二十、廿一、廿二、…、廿九、三十。 节气共24个,节日除必须包含法定节日外,其余自定。 解决方案: 输入是公历日期,输出包含四部分:星期几,农历日期,节气,节日。 按照公历日期计算星期几,查阅资料可以直接得到计算公式。 但是从公历日期得到农历日期、准确的节气不存在确定的公式可以计算。 至于节日,有些由日期确定(比如五一节、国庆节由公历日期确定,除夕、春节、端午节、中秋节、重阳节由农历日期确定,而清明节就是节气),其余均与日期无关(比如春社、秋社、三伏、三九均与干支纪日有关)。 本任务不考虑与日期无关的那些节日,只需考虑由公历日期、农历日期与节气确定的节日。 由历法知识可知,推算农历日期需要准确的天文资料,可简单理解为无法直接按照公历日期计算得到农历日期。 但显然,农历日期与公历日期存在关联,只是关联过于复杂而难以借助于简单公式计算得到。 这种情形,需要利用计算机强大的数据存储能力,将天文台的计算结果,以较为简洁的方式保存在程序中,即可借助于快速“查询”和简单计算得到所需输出数据。 子任务1:星期几 (1)说明按照公历日期能够计算星期几的原理; (2)写出按照公历日期计算星期几的程序。
06-25
### 三级标题:万年历程序的功能设计与数据结构选择 在C语言中实现一个功能完善的万年历程序,需要综合考虑公历、农历、星期几、节气和节日信息的处理。首先,需要定义合适的数据结构来表示这些信息。 ```c typedef struct { int year; int month; int day; } GregorianDate; typedef struct { int lunarYear; int lunarMonth; int lunarDay; int isLeapMonth; // 是否为闰月 } LunarDate; typedef enum { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } Weekday; ``` 上述结构体`GregorianDate`用于表示公历日期,`LunarDate`用于存储农历日期,并通过`isLeapMonth`标记是否为闰月[^1]。`Weekday`枚举类型用于表示一周的七天。 ### 三级标题:计算星期几的算法 要根据输入的公历年、月、日计算出对应的星期几,可以使用Zeller公式或其他类似的算法。以下是一个简化版本的实现: ```c int get_weekday(int year, int month, int day) { if (month < 3) { month += 12; year--; } int h = (day + (13 * (month + 1)) / 5 + year + year / 4 - year / 100 + year / 400) % 7; return (h + 5) % 7; // 返回0~6对应周一到周日 } ``` 该函数返回值为0~6,分别对应周一至周日。此算法基于公历日期计算星期几,无需依赖外部库或表[^2]。 ### 三级标题:农历转换与节气计算 农历转换可以通过调用已有的农历转换函数实现,例如参考中提到的`toLunar`函数[^1]。此外,节气信息通常需要结合特定算法或查找表进行计算。以下是一个简化的农历转换示例: ```c void convert_to_lunar(GregorianDate greg, LunarDate *lunar) { // 假设存在一个toLunar函数,传入公历日期并填充农历结构体 toLunar(greg.year, greg.month, greg.day, lunar); } ``` 节气信息则可通过判断当前日期是否匹配二十四节气的计算结果,例如使用类似`lunarSpringDate`的函数来获取春节日期[^1],并通过循环遍历节气表进行匹配。 ### 三级标题:节日与节气信息的展示 为了展示节日和节气信息,需要维护一个包含节气名称和对应日期的数组,并在主程序中进行比对。例如: ```c typedef struct { int month; int day; const char *name; } SolarTerm; SolarTerm solar_terms[] = { {1, 20, "小寒"}, {2, 4, "立春"}, {2, 19, "雨水"}, {3, 6, "惊蛰"}, {3, 21, "春分"}, {4, 5, "清明"}, {4, 20, "谷雨"}, {5, 5, "立夏"}, {5, 21, "小满"}, {6, 6, "芒种"}, {6, 21, "夏至"}, {7, 7, "小暑"}, {7, 23, "大暑"}, {8, 8, "立秋"}, {8, 23, "处暑"}, {9, 8, "白露"}, {9, 23, "秋分"}, {10, 8, "寒露"}, {10, 23, "霜降"}, {11, 7, "立冬"}, {11, 22, "小雪"}, {12, 7, "大雪"}, {12, 22, "冬至"} }; const char* check_solar_term(int month, int day) { for (int i = 0; i < sizeof(solar_terms) / sizeof(SolarTerm); i++) { if (solar_terms[i].month == month && solar_terms[i].day == day) { return solar_terms[i].name; } } return NULL; } ``` 上述代码展示了如何通过遍历节气数组来查找当前日期是否为某个节气,并返回相应的名称。 ### 三级标题:主程序逻辑与输出格式化 主程序将整合以上功能,接收用户输入的公历日期,计算星期几,转换为农历,并检查是否有节气或节日信息: ```c #include <stdio.h> int main() { GregorianDate input; printf("请输入公历日期(YYYY MM DD): "); scanf("%d %d %d", &input.year, &input.month, &input.day); int weekday = get_weekday(input.year, input.month, input.day); const char *weekdays[] = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; printf("对应的星期是:%s\n", weekdays[weekday]); LunarDate lunar; convert_to_lunar(input, &lunar); printf("对应的农历日期是:%d年%d月%d日%s\n", lunar.lunarYear, lunar.lunarMonth, lunar.lunarDay, lunar.isLeapMonth ? "(闰月)" : ""); const char *term = check_solar_term(input.month, input.day); if (term != NULL) { printf("今天是节气:%s\n", term); } return 0; } ``` 该程序能够接收用户输入,输出对应的星期几、农历日期,并检测当天是否为节气日。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值