亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++如何實現簡單的計時器詳解

2020-05-23 13:56:03
字體:
來源:轉載
供稿:網友

實現分析

首先我們先分析一下計時器的一些功能,簡單一點的計時器包括開始、暫停、停止和顯示基本功能,這些功能以C++面向對象的編程思想(OOP)進行抽象,就是計時器類(Timer)的4個成員函數,當然我們要把這些函數作為公有的,因為它們是留給外部的接口(interface)。

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

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

實現方法

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

好像還少點什么......為了讓外部獲取當前計時器的狀態,我們還需要兩個函數返回計時器的狀態,is_pause()計時器是否處于暫停,is_stop()計時器是否處于停止狀態,返回值的類型為bool。

驚訝別忘了Timer的構造函數,用來做一些初始化的工作!

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

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

接下來的任務就是實現Timer的成員函數了..............

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

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

計時器開始計時之前應該處于停止狀態?。ㄓ嫊r器只能處于一種狀態,不要犯糊涂哦?。?/p>

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

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

isStop函數和isPause一樣只是一個接口,讓外部獲取計時器的狀態:

bool Timer::isStop() 

    if(is_stop) 
        return true; 
    return false; 
}  

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

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; //更新開始時間:用此時的時間 - 暫停時所用的時間 + 上一次開始的時間 = 此時的開始時間  } } 

我們首先判斷一下計時的狀態,如果處于停止狀態,獲取開始的時間,然后更新計時器的狀態;如果計時器正處在暫停狀態,我們讓計時器繼續計時,我采用改變開始的計時的時間(start_time)去調整計時的時間 : (用此時的時間 - 暫停時所用的時間 + 上一次開始的時間 = 此時的開始時間)。如果計時器正處于運行狀態,就什么也不做!(不知道大家能不能看的懂.....)

這是暫停函數Timer::Pause()的實現:

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

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

接著我們去實現停止函數Timer::Stop():

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

如果處于停止狀態,直接返回。否則如果處于暫停狀態改變計時器的狀態為is_stop = true ;否則就是處于運行狀態,直接改變計時器的狀態為停止。

下面是顯示時間的函數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)函數,它的作用是將控制臺的光標定位到坐標(x,y)處,show函數是要放到死循環中的,所以這樣始終將輸出的時間打印到一個地方,實現了時間的更新(我是不是很聰明);setw(int x)是設置輸出的字寬,setfill(char  ch)設置了字符的填充。time函數返回的是秒數,t/60/60得到小時,t/60得到分鐘,t%60得到秒數。

下面就是主函數了main()

