//万年历程序
#include <iostream.h>
#include <iomanip.h>
//判断某年是否是闰年
bool isLeapYear(int year)
{
if((year%4==0&&year%100!=0)||(year%400==0))
return true;
else
return false;
}
//根据年和月计算天数
int daysOfMonth(int year,int month)
{
int result;
switch(month)
{
case 1:result=31;break;
case 2:
if(isLeapYear(year))result=29;
else result=28;
break;
case 3:result=31;break;
case 4:result=30;break;
case 5:result=31;break;
case 6:result=30;break;
case 7:result=31;break;
case 8:result=31;break;
case 9:result=30;break;
case 10:result=31;break;
case 11:result=30;break;
case 12:result=31;break;
}
return result;
}
void listMonth(int year,int month)
{
cout<<" "<<year<<" 年 "<<month<<" 月"<<endl;
cout<<"日 一 二 三 四 五 六"<<endl;;
long sub=0;
int i,j;
//计算该月1号和2004年1月1日(星期四)相差的天数
if(year>=2004)
{
for(int i=2004;i<year;i++)
if(isLeapYear(i)) sub+=366;
else sub+=365;
for(i=1;i<month;i++)
sub+=daysOfMonth(year,i);
sub=(sub+4)%7;
}
else
{
for(i=year+1;i<2004;i++)
if(isLeapYear(i)) sub+=366;
else sub+=365;
for(i=month;i<=12;i++)
sub+=daysOfMonth(year,i);
sub=7-(sub+3)%7
}
//显示1号前面的空格
for(j=1;j<=sub;j++)
cout<<" ";
int m=daysOfMonth(year,month);
for(i=1;i<=m;i++)
{
cout<<setw(2)<<i<<" ";
sub++;
if(sub==7)
{sub=0;cout<<endl;}
}
cout<<endl;
}
void main()
{
int select,year,month,i;
do
{
cout<<"请选择(1-年历 2-月历 0-退出):";
cin>>select;
switch(select)
{
case 0:return;
case 1:
cout<<"请输入年份";
cin>>year;
for(i=1;i<=12;i++)
listMonth(year,i);
break;
case 2:
cout<<"请输入年份和月份";
cin>>year>>month;
listMonth(year,month);
}
}while(true);
}