首页 > 其他 > 详细

输入一个年份,打印日历

时间:2016-01-06 12:03:28      阅读:143      评论:0      收藏:0      [点我收藏+]
#include <stdio.h>
#include <stdlib.h>

/*
	(5)输入一个年份,输出该年份的日历。
*/

const int monthDays[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

void printYearCalendar(int);
void printTwoMonthCalendar(int year, int month);	//打印出month月份和month+6月份的日历
int getWeekDay(int year,int month,int day);
int daysBetweenDays(int year1,int month1,int day1,int year2,int month2,int day2);
int dayOfYear(int year,int month,int day);	//当年第几天
int isLeapYear(int year);	//是否是闰年
int daysBetweenYear(int year1,int year2);	//求出year1与year2之间的日期数
void printRow(int days[6][7], int row);
void getMonthMatrix(int days[6][7], int year, int month);	//获得year年month月的日历存储数组

int main() {
	int year;
	while (fflush(stdin), scanf("%d",&year)){
		printYearCalendar(year);
	}
	system("pause");
	return 0;
}

void printYearCalendar(int year){
	printf("|-------------------The Calendar of Year %d ------------------|\n",year);
	for (int i = 1; i <= 6; ++i){	//i表示月份
		printTwoMonthCalendar(year,i);
	}
	printf("|---------------------------------------------------------------|\n");
}

int getWeekDay(int year, int month, int day){
	//基准取2016/1/3,周日
	//SUN返回0
	//MON-SAT分别返回1-6
	if ((year >= 2016) && (month >= 1) && (day >= 3))
		return daysBetweenDays(2016,1,3,year,month,day) % 7;
	else
		return (7 - daysBetweenDays(year, month, day, 2016, 1, 3) % 7) % 7;
}

int daysBetweenYear(int year1, int year2){
	//year1 < year2为正数
	//year1 > year2为负数
	int maxYear = (year1 > year2) ? year1 : year2;
	int minYear = (year1 > year2) ? year2 : year1;
	int totalDays = 0;
	for (int i = minYear; i < maxYear; ++i)
		if (isLeapYear(i))
			totalDays += 366;
		else
			totalDays += 365;
	if (minYear == year1)
		return totalDays;
	else
		return -totalDays;
}

int daysBetweenDays(int year1, int month1, int day1, int year2, int month2, int day2){
	//日期1<日期二为负数
	//日期1>日期二为正数
	int days1 = dayOfYear(year1,month1,day1);
	int days2 = dayOfYear(year2,month2,day2);
	int days3 = daysBetweenYear(year1,year2);
	int totalDays = days2 + days3 - days1;
	return totalDays;
}

int dayOfYear(int year, int month, int day){//当年第几天
	int total = 0;
	for (int i = 0; i < month - 1; ++i)
		total += monthDays[i];
	total += day;
	if (isLeapYear(year) && (month > 2))
		total++;
	return total;
}

int isLeapYear(int year){
	if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
		return 1;
	else
		return 0;
}

void printRow(int days[6][7],int row){	//打印日历的每一行
	for (int j = 0; j < 7; ++j){
		if (days[row][j] == 0)
			printf("   ");
		else if (days[row][j] < 10)
			printf("  %d", days[row][j]);
		else
			printf(" %d", days[row][j]);
		printf(" ");
	}
}

void getMonthMatrix(int days[6][7],int year,int month){	//引用传递
	int monthDay = monthDays[month - 1];
	if (isLeapYear(year) && (month == 2))
		monthDay++;
	int weekday_1 = getWeekDay(year,month,1);
	for (int i = 1; i <= monthDay; ++i){
		int weekday = getWeekDay(year,month,i);	//求出i所在的列
		int row = (i - 1+ weekday_1)/7;	//求出i所在的行
		days[row][weekday] = i;
	}
}

void printTwoMonthCalendar(int year,int month1){
	printf("|%3d SUN MON TUE WED THU FRI SAT",month1);
		printf("%3d SUN MON TUE WED THU FRI SAT |\n", month1 + 6);
	int days1[6][7] = { 0 };	//存储month1月日历每一项的值
	int days2[6][7] = { 0 };	//存储month1+6月日历每一项的值
	getMonthMatrix(days1,year,month1);
	getMonthMatrix(days2, year, month1 + 6);
	for (int i = 0; i < 6; ++i){	//打印每一行
		if (i == 5){
			int has6row = 0;
			for (int j = 0; j < 7; ++j)
				if ((days1[i][j] != 0) || (days2[i][j] != 0)){
					has6row = 1;
					break;
				}
			if (has6row == 0)
				break;
		}
		printf("|   ");
		//打印month1月
		printRow(days1,i);
		printf("    ");
		//打印month1+6月
		printRow(days2,i);
		printf("|\n");
	}
}

  

输入一个年份,打印日历

原文:http://www.cnblogs.com/mutaohengheng/p/5104838.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!