编写一段c语言来实现并有注释
时间: 2025-03-08 16:06:27 浏览: 44
好的,下面是一段用于计算给定日期对应星期几的C语言程序。我们将基于您提供的初始条件(如2021年1月1日是星期五),并通过输入指定的年、月、日来获取该日期对应的星期几。
```c
#include <stdio.h>
// 函数声明:计算给定日期是这一年的第几天
int dayOfYear(int year, int month, int day);
// 主函数
int main() {
// 定义变量存储用户输入的年份、月份和日子
int year;
int month;
int day;
printf("请输入年份(YYYY): ");
scanf("%d", &year);
printf("请输入月份(MM): ");
scanf("%d", &month);
printf("请输入日子(DD): ");
scanf("%d", &day);
if (year == 2021 && month >= 1 && month <= 12 && day > 0 && day <= 31){
// 计算目标日期距年初有多少天,并减去第一天为周五的影响因子
int daysPassed = dayOfYear(year, month, day) - 1;
// 根据已知2021-01-01是Friday(设其编号为5)
const int baseWeekDay = 5;
// 求出相对于第一个星期五过去了多少天取模7后的值,再加上基数即可获得确切星期
int weekDayNumber = ((daysPassed % 7) + baseWeekDay) % 7;
char* weekDays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
printf("%d-%02d-%02d 是 %s\n", year, month, day, weekDays[weekDayNumber]);
} else {
printf("无效的日期范围。\n");
}
return 0;
}
// 实现辅助函数: 判断是否闰年
bool isLeapYear(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
// 辅助函数定义:返回当年某个月的日历表最大天数
int getMonthMaxDays(int y, int m) {
switch(m){
case 2 :
return isLeapYear(y)? 29 : 28 ;
case 4 :
case 6 :
case 9 :
case 11:
return 30;
default:
return 31;
}
}
// 完整版辅助函数:给出一个有效日期,判断它是本年的第几天。
int dayOfYear(int year, int month, int day) {
int sum = 0;
for (int i = 1; i < month; ++i)
sum += getMonthMaxDays(year, i); // 累计所有前几个月的最大天数
return sum + day; // 再加上当月实际过去的天数
}
```
### 这里我们做了哪些事情?
- `main` 中负责接收用户的输入;
- 使用了两个帮助函数 `isLeapYear()` 来检测是否为润年 和 `getMonthMaxDays()` 获取特定月份应该有的最多天数;
- 最终通过 `dayOfYear()` 将具体的日期转化为今年内的总天数形式;
- 根据所得到的信息结合基础信息(`baseWeekDay`) 推导最终答案。
请注意这段代码仅适用于公历年份,并假设输入的数据都是合法合理的。此外,在处理一些特殊情况时可能会有所不足,比如跨越多个世纪的变化规则等复杂情形未做特别优化。
阅读全文
相关推荐

















