fork download
  1. #include <iostream>
  2. #include <stdexcept>
  3.  
  4. typedef unsigned int uint;
  5.  
  6. const uint MAX_TIMESTAMP = (23 * 3600) + (59 * 60) + 59;
  7.  
  8. typedef struct TimeStamp
  9. {
  10. uint stamp;
  11. TimeStamp() : stamp(0)
  12. {
  13. }
  14.  
  15. TimeStamp(int hour, int minute, int second)
  16. {
  17. if (hour < 0)
  18. {
  19. throw std::invalid_argument("TimeStamp: Hour cannot be less than zero");
  20. }
  21. else if (minute < 0)
  22. {
  23. throw std::invalid_argument("TimeStamp: Minute cannot be less than zero");
  24. }
  25. else if (second < 0)
  26. {
  27. throw std::invalid_argument("TimeStamp: Second cannot be less than zero");
  28. }
  29.  
  30. uint temp = (hour * 3600) + (minute * 60) + second;
  31. if (temp > MAX_TIMESTAMP)
  32. {
  33. throw std::out_of_range("TimeStamp: value provided is too large");
  34. }
  35.  
  36. stamp = temp;
  37. }
  38.  
  39. uint GetHour() const
  40. {
  41. return stamp / 3600;
  42. }
  43.  
  44. uint GetMinute() const
  45. {
  46. return (stamp % 3600) / 60;
  47. }
  48.  
  49. uint GetSecond() const
  50. {
  51. return (stamp % 3600) % 60;
  52. }
  53.  
  54. } TimeStamp;
  55.  
  56. std::ostream& operator<<(std::ostream& output, TimeStamp& t)
  57. {
  58. uint hour = t.GetHour();
  59. uint minute = t.GetMinute();
  60. uint second = t.GetSecond();
  61.  
  62. if (hour != 0 && hour != 12 && hour % 12 < 10)
  63. {
  64. output << "0";
  65. }
  66.  
  67. output << (hour == 0 || hour == 12 ? 12 : hour % 12) << ":" << (minute < 10 ? "0" : "") << minute << ":" <<
  68. (second < 10 ? "0" : "") << second << " " << (hour < 12 ? "AM" : "PM");
  69.  
  70. return output;
  71. }
  72.  
  73. int main(void)
  74. {
  75. TimeStamp t(13, 45, 82);
  76. std::cout << t.stamp << ": " << t << std::endl;
  77.  
  78. return 0;
  79. }
  80.  
Success #stdin #stdout 0s 4520KB
stdin
Standard input is empty
stdout
49582: 01:46:22 PM