我也有这样的情况。
**更新了我的代码,它按照我想要的方式工作。 *按要求澄清了代码(完整程序)
如果我给
开始时间:2:30:30
停止时间:2:30:25
我应该得到
已过去:23:59:55
明白了吗?过了午夜……进入第二天……
这就是我想要的并且它有效!
我有这五个具有逻辑相关条件的 if 语句。
程序给出了所需的输出,但是是否可以以任何方式组合这些 if 语句(除了使用“OR”运算符和创建巨大的条件;例如嵌套 if 或条件运算符。
//time elapsed program
//including support for time crossing midnight into the next day
#include<stdio.h>
struct time
{
int hour;
int minute;
int second;
};
struct time timeElapsed(struct time, struct time);
int main()
{
struct time start, stop, elapse;
printf("Enter start time (hh:mm:ss) : ");
scanf("%d:%d:%d", &start.hour, &start.minute, &start.second);
printf("Enter stop time (hh:mm:ss) : ");
scanf("%d:%d:%d", &stop.hour, &stop.minute, &stop.second);
elapse = timeElapsed(start, stop);
printf("The time elapsed is : %.2d:%.2d:%.2d", elapse.hour, elapse.minute, elapse.second);
return 0;
}
struct time timeElapsed(struct time begin, struct time end)
{
struct time elapse;
if(end.hour < begin.hour)
end.hour += 24;
if(end.hour == begin.hour && end.minute < begin.minute)
end.hour += 24;
if(end.hour == begin.hour && end.minute == begin.minute && end.second < begin.second)
end.hour += 24;
if(end.second < begin.second)
{
--end.minute;
end.second += 60;
}
if(end.minute < begin.minute)
{
--end.hour;
end.minute += 60;
}
elapse.second = end.second - begin.second;
elapse.minute = end.minute - begin.minute;
elapse.hour = end.hour - begin.hour;
return elapse;
}
最佳答案
从逻辑上讲,您正在比较结束时间是否早于开始时间。
如果您可以通过保留顺序的映射将三个数字转换为一个,那么您将能够使用一次比较。
在这种情况下,转换为总秒数就很突出:
if ( end.hour * 3600L + end.minute * 60 + end.second
< begin.hour * 3600L + begin.minute * 60 + begin.second )
这可能比您的原始代码更有效,也可能不更有效。如果您打算定期执行此操作,那么您可以创建一个内联函数将时间转换为总秒数。
关于将 if 语句与逻辑相关条件结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41433998/