目标:编程实现1901年以后的某年某月的日历,已知1901年第一天为星期二。
#include<iostream.h>
int IsLeapYear(int y) /*判断是否闰年*/ //闰年返回1 不是闰年返回0
{
if(y%4==0||y%400==0)
return 1;
return 0;
}
int GetDaysofMonth(int y,int m) /*确定某个月的天数*/
{
int ts;
if((m==1)||(m==3)||(m==5)||(m==7)||(m==8)||(m==10)||(m==12))
ts=31;
else if(m!=2)
ts=30;
else if(m==2&&IsLeapYear(y))
ts=29;
else
ts=28;
return ts;
}
int GetTotalDays(int y,int m) /*计算从1901年1月开始到给定年月的天数*/
{
int tianshu=0,i=0;
while(m>0)
{
tianshu+=GetDaysofMonth(y,m);
m--;
}
while(y>=1902)
{
if(IsLeapYear(y))
tianshu+=366;
else
tianshu+=365;
y--;
}
return tianshu;
}
int GetFirstDayInTable(int y,int m) /*计算给定年月的第一天在日历表中的位置*/
{
int x=2;
x+=(GetTotalDays(y,m-1))%7;
while(x==7)
{
x=0;
}
return x; //1901年一月一日星期二要返回2 其他年的月份用初始值x加天数对7求余数即可!
}
void ShowDate(int y,int m) /*显示日历*/
{
cout<<"-----------------------------------------------------"<<endl;
cout<<"SUN" <<'\t'<<"MON"<<'\t'<<"TUE"<<'\t'<<"WEN"<<'\t'<<"THU"<<'\t'<<"FRI"<<'\t'<<"SAT"<<'\t'<<endl;
int ct=0;
for(ct;ct<GetFirstDayInTable(y,m);ct++)
cout<<'\t';
int i=1;
for(i;i<=GetDaysofMonth(y,m);i++)
{
cout<<i<<'\t';
if((i+GetFirstDayInTable(y,m))%7==0)
cout<<endl;
}
cout<<endl<<"----------------------------------------------------"<<endl;
}
void main()
{
int y,m;
cout<<"input year:";
cin>>y;
cout<<"input month:";
cin>>m;
ShowDate(y,m);
}