int main() {  Timer t;  char ch;  hidden();//隱藏光標  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() ;是用來隱藏控制臺光標的,不是必須的。

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

switch case分支結構處理不同的按鍵。

至此,我們的計時器設計完成!是不是感覺很簡單?。⊥律囝^

讓我們看一下運行結果:

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

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

下面是代碼中用到的函數:

void gotoxy(int x,int y)

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

void hidden( )

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

總結

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产色综合久久不卡98口| 国产亚洲精品高潮| 亚洲网站视频福利| 欧美日韩亚洲高清| 成人网中文字幕| 国产成人一区二区三区电影| 国产精品欧美激情在线播放| 成人国产精品色哟哟| 日韩欧美亚洲国产一区| 亚洲变态欧美另类捆绑| 在线精品国产欧美| 欧美精品少妇videofree| 欧美成人免费全部| 国产一区二区三区在线视频| 日韩欧美亚洲一二三区| 国产欧美精品一区二区三区-老狼| 国产精品精品国产| 日韩欧美国产黄色| 久久久在线视频| 欧美视频裸体精品| 欧美老妇交乱视频| 亚洲人成电影网站色xx| 国产欧美精品xxxx另类| 日韩在线高清视频| 亚洲欧美国产高清va在线播| 亚洲已满18点击进入在线看片| 欧美日韩ab片| 亚洲激情在线观看视频免费| 最近2019年好看中文字幕视频| 国内精品国产三级国产在线专| 久久免费福利视频| 亚洲国产欧美在线成人app| 日韩专区在线播放| 亚洲精品成人久久电影| 97国产成人精品视频| 日韩精品电影网| 欧美另类99xxxxx| 欧美成人免费在线观看| 欧美激情按摩在线| 欧美性猛交xxxx免费看久久久| 91精品国产九九九久久久亚洲| 日韩av在线导航| 久久精品人人爽| 日韩高清电影免费观看完整版| 国产精品免费一区二区三区都可以| 欧美精品第一页在线播放| 国产精品久久久久一区二区| 欧美中文在线观看| 狠狠色狠色综合曰曰| 欧美俄罗斯性视频| 91精品91久久久久久| 黑人巨大精品欧美一区二区免费| 国产精品igao视频| 欧美国产日本在线| 91精品视频在线免费观看| 亚洲网站在线看| 亚洲第一天堂无码专区| 91国内免费在线视频| 国产成人精品亚洲精品| 国产精品av在线| 国产aⅴ夜夜欢一区二区三区| 国产日韩换脸av一区在线观看| 欧美激情视频在线观看| 欧洲永久精品大片ww免费漫画| 国产中文字幕日韩| 亚洲精品综合精品自拍| 国产精品久久久| 日韩精品久久久久久久玫瑰园| 亚洲欧洲一区二区三区久久| 91免费人成网站在线观看18| 91色精品视频在线| 欧美性在线观看| 国产精品极品尤物在线观看| 日韩在线观看免费网站| 国产婷婷97碰碰久久人人蜜臀| 国产成人亚洲综合青青| 精品福利免费观看| 国产精品va在线播放| 久久精品国产91精品亚洲| 岛国av午夜精品| 亚洲精品www久久久久久广东| 久久精品视频在线| 国产精品第8页| 日韩电影免费在线观看| 97在线观看免费高清| 97精品伊人久久久大香线蕉| 国产99视频精品免视看7| 久久久久久久久久久91| 成人亲热视频网站| 久久久女女女女999久久| 国产精品成人aaaaa网站| 在线视频欧美性高潮| 国产专区精品视频| 日韩美女激情视频| 国产成人在线视频| 欧美成人精品激情在线观看| 欧美精品videos| 国产啪精品视频| 国产综合色香蕉精品| 精品动漫一区二区| 国模gogo一区二区大胆私拍| yw.139尤物在线精品视频| 欧美性xxxx| 操日韩av在线电影| 91欧美精品成人综合在线观看| 久久大大胆人体| 91精品国产成人| 国产精品视频精品视频| 国产69精品久久久久久| 欧美黄色片视频| 欧美黄色www| 久久久久久成人精品| 亚洲成人黄色在线观看| 日韩av黄色在线观看| 91国产美女在线观看| 精品中文字幕在线观看| 欧美激情在线视频二区| 都市激情亚洲色图| 成人激情黄色网| 国产成人精品免费久久久久| 精品无人国产偷自产在线| 国模视频一区二区三区| www.亚洲男人天堂| 中文字幕av一区| 国产91在线播放精品91| 一本一本久久a久久精品综合小说| 91超碰中文字幕久久精品| 亚洲qvod图片区电影| 久久97精品久久久久久久不卡| 91精品国产乱码久久久久久久久| 亚洲成年人影院在线| 一个人看的www欧美| 色悠悠国产精品| 亚洲综合在线做性| 国产精品你懂得| 欧美视频在线观看 亚洲欧| 久久人人爽国产| 日韩视频一区在线| 韩日欧美一区二区| 亚洲人免费视频| 中文精品99久久国产香蕉| 久青草国产97香蕉在线视频| 亚洲一品av免费观看| 亚洲国产欧美一区二区三区同亚洲| 国产欧美日韩综合精品| 国产精品欧美一区二区三区奶水| 欧美丝袜美女中出在线| 久久精品视频在线| 日韩视频―中文字幕| 国产婷婷97碰碰久久人人蜜臀| 亚洲国产日韩精品在线| 欧美激情欧美激情在线五月| 自拍视频国产精品| 精品视频久久久久久| 国产美女搞久久| 成人乱人伦精品视频在线观看| 亚洲精品日韩av| 精品福利在线观看| 欧美日韩美女在线观看| 日韩成人激情在线| 国产精品电影久久久久电影网| 美女视频黄免费的亚洲男人天堂| 亚洲第一天堂av| 91在线视频免费|