C語言小項(xiàng)目計(jì)時(shí)器的實(shí)現(xiàn)思路(倒計(jì)時(shí)+報(bào)警提示)
大家對(duì)計(jì)時(shí)器應(yīng)該不陌生,我們?cè)谥贫ㄒ粋€(gè)計(jì)劃時(shí),經(jīng)常喜歡設(shè)置一個(gè)倒計(jì)時(shí)來規(guī)定完成時(shí)限,等到計(jì)時(shí)結(jié)束,它還會(huì)報(bào)警提示,今天,我就用C語言編寫一個(gè)簡易的倒計(jì)時(shí)計(jì)時(shí)器。
實(shí)現(xiàn)思路
簡單介紹一下我的實(shí)現(xiàn)思路:
本文包括三個(gè)版本,分別是極簡版、普通版、高級(jí)版:
- 極簡版:簡單的單次倒計(jì)時(shí),只能設(shè)置秒數(shù),計(jì)時(shí)通過
Sleep()函數(shù)實(shí)現(xiàn)(粗略倒計(jì)時(shí)),先輸入秒數(shù)cnt,然后每過1秒(Sleep(1000),cnt減1,直到cnt變成0,就退出程序。 - 普通版:可設(shè)置計(jì)時(shí)的時(shí)、分、秒(
hour,min,sec),計(jì)時(shí)通過time()函數(shù)實(shí)現(xiàn)(用來獲取當(dāng)前系統(tǒng)時(shí)間的秒數(shù)),進(jìn)入while循環(huán),判斷系統(tǒng)時(shí)間秒數(shù)是否變化,如有變化,說明過了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í)間,然后按下空格鍵開始計(jì)時(shí),再次按下空格鍵,可以暫停倒計(jì)時(shí),同時(shí)設(shè)置的倒計(jì)時(shí)時(shí)間具有記憶功能,即計(jì)時(shí)結(jié)束后,再次按下空格,依然按照上次設(shè)定的計(jì)時(shí)時(shí)間進(jìn)行計(jì)時(shí)。
1.極簡版本
極簡版代碼很簡單,就不多作介紹了。
#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;
}
運(yùn)行效果

2.普通版本
普通版本也很簡單,主要包括:
設(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;
}
運(yùn)行效果

3.高級(jí)版本
在普通版本的基礎(chǔ)上添加了菜單打印和鍵盤按鍵掃描兩部分代碼。
程序的核心為pause_flag和menu_flag這兩個(gè)標(biāo)志,前者控制倒計(jì)時(shí)的開始,暫停與繼續(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è)置 空格:開始/暫停 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í)
}
}
/**************** 鍵盤按鍵掃描+操作 ****************/
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 ' ': //按空格鍵開始/暫停計(jì)時(shí)
if(hour_def || min_def || sec_def) //如果時(shí)間有效
{
if(pause_flag)
{
pause_flag = 0; //開始計(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;
}
運(yùn)行效果

到此這篇關(guān)于C語言小項(xiàng)目——計(jì)時(shí)器(倒計(jì)時(shí)+報(bào)警提示)的文章就介紹到這了,更多相關(guān)C語言倒計(jì)時(shí)計(jì)時(shí)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出
這篇文章主要介紹了C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出,C語言的語句用來向計(jì)算機(jī)系統(tǒng)發(fā)出操作指令。一條語句編寫完成經(jīng)過編譯后產(chǎn)生若干條機(jī)器指2022-07-07
C++深入講解類與對(duì)象之OOP面向?qū)ο缶幊膛c封裝
學(xué)習(xí)過C語言的小伙伴知道:C語言是面向過程的,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題,接下來讓我們?cè)敿?xì)的了解2022-05-05

