根据项目的需求,自己写了段万年历的小程序,该程序实现的功能很简单,能根据某个日期求出对应的星期。本来想copy网上现成的程序,但上网一google,都是相互的转载,错误很多,而且不是能让人很看明白的那种,索性自己写了。其实万年历的算法真的很简单,只要知道了某个参考日期所对应的星期,其他的就都可以知道了。下面是子程序的源代码,保证可以编译运行^0^
int WeekDay(int year,int month,int day)
{
int temp_year=1900,temp_month=1,temp_day=1;\\参考变量,1900年1月1日刚好是星期一;
int large_years=0,small_years=0; \\large_years代表润年,small_years代表平年;
int large_months=0,small_months=0; \\large_months代表大月,small_months代表小月;
int large_feb=0,small_feb=0; \\large_feb代表润年的二月,small_feb代表平年的二月;
long total_days; \\输入日期&参考日期之间的总天数;
for(temp_year=1900;temp_year<year;temp_year++)\\计算输入的年和参考年1900年之间润年&平年的个数
{
if(temp_year%4==0&&temp_year%100!=0||temp_year%400==0)
large_years++;
else
small_years++;
}
for(temp_month=1;temp_month<month;temp_month++)\\计算输入的月和参考月1月之间大月&小月的个数以及该年二月是润年还是平年的
{
if(temp_month==1||temp_month==3||temp_month==5||temp_month==7||temp_month==8||temp_month==10||temp_month==12)
large_months++;
if(temp_month==4||temp_month==6||temp_month==9||temp_month==11)
small_months++;
else
{
if(year%4==0&&year%100!=0||year%400==0)
large_feb++;
else
small_feb++;
}
}
total_days=366*large_years+365*small_years+31*large_months+30*small_months+(day-temp_day);
return (int)(total_days%7); \\返回该日期对应的星期,0-周一;1-周二;……6-周日;
}