#include//显示日历 using namespace std; //判断是否是闰年 bool isLeapYear(int year) { return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0); } //获得每个月的天数 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 == 4 || month == 6 || month == 9 || month == 11 ) return 30; if(month == 2) return isLeapYear(year) ? 29 : 28; return 0; // 如果月份不正确 ,则返回0 } //获得从1800年1月1日至year年month月1日之间的天数 int getTotalNumberOfDays(int year, int month) { //获得从1800年1月1日至year年1月1日之间的天数 int s = 0; for(int i = 1800; i <= year - 1; i++) { if(isLeapYear(i)) s += 366; else s += 365; } //计算输入年份的1月1日至输入月份的第一天之间的天数 for(int i = 1; i <= month - 1; i++) s += getNumberOfDaysInMonth(year,i); return s; } //获得某月第一天是星期几 int getStartDay(int year, int month) { const int START_DAY_FOR_JAN_1_1800 = 3; //获得从1800年1月1日至year年month月1日之间的天数 return (getTotalNumberOfDays(year,month) + START_DAY_FOR_JAN_1_1800) % 7; } //打印日历内容 void printfMonthBody(int year,int month) { //调用getStartDay函数获得每月第一天是星期几 int m = getStartDay(year, month); //调用getNumberOfDaysInMonth函数获得某个月有几天 int n = getNumberOfDaysInMonth(year, month); //在当月第一天前面加上空格 for(int i = 0; i < m ; i++) cout << " "; for(int i = 1; i <= n; i++) { printf("%4d",i); if((m+i)%7==0) printf("n"); } } //打印日历的开头 void printfMonthTitle(int year, int month) { printf(" %d 年 %d 月n",year,month); printf("----------------------------n"); printf(" 日 一 二 三 四 五 六n"); } //打印相应年份和月份的日历 void printf(int year,int month) { //打印日历的开头 printfMonthTitle(year,month); //打印日历内容 printfMonthBody(year,month); } int main() { int year, month; printf("请输入一个年份(例如:2001):"); scanf("%d",&year); printf("请输入一个月份(1-12的数字):"); scanf("%d",&month); //调用printfMonth函数打印相应年份和月份的日历 printf(year, month); return 0; }
程序运行结果:



