编程思路:按照以上背景知识可得判断闰年的规律:某年年份如果能被4整除但不能被100整除,或者能被400整除则是闰年。由此规则可推得计算万年历的公式:
s=X-1+(X-1)/4-(X-1)/100+(x-1)/400+c 上式中:X为公元年数(如2003年);C 为从元旦起,到要算的那天总数(如2003年3月23日,C=31+28+23=82)。S/7余数是星期几。
代码如下:
#include "stdafx.h"
#include <iomanip.h>
void printMonth(int month);
void printHead(int month);
int daysOfMonth(int month);
int firstDay(int year);
int year,weekday;
int main(int argc, char* argv[])
{
int i = 1;
cout << "请输入年份:";
cin >> year;
weekday = firstDay(year);
cout << endl << " " << "第" << year << "年的日历如下:" << endl << endl;
while(i <= 12)
{
printMonth(i);
cout << endl << endl;
i++;
}
return 0;
}//end main()
void printMonth(int month) //打印每月日历
{
int i = 1, days;
printHead(month);
days = daysOfMonth(month);
cout << " ";
while(i <= days)
{
cout << setw(5) << i;
weekday = (weekday + 1)%7;
if(!weekday)
{
cout << endl;
cout << " ";
}
i++;
}
}//end printMonth()
void printHead(int month) //打印每月的日历头(判定起始位置)
{
cout << month << "月" << setw(5) << "日" << setw(5) << "一" << setw(5) << setw(5) << "二"
<< setw(5) << "三" << setw(5) << "四" << setw(5) << "五" << setw(5) << "六" << endl;
int i = 0;
while(i < weekday)
{
cout << " ";
i++;
}
}//end pintHead()
int daysOfMonth(int month) //每月的天数
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if(year%4==0 && year%100 !=0 || year%400 == 0)
return 29;
else return 28;
default:
return 0;
}
}//end daysOfMonth
int firstDay(int year) //判断某年元旦是星期几
{
int s;
s = year - 1 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + 1;
return s%7;
}//end firstDay()