【C语言】操纵时间

        这篇文章我们继续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语言的讲解,大家敬请期待。 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_star_galaxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值