c语言实现一个简单日历
满足三个需求:
1.输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。
2.输入年月,输出该月的日历。
3.输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
最终完善版代码:
#include<stdio.h> #include<string.h> #include<time.h> #include<math.h> #include<windows.h> intyear,month,day; intday_of_month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //charwek[7]={'周日','周一','周二','周三','周四','周五','周六'}; intcurrent_year,current_month,current_day; /************************************通用关键函数**************************************************/ voidcls_screen() { printf("请按任意键返回!\n"); getchar(); getchar(); system("cls"); } voidget_current_time() //获取当前时间 { time_ttimep; structtm*p; time(&timep); p=gmtime(&timep); current_year=1900+p->tm_year; current_month=1+p->tm_mon; current_day=p->tm_mday; } intjudgement(inty) { if(y%400==0||(y%100!=0&&y%4==0)) return1; elsereturn0; } intshow_week(intyear,intmonth,intday) { /* 公式:w=(y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1)%7 */ intw,k; //记录周几 intyear_last=year%100,c=year/100,m=month; if(month==1) { year_last-=1; m=13; } elseif(month==2) { year_last-=1; m=14; } w=(year_last+year_last/4+c/4-2*c+26*(m+1)/10+day-1);//abs 绝对值 if(w<0) { k=(w%7+7)%7; } elsek=w%7; returnk; } /************************************第一部分**************************************************/ voidprint_year(intyear) { inti,k,x,first_week; printf("请输入想要查询的年月(格式如2012):"); scanf("%d",&year); printf("=======================%d年===========================\n",year); printf("\n"); if(judgement(year)) { day_of_month[1]=29; } elseday_of_month[1]=28; for(i=1;i<13;i++) { first_week=show_week(year,i,1); printf("=====================%d月日历如下========================\n",i); printf("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n"); for(x=1;x<=first_week;x++) { printf("\t"); if(x%7==0)printf("\n"); } for(k=1;k<=day_of_month[i-1];k++) { printf("%d\t",k); if(x%7==0)printf("\n"); x++; } printf("\n"); printf("\n"); printf("\n"); } } /************************************第二部分**************************************************/ voidprint_year_month() { intk,x,first_week; printf("请输入想要查询的年月(格式如201212):"); do { scanf("%d%d",&year,&month); if(month<1||month>12) { printf("您输入的月份有误哦~请输入正确的月份\n"); printf("请输入想要查询的年月(格式如201212):"); } }while(1>month||month>12); printf("=====================%d年%d月======================\n",year,month); if(judgement(year)) { day_of_month[1]=29; } elseday_of_month[1]=28; first_week=show_week(year,month,1); printf("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n"); for(x=1;x<=first_week;x++) { printf("\t"); if(x%7==0)printf("\n"); } for(k=1;k<=day_of_month[month-1];k++) { printf("%d\t",k); if(x%7==0)printf("\n"); x++; } printf("\n"); } /************************************第三部分**************************************************/ intyear_before_sumdays(intyear,intmonth,intday) { intdays=0,i,judgement1; inttemp_day=0,sum_days; // //printf("%d,%d\n",current_year,current_month); judgement1=judgement(year); /*===================比当前少=====================*/ if(year<current_year) { for(i=year+1;i<current_year;i++) { if(judgement(i)) { days=days+356; } elsedays+=355; } for(i=month+1;i<=12;i++) { days=days+day_of_month[i-1]; } days=days+day_of_month[month-1]-day; //指定日子距离当年结束还有多少天 //printf("去年还有%d\n",days); for(i=0;i<current_month-1;i++) { if(judgement1) { day_of_month[1]=29; } temp_day=temp_day+day_of_month[i]; } //当前日子是这一年的多少天 temp_day=temp_day+current_day; //printf("今天是第%d天\n",temp_day); sum_days=temp_day+days; } /*===================比当前多=====================*/ if(year>current_year) { for(i=current_year+1;i<current_year;i++) { if(judgement(i)) { days=days+356; } elsedays+=355; } for(i=current_month+1;i<=12;i++) { days=days+day_of_month[i-1]; } days=days+day_of_month[month-1]-current_day; //指定日子距离当年结束还有多少天 //printf("去年还有%d\n",days); for(i=0;i<month-1;i++) { if(judgement1) { day_of_month[1]=29; } temp_day=temp_day+day_of_month[i]; } //当前日子是这一年的多少天 temp_day=temp_day+day; //printf("今天是第%d天\n",temp_day); sum_days=temp_day+days; } /*===================比当前一样=====================*/ if(year==current_year) { if(month<current_month) { for(i=month+1;i<current_month;i++) { if(judgement1) { day_of_month[1]=29; } days=days+day_of_month[i]; } sum_days=days+current_day+day_of_month[month-1]-day; } if(month>current_month) { for(i=current_month+1;i<month;i++) { if(judgement1) { day_of_month[1]=29; } days=days+day_of_month[i]; } sum_days=days+day+day_of_month[month-1]-current_day; printf("%d\n",days); } if(month==current_month) { sum_days=abs(day-current_day); } } returnsum_days; } voidprint(intyear,intmonth,intday) { intweek; printf("请输入想要查询的年月(格式如20121212):"); do { scanf("%d%d%d",&year,&month,&day); if(judgement(year)) { day_of_month[1]=29; } printf("\n"); if(day<=0||day>day_of_month[month-1]) printf("%d月没有%d,请重新输入(格式如20121212):",month,day); }while(day<=0||day>day_of_month[month-1]); week=show_week(year,month,day); printf("\n"); switch(month)//判断查找天是否阳历节日先由月份判断是否有节日的月份再由日判断是否为节日 { case1:switch(day) { case1:printf("元旦");break; default:printf("不是阳历节日"); }break; case2:switch(day) { case14:printf("情人节(ValentinesDay)");break; default:printf("不是阳历节日"); }break; case3:switch(day) { case8:printf("妇女节¨(Women'sDay)");break; case12:printf("植树节(ArborDay)");break; default:printf("不是阳历节日"); }break; case4:switch(day) { case1:printf("愚人节(AprilFoolsDay)");break; case5:printf("清明节(Tomb-sweepingDay)");break; default:printf("不是阳历节日"); }break; case5:switch(day) { case1:printf("劳动节(LaborDay)");break; case4:printf("中国青年节(ChineseYouthDay)"); default:printf("不是阳历节日"); }break; case6:switch(day) { case1:printf("儿童节(Children'sDay)");break; default:printf("不是阳历节日"); }break; case8:switch(day) { case1:printf("建军节(theArmy'sDay)");break; default:printf("不是阳历节日"); }break; case9:switch(day) { case10:printf("教师节(Teacher'sDay)");break; default:printf("不是阳历节日"); }break; case10:switch(day) { case1:printf("国庆节(NationalDay)");break; case31:printf("万圣节(HelloweenDay)");break; default:printf("不是阳历节日"); }break; case12:switch(day) { case25:printf("圣诞节(ChristmasDay)");break; default:printf("不是阳历节日"); }break; } printf("\n"); printf("%d年%d月%d号是:",year,month,day); switch(week)//判断所查找天是星期几 { case0:printf("Sunday");break; case1:printf("Monday");break; case2:printf("Tuesday");break; case3:printf("Wednesday");;break; case4:printf("Thursday");break; case5:printf("Friday");break; case6:printf("Saturday");break; } printf("\n"); printf("距离今天有%d天\n",year_before_sumdays(year,month,day)); printf("\n"); } /********************************************************************************************/ voidmain() { intchoice,year,month,day,flag=1; charc,k; for(;1;)//显示程序菜单,为永真,每次查找完回到程序菜单ì { printf("===================================菜单选项===================================\n"); printf("请选择:\n"); printf("******** 1.查找某一年的年历 ********\n"); printf("******** 2.查找某一月的月历 ********\n"); printf("******** 3.查找某一天 ********\n"); printf("******** 0.退出 ********\n"); printf("==============================================================================\n"); printf("请输入您的选择: "); do { if(flag) { c=getche(); printf("\n"); printf("确定选择%c吗?(y/Y)或者(n/N): ",c); } if(flag) { k=getche(); // printf("\n"); } if(k=='y'||k=='Y') { printf("\n"); if(c=='\n') { printf("\n"); printf("输入有误,请输入数字\n"); printf("\n"); printf("请输入您的选择: "); } elseif(!isdigit(c)) { printf("\n"); printf("输入有误,请输入数字\n"); printf("\n"); printf("请输入您的选择: "); } elseif(isdigit(c)) { choice=c-'0'; if(choice<0||choice>3) { printf("输入有误,请输入0-3之间的数字\n"); } elsebreak; } } elseif(k=='n'||k=='N') { printf("\n"); printf("你选择了否,请重新输入选项: "); flag=1; } if((k!='y'&&k!='Y'&&k!='n'&&k!='N')) { printf("\n"); printf("请输入y/n: "); flag=0; if(flag==0) { k=getche(); printf("\n"); //getchar(); } } }while(1); if(choice==1) { print_year(year); cls_screen(); } elseif(choice==2) { print_year_month(); cls_screen(); } elseif(choice==3) { get_current_time(); print(year,month,day); cls_screen(); } elseif(choice==0) break; else { printf("您的输入有误,请重新输入\n"); } } }
以上就是本文所述的全部内容了,希望大家能够喜欢。