#include <iostream>
#include <chrono>
#include <thread>
#include <iomanip>
class Stopwatch {
public:
Stopwatch() : startTime(), endTime(), running(false), elapsedTime(0) {}
void start() {
if (!running) {
startTime = std::chrono::high_resolution_clock::now();
running = true;
std::cout << "Stopwatch started!" << std::endl;
} else {
std::cout << "Stopwatch is already running!" << std::endl;
}
}
void stop() {
if (running) {
endTime = std::chrono::high_resolution_clock::now();
elapsedTime += std::chrono::duration<double>(endTime - startTime).count();
running = false;
std::cout << "Stopwatch stopped!" << std::endl;
} else {
std::cout << "Stopwatch is not running!" << std::endl;
}
}
void reset() {
if (running) {
startTime = std::chrono::high_resolution_clock::now();
} else {
elapsedTime = 0;
}
std::cout << "Stopwatch reset!" << std::endl;
}
void display() const {
double currentTime = elapsedTime;
if (running) {
auto now = std::chrono::high_resolution_clock::now();
currentTime += std::chrono::duration<double>(now - startTime).count();
}
int minutes = static_cast<int>(currentTime) / 60;
int seconds = static_cast<int>(currentTime) % 60;
int milliseconds = static_cast<int>((currentTime - static_cast<int>(currentTime)) * 1000);
std::cout << "Elapsed Time: "
<< std::setw(2) << std::setfill('0') << minutes << ":"
<< std::setw(2) << std::setfill('0') << seconds << "."
<< std::setw(3) << std::setfill('0') << milliseconds
<< std::endl;
}
private:
std::chrono::high_resolution_clock::time_point startTime;
std::chrono::high_resolution_clock::time_point endTime;
bool running;
double elapsedTime;
};
int main() {
Stopwatch stopwatch;
char command;
while (true) {
std::cout << "Enter command (s: start, t: stop, r: reset, d: display, q: quit): ";
std::cin >> command;
switch (command) {
case 's':
stopwatch.start();
break;
case 't':
stopwatch.stop();
break;
case 'r':
stopwatch.reset();
break;
case 'd':
stopwatch.display();
break;
case 'q':
std::cout << "Quitting..." << std::endl;
return 0;
default:
std::cout << "Invalid command!" << std::endl;
break;
}
}
return 0;
}