您好,登录后才能下订单哦!
# 怎么用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);
}
根据月份和闰年情况返回天数: - 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;
}
}
使用蔡勒公式(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
}
步骤: 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;
}
2023 7
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
2020 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. 综合运用循环和条件语句格式化输出日历。
此程序可以进一步扩展为打印全年日历或添加节假日标记等功能。希望这篇教程对你有所帮助! “`
这篇教程涵盖了从理论到实践的完整实现,代码可直接编译运行。如需扩展功能(如多语言支持或图形界面),可在现有基础上进一步开发。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。