所谓编制万年历,就是编制任一年的日历。一年中,除2月份以外,每月的天数都是固定的。而根据年份,可求出该年是否为闰年,即求出2月份是28天还是29天。星期是从星期一到星期日周而复始。因此,编制任一年的日历,关键是求出该年元旦是星期几,之后把星期和日期配起来,日历就出来了。另一个问题是打印格式问题,这里每次并排打印两个月的日历—先打1月的和7月的,再打2月的和8月的……,以此类推。一年的12个月日历,六行打完。
求出某年元旦是星期几的方法:设 x 年元旦是星期 w (0~6,0为星期日), w 的计算公式为
式中,
表示为
的整数部分,也就是说,三个分数式只取商数的整数部分,余数略去不计。求出圆括号内数值后,再用7除。如果恰能除尽,这一天一定是星期日;若余数是1,这一天是星期一;余数是2,这一天就是星期二;依此类推。
例如,要求2016年的元旦是星期几。
这说明2016年的元旦是星期五。与2016年的日历对照,2016年的元旦这一天确实是星期五。
/**************************************************************/ /* 1.c 给定公元年份,编制当年日历*/ /**************************************************************/ #include<stdio.h> 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_tb1[][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}}; void main() { int sw,leap,i,j,k,wd,day; int year; char title[]="SUN MON TUE WED THU FRI SAT"; printf("请输入年份(yyyy:)"); scanf("%d%*c",&year); sw=w(year,1,1); leap=year%4==0 && year%100||year%400==0; for(i=1;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_tb1[leap][i];day++){ date[i][wd][sw]=day; sw=++sw%7; if(sw==0)wd++; } printf("\n|============================%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<wd;j++) { printf(" "); for(k=0;k<7;k++) if(date[i][j][k]) printf("%4d",date[i][j][k]); else printf(" "); printf(" "); for(k=0;k<7;k++) if(date[i+6][j][k]) printf("%4d",date[i+6][j][k]); else printf(" "); printf("|\n|"); } } puts("=============================================================|"); }
【例1.6】给定公元年份,编制当年日历。
解:打开“编制万年历”文件夹,双击扩展名为DSW的文件,进入Visual C++ 6.0编译环境,编译程序并执行。根据屏幕提示“请输入年份”时,输入公元年份,运行结果如下:
由运行结果可见,当你输入2016年时,屏幕就输出2016年全年的日历。