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

  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;
}