日期与星期的计算:
已知1990年元旦是星期一,用函数实现:
( 1)求1990年元旦到2019年元旦中有几个元旦是星期一(包含1990年元旦星期一)。
( 2) 输出1990年到2019年元旦为星期一的年份。
(3)从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几
#include <stdio.h>
// 判断是否是闰年函数,如果是则返回 1,否则返回 0
int isLeap(int year) {
return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 1 : 0;
}
// 统计1990年到2019年元旦为星期一的年份,并输出结果
void countNewYearMondays() {
int num = 0; // 统计星期一的个数
int year, days, y, weekday;
printf("1990年到2019年元旦为星期一的年份:\n");
for(year = 1990; year <= 2019; year++) {
days = 0; // 当前年份距离1990年元旦的天数
for(y = 1990; y < year; y++) {
if(isLeap(y))
{days += 366;}
else
{days += 365;}
}
weekday = (days + 1) % 7; // 当前年份的元旦是星期几
if(weekday == 1) {
printf("\t%d", year); // 输出符合条件的年份
num++; // 统计个数
}
}
printf("\n\n1990年到2019年元旦共有%d个元旦是星期一\n\n", num); // 输出总数
}
// 根据输入的日期,计算出这一天是星期几,并输出结果
void getWeekDay() {
int year, month, day, days, y, m;
printf("请输入一个日期(格式:XXXX XX XX,如:2023 05 11):");
scanf("%d %d %d", &year, &month, &day);
days = 0;
// 计算输入年份距离1990年元旦的天数days
for(y = 1990; y < year; y++) {
if(isLeap(y))
{days += 366;}
else {days += 365;}
}
// 计算到输入月份最后一天的天数days
for(m = 1; m < month; m++) {
switch(m) {
case 4:
case 6:
case 9:
case 11:
days += 30;
break;
case 2:
days += (isLeap(year) ? 29 : 28);
break;
default:
days += 31;
}
}
days += day - 1; // 加上输入的天数
int weekday = (days + 1) % 7; // 计算是星期几
// 根据结果输出星期几
switch(weekday) {
case 0:
printf("%d年%d月%d日是星期日\n", year, month, day);
break;
case 1:
printf("%d年%d月%d日是星期一\n", year, month, day);
break;
case 2:
printf("%d年%d月%d日是星期二\n", year, month, day);
break;
case 3:
printf("%d年%d月%d日是星期三\n", year, month, day);
break;
case 4:
printf("%d年%d月%d日是星期四\n", year, month, day);
break;
case 5:
printf("%d年%d月%d日是星期五\n", year, month, day);
break;
default:
printf("%d年%d月%d日是星期六\n", year, month, day);
}
}
// 主函数
int main() {
countNewYearMondays(); // 统计1990年到2019年元旦为星期一的年份
getWeekDay(); // 输入日期,计算是星期几
return 0;
}