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

C++如何實現(xiàn)簡單的計時器詳解

 更新時間:2017年01月12日 17:08:21   作者:小博computing  
因為最近閑著無聊就想著要不用C++寫點什么東西,仔細(xì)想了想其實自己的C++學(xué)的也不怎么好,寫個簡單的計時器吧!所以下面這篇文章主要介紹了利用C++如何實現(xiàn)簡單的計時器,需要的朋友可以參考借鑒,下面來一起看看吧。

實現(xiàn)分析

首先我們先分析一下計時器的一些功能,簡單一點的計時器包括開始、暫停、停止和顯示基本功能,這些功能以C++面向?qū)ο蟮木幊趟枷耄∣OP)進(jìn)行抽象,就是計時器類(Timer)的4個成員函數(shù),當(dāng)然我們要把這些函數(shù)作為公有的,因為它們是留給外部的接口(interface)。

然后我們再分析一下計時器的三種狀態(tài):停止,正在運行,暫停(注意:暫停不是停止),那么怎么記錄計時器的三種狀態(tài)呢?

這里我們用布爾類型的變量記錄計時器的三種狀態(tài),分別為bool is_pause,bool is_stop,在這里一定要注意變量的命名,就像這樣見名知意。吐舌頭當(dāng)然為了體現(xiàn)C++類的封裝性,要把這兩個bool變量作為計時器類(Timer)的私有成員。

實現(xiàn)方法

重要的問題來了,我們怎么實現(xiàn)計時呢?吶,你們知道time()函數(shù)嗎?簡單的說一下time函數(shù):這個函數(shù)在time.h頭文件中,它返回自 Unix 紀(jì)元(January 1 1970 00:00:00 GMT)起的當(dāng)前時間的秒數(shù),是一個長整形(long)。這樣我們在計時器開始的時候獲取一個time函數(shù)的返回值,保存到一個變量中,在用一個變量保存暫停時的時間。當(dāng)我們開始計時的時候,進(jìn)入一個死循環(huán),始終用time() -開始的時間,就是當(dāng)前計時器的時間。(不要急,具體實現(xiàn)往下看)。此時為了保存開始和暫停時刻的時間,必須在計時器類(Timer)中增加兩個長整形(long)變量:start_time,pause_time,當(dāng)然作為私有變量。

好像還少點什么......為了讓外部獲取當(dāng)前計時器的狀態(tài),我們還需要兩個函數(shù)返回計時器的狀態(tài),is_pause()計時器是否處于暫停,is_stop()計時器是否處于停止?fàn)顟B(tài),返回值的類型為bool。

驚訝別忘了Timer的構(gòu)造函數(shù),用來做一些初始化的工作!

好了,至此我們的計時器類設(shè)計完成了(prefect),代碼在下面:

class Timer 
{ 
 private: 
 long start_time; 
 long pause_time; 
 //兩個bool值標(biāo)記四種狀態(tài) 
 bool is_pause; //記錄計時器的狀態(tài) (是否處于暫停狀態(tài)) 
 bool is_stop;//是否處于停止?fàn)顟B(tài) 
 public: 
 Timer(); 
 bool isPause(); //返回計時器狀態(tài) 
 bool isStop(); 
 //計時器的三種動作(功能) 
 void Start(); 
 void Pause(); 
 void Stop(); 
 inline long getStartTime() {return start_time;} 
 void show(); 
}; 

接下來的任務(wù)就是實現(xiàn)Timer的成員函數(shù)了..............

首先是構(gòu)造函數(shù)Timer::Timer() ,完成一些初始化的工作:

Timer::Timer() 
{ 
 is_pause = false; //初始化計時器狀態(tài) 
 is_stop = true; 
} 

計時器開始計時之前應(yīng)該處于停止?fàn)顟B(tài)!(計時器只能處于一種狀態(tài),不要犯糊涂哦?。?/p>

成員函數(shù)isPause()它的作用僅是讓外部獲取計時器是否處于暫停狀態(tài),so easy

bool Timer::isPause() 
{ 
 if(is_pause) 
 return true; 
 else 
 return false; 
} 

isStop函數(shù)和isPause一樣只是一個接口,讓外部獲取計時器的狀態(tài):

bool Timer::isStop() 

    if(is_stop) 
        return true; 
    return false; 
}  

下面是Timer::Start()函數(shù)的實現(xiàn),它是計時器開始的時候要運行的函數(shù):

void Timer::Start() //開始 
{ 
 if(is_stop) 
 { 
 start_time = time(0); 
 is_stop = false; 
 } 
 else if(is_pause) 
 { 
 is_pause = false; 
 start_time += time(0)-pause_time; //更新開始時間:用此時的時間 - 暫停時所用的時間 + 上一次開始的時間 = 此時的開始時間 
 } 
} 

