文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言如何实现电子秒表

2023-07-02 09:14

关注

这篇文章主要介绍“C语言如何实现电子秒表”,在日常操作中,相信很多人在C语言如何实现电子秒表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言如何实现电子秒表”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

实现思路

这里简单介绍一下我的实现思路:

1、简单版:简单版本只实现了单次计时功能,即每次开启程序后就开始计时,如果按下键盘任意键,就结束计时,计时通过Sleep(1000)延时实现,每过1秒,计数值(总秒数)cnt加1,打印时,将总秒数cnt转换成时分秒进行显示。【Sleep()函数并不准确,只能实现粗略延时】

2、高级版:实现毫秒级计时,可重复计时(暂停、清零),计时使用gettimeofday()函数,用来获取系统的秒数和毫秒数,将计时开始和计时暂停的秒数相减,即可获得计时期间的秒数。细节请看代码部分。

简易版本

#include <stdio.h>#include <conio.h>              //kbhit()/_kbhit()#include <Windows.h>            //Sleep(ms)int main(){    int hour = 0, min = 0, sec = 0;    int cnt = 0;    printf("按任意键停止计时\n");    while(!_kbhit())            //任意键退出循环(结束计时)    {        hour = cnt / 3600;      //获取计时小时数        min = cnt / 60;          //获取计时分钟数        sec = cnt % 60;         //获取计时秒数        printf("  %02d:%02d:%02d\r", hour, min, sec);        Sleep(1000);            //1s延时        cnt++;    }    printf("\n程序退出\n");    return 0;}

运行效果:

C语言如何实现电子秒表

高级版本

代码可能一般,但至少功能已经实现,仅供参考

下面给出几个注释的解释:

#include <stdio.h>#include <conio.h>                 //kbhit()/_kbhit() getch()#include <Windows.h>               //Sleep(ms)#include <sys/time.h>              //struct timeval#include <unistd.h>                //struct timevalvoid Get_Current_Timeval(struct timeval *tv, long *tv_s, long *tv_ms){    gettimeofday(tv,NULL);      //获取1970-1-1到现在的时间保存到timeval变量    *tv_s = tv->tv_sec;         //获取秒    *tv_ms = tv->tv_usec / 1000;//获取毫秒}void Get_Diff_Timeval(long tv_s_cur, long tv_ms_cur,\                      long tv_s_old, long tv_ms_old,\                      long *tv_s_diff, long *tv_ms_diff){    if(tv_ms_cur < tv_ms_old)    {        *tv_ms_diff = tv_ms_cur + 1000 - tv_ms_old;  //获取这段时间的毫秒数        *tv_s_diff = tv_s_cur - tv_s_old - 1; //获取这段时间的秒数(自上次暂停或自初始时间)    }    else    {        *tv_ms_diff = tv_ms_cur - tv_ms_old;  //获取这段时间的毫秒数(自上次暂停或自初始时间)        *tv_s_diff = tv_s_cur - tv_s_old;     //获取这段时间的秒数(自上次暂停或自初始时间)    }}int main(void){    struct timeval tv;    long tv_s_cur = 0, tv_ms_cur = 0;   //当前系统时间    long tv_s_old = 0, tv_ms_old = 0;   //计时初始时间    long tv_s_diff = 0, tv_ms_diff = 0; //存放时间的差值    int sec_cnt = 0, msec_cnt = 0;      //当前累计计时时长    int hour = 0, min = 0, sec = 0, msec = 0;    int timer_step = 0;                 //计时步骤 0:未开始,                                        //1:开始,2:暂停    char key = 0;        printf("================================\n"); //菜单    printf("| 空格:开始/暂停 R:清零 Q:退出 |\n");    printf("================================\n");    printf("\t%02d:%02d:%02d %02d\r", 0, 0, 0, 0);    while(1)    {                key = 0;        if(_kbhit())                      //检测到按键按下            key = getch();                //读取按键        switch(key)        {            case ' ':                     //按空格键开始/暂停计时                if(timer_step == 0)       //如果还未开启计时                {                    //获取当前秒和毫秒作为计时初始时间                    Get_Current_Timeval(&tv, &tv_s_old, &tv_ms_old);                    timer_step = 1;       //开始计时                }                else if(timer_step == 1)  //如果正在计时                {                    timer_step = 2;       //暂停计时                    //获取当前秒和毫秒                    Get_Current_Timeval(&tv, &tv_s_cur, &tv_ms_cur);                    //获取当前系统时间与计时初始时间的差值                    Get_Diff_Timeval(tv_s_cur, tv_ms_cur, tv_s_old,\                                     tv_ms_old, &tv_s_diff, &tv_ms_diff);                    msec_cnt += tv_ms_diff;       //更新总累计计时时长(ms)                    if(msec_cnt >= 1000)                    {                        msec_cnt -= 1000;                        sec_cnt += tv_s_diff + 1; //更新总累计计时时长(s)                    }                    else                        sec_cnt += tv_s_diff;                }                else if(timer_step == 2)                {                    timer_step = 1;                //继续计时                    //获取当前秒和毫秒                    Get_Current_Timeval(&tv, &tv_s_cur, &tv_ms_cur);                    tv_s_old = tv_s_cur;           //更新计时初始时间(s)                    tv_ms_old = tv_ms_cur;         //更新计时初始时间(ms)                }                break;            case 'r':                     //按r/R清零计时时间            case 'R':                sec_cnt = msec_cnt = 0;   //总累计计时值清零                tv_s_old = tv_s_cur;      //更新计时初始时间(s)                tv_ms_old = tv_ms_cur;    //更新计时初始时间(ms)                timer_step = 0;           //回到步骤0(未开始计时)                printf("\t%02d:%02d:%02d %02d\r", 0, 0, 0, 0);                break;            case 'q':            case 'Q': printf("程序退出\n");return 0;        }                if(timer_step == 1)        {            //获取当前秒和毫秒            Get_Current_Timeval(&tv, &tv_s_cur, &tv_ms_cur);            //获取当前系统时间与计时初始时间的差值            Get_Diff_Timeval(tv_s_cur, tv_ms_cur, tv_s_old,\                             tv_ms_old, &tv_s_diff, &tv_ms_diff);            tv_ms_diff += msec_cnt;          //当前累计计时时长(ms)            if(tv_ms_diff >= 1000)            {                tv_ms_diff -= 1000;                tv_s_diff += sec_cnt + 1;    //当前累计计时时长(s)            }            else                tv_s_diff += sec_cnt;            hour = tv_s_diff / 3600;         //获取计时小时数            min = tv_s_diff /60;             //获取计时分钟数            sec = tv_s_diff % 60;            //获取计时秒数            msec = tv_ms_diff / 10;          //获取毫秒(单位10ms)            //打印当前累计计时时长            printf("\t%02d:%02d:%02d %02d\r", hour, min, sec, msec);        }        Sleep(10);       //10ms延时,防止打印太快导致显示效果不佳    }    return 0;}

运行效果:

C语言如何实现电子秒表

到此,关于“C语言如何实现电子秒表”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