🕗晚上好,题主!目前:🟢[在线]
📢参考通义千问、由郭老师整理提供!
📣今日诗号:曾经沧海难为水,除却巫山不是云。
你想要实现的是在万年历中添加农历显示功能,并且能够在阳历和农历之间切换。我理解你想在原有代码的基础上进行修改,我会尽力帮你完成。
以下是实现思路和修改后的代码:
- 农历计算函数:
- 需要添加农历计算的函数,将阳历日期转换为农历日期。由于农历计算较为复杂,建议使用现有的农历库或算法。以下代码中,我提供了一个简单的农历计算函数
solar_to_lunar
作为示例,但其精度有限,仅供参考。实际应用中,建议寻找更精确的农历算法。
- 数据结构修改:
- 在
Date
结构体中添加 lunarYear
,lunarMonth
和 lunarDay
三个成员变量,用于存储农历的年、月、日信息。
- 计算并显示农历:
- 在
drawCalendar
函数中,调用 solar_to_lunar
函数计算农历日期,并将农历日期信息格式化输出到日历中。
- 切换视图:
- 可以设置一个标志位来标识当前显示的是阳历视图还是农历视图。在
switchView
函数中,根据标志位的值调用不同的绘制函数。
- 其他细节:
- 需要处理闰月的情况。
- 可以考虑优化代码结构,提高代码可读性和可维护性。
以下是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
typedef struct {
int year;
int month;
int day;
int lunarYear;
int lunarMonth;
int lunarDay;
} Date;
const char* gotoYear = "Year: ";
const char* gotoMonth = "Month: ";
// 函数声明
void drawCalendar(Date date);
void drawYearCalendar(int year);
void switchView(Date currentDate);
void clearScreen();
void solar_to_lunar(int year, int month, int day, int* lunar_year, int* lunar_month, int* lunar_day);
int year_days(int year);
int month_days(int year, int month);
int main() {
Date currentDate = { 2022, 1, 1, 0, 0, 0 };
char inputChar;
char yearInput[5];
while (1) {
clearScreen();
drawCalendar(currentDate);
inputChar = _getch();
if (inputChar == -32) {
inputChar = _getch();
switch (inputChar) {
case 72:
currentDate.year--;
break;
case 80:
currentDate.year++;
break;
case 75:
currentDate.month--;
break;
case 77:
currentDate.month++;
break;
default:
break;
}
} else if (inputChar == 'q' || inputChar == 'Q') {
break;
} else if (inputChar == 'y' || inputChar == 'Y') {
clearScreen();
printf("Enter year: ");
fgets(yearInput, sizeof(yearInput), stdin);
sscanf(yearInput, "%d", ¤tDate.year);
} else if (inputChar == 'v' || inputChar == 'V') {
switchView(currentDate);
}
if (currentDate.year < 1 || currentDate.year > 9999) {
currentDate.year = 2022;
}
if (currentDate.month < 1) {
currentDate.month = 12;
currentDate.year--;
}
if (currentDate.month > 12) {
currentDate.month = 1;
currentDate.year++;
}
}
return 0;
}
// 计算某年有多少天
int year_days(int year) {
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return 366;
} else {
return 365;
}
}
// 计算某月有多少天
int month_days(int year, int month) {
int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) {
return 29;
} else {
return days[month - 1];
}
}
// 简化的农历计算函数,仅供参考
void solar_to_lunar(int year, int month, int day, int* lunar_year, int* lunar_month, int* lunar_day) {
int days = 0;
for (int i = 1900; i < year; i++) {
days += year_days(i);
}
int lunar_months[] = {0, 31, 29, 31, 28, 31, 29, 31, 30, 31, 30, 31};
for (int i = 1; i < month; i++) {
days += month_days(year, i);
if (i == 2 && year % 4 == 0) {
days++;
}
}
days += day - 1;
*lunar_year = year;
*lunar_month = 1;
*lunar_day = 1;
int i = 0;
while (days > 0) {
if (days >= lunar_months[i]) {
days -= lunar_months[i];
(*lunar_month)++;
i++;
} else {
(*lunar_day) += days;
days = 0;
}
if (i == 12) {
i = 1;
(*lunar_year)++;
}
}
}
void drawCalendar(Date date) {
int daysInMonth;
switch (date.month) {
case 4:
case 6:
case 9:
case 11:
daysInMonth = 30;
break;
case 2:
if ((date.year % 4 == 0 && date.year % 100 != 0) || (date.year % 400 == 0))
daysInMonth = 29;
else
daysInMonth = 28;
break;
default:
daysInMonth = 31;
}
int firstDayOfMonth = (date.year - 1) * 365 + (date.year - 1) / 4 - (date.year - 1) / 100 + (date.year - 1) / 400;
for (int i = 1; i < date.month; i++) {
switch (i) {
case 4:
case 6:
case 9:
case 11:
firstDayOfMonth += 30;
break;
case 2:
if ((date.year % 4 == 0 && date.year % 100 != 0) || (date.year % 400 == 0))
firstDayOfMonth += 29;
else
firstDayOfMonth += 28;
break;
default:
firstDayOfMonth += 31;
}
}
firstDayOfMonth = (firstDayOfMonth + 1) % 7;
printf("----------------------------------------------\n");
printf("%s%d\n", gotoYear, date.year);
printf("%s%d\n", gotoMonth, date.month);
printf("----------------------------------------------\n");
printf("Sun Mon Tue Wed Thu Fri Sat\n");
for (int i = 0; i < firstDayOfMonth; i++) {
printf(" ");
}
for (int i = 1; i <= daysInMonth; i++) {
solar_to_lunar(date.year, date.month, i, &date.lunarYear, &date.lunarMonth, &date.lunarDay);
printf("%2d(%d) ", i, date.lunarDay);
if ((firstDayOfMonth + i) % 7 == 0) {
printf("\n");
}
}
printf("\n");
printf("----------------------------------------------\n");
}
void drawYearCalendar(int year) {
for (int i = 1; i <= 12; i++) {
Date monthDate = { year, i, 1, 0, 0, 0 };
drawCalendar(monthDate);
printf("\n");
}
}
void switchView(Date currentDate) {
clearScreen();
drawYearCalendar(currentDate.year);
printf("Press any key to continue...");
_getch();
}
void clearScreen() {
system("cls");
}
请注意:
- 这段代码使用了简化的农历计算函数,可能存在误差。
- 你需要根据实际需求完善农历计算部分的代码。
希望这些代码能够帮助你! 如果您还有其他问题,请随时提出。