#include int run (int y); void search (void); int pand(int a,int b,int c); void input(int *a,int *b,int *c); void rls(void); void rld (void); void choice(void); int main () { int xz; printf("请选择所需要的功能:\n"); printf("1.查询某年某月某日为星期几,并判断是否为闰年\n"); printf("2.输出这一年的日历\n"); printf("请输入:1 or 2\n"); scanf("%ld",&xz); if (xz==1) search(); else if (xz==2) choice(); else printf("输入有误请重开"); } //输入年月日并判断 void input( int *pa,int *pb,int *pc) { printf("请输入年:\n"); scanf("%ld",pa); printf("请输入月:\n"); scanf("%ld",pb); printf("请输入日:\n"); scanf("%ld",pc); } //((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7 int run(int x) { if((x%4)==0&&(x%100)!=0||(x%400)==0) return 1; else return 0; } //判断输入是否有误 int pand(int a,int b,int c) { int i=0; int j[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if(a>0&&a<99999) i=0; else i=-1; if(b>=1&&b<=12) i=0; else i=-1; if(run(a)) j[2]=29; if(j[b-1]>=c&&j[b-1]>=1) i=0; else i=-1; return i; } //查询某年某月某日为星期几,并判断是否为闰年 void search() { int year,mouth,day; input(&year,&mouth,&day); int a,b,c; b=mouth; c=day; char s[10]; a=pand(year,mouth,day); if(a==-1) printf("输入有误,请重开"); else { int i=0,j=year/100,y=year%100; if(year<1582||year==1582&&mouth<10||year==1582&&mouth==10&&c<3) { if(mouth==1||mouth==2) { mouth+=12; y--; } i=(y+(y/4)+(j/4)-2*j+(13*(b+1)/5)+c+2)%7; } else { if(mouth==1||mouth==2) { mouth+=12; y--; } i=((j/4)-2*j+y+(y/4)+(13*(b+1)/5)+c-1)% 7; } switch(i) { case 0:printf("是星期日");break; case 1:printf("是星期一");break; case 2:printf("是星期二");break; case 3:printf("是星期三");break; case 4:printf("是星期四");break; case 5:printf("是星期五");break; case 6:printf("是星期六"); } if(run(year)) printf("\n今年是闰年"); else printf("\n今年不是闰年"); } return ; } void choice() { int s; printf("请选择输出格式\n"); printf("1.单列 or 2.双列 :"); scanf("%ld",&s); printf("\n"); if(s==1) rld(); else if(s==2) rls(); else printf("输入有误请重开"); } //输出这一年的日历 void rld() { int year,mouth,day; input(&year,&mouth,&day); //printf("请选择") int u=pand(year,mouth,day); if(u==-1) printf("输入有误,请重开"); else { int i,j,n=0,leap; leap=(year%4==0&&year%100!=0)||(year%100==0); int k=year/100,y=(year%100)-1; if(year<=1582) { n=(y+(y/4)+(k/4)-2*k+(13*14/5)+3)%7; } else { n=((k/4)-2*k+y+(y/4)+(13*14/5))% 7; } //printf("%d",n); for(mouth=1;mouth<=12;mouth++) { switch(mouth) { case 1: day=31; printf("一月\t\t%d\n",year); break; case 2: if(leap) day=29; else day=28; printf("二月\t\t%d\n",year); break; case 3: day=31; printf("三月\t\t%d\n",year); break; case 4: day=30; printf("四月\t\t%d\n",year); break; case 5: day=31; printf("五月\t\t%d\n",year); break; case 6: day=30; printf("六月\t\t%d\n",year); break; case 7: day=31; printf("七月\t\t%d\n",year); break; case 8: day=31; printf("八月\t\t%d\n",year); break; case 9: day=30; printf("九月\t\t%d\n",year); break; case 10: day=31; printf("十月\t\t%d\n",year); break; case 11: day=30; printf("十一月\t\t%d\n",year); break; case 12: day=31; printf("十二月\t\t%d\n",year); break; } printf("----------------------------------------------------\n"); printf(" SUN MON TUE WED THD FRI SAT\n"); switch(n) { case 1: printf("%5c",'\40'); break; case 2: printf("%10c",'\40'); break; case 3: printf("%15c",'\40'); break; case 4: printf("%20c",'\40'); break; case 5: printf("%25c",'\40'); break; case 6: printf("%30c",'\40'); break; } for(i=1,j=n;i<=day;i++,j++) { printf("%5d",i); if(j%7==6) printf("\n"); } n=(n+day)%7; printf("\n----------------------------------------------------"); printf("\n"); } } } void rls() { int year,mouth,day; input(&year,&mouth,&day); int u=pand(year,mouth,day); if(u==-1) printf("输入有误,请重开"); else { int i,j,n1=0,leap; leap=(year%4==0&&year%100!=0)||(year%100==0); int day1,day2; int k=year/100,y=(year%100)-1; if(year<=1582) { n1=(y+(y/4)+(k/4)-2*k+(13*14/5)+3)%7; } else { n1=((k/4)-2*k+y+(y/4)+(13*14/5))% 7; } for(mouth=1;mouth<=12;mouth+=2) { switch(mouth) { case 1: day1=31; printf("一月\t\t%d",year); if(leap) day2=29; else day2=28; printf("\t\t\t\t\t二月\t\t%d\n",year); break; case 3: day1=31; printf("三月\t\t%d",year); day2=30; printf("\t\t\t\t\t四月\t\t%d\n",year); break; case 5: day1=31; printf("五月\t\t%d",year); day2=30; printf("\t\t\t\t\t六月\t\t%d\n",year); break; case 7: day1=31; printf("七月\t\t%d",year); day2=31; printf("\t\t\t\t\t八月\t\t%d\n",year); break; case 9: day1=30; printf("九月\t\t%d",year); day2=31; printf("\t\t\t\t\t十月\t\t%d\n",year); break; case 11: day1=30; printf("十一月\t\t%d",year); day2=31; printf("\t\t\t\t\t十二月\t\t%d\n",year); break; } printf("--------------------------------------------------------------------------------------------------------\n"); printf(" SUN MON TUE WED THD FRI SAT\t\t SUN MON TUE WED THD FRI SAT\n"); int n2=(n1+day1)%7; switch(n1) { case 1: printf("%5c",'\40'); break; case 2: printf("%10c",'\40'); break; case 3: printf("%15c",'\40'); break; case 4: printf("%20c",'\40'); break; case 5: printf("%25c",'\40'); break; case 6: printf("%30c",'\40'); break; } int x=1,y=n2; for(i=1,j=n1;i<=50;i++) { if(i<=day1) printf("%5d",i); if(i==day1) { switch((n1+day1)%7) { case 1: printf("%30c",'\40'); break; case 2: printf("%25c",'\40'); break; case 3: printf("%20c",'\40'); break; case 4: printf("%15c",'\40'); break; case 5: printf("%10c",'\40'); break; case 6: printf("%5c",'\40'); break; } } if(j%7==6||i==day1&&x!=day2) { printf("\t\t"); if(j==6) { switch(n2) { case 1: printf("%5c",'\40'); break; case 2: printf("%10c",'\40'); break; case 3: printf("%15c",'\40'); break; case 4: printf("%20c",'\40'); break; case 5: printf("%25c",'\40'); break; case 6: printf("%30c",'\40'); break; } } while(x<=day2) { printf("%5d",x); if(y%7==6) { x+=1; y+=1; break; } x++; y++; } printf("\n"); } j++; } int temp=n1; n1=(n2+day)%7; n2=(temp+day)%7; printf("\n--------------------------------------------------------------------------------------------------------\n"); } } }