使用c语言开发实现一个简单地万年历,包括任意年份的月历,任意日期的阳历转换成农历,要求有菜单界面
时间: 2024-05-09 11:15:46 浏览: 152
C语言实现简单万年历
5星 · 资源好评率100%
以下是一个简单的万年历的实现,包括了菜单界面和阳历转换成农历的功能。请注意,这里使用的农历算法是比较简单的,可能存在误差。如果需要更准确的结果,可以参考更复杂的农历算法。
```c
#include <stdio.h>
// 计算某一年是否为闰年
int isLeapYear(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return 1;
} else {
return 0;
}
}
// 计算某一年某一月有多少天
int getDaysOfMonth(int year, int month) {
int days = 31;
if (month == 4 || month == 6 || month == 9 || month == 11) {
days = 30;
} else if (month == 2) {
if (isLeapYear(year)) {
days = 29;
} else {
days = 28;
}
}
return days;
}
// 计算某一年某一月一号是星期几(0表示星期日,1表示星期一,以此类推)
int getWeekdayOfFirstDay(int year, int month) {
int y, c, m, d;
y = year;
if (month < 3) {
m = month + 12;
y--;
} else {
m = month;
}
c = y / 100;
y = y % 100;
d = 1;
int w = (c / 4) - 2 * c + y + (y / 4) + ((13 * (m + 1)) / 5) + d - 1;
if (w < 0) {
w += 7;
}
return w % 7;
}
// 显示某一年某一月的月历
void printMonth(int year, int month) {
printf(" %d年%d月\n", year, month);
printf("日 一 二 三 四 五 六\n");
int weekdayOfFirstDay = getWeekdayOfFirstDay(year, month);
int daysOfMonth = getDaysOfMonth(year, month);
int i;
for (i = 0; i < weekdayOfFirstDay; i++) {
printf(" ");
}
for (i = 1; i <= daysOfMonth; i++) {
printf("%2d ", i);
if ((i + weekdayOfFirstDay) % 7 == 0) {
printf("\n");
}
}
if ((i + weekdayOfFirstDay) % 7 != 0) {
printf("\n");
}
}
// 显示阳历转换成农历的结果
void printLunarDate(int year, int month, int day) {
// 农历月份名称
char *lunarMonthNames[] = {
"正", "二", "三", "四", "五", "六",
"七", "八", "九", "十", "十一", "十二"
};
// 农历日期名称
char *lunarDayNames[] = {
"初一", "初二", "初三", "初四", "初五", "初六",
"初七", "初八", "初九", "初十", "十一", "十二",
"十三", "十四", "十五", "十六", "十七", "十八",
"十九", "二十", "廿一", "廿二", "廿三", "廿四",
"廿五", "廿六", "廿七", "廿八", "廿九", "三十"
};
// 公历日期名称
char *solarDayNames[] = {
"一", "二", "三", "四", "五", "六", "七",
"八", "九", "十", "十一", "十二", "十三", "十四",
"十五", "十六", "十七", "十八", "十九", "二十",
"二十一", "二十二", "二十三", "二十四", "二十五", "二十六",
"二十七", "二十八", "二十九", "三十", "三十一"
};
// 农历日期数值
int lunarYear, lunarMonth, lunarDay;
// 1900年1月31日是农历初一
int baseYear = 1900, baseMonth = 1, baseDay = 31;
// 公历日期数值
int solarDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int solarYear, solarMonth, solarDay;
// 判断闰年
if (isLeapYear(year)) {
solarDays[1] = 29;
}
// 计算公历日期数值
solarYear = year;
solarMonth = month;
solarDay = day;
// 计算公历日期是这一年的第几天
int i, days = 0;
for (i = 0; i < solarMonth - 1; i++) {
days += solarDays[i];
}
days += solarDay;
// 计算公历日期是1900年1月31日后的第几天
int totalDays = (year - baseYear) * 365 + (year - baseYear) / 4 + days - 1;
// 计算农历日期数值
lunarYear = baseYear;
lunarMonth = baseMonth;
lunarDay = baseDay;
while (totalDays > 0) {
int daysOfMonth = getDaysOfMonth(lunarYear, lunarMonth);
if (totalDays >= daysOfMonth) {
totalDays -= daysOfMonth;
lunarMonth++;
if (lunarMonth > 12) {
lunarYear++;
lunarMonth = 1;
}
} else {
lunarDay += totalDays;
totalDays = 0;
}
}
// 输出结果
printf("%d年%d月%d日是%s%s\n", year, month, day, lunarMonthNames[lunarMonth-1], lunarDayNames[lunarDay-1]);
}
// 显示菜单
void showMenu() {
printf("1. 显示月历\n");
printf("2. 阳历转换成农历\n");
printf("3. 退出程序\n");
}
int main() {
int choice;
int year, month, day;
while (1) {
showMenu();
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入年份和月份(格式:yyyy mm):");
scanf("%d %d", &year, &month);
printMonth(year, month);
break;
case 2:
printf("请输入阳历日期(格式:yyyy mm dd):");
scanf("%d %d %d", &year, &month, &day);
printLunarDate(year, month, day);
break;
case 3:
return 0;
default:
printf("无效的选择,请重新输入。\n");
break;
}
}
return 0;
}
```
使用该代码可以实现一个简单的万年历,包括了菜单界面和阳历转换成农历的功能。你可以根据需要进行修改和优化。
阅读全文