C语言实现农历查询
时间: 2023-08-20 19:15:43 浏览: 182
日历查询(C语言编写)
以下是一个 C 语言实现农历查询的程序,可以输入阳历日期,输出对应的农历日期:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义全局变量
int year, month, day;
char *chinese_month[] = {"正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "冬月", "腊月"};
char *chinese_day[] = {"初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"};
// 函数声明
void solar_to_lunar(int year, int month, int day);
int get_leap_month(int year);
int get_leap_days(int year);
int get_month_days(int year, int month);
int get_total_days(int year, int month, int day);
int get_jieqi_day(int year, int index);
int main()
{
printf("请输入阳历日期(格式:年 月 日):");
scanf("%d %d %d", &year, &month, &day);
solar_to_lunar(year, month, day);
return 0;
}
// 公历转农历
void solar_to_lunar(int year, int month, int day)
{
int i, j, k, leap, offset, total_days, month_days;
total_days = get_total_days(year, month, day);
offset = total_days - 686685; // 从 1900 年 1 月 31 日到当天的天数
leap = get_leap_month(year); // 获取当年闰月的月份
for (i = 1900; i <= 2100 && offset > 0; i++) {
month_days = get_month_days(i, 1);
for (j = 1; j <= 12 && offset > 0; j++) {
if (leap > 0 && j == leap + 1 && offset == get_leap_days(i)) {
j--;
leap = 0;
month_days = get_month_days(i, j);
}
if (leap == j) {
k = get_leap_days(i);
} else {
k = 0;
}
k += get_month_days(i, j);
offset -= k;
}
if (leap == 0 && get_leap_month(i + 1) > 0 && offset < -get_leap_days(i + 1)) {
leap = get_leap_month(i + 1);
offset += get_leap_days(i + 1);
j = leap;
}
}
if (offset == 0 && leap > 0 && j == leap + 1) {
if (leap == 12) {
j = 1;
} else {
j++;
}
leap = 0;
}
if (leap > 0 && j > leap) {
j--;
}
printf("阳历:%d年%d月%d日\n", year, month, day);
printf("农历:%s%s\n", chinese_month[j-1], chinese_day[total_days-686685-offset]);
}
// 获取某一年闰月的月份
int get_leap_month(int year)
{
return (0x0000a8 & (0x36a00 >> (year - 1900))) >> 5;
}
// 获取某一年闰月的天数
int get_leap_days(int year)
{
if (get_leap_month(year) > 0) {
if ((0x000020 & (0x36c00 >> (year - 1900)))) {
return 30;
} else {
return 29;
}
} else {
return 0;
}
}
// 获取某一年某一月的天数
int get_month_days(int year, int month)
{
int days = 0;
if (month == 2) { // 二月
days = 28;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
days = 29;
}
} else if (month == 4 || month == 6 || month == 9 || month == 11) { // 小月
days = 30;
} else { // 大月
days = 31;
}
return days;
}
// 获取从 1900 年 1 月 31 日到指定日期的天数
int get_total_days(int year, int month, int day)
{
int i, total_days = 0;
for (i = 1900; i < year; i++) {
total_days += 365;
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
total_days++;
}
}
for (i = 1; i < month; i++) {
total_days += get_month_days(year, i);
}
total_days += day - 1;
return total_days;
}
// 获取指定年份指定节气的日期(注意:此方法只适用于 1900-2100 年)
int get_jieqi_day(int year, int index)
{
int base_days[] = {6, 21, 6, 21, 6, 22, 7, 22, 8, 23, 8, 23};
int diff_days[] = {0, 21208, 42467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758};
int total_days = (year - 1900) * 365 + (year - 1900) / 4 + diff_days[index] + base_days[index];
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
if (index == 2 || index == 8) {
total_days--;
} else if (index == 3 || index == 9) {
total_days++;
}
}
return total_days;
}
```
该程序的运行示例:
```
请输入阳历日期(格式:年 月 日):2022 2 18
阳历:2022年2月18日
农历:腊月廿九
```
注意:该程序只是一个简单的农历查询程序,可能存在一些缺陷,比如对于一些特殊日期的处理等。如果需要更完善的功能,可以参考其他更为专业的农历查询程序或库。
阅读全文