C语言实现万年历查询系统

需积分: 16 14 下载量 114 浏览量 更新于2024-09-13 2 收藏 11KB TXT 举报
"C语言万年历查询系统V1.0版本是一个实现万年历查询功能的程序,包括查询特定日期的星期、某月月历和整年年历。程序通过两种不同的循环方法来处理查询,但代码量较大,可能影响运行效率和代码维护性。" 在C语言中,开发一个万年历查询系统涉及到日期和时间的计算,这通常需要理解公历日期的计算规则,如格里高利历(Gregorian calendar)。在这个系统中,我们看到了两个关键的函数`f()` 和 `g()`,它们是用来计算闰年和月份天数的。`f(year, month)` 函数用于确定给定年份和月份时,该年是否是闰年。如果月份小于3(即1或2月),它返回年份减1,否则返回年份本身。这是因为闰年的2月有29天,而其他月份保持不变。 `g(month)` 函数则根据给定的月份确定其在一年中的位置,如果月份小于3,返回月份加13,否则返回月份加1。这是因为在闰年中,2月后的月份相当于非闰年中的下一个月。这些函数被用于计算`n(year, month, day)`,这是一个获取指定日期在儒略日历中的天数的函数,这是计算星期的基础。 `w(year, month, day)` 函数用于根据儒略日计算出对应的星期几,返回值范围在0(周日)到6(周六)之间。这个功能利用了公历日期和星期之间的模运算关系。 程序中还定义了一个二维数组 `date[12][6][7]` 来存储每个月的日历,以及一个一维数组 `day_tbl` 来记录不同年份的2月天数,考虑了闰年和平年的情况。`GetMonth` 和 `MonthOfYear` 函数可能分别用于显示特定月份的月历和整年的年历,而 `DayOfWeek` 函数则用于查询特定日期是星期几。 此外,`displayMenu` 函数可能是用来展示用户界面,让用户选择要执行的操作,`author` 函数可能是用于显示开发者信息,`GetYear` 函数则用于获取用户输入的年份,而 `shuoming` 函数可能是程序的使用说明。 然而,程序存在的问题是代码量过大,追求美观性导致运行效率降低,同时增加了查找和修复代码错误的难度。优化代码结构和算法可以提高运行效率,减少代码冗余,增强代码可读性和维护性。例如,可以考虑使用更高效的数据结构和算法来存储和计算日期信息,或者使用面向对象的设计模式来封装不同的功能,使代码更清晰。
2014-05-21 上传
#include int main (void) { int year,month,j,i,day1,day2,one1,one2,w; printf("enter a year:"); scanf("%d",&year); printf("\n\n"); printf("---------------------%d---------------------\n\n",year); one1=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7; for(month=1;month<=12;month+=2) { printf(" ",month,year); printf(" \n",month+1,year); printf("-------------------- --------------------\n"); printf("日 一 二 三 四 五 六 日 一 二 三 四 五 六\n"); switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day1=31;break; case 4: case 6: case 9: case 11:day1=30;break; default:if(!(year%4)&&(year0)||!(year%400)) day1=29; else day1=28; } for(j=1;j<=one1;j++) { if(one1==7) break; else printf(" "); } for(i=1;i<=7-one1;i++) printf("%2d ",i); printf(" "); switch(month+1) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day2=31;break; case 4: case 6: case 9: case 11:day2=30;break; default:if(!(year%4)&&(year0)||!(year%400)) day2=29; else day2=28; } one2=(one1+day1)%7; for(j=1;j<=one2;j++) { if(one2==7) break; if(j!=7) printf(" "); } for(i=1;i<=7-one2;i++) printf("%2d ",i); printf("\n"); for(i=8-one1;i<=14-one1;i++) printf("%2d ",i); printf(" "); for(i=8-one2;i<=14-one2;i++) printf("%2d ",i); printf("\n"); for(i=15-one1;i<=21-one1;i++) printf("%2d ",i); printf(" "); for(i=15-one2;i<=21-one2;i++) printf("%2d ",i); printf("\n"); for(i=22-one1;i<=28-one1;i++) printf("%2d ",i); printf(" "); for(i=22-one2;i<=28-one2;i++) printf("%2d ",i); printf("\n"); for(i=29-one1;i<=35-one1&&i<=day1;i++) printf("%2d ",i); printf(" "); for(w=1;w<=35-day1-one1;w++) printf(" "); for(i=29-one2;i<=35-one2&&i<=day2;i++) printf("%2d ",i); printf("\n"); for(i=36-one1;i<=day1;i++) printf("%2d ",i); for(w=1;w<=35-day1-one1;w++) printf(" "); if(day1==31&&(one1==4||one1==3||one1==2||one1==1||one1==7)) printf(" "); if(day1==30&&(one1==4||one1==3||one1==2||one1==1||one1==7)) printf(" "); for(i=36-one2;i<=day2;i++) printf("%2d ",i); printf("\n-------------------- --------------------\n\n"); printf("\n"); one1=(one2+day2)%7; } printf("---------------------%d---------------------\n",year); getchar(); printf("按任意键退出"); getchar(); return 0; }