Реализация класса CTime для работы со значениями времени на C++

Реализация класса CTime для работы со значениями времени на C++
  1. Разработать класс CTime для работы со значениями времени. Класс должен содержать следующие элементы.

Поля (скрытые):

одно единственное поле, соответствующее количеству секунд, содержащихся в заданном значении времени

Методы:

конструктор по умолчанию,  заполняющий  поле текущим значением системного времени; конструктор, параметрами которого являются заданные значения  часов, минут и секунд; конструктор-копировщик

методы-функции для задания значения поля класса CTime и получения часов, минут и секунд по заданному значению типа CTime

метод-функция для вывода времени на экран в общепринятом формате «чч:мм:сс» или в сокращенном виде «чч:мм» или в виде  «чч:мм a.m.» («чч:мм p.m.») – часы и минуты до полудня или после полудня (при этом проверить, что значение времени не больше 24 часов)

  1. Реализовать для разработанного класса методы-операторы:

+, — (плюс и минус)  — для сложения и вычитания значений времени, при этом все данные должны быть типа CTime

++, —(два плюса или два минуса подряд) – уменьшение или увеличение значения времени на 1 секунду

== (два знака равенства подряд)  — для сравнения двух значений времени, результатом этой операции должен быть 0, если значения неравны, и любое ненулевое значение в противном случае

  1. Разработать программу, которая демонстрировала бы работоспособность всех методов данного класса.
#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;
}

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *