#include<stdio.h>
#define CURRENT_YEAR 2015
#define CURRENT_MON 6
#define CURRENT_DAY 21
enum month{Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};
int year; //输入的年份
enum month mon; //输入的月份
int day; //输入的日
int total_yday=0; //相差满年天数
int total_mday=0; //相差不满年天数
int total_day =0; //相差总天数
int plus_mday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//默认月份天数
int i,j;
void greater_date() //比当前年份大
{
total_yday=0; //重置相差满年天数
total_mday=0; //重置相差不满年天数
total_day =0; //重置相差总天数
for(i=CURRENT_YEAR+1;i<year;i++)//算出满年天数
{
if((i%4==0 && i%100!=0) || (i%400 == 0))
total_yday=total_yday+366;
else
total_yday=total_yday+365;
}
if((CURRENT_YEAR%4==0 && CURRENT_YEAR%100!=0) || CURRENT_YEAR%400 ==0)//设置当前年份二月天数
plus_mday[2]=29;
for(j=CURRENT_MON+1;j<13;j++) //当前预设月份到年尾天数
{
total_mday=total_mday+plus_mday[j];
}
total_mday=total_mday+plus_mday[CURRENT_MON]-CURRENT_DAY; //将当前月份不满月天数添加进total_mday,tot
plus_mday[2]=28; //恢复二月默认天数28
if((year%4==0 && year%100!=0) || year%400==0) //设置输入年份二月份天数
plus_mday[2]=29;
for(j=1;j<mon;j++)
{
total_mday=total_mday+plus_mday[j];
}
total_mday=total_mday+day;
total_day=total_yday+total_mday;
total_day=total_day%7;
}
void smaller_date() //比当前年份小
{
total_yday=0; //重置相差满年天数
total_mday=0; //重置相差不满年天数
total_day =0; //重置相差总天数
for(i=year+1;i<CURRENT_YEAR;i++)
{
if((i%4==0 && i%100!=0) || (i%400 == 0))
total_yday=total_yday+366;
else
total_yday=total_yday+365;
}
if((year%4==0 && year%100!=0) || year%400==0) //设置输入年份二月份天数
plus_mday[2]=29;
for(j=mon+1;j<13;j++) //输入月份到年尾天数
{
total_mday=total_mday+plus_mday[j];
}
total_mday=total_mday+plus_mday[mon]-day; //将输入月份不满月天数添加进total_mday,tot
plus_mday[2]=28; //恢复二月默认天数28
if((CURRENT_YEAR%4==0 && CURRENT_YEAR%100!=0) || CURRENT_YEAR%400 ==0) //设置当前年份二月天数
plus_mday[2]=29;
for(j=1;j<CURRENT_MON;j++) //计算当前预设日期已过当年天数
{
total_mday=total_mday+plus_mday[j];
}
total_mday=total_mday+CURRENT_DAY;
total_day=total_yday+total_mday;
total_day = (7-total_day%7)%7;
}
void equal_date() //年份与预设年份相同
{
total_yday=0; //重置相差满年天数
total_mday=0; //重置相差不满年天数
total_day =0; //重置相差总天数
if(mon<CURRENT_MON)//比当前预设月份小
{
for(i=mon+1;i<CURRENT_MON;i++)
{
total_mday=total_mday+plus_mday[i];
}
total_mday=total_mday+plus_mday[mon]-day+CURRENT_DAY;
total_day=total_mday;
total_day=(7-total_day%7)%7;
}
if(mon>CURRENT_MON) //比当前预设月份大
{
for(i=CURRENT_MON+1;i<mon;i++)
{
total_mday=total_mday+plus_mday[i];
}
total_mday=total_mday+plus_mday[CURRENT_MON]-CURRENT_DAY+day;
total_day=total_mday;
total_day=total_day%7;
}
if(mon==CURRENT_MON)
{
if(day>=CURRENT_DAY)
{
total_day=day-CURRENT_DAY;
total_day%=7;
}
if(day<CURRENT_DAY)
{
total_day=CURRENT_DAY-day;
total_day=(7-total_day%7);
}
}
}
void get_date() //输入日期
{
year=0;
day=0;
mon=0;
printf("Input year:");
scanf("%d",&year);
int i,j;
getchar();
while(1) //get month
{
printf("Input month:");
scanf("%d",(int*)&mon);
getchar();
if(mon>0&&mon<=12)
break;
}
while(1) //get day
{
printf("Input day:");
scanf("%d",&day);
getchar();
if(day>0&&day<=31)
break;
}
}
void output_weekday()
{
switch(total_day)
{
case 1:
printf("%d年%d月%d日是星期一\n",year,mon,day);
break;
case 2:
printf("%d年%d月%d日是星期二\n",year,mon,day);
break;
case 3:
printf("%d年%d月%d日是星期三\n",year,mon,day);
break;
case 4:
printf("%d年%d月%d日是星期四\n",year,mon,day);
break;
case 5:
printf("%d年%d月%d日是星期五\n",year,mon,day);
break;
case 6:
printf("%d年%d月%d日是星期六\n",year,mon,day);
break;
case 0:
printf("%d年%d月%d日是星期天\n",year,mon,day);
break;
default:
break;
}
}
int main()
{
while(1)
{
get_date();
if(year>CURRENT_YEAR)
greater_date();
if(year<CURRENT_YEAR)
smaller_date();
if(year==CURRENT_YEAR)
equal_date();
output_weekday();
}
}