#include<iostream> using namespace std; struct Date{ int year,month,day; }; enum Week{ MON=1, TUE, WED, THU, FRI, SAT, SUN, }; int isLeapYear(int y) { if((y%4==0&&y%100!=0)||y%400==0)return 1; else return 0; } int DaysGone(Date d,int *restdays) {/* *返回值是某个日期在一年中是第多少天 *restdays是这年还剩多少天 */ int leap=0; int days; if(isLeapYear(d.year))leap=1; switch(d.month){ case 1:days=d.day;break; case 2:days=d.day+31;break; case 3:if(leap)days=d.day+29+31; else days=d.day+28+31; break; case 4:if(leap)days=d.day+31+29+31; else days=d.day+31+28+31; break; case 5:if(leap)days=d.day+30+31+29+31; else days=d.day+30+31+28+31; break; case 6:if(leap)days=d.day+31+30+31+29+31; else days=d.day+31+30+31+28+31; break; case 7:if(leap)days=d.day+30+31+30+31+29+31; else days=d.day+30+31+30+31+28+31; break; case 8:if(leap)days=d.day+31+30+31+30+31+29+31; else days=d.day+31+30+31+30+31+28+31; break; case 9:if(leap)days=d.day+31+31+30+31+30+31+29+31; else days=d.day+31+31+30+31+30+31+28+31; break; case 10:if(leap)days=d.day+30+31+31+30+31+30+31+29+31; else days=d.day+30+31+31+30+31+30+31+28+31; break; case 11:if(leap)days=d.day+31+30+31+31+30+31+30+31+29+31; else days=d.day+31+30+31+31+30+31+30+31+28+31; break; case 12:if(leap)days=d.day+30+31+30+31+31+30+31+30+31+29+31; else days=d.day+30+31+30+31+31+30+31+30+31+28+31; break; } if(leap)*restdays=366-days; else *restdays=365-days; return days; } int ComputeDays(Date early,Date later) { int leapcount=0; int y,earlyrestdays=0,laterrestdays=0,latergonedays=0; int result; for(y=early.year+1;y<later.year;y++) if(isLeapYear(y))leapcount++;//不包含要求计算的两年 DaysGone(early,&earlyrestdays); latergonedays=DaysGone(later,&laterrestdays); result=latergonedays+earlyrestdays; result+=(later.year-early.year-1)*365+leapcount; return result; } int WhoEarly(Date d1,Date d2) {//d1早则返回1,d2则0,=则-1 int res=0; int y,m,d; y=d1.year-d2.year; m=d1.month-d2.month; d=d1.day-d2.day; if(y<0)res=1; else if(y==0){ if(m<0)res=1; else if(m==0){ if(d<0)res=1; else if(d==0)res=-1; else res=0; }//else if else res=0; }//else if else res=0; } int Mod7(Date d1,Date d2,int weekday) {//此处d1是周几为已知数weekday int tmp,res; tmp=WhoEarly(d1,d2); if(tmp==-1)res=0; else if(tmp==1)res=ComputeDays(d1,d2)%7; else res=7-ComputeDays(d2,d1)%7; switch(weekday){ case MON:res=(res+1)%7;break; case TUE:res=(res+2)%7;break; case WED:res=(res+3)%7;break; case THU:res=(res+4)%7;break; case FRI:res=(res+5)%7;break; case SAT:res=(res+6)%7;break; case SUN:res=(res+7)%7;break; } return res; } /* *程序没有进行错误检查 */ int main() { Date d1,d2; int week,res; printf("enter a date:year month day======="); scanf("%d%d%d",&d1.year,&d1.month,&d1.day); printf("week ?"); scanf("%d",&week); printf("enter another date but don‘t know on which weekday======"); scanf("%d%d%d",&d2.year,&d2.month,&d2.day); res=Mod7(d1,d2,week); printf("it‘s "); switch(res) { case MON:printf("MON\n");break; case TUE:printf("TUE\n");break; case WED:printf("WED\n");break; case THU:printf("THU\n");break; case FRI:printf("FRI\n");break; case SAT:printf("SAT\n");break; case SUN:printf("SUN\n");break; } return 0; }
时间: 2024-10-08 22:02:28