[C++] Programmino con classi/strutture

di il
4 risposte

[C++] Programmino con classi/strutture

Ciao a tutti, sto svolgendo questo tema di esame per esercitarmi:
traccialab.jpg
traccialab.jpg

E' richiesto lo svolgimento in 30 minuti con l'ambiente "microsoft visual c++".
Vi posto il codice che ho buttato giù, mi vengono però segnalati degli errori dopo l'inserimento delle informazioni richieste e credo dipenda soprattutto dalla funzione "ordina".
#include <iostream>
#include <string>
#define N 200
using namespace std;
struct data{
	int gg,mm,aa;
};
class animale{
	public:
	int codice;
	string descrizione, provenienza;
	data data_nascita;

	void get(int cod, string des, string prov, int gg, int mm, int aa){
		cod=codice;
		des=descrizione;
		prov=provenienza;
		gg=data_nascita.gg;
		mm=data_nascita.mm;
		aa=data_nascita.aa;
	}
	void set(int cod, string des, string prov, int gg, int mm, int aa){
		codice=cod;
		descrizione=des;
		provenienza=prov;
		data_nascita.gg=gg;
		data_nascita.mm=mm;
		data_nascita.aa=aa;
	}
};
class pecora:public animale{
	string tosata;
public:
	void get(int cod, string des, string prov, int gg, int mm, int aa, string tos){
		cod=codice;
		des=descrizione;
		prov=provenienza;
		gg=data_nascita.gg;
		mm=data_nascita.mm;
		aa=data_nascita.aa;
		tos=tosata;
	}
	void get(int cod, int gg, int mm, int aa){
		cod=codice;
		gg=data_nascita.gg;
		mm=data_nascita.mm;
		aa=data_nascita.aa;
	}
	void get(int gg, int mm, int aa){
		gg=data_nascita.gg;
		mm=data_nascita.mm;
		aa=data_nascita.aa;
	}
	void get(string tos){
		tos=tosata;
	}
	void set(int cod, string des, string prov, int gg, int mm, int aa, string tos){
		codice=cod;
		descrizione=des;
		provenienza=prov;
		data_nascita.gg=gg;
		data_nascita.mm=mm;
		data_nascita.aa=aa;
		tosata=tos;
	}
};
int controllodata(int gg, int mm, int aa){
	if(aa<2007 || aa>2011){
		return 0;
	}else if(aa==2007&&mm==03){
		if(gg<13){
			return 0;
		}else{
			return 1;
		}
	}else if(aa==2011&&mm==01){
		if(gg>6){
			return 0;
		}else{
			return 1;
		}
	}else if((aa==2007&&mm<03)||(aa==2011&&mm>01)){
		return 0;
	}else{
		return 1;
	}
}
void carica(pecora pec[N]){
	int cod; string des, prov; int gg, mm, aa; string tos;
	for(int i=0; i<N; i++){
		do{
			cout<<"Inserire codice, descrizione, provenienza, data nascita (gg mm aaaa), tosata (SI o NO): ";
			cin>>cod>>des>>prov>>gg>>mm>>aa>>tos;
			pec[i].set(cod,des,prov,gg,mm,aa,tos);
				if(controllodata(gg,mm,aa) == 0){
				cout<<"Reinserire";
			}
		}while(controllodata(gg,mm,aa) == 0);
	}
}
void swap(pecora &pec1, pecora &pec2){
	pecora temp;
	temp=pec1;
	pec1=pec2;
	pec2=temp;
}
void ordina(pecora pec[N]){
	bool swapped;
	int gg,mm,aa,gg1,mm1,aa1;
	do{
		swapped=false;
		for(int i=0; i<N-1; i++){
			pec[i].get(gg,mm,aa);
			pec[i+1].get(gg1,mm1,aa1);
			if(aa > aa1){
				swap(pec[i], pec[i+1]);
				swapped=true;
			}else if((aa == aa1) && (mm > mm1)){
				swap(pec[i], pec[i+1]);
				swapped=true;
			}else if((aa == aa1) && (mm == mm1) && (gg > gg1)){
				swap(pec[i],pec[i+1]);
				swapped=true;
			}
		}
		}while(swapped);
	}

