Nyhoff, ADTs, Data Structures and Problem Solving with C++, Second Edition,
© 2005 Pearson Education, Inc. All rights reserved. 0-13-140909-3
Figure 4.2 OOP Interface for Time |
/*-- Time.h ---------------------------------------------------------------
This header file defines the data type Time for processing time.
Basic operations are:
set: To set the time
display: To display the time
-------------------------------------------------------------------------*/
#include <iostream>
class Time
{
public:
/******** Function Members ********/
void set(unsigned hours, unsigned minutes, char am_pm);
/*----------------------------------------------------------------------
Set the data members of a Time object to specified values.
Preconditions: 1 <= hours <= 12, 0 <= minutes <= 59,
and am_pm is either 'A' or 'P'.
Postcondition: Data members myHours, myMinutes, and myAMorPM
are set to hours, minutes, and am_pm, respectively, and
myMilTime to the equivalent military time
----------------------------------------------------------------------*/
void display(ostream & out) const;
/*----------------------------------------------------------------------
Display time in standard and military format using output stream out.
Precondition: The ostream out is open.
Postcondition: The time represented by this Time object has been
inserted into ostream out.
----------------------------------------------------------------------*/
private:
/********** Data Members **********/
unsigned myHours,
myMinutes;
char myAMorPM; // 'A' or 'P'
unsigned myMilTime; // military time equivalent
}; // end of class declaration
|
Figure 4.3 OOP Implementation of Time |
/*-- Time.cpp------------------------------------------------------------ Definitions of the function members of the Time class declared in Time.h and definitions of utility functions that convert between military and standard time. -------------------------------------------------------------------------*/ #include <iostream> using namespace std; #include "Time.h" /*** Utility Functions -- Prototypes ***/ int toMilitary(unsigned hours, unsigned minutes, char am_pm); //----- Definition of set function ----- void Time::set(unsigned hours, unsigned minutes, char am_pm) { // Check class invariant if (hours >= 1 && hours <= 12 && minutes >= 0 && minutes <= 59 && (am_pm == 'A' || am_pm == 'P')) { myHours = hours; myMinutes = minutes; myAMorPM = am_pm; myMilTime = toMilitary(hours, minutes, am_pm); } else cerr << "*** Can't set time with these values ***\n"; // Object's data members remain unchanged } //----- Definition of display function ----- void Time::display(ostream & out) const { out << myHours << ':' << (myMinutes < 10 ? "0" : "") << myMinutes << ' ' << myAMorPM << ".M. (" << myMilTime << " mil. time)"; } /*** Utility Functions -- Definitions ***/ int toMilitary(unsigned hours, unsigned minutes, char am_pm) /*------------------------------------------------------------------------- Convert standard time to military time. Precondition: hours, minutes, am_pm satisfy the class invariant. Postcondition: Military time equivalent is returned. -------------------------------------------------------------------------*/ { if (hours == 12) hours = 0; return hours * 100 + minutes + (am_pm == 'P' ? 1200 : 0); } |
Figure 4.4 Test Driver for Time Class |
//--- Test driver for class Time
#include <iostream>
using namespace std;
#include "Time.h"
int main()
{
Time mealTime;
mealTime.set(5, 30, 'P');
cout << "We'll be eating at ";
mealTime.display(cout);
cout << endl;
cout << "\nNow trying to set time with illegal hours (13)" << endl;
mealTime.set(13, 0, 'A');
cout << "Now trying to set time with illegal minutes (60)" << endl;
mealTime.set(5, 60, 'A');
cout << "Now trying to set time with illegal AM/PM ('X')" << endl;
mealTime.set(5, 30, 'X');
}
|
Figure 4.5A Expanded Time.h |
/*-- Time.h ---------------------------------------------------------------
This header file defines the data type Time for processing time.
Basic operations are:
Default constructor -- Initializes object to 12:00 AM
Explicit-value constructor
read: To read a time
display: To display the time
>>, <<: Input and Output operators
accessors: getHours, getMinutes, getAMPM, getMilTime
set: To set the time
advance: To advance the time by a certain amount
relops: <, >, ==, <=, >=, !=
-------------------------------------------------------------------------*/
#include <iostream>
using namespace std;
#ifndef TIME
#define TIME
class Time
{
public:
/******** Function Members ********/
/***** Class constructors *****/
Time();
/*----------------------------------------------------------------------
Construct a class object (default).
Precondition: None.
Postcondition: Time object is initialized to 12:00 A.M.;
that is, myHours, myMinutes, and myAMorPM are initialized
to 12, 0, 'A', respectively, and myMilTime to 0.
-----------------------------------------------------------------------*/
Time(unsigned initHours, unsigned initMinutes, char initAMPM);
/*----------------------------------------------------------------------
Construct a class object (explicit values).
Precondition: initHours, initMinutes, and initAMPM are initial
values for the data members; they must preserve the class
invariant.
Postcondition: Data members myHours, myMinutes, and myAMorPM
have been initialized to initHours, initMinutes, and initAMPM,
respectively, and myMilTime to the corresponding military time.
-----------------------------------------------------------------------*/
/***** Accessors *****/
unsigned getHours() const;
/*----------------------------------------------------------------------
Retrieve the value stored in the myHours data member.
Precondition: None.
Postcondition: Value stored in myHours is returned.
-----------------------------------------------------------------------*/
unsigned getMinutes() const;
/*----------------------------------------------------------------------
Retrieve the value stored in the myMinutes data member.
Precondition: None.
Postcondition: Value stored in myMinutes is returned.
-----------------------------------------------------------------------*/
unsigned getAMPM() const;
/*----------------------------------------------------------------------
Retrieve the value stored in the myAMorPM data member.
Precondition: None.
Postcondition: Value stored in myAMorPM is returned.
-----------------------------------------------------------------------*/
unsigned getMilTime() const;
/*----------------------------------------------------------------------
Retrieve the value stored in the myMilTime data member.
Precondition: None.
Postcondition: Value stored in myMilTime is returned.
-----------------------------------------------------------------------*/
/***** Input/Output *****/
void display(ostream & out) const;
/*----------------------------------------------------------------------
Display time in standard and military format using output stream out.
Precondition: The ostream out is open.
Postcondition: The time represented by this Time object has been
inserted into ostream out.
----------------------------------------------------------------------*/
void read(istream & in);
/*----------------------------------------------------------------------
Read a time value from input stream in.
Precondition: The istream in is open; input from in has the form
hh:mm xM; values hh, mm, and X satisfy the class invariant.
Postcondition: Input values have been removed from in and stored
in the data members.
----------------------------------------------------------------------*/
/***** Set operation *****/
void set(unsigned hours, unsigned minutes, char am_pm);
/*----------------------------------------------------------------------
Set the data members of a Time object to specified values.
Preconditions: 1 <= hours <= 12, 0 <= minutes <= 59,
and am_pm is either 'A' or 'P'.
Postconditon: Data members myHours, myMinutes, and myAMorPM
are set to hours, minutes, and am_pm, respectively, and
myMilTime to the equivalent military time
----------------------------------------------------------------------*/
/***** Increment operation *****/
void advance(unsigned hours, unsigned minutes);
/*----------------------------------------------------------------------
Increment a Time object by a specified value.
Precondition: hours is the number of hours to add and minutes
is the number of minutes to add.
Postcondition: The time represented by this Time object had been
incremented by this number of hour and minutes.
----------------------------------------------------------------------*/
private:
/********** Data Members **********/
unsigned myHours,
myMinutes;
char myAMorPM; // 'A' or 'P'
unsigned myMilTime; // military time equivalent
}; // end of class declaration
//----- << and >> operators
ostream & operator<<(ostream & out, const Time & t);
/*------------------------------------------------------------------------
Overloaded ouput operator
Precondition: The ostream out is open.
Postcondition: The time represented by this Time object has been
inserted into ostream out (via display()); reference to out
is returned.
------------------------------------------------------------------------*/
istream & operator>>(istream & in, Time & t);
/*------------------------------------------------------------------------
Overloaded input operator
Precondition: The istream in is open; input from in has the form
hh:mm xM; values hh, mm, and X satisfy the class invariant.
Postcondition: Values have been extracted from in (via read()) and
stored in this Time object's data members; reference to in is
returned.
--------------------------------------------------------------------------*/
/***** Relational operators *****/
bool operator<(const Time & t1, const Time & t2);
/*----------------------------------------------------------------------
Determine if one Time object is less than (i.e., earlier than)
another Time object.
Precondition: None.
Postcondition: true is returned if t1 is less than t2 and
false otherwise.
---------------------------------------------------------------------*/
bool operator>(const Time & t1, const Time & t2);
/*----------------------------------------------------------------------
Determine if one Time object is greater than (i.e., later than)
another Time object.
Precondition: None.
Postcondition: true is returned if t1 is greater than t2 and
false otherwise.
----------------------------------------------------------------------*/
bool operator==(const Time & t1, const Time & t2);
/*----------------------------------------------------------------------
Determine if one Time object is equal to another Time object.
Precondition: None.
Postcondition: true is returned if t1 is equal to t2 and
false otherwise.
----------------------------------------------------------------------*/
bool operator<=(const Time & t1, const Time & t2);
/*----------------------------------------------------------------------
Determine if one Time object is less than or equal to
(i.e., earlier than or the same as) another Time object.
Precondition: None.
Postcondition: true is returned if t1 is less than or equal
to t2 and false otherwise.
----------------------------------------------------------------------*/
bool operator>=(const Time & t1, const Time & t2);
/*----------------------------------------------------------------------
Determine if one Time object is greater than or equal to
(i.e., later than or the same as) another Time object.
Precondition: None.
Postcondition: true is returned if t1 is greater than or equal
to t2 and false otherwise.
----------------------------------------------------------------------*/
//----- Definition of operator!=() -----
bool operator!=(const Time & t1, const Time & t2);
/*----------------------------------------------------------------------
Determine if one Time object is not equal to another Time object.
Precondition: None.
Postcondition: true is returned if t1 is not equal to t2 and
false otherwise.
----------------------------------------------------------------------*/
#endif
|
Figure 4.5B Expanded Time.cpp |
/*-- Time.cpp------------------------------------------------------------ This file implements the Time member functions. -------------------------------------------------------------------------*/ #include <iostream> using namespace std; #include "Time.h" /*** Utility Functions -- Prototypes ***/ int toMilitary(unsigned hours, unsigned minutes, char am_pm); void toStandard(unsigned military, unsigned & hours, unsigned & minutes, char & AMPM); //----- Definition of default constructor Time::Time() : myHours(12), myMinutes(0), myAMorPM('A'), myMilTime(0) { } //----- Definition of explicit-value constructor ----- Time::Time(unsigned initHours, unsigned initMinutes, char initAMPM) { // Check class invariant if (initHours >= 1 && initHours <= 12 && initMinutes >= 0 && initMinutes <= 59 && (initAMPM == 'A' || initAMPM == 'P')) { myHours = initHours; myMinutes = initMinutes; myAMorPM = initAMPM; myMilTime = toMilitary(initHours, initMinutes, initAMPM); } else cerr << "*** Invalid initial values ***\n"; } //----- Definition of getMinutes() unsigned Time::getMinutes() const { return myMinutes; } //----- Definition of getHours() unsigned Time::getHours() const { return myHours; } //----- Definition of getAMPM() unsigned Time::getAMPM() const { return myAMorPM; } //----- Definition of getMilTime() unsigned Time::getMilTime() const { return myMilTime; } //----- Definition of display function ----- void Time::display(ostream & out) const { out << myHours << ':' << (myMinutes < 10 ? "0" : "") << myMinutes << ' ' << myAMorPM << ".M. (" << myMilTime << " mil. time)"; } //----- Definition of read function ----- void Time::read(istream & in) { unsigned hours, // Local variables to hold input values from in so minutes; // they can be checked against the class invariant char am_pm, // before putting them in the data members ch; // To gobble up : and the 'M' in input in >> hours >> ch >> minutes >> am_pm >> ch; // Check the class invariant if (hours >= 1 && hours <= 12 && minutes >= 0 && minutes <= 59 && (am_pm == 'A' || am_pm == 'P')) { myHours = hours; myMinutes = minutes; myAMorPM = am_pm; myMilTime = toMilitary(hours, minutes, am_pm); } else cerr << "*** Invalid input for Time object ***\n"; } //----- Definition of operator<<() ostream & operator<<(ostream & out, const Time & t) { t.display(out); return out; } //----- Definition of operator>>() istream & operator>>(istream & in, Time & t) { t.read(in); return in; } //----- Definition of set function ----- void Time::set(unsigned hours, unsigned minutes, char am_pm) { // Check class invariant if (hours >= 1 && hours <= 12 && minutes >= 0 && minutes <= 59 && (am_pm == 'A' || am_pm == 'P')) { myHours = hours; myMinutes = minutes; myAMorPM = am_pm; myMilTime = toMilitary(hours, minutes, am_pm); } else cerr << "*** Can't set time with these values ***\n"; // Object's data members remain unchanged } //----- Definition of advance function----- void Time::advance(unsigned hours, unsigned minutes) { // Increment the myMilTime member myMilTime += 100 * hours + minutes; // Adjust to proper format unsigned milHours = myMilTime / 100, milMins = myMilTime % 100; milHours += milMins / 60; milMins %= 60; milHours %= 24; myMilTime = 100 * milHours + milMins; // Now set the standard time data members toStandard(myMilTime, myHours, myMinutes, myAMorPM); } /***** Relational operators *****/ bool operator<(const Time & t1, const Time & t2) { return t1.getMilTime() < t2.getMilTime(); } bool operator>(const Time & t1, const Time & t2) { return t1.getMilTime() > t2.getMilTime(); } bool operator==(const Time & t1, const Time & t2) { return t1.getMilTime() == t2.getMilTime(); } bool operator<=(const Time & t1, const Time & t2) { return t1.getMilTime() <= t2.getMilTime(); } bool operator>=(const Time & t1, const Time & t2) { return t1.getMilTime() >= t2.getMilTime(); } //----- Definition of operator!=() ----- bool operator!=(const Time & t1, const Time & t2) { return t1.getMilTime() != t2.getMilTime(); } /*** Utility Functions -- Definitions ***/ int toMilitary(unsigned hours, unsigned minutes, char am_pm) /*------------------------------------------------------------------------- Convert standard time to military time. Precondition: hours, minutes, am_pm satisfy the class invariant. Postcondition: Military time equivalent is returned. -------------------------------------------------------------------------*/ { if (hours == 12) hours = 0; return hours * 100 + minutes + (am_pm == 'P' ? 1200 : 0); } void toStandard(unsigned military, unsigned & hours, unsigned & minutes, char & AMPM) /*------------------------------------------------------------------------- Convert military time to standard time. Receive: military, a time in military format Return: hours, minutes, AMPM -- equivalent standard time -------------------------------------------------------------------------*/ { hours = (military / 100) % 12; if (hours == 0) hours = 12; minutes = military % 100; AMPM = (military / 100) < 12 ? 'A' : 'P'; } |
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|
Figure |
|
|