/* * * 编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。 * 注意考虑润年。 * 如输入2004年12月31日23时59分58秒,则输出2004年12月31日59时59分59秒。 * 如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。 * */ #include "stdio.h" #include "assert.h" typedef unsigned int uint; #define FALSE 0 #define TRUE 1 typedef struct date{ uint year; uint month; uint day; uint hour; uint minute; uint second; }DATE; //enum MAX_NUM{MAX_MON=12,MAX_DAY=31,MAX_HOUR=23,MAX_MIN=59,MAX_SEC=59}; void setTime(uint *year,uint *month,uint *day,uint *hour,uint *minute,uint *second); int main() { DATE date1={2004,12,31,23,59,58}; DATE date2={2004,12,31,23,59,59}; DATE date3={2012,6,7,14,59,59}; setTime(&date1.year,&date1.month,&date1.day,&date1.hour,&date1.minute,&date1.second); printf("%d年%d月%d日%d时%d分%d秒\n",date1.year,date1.month,date1.day,date2.hour,date2.minute,date1.second); setTime(&date2.year,&date2.month,&date2.day,&date2.hour,&date2.minute,&date2.second); printf("%d年%d月%d日%d时%d分%d秒\n",date2.year,date2.month,date2.day,date2.hour,date2.minute,date2.second); setTime(&date3.year,&date3.month,&date3.day,&date3.hour,&date3.minute,&date3.second); printf("%d年%d月%d日%d时%d分%d秒\n",date3.year,date3.month,date3.day,date3.hour,date3.minute,date3.second); } void setTime(uint *year,uint *month,uint *day,uint *hour,uint *minute,uint *second){ uint dayofMonth[12]={31,28,30,31,30,31,30,31,30,31,30,31}; //限定输入参数的范围 assert(*year>0&&*month>=1&&*day>=1&&*hour>=0&&*minute>=0&&*second>=0==TRUE); assert(*month<=12&&*day<=dayofMonth[*month-1]&&*hour<=23&&*minute<=59&&*second<=59==TRUE); //润年 if(*year%400==0||(*year%4==0&&*year%100!=0)) dayofMonth[1]=29; switch(*second==59) { case TRUE: *second=0; *minute+=1; break; default: *second+=1; break; } switch(*minute>59) { case TRUE: *minute=0; *hour+=1; break; default: break; } switch(*hour>23) { case TRUE: *hour=0; *day+=1; break; default: break; } switch(*day>dayofMonth[*month-1]) { case TRUE: *day=1; *month+=1; break; default: break; } switch(*month>12) { case TRUE: *month=1; *year+=1; break; default: break; } }