forked from iseghiri/LO21_project
-
Notifications
You must be signed in to change notification settings - Fork 0
/
timing.cpp
166 lines (140 loc) · 4.62 KB
/
timing.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include <iomanip>
#include "timing.h"
#include <ctime>
using namespace TIME;
std::ostream& operator<<(std::ostream& f, const Date& x){ x.afficher(f); return f;}
std::ostream& operator<<(std::ostream& f, const Duree & d){ d.afficher(f); return f; }
std::ostream& operator<<(std::ostream& f, const Horaire & h){ h.afficher(f); return f; }
std::ostream& operator<<(std::ostream& f, const Periode & p){ p.afficher(f); return f; }
void Date::setDate(unsigned short int j, unsigned short int m, unsigned int a){
// initialisation de la date, renvoie vrai si la date est valide
if (a>=0&&a<=3000) annee=a; else throw TimeException("erreur: annee invalide");
if (m>=1&&m<=12) mois=m; else throw TimeException("erreur: mois invalide");
switch(m){
case 1: case 3: case 5: case 7: case 8: case 10: case 12: if (j>=1 && j<=31) jour=j; else throw TimeException("erreur: jour invalide"); break;
case 4: case 6: case 9: case 11: if (j>=1 && j<=30) jour=j; else throw TimeException("erreur: jour invalide"); break;
case 2: if (j>=1 && (j<=29 || (j==30 && a%4==0))) jour=j; else throw TimeException("erreur: jour invalide"); break;
}
}
void Date::afficher(std::ostream& f) const{
// affiche le date sous le format JJ/MM/AAAA
f<<std::setfill('0')<<std::setw(2)<<jour<<"/"<<std::setw(2)<<mois<<"/"<<annee<<std::setfill(' ');
}
bool Date::operator==(const Date& d) const{
if (annee<d.annee) return false;
if (annee>d.annee) return false;
if (mois<d.mois) return false;
if (mois>d.mois) return false;
if (jour<d.jour) return false;
if (jour>d.jour) return false;
return true;
}
bool Date::operator<(const Date& d) const{
if (annee<d.annee) return true;
if (annee>d.annee) return false;
if (mois<d.mois) return true;
if (mois>d.mois) return false;
if (jour<d.jour) return true;
if (jour>d.jour) return false;
return false;
}
int Date::operator-(const Date& d) const{
int n=(annee-d.annee)*365+(annee-d.annee)/4;
n+=int((mois-d.mois)*30.5);
n+=jour-d.jour;
return n;
}
Date Date::demain() const{
Date d=*this;
d.jour+=1;
switch(d.mois){
case 1: case 3: case 5: case 7: case 8: case 10: case 12: if (d.jour==30) { d.jour=1; d.mois++; } break;
case 4: case 6: case 9: case 11: if (d.jour==31) { d.jour=1; d.mois++; } break;
case 2: if (d.jour==29 && d.annee%4>0) { d.jour=1; d.mois++; } if (d.jour==30) { d.jour=1; d.mois++; } break;
}
if (d.mois==13){ d.annee++; d.mois=1; }
return d;
}
Date Date::operator+(unsigned int nb_jours) const{
Date d=*this;
while(nb_jours>0) { d=d.demain(); nb_jours--; }
return d;
}
bool Horaire::operator<(const Horaire& h) const{
if (heure<h.heure) return true;
if (heure>h.heure) return false;
if (minute<h.minute) return true;
if (minute>h.minute) return false;
return true;
}
Periode::Periode(unsigned int j, unsigned int m, unsigned int a):
nb_jours(j), nb_mois(m), nb_annees(a) {
if (j>364) throw TimeException("erreur: initialisation periode invalide");
if (m>11) throw TimeException("erreur: initialisation periode invalide");
}
std::ostream& operator<<(std::ostream& f, const Intervalle& x){ x.afficher(f); return f;}
Intervalle::Intervalle(const Date & d, const Date & f):debut(d),fin(f){
if (fin<debut) throw TimeException("Erreur dans la creation d'un intervalle: fin<debut");
}
bool Intervalle::operator&&(const Intervalle & v) const {
if (debut<v.debut){
if (fin<v.debut) return false; else return true;
}
if (v.fin<fin){
if (v.fin<debut) return false; else return true;
}
return true;
}
Intervalle Intervalle::operator+(const Intervalle & i) const {
Date d=fin.demain();
if (d==i.debut){
return Intervalle(debut,i.fin);
}else throw TimeException("Ne peut pas faire l'union de 2 intervalles (ils ne se touchent pas...");
}
void Intervalle::afficher(std::ostream& f) const {
f<<"["<<debut<<" ; "<<fin<<"]";
}
std::istream& operator>>(std::istream& flot, TIME::Date& date){
unsigned int short j,m,a;
bool ok=true;
flot>>j;
if (flot) while (flot.peek()==' ') flot.ignore(); // passe les espaces
else ok=false;
if (!flot) ok=false;
if(flot.peek()=='/') {
flot.ignore();
flot>>m;
if (!flot) ok=false;
}
else {
ok=false;
}
if(flot.peek()=='/') {
flot.ignore();
flot>>a;
if (!flot) ok=false;
}
else {
ok=false;
}
if (ok) date=Date(j,m,a); else flot.clear(std::ios::failbit);
return flot;
}
std::istream& operator>>(std::istream& flot, TIME::Duree& duree){
unsigned int h,m;
bool ok=true;
flot>>h;
if (flot) while (flot.peek()==' ') flot.ignore(); // passe les espaces
else ok=false;
if (!flot) ok=false;
if(flot.peek()=='H') {
flot.ignore();
flot>>m;
if (!flot) ok=false;
}
else {
ok=false;
}
if (ok) duree=Duree(h,m); else flot.clear(std::ios::failbit);
return flot;
}