最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)電子秒表

 更新時間:2022年06月14日 11:27:22   作者:小輝_Super  
這篇文章主要為大家詳細介紹了C語言實現(xiàn)電子秒表,毫秒級秒表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

秒表是我們生活中常見的計時工具,特別是在運動會等比賽中,今天我就來寫一個簡單的電子秒表。

實現(xiàn)思路

這里簡單介紹一下我的實現(xiàn)思路:

1、簡單版:簡單版本只實現(xiàn)了單次計時功能,即每次開啟程序后就開始計時,如果按下鍵盤任意鍵,就結束計時,計時通過Sleep(1000)延時實現(xiàn),每過1秒,計數(shù)值(總秒數(shù))cnt加1,打印時,將總秒數(shù)cnt轉換成時分秒進行顯示?!維leep()函數(shù)并不準確,只能實現(xiàn)粗略延時】

2、高級版:實現(xiàn)毫秒級計時,可重復計時(暫停、清零),計時使用gettimeofday()函數(shù),用來獲取系統(tǒng)的秒數(shù)和毫秒數(shù),將計時開始和計時暫停的秒數(shù)相減,即可獲得計時期間的秒數(shù)。細節(jié)請看代碼部分。

簡易版本

#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()) ? ? ? ? ? ?//任意鍵退出循環(huán)(結束計時)
? ? {
? ? ? ? hour = cnt / 3600; ? ? ?//獲取計時小時數(shù)
? ? ? ? min = cnt / 60; ? ? ? ? ?//獲取計時分鐘數(shù)
? ? ? ? sec = cnt % 60; ? ? ? ? //獲取計時秒數(shù)
? ? ? ? printf(" ?%02d:%02d:%02d\r", hour, min, sec);
? ? ? ? Sleep(1000); ? ? ? ? ? ?//1s延時
? ? ? ? cnt++;
? ? }
? ? printf("\n程序退出\n");
? ? return 0;
}

運行效果:

高級版本

代碼可能一般,但至少功能已經(jīng)實現(xiàn),僅供參考

下面給出幾個注釋的解釋:

  • 計時初始時間指的是開始計時或繼續(xù)計時時的系統(tǒng)時間(第一次暫停后,如果繼續(xù)計時,此時的系統(tǒng)時間即為新的計時初始時間)
  • 當前累計計時時長指的是從開始計時到當前時刻的時間差,即真正的有效計時時長
  • 總累計計時時長指的是計時初始時間之前的計時時間,這個值只有在計時暫停時才進行更新(如第一次暫停時,總累計計時時長 = 第一次暫停的系統(tǒng)時間 - 開始計時時的系統(tǒng)時間;第二次暫停時,總累計計時長 = 總累計計時時長 + 第二次在暫停的系統(tǒng)時間 - 上次繼續(xù)計時時的系統(tǒng)時間…)
#include <stdio.h>
#include <conio.h> ? ? ? ? ? ? ? ? //kbhit()/_kbhit() getch()
#include <Windows.h> ? ? ? ? ? ? ? //Sleep(ms)
#include <sys/time.h> ? ? ? ? ? ? ?//struct timeval
#include <unistd.h> ? ? ? ? ? ? ? ?//struct timeval

/******************************************************************************
?* @brief ? ? ? 獲取系統(tǒng)當前秒數(shù)和毫秒(1970-1-1 0:0:0到現(xiàn)在)
?* @param tv ? ?timeval結構體變量
?* @param tv_s ?返回的秒數(shù)
?* @param tv_ms 返回的毫秒數(shù)
?******************************************************************************/
void Get_Current_Timeval(struct timeval *tv, long *tv_s, long *tv_ms)
{
? ? gettimeofday(tv,NULL); ? ? ?//獲取1970-1-1到現(xiàn)在的時間保存到timeval變量
? ? *tv_s = tv->tv_sec; ? ? ? ? //獲取秒
? ? *tv_ms = tv->tv_usec / 1000;//獲取毫秒
}

/******************************************************************************
?* @brief ? ? ? ? ? ?獲取兩個timeval成員的差值,通過tv_s_diff和tv_ms_diff返回
?* @param tv_s_cur ? 當前系統(tǒng)時間秒數(shù)
?* @param tv_ms_cur ?當前系統(tǒng)時間毫秒數(shù)
?* @param tv_s_old ? 計時初始時間(s)
?* @param tv_ms_old ?計時初始時間(ms)
?* @param tv_s_diff ?秒數(shù)的差值
?* @param tv_ms_diff 毫秒的差值
?******************************************************************************/
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; ?//獲取這段時間的毫秒數(shù)
? ? ? ? *tv_s_diff = tv_s_cur - tv_s_old - 1; //獲取這段時間的秒數(shù)(自上次暫?;蜃猿跏紩r間)
? ? }
? ? else
? ? {
? ? ? ? *tv_ms_diff = tv_ms_cur - tv_ms_old; ?//獲取這段時間的毫秒數(shù)(自上次暫停或自初始時間)
? ? ? ? *tv_s_diff = tv_s_cur - tv_s_old; ? ? //獲取這段時間的秒數(shù)(自上次暫?;蜃猿跏紩r間)
? ? }
}

