#include //需求: //1.设计判断闰年函数 //2.设计查询某年某日日期星期几, //3.日历的输出(单双列) //4.菜单选择要有纠错功能 ,也就是说每个菜单要有一个函数可供返回 ,即每个最好要有一个单独的函数来满足 //5.1528年少了十天,据查证是因为罗马教皇决定在1582年10月4日后使用格利戈里历法,英国是在1752年9月3日后才接受使用格利戈里历法 //1.闰年判断函数,思路:常见判断闰年条件 int isLeapyear(int year) { return(year%400==0)||(year%4==0&&year%100!=0);//如果是闰年,则为真 } int monthsday(int year,int month) { int monthsday[]={31,28,31,30,31,30,31,31,30,31,30,31}; if (month==2&&isLeapyear(year))//如果是闰年,二月有二十九天 { return 29; } return monthsday[month-1]; } int getFirstDayOfYear(int year)//今年的第一天是周几 { int d=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400; if (year>1582) { if (year==1583) { d-=10; } } return d%7; } int getDaysInMonth(int year,int month) { int daysInMonth[]={31,28,31,30,31,30,31,31,30,31,30,31}; if(month==2&&isLeapyear(year)) { return 29;//闰年二月有29天 } if (year == 1582 && month == 10) { return 21; // 1582年十月只有21天 } return daysInMonth[month-1];//返回对应月份的天数 } //计算给定日期是星期几(0表示星期日1-6表示周一到周六) int getDayOfWeek(int year, int month, int day) { int t[]={0,3,2,5,0,3,5,1,4,6,2,4};//调整不同月在不同年中的偏移 if (month<3) { year--; } return(year+year/4-year/100+year/400+t[month-1]+day)%7; } //2.查询哪年哪月是周几 int week(int year,int month,int day)//运用泰勒公式 { if(month<3) { month+=12; year--; } if(year<1583) { int h=(day+1+2*month+3*(month+1)/5+year+year/4+5)%7; return h; //h表示某时间是星期几 } else{ int h=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;//蔡勒公式w=(d + 1+ 2*m+3*(m+1)/5+y+y/4-y/100+y/400(闰年调整))% return h+1;//h+1是因为1582年以后,蔡勒公式计算会少一天 } } //3.日历的输出 int runnian(int n)//记录闰年月份日期 { switch(n) { case 1:return 31; case 2:return 29; case 3:return 31; case 4:return 30; case 5:return 31; case 6:return 30; case 7:return 31; case 8:return 31; case 9:return 30; case 10:return 31; case 11:return 30; case 12:return 31; } } int pingnian(int year,int month)//记录平年月份日期 { if (year==1582&&month==10) { return 21;//1582年10月只有21天 } switch(month) { case 1:return 31; case 2:return 28; case 3:return 31; case 4:return 30; case 5:return 31; case 6:return 30; case 7:return 31; case 8:return 31; case 9:return 30; case 10:return 31; case 11:return 30; case 12:return 31; } } void run(int week)//闰年日历输出 { int n=0;//记录换行次数 int w=week; for(int i=1;i<=12;i++) { printf("%d月\n",i); printf("日 一 二 三 四 五 六\n") ; for(int k=0;k12||day<1||day>getDaysInMonth(year,month)) { printf("输入的日期有误,请重新输入:\n"); continue; } else { printf("%d年%d月%d日是%s\n",year,month,day,week[weekday]); } } else if (menu == 3) { printf("你想看看哪一年呢:"); if(scanf("%d", &year) != 1) { while(getchar() != '\n'); printf("输入的年份有误,请重新输入:\n"); continue; } if(year<1) { printf("输入的年份有误,请重新输入:\n"); continue; } else { printf("%d年%s是闰年哦\n",year,isLeapyear(year)?"":"不"); } } else if(menu==4) { printf("加纳~\n"); return 0;//退出 } else { printf("输入的格式不对,请重新输入:\n"); continue; } } return 0; }