#include void Monthhead(int month) { printf("%s\n",(month==1)?"Jan":(month==2)?"Feb":(month==3)?"Mar":(month==4)?"Apr":(month==5)?"May":(month==6)?"Jun":(month==7)?"Jul":(month==8)?"Aug":(month==9)?"Sep":(month==10)?"Oct":(month==11)?"Nov":"Dec"); return; } void dayHead() { printf(" Sun Mon Tue Med Thu Fri Sat\n"); return; } int firstDay(int year) { int b=(year-1)*365+(year-1)*400+(year-1)*4-(year-1)*100+1; return b%7; } int Week6(int year,int month) { int w,c,y; int day=1; if(month<3) { month+=12; year--; } c=year/100; y=year%100; w=(c/4-2*c+y+y/4+13*(month+1)/5+day-1)%7; return w; } int Week(int year,int month,int day) { int w,c,y; if(year<=1582&&month<=10&&day<15) { if(month<3) { month+=12; year--; } day-=4; c=year/100; y=year%100; w=(c/4-2*c+y+y/4+13*(month+1)/5+day-1)%7; }else{ if(month<3) { month+=12; year--; } c=year/100; y=year%100; w=(c/4-2*c+y+y/4+13*(month+1)/5+day-1)%7; } return w; } int isLeapYear(int year) { return (year%4==0&&year%100!=0)||year%400==0; } int DayMonth(int year,int month) { if(month==2) { if(isLeapYear(year)) { return 29; }else{ return 28; } }else if(month==4||month==6||month==9||month==11){ return 30; }else{ return 31; } } void printCalendar3(int year) { int first=firstDay(year); int month,day; for(month=1;month<=9;month++) { printf("\n"); Monthhead(month); dayHead(); for(day=1;day<=first;day++) printf(" "); int dayMonth=DayMonth(year,month); for(day=1;day<=dayMonth;day++) { printf("%4d",day); if((day+first)%7==0) { printf("\n"); } } if((day+first)%7!=0) { printf("\n"); } first=(first+dayMonth)%7; } for(month=10;month<=12;month++) { int i; day=1; if(month==10) { int a[21]={1,2,3,4,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; Monthhead(month); dayHead(); int first2=Week(year,month,day); for(i=1;i<=first2;i++) printf(" "); for(i=0;i<21;i++) { printf("%4d",a[i]); if((i+first2+1)%7==0) { printf("\n"); } } if((i+first2)%7!=0) { printf("\n"); } first2=(first2+21)%7; continue; } printf("\n"); int first3=Week(year,month,day); Monthhead(month); dayHead(); for(i=1;i<=first3;i++) printf(" "); int dayMonth; if(month==11){ dayMonth=30; }else if(month==12){ dayMonth=31; } for(i=1;i<=dayMonth;i++) { printf("%4d",i); if((i+first3)%7==0) { printf("\n"); } } if((i+first3)%7!=0) { printf("\n"); } first3=(first3+dayMonth)%7; } printf("\n"); } void printCalendar(int year) { int first=firstDay(year); int month,day; for(month=1;month<=12;month++) { Monthhead(month); dayHead(); for(day=1;day<=first;day++) printf(" "); int dayMonth=DayMonth(year,month); for(day=1;day<=dayMonth;day++) { printf("%4d",day); if((day+first)%7==0) { printf("\n"); } } if((day+first)%7!=0) { printf("\n"); } first=(first+dayMonth)%7; } } long int f(int year,int month) { if(month<3) return year-1; else return year; } long int g(int month) { if(month<3) return month+13; else return month+1; } long int n(int year,int month,int day) { return 1461L*f(year,month)/4+153L*g(month)/5+day; } int w(int year,int month,int day) { return(int) ((n(year,month,day)%7-621049L%7+7)%7); } int date[12][6][7]; int day_tbl[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}}; int Double(int year) { int sw,leap,i,j,k,wd,day; char title[]="SUM MON TUE WED THU FRI SAT"; sw=w(year,1,1); leap=(year%4==0&&year%100!=0)||year%400==0; for(i=0;i<12;i++) for(j=0;j<6;j++) for(k=0;k<7;k++) date[i][j][k]=0; for(i=0;i<12;i++) for(wd=0,day=1;day<=day_tbl[leap][i];day++) { date[i][wd][sw]=day; sw=++sw%7; if(sw==0) wd++; } printf("\n================== The Calendar of Year %d==================\n",year); for(i=0;i<6;i++) { for(wd=0,k=0;k<7;k++) wd+=date[i][5][k]+date[i+6][5][k]; wd=wd?6:5; printf("%2d %s %2d %s\n",i+1,title,i+7,title); for(j=0;j<6;j++) { /*printf(" ");*/ for(k=0;k<7;k++) if(date[i][j][k]) printf("%5d",date[i][j][k]); else printf(" "); printf(" "); for(k=0;k<7;k++) if(date[i+6][j][k]) printf("%5d",date[i+6][j][k]); else printf(" "); printf("\n"); } } } void choiceCalendar(int year) { int choose; while(1){printf("1.单列\n2.双列\n"); scanf("%d",&choose); switch(choose){ case 1: if(year!=1582) { printCalendar(year); }else if(year==1582){ printCalendar3(year); } break; case 2:Double(year); break; default: printf("输入有错误\n"); break; }break; } } int main() { int choice,year,month,day; while(1) { printf("1.某年日历\n2.星期几\n3.闰年判断\n4.退出程序\n"); printf("选哪个!\n"); scanf("%d",&choice); switch(choice){ case 1:printf("输入年份:\n"); scanf("%d",&year); choiceCalendar(year); break; case 2:printf("输入某年某月某日(空格隔开):\n"); scanf("%d %d %d",&year,&month,&day); int w=Week(year,month,day); printf("%d\n",w); break; case 3:printf("输入年份:\n"); scanf("%d",&year); if(isLeapYear(year)){ printf("YES\n"); }else{ printf("NO\n"); } break; case 4: return 0; break; default:printf("无效选择\n"); break; } } return 0; }