我們首先判斷一下計時的狀態(tài),如果處于停止?fàn)顟B(tài),獲取開始的時間,然后更新計時器的狀態(tài);如果計時器正處在暫停狀態(tài),我們讓計時器繼續(xù)計時,我采用改變開始的計時的時間(start_time)去調(diào)整計時的時間 : (用此時的時間 - 暫停時所用的時間 + 上一次開始的時間 = 此時的開始時間)。如果計時器正處于運行狀態(tài),就什么也不做?。ú恢来蠹夷懿荒芸吹亩?....)

這是暫停函數(shù)Timer::Pause()的實現(xiàn):

void Timer::Pause() //暫停 
{ 
 if(is_stop||is_pause) //如果處于停止/暫停狀態(tài),此動作不做任何處理,直接返回 
 return; 
 else //否則調(diào)制為暫停狀態(tài) 
 { 
 is_pause = true; 
 pause_time = time(0); //獲取暫停時間 
 } 
} 

如果沒有在運行,也就是處于暫?;蛲V?fàn)顟B(tài),什么也不做直接返回。否則就去處理暫停請求:既然我們進(jìn)行了暫停的操作,就要改變計時器的狀態(tài),將狀態(tài)設(shè)置為暫停,保存此刻的時間,(這個暫停的時間pause_time在上面的開始的函數(shù)中用的到?。?。

接著我們?nèi)崿F(xiàn)停止函數(shù)Timer::Stop():

void Timer::Stop() //停止 
{ 
 if(is_stop) //如果正處于停止?fàn)顟B(tài)(不是暫停狀態(tài)),不做任何處理 
 return ; 
 else if(is_pause) //改變計時器狀態(tài) 
 { 
 is_pause = false; 
 is_stop = true; 
 } 
 else if(!is_stop) 
 { 
 is_stop = true; 
 } 
} 

如果處于停止?fàn)顟B(tài),直接返回。否則如果處于暫停狀態(tài)改變計時器的狀態(tài)為is_stop = true ;否則就是處于運行狀態(tài),直接改變計時器的狀態(tài)為停止。

下面是顯示時間的函數(shù)Timer::show()

void Timer::show() 
{ 
 long t = time(0) - start_time; 
 gotoxy(35,12); 
 cout<<setw(2)<<setfill('0')<<t/60/60<<":" 
 <<setw(2)<<setfill('0')<<t/60<<":" 
 <<setw(2)<<setfill('0')<<t%60<<endl; 
} 

這里我要說一下gotoxy(int x,int y)函數(shù),它的作用是將控制臺的光標(biāo)定位到坐標(biāo)(x,y)處,show函數(shù)是要放到死循環(huán)中的,所以這樣始終將輸出的時間打印到一個地方,實現(xiàn)了時間的更新(我是不是很聰明);setw(int x)是設(shè)置輸出的字寬,setfill(char  ch)設(shè)置了字符的填充。time函數(shù)返回的是秒數(shù),t/60/60得到小時,t/60得到分鐘,t%60得到秒數(shù)。

下面就是主函數(shù)了main()

int main() 
{ 
 Timer t; 
 char ch; 
 hidden();//隱藏光標(biāo) 
 system("color 02"); 
 gotoxy(35,12); 
 cout<<"00:00:00"; 
 gotoxy(20,18); 
 cout<<"按a開始,按空格暫停,按s停止"; 
 while(1) 
 { 
 if(kbhit()) 
 { 
  ch = getch(); 
  switch (ch) 
  { 
  case 'a':t.Start();break; 
  case 's':t.Stop();break; 
  case ' ':t.Pause();break; 
  default :break; 
  } 
 } 
 if(!t.isStop()&&!t.isPause()) 
 { 
  t.show(); 
 } 
 } 
 
} 

Timer t;定義一個計時器。hidden() ;是用來隱藏控制臺光標(biāo)的,不是必須的。

然后是進(jìn)入死循環(huán),kbhit()函數(shù)是檢測是否有按鍵,如有按鍵返回非0值,沒有按鍵返回0;用getch()獲取按鍵,然后用

switch case分支結(jié)構(gòu)處理不同的按鍵。

至此,我們的計時器設(shè)計完成!是不是感覺很簡單啊!吐舌頭

讓我們看一下運行結(jié)果:

下面是本程序用到的頭文件:

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <conio.h> 
#include <iomanip> 
#include <windows.h> 

下面是代碼中用到的函數(shù):

