91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++實現簡單的計時器的方法

發布時間:2021-03-10 11:10:44 來源:億速云 閱讀:467 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關C++實現簡單的計時器的方法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

實現分析

首先我們先分析一下計時器的一些功能,簡單一點的計時器包括開始、暫停、停止和顯示基本功能,這些功能以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; 
}

計時器開始計時之前應該處于停止狀態!(計時器只能處于一種狀態,不要犯糊涂哦!)

成員函數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); //獲取暫停時間 
 } 
}

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

接著我們去實現停止函數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); 
}

感謝各位的閱讀!關于“C++實現簡單的計時器的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

红河县| 信宜市| 鄂托克旗| 马边| 黄平县| 甘洛县| 乳山市| 滁州市| 霍州市| 吴川市| 灌云县| 府谷县| 内江市| 康平县| 龙南县| 龙州县| 杨浦区| 张家界市| 清苑县| 大连市| 哈尔滨市| 西和县| 上林县| 临沧市| 彰化市| 深水埗区| 无极县| 波密县| 西宁市| 马山县| 莲花县| 阜平县| 康定县| 闽清县| 包头市| 平远县| 连山| 龙游县| 漾濞| 临漳县| 林甸县|