- Разработать класс CTime для работы со значениями времени. Класс должен содержать следующие элементы.
Поля (скрытые):
одно единственное поле, соответствующее количеству секунд, содержащихся в заданном значении времени
Методы:
конструктор по умолчанию, заполняющий поле текущим значением системного времени; конструктор, параметрами которого являются заданные значения часов, минут и секунд; конструктор-копировщик
методы-функции для задания значения поля класса CTime и получения часов, минут и секунд по заданному значению типа CTime
метод-функция для вывода времени на экран в общепринятом формате «чч:мм:сс» или в сокращенном виде «чч:мм» или в виде «чч:мм a.m.» («чч:мм p.m.») – часы и минуты до полудня или после полудня (при этом проверить, что значение времени не больше 24 часов)
- Реализовать для разработанного класса методы-операторы:
+, — (плюс и минус) — для сложения и вычитания значений времени, при этом все данные должны быть типа CTime
++, —(два плюса или два минуса подряд) – уменьшение или увеличение значения времени на 1 секунду
== (два знака равенства подряд) — для сравнения двух значений времени, результатом этой операции должен быть 0, если значения неравны, и любое ненулевое значение в противном случае
- Разработать программу, которая демонстрировала бы работоспособность всех методов данного класса.
#include #include #include class CTime { int tempSec; //количество секунд, содержащихся в заданном значении времени public: //конструктор по умолчанию, заполняющий поле текущим значением системного времени; CTime() { struct tm timeinfo; __time64_t rawtime; errno_t err; // Get time as 64-bit integer. _time64(&rawtime;); // Convert to local time. err = _localtime64_s(&timeinfo;, &rawtime;); if (err) { printf("Invalid argument to _localtime64_s."); exit(1); } //std::cout << "IN CTime()\n\n"; tempSec = timeinfo.tm_hour * 3600; tempSec += timeinfo.tm_min * 60; tempSec += timeinfo.tm_sec; } //конструктор, параметрами которого являются заданные значения часов, минут и секунд; CTime(int h, int m, int s) { if (h > 23 || h < 0 || m>59 || m < 0 || s>59 || s < 0) { std::cout << "Ошибка! Введены некорректные данные. Повторите ввод."; } else { tempSec = h * 3600; tempSec += m * 60; tempSec += s; } //std::cout << "CTime(int h, int m, int s)\n\n"; } //конструктор-копировщик CTime(CTime &c) { tempSec = c.tempSec; } //метод-функция для вывода времени на экран в общепринятом формате «чч:мм:сс» //или в сокращенном виде «чч:мм» //или в виде «чч:мм a.m.» («чч:мм p.m.») – часы и минуты до полудня или после полудня //(при этом проверить, что значение времени не больше 24 часов) void getTime(int i) { //if (newtime.tm_hour > 24) return; if (i == 0) { std::cout << getHour() << ":" << getMin() << ":" << getSec(); } else if (i == 1) { std::cout << getHour() << ":" << getMin(); } else if (i == 2) { if (getHour() > 12) { std::cout << getHour() - 12 << ":" << getMin() << " PM"; } else if (getHour() < 12) { std::cout << getHour() << ":" << getMin() << " AM"; } } std::cout << std::endl; } int getHour() { return (tempSec / 3600); } int getMin() { return ((tempSec - getHour() * 3600) / 60); } int getSec() { return (tempSec - getHour() * 3600 - getMin() * 60); } //методы - функции для задания значения поля класса CTime и получения часов, минут и //секунд по заданному значению типа CTime void setTime(int h, int m, int s) { if (h > 23 || h < 0 || m>59 || m < 0 || s>59 || s < 0) { std::cout << "Ошибка! Введите еще раз."; } else { setHour(h); setMin(m); setTime(s); } } void setHour(int h) { if (h>0 && h<23) tempSec += (h - getHour()) * 3600; } void setMin(int m) { if (m>0 && m<59) tempSec += (m - getMin()) * 60; } void setTime(int s) { if (s>0 && s<59) tempSec += (s - getSec()); } //== (два знака равенства подряд) - для сравнения двух значений времени, //результатом этой операции должен быть 0, если значения неравны, и любое ненулевое значение //в противном случае int operator == (CTime &c) { //if (tempSec - c.tempSec) { return 0; } //else { return 1; } return (tempSec == c.tempSec); } // +, - (плюс и минус) - для сложения и вычитания значений времени, при этом все данные //должны быть типа CTime CTime operator + (CTime &c) { CTime t; t.tempSec = c.tempSec + tempSec; t.setHour(t.getHour()%24); t.setMin(t.getMin() % 60); return t; } CTime operator - (CTime &c) { CTime t; t.tempSec = abs(tempSec - c.tempSec); return t; } //++, --(два плюса или два минуса подряд) – уменьшение или увеличение значения времени на 1 секунду // Define prefix increment operator. CTime operator ++() { tempSec++; return *this; } CTime operator --() { tempSec--; return *this; } // Define postfix increment operator. CTime operator ++(int) { CTime t(*this); tempSec++; return t; } CTime operator --(int) { CTime t(*this); abs(tempSec--); return t; } }; int main() { setlocale(LC_ALL, "Russian"); CTime time1; CTime time2(0,0,0); CTime time3(time1); std::cout << "Вывод времени на экран в общепринятом формате «чч:мм:сс»\n"; time1.getTime(0); time2.getTime(0); time3.getTime(0); std::cout << std::endl; std::cout << "Вывод времени на экран в сокращенном виде «чч:мм»\n"; time1.getTime(1); time2.getTime(1); time3.getTime(1); std::cout << std::endl; std::cout << "Вывод времени на экран в виде «чч : мм a.m.»(«чч : мм p.m.»)\n"; time1.getTime(2); time2.getTime(2); time3.getTime(2); std::cout << std::endl; std::cout << "Проверка на равенство time1 и time2\n"; if (time1 == time2) { std::cout << "Равны"; } else { std::cout << "Не равны"; } std::cout << std::endl; std::cout << "Проверка на равенство time1 и time3\n"; if (time1 == time3) { std::cout << "Равны"; } else { std::cout << "Не равны"; } std::cout << std::endl; std::cout << "Проверка на равенство time2 и time3\n"; if (time2 == time3) { std::cout << "Равны"; } else { std::cout << "Не равны"; } std::cout << std::endl << std::endl; std::cout << "Ввод времени (15, 16, 17) в 3й объект в виде «чч:мм:сс»\n"; time3.setTime(15, 16, 17); time1.getTime(0); time2.getTime(0); time3.getTime(0); std::cout << std::endl; //std::cout << "Использование operator++" << std::endl; //time2.getTime(0); //(time2++).getTime(0); //(++time2).getTime(0); //std::cout << "Использование operator--" << std::endl; //time2.getTime(0); //(time2--).getTime(0); //(--time2).getTime(0); std::cout << "Использование operator+" << std::endl; time2.getTime(0); time3.getTime(0); (time2 + time3).getTime(0); std::cout << "Использование operator-" << std::endl; CTime time4(1, 1, 1); CTime time5(5, 5, 5); time4.getTime(0); time5.getTime(0); (time4 - time5).getTime(0); system("pause"); return 0; }