一个下午加一个晚上完成这个万年历程序,这是我目前为止写的最长的程序了,完成后运行成功的那一瞬间还是有一些小成就感的。
这个程序目前有五个功能:
1.查看当前年历或月历;
2.搜索某年年历或某月月历;
3.查询某天是星期几;
4.判断某年是否为闰年
5.查询历史上某年是该年的第几天
代码如下:
-----------------------------------------------------------------------------------------------------------------------------------------------------
#include <stdio.h> #include<math.h> #include "time.h" int head() //显示欢迎界面,返回功能值 {int select; printf("\n\n"); printf("\t\t\t<--欢迎使用万年历-->\n\n"); printf("\t\t****************************************\n"); printf("\t\t请选择要使用的功能:\n\n"); printf("\t\t\t1.查看当年年历或当月月历\n"); printf("\t\t\t2.搜素某年的年历或某月的日历\n"); printf("\t\t\t3.查询历史上某日为星期几\n"); printf("\t\t\t4.判断历史上某年是否为闰年\n"); printf("\t\t\t5.查询历史上某天是该年的第几天\n"); printf("\t\t\t6.退出\n"); printf("\t\t****************************************\n"); printf("\t\t\t请选择<1,2,3,4,5,6>:"); scanf("%d",&select) ; printf("\n"); return(select); } void searchhead(int year,int month) //月历的表头 {printf("\t%d年%d月\n",year,month); printf("\t***************************************************\n") ; printf("\t日\t一\t二\t三\t四\t五\t六\n"); } int monthnum(int year,int month) //返回月份多少天 {int a1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int a2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; if(leapyear(year)==1) { return(a2[month]); } else { return(a1[month]); } } int leapyear(int year) //判断是否为闰年 { if(year%4==0&&year%100!=0||year%4==0&&year%400==0) { return(1); } else { return(0); } } int week(int year,int month,int day) //根据蔡勒公式计算星期几 {int w ,c,y; if(month==1) { month=13; year=year-1; } if(month==2) { month=14; year=year-1; } y=year%100; c=(year/1000)*10+(year/100%10); if(y==0) { c=c-1; } w=y+floor(y/4)+floor(c/4)-2*c+floor(26*(month+1)/10.0)+day-1; while(w<0) { w=w+7; } if(w%7==0) { return(7); } return(w%7); } int function3() //第三个功能查询历史上某日为星期几的模块 {int year=0,month=1,day=1; printf("-----查询历史上某日为星期几-----\n"); printf("\n"); do {if(year<0) { printf("\t系统提示:您输入了错误的年份请从新输入...\n"); } printf("\t请输入要查询的年份:"); scanf("%d",&year); printf("\n"); } while(year<0); do {if(month<1||month>12) { printf("\t系统提示:您输入了错误的月份请从新输入...\n"); } printf("\t请输入%d年的第几月:",year); scanf("%d",&month); printf("\n"); } while(month<1||month>12); do {if(day<1||day>31) { printf("\t系统提示:您输入了错误的日期请从新输入...\n"); } printf("\t请输入%d年%d月的第几天:",year,month); scanf("%d",&day); printf("\n"); } while(day<1||day>31); printf("\t您查询的%d年%d月%d号是星期%d\n\n",year,month,day,week(year,month,day)); } void function4() //功能四判断历史上某年是否为闰年模块 {int year=0; printf("-----判断历史上某年是否为闰年-----\n"); do {if(year<0) { printf("\t系统提示:您输入了错误的年份请从新输入...\n"); } printf("\t请输入要查询的年份:"); scanf("%d",&year); printf("\n"); } while(year<0); if(leapyear(year)==1) { printf("\t您查询的%d年是闰年\n\n",year); } else { printf("\t您查询的%d年不是闰年\n\n",year); } } int function2() //模块二:搜素某年的年历或某月的日历模块 {int year=0,month=1,i,j,spacenum,count; printf("-----搜素某年的年历或某月的日历-----\n\n"); do {if(year<0) { printf("\t系统提示:您输入了错误的年份请从新输入...\n"); } printf("\t请输入要查看的年份:"); scanf("%d",&year); printf("\n"); } while(year<0); do {if(month<0||month>12) { printf("\t系统提示:您输入了错误的月份请从新输入...\n"); } printf("\t请输入查看%d年的第几月,若想查看%d年年历请输入零:",year,year); scanf("%d",&month); printf("\n"); } while(month<0||month>12); if(month!=0) { searchhead(year,month) ; spacenum=week(year,month,1); if(spacenum!=7) //输出空格 { for(i=1;i<=spacenum;i++) { printf("\t "); } } count=spacenum; for(i=1;i<=monthnum(year,month);i++) { printf("\t%d ",i); count++; if(count%7==0) { printf("\n"); } } } if(month==0) { for(j=1;j<=12;j++) { searchhead(year,j) ; spacenum=week(year,j,1); if(spacenum!=7) //输出空格 { for(i=1;i<=spacenum;i++) { printf("\t "); } } count=spacenum; for(i=1;i<=monthnum(year,j);i++) { printf("\t%d ",i); count++; if(count%7==0) { printf("\n"); } } printf("\n\n"); } } } int nowyear() //获取系统的年份 { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); return( timeinfo->tm_year+1900) ; } int nowmonth() //获取系统的月份 { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); return(timeinfo->tm_mon+1 ) ; } int function1() //模块一:查看当年年历或当月月历 {int k,i,j,spacenum,count; printf("-----查看当年年历或当月月历-----\n\n"); printf("\t您想查看今年的年历还是当月的月历,请输入1【年历】或0【月历】:"); scanf("%d",&k); printf("\n"); if(k==0) { searchhead(nowyear(),nowmonth()) ; spacenum=week(nowyear(),nowmonth(),1); if(spacenum!=7) //输出空格 { for(i=1;i<=spacenum;i++) { printf("\t "); } } count=spacenum; for(i=1;i<=monthnum(nowyear(),nowmonth());i++) { printf("\t%d ",i); count++; if(count%7==0) { printf("\n"); } } } if(k==1) { for(j=1;j<=12;j++) { searchhead(nowyear(),j) ; spacenum=week(nowyear(),j,1); if(spacenum!=7) //输出空格 { for(i=1;i<=spacenum;i++) { printf("\t "); } } count=spacenum; for(i=1;i<=monthnum(nowyear(),j);i++) { printf("\t%d ",i); count++; if(count%7==0) { printf("\n"); } } printf("\n\n"); } } } void function5() //功能五:查询历史上某天是该年的第几天 {int year=0,month=1,day=1,i,s=0; int a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; printf("-----查询历史上某天是该年的第几天-----\n"); printf("\n"); do {if(year<0) { printf("\t系统提示:您输入了错误的年份请从新输入...\n"); } printf("\t请输入要查询的年份:"); scanf("%d",&year); printf("\n"); } while(year<0); do {if(month<1||month>12) { printf("\t系统提示:您输入了错误的月份请从新输入...\n"); } printf("\t请输入%d年的第几月:",year); scanf("%d",&month); printf("\n"); } while(month<1||month>12); do {if(day<1||day>31) { printf("\t系统提示:您输入了错误的日期请从新输入...\n"); } printf("\t请输入%d年%d月的第几天:",year,month); scanf("%d",&day); printf("\n"); } while(day<1||day>31); s=s+day; if(leapyear(year)==1) { for(i=1;i<month;i++) { s=s+a[i]; } } else { for(i=1;i<month;i++) { s=s+b[i]; } } printf("\t您查询的%d年%d月%d号是该年的第%d天\n",year,month,day,s); } main() {int select; char ch; while(1) { select=head(); if(select==1) { function1(); } if(select==2) { function2(); } if(select==3) { function3(); } if(select==4) { function4(); } if(select==5) { function5(); } if(select==6) { break; } } }