- Разработать класс 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;
}