<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
秒錶是我們生活中常見的計時工具,特別是在運動會等比賽中,今天我就來寫一個簡單的電子秒錶。
這裡簡單介紹一下我的實現思路:
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:%02dr", hour, min, sec); Sleep(1000); //1s延時 cnt++; } printf("n程式退出n"); return 0; }
執行效果:
程式碼可能一般,但至少功能已經實現,僅供參考
下面給出幾個註釋的解釋:
#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 %02dr", 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 %02dr", 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 %02dr", hour, min, sec, msec); } Sleep(10); //10ms延時,防止列印太快導致顯示效果不佳 } return 0; }
執行效果:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45