已知1970年1月1日是星期四,输入1970年之后任意一年的年份,输出该年历,效果如图所示
|=====================The Calendar of Year 2004====================|
: 1 SUN MON TUE WED THU FRI SAT 7 SUN MON TUE WED THU FRI SAT :
: 1 2 3 1 2 3 :
: 4 5 6 7 8 9 10 4 5 6 7 8 9 10 :
: 11 12 13 14 15 16 17 11 12 13 14 15 16 17 :
: 18 19 20 21 22 23 24 18 19 20 21 22 23 24 :
: 25 26 27 28 29 30 31 25 26 27 28 29 30 31 :
: 2 SUN MON TUE WED THU FRI SAT 8 SUN MON TUE WED THU FRI SAT :
: 1 2 3 4 5 6 7 1 2 3 4 5 6 7 :
: 8 9 10 11 12 13 14 8 9 10 11 12 13 14 :
: 15 16 17 18 19 20 21 15 16 17 18 19 20 21 :
: 22 23 24 25 26 27 28 22 23 24 25 26 27 28 :
: 29 29 30 31 :
: 3 SUN MON TUE WED THU FRI SAT 9 SUN MON TUE WED THU FRI SAT :
: 1 2 3 4 5 6 1 2 3 4 :
: 7 8 9 10 11 12 13 5 6 7 8 9 10 11 :
: 14 15 16 17 18 19 20 12 13 14 15 16 17 18 :
: 21 22 23 24 25 26 27 19 20 21 22 23 24 25 :
: 28 29 30 31 26 27 28 29 30 :
: 4 SUN MON TUE WED THU FRI SAT 10 SUN MON TUE WED THU FRI SAT :
: 1 2 3 1 2 :
: 4 5 6 7 8 9 10 3 4 5 6 7 8 9 :
: 11 12 13 14 15 16 17 10 11 12 13 14 15 16 :
: 18 19 20 21 22 23 24 17 18 19 20 21 22 23 :
: 25 26 27 28 29 30 24 25 26 27 28 29 30 :
: 31 :
: 5 SUN MON TUE WED THU FRI SAT 11 SUN MON TUE WED THU FRI SAT :
: 1 1 2 3 4 5 6 :
: 2 3 4 5 6 7 8 7 8 9 10 11 12 13 :
: 9 10 11 12 13 14 15 14 15 16 17 18 19 20 :
: 16 17 18 19 20 21 22 21 22 23 24 25 26 27 :
: 23 24 25 26 27 28 29 28 29 30 :
: 30 31 :
: 6 SUN MON TUE WED THU FRI SAT 12 SUN MON TUE WED THU FRI SAT :
: 1 2 3 4 5 1 2 3 4 :
: 6 7 8 9 10 11 12 5 6 7 8 9 10 11 :
: 13 14 15 16 17 18 19 12 13 14 15 16 17 18 :
: 20 21 22 23 24 25 26 19 20 21 22 23 24 25 :
: 27 28 29 30 26 27 28 29 30 31 :
|==================================================================|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int Month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//内部逻辑的实现
//判断是否是闰年
int isleapyear(int year);
//判断给定年份的第一天的距1970年1月1日的总天数
int sumofday(int year, int month);
//设置日历外观样式
//打印日历上边框
void printBorder_up(int year);
//打印日历下边框
void printBorder_down(int year);
//打印日历内容,分为六块,每块又由表头、衔接、表尾组成
void printBody(int year);
//打印日历表头
void printTitle(int month1, int month2);
//打印日历内容
void printDate(int month1, int month2, int year);
//衔接部分
void part(int year, int month, int* day);
int main() {
int year;
scanf("%d", &year);
printBorder_up(year);
printBody(year);
printBorder_down(year);
system("pause");
return 0;
}
//判断闰年
int isleapyear(int year) {
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
return 1;
}
else {
return 0;
}
}
//判断给定年份的第一天的距1970年1月1日的总天数
//用以判断指定年份对应的每月的第一天是星期几
int sumofday(int year, int month) {
int sum = 0;
int i = 1970;
for (int i = 1970; i < year; i++) {
if (isleapyear(i)) {
sum += 366;
}
else {
sum += 365;
}
}
if (isleapyear(i)) {
Month[2] = 29;
}
for (int i = 0; i < month; i++) {
sum += Month[i];
}
return sum;
}
//打印日历上边框
void printBorder_up(int year) {
printf("|=====================The Calendar of Year %d====================|\n", year);
}
//打印日历下边框
void printBorder_down(int year) {
printf("|==================================================================|\n");
}
//打印日历内容,分为六块表,每块表又由表头、表内容组成
void printBody(int year) {
for (int i = 0; i < 6; i++) {
//打印表头
printTitle(i + 1, i + 7);
//打印表内容
printDate(i + 1, i + 7, year);
}
}
//表头,两列组成
void printTitle(int month1, int month2) {
printf(": %2d SUN MON TUE WED THU FRI SAT %2d SUN MON TUE WED THU FRI SAT :\n", month1, month2);
}
//表内容的排版,part函数显示日期,分为五个部分;边框-日期-边框-日期-边框
void printDate(int month1, int month2, int year) {
//每次循环调用不同的函数,需要记录天数,传地址,防止丢失
int day1 = 1, day2 = 1;
//打印天数,最多6行,31天
for (int i = 0; i < 6; i++) {
//显示边框
printf(": ");
//显示日期
part(year, month1, &day1);
//显示中间边框
printf(" ");
//显示日期
part(year, month2, &day2);
//显示边框
printf(" :\n");
}
}
//显示日期
void part(int year, int month, int* day) {
if (isleapyear(year)) {
Month[2] = 29;
}
//第一天需要输入到对应的位置上
if (*day == 1) {
//判断给定年份的第一天的距1970年1月1日的总天数
int sum = sumofday(year, month);
//设置总天数对应星期几,星期四对应第4天
int step = (sum + 4) % 7;
for (int i = 0; i < 7; i++) {
//非对应的地方输出空格
if (step != 0) {
step--;
printf(" ");
}
//输出第一天的所在位置
else {
printf("%3d ", *day);
(*day)++;
}
}
}
//之后直接累加天数即可
else {
for (int i = 0; i < 7; i++) {
if (*day <= Month[month]) {
printf("%3d ", *day);
(*day)++;
}
//超过当月天数的不输出
else {
printf(" ");
}
}
}
}