C语言已知2010年1月1日为星期五,设计程序按照下述格式打印2010年1月及以后的某月的日历,拒绝打印以前月份的日历。
时间: 2024-10-11 18:07:57 浏览: 48
在C语言中,我们可以使用`<time.h>`头文件中的`mktime()`函数以及`strftime()`函数来实现这个功能。首先,我们需要计算给定日期后的每个月份的第一天。由于已知2010年1月1日是星期五,我们可以推算出其他日期。
下面是一个简单的示例程序结构:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 函数返回给定日期之后的下一个同月第一天
time_t get_next_month_day(int year, int month, int day) {
struct tm date;
memset(&date, 0, sizeof(date));
date.tm_year = year - 1900; // 使用tm_year而不是year避免溢出
date.tm_mon = month - 1; // months start from January=0
date.tm_mday = day;
while (1) { // 循环直到找到同月第一天
time_t new_date = mktime(&date);
if (new_date != -1) break; // 如果成功,跳出循环
++date.tm_mday; // 如果超过当月天数,跳到下个月
}
return new_date;
}
void print_calendar(int year, int month) {
struct tm t = {0};
t.tm_year = year - 1900;
t.tm_mon = month - 1;
// 设置日期格式
char format[] = "%a %d %b %Y";
// 计算第一个工作日(周一)
while (t.tm_wday >= 6) {
t.tm_mday++;
}
// 打印日历
time_t cal_date = mktime(&t);
char calendar[80];
strftime(calendar, sizeof(calendar), format, &t);
printf("%s\n", calendar);
// 接下来几天逐行打印
for (int i = 1; i < 32; ++i) {
t.tm_mday = i;
if (t.tm_mday > days_in_month(year, month)) break; // 检查是否超出该月天数
calendar[0] = '\0';
strftime(calendar, sizeof(calendar), format, &t);
printf("%s\n", calendar);
}
}
// 获取给定年份和月份的总天数
int days_in_month(int year, int month) {
if (month == 2) {
// 跳过闰年的二月
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return 29;
} else {
return 28;
}
} else if (month in [4, 6, 9, 11]) {
return 30; // 四月、六月、九月和十一月有30天
} else {
return 31; // 其他月份都是31天
}
}
int main() {
int year = 2010;
int month = 1; // 或者输入用户想要查看的月份
if (month <= 12) { // 拒绝打印以前月份的日历
print_calendar(year, month);
} else {
printf("Invalid month!\n");
}
return 0;
}
```
在这个程序中,我们首先定义了一些辅助函数,如`get_next_month_day()`用于获取指定日期之后的同月第一天,`days_in_month()`用于获取给定月份的天数,然后主函数`main()`调用`print_calendar()`来生成并打印日历。注意,这里假设了输入的月份是1-12之间的合法值。
阅读全文