如图,找了半天不知道问题在哪!
自己写的日历,下面是代码,求大佬帮忙看看啊啊啊!
最好复制走在你们的机子上运行下,看看是不是也是输出两遍!
#include "stdio.h"
#include "math.h"
int getweek(int Y, int m, int d) {
if (m < 3) {
Y -= 1;
m += 12;
}
int y = Y % 100;
int C = Y - y;
int W = (C / 4 - 2 * C + y + y / 4 + 26 * (m + 1) / 10 + d - 1) % 7;
if (W < 0)
W += 7;
return W;
} /* 计算某一天是周几
W=[C/4]-2C+y+[y/4]+[26(m+1)/10]+d-1
其中,W是所求日期的星期数.如果求得的数大于7,可以减去7的倍数,直到余数小于7为止.c是公元年份的前两位数字,y是已知公元年份的后两位数字;m是月数,d是日数.方括[
]表示只截取该数的整数部分。
还有一个特别要注意的地方:所求的月份如果是1月或2月,则应视为前一年的13月或14月.所以公式中m
的取值范围不是1-12,而是3-14. */
bool isleep(int Y) {
if (Y % 400 == 0 || (Y % 100 != 0 && Y % 4 == 0))
return true;
else
return false;
} // 判断是否为闰年
int getdays(int Y, int M) {
switch (M) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
if (isleep(Y))
return 29;
else
return 28;
default:
return 30;
}
} /* 判断指定月有多少天 */
void printfMonth(int Y, int M) {
int d = getdays(Y, M);
int w = getweek(Y, M, 1);
int s = w;
printf
("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n");
while (s--)
printf("\t");
for (int i = 1; i <= d; i++) {
printf("%d\t", i);
if ((i + w) % 7 == 0)
printf("\n");
}
printf("\n");
}
int main() {
int Y, M;
char s=NULL;
printf("请输入年月,以空格间隔,enter结束输入\n");
scanf("%d %d", &Y, &M);fflush(stdin);
while (1) {
printf("%d年%d月:\n", Y, M);
printfMonth(Y, M);
printf
("输入a上一年,输入b下一年,输入c上一月,输入d下一月,输入e指定年份和月份\n");
scanf("%c", &s);
switch (s) {
case 'a':
Y--;
break;
case 'b':
Y++;
break;
case 'c':
if (M == 1) {
M = 12;
Y--;
} else
M--;
break;
case 'd':
if (M == 12) {
M = 1;
Y++;
} else
M++;
break;
case 'e':
printf("请输入年份和月份:");
scanf("%d %d", &Y, &M);
break;
default:
printf("未知命令,请重新输入!\n");
}
}
}