253: #include <iostream>
254: #include <iomanip>
255: #include <string>
256: #include <vector>
257:
258: using namespace std;
259:
260: #include "ccc_time.h"
261:
262: class Clock
263: {
264: public:
265: /**
266: Constructs a clock that can tell the local time.
267: @param use_military true if the clock uses military format
268: */
269: Clock(bool use_military);
270:
271: /**
272: Gets the location of this clock.
273: @return the location
274: */
275: virtual string get_location() const;
276:
277: /**
278: Gets the hours of this clock.
279: @return the hours, in military or am/pm format
280: */
281: virtual int get_hours() const;
282:
283: /**
284: Gets the minutes of this clock.
285: @return the minutes
286: */
287: int get_minutes() const;
288:
289: /**
290: Checks whether this clock uses miltary format.
291: @return true if miltary format
292: */
293: bool is_military() const;
294: private:
295: bool military;
296: };
297:
298: Clock::Clock(bool use_military)
299: {
300: military = use_military;
301: }
302:
303: string Clock::get_location() const
304: {
305: return "Local";
306: }
307:
308: int Clock::get_hours() const
309: {
310: Time now;
311: int hours = now.get_hours();
312: if (military) return hours;
313: if (hours == 0)
314: return 12;
315: else if (hours > 12)
316: return hours - 12;
317: else
318: return hours;
319: }
320:
321: int Clock::get_minutes() const
322: {
323: Time now;
324: return now.get_minutes();
325: }
326:
327: bool Clock::is_military() const
328: {
329: return military;
330: }
331:
332: class TravelClock : public Clock
333: {
334: public:
335: /**
336: Constructs a travel clock that can tell the time
337: at a specified location
338: @param mil true if the clock uses military format
339: @param loc the location
340: @param diff the time difference from the local time
341: */
342: TravelClock(bool mil, string loc, int diff);
343: string get_location() const;
344: int get_hours() const;
345: private:
346: string location;
347: int time_difference;
348: };
349:
350: TravelClock::TravelClock(bool mil, string loc, int diff)
351: : Clock(mil)
352: {
353: location = loc;
354: time_difference = diff;
355: while (time_difference < 0)
356: time_difference = time_difference + 24;
357: }
358:
359: string TravelClock::get_location() const
360: {
361: return location;
362: }
363:
364: int TravelClock::get_hours() const
365: {
366: int h = Clock::get_hours();
367: if (is_military())
368: return (h + time_difference) % 24;
369: else
370: {
371: h = (h + time_difference) % 12;
372: if (h == 0) return 12;
373: else return h;
374: }
375: }
376:
377: int main()
378: {
379: vector<Clock*> clocks(3);
380: clocks[0] = new Clock(true);
381: clocks[1] = new TravelClock(true, "Rome", 9);
382: clocks[2] = new TravelClock(false, "Tokyo", -7);
383:
384: for (int i = 0; i < clocks.size(); i++)
385: {
386: cout << clocks[i]->get_location() << " time: "
387: << clocks[i]->get_hours() << ":"
388: << setw(2) << setfill('0')
389: << clocks[i]->get_minutes()
390: << setfill(' ') << "\n";
391: }
392: return 0;
393: }
394: