C语言编程题实现一个简易的日历应用

C语言编程题,实现一个简易的日历应用,可以根据用户输入的年份和月份,显示该月的日历。可以判断输入年份是否为闰年,计算每个月的第一天是星期几。

1、函数声明

声明4个函数,分别为isLeapYear 函判断输入的年份是否为闰年,getDaysInMonth 函数根据月份和是否闰年返回该月的天数,getFirstDayOfMonth 函数使用蔡勒公式计算某月的第一天是星期几。printCalendar 函数输出该年该月的日历。代码如下,

#include <stdio.h>

// 函数声明
int isLeapYear(int year);
int getDaysInMonth(int month, int year);
int getFirstDayOfMonth(int month, int year);
void printCalendar(int month, int year);

2、判断输入的年份是否为闰年

根据闰年的定义,年份需要满足,能被4整除但不能被100整除。 或能被400整除任一条件。

#include <stdio.h>

// 函数声明
int isLeapYear(int year);

int main() {
    int year, month;
    
    printf("%d",isLeapYear(2024));
    return 0;
}

// 判断是否是闰年
int isLeapYear(int year) {
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
        return 1;
    } else {
        return 0;
    }
}

3、计算月的天数

根据月份和是否闰年返回该月的天数。

#include <stdio.h>

// 函数声明
int isLeapYear(int year);

int main() {
    int year, month;
    
    printf("%d",getDaysInMonth(9,2024));
    return 0;
}

// 判断是否是闰年
int isLeapYear(int year) {
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
        return 1;
    } else {
        return 0;
    }
}

// 获取某个月的天数
int getDaysInMonth(int month, int year) {
    switch (month) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            return 31;
        case 4: case 6: case 9: case 11:
            return 30;
        case 2:
            if (isLeapYear(year)) {
                return 29;
            } else {
                return 28;
            }
    }
    return 0;
}

4、计算某月的第一天是星期几

使用蔡勒公式计算某月的第一天是星期几。

#include <stdio.h>

// 函数声明
int getFirstDayOfMonth(int month, int year);

int main() {
    int year, month;
    
    printf("%d",getFirstDayOfMonth(8,2024));
    
    return 0;
}

// 获取某月第一天是星期几
int getFirstDayOfMonth(int month, int year) {
    int day = 1, y, m;
    
    // 使用蔡勒公式(Zeller's Congruence)计算星期几
    if (month == 1 || month == 2) {
        month += 12;
        year--;
    }
    
    y = year % 100;
    m = year / 100;
    
    int firstDay = (day + 2*month + (3*(month+1))/5 + y + y/4 + m/4 - 2*m) % 7;
    
    // 调整为从周日(0)开始
    if (firstDay < 0) {
        firstDay += 7;
    }
    
    return firstDay;
}

5、输出日历

输出该年该月的日历。日历的第一行是星期的缩写,周日作为一周的第一天。根据该月的天数和第一天的星期数,输出每一天。

#include <stdio.h>

// 函数声明
int isLeapYear(int year);
int getDaysInMonth(int month, int year);
int getFirstDayOfMonth(int month, int year);
void printCalendar(int month, int year);

int main() {
    int year, month;
    
    // 用户输入年份和月份
    printf("请输入年份: ");
    scanf("%d", &year);
    
    printf("请输入月份 (1-12): ");
    scanf("%d", &month);
    
    // 打印该月份的日历
    printCalendar(month, year);
    
    return 0;
}

// 判断是否是闰年
int isLeapYear(int year) {
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
        return 1;
    } else {
        return 0;
    }
}

// 获取某个月的天数
int getDaysInMonth(int month, int year) {
    switch (month) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            return 31;
        case 4: case 6: case 9: case 11:
            return 30;
        case 2:
            if (isLeapYear(year)) {
                return 29;
            } else {
                return 28;
            }
    }
    return 0;
}

// 获取某月第一天是星期几
int getFirstDayOfMonth(int month, int year) {
    int day = 1, y, m;
    
    // 使用蔡勒公式(Zeller's Congruence)计算星期几
    if (month == 1 || month == 2) {
        month += 12;
        year--;
    }
    
    y = year % 100;
    m = year / 100;
    
    int firstDay = (day + 2*month + (3*(month+1))/5 + y + y/4 + m/4 - 2*m) % 7;
    
    // 调整为从周日(0)开始
    if (firstDay < 0) {
        firstDay += 7;
    }
    
    return firstDay;
}

// 打印日历
void printCalendar(int month, int year) {
    int days = getDaysInMonth(month, year);
    int firstDay = getFirstDayOfMonth(month, year);
    
    printf("\n    %d 年 %d 月\n", year, month);
    printf("日 一 二 三 四 五 六\n");
    
    // 输出空白的日期前置
    for (int i = 0; i < firstDay; i++) {
        printf("   ");
    }
    
    // 输出每一天
    for (int day = 1; day <= days; day++) {
        printf("%2d ", day);
        
        // 换行: 一周七天
        if ((day + firstDay) % 7 == 0) {
            printf("\n");
        }
    }
    
    printf("\n");
}

推荐阅读
cjavapy编程之路首页