1、万年历 A、概要 系统实现万年历的功能,并以交互的方式显示。任意输入某一年,可输出该年的年历;输入某

如题所述

有完整的代码,你自己拿去看看,看懂了再改改就成了哈:
#include<stdio.h> #include<stdlib.h>#include <time.h> /*定义头文件*/////////////////////////////////////////////////////////////////////////////int runnian(int year)/*定义变量*/{if(year%4==0&&year%100!=0||year%400==0) /*利用函数判断输入年份是闰年还是平年*/return 1;elsereturn 0;}int day1(int year,int month){int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};/*定义数组确定12个月每个月的天数*/if(runnian(year)) /*如果输入年份是闰年*/a[1]=29;/*二月29天*/return a[month-1];}int day2(int year,int month,int day){int i,sum=0;for(i=1;i<month;i++){sum+=day1(year,i);}sum+=day;return sum;}int counterdays(int year,int month,int day) /*判断今天距特定日期的天数*/{ int year1, days0,days1,month1,days, day1; time_t timep; struct tm *p; time(&timep); p=gmtime(&timep); year1=(1900+p->tm_year) ; month1=(1+p->tm_mon) ; day1=(p->tm_mday); /*获取系统时间year1、month1、day1分别为年、月、日*/ days0=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+day2(year,month,day); /*判断某天是一年中的第几天*/ days1=(year1-1)*365+(year1-1)/4-(year1-1)/100+(year1-1)/400+day2(year1,month1,day1);if(days0>days1) days=days0-days1;elsedays=days1-days0;/*计算出两个日期之间的时间差*/ printf(" \n"); printf("\n 今天距%d年%d月%d日还有%d天\n\n",year,month,day,days); return days; }int week1(int year,int month,int day){int number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+day2(year,month,day);number%=7;return number;}void jieri(int month,int day) /*判断是否公历节日*/{ if(month==1) switch(day) { case 1: printf(",这天是元旦"); } if(month==2) switch(day) { case 14: printf(",这天是情人节"); } if(month==3) switch(day) { case 8: printf(",这天是妇女节"); break; case 12: printf(",这天是植树节"); } if(month==4) switch(day){ case 1: printf(",这天是愚人节"); } if(month==5) switch(day) { case 1: printf(",这天是劳动节"); break; case 4: printf(",这天是青年节"); } if(month==6) switch(day) { case 1: printf(",这天是儿童节"); } if(month==7) switch(day) { case 1: printf(",这天是建党节"); } if(month==8) switch(day){ case 1: printf(",这天是建军节"); } if(month==9) switch(day) { case 10: printf(",这天是教师节"); } if(month==10) switch(day) { case 1: printf(",这天是国庆节"); } }void display3(int year,int month,int day) /*输出日历*/{ week1( year,month,day); jieri(month,day); counterdays(year,month, day); }char *Week2(int number){switch(number)/*分类一周七天*/{case 0:return "Sun";case 1:return "Mon";case 2:return "Tus";case 3:return "Wed";case 4:return "Ths";case 5:return "Fri";case 6:return "Sat";default: return "错误!请您重新输入。";/*不符和上面七种情况的报错提示*/}}void x1(int year,int month,int day){int number=week1(year,month,day);if(runnian(year))printf("闰年");/*年份为闰年则输出"闰年"*/else printf("平年");printf(" %d 年 %d 月 %d 日%10s\n\n",year,month,day,Week2(number));/*按年 月 日输出结果*/}void x2(int year,int month){int max,number,i,j=1;max=day1(year,month);number=week1(year,month,1);printf("%6s%6s%6s%6s%6s%6s%6s\n"," Sun "," Mon "," Tus"," Wed "," Ths "," Fri "," Sat ");/*按照间隔打印日历*/for(i=0;i<number;i++){printf(" ");}while(j<=max){printf("%8d",j);if(i%7==6){printf("\n");}i++;j++;}printf("\n\n");}int x3(int year,int month,int day){if(year<0||month<1||month>12||day<1||day>day1(year,month))/*当输入植出现这些情况时*/return 0;/*返回0*/elsereturn 1;/*返回1*/}int judge(int year,int month2)/*定义一个函数,把月分为四类(28,29,30,31)*/{ if(month2==1||month2==3||month2==5||month2==7||month2==8||month2==10||month2==12) return(1);/*31天的月份,返回值为1*/ else if(month2==2) { if(year%4!=0||year%100==0&&year%400!=0) return(2);/*平年的2月份,返回值为2*/ else return(3);/*闰年的2月份,返回值为3*/ } else return(4);/*30天的月份,返回值为4*/}void yueli(int year,int month){if(runnian(year))printf("闰年");else printf("平年");printf(" %d 年 %d 月\n\n",year,month);x2(year,month);}void rili(int year,int month,int day){printf("\n");x1(year,month,day);}///////////////////////////////////////////////////////////////////////////void main(){int year,month,day,a,b,n,m,k,c,i,j;char ** p; char * week[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};char*month2[]={"January","February","March","April","May","June","July","August","September","October","November","December"};while(1){printf("\n\n\n\n");printf(" **********************************************************\n\n");printf(" * * \n");printf(" 欢迎进入万年历查询系统 \n");printf(" * * \n\n");printf(" **********************************************************\n\n\n");printf(" 1 年历 2 月历 3 日历 4 退出\n");printf(" 请输入您的选择<1~4>,按回车键确定: ");scanf("%d",&b);switch(b){case 1:/*选择1时*/printf("\n请输入您要查的年份: ");/*给出输入提示*/scanf("%d",&year);/*输入查询的年份*/ printf("the calendar of the year:%d.",year); printf("\n"); c=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;/*该年的第一天是星期几*/ for(i=0;i<12;i++)/*输出前几个月的日历表*/ { n=judge(year,i+1); p=month2+i; printf("%s\n",*p);/* 输出月份x*/ printf("\n"); for(j=0;j<7;j++) {p=week+j; printf("%6s",*p);} /* 输出星期x*/ printf("\n"); for(k=0;k<c;k++) printf(" ");/*六个空格*/ for(m=1;m<32;m++){ printf("%6d",m); if((c+m)%7==0) printf("\n");/*输出七个字符(空格和数字)换行*/ if(n==1&&m==31) break; else if(n==2&&m==28) break; else if(n==3&&m==29) break; else if(n==4&&m==30) break;} c=(c+m)%7;/*计算出下个月的第一天是星期几*/ printf("\n"); printf("============================================"); printf("\n");}break;case 2:/*选择二时*/printf("\n请输入您要查的年和月,年月之间用空格隔开: ");/*给出输入提示*/scanf("%d%d",&year,&month);/*输入需要查询的年 月*/a=x3(year,month,1);if(a==0){printf("错误!请您重新输入。\n");break;}yueli(year,month);break;case 3:/*选择3时*/printf("\n请输入您要查的年月日,年月日之间用空格隔开: ");/*给出输入提示*/scanf("%d%d%d",&year,&month,&day);/*输入年 月 日*/ display3(year,month,day);a=x3(year,month,day);if(a==0){printf("错误!请您重新输入。\n");/*输入植异常时报错*/break;}rili(year,month,day); break;case 4:exit(0);default:printf("错误!请您重新输入。\n\n");}}}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-08
1
相似回答