

#include <stdio.h>#include<stdbool.h>//声明所有用到的函数void printMonth(int, int);void printMonthTitle(int, int);void printMonthBody(int, int);int getStartDay(int, int);int getTotalNumberOfDays(int, int);int getNumberOfDaysInMonth(int, int);bool isLeapYear(int);int main() { int year, month; printf("请输入一个年份(例如: 2001): "); scanf_s("%d", &year); fflush(stdin); printf("请输入一个月份(1-12的数字): "); scanf_s("%d", &month); fflush(stdin); // 调用printMonth函数打印相应年份和月份的日历 printMonth(year, month); return 0;}/** 打印相应年份和月份的日历 */void printMonth(int year, int month) { // 打印日历的开头 printMonthTitle(year, month); // 打印日历内容 printMonthBody(year, month);}/** 打印月份的开头*/void printMonthTitle(int year, int month) { // 填写代码打印月份的开头 printf("\t\t----------%d年--%d月--------",year,month); printf("\n"); printf("\t\t-----------------------------"); printf("\n"); printf("\t一\t二\t三\t四\t五\t六\t日"); printf("\n");}/** 打印日历内容 */void printMonthBody(int year, int month) { // 调用getStartDay函数获得每月第一天是星期几 int xqj; int ts; int x,j; j = 1; xqj = getStartDay(year, month); // 调用getNumberOfDaysInMonth函数获得某个月有几天? ts = getNumberOfDaysInMonth(year, month); // 在当月的第一天前面加上若干空格 for (x = 1; x < xqj; x++) printf("\t "); for (int i = 0; i < 5; i++) { for (x; x <= 7; x++) { if (j <= ts) { printf("\t%d", j++); } } printf("\n"); x = 1; }}/** 获得某月第一天是星期几 */int getStartDay(int year, int month) { const int START_DAY_FOR_JAN_1_1800 = 3; // 获得从 1800年1月1日 至 year年month月1日之间的天数 int xq; xq = getTotalNumberOfDays(year, month);// 返回year年month月1日是星期几 xq += 3 ; return xq%7;}/** 获得从 1800年1月1日 至 year年month月1日之间的天数 */int getTotalNumberOfDays(int year, int month) { // 获得从 1800年1月1日 至 year年month月1日之间的天数 int tgtn; int ksy; ksy = 1800; tgtn = 0; for (ksy; ksy < year; ksy++) { if (isLeapYear(ksy)) { tgtn += 366; } else tgtn += 365; }// 计算输入年份的1月1日至输入月份的第一天之间的日期数 for (month - 1; month - 1 > 0; month--) { tgtn += getNumberOfDaysInMonth(year, month-1); } return tgtn;}/** 获得每个月的天数 */int getNumberOfDaysInMonth(int year, int month) { if (month == 1|| month==3 || month==5 || month==7 || month==8 || month==10 || month==12) return 31; if (month == 2) { if (isLeapYear(year)) { return 29; } else return 28; } if (month == 4 || month == 6 || month == 9 || month == 11) return 30;}/** 判断是否是闰年 */bool isLeapYear(int year) { if (year % 100 == 0) { if ((year % 400 == 0)) return 1; else return 0; } else { if ((year % 4 == 0)) return 1; else return 0; }}