这篇文章我们继续C语言的相关知识,C语言中关于时间操纵的问题,我们进行详细解读。
一、clock函数:获取程序启动后经过的时间
我们来编写一个能够操纵时间,显示动态画面的程序。
首先请运行下面的程序,程序每隔1秒会逐个倒数:10、9、...,数到0的时候会响起警报同时画面上出现“FIRE!!"。而且在程序结束之前,画面上还会显示出程序开始运行后经过了多长时间。
#include<time.h>
#include<stdio.h>
/*--等待x毫秒--*/
int sleep(unsigned long x)
{
clock_t c1 = clock(),c2;
do {
if ((c2 = clock()) == (clock_t)-1)
return 0;
} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
return 1;
}
int main(void)
{
int i;
clock_t c;
for (i = 10; i > 0; i--) {
printf("\r%2d", i);
fflush(stdout);
sleep(1000);
}
printf("\r\aFIRE!!\n");
c = clock();
printf("程序开始运行后经过了%.1f秒。\n", (double)c / CLOCKS_PER_SEC);
return 0;
}
可以使用<time.h>头文件把返回值的类型clock t型定义为等同于算数型.
typedef unsigned clock_t; /*定义示例:类型根据编程环境不同而有所差别*/
以上是在将clock_t等同于unsigned 型的编程环境中的定义示例。clock_t型等同于哪种类
型(unsigned、unsigned long..)要取决于编程环境。
除此之外,因为不同的硬件和 OS 会导致时钟的精确度也不同,所以 clock_t 型表示数值的单位也取决于编程环境,因此通常用<time.h>头文件定义CLOCKS_PER_SEC这一对象宏.CLOCKS_PER_SEC直接翻译过来就是“每秒的时钟数”。如果时钟的精确度在0.001秒,那么1秒内就有 1000个时钟,这个宏的值就定义为1000。
另外,因为 clock 函数返回的值只用于求经过的时间,所以不加人变量c也能够实现(这样一来就不需要变量c了),如下所示。
printf("程序开始后经过了%.1F秒。\n",(double)clock() / CLOCKS PER SEC);
二、计算处理所需的时间
讲完了如何计算程序启动后经过的时间,下面来教大家如何计算处理特定部分所需要的时间“心算训练”程序如下所示。看上去很简单,但实际运行起来可能就没那么容易了,我们来试着运行一下。提示的问题是要把3个三位数的整数相加。输人正确答案后,画面上会显示出解题总共花了多少时间。
因为程序不接受错误答案,所以在回答正确之前程序都不会结束。
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a,b,c; /*要进行加法运算的数值*/
int x; /*已读取的值*/
clock t start,end; /*开始时间·结束时间*/
double req_time; /*所需时间*/
srand(time(NULL)); /*设定随机数的种子*/
a=100+rand()%900; /*生成100~999的随机数*/
b=100+rand()%900;
c=100+rand()%900;
printf("%d+%d+%d等于多少:",a,b,c);
start= clock(); /开始计算*/
while (1){
scanf("%d",&x);
if(x==a+b+c)
break;
printf("\a回答错误!! \n请重新输入:");
}
end = clock(); /*计算结束*/
req_time=(double)(end - start) / CLOCKS_PER_SEC;
printf("用时%.1f秒。\n",req_time);
if(regtime>30.0)
printf("花太长时间了。\n");
else if(req_time>17.0)
printf("还行吧。\n");
else
printF("真快啊。\n");
return 0;
}
首先来理解 while语句。这个while语句是为了不接受错误答案而设置的循环因为控制表达式是1,所以循环会一直进行下去。当玩家回答正确时,程序会通过 break 语句强制中断while语句的循环。
想求出某项处理所需的时间,只要求出这项处理的开始时间和结束时间的“差”即可。
于是,在处理前后调用 clock 函数。本程序把开始处理时的 clock 函数的返回值存入 start 中,把处理结束时的 clock 函数的返回值存人 end中。这样一来,就可以用end减去start来求出处理所需的时间。
不过,由于这个值的单位是时钟数,因此需要除以CLOCKS_PER_SEC换算成以秒为单位
的数值。
三、暂停处理一段时间
int sleep(unsigned long x)
{
clock_t c1=clock(),c2;
do{
if((c2=clock())== (clock_t)-1)/*错误*/
return 0;
}while (1000.0*(c2-c1)/CLOCKSPERSEC<x);
return 1;
}
让我们结合前面的代码来了解这个函数的结构。
首先程序一开始调用了 clock 函数,把程序启动后经过的时间存人 c1,然后运行 do语句在每次循环时调用 clock函数,把获取的数值赋给 c2。
程序的while括号以毫秒为单位表示 sleep 函数开始运行后经过的时间。当这个数值大于等于x时,通过do语句进行的循环就结束了。
这样就只花费了x毫秒的时间。
这里返回的是把int型的整数值-1 强制转换成clock_t型后的值绝不是“clock_t减去1后的值”。
时间操纵相关问题我们讲完了,下一期继续进行C语言的讲解,大家敬请期待。