void gotoxy(int x,int y)

void gotoxy(int x, int y)//定位光標(biāo),x為行坐標(biāo),y為列坐標(biāo) 
{ 
 COORD pos = {x,y};//(坐標(biāo) 位置); 
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //得到標(biāo)準(zhǔn)處理(標(biāo)準(zhǔn)輸出處理); 
 SetConsoleCursorPosition(hOut, pos);//設(shè)置控制臺光標(biāo)位置; 
} 

void hidden( )

void hidden()//隱藏光標(biāo) 
{ 
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 
 CONSOLE_CURSOR_INFO cci; 
 GetConsoleCursorInfo(hOut,&cci); 
 cci.bVisible=0;//賦1為顯示,賦0為隱藏 
 SetConsoleCursorInfo(hOut,&cci); 
} 

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • C語言實現(xiàn)帶頭結(jié)點的鏈表的創(chuàng)建、查找、插入、刪除操作

    C語言實現(xiàn)帶頭結(jié)點的鏈表的創(chuàng)建、查找、插入、刪除操作

    這篇文章主要介紹了C語言實現(xiàn)帶頭結(jié)點的鏈表的創(chuàng)建、查找、插入、刪除操作方法,對于了解數(shù)據(jù)結(jié)構(gòu)中鏈表的各項操作有很好的借鑒價值,需要的朋友可以參考下
    2014-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)之二分法查找詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之二分法查找詳解

    二分查找算法是在有序數(shù)組中用到的較為頻繁的一種算法,在未接觸二分查找算法時,最通用的一種做法是,對數(shù)組進(jìn)行遍歷,跟每個元素進(jìn)行比較,其時間為O(n),但二分查找算法更優(yōu)
    2022-02-02
  • C++ OpenCV實現(xiàn)圖像雙三次插值算法詳解

    C++ OpenCV實現(xiàn)圖像雙三次插值算法詳解

    圖像雙三次插值的原理,就是目標(biāo)圖像的每一個像素都是由原圖上相對應(yīng)點周圍的4x4=16個像素經(jīng)過加權(quán)之后再相加得到的。本文主要介紹了通過C++ OpenCV實現(xiàn)圖像雙三次插值算法,需要的可以參考一下
    2021-12-12
  • C++實現(xiàn)LeetCode(64.最小路徑和)

    C++實現(xiàn)LeetCode(64.最小路徑和)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(64.最小路徑和),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 一文詳解如何在VS?Code上搭建C/C++開發(fā)環(huán)境

    一文詳解如何在VS?Code上搭建C/C++開發(fā)環(huán)境

    VSCode是由微軟開發(fā)的一款免費、開源、跨平臺的文本編輯器,它具有許多強(qiáng)大的功能,這篇文章主要給大家介紹了關(guān)于如何在VS?Code上搭建C/C++開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 使用C++實現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換

    使用C++實現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了如何使用C++實現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-06-06
  • C++調(diào)用Go方法的字符串傳遞問題及解決方案

    C++調(diào)用Go方法的字符串傳遞問題及解決方案

    這篇文章主要介紹了C++調(diào)用Go方法的字符串傳遞問題及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C/C++中字符串的存儲方式詳解

    C/C++中字符串的存儲方式詳解

    在C語言中,字符串通常以字符數(shù)組的形式存在,并以空字符(\0)結(jié)尾,在C++中,建議使用 std::string 類來處理字符串,本文給大家介紹了C/C++中字符串的存儲方式,需要的朋友可以參考下
    2024-11-11
  • 新手向超詳細(xì)的C語言實現(xiàn)動態(tài)順序表

    新手向超詳細(xì)的C語言實現(xiàn)動態(tài)順序表

    本文主要介紹了C語言實現(xiàn)動態(tài)順序表,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 如何用C語言畫一個“圣誕樹”

    如何用C語言畫一個“圣誕樹”

    這篇文章主要介紹了如何用C語言畫一個“圣誕樹”,感興趣的小伙伴們可以參考一下
    2015-12-12

最新評論

眉山市| 黄平县| 遵义县| 磐石市| 南开区| 乐安县| 黄大仙区| 滨州市| 商城县| 隆回县| 梅州市| 卢氏县| 濉溪县| 太谷县| 永年县| 西宁市| 邵阳县| 西和县| 玛曲县| 普陀区| 景宁| 灵山县| 鹤岗市| 彩票| 大方县| 花莲县| 阳西县| 安宁市| 衢州市| 工布江达县| 威信县| 安溪县| 合水县| 长春市| 荆门市| 岳普湖县| 青川县| 松桃| 青州市| 平顶山市| 尼勒克县|