一、代码展示
#include<stdio.h>
int leapyear(int year)//判断是不是闰年函数
{if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)return 1;elsereturn 0;
}
int days(int year, int month, int* day)//判断一个月有几天
{if (month != 2)return day[month - 1];elsereturn 28 + leapyear(year);//如果是闰年则28+1;如果不是就28
}
int sumdays(int year, int month, int* day)
{int sum=0;for (int i = 1900; i < year; i++) {if (leapyear(i) == 1)sum += 366;elsesum += 365;}for (int j = 1; j < month; j++) {sum += days(year, j, day);//计算一年中到目标月有几天}return sum;
}
int print(int month, int year, int* day) {int max = days(year, month, day);int min = sumdays(year, month, day) % 7;printf(" %d月 %d年 \n", month, year);printf(" 一 二 三 四 五 六 日\n");for (int j = min; j > 0; j--) {printf(" ");}for (int i = 1; i <= max; i++) {printf("%4d", i);if ((i + min) % 7 == 0)printf("\n");}
}int main() {int year, month;int day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };printf("Please enter the year and month you want to query:");scanf("%d %d", &year, &month);if (month > 12 || month < 1){printf("Input Error!\n");}print(month, year, day);putchar('\n');return 0;
}
二、代码分析
int leapyear(int year)//判断是不是闰年函数
{if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)return 1;elsereturn 0;
}
这是一个名为 leapyear
的函数,用来判断给定的年份是否为闰年。根据闰年的规则,如果一个年份能被4整除且不能被100整除,或者能被400整除,那么这个年份就是闰年。该函数返回1表示是闰年,返回0表示不是闰年。
int days(int year, int month, int* day)//判断一个月有几天
{if (month != 2)return day[month - 1];elsereturn 28 + leapyear(year);//如果是闰年则28+1;如果不是就28
}
days
函数用于确定一个月份有多少天。对于非二月(2月)的月份,天数直接由数组 day
提供,其中 day
数组包含了每个月的天数。对于2月,如果当前年是闰年,那么2月就有29天,否则只有28天。
int sumdays(int year, int month, int* day)
{int sum=0;for (int i = 1900; i < year; i++) {if (leapyear(i) == 1)sum += 366;elsesum += 365;}for (int j = 1; j < month; j++) {sum += days(year, j, day);//计算一年中到目标月有几天}return sum;
}
sumdays
函数计算从1900年到给定年份的前一年之间的总天数,再加上给定年份中截止到目标月份的总天数。这样得到的是自1900年以来的累积天数,可以用来确定星期几。
int print(int month, int year, int* day) {int max = days(year, month, day);int min = sumdays(year, month, day) % 7;printf(" %d月 %d年 \n", month, year);printf(" 一 二 三 四 五 六 日\n");for (int j = min; j > 0; j--) {printf(" ");}for (int i = 1; i <= max; i++) {printf("%4d", i);if ((i + min) % 7 == 0)printf("\n");}
}
print
函数负责打印出给定月份和年份的日历。首先,它调用 days
和 sumdays
函数来获取这个月有多少天和月初是星期几。然后按照格式打印出日历的头信息,接着通过循环打印出日期,并在每7个数字后换行以形成一周的格式。
int main() {int year, month;int day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };printf("Please enter the year and month you want to query:");scanf("%d %d", &year, &month);if (month > 12 || month < 1){printf("Input Error!\n");}print(month, year, day);putchar('\n');return 0;
}
主函数 main
是程序的入口点。它声明了两个整数变量 year
和 month
来存储用户输入的年份和月份。还初始化了一个包含各个月份天数的数组 day
。接下来提示用户输入要查询的年份和月份,并检查输入是否有效(即月份是否在1到12之间)。最后调用 print
函数打印日历,并在结束时添加一个新行字符。