C语言:输出年历

已知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("    ");
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值