Source of t4.cpp


  1: // Filename: T4.CPP
  2: // Purpose:  Implementation file corresponding to TIME4.H.
  3: //           This version adds three overloaded operators and default
  4: //           parameters in order to combine constructor definitions.


  7: #include <iostream>
  8: using namespace std;


 11: #include "T4.H"


 14: // Private data members of the Time class:
 15: //     int hours;
 16: //     int minutes;
 17: //     int seconds;


 20: // This is a "four-in-one" constructor, which may take zero, one,
 21: // two, or three parameters.
 22: //******************************************************************
 23: Time::Time(/* in */ int hoursInitial,
 24:            /* in */ int minutesInitial,
 25:            /* in */ int secondsInitial)
 26: // Constructor
 27: // Pre:  0 <= hoursInitial   <= 23  and
 28: ///      0 <= minutesInitial <= 59  and
 29: //       0 <= secondsInitial <= 59
 30: // Post: Class object is constructed
 31: //       and the time is set according to the incoming parameters.
 32: {
 33:     hours = hoursInitial;
 34:     minutes = minutesInitial;
 35:     seconds = secondsInitial;
 36: }


 39: // The following five "interface functions" are exactly the same as
 40: // the corresponding ones in TIME3.CPP.  For brevity we have omitted
 41: // comments and pre/post-conditions, which are also the same, as are
 42: // the function implementations.


 45: //******************************************************************
 46: void Time::Set(int hoursNew, int minutesNew, int secondsNew)
 47: {
 48:     hours = hoursNew;
 49:     minutes = minutesNew;
 50:     seconds = secondsNew;
 51: }


 54: //******************************************************************
 55: void Time::Increment()
 56: {
 57:     seconds++;
 58:     if (seconds > 59)
 59:     {
 60:         seconds = 0;
 61:         minutes++;
 62:         if (minutes > 59)
 63:         {
 64:             minutes = 0;
 65:             hours++;
 66:             if (hours > 23)
 67:                 hours = 0;
 68:         }
 69:     }
 70: }


 73: //******************************************************************
 74: int Time::Hours()   const { return hours; }
 75: int Time::Minutes() const { return minutes; }
 76: int Time::Seconds() const { return seconds; }



 80: // The following functions are the definitions of the three overloaded
 81: //  operators supplied by this implementation of the Time class.


 84: //******************************************************************
 85: bool Time::operator==(/* in */ const Time& otherTime) const
 86: // Pre:  none
 87: // Post: Returns true if self equals otherTime and false otherwise.
 88: {
 89:     return (hours == otherTime.hours      &&
 90:             minutes == otherTime.minutes  &&
 91:             seconds == otherTime.seconds);
 92: }



 96: //******************************************************************
 97: istream& operator>>(/* inout */ istream& inputStream,
 98:                     /* out */   Time& t)
 99: // Pre:  The input stream inputStream is open.
100: //       Time values in the input stream have the form HH:MM:SS.
101: // Post: Time t has been read in.
102: //       inputStream is still open.
103: {
104:     char ch;

106:     inputStream >> t.hours   >> ch
107:                 >> t.minutes >> ch
108:                 >> t.seconds;

110:     return inputStream;
111: }



115: //******************************************************************
116: ostream& operator<<(/* inout */ ostream& outputStream,
117:                     /* in */    const Time& t)
118: // Pre:  The output stream outputStream is open.
119: // Post: Time t has been output in the form HH:MM:SS.
120: //       outputStream is still open.
121: {
122:     if (t.hours < 10)
123:         outputStream << '0';
124:     outputStream << t.hours << ':';
125:     if (t.minutes < 10)
126:         outputStream << '0';
127:     outputStream << t.minutes << ':';
128:     if (t.seconds < 10)
129:         outputStream << '0';
130:     outputStream << t.seconds;

132:     return outputStream;
133: }


136: //******************************************************************
137: Time operator +(/* in */ const Time& t1,
138:                 /* in */ const Time& t2)
139: // Pre:  t1 and t2 have been initialized.
140: // Post: Value returned is equivalent to t1 advanced by t2.
141: {
142:     Time t;

144:     t.seconds = t1.seconds + t2.seconds;
145:     t.seconds = t.seconds % 60;
146:     t.minutes = t1.minutes + t2.minutes + t.seconds / 60;
147:     t.minutes = t.minutes % 60;
148:     t.hours = t1.hours + t2.hours + t.minutes / 60;
149:     t.hours = t.hours % 24;

151:     return t;
152: }