又碰到个算法的问题,想请教各位大大

2020-01-25 15:19发布

本帖最后由 lswhome 于 2014-1-9 02:35 编辑

就是计算某一时刻是否在某一时间段内:比如从23:25开始到第二天的8:30结束,某一时刻(几点几分)是否在这个时间段内
算法必须包含在同一天之内(比如00:00~23:00)和跨天(比如22:00~第二天的21:00)想来想去想不到好的算法,用C51。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
lswhome
2020-01-26 08:05
本帖最后由 lswhome 于 2014-1-9 12:54 编辑

C51,时间来源是时钟芯片,判断某一时刻是否在某一时间段之内,精确到分即可,但算法必须包含时间段在同一天或者跨一天,但时间段不超过24小时。。。百度查了查,高级的语言直接就有相关的函数,非常简单,可是C51没有啊,只能自己算。。。脑子笨,虽然问题昨天晚上已经解决了,但感觉我的算法超级笨。。
算法如下:
bit Time_of_Times(UINT8 Now_h,UINT8 Now_m,UINT8 Start_h,UINT8 Start_m,UINT8 End_h,UINT8 End_m);//判断某一时间是否在某一时间段内 返回1=在,0=不在
bit Time_of_Times1(UINT8 Now_h,UINT8 Now_m,UINT8 Start_h,UINT8 Start_m,UINT8 End_h,UINT8 End_m);//判断某一时间是否在同一天的某一时间段内 返回1=在,0=不在


//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
bit Time_of_Times(UINT8 Now_h,UINT8 Now_m,UINT8 Start_h,UINT8 Start_m,UINT8 End_h,UINT8 End_m)//判断某一时间是否在某一时间段内 返回1=在,0=不在
{
       
        if(End_h>=Start_h)//先判断结束时间是否大于或者等于起始时间,如果是,则肯定在同一天,否则就跨天了
        {//如果是在同一天
                return(Time_of_Times1(Now_h,Now_m,Start_h,Start_m,End_h,End_m));   //例: Start=00:00 Now=23:26 End=23:59
        }
        else
        {//如果跨天了,返回取反的值
                return(!Time_of_Times1(Now_h,Now_m,End_h,End_m,Start_h,Start_m));  //例: Start=12:30 Now=8:30 End=08:00
        }
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
bit Time_of_Times1(UINT8 Now_h,UINT8 Now_m,UINT8 Start_h,UINT8 Start_m,UINT8 End_h,UINT8 End_m)//判断某一时间是否在同一天的某一时间段内         返回1=在,0=不在
{
        bit In;//=1在区间内,0=不在区间内

        if(Now_h==Start_h && Now_m>=Start_m && Now_h==End_h && Now_m<End_m)//时间段在同一个小时之内的情况         例:1:10~1:50  Now=1:30
                In=1;//那么在
        else
                In=0;//否则不在

        if(In==0)
        {
                if(Now_h==Start_h && Now_m>=Start_m && Now_h<End_h)//如果不在以上时间段内,但是在起始的小时内,又小于结束的时范围内  例:1:10~2:50 Now=1:30
                        In=1;//
                else
                        In=0;
        }

        if(In==0)
        {
                if(Now_h>Start_h && Now_h <End_h)//同上,大于起始的小时,又小于结束的小时 例:1:10~3:30 Now=2:20
                        In=1;
                else
                        In=0;
        }

        if(In==0)
        {
                if(Now_h>Start_h && Now_h==End_h && Now_m<End_m)//同上,大于起始的小时,但等于结束的小时 并且小于结束的分钟 例:1:10~3:30 Now=3:20
                        In=1;
                else
                        In=0;
        }

        return(In);//返回值
}


调用:
Time_of_Times(12,23,23,45,15,30);
返回1

运行结果达到了要求,但算法感觉很土,各位给精简精简呗。。。

一周热门 更多>