我正在尝试构建一个交通灯模拟器,它要求我以1秒的间隔打印前8秒的green
,以1秒的间隔打印接下来的4秒的yellow
,以及以1秒的间隔打印最后8秒的red
。我如何使用time.h
在C中实现这一点?
这是我的尝试,但我只得到一个输出,它以不超过1秒的时间间隔不间断地打印green
。
// Traffic light simul`ator
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t start, end;
double elapsed;
time(&start); /* start the timer */
do {
time(&end);
elapsed = difftime(end, start);
if (elapsed )
{
printf("green");
}
} while(elapsed < 9);
}
发布于 2019-11-17 22:51:20
下面的代码似乎可以达到预期的效果:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t start, end;
double elapsed, prev_elapsed = 0.0;
time(&start); /* start the timer */
do
{
time(&end);
elapsed = difftime(end, start);
if (elapsed >= prev_elapsed+1.0)
{
printf("green\n");
prev_elapsed = elapsed;
}
} while(elapsed < 9.0);
}
在这里,我们跟踪“当前”经过的时间,以及上一个一秒的时间。当这个“当前”时间段与“前一个”时间段不同时,我们就知道已经过去了一秒(或者更有可能是稍长一点),我们就会打印“绿色”。
发布于 2019-11-17 22:37:40
您的代码将尽可能快地打印“绿色”,因为if(elapsed)
总是会发生,因为条件总是为真。您可以使用difftime
,但需要重新编写代码(我认为它可能会添加2-3行代码)。有什么原因不能直接使用sleep
吗?这似乎是一个更简单的解决方案:打印“绿色”,调用sleep(1)
,重复7次,继续打印“黄色”,依此类推。希望这能有所帮助!
编辑:只要elapsed
的值不等于0,if(elapsed)
就是真的,并且仅仅因为计算机不会立即行动,difftime
总是会返回非零的时间差。
发布于 2019-11-17 22:57:58
好吧,我知道这是怎么回事了。
difftime()
返回double
。这意味着,可以返回小数秒。如果它们是(很可能是),那么这意味着您在elapsed
中有一些值,这意味着它不会计算为false--即使还没有经过1整秒。
如果您希望elapsed
大于1,那么只需检查它:
if (elapsed >= 1)
{
printf("green");
}
这应该能起到作用。
https://stackoverflow.com/questions/58905809
复制