输入年份,打印出该年的日历:
#include <stdio.h>
void PrintEnter(int mod);
void PrintSkip(int lastday);
void PrintTitle(int year,int month);
int JudgeDays(int year, int month);
void PrintMonth(int year, int mod, int lastday);
int main()
{
int year;
//每一个月的最后一天
int lastday = 1;
printf("请输入年份:");
scanf("%d",&year);
//判断这一年的第一天为星期几
//公式: (5(year-1)/4-(year-1)/100+(year-1)/400)%7+1
int flag = (5 * (year-1) / 4 - (year-1) / 100+(year-1)/400) % 7+1;
//计算开头有几个
int skip = flag - 1;
//判断是否需要换行 判断每月最后一天
int mod = skip;
//直接调用PrintMonth函数打印月历
PrintMonth(year,mod,lastday);
return 0;
}
/**
* @brief JudgeDays 判断月份的天数
* @param year 判断年份是否为闰年
* @param month 需要判断的月份
* @return 返回值为月份的天数
*/
int JudgeDays(int year, int month) {
if(month==4||month==6||month==9||month==11)
return 30;
else if(month==2) {
//判断年份是否为闰年
if(year % 400 == 0 || (year % 100 !=0 && year % 4 == 0))
return 29;
else
return 28;
}
else
return 31;
}
/**
* @brief PrintTitle 打印月份的开头
* @param month 需要打印的月份
*/
void PrintTitle(int year, int month) {
printf("
");
printf("%d年%d月
",year,month);
printf("--------------------------------
");
printf("一 二 三 四 五 六 日
");
}
/**
* @brief PrintSkip 解决每一月开头的空格问题
* @param lastday 上一月份的最后一天
*/
void PrintSkip(int lastday) {
int i;
for(i = 0;i < lastday;i++) {
printf(" ");
}
}
/**
* @brief PrintEnter 判断是否换行
* @param mod 换行的标志(判断是否是七的倍数)
*/
void PrintEnter(int mod) {
if(mod % 7 ==0)
printf("
");
}
/**
* @brief PrintMonth 打印月历
* @param year 月历的年数
* @param mod 换行的标志
* @param lastday 每个月最后一天的标识
*/
void PrintMonth(int year, int mod, int lastday) {
//打印月历的头
PrintTitle(year,1);
//打印空格
PrintSkip(lastday);
//打印一月月历
int i;
for(i = 1;i <= 31;i++) {
mod++;
printf("%-5d",i);
//换行
PrintEnter(mod);
//判断一月的最后一天
if(i == 31)
lastday = mod % 7;
}
//每打印一个月换一行
printf("
");
int month;
for(month = 2;month < 13;month++) {
//打印月历的头
PrintTitle(year,month);
//打印空格
PrintSkip(lastday);
//打印二月到十二月的日历
int i;
for(i = 1;i <= JudgeDays(year, month);i++) {
mod++;
printf("%-5d",i);
//换行问题
PrintEnter(mod);
//判断每月的最后一天
if(i == JudgeDays(year, month))
lastday = mod % 7;
}
//每打印一个月换一行
printf("
");
}
}