Aiuto programma c++

di il
16 risposte

Aiuto programma c++

Questo è il testo,premetto che mi sono fermato al terzo punto.
Allora ho forti perplessità proprio sul terzo punto il resto credo di averlo fatto se non bene almeno in maniera decente, prima però di continuare vorrei capire se sto ragionando in modo giusto, mi dareste un parere ? gazie
<------- TESTO

Ps.
Spero di essermi attenuto alla regole del forum

#include<iostream>
#include<string>

using namespace std;

class persona{
	public:
		int anno_nascita;
		string nome;
		string cognome;
		
		persona(){
			nome="";
			cognome="";
		}
		persona(string Nome,string Cognome){
			
			nome=Nome;
			cognome=Cognome;
		}
	
	void setNome(){
		cout<<"inserire nome"<<endl;
		cin>>nome;
	
	
	}
	void setCognome(){
		cout<<"inserire cognome"<<endl;
		cin>>cognome;
	}
	
	void setAnno(){
		cout<<"inserire data di nascita"<<endl;
		cin>>anno_nascita;
	}
	
	
	void getNome(){
		cout<<"nome : "<<nome<<endl;
		
	}
	
	void getCognome(){
		cout<<" cognome : "<<cognome<<endl;
		
	}
	
	void getAnno(){
		cout<<"Anno di nascita : "<<anno_nascita<<endl;
	}
};

class studente:public persona{
	
	public:
		int matricola;
		studente(){
			matricola=0000;
		}
		studente(int m_matricola){
			m_matricola=matricola;
		}
		
		void setMatricola(){
			cout<<"digita la matricola"<<endl;
			cin>>matricola;
		}
		void getMatricola(){
			cout<<"la matricola è :"<<matricola<<endl;
		}

     
};

class complex{
	private:
		float imm_part;
		float real_part;
	public:
		complex(const complex &);
		complex(){
			imm_part=0;
			real_part=0;
		}
		complex(float real, float imm){
			real=real_part;
			imm=imm_part;
		}
		
		void setReal(){
			cout<<"setta la parte reale "<<endl;
			cin>>real_part;
		}
		void setImm(){
			cout<<"setta la parte immaginaria"<<endl;
			cin>>imm_part;
		}
		void friend setReal();
		void friend getReal();
		void friend setImm();
		void friend getImm();
		
		void Stampadati(){
			cout<<"il numero complesso è :"<<real_part<<" + "<<imm_part<<"j"<<endl;
		}
		
};

int main(){
		
	complex t;
	t.setReal();
	t.setImm();
	t.Stampadati();
	
}

