ilclone ha scritto:
Per curiosità ho eseguito anche io esercizio 1 e 2
spero che ti possa dare qualche spunto
#include <iostream>
using namespace std;
class data {
private:
int giorno;
int mese;
int anno;
public:
data() : giorno(1),mese(1),anno(1990){}
data(int g,int m,int a) : giorno(g),mese(m),anno(a){
if(!controlla_data()){
giorno = 1;
mese = 1;
anno = 1990; }}
bool controlla_data();
bool cambia_data(data &x);
bool cambia_data(int,int,int);
bool is_bisestile();
bool operator<(data &x);
bool operator>(data &x);
bool operator==(data &x);
friend ostream& operator<<(ostream &os,data &x){
os << x.giorno << "/";
os << x.mese << "/";
os << x.anno;
return os; }
};
bool data::controlla_data(){
//controlli semplici
if(giorno > 31 || giorno < 0 ||
mese > 12 || mese < 0 ||
anno > 2005 || anno < 1990)
return false;
//controllo mesi con 30gg
if(mese == 4 && giorno > 30 ||
mese == 6 && giorno > 30 ||
mese == 9 && giorno > 30 ||
mese == 11 && giorno > 30)
return false;
//controllo di febbraio
if(mese == 2 && is_bisestile() && giorno > 29 || mese == 2 && is_bisestile() == false && giorno > 28)
return false;
//terminati tutti i controlli
return true; }
bool data::is_bisestile(){
return (anno % 100 != 0 && anno %4 == 0 || anno % 100 == 0 && anno % 400 == 0) ? true : false; }
bool data::cambia_data(data &x){
if(x.controlla_data()){
giorno = x.giorno;
mese = x.mese;
anno = x.anno;
return true; }
else
return false; }
bool data::cambia_data(int g,int m,int a){
data tmp(g,m,a);
if(tmp.controlla_data()){
giorno = g;
mese = m;
anno = a;
return true; }
else
return false; }
bool data::operator<(data &x){
if(anno < x.anno)
return true;
else if(anno > x.anno)
return false;
else if(mese < x.mese)
return true;
else if(mese > x.mese)
return false;
else if(giorno < x.giorno)
return true;
else if(giorno > x.giorno)
return false;
//sono uguali
return false; }
bool data::operator>(data &x){
if(operator<(x) == true)
return false;
else if(anno > x.anno)
return true;
else if(mese > x.mese)
return true;
else if(giorno > x.giorno)
return true;
//sono uguali
else
return false; }
bool data::operator==(data &x){
if(operator<(x) || operator>(x) )
return false;
else
return true; }
class persona {
private:
string nome;
string cognome;
data data_di_nascita;
public:
persona(string nom,string con,int g,int m,int a) : nome(nom),cognome(con),data_di_nascita(g,m,a){ }
persona(string nom,string con,data &x) : nome(nom),cognome(con),data_di_nascita(x){ }
string get_nome();
string get_cognome();
data& get_data();
void set_nome(string a);
void set_cognome(string a);
void set_data(data &a);
void set_data(int g,int m,int a);
bool operator<(persona &x);
bool operator>(persona &x);
bool operator==(persona &x);
friend ostream& operator<<(ostream& os,persona &x){
os << "nome: " << x.nome << endl;
os << "cognome: " << x.cognome << endl;
os << "data di nascita: " << x.data_di_nascita << endl;
return os; }
};
string persona::get_nome()
{ return nome; }
string persona::get_cognome()
{ return cognome; }
data& persona::get_data()
{ return data_di_nascita; }
void persona::set_nome(string a)
{ nome = a; }
void persona::set_cognome(string a){ cognome = a; }
void persona::set_data(data &a){
data_di_nascita.cambia_data(a); }
void persona::set_data(int g,int m,int a){
data_di_nascita.cambia_data(g,m,a); }
bool persona::operator<(persona &x){ return (data_di_nascita > x.data_di_nascita ) ? true : false; }
bool persona::operator>(persona &x){
return (data_di_nascita < x.data_di_nascita ) ? true : false; }
bool persona::operator==(persona &x){
return (data_di_nascita == x.data_di_nascita) ? true : false; }
class studente : public persona {
private:
int matricola;
public:
studente(string n,string c,int mat,data &x) : matricola(mat),persona(n,c,x){ }
studente(string n,string c,int mat,int gio,int mes,int ann) : matricola(mat),persona(n,c,gio,mes,ann){ }
int get_matricola();
void set_matricola(int x);
};
int studente::get_matricola(){
return matricola; }
void studente::set_matricola(int x){
matricola = x; }
int main(){
persona uno("marco","tolino",5,12,1994);
data a(5,8,2001);
data b(3,5,1998);
cout << uno.get_nome() << endl;
cout << uno.get_cognome() << endl;
cout << uno.get_data() << endl;
uno.set_nome("luca");
uno.set_cognome("biola");
uno.set_data(a);
cout << uno.get_nome() << endl;
cout << uno.get_cognome() << endl;
cout << uno.get_data() << endl;
uno.set_data(9,12,1997);
cout << uno.get_data() << endl;
persona due("luigi","mino",3,5,1997);
if(uno < due )
cout << uno.get_nome() << " è più giovane di " << due.get_nome() << endl;
else
cout << uno.get_nome() << " NON è più giovane di " << due.get_nome() << endl;
if(uno > due )
cout << uno.get_nome() << " è più vecchio di " << due.get_nome() << endl;
else
cout << uno.get_nome() << " NON è più vecchio di " << due.get_nome() << endl;
if(uno == due )
cout << uno.get_nome() << " è coetaneo di " << due.get_nome() << endl;
else
cout << uno.get_nome() << " NON coetaneo di " << due.get_nome() << endl;
studente A_1("pippo","vecci",5779,b);
cout << A_1 << endl;
studente A_2("giancarlo","poli",9982,7,2,2001);
cout << A_2 << endl;
}
Subito ti dico che la classe data non funziona, tutti le persone che vengono creati hanno come data di nascita il 1/1/1990. Oltre a questo logicamente funziona tutto, il problema più grande è lo stile di codice che hai usato.
1)
if(anno < x.anno)
return true;
else if(anno > x.anno)
return false;
else if(mese < x.mese)
return true;
else if(mese > x.mese)
return false;
else if(giorno < x.giorno)
return true;
else if(giorno > x.giorno)
return false;
Lo sappiamo tutti che la prima riga dopo l'if viene considerata parte dell'if però ciò non significa che è una buona idea scrivere codice del genere
if(true)
if(true)
if(true)
for(auto i=0;i!=5;++i)
cout<<i<<"\n";
2 Le funzioni con {} cosi
int studente::get_matricola(){
return matricola; }
sono difficili da leggere
3) Questo è un antipattern
bool data::operator==(data &x){
if(operator<(x) || operator>(x) )
return false;
else
return true; }
Meglio scriverlo cosi
bool data::operator==(data &x)
{
if(operator<(x) || operator>(x) )
{
return false;
}
return true;
}
4) Indenta il tuo codice sempre,è difficile legge codice scritto cosi
data(int g,int m,int a) : giorno(g),mese(m),anno(a){
if(!controlla_data()){
giorno = 1;
mese = 1;
anno = 1990; }}
5) I membri della classe derivata vengo inizializzati sempre dopo quelli della classe base, ti consiglierei di rivedere questo concetto, nella classe studente cerchi di inizializzare prima matricola, però viene inizializzata per ultima anche se l'hai scritta per prima nella member initializer list
6) Quando compili compila con più warning possibili, per esempio per l'ultimo punto viene generato un warning quindi puoi identificarlo senza l'aiuto di nessuno.
Comunque ti consiglierei di leggere
https://www.amazon.it/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882