2401_83390351 2024-05-28 23:13 采纳率: 100%
浏览 25
已结题

万年历缺少农历,需要和阳历同时显示

万年历缺少农历,需要农历与阳历同时显示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h> // 包含了 _getch() 函数

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();

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') { // 如果是 'q' 键,退出程序
            break;
        }
        else if (inputChar == 'y' || inputChar == 'Y') { // 如果是 'y' 键,进入年份检索模式
            clearScreen();
            printf("Enter year: ");
            fgets(yearInput, sizeof(yearInput), stdin); // 获取用户输入的年份
            sscanf_s(yearInput, "%d", &currentDate.year); // 将输入的内容转换为整数,更新当前年份
        }
        else if (inputChar == 'v' || inputChar == 'V') { // 如果是 '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;
}

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;
        }
    }
    oid 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 = 0; i < month; i++) {
            days += month_days(year, i);
            if (days >= 60 && year % 4 == 0) {
                days++;
            }
        }
        days++;
        *lunar_year = year;
        *lunar_month = days % 10 + 1;
        *lunar_day = days / 10 + 1;
    }

    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++) {
        printf("%3d ", i);
        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");
}


这个程序可以运行
我目前尝试过将农历的程序插入,但不知道怎么插入。
“付费悬赏”
  • 写回答

14条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-05-28 23:18
    关注

    🕗晚上好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:曾经沧海难为水,除却巫山不是云。

    你想要实现的是在万年历中添加农历显示功能,并且能够在阳历和农历之间切换。我理解你想在原有代码的基础上进行修改,我会尽力帮你完成。

    以下是实现思路和修改后的代码:

    1. 农历计算函数:
      • 需要添加农历计算的函数,将阳历日期转换为农历日期。由于农历计算较为复杂,建议使用现有的农历库或算法。以下代码中,我提供了一个简单的农历计算函数 solar_to_lunar 作为示例,但其精度有限,仅供参考。实际应用中,建议寻找更精确的农历算法。
    2. 数据结构修改:
      • Date 结构体中添加 lunarYearlunarMonthlunarDay 三个成员变量,用于存储农历的年、月、日信息。
    3. 计算并显示农历:
      • drawCalendar 函数中,调用 solar_to_lunar 函数计算农历日期,并将农历日期信息格式化输出到日历中。
    4. 切换视图:
      • 可以设置一个标志位来标识当前显示的是阳历视图还是农历视图。在 switchView 函数中,根据标志位的值调用不同的绘制函数。
    5. 其他细节:
      • 需要处理闰月的情况。
      • 可以考虑优化代码结构,提高代码可读性和可维护性。

    以下是修改后的代码:

    #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", &currentDate.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");
    }
    

    请注意:

    • 这段代码使用了简化的农历计算函数,可能存在误差。
    • 你需要根据实际需求完善农历计算部分的代码。

    希望这些代码能够帮助你! 如果您还有其他问题,请随时提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(13条)

报告相同问题?

问题事件

  • 系统已结题 6月6日
  • 已采纳回答 5月29日
  • 创建了问题 5月28日

悬赏问题

  • ¥15 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 添加组件无法加载页面,某块加载卡住
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用