xx年xx月xx日xx时xx分xx秒——if版本

if版本,貌似差不多,但是比switch要简洁点~~~都要那么多次的判断~~~

/*
*
* 编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。
* 注意考虑润年。
* 如输入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;
    //if版本
    if (*second==59) {
       *second=0;
       *minute+=1;
    }
    else
       *second+=1;
    if (*minute>59) {
       *minute=0;
       *hour+=1;
    }
    if (*hour>23) {
       *day=1;
       *hour+=1;
    }
    if (*day>dayofMonth[*month-1]) {
       *day=1;
       *month+=1;
    }
    if (*month>12) {
       *month=1;
       *year+=1;
    }
}


逻辑上那几次判断是一定不可避免的~~~

但是应该可以用更巧妙的方式来实现,而不是现在(不管是switch还是if)这种雷同的代码~~~

To Be Continued~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1 按照某种格式输出系统间:自学java中的间。自学Date类(java.util.Date)和SimpleDateFormat类,用程序输出“当前间是XXXXXXXXXXXXXX(第XX周,周X)” 2 比较String与StringBuffer、StringBuilder的自增速度。方法:在自增前记录系统间,进行5000次自增,然后再记录系统间,可以得出自增的速度。获取系统间的方法是java.lang.System.currentTimeMillis() ,见JDK API。 3 定义点类,圆是由圆心(点)和半径组成的,请完成圆类,注意“派”为常量,取3.14。圆类具有judge函数可以判断两圆的关系:相离、相交(包括相切)、嵌套、重合。设计static成员用以求所有圆对象的平均面积。(static、final) 4 图形间的关系可以下图用来表现。所有的图形中都可以称为Shape。由这个类可以派生出二维图形TwoDimensionalShape和三维图形ThreeDimensionalShape类。每个TwoDimensionalShape类应包括成员函数getArea以计算二维图形的面积。每个ThreeDimensionalShape类包含成员函数getArea和getVolume,别计算三维图形的表面积和体积。编写一个程序,用一个数组乘放各种图形类对象(包括二维和三维的),并输出对象得相应信息。如果某个图形是TwoDimensionalShape就显示其面积,如果某个图形是ThreeDimenionalShape,则显示其面积和体积。请完成图中所有的类并在主函数中做测试。(继承与多态)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值