怎么用C语言打印某一年中某月的日历

发布时间:2021-12-06 10:10:14 作者:iii
来源:亿速云 阅读:570
# 怎么用C语言打印某一年中某月的日历

## 引言

在日常编程练习或实际应用中,打印特定年份和月份的日历是一个常见的任务。本文将详细介绍如何使用C语言编写一个程序,实现输入年份和月份后,打印该月的日历。我们将从需求分析、算法设计、代码实现到最终测试逐步展开。

## 需求分析

1. **输入**:用户输入年份和月份。
2. **输出**:打印该月的日历,格式如下:
   July 2023

Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

3. **功能要求**:
   - 正确处理闰年。
   - 计算某个月的第一天是星期几。
   - 格式化输出日历。

## 算法设计

### 1. 判断闰年
闰年规则:
- 能被4整除但不能被100整除,或能被400整除。

```c
int is_leap_year(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

2. 计算某个月的天数

根据月份和闰年情况返回天数: - 4月、6月、9月、11月有30天。 - 2月平年28天,闰年29天。 - 其余月份31天。

int days_in_month(int month, int year) {
    if (month == 2) {
        return is_leap_year(year) ? 29 : 28;
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
        return 30;
    } else {
        return 31;
    }
}

3. 计算某年某月1日是星期几

使用蔡勒公式(Zeller’s Congruence): - 公式适用于格里高利历(1582年10月15日后)。 - 对1月和2月按上一年的13月和14月处理。

int day_of_week(int day, int month, int year) {
    if (month < 3) {
        month += 12;
        year--;
    }
    int k = year % 100;
    int j = year / 100;
    int h = (day + 13*(month + 1)/5 + k + k/4 + j/4 + 5*j) % 7;
    return (h + 5) % 7; // 转换为0=Sunday, 1=Monday,...,6=Saturday
}

4. 打印日历

步骤: 1. 打印月份和年份标题。 2. 打印星期标题(Su Mo Tu We Th Fr Sa)。 3. 根据1日的星期数打印前置空格。 4. 循环打印日期,每7天换行。

完整代码实现

#include <stdio.h>

int is_leap_year(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int days_in_month(int month, int year) {
    if (month == 2) {
        return is_leap_year(year) ? 29 : 28;
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
        return 30;
    } else {
        return 31;
    }
}

int day_of_week(int day, int month, int year) {
    if (month < 3) {
        month += 12;
        year--;
    }
    int k = year % 100;
    int j = year / 100;
    int h = (day + 13*(month + 1)/5 + k + k/4 + j/4 + 5*j) % 7;
    return (h + 5) % 7;
}

void print_calendar(int month, int year) {
    const char *months[] = {"January", "February", "March", "April", "May", "June",
                            "July", "August", "September", "October", "November", "December"};
    printf("     %s %d\n", months[month - 1], year);
    printf("Su Mo Tu We Th Fr Sa\n");

    int days = days_in_month(month, year);
    int first_day = day_of_week(1, month, year);

    for (int i = 0; i < first_day; i++) {
        printf("   ");
    }

    for (int day = 1; day <= days; day++) {
        printf("%2d ", day);
        if ((day + first_day) % 7 == 0 || day == days) {
            printf("\n");
        }
    }
}

int main() {
    int year, month;
    printf("Enter year and month (e.g., 2023 7): ");
    scanf("%d %d", &year, &month);

    if (month < 1 || month > 12) {
        printf("Invalid month!\n");
        return 1;
    }

    print_calendar(month, year);
    return 0;
}

测试示例

输入1

2023 7

输出1

     July 2023
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

输入2(闰年2月)

2020 2

输出2

   February 2020
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29

总结

通过本文,我们学习了: 1. 如何用C语言判断闰年。 2. 如何计算某个月的天数。 3. 使用蔡勒公式计算星期几。 4. 综合运用循环和条件语句格式化输出日历。

此程序可以进一步扩展为打印全年日历或添加节假日标记等功能。希望这篇教程对你有所帮助! “`

这篇教程涵盖了从理论到实践的完整实现,代码可直接编译运行。如需扩展功能(如多语言支持或图形界面),可在现有基础上进一步开发。

推荐阅读:
  1. 打印Windows系统日历格式
  2. java控制台打印本月的日历

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:怎么实现Perl正则表达式匹配

下一篇:JavaScript如何实现优先级队列

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》