#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <iostream.h>
#include <iomanip.h>

#define ESC 27

#if (__BORLANDC__ <= 0x460)
enum bool { false, true };
#endif

class TChrono
{
  clock_t time, start, end;
  int res;
  bool paused;
  
  public:
    TChrono();
    virtual ~TChrono();
    
    void Start();
    void Stop();
    void Pause();
    void Continue();
    bool IsPaused();
    
    clock_t Time();
};

TChrono::TChrono()
  : time(0), start(0), end(0), res(100), paused(true)
{}

TChrono::~TChrono()
{}

void TChrono::Start()
{
  start = clock();
  time = 0;
  paused = false;
}

void TChrono::Stop()
{
  if(!IsPaused())
  {
    end = clock();
    time += (end - start) / CLK_TCK * res;
    paused = true;
  }
}

void TChrono::Pause()
{
  Stop();
}

void TChrono::Continue()
{
  if(IsPaused())
  {
    paused = false;
    start = clock();
  }
}

bool TChrono::IsPaused()
{
  return paused;
}

clock_t TChrono::Time()
{
  return time + (IsPaused() ? 0 : + (clock() - start) / CLK_TCK * res);
}

void main()
{
  TChrono chrono;
  char opt;
  
  clrscr();
  _setcursortype(_NOCURSOR);
  
  cout << "1 - Start" << endl;
  cout << "2 - Stop" << endl;
  cout << "3 - Pause" << endl;
  cout << "4 - Continue" << endl;
  cout << "ESC - Exit" << endl;
  
  do
  {
    while(!kbhit())
    {
      clock_t time = chrono.Time();
      clock_t dec = time % 100;
      clock_t sec = time / 100;
      clock_t min = sec / 60;
      
      sec %= 60;
      
      gotoxy(10, 10);
      cout << setfill('0')
           << setw(2) << min << '\''
           << setw(2) << sec << '"'
           << setw(2) << dec;
    }
    
    opt = getch();
    
    switch(opt)
    {
      case '1':
        chrono.Start();
      break;     
      case '2':
        chrono.Stop();
      break;
      
      case '3':
        chrono.Pause();
      break;
      
      case '4':
        chrono.Continue();
      break;
    }
  } while(opt != ESC);

  _setcursortype(_NORMALCURSOR);
}
1