16 Risposte

  • Re: Aiuto programma c++

    Guarda, a me basta leggere "progettare una classe...usando la classe progettata al punto precedente..." per capire che, chiunque abbia dato quel testo, ha qualche lacuna teorico-pratica molto grave.
    oppure è un ingegnere (con anche lacune teorico-pratiche)

    tornando al punto: cosa ti turba di preciso?
  • Re: Aiuto programma c++

    +m2+ ha scritto:


    Guarda, a me basta leggere "progettare una classe...usando la classe progettata al punto precedente..." per capire che, chiunque abbia dato quel testo, ha qualche lacuna teorico-pratica molto grave.
    oppure è un ingegnere (con anche lacune teorico-pratiche)

    tornando al punto: cosa ti turba di preciso?
    Allora, se tu mi dici che i primi 2 punti sono svolti in modo decente almeno per quello che chiede la traccia sono contento.
    Mi preoccupa il punto 3, chiede questa classe che tratti i numeri complessi ma per come la traccia parla e per come ho definito io la cosa non mi pare di aver fatto un overloading, ho semplicemente messo ue variabili e poi stampato a schermo una j vicino.Poi ho forti dubbi sul costruttore di copia, e sulle funzioni membro friend, in particolare :
    Ha senso mettere una funzione membro friend se la variabili dichiarate sono pubbliche ?

    Comunque quello che ha redatto il testo è un ingegnere, per mia fortuna
  • Re: Aiuto programma c++

    Marco1234 ha scritto:


    Comunque quello che ha redatto il testo è un ingegnere, per mia fortuna
    Riconosco i dilettanti da lontano

    I primi due punti non li ho neppure guardati, e neanche il terzo.
    Mi stai chiedendo di correggere gli errori, o ti "impararti" qualcosa?
    Formula una domanda alla volta un po' più precisa di "decente"

    Chiedi, e ti sarà dato (ma non ora, vado a casa)
  • Re: Aiuto programma c++

    +m2+ ha scritto:


    Marco1234 ha scritto:


    Comunque quello che ha redatto il testo è un ingegnere, per mia fortuna
    Riconosco i dilettanti da lontano

    I primi due punti non li ho neppure guardati, e neanche il terzo.
    Mi stai chiedendo di correggere gli errori, o ti "impararti" qualcosa?
    Formula una domanda alla volta un po' più precisa di "decente"

    Chiedi, e ti sarà dato (ma non ora, vado a casa)
    i primi due punti del testo chiedono di creare una classe con relativi metodi set e get e bla bla.... quello che ho scritto io è giusto ? Voglio sapere se sono sulla strada giusto, se il testo mi chiede di scrivere A, io sto scrivendo qualcosa di vicino ad A ? oppure sono a Z ?
    Mi interessa capire se sto studiando in modo corretto!!!!
  • Re: Aiuto programma c++

    La traccia ti chiede di implementare i metodi per leggere e modificare le variabili della classe. Da ciò puoi capire prima di tutto che le variabili non devono essere public, inoltre i setter e i getter che hai implementato non ti consentono un controllo completo delle variabili, perché posso settare il nome solo da tastiera? Perché lo posso leggere solo a schermo? Se per esempio volessi leggere la data di nascita di una persona e confrontarla con un'altra data?
  • Re: Aiuto programma c++

    Tonmu ha scritto:


    La traccia ti chiede di implementare i metodi per leggere e modificare le variabili della classe. Da ciò puoi capire prima di tutto che le variabili non devono essere public, inoltre i setter e i getter che hai implementato non ti consentono un controllo completo delle variabili, perché posso settare il nome solo da tastiera? Perché lo posso leggere solo a schermo? Se per esempio volessi leggere la data di nascita di una persona e confrontarla con un'altra data?
    Ho riscritto tutto il codice e credo che cosi sia meglio, ho passato i parametri dal main e nel complesso cedo vada bene.
    C'e solo una cosa che proprio non va, il metodo amico che inizializza la parte reale come si implementa?, ho capito che va dichiarato friend nella classe ma poi va implementato fuori, come devo fare ?
    #include<iostream>
    #include<string>
    #include<cstdlib>
    
    using namespace std;
    
    class persona{
    	private:
    		int anno;
    		string nome;
    		string cognome;
    	public:
    		persona(){
    			nome="";
    			cognome="";
    			anno=0000;
    		}
    		persona(string n_nome,string m_cognome){
    			nome=n_nome;
    			cognome=m_cognome;
    		}
    		
    		void setNome(string n_nome){
    			nome=n_nome;
    			
    			
    		}
    		void setCognome(string m_cognome){
    			cognome=m_cognome;
    			
    			
    		}
    		void setAnno(int Anno){
    			anno=Anno;
    			
    		}
    		string getNome(){
    			return nome;
    		}
    		string getCognome(){
    			return cognome;
    		}
    		int getAnno(){
    			return anno;
    		}
    };
    
    class studente : public persona{
    	
    	
    	public:
    		int matricola;
    		studente(){
    			matricola=0000;
    		}
    		studente(int m_matricola){
    			matricola=m_matricola;
    		}
    		void setMatricola(int m_matricola){
    			matricola=m_matricola;
    			
    		}
    		int getMatricola(){
    			return matricola;
    		}
    };
    class complex{
    	private: 
    	float parteRe;
    	float parteImm;
    	public:
    		complex(){
    			parteRe=0;
    			parteImm=0;
    		}
    		complex(float r,float i){
    			parteRe=r;
    			parteImm=i;
    		}
    		complex(const complex&);
    		void setReal(float r){
    			parteRe=r;
    		}
    		void setImm(float i){
    			parteImm=i;
    		}
    		float getReal(){
    			return parteRe;
    		}
    		float getImm(){
    			return parteImm;
    		}
    		 friend void setReal(complex g);
    };
    
    void setReal(complex g){
    	g.parteRe=0;
    	
    }
    	
    	
    
    int main(){
    	
    	
    	studente t[2];
    	t[0].setNome("carlo");
    	t[0].setCognome("russo");
    	t[0].setAnno(1995);
    	t[0].setMatricola(4256);
        complex f;
        f.setReal(4.5);
        f.setImm(6.7);
        cout<<f.getReal()<<"+"<<f.getImm()<<"j"<<endl;
        
    
    	
    	cout<<"il nome dello studente : "<<t[0].getNome()<<endl;
    	cout<<"il cognome dello studente : "<<t[0].getCognome()<<endl;
    	cout<<"l'anno di nascita dello studente : "<<t[0].getAnno()<<endl;
    	cout<<"la matricola dello studente : "<<t[0].getMatricola()<<endl;
    	
    }
    
  • Re: Aiuto programma c++

    L'implementazione va bene, però ricorda che non è un metodo ma una funzione, quindi devi passare i parametri per riferimento.

    Comunque non hai implementato il costruttore di copia.
  • Re: Aiuto programma c++

    Così en passant rammento che gli interi java sono sempre signed, quindi il valore di default 0 non è proprio il massimo della vita
  • Re: Aiuto programma c++

    Tonmu ha scritto:


    L'implementazione va bene, però ricorda che non è un metodo ma una funzione, quindi devi passare i parametri per riferimento.

    Comunque non hai implementato il costruttore di copia.
    Non ho capito come passare i parametri alla funzione firend, io devo passare l'indirizzo del valore che voglio impostare alla variabile realpart?
    Non ho capito...
    		
    class complex{
    	public:
    		float realpart;
    		float impart;
    	
    		complex(const complex&);
    		complex(){
    			realpart=0;
    			impart=0;
    		}
    		complex(float r,float i){
    			realpart=r;
    			impart=i;
    		}
    		void setReal(float r){
    			realpart=r;
    		}
    		void setIm(float i){
    			impart=i;
    		}
    		float getRe(){
    			return realpart;
    		}
    		float getIm(){
    			return impart;
    		}
    		friend void setReal(complex, float r);
    };
    void setReal(complex g){
    	float r=10;
    	float *ptr=&r;
    	g.realpart=*ptr;
    	
    	
  • Re: Aiuto programma c++

    No, il numero complesso (complex) deve essere passato per riferimento.
  • Re: Aiuto programma c++

    Ok, perfetto.
    Ho riscritto il codice per l'ultimo punto credo possa andare ma non so.
    int main(){
    	complex s1[3];
    	
    	complex temp;
    	
        s1[0].setReal(30),s1[0].setIm(3); //primo numero
        s1[1].setReal(48),s1[1].setIm(3); // secondo numero
        s1[2].setReal(50),s1[2].setIm(1); // terzo numero
       
        int i, j;
    	
    	for (i=0; i<3; i++)
    	{
    		for( j=i+1; j<3 ; j++)
    		{ 
    			if (s1[i].getRe() < s1[j].getRe() ) 
    			  temp = s1[i];
    			  s1[i]=s1[j];
                              s1[j]=temp;
                            }
    		}
    		
    		for(i=0; i<3; i++) 
    	{
    		cout<<s1[i].getRe()<<"+"<<s1[i].getIm()<<"j"<<endl;
    	
    	}
    }
    Voi che dite funziona come cosa ?
  • Re: Aiuto programma c++

    Marco1234 ha scritto:


    Ok, perfetto.
    Ho riscritto il codice per l'ultimo punto credo possa andare ma non so.
    int main(){
    	complex s1[3];
    	
    	complex temp;
    	
        s1[0].setReal(30),s1[0].setIm(3); //primo numero
        s1[1].setReal(48),s1[1].setIm(3); // secondo numero
        s1[2].setReal(50),s1[2].setIm(1); // terzo numero
       
        int i, j;
    	
    	for (i=0; i<3; i++)
    	{
    		for( j=i+1; j<3 ; j++)
    		{ 
    			if (s1[i].getRe() < s1[j].getRe() ) 
    			  temp = s1[i];
    			  s1[i]=s1[j];
                              s1[j]=temp;
                            }
    		}
    		
    		for(i=0; i<3; i++) 
    	{
    		cout<<s1[i].getRe()<<"+"<<s1[i].getIm()<<"j"<<endl;
    	
    	}
    }
    Voi che dite funziona come cosa ?
    Guarda che stai ordinando in modo decrescente, oltre a questo va tutto bene. Comunque personalmente ci sono alcune cose che io personalmente cambierei.
    1) I valori iniziali dei numeri gli puoi inizializzare cosi complex s1[3]={{30.0f,3.0f},{48.0f,3.0f},{50.0f,1.0f}},visto che hai fatto il c-tor che accetta float float ;
    2) Gli int i e j che usi per cicli for non devono stare fuori dai cicli
    3) La variabile temp non ha senso che sia dichiarata fuori dall'if all'interno del secondo ciclo for
    4) Per il cout all'interno del terzo circlo è meglio fare il overload dell'operatore <<
    5) Il numero tre che hai usato nei cicli puoi metterlo in una variabile cosi diventa più leggibile
  • Re: Aiuto programma c++

    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;
    }
    
    
    
    
  • Re: Aiuto programma c++

    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
Devi accedere o registrarti per scrivere nel forum
16 risposte