亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何實現電子秒表

發布時間:2022-06-14 14:57:58 來源:億速云 閱讀:215 作者:iii 欄目:開發技術

這篇文章主要介紹“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語言如何實現電子秒表

高級版本

代碼可能一般,但至少功能已經實現,僅供參考

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

  • 計時初始時間指的是開始計時或繼續計時時的系統時間(第一次暫停后,如果繼續計時,此時的系統時間即為新的計時初始時間)

  • 當前累計計時時長指的是從開始計時到當前時刻的時間差,即真正的有效計時時長

  • 總累計計時時長指的是計時初始時間之前的計時時間,這個值只有在計時暫停時才進行更新(如第一次暫停時,總累計計時時長 = 第一次暫停的系統時間 - 開始計時時的系統時間;第二次暫停時,總累計計時長 = 總累計計時時長 + 第二次在暫停的系統時間 - 上次繼續計時時的系統時間&hellip;)

#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       獲取系統當前秒數和毫秒(1970-1-1 0:0:0到現在)
 * @param tv    timeval結構體變量
 * @param tv_s  返回的秒數
 * @param tv_ms 返回的毫秒數
 ******************************************************************************/
void 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;//獲取毫秒
}

/******************************************************************************
 * @brief            獲取兩個timeval成員的差值,通過tv_s_diff和tv_ms_diff返回
 * @param tv_s_cur   當前系統時間秒數
 * @param tv_ms_cur  當前系統時間毫秒數
 * @param tv_s_old   計時初始時間(s)
 * @param tv_ms_old  計時初始時間(ms)
 * @param tv_s_diff  秒數的差值
 * @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;  //獲取這段時間的毫秒數
        *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語言如何實現電子秒表”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴彦淖尔市| 泸定县| 商丘市| 永吉县| 湘西| 东安县| 安达市| 闽清县| 永年县| 温宿县| 隆尧县| 新邵县| 阿鲁科尔沁旗| 介休市| 灵寿县| 那坡县| 朝阳县| 利川市| 灵武市| 博客| 哈尔滨市| 稻城县| 盐池县| 肥东县| 张家界市| 来宾市| 洪湖市| 晴隆县| 安多县| 北京市| 微博| 开平市| 清水河县| 肇州县| 岐山县| 铜川市| 德清县| 堆龙德庆县| 沾益县| 突泉县| 余庆县|