Un esercizio per l'università dice di fare una classe chiamata Orario che faccia diverse operazioni su di essi, una delle quali è un controllo di correttezza dell'ora inserita/usata nel costruttore di classe
Di conseguenza ho scritto questo codice:
#include <iostream>
using namespace std;
class Orario {
private:
int h;
int m;
int s;
bool controlla_orario() //controlla se l'orario è giusto//
{if (0<=h<24&&0<=m<60&&0<=s<60)
return true;
else return false;}
public:
Orario() { // Costruttore senza parametri
h = 0;
m = 0;
s = 0;
}
Orario(int h1, int m1, int s1) { // Costruttore con parametri
h = h1;
m = m1;
s = s1;
if (controlla_orario() == false)
{cout<<"Orario errato";
h = 0;
m = 0;
s = 0;}}
Orario(int sec) //costruttore che converte secondi nell'ora corrispondente
{ h = sec/3600;
int temp = sec%3600;
m = temp/60;
s = temp%60;
}
void leggi(istream& or_in) { //lettura dell'ora in formato h:m:s
char sep1, sep2;
or_in >> h >> sep1 >> m >> sep2 >> s;
if (controlla_orario() == false)
{cout<<"Orario errato";
h = 0;
m = 0;
s = 0;
return;}
return;
}
void stampa(ostream& or_out) {
or_out << h << ':' << m << ':' << s;
return;
}
int get_ora() //fornisce solo l'ora
{return h;}
int get_minuti() //fornisce solo i minuti
{return m;}
int get_secondi() //fornisce solo i secondi
{return s;}
int to_second() //converte l'ora in secondi
{int secondi;
secondi = secondi + (h*3600);
secondi = secondi + (m*60);
secondi = secondi + s;
return secondi;
}
Orario operator+(int x) { //somma tra un'ora e un numero x di secondi
int n = to_second();
n = n + x;
Orario ris (n);
return ris;
}
bool operator==(Orario o) //controllo se un'ora è uguale ad un 'altra
{ if (h==o.h&&m==o.m&&s==o.s)
return true;
else return false;
}
bool operator< (Orario o) //controllo se un'ora è più "piccola" di un'altra
{ if (h<o.h)
return true;
else if (h>o.h)
return false;
else if (m<o.m)
return true;
else if (m>o.m)
return false;
else if (s<o.s)
return true;
else return false;
}
};
ostream& operator<<(ostream& or_out, Orario& o) {
o.stampa(or_out);
return or_out;
}
istream& operator>>(istream& or_in, Orario& o) {
o.leggi(or_in);
return or_in;
}
Che poi dovrà usare questo main NON modificabile:
#include <iostream>
using namespace std;
/* memorizzare la classe Orario in un file con nome esercizio_1.cpp
posto nella stessa cartella in cui è presente il file di questo programma.
La direttiva di preproccising #include "esercizio_1.cpp" si occuperà
di caricare tutto il contenuto del file esattamente nel punto in cui si trova
la direttiva stessa.
In alternativa, inserire direttamente la dichiarazione della classe Orario
al posto della direttiva #include "esercizio_1.cpp".
*/
#include "esercizio_1.cpp"
int main() {
Orario o1(9,42,10); // crea un oggetto di classe Orario
Orario o2(5221); // crea un oggetto di classe Orario
Orario o3;
cout << "orario 1: " << o1 << endl;
cout << "orario 2: " << o2 << endl;
cout << "orario 3: " << o3 << endl << endl;
cout << "ora di o2: " << o2.get_ora() << endl;
cout << "minuti di o2: " << o2.get_minuti() << endl;
cout << "secondi di o2: " << o2.get_secondi() << endl << endl;
if (o1 < o2) cout << "o1 < o2" << endl;
else cout << "o2 < o1" << endl;
if (o1 == o2) cout << "o1 == o2" << endl;
else cout << "o1 != o2" << endl;
cout << endl;
int o1_sec = o1.to_second();
cout << "secondi corrispondenti a o1: " << o1_sec << endl;
Orario o4(o1_sec);
if (o4 == o1) cout << "ok" << endl;
else cout << "errore" << endl;
cout << endl;
o3 = o1 + 5221;
cout << "il nuovo orario e: " << o3 << endl << endl;
Orario orario_in;
cout << "Immetti un orario corretto (h:m:s): ";
cin >> orario_in;
cout << "L'orario immesso e' " << orario_in << endl << endl;
cout << "Immetti un orario errato (h:m:s): ";
cin >> orario_in;
cout << "L'orario immesso e' " << orario_in << endl << endl;
return 0;
}
/* traccia esecuzione
orario 1: 9:42:10
orario 2: 1:27:1
orario 3: 0:0:0
ora di o2: 1
minuti di o2: 27
secondi di o2: 1
o2 < o1
o1 != o2
secondi corrispondenti a o1: 34930
ok
il nuovo orario e': 11:9:11
Immetti un orario corretto (h:m:s): 12:3:14
L'orario immesso e' 12:3:14
Immetti un orario errato (h:m:s): 12:100:14
Orario errato
L'orario immesso e' 0:0:0
*/
I commenti in fondo del main sono i risultati che dovrei ottenere, cosa che succede fino a quando devo mettere un orario sbagliato. Ho notato che la funzione privata controlla_orario() non restituisce il valore falso quando dovrebbe e non riesco a capire cosa c'è che non va, qualcuno può aiutarmi?