int main(){
	pecora pecor[N];
	carica(pecor);
	ordina(pecor);
	int conta=0;
	int codice;
	int gg, mm, aa;
	string tosata;
	for(int i=N; i>0; i--){
		do{
			pecor[i].get(tosata);
		if(tosata == "SI"){
			conta++;
			pecor[i].get(codice,gg,mm,aa);
			cout<<codice<<gg<<mm<<aa;
		}
		}while(conta < 15);
	}
	system("pause");
}
Potreste dirmi dove ho sbagliato e soprattutto darmi delle indicazioni per ridurre il codice in modo da rientrare nei 30 minuti richiesti?
Sicuramente ho scritto codice superfluo sintetizzabile in molte meno righe...
Grazie mille

4 Risposte

  • Re: [C++] Programmino con classi/strutture

    Le get() non hanno senso come le hai scritte: devi usare i reference nei parametri formali, altrimenti non hai nulla in uscita.
    
    // Es.
       void get(int& cod, string& des, string& prov, int& gg, int& mm, int& aa){
          cod=codice;
          des=descrizione;
          prov=provenienza;
          gg=data_nascita.gg;
          mm=data_nascita.mm;
          aa=data_nascita.aa;
       }
    
    
    La swap() puoi evitarla e usare direttamente std::swap() della libreria standard.

    In carica() l'inserimento devi farlo dopo aver superato il test della data, altrimenti si inserirebbero dati non conformi.
    
    ...
             cin>>cod>>des>>prov>>gg>>mm>>aa>>tos;
             pec[i].set(cod,des,prov,gg,mm,aa,tos);
                if(controllodata(gg,mm,aa) == 0){
                cout<<"Reinserire";
             }
    
    /* corretto 
                if(controllodata(gg,mm,aa) != 0){
                    pec[i].set(cod,des,prov,gg,mm,aa,tos);
                } else {
                  cout<<"Reinserire";
             }
    */
    ...
    
    Nel main:
    
       for(int i=N; i>0; i--) { /* for(int i=N; i>=0; i--) */
          do{
             pecor[i].get(tosata);
          if(tosata == "SI"){
    
    
    Altrimenti non ottieni la locazione 0 dell'array.
  • Re: [C++] Programmino con classi/strutture

    Grazie mille, ho corretto con le tue indicazioni (ho notato inoltre che nel main avevo sbagliato nel do-while perchè rimaneva sullo stesso elemento i finchè conta non raggiungeva 15, elencandomelo 15 volte) ed ora è tutto ok
    #include <iostream>
    #include <string>
    #define N 5
    using namespace std;
    struct data{
    	int gg,mm,aa;
    };
    class animale{
    protected:
    	int codice;
    	string descrizione, provenienza;
    	data data_nascita;
    public:
    	void set(int cod, string des, string prov, int gg, int mm, int aa){
    		codice=cod;
    		descrizione=des;
    		provenienza=prov;
    		data_nascita.gg=gg;
    		data_nascita.mm=mm;
    		data_nascita.aa=aa;
    	}
    	void get(int& cod, string& des, string& prov, int& gg, int& mm, int& aa){
    		cod=codice;
    		des=descrizione;
    		prov=provenienza;
    		gg=data_nascita.gg;
    		mm=data_nascita.mm;
    		aa=data_nascita.aa;
    	}
    
    };
    class pecora:public animale{
    	string tosata;
    public:
    	void set(int cod, string des, string prov, int gg, int mm, int aa, string tos){
    		codice=cod;
    		descrizione=des;
    		provenienza=prov;
    		data_nascita.gg=gg;
    		data_nascita.mm=mm;
    		data_nascita.aa=aa;
    		tosata=tos;
    	}
    	void get(int& cod, string& des, string& prov, int& gg, int& mm, int& aa, string& tos){
    		cod=codice;
    		des=descrizione;
    		prov=provenienza;
    		gg=data_nascita.gg;
    		mm=data_nascita.mm;
    		aa=data_nascita.aa;
    		tos=tosata;
    	}
    	void get(int& cod, int& gg, int& mm, int& aa){
    		cod=codice;
    		gg=data_nascita.gg;
    		mm=data_nascita.mm;
    		aa=data_nascita.aa;
    	}
    	void get(int& gg, int& mm, int& aa){
    		gg=data_nascita.gg;
    		mm=data_nascita.mm;
    		aa=data_nascita.aa;
    	}
    	void get(string& tos){
    		tos=tosata;
    	}
    };
    int controllodata(int gg, int mm, int aa){
    	if(aa<2007 || aa>2011){
    		return 0;
    	}else if(aa==2007&&mm==03){
    		if(gg<13){
    			return 0;
    		}else{
    			return 1;
    		}
    	}else if(aa==2011&&mm==01){
    		if(gg>6){
    			return 0;
    		}else{
    			return 1;
    		}
    	}else if((aa==2007&&mm<03)||(aa==2011&&mm>01)){
    		return 0;
    	}else{
    		return 1;
    	}
    }
    void carica(pecora pec[N]){
    	int cod; string des, prov; int gg, mm, aa; string tos;
    	for(int i=0; i<N; i++){
    		do{
    			cout<<"Inserire codice, descrizione, provenienza, data nascita (gg mm aaaa), tosata (SI o NO): ";
    			cin>>cod>>des>>prov>>gg>>mm>>aa>>tos;
                if(controllodata(gg,mm,aa) != 0){
                    pec[i].set(cod,des,prov,gg,mm,aa,tos);
                } else {
                  cout<<"Reinserire";
             }
    		}while(controllodata(gg,mm,aa) == 0);
    	}
    }
    void ordina(pecora pec[N]){
    	bool swapped;
    	int gg,mm,aa,gg1,mm1,aa1;
    	do{
    		swapped=false;
    		for(int i=0; i<N-1; i++){
    			pec[i].get(gg,mm,aa);
    			pec[i+1].get(gg1,mm1,aa1);
    			if(aa > aa1){
    				swap(pec[i], pec[i+1]);
    				swapped=true;
    			}else if((aa == aa1) && (mm > mm1)){
    				swap(pec[i], pec[i+1]);
    				swapped=true;
    			}else if((aa == aa1) && (mm == mm1) && (gg > gg1)){
    				swap(pec[i],pec[i+1]);
    				swapped=true;
    			}
    		}
    		}while(swapped);
    	}
    
    int main(){
    	pecora pecor[N];
    	carica(pecor);
    	ordina(pecor);
    	
    	int codice;
    	int gg, mm, aa;
    	string tosata;
    	int i=N;
    	int conta=0;
    		do{
    			i--;
    			pecor[i].get(tosata);
    		if(tosata == "SI"){
    			conta++;
    			pecor[i].get(codice,gg,mm,aa);
    			cout<<"\n"<<codice<<" "<<gg<<"/"<<mm<<"/"<<aa;
    		}
    		
    		}while(conta < 3 || i == 0);
    
    
    	system("pause");
    }
    Forse posso risparmiare ancora codice usando un solo if nella funzione ordina, invece degli else if, mettendo tutte le condizioni in or.
    Grazie ancora, alla prossima.
  • Re: [C++] Programmino con classi/strutture

    Se non hai problemi a creare una dipendenza esplicita puoi risparmiare parecchio codice così:
    
    
    void animale::set(int cod, string des, string prov, int gg, int mm, int aa){
          codice=cod;
          descrizione=des;
          provenienza=prov;
          data_nascita.gg=gg;
          data_nascita.mm=mm;
          data_nascita.aa=aa;
       }
    
    void pecora::set(int cod, string des, string prov, int gg, int mm, int aa, string tos){
    /*
          codice=cod;
          descrizione=des;
          provenienza=prov;
          data_nascita.gg=gg;
          data_nascita.mm=mm;
          data_nascita.aa=aa;
    */
          animale::set(cod,des,prov,gg,mm,aa);
          tosata=tos;
       }
    
    void animale::get(int& cod, string& des, string& prov, int& gg, int& mm, int& aa){
          cod=codice;
          des=descrizione;
          prov=provenienza;
          gg=data_nascita.gg;
          mm=data_nascita.mm;
          aa=data_nascita.aa;
       }
    
    void pecora::get(int& cod, string& des, string& prov, int& gg, int& mm, int& aa, string& tos){
    /*
          cod=codice;
          des=descrizione;
          prov=provenienza;
          gg=data_nascita.gg;
          mm=data_nascita.mm;
          aa=data_nascita.aa;
    */
          animale::get(cod,des,prov,gg,mm,aa);
          tos=tosata;
       }
    
    
    Ecc.
    In altre parole eviti inutili ripetizioni di codice.
  • Re: [C++] Programmino con classi/strutture

    Ah perfetto, ottima indicazione!
Devi accedere o registrarti per scrivere nel forum
4 risposte