/******************************************************************************
?* 主函數(shù)
?* ****************************************************************************/
int main(void)
{
? ? struct timeval tv;
? ? long tv_s_cur = 0, tv_ms_cur = 0; ? //當前系統(tǒng)時間
? ? 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);
? ? ? ? ? ? ? ? ? ? //獲取當前系統(tǒng)時間與計時初始時間的差值
? ? ? ? ? ? ? ? ? ? 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; ? ? ? ? ? ? ? ?//繼續(xù)計時
? ? ? ? ? ? ? ? ? ? //獲取當前秒和毫秒
? ? ? ? ? ? ? ? ? ? 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);
? ? ? ? ? ? //獲取當前系統(tǒng)時間與計時初始時間的差值
? ? ? ? ? ? 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; ? ? ? ? //獲取計時小時數(shù)
? ? ? ? ? ? min = tv_s_diff /60; ? ? ? ? ? ? //獲取計時分鐘數(shù)
? ? ? ? ? ? sec = tv_s_diff % 60; ? ? ? ? ? ?//獲取計時秒數(shù)
? ? ? ? ? ? msec = tv_ms_diff / 10; ? ? ? ? ?//獲取毫秒(單位10ms)
? ? ? ? ? ? //打印當前累計計時時長
? ? ? ? ? ? printf("\t%02d:%02d:%02d %02d\r", hour, min, sec, msec);

? ? ? ? }
? ? ? ? Sleep(10); ? ? ? //10ms延時,防止打印太快導致顯示效果不佳
? ? }
? ? return 0;
}

運行效果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C++ 如何實現(xiàn)一個日期類

    C++ 如何實現(xiàn)一個日期類

    通過對類和對象的學習,理解了類是對象的抽象描述,實現(xiàn)日期類涉及定義年月日屬性及成員函數(shù)如打印日期、日期加減,重點介紹了運算符重載的概念和作用,通過代碼示例展示了如何實現(xiàn)一個日期類,包括頭文件和源文件的分離編寫
    2024-10-10
  • C語言運算符的重載詳解

    C語言運算符的重載詳解

    這篇文章主要為大家詳細介紹C語言運算符的重載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Cocos2d-x UI開發(fā)之場景切換代碼實例

    Cocos2d-x UI開發(fā)之場景切換代碼實例

    這篇文章主要介紹了Cocos2d-x UI開發(fā)之場景切換代碼實例,cocos2d-x中的場景切換是通過導演類調用相應的方法完成的,本文通過代碼和詳細注釋來說明,需要的朋友可以參考下
    2014-09-09
  • C++ Template應用詳解

    C++ Template應用詳解

    本篇文章主要介紹了C++ Template應用詳解,模板(Template)指C++程序設計設計語言中采用類型作為參數(shù)的程序設計,支持通用程序設計。
    2016-12-12
  • 深入理解C語言中使用頻率較高的指針與數(shù)組

    深入理解C語言中使用頻率較高的指針與數(shù)組

    在C語言中要說到哪一部分最難搞,首當其沖就是指針,指針永遠是個讓人又愛又恨的東西,用好了可以事半功倍,用不好就會有改不完的bug和通不完的宵,下面這篇文章主要給大家介紹了關于C語言中使用頻率較高的指針與數(shù)組的相關資料,需要的朋友可以參考下
    2022-03-03
  • C語言實現(xiàn)哈夫曼樹的方法

    C語言實現(xiàn)哈夫曼樹的方法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)哈夫曼樹的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C語言打印某一年的日歷

    C語言打印某一年的日歷

    這篇文章主要為大家詳細介紹了C語言打印某一年的日歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • c++ 面向對象的類設計

    c++ 面向對象的類設計

    類的設計在于用恰到好處的信息來完整表達一個職責清晰的概念,恰到好處的意思是不多也不少,少了,就概念就不完整;多了,就顯得冗余,累贅,當然特例下,允許少許的重復,但是,這里必須要有很好的理由
    2017-07-07
  • 使用MySQL編程實現(xiàn)C語言功能強大化步驟示例

    使用MySQL編程實現(xiàn)C語言功能強大化步驟示例

    這篇文章主要為大家介紹了使用MySQL編程實現(xiàn)C語言功能強大化步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • C++使用標準庫實現(xiàn)事件和委托以及信號和槽機制

    C++使用標準庫實現(xiàn)事件和委托以及信號和槽機制

    這篇文章主要為大家詳細介紹了C++如何使用標準庫實現(xiàn)事件和委托以及信號和槽機制,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2022-11-11

最新評論

天柱县| 凌云县| 横山县| 民和| 江川县| 南召县| 沅陵县| 双江| 隆化县| 湖南省| 株洲县| 阿瓦提县| 和林格尔县| 城固县| 兴安盟| 翼城县| 从江县| 扬中市| 平罗县| 敖汉旗| 大悟县| 房山区| 西丰县| 灵石县| 杭锦旗| 成都市| 黄冈市| 沁阳市| 溧阳市| 会同县| 太仆寺旗| 陇西县| 琼结县| 十堰市| 青岛市| 中阳县| 呼伦贝尔市| 六盘水市| 凌云县| 长阳| 五常市|