您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么使用C語(yǔ)言實(shí)現(xiàn)計(jì)時(shí)器”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么使用C語(yǔ)言實(shí)現(xiàn)計(jì)時(shí)器”吧!
簡(jiǎn)單介紹一下我的實(shí)現(xiàn)思路:
本文包括三個(gè)版本,分別是極簡(jiǎn)版、普通版、高級(jí)版:
極簡(jiǎn)版:簡(jiǎn)單的單次倒計(jì)時(shí),只能設(shè)置秒數(shù),計(jì)時(shí)通過(guò)Sleep()
函數(shù)實(shí)現(xiàn)(粗略倒計(jì)時(shí)),先輸入秒數(shù)cnt
,然后每過(guò)1秒(Sleep(1000
),cnt
減1,直到cnt
變成0
,就退出程序。
普通版:可設(shè)置計(jì)時(shí)的時(shí)、分、秒(hour
,min
,sec
),計(jì)時(shí)通過(guò)time()
函數(shù)實(shí)現(xiàn)(用來(lái)獲取當(dāng)前系統(tǒng)時(shí)間的秒數(shù)),進(jìn)入while循環(huán),判斷系統(tǒng)時(shí)間秒數(shù)是否變化,如有變化,說(shuō)明過(guò)了1秒
。這時(shí)將秒數(shù)sec
減1,當(dāng)sec
減到0,下一秒就將分鐘min
減1,同時(shí)sec
變?yōu)?9。分鐘min
和小時(shí)hour
的變化關(guān)系與秒和分鐘的關(guān)系類似。一直循環(huán)倒計(jì)時(shí),直到hour
,min
和sec
都變?yōu)?,此時(shí)計(jì)時(shí)結(jié)束,進(jìn)行報(bào)警提示(printf(\a')
)。
高級(jí)版:在普通版的基礎(chǔ)上,增加重復(fù)計(jì)時(shí)和暫停計(jì)時(shí)的功能。首先需要設(shè)定計(jì)時(shí)時(shí)間,然后按下空格鍵開(kāi)始計(jì)時(shí),再次按下空格鍵,可以暫停倒計(jì)時(shí),同時(shí)設(shè)置的倒計(jì)時(shí)時(shí)間具有記憶功能,即計(jì)時(shí)結(jié)束后,再次按下空格,依然按照上次設(shè)定的計(jì)時(shí)時(shí)間進(jìn)行計(jì)時(shí)。
極簡(jiǎn)版代碼很簡(jiǎn)單,就不多作介紹了。
#include <stdio.h> #include <Windows.h> //Sleep(ms) int main() { int cnt = 0; puts("輸入秒數(shù)"); scanf("%d", &cnt); while(cnt >= 0) { Sleep(1000); printf("%d\r", cnt); cnt--; } printf("計(jì)時(shí)結(jié)束\n"); return 0; }
普通版本也很簡(jiǎn)單,主要包括:
設(shè)置計(jì)時(shí)時(shí)間倒計(jì)時(shí)蜂鳴器報(bào)警(系統(tǒng)提示音)
#include <stdio.h> #include <time.h> int main(void) { int hour = 0, min = 0, sec = 0; time_t time_sec = 0; time_t old_sec = 0; printf("請(qǐng)?jiān)O(shè)置計(jì)時(shí)時(shí)間——時(shí) 分 秒\n"); scanf("%d%d%d", &hour, &min, &sec); time(&time_sec); //獲取當(dāng)前秒數(shù)(1970-1-1 00:00:00到現(xiàn)在) printf("倒計(jì)時(shí)——%02d:%02d:%02d\r", hour, min, sec); old_sec = time_sec; //更新舊的秒數(shù) while(hour > 0 || min > 0 || sec > 0) { time(&time_sec); //獲取秒數(shù)保存到time_t變量 if(time_sec != old_sec) //如果秒數(shù)改變(計(jì)時(shí)達(dá)到1秒) { old_sec = time_sec; //更新舊的秒數(shù) if(sec > 0) sec--; //計(jì)時(shí)秒數(shù)減1 else { sec = 59; //如果原秒數(shù)為0,則變?yōu)?9 if(min > 0) min--; //計(jì)時(shí)分鐘減1 else { min = 59; //如果分鐘數(shù)為0,則變?yōu)?9 hour--; //計(jì)時(shí)小時(shí)數(shù)減1 } } printf("倒計(jì)時(shí)——%02d:%02d:%02d\r", hour, min, sec); } } for(int i = 0; i < 5; i++) { printf("\a"); //響蜂鳴器(或系統(tǒng)提示音) sleep(1); //延時(shí)1秒,太短電腦不發(fā)出聲音 } puts("\n計(jì)時(shí)結(jié)束\n"); return 0; }
在普通版本的基礎(chǔ)上添加了菜單打印和鍵盤(pán)按鍵掃描兩部分代碼。
程序的核心為pause_flag
和menu_flag
這兩個(gè)標(biāo)志,前者控制倒計(jì)時(shí)的開(kāi)始
,暫停
與繼續(xù)
,后者控制菜單
是否需要刷新(只有程序第一次運(yùn)行、設(shè)置計(jì)時(shí)時(shí)間或計(jì)時(shí)結(jié)束時(shí)才需要打印菜單)。
#include <stdio.h> #include <time.h> #include <conio.h> //kbhit()/_kbhit(),getch() #include <Windows.h> //Sleep(ms) int main(void) { //動(dòng)態(tài)計(jì)時(shí)參數(shù)(打印值) unsigned int hour = 0, min = 0, sec = 0; //默認(rèn)值(設(shè)定的計(jì)時(shí)參數(shù)) unsigned int hour_def = 0, min_def = 0, sec_def = 0; time_t time_sec = 0; time_t old_sec = 0; char key; int pause_flag = 1; //暫停標(biāo)志 int menu_flag = 1; //菜單打印標(biāo)志 while(1) { /**************** 菜單打印 ****************/ if(menu_flag == 1) { menu_flag = 0; system("cls"); //Windows系統(tǒng)清屏命令 printf("================================\n"); //菜單 if(hour_def || min_def || sec_def) printf("|\t倒計(jì)時(shí)時(shí)間:%02d:%02d:%02d\t |\n",\ hour_def, min_def, sec_def); else printf("|\t未設(shè)置計(jì)時(shí)時(shí)間\t\t|\n"); printf("| S:設(shè)置 空格:開(kāi)始/暫停 Q:退出 |\n"); printf("================================\n"); if(pause_flag == 0) { printf("計(jì)時(shí)結(jié)束\n"); for(int i = 0; i < 5; i++) { printf("\a"); //響蜂鳴器(或系統(tǒng)提示音) sleep(1); //延時(shí)1秒,太短電腦不發(fā)出聲音 } pause_flag = 1; //停止計(jì)時(shí) } } /**************** 鍵盤(pán)按鍵掃描+操作 ****************/ key = 0; if(_kbhit()) //檢測(cè)到按鍵按下 key = getch(); //讀取按鍵 switch(key) { case 's': //按s/S設(shè)置計(jì)時(shí)時(shí)間 case 'S': printf("請(qǐng)?jiān)O(shè)置計(jì)時(shí)時(shí)間——時(shí) 分 秒\n"); scanf("%d %d %d", &hour_def, &min_def, &sec_def); if(hour_def > 24 || min_def > 59 || sec_def > 59) { //printf("時(shí)間設(shè)置失敗\n"); hour_def = min_def = sec_def = 0; //重置時(shí)間 } hour = min = sec = 0; //計(jì)時(shí)值清零 menu_flag = 1; //打印菜單 break; case ' ': //按空格鍵開(kāi)始/暫停計(jì)時(shí) if(hour_def || min_def || sec_def) //如果時(shí)間有效 { if(pause_flag) { pause_flag = 0; //開(kāi)始計(jì)時(shí)或繼續(xù)計(jì)時(shí) if(!hour && !min && !sec) //計(jì)數(shù)值為0 { hour = hour_def; //讀取上次設(shè)置的時(shí)間 min = min_def; sec = sec_def; //打印初始時(shí)間 printf("倒計(jì)時(shí)——%02d:%02d:%02d\r",\ hour, min, sec); } } else pause_flag = 1; //暫停計(jì)時(shí) time(&time_sec); //獲取當(dāng)前秒數(shù)(1970-1-1 00:00:00到現(xiàn)在) old_sec = time_sec; //更新舊的秒數(shù) } break; case 'q': case 'Q': printf("程序退出\n");return 0; } /**************** 計(jì)時(shí)操作 ****************/ time(&time_sec); //獲取秒數(shù)保存到time_t變量 if(pause_flag == 0 && old_sec != time_sec) { old_sec = time_sec; //更新舊的秒數(shù) if(sec > 0) sec--; //計(jì)時(shí)秒數(shù)減1 else { sec = 59; //如果原秒數(shù)為0,則變?yōu)?9 if(min > 0) min--; //計(jì)時(shí)分鐘減1 else { min = 59; //如果分鐘數(shù)為0,則變?yōu)?9 hour--; //計(jì)時(shí)小時(shí)數(shù)減1 } } printf("倒計(jì)時(shí)——%02d:%02d:%02d\r", hour, min, sec); if(!hour && !min && !sec) //計(jì)時(shí)結(jié)束 menu_flag = 1; //打印菜單 } } return 0; }
到此,相信大家對(duì)“怎么使用C語(yǔ)言實(shí)現(xiàn)計(jì)時(shí)器”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。