C++程式設計_簡易計時器(Timer)的控制檯實現

Jason~~發表於2020-05-17

求打賞求收藏求轉發!

提供PDF資源

https://download.csdn.net/download/weixin_43781565/12429047

(稽核後可供下載)

Peace and love

 

一、實驗名稱

簡易計時器(Timer)的控制檯指令實現

二、實驗目的

本次實驗旨在對課上學習的有關C++物件導向模組相關知識進行實際操作,將理論聯絡實際,提升物件導向部分的程式碼實現能力。

在理論方面主要:

  1. 對問題的初步抽象;
  2. 瞭解類(Class)和物件(Object)的基本概念;
  3. 學會類的定義方法;
  4. 瞭解類成員函式(Member Function)的定義和實現方法;
  5. 能夠編寫出初步的建構函式(Constructor);

在實際操作方面,本次試驗重點訓練了:

  1. 類(class)的建立
  2. 類中建構函式和解構函式的實現;
  3. 資料成員和成員函式的宣告,建立和呼叫;

三、實驗平臺

IDE :CodeBlocks16.1 (Core:VC++6.0)

Language Standard : C++14

問題描述與需求分析

計時器(Timer),是一個功能十分簡單的計時工具,也是各種高階語言中幾乎都有內建的模組之一,本次實驗通過設計一個簡易計時器,來對“物件導向”的概念進行理解,並對剛剛學習的類與成員函式吧等相關的概念進行實踐。

一個簡易計時器的執行程式需要的常用功能如下:

  1. 顯示當前時間;
  2. 開始計時;
  3. 暫停計時;
  4. 停止計時(清零);

程式功能抽象

從需求分析可知,我們可以使用一個抽象類Timer,將所有的功能函式和資料成員包括進來並封裝起來,而對於相關的功能,我們需要對應的成員函式進行實現:

  1. Show()用來實現顯示時間功能;
  2. Start()用來實現開始計時功能;
  3. Pause()用來實現暫停計時功能
  4. Stop()用來實現停止清零計時功能;

另外,我們還需要必須的建構函式Timer()用來初始化計時器的值。與此同時使用了C++的預製函式SetConsoleCursorPosition()游標控制和GetStdHandle()獲取標準輸出的控制程式碼等去優化程式的相關操作。

根據需求的分析,首先得到ATM機的大致操作流程,用流程圖表示如下:

 

Class Timer計時器類

  1. class Timer         //計時器類
  2. {
  3. private:
  4. long start_time;    //初始時間
  5. long pause_time;    //暫停時間
  6. //兩個bool值標記四種狀態
  7. bool is_pause; //記錄計時器的狀態 (是否處於暫停狀態)
  8. bool is_stop;//是否處於停止狀態
  9. public:
  10. Timer();
  11. bool isPause(); //返回計時器狀態
  12. bool isStop();
  13. //計時器的三種動作(功能)
  14. void Start();
  15. void Pause();
  16. void Stop();
  17. inline long getStartTime()
  18. {
  19. return start_time;
  20. }
  21. void Show();
  22. };

Timer::Timer()建構函式:初始化計時器狀態

  1. Timer::Timer()  //建構函式:初始化計時器狀態
  2. {
  3. is_pause = false;
  4. is_stop = true;
  5. }

bool Timer::isPause()判斷是否處於暫停狀態

  1. bool Timer::isPause()   //判斷是否處於暫停狀態
  2. {
  3. if(is_pause)
  4. return true;
  5. else
  6. return false;
  7. }

bool Timer::isStop()判斷是否處於停止狀態

  1. bool Timer::isStop()    //判斷是否處於停止狀態
  2. {
  3. if(is_stop)
  4. return true;
  5. return false;
  6. }

void Timer::Start()開始計時

  1. void Timer::Start()     //開始計時
  2. {
  3. if(is_stop)
  4. {
  5. start_time = time(0);
  6. is_stop = false;
  7. }
  8. else if(is_pause)
  9. {
  10. is_pause = false;
  11. //更新開始時間:用此時的時間 - 暫停時所用的時間 + 上一次開始的時間 = 此時的開始時間
  12. start_time += time(0)-pause_time;
  13. }
  14. }

void Timer::Pause() 暫停計時

  1. void Timer::Pause() //暫停計時
  2. {
  3. if(is_stop||is_pause)   //如果處於停止/暫停狀態,此動作不做任何處理,直接返回
  4. return;
  5. else                    //否則設定為暫停狀態
  6. {
  7. is_pause = true;
  8. pause_time = time(0); //獲取暫停時間
  9. }
  10. }

void Timer::Stop()  //停止計時

  1. void Timer::Stop()  //停止計時
  2. {
  3. if(is_stop)         //如果正處於停止狀態(不是暫停狀態),不做任何處理
  4. return ;
  5. else if(is_pause)   //改變計時器狀態
  6. {
  7. is_pause = false;
  8. is_stop = true;
  9. }
  10. else if(!is_stop)
  11. {
  12. is_stop = true;
  13. }
  14. }

