#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