题目描述
已知2007年1月1日为星期一。
设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。
为完成此函数,设计必要的辅助函数可能也是必要的。其中输入为年分和月份。
注意:短线“-”个数要与题目中一致,否则系统会判为错误。
输入格式
年月和月份
输出格式
无
样例输入
2010 9
样例输出
---------------------
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
---------------------
思路
先计算闰年,计算过去几年几月的天数与7求余得到这个月的星期,再从这天开始输出日历,到了星期六就换下一行
#include<stdio.h>
int Month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//月份对应的天数
int LearYear(int year) {//计算经过了几个闰年
int leap = 0;
for (int i = 2007;i < year;i++) {
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {//闰年
leap++;
}
}
return leap;
}
int main() {
int year, month;
int i;
scanf("%d %d", &year, &month);
int leap = LearYear(year);
int day = leap * 366 + (year - 2007 - leap) * 365;//过去年份的天数
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)//今年是否是闰年,闰年二月天数+1
Month[1]++;
for (i = 0;i < month - 1;i++) {//加上过去的月份天数
day += Month[i];
}
int week;
week = (day + 1) % 7;//计算开始那天的星期
printf("---------------------\n");
printf(" Su Mo Tu We Th Fr Sa\n");
printf("---------------------\n");
for (i = 0;i < week;i++) {
printf(" ");//前面的空缺
}
int k = 1;//日期
while (k <= Month[month - 1]) {//当月天数
printf("%3d", k);
k++;
i = (i + 1) % 7;
if (i == 0) {//下一行
printf("\n");
}
}
if (i) {
printf("\n");
}
printf("---------------------\n");
return 0;
}
521

被折叠的 条评论
为什么被折叠?