void Timer::Show()      //列印時間

  1. void Timer::Show()      //列印時間
  2. {
  3. char ch;//控制程式選項
  4. hidden();//隱藏游標
  5. system("color 7");
  6. //設定位置列印專案
  7. location(35,12);
  8. cout<<"00:00:00";
  9. location(20,18);
  10. cout<<"     按a開始,按空格暫停,按s停止";
  11. while(1)    //程式開始
  12. {
  13. if(kbhit())
  14. {
  15. ch = getch();
  16. switch (ch)
  17. {
  18. case 'a':
  19. Start();
  20. break;
  21. case 's':
  22. Stop();
  23. break;
  24. case ' ':
  25. Pause();
  26. break;
  27. default :
  28. break;
  29. }
  30. }
  31. if(!isStop()&&!isPause())
  32. {
  33. long t = time(0) - start_time;
  34. location(35,12);
  35. //輸出同時調整時間格式
  36. cout<<setw(2)<<setfill('0')<<t/60/60<<":"
  37. <<setw(2)<<setfill('0')<<t/60<<":"
  38. <<setw(2)<<setfill('0')<<t%60<<endl;
  39. }
  40. }
  41. }

int main()  //主函式

  1. int main()  //主函式
  2. {
  3. Timer t;//建立一個物件
  4. t.Show();//呼叫展示函式
  5. }

void location(int x, int y)//定位顯示位置,x為行座標,y為列座標

  1. void location(int x, int y)//定位顯示位置,x為行座標,y為列座標
  2. {
  3. COORD pos = {x,y};//(座標  位置)
  4. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  //進行標準輸出處理
  5. SetConsoleCursorPosition(hOut, pos);//設定控制檯游標位置
  6. }

void hidden()//隱藏游標

  1. void hidden()//隱藏游標
  2. {
  3. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  4. CONSOLE_CURSOR_INFO i;
  5. GetConsoleCursorInfo(hOut,&i);
  6. i.bVisible=0;      //賦1為顯示,賦0為隱藏
  7. SetConsoleCursorInfo(hOut,&i);
  8. }

六、實驗結果

以下為實驗結果截圖:

 

 
  

圖1-1 初始化頁面

 
  
1 - 2   開始計時(秒開始增加)

 

 
  

 
  
圖1 -3 計時暫停(按下空格鍵後時間暫停)

圖1-4 計時繼續(按下a後計時繼續)

 

 
  

1-5計時停止(按下s)

 

 

 

 
  

1-6清零(停止後按下a)

1.在本次實驗中,成功的實現了簡易計時器的程式設計,實踐了對類的定義和實現,並對剛剛學習到的問題抽象進行了一定的訓練,從功能和需求的分析,到後面的問題抽象,再到最後的函式實現,一步一步的從面相過程的思路向物件導向進行轉化;

2.程式碼方面,對成員函式的書寫有了一定的訓練,從最初的無參函式無返回值進行重新思考,一步一步分析程式的返回型別和傳遞引數,如本次在實驗中採用的bool isPause()和bool isStop()來判斷時間目前的狀態,採用了布林型別進行處理;

3.在設定游標函式和顯示位置函式部分,在網上查閱了有關游標控制SetConsoleCursorPosition()和GetStdHandle()獲取標準輸出控制程式碼的知識,並在實驗中的“顯示時間”部分進行了應用,在接下來的實驗中可以在合適的地方繼續使用相關的知識。

總的來說,本次的簡易計時器只是面相物件的一個簡單的開始,接下來還要繼續學習相關的更高一級的操作,需要認真學習,多多實踐,做好每一次實驗。

 

 

附:程式原始碼

#include <cstdlib>

#include <iostream>

#include <cstdlib>

#include <ctime>

#include <conio.h>

#include <iomanip>

#include <windows.h>

using namespace std;

void location(int x, int y)//定位顯示位置,x為行座標,y為列座標

{

COORD pos = {x,y};//(座標  位置)

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  //進行標準輸出處理

SetConsoleCursorPosition(hOut, pos);//設定控制檯游標位置

}

void hidden()//隱藏游標

{

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_CURSOR_INFO i;

GetConsoleCursorInfo(hOut,&i);

i.bVisible=0;      //賦1為顯示,賦0為隱藏

SetConsoleCursorInfo(hOut,&i);

}

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()  //建構函式:初始化計時器狀態

{

is_pause = false;

is_stop = true;

}

bool Timer::isPause()   //判斷是否處於暫停狀態

{

if(is_pause)

return true;

else

return false;

}

bool Timer::isStop()    //判斷是否處於停止狀態

{

if(is_stop)

return true;

return false;

}

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;

}

}

void Timer::Pause() //暫停計時

{

if(is_stop||is_pause)   //如果處於停止/暫停狀態,此動作不做任何處理,直接返回

return;

else                    //否則設定為暫停狀態

{

is_pause = true;

pause_time = time(0); //獲取暫停時間

}

}

void Timer::Stop()  //停止計時

{

if(is_stop)         //如果正處於停止狀態(不是暫停狀態),不做任何處理

return ;

else if(is_pause)   //改變計時器狀態

{

is_pause = false;

is_stop = true;

}

else if(!is_stop)

{

is_stop = true;

}

}

void Timer::Show()      //列印時間

{

char ch;//控制程式選項

hidden();//隱藏游標

system("color 7");

//設定位置列印專案

location(35,12);

cout<<"00:00:00";

location(20,18);

cout<<"     按a開始,按空格暫停,按s停止";

while(1)    //程式開始

{

if(kbhit())

{

ch = getch();

switch (ch)

{

case 'a':

Start();

break;

case 's':

Stop();

break;

case ' ':

Pause();

break;

default :

break;

}

}

if(!isStop()&&!isPause())

{

long t = time(0) - start_time;

location(35,12);

//輸出同時調整時間格式

cout<<setw(2)<<setfill('0')<<t/60/60<<":"

<<setw(2)<<setfill('0')<<t/60<<":"

<<setw(2)<<setfill('0')<<t%60<<endl;

}

}

}

int main()  //主函式

{

Timer t;//建立一個物件

t.Show();//呼叫展示函式

}

相關文章