#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