7-6 万年历
分数 20
全屏浏览题目
切换布局
作者 李卫明
单位 杭州电子科技大学
编写程序, 读入任一年份,模拟挂历输出该年年历, 要求每两月并排显示。每个日期占4位,左右月份间空8位,标题位于相应中间位置,年历标题和每月后空一行。
星期几可通过与基准日相差天数求得,不所有简化公式,如使用简化公式,需证明其正确性。输入年份范围为1900~2100。
输入格式:
年份。
输出格式:
双列年历。
输入样例:
2019
输出样例:
2019 Calendar
January February
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 1 2
6 7 8 9 10 11 12 3 4 5 6 7 8 9
13 14 15 16 17 18 19 10 11 12 13 14 15 16
20 21 22 23 24 25 26 17 18 19 20 21 22 23
27 28 29 30 31 24 25 26 27 28
March April
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 1 2 3 4 5 6
3 4 5 6 7 8 9 7 8 9 10 11 12 13
10 11 12 13 14 15 16 14 15 16 17 18 19 20
17 18 19 20 21 22 23 21 22 23 24 25 26 27
24 25 26 27 28 29 30 28 29 30
31
May June
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 1
5 6 7 8 9 10 11 2 3 4 5 6 7 8
12 13 14 15 16 17 18 9 10 11 12 13 14 15
19 20 21 22 23 24 25 16 17 18 19 20 21 22
26 27 28 29 30 31 23 24 25 26 27 28 29
30
July August
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 1 2 3
7 8 9 10 11 12 13 4 5 6 7 8 9 10
14 15 16 17 18 19 20 11 12 13 14 15 16 17
21 22 23 24 25 26 27 18 19 20 21 22 23 24
28 29 30 31 25 26 27 28 29 30 31
September October
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7 1 2 3 4 5
8 9 10 11 12 13 14 6 7 8 9 10 11 12
15 16 17 18 19 20 21 13 14 15 16 17 18 19
22 23 24 25 26 27 28 20 21 22 23 24 25 26
29 30 27 28 29 30 31
November December
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 1 2 3 4 5 6 7
3 4 5 6 7 8 9 8 9 10 11 12 13 14
10 11 12 13 14 15 16 15 16 17 18 19 20 21
17 18 19 20 21 22 23 22 23 24 25 26 27 28
24 25 26 27 28 29 30 29 30 31
完整代码:
#include<stdio.h> int Month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; int runnian(int n) { if (n % 400 == 0 || (n % 4 == 0 && n % 100 != 0)) { return 1; } else { return 0; } } int sumday(int n) { int i; int count = 1; int sum = 0; for (i = 1900; i < n; i++) { if (runnian(i) == 1) { count += 2; } else { count += 1; } count = count % 7; } return count; } void printmonth(int i) { switch (i) { case 1: printf(" January February\n"); break; case 2: printf(" March April\n"); break; case 3: printf(" May June\n"); break; case 4: printf(" July August\n"); break; case 5: printf(" September October\n"); break; case 6: printf(" November December\n"); break; default: printf("请重新输入正确的数值\n"); break; } } int main() { int n, j = 0, count1 = 0; scanf("%d", &n); if (runnian(n) == 1) { Month[2] = 29; } int m = sumday(n); printf(" %d Calendar\n", n); int week = sumday(n);//从礼拜几开始 int week1[13] = { 0 }; week1[1] = week; for (int p = 2; p <= Month[1]; p++) { week = (week + 1) % 7; } week1[2] = (week + 1) % 7; for (int i = 3; i <= 12; i++)//每个月从礼拜几开始 { for (int p = 1; p <= Month[i - 1]; p++) { week = (week + 1) % 7; } week1[i] = (week + 1) % 7; } int a[32] = { 0 }; for (int i = 1; i <= 31; i++) { a[i] = i; } int i = 1; for (int c = 1; c <= 6; c++) { int flag = 0; int x = 1; int weekk = week1[i + 1]; week = week1[i]; printf("\n"); printf("\n"); printf("\n"); printmonth(c); printf("\n"); printf(" Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat\n"); printf("\n"); //开始打印 for (int k = 1; k <= week * 4; k++) { printf(" "); } for (j = 1; j <= Month[i]; j++) { printf("%4d", j); week = (week + 1) % 7; if (a[x] == Month[i + 1] && j == Month[i]) { break; } else if (week == 0 || j == Month[i]) { if (j != Month[i]) { printf(" "); if (flag == 0) { flag = 1; for (int k = 1; k <= week1[i + 1] * 4; k++) { printf(" "); } while (1) { if (a[x] <= Month[i + 1]) { if (a[x] != Month[i + 1]) { printf("%4d", a[x]); x++; } else if (a[x] == Month[i + 1]) { printf("%4d", a[x]); printf("\n"); break; } } weekk = (weekk + 1) % 7; if (weekk == 0) { if (a[x] == Month[i + 1]) { x--; } printf("\n"); printf("\n"); break; } } } else { while (1) { if (a[x] <= Month[i + 1]) { if (a[x] != Month[i + 1]) { printf("%4d", a[x]); x++; } else if (a[x] == Month[i + 1]) { printf("%4d", a[x]); printf("\n"); printf("\n"); break; } } weekk = (weekk + 1) % 7; if (weekk == 0) { if (a[x] == Month[i + 1]) { x--; } printf("\n"); printf("\n"); break; } } } } else { int week3 = week1[i + 1]; while (week3 % 7 != 0) { printf(" "); week3++; } printf(" "); while (1) { if (a[x] <= Month[i + 1]) { if (a[x] != Month[i + 1]) { printf("%4d", a[x]); x++; } else if (a[x] == Month[i + 1]) { printf("%4d", a[x]); printf("\n"); break; } } else { printf("\n"); break; } weekk = (weekk + 1) % 7; if (weekk == 0) { x--; printf("\n"); printf("\n"); break; } } } } } if (a[x] < Month[i + 1]) { x++; printf(" "); while (1) { if (a[x] <= Month[i + 1]) { if (a[x] != Month[i + 1]) { printf("%4d", a[x]); x++; } else if (a[x] == Month[i + 1]) { printf("%4d", a[x]); printf("\n"); break; } } else { printf("\n"); break; } weekk = (weekk + 1) % 7; if (weekk == 0) { printf("\n"); printf("\n"); break; } } } i = i + 2; } return 0; }