-
Notifications
You must be signed in to change notification settings - Fork 0
/
horario.cpp
130 lines (106 loc) · 4.16 KB
/
horario.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include "horario.h"
#include <iostream>
#include <ctime>
using namespace std;
horario_t::horario_t(unsigned horas, unsigned minutos, unsigned segundos) :
horas(horas), minutos(minutos), segundos(segundos) {
ajeitarHorario();
}
horario_t::horario_t(unsigned timestamp) {
horas = minutos = segundos = 0;
timestampToHorario(timestamp);
}
horario_t::horario_t() {
getHorarioAtual();
}
unsigned horario_t::getHoras() { return horas; }
unsigned horario_t::getMinutos() { return minutos; }
unsigned horario_t::getSegundos() { return segundos; }
void horario_t::setHoras(unsigned horas) { this->horas = horas; }
void horario_t::setMinutos(unsigned minutos) { this->minutos = minutos; }
void horario_t::setSegundos(unsigned segundos) { this->segundos = segundos; }
horario_t horario_t::operator+(horario_t& horario2) {
horario_t horarioResultado(0,0,0);
horarioResultado.setHoras(this->horas + horario2.getHoras());
horarioResultado.setMinutos(this->minutos + horario2.getMinutos());
horarioResultado.setSegundos(this->segundos + horario2.getSegundos());
horarioResultado.ajeitarHorario();
return horarioResultado;
}
horario_t horario_t::operator-(horario_t& horarioSubtraendo) {
horario_t horarioFinal(0,0,0);
if(*this < horarioSubtraendo) throw ExcecaoHorarioInconsistente ();
unsigned horasMinuendo = this->horas;
unsigned horasSubtranedo = horarioSubtraendo.getHoras();
unsigned minutosMinuendo = this->minutos;
unsigned minutosSubtranedo = horarioSubtraendo.getMinutos();
unsigned segundosMinuendo = this->segundos;
unsigned segundosSubtranedo = horarioSubtraendo.getSegundos();
if(segundosMinuendo < segundosSubtranedo) {
segundosMinuendo += 60;
minutosMinuendo -= 1;
}
if(minutosMinuendo < minutosSubtranedo) {
minutosMinuendo += 60;
horasMinuendo -= 1;
}
horarioFinal.setHoras(horasMinuendo - horasSubtranedo);
horarioFinal.setMinutos(minutosMinuendo - minutosSubtranedo);
horarioFinal.setSegundos(segundosMinuendo - segundosSubtranedo);
horarioFinal.ajeitarHorario();
return horarioFinal;
}
bool horario_t::operator>(horario_t& segundoHorario) {
unsigned totalThis = this->getHoras() * 3600 +
this->getMinutos() * 60 +
this->getSegundos();
unsigned totalSegundo = segundoHorario.getHoras() * 3600 +
segundoHorario.getMinutos() * 60 +
segundoHorario.getSegundos();
return totalThis > totalSegundo;
}
bool horario_t::operator<(horario_t& segundoHorario) {
unsigned totalThis = this->getHoras() * 3600 +
this->getMinutos() * 60 +
this->getSegundos();
unsigned totalSegundo = segundoHorario.getHoras() * 3600 +
segundoHorario.getMinutos() * 60 +
segundoHorario.getSegundos();
return totalThis < totalSegundo;
}
bool horario_t::operator==(horario_t& segundoHorario) {
return !(this->operator>(segundoHorario)) && !(this->operator<(segundoHorario));
}
void horario_t::getHorarioAtual() {
time_t temporizador;
time(&temporizador);
struct tm * horario = localtime(&temporizador);
horas = (unsigned)horario->tm_hour;
minutos = (unsigned)horario->tm_min;
segundos = (unsigned)horario->tm_sec;
}
void horario_t::ajeitarHorario() {
if(segundos > 60) {
unsigned minutosAAcrecentar = (segundos - (segundos % 60)) / 60;
minutos += minutosAAcrecentar;
segundos -= minutosAAcrecentar * 60;
}
if(minutos > 60) {
unsigned horasAAcrecentar = (minutos - (minutos % 60)) / 60;
horas += horasAAcrecentar;
minutos -= horasAAcrecentar * 60;
}
}
unsigned horario_t::horarioToTimestamp() {
return horas*3600 + minutos*60 + segundos;
}
void horario_t::timestampToHorario(unsigned timestamp) {
segundos = timestamp;
ajeitarHorario();
}
ostream& operator<<(ostream& out, horario_t& horario) {
char textoHorario[10];
sprintf(textoHorario, "%uh%um%us", horario.getHoras(), horario.getMinutos(), horario.getSegundos());
out << textoHorario;
return out;
}