Esercizio istanziare più oggetti della stessa classe

di il
14 risposte

Esercizio istanziare più oggetti della stessa classe

Salve a tutti ho un problema con un programmino in c++, ed essendo alle prime armi vorrei chiedere a voi qualche dritta. L'esercizio richiede le seguenti cose:
In un garage multipiano sono presenti 1000 autoveicoli, caratterizzati da targa, modello, cognome_propriet, canone_mensile. Ogni autoveicolo è dotato di metodi get/set per gestire gli attributi privati. Implementare le seguenti funzioni:
1) Caricamento dei dati di tutti gli autoveicoli;
2)visualizzare la targa del veicolo che paga il canone piu alto;
3)Calcolare la percentuale che hanno un canone maggiore di 50€.
Utilizzare variabili locali.

-------il problema più grande sta nell'istanziare i 1000 autoveicoli. Io ho creato la classe ma ora non so come procedere. Grazie.

14 Risposte

  • Re: Esercizio istanziare più oggetti della stessa classe

    Ciao, se la tua classe si chiama Veicolo allora puoi semplicemente scrivere
    Veicolo mieiVeicoli[1000];
    cioè creare un array di oggetti di tipo Veicolo. Oppure puoi utilizzare un vector, o un altro container, anche se presumo che abbiate visto solo gli array.
  • Re: Esercizio istanziare più oggetti della stessa classe

    Sinceramente non abbiamo fatto neanche l'array di tipo veicolo. Potresti gentilmente illustrarmi la procedura fino al main ? Ti ringrazio vivamente
  • Re: Esercizio istanziare più oggetti della stessa classe

    lanotted ha scritto:


    Sinceramente non abbiamo fatto neanche l'array di tipo veicolo.
    Ma guarda che è un array normalissimo, solo che anziché essere di int o di char è di oggetti di tipo Veicolo. Per il resto si comporta come tutti gli altri array...
  • Re: Esercizio istanziare più oggetti della stessa classe

    Chiarissimo. Non avevo capito XD.La definizione e la sua valorizzazione la faccio nel main? Uso qualche funzione particolare. Scusate ma sono nuovo a queste cose.
  • Re: Esercizio istanziare più oggetti della stessa classe

    Questa è una tua scelta, e puoi fare in molti modi. Tieni però presente che non puoi utilizzare variabili globali (secondo il tuo testo), quindi puoi
    - creare l'array nel main e riempirlo nel main
    - creare l'array nel main e passarlo ad un'altra funzione affinché lo riempia
    - far creare l'array da una funzione, restituirlo al main e poi riempirlo nel main (tecnicamente possibile ma forse poco sensato)
    - far creare l'array e farlo riempire da un'altra funzione (o anche due separate, ma non ne vedo la necessità) e poi farlo restituire al main

    Vedi tu...
  • Re: Esercizio istanziare più oggetti della stessa classe

    Una volta creata la "lista" di tutti i miei 1000 oggetti come faccio a fare un controllo su di essi. Cioè se devo ordinare rispetto ad un attributo come posso fare ciò?
  • Re: Esercizio istanziare più oggetti della stessa classe

    In quel caso devi implementare un algoritmo di ordinamento (il più semplice, ma anche inefficiente, è bubble sort) e utilizzare uno degli attributi nel criterio di confronto. L'idea base è molto semplice: scorri il tuo vettore e se due elementi sono in ordine sbagliato allora li scambi. Per dire se l'ordine è giusto oppure sbagliato dovrai appunto fare riferimento a qualche attributo degli elementi.
  • Re: Esercizio istanziare più oggetti della stessa classe

    Questo l'ho capito ma vorrei capire qual'è l'algoritmo che devo implementare per scorrere il vettore di oggetti e selezionare solo l'attributo che mi serve per l'ordinamento. Cioè il campo su cui devo fare l'ordinamento come lo selezione se i miei oggetti sono in un vettore?
  • Re: Esercizio istanziare più oggetti della stessa classe

    Supponiamo che tu abbia
    Veicolo mieiVeicoli[1000];
    Allora puoi accedere ai campi degli oggetti con
    mieiVeicoli[indice].nomeCampo
  • Re: Esercizio istanziare più oggetti della stessa classe

    #include <iostream>
    #include <string>
    using namespace std;
    
    class automobile
    {
    private:
    		string targa;
    		string modello;
    		string cognome;
    		double canone;
    public:
    		automobile (string t, string m, string c, double k);
    	   
    		void set(string t, string m, string c, double k);
    		void get(string t);
    };
    
     automobile::automobile (string t, string m, string c, double k)
        {
    		targa=t;
    		modello=m;
    		cognome=c;
    		canone=k;
    	}
    
    void automobile::set(string t, string m, string c, double k)
    {
    	cout<<"inserisci targa:";
    	cin>>t>>"/n";
    	cout<<"inserisci modello:";
    	cin>>m>>"/n";
    	cout<<"inserisci cognome:";
    	cin>>c>>"/n";
    	cout<<"inserisci canone:";
    	cin>>k>>"/n";
    }
    void automobile::get(string t)
    {
    	cout<<"la targa è:"<<t<<endl;
    }
    
    int main()
    {
    	
    	automobile vetmac[3];
    
    mi da un errore sul vettore vetmac, dicendomi che non è definito alcun costruttore per la classe automobile. Quindi come si fa? io l'ho dichiarato .
  • Re: Esercizio istanziare più oggetti della stessa classe

    Il tuo costruttore è
    automobile (string t, string m, string c, double k);
    il che significa che ogni oggetto automobile, per essere costruito, ha bisogno di tre stringhe e un double. Quando tu crei il vettore, non gli dai nessun parametro..
  • Re: Esercizio istanziare più oggetti della stessa classe

    Ho un altro problema:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class automobile
    {
    private:
    		string t;
    		string m;
    		string c;
    		double k;
    
    public:
    		automobile ()
    			{
    				t="";
    				m="";
    				c="";
    				k=0;
    		}
    	   	void set(string t, string m, string c, double k);
    		void get(string t);
    		double 
    };
    
     /*automobile::automobile (string t, string m, string c, double k)
        {
    		targa=t;
    		modello=m;
    		cognome=c;
    		canone=k;
    	}*/
    
    void automobile::set(string t, string m, string c, double k)
    {
    	cout<<"inserisci targa:";
    	cin>>t;
    	cout<<"inserisci modello:";
    	cin>>m;
    	cout<<"inserisci cognome:";
    	cin>>c;
    	cout<<"inserisci canone:";
    	cin>>k;
    }
    void automobile::get(string t)
    {
    	cout<<"la targa è:"<<t<<endl;
    }
    
    int main()
    {
    	
    	automobile vet[3];
    	int i=0,j; 
    	string targa;
    	string ta;
    	string mo;
    	string co;
    	double ka=0;
    	double temp=0;
    	
    	for(i=0;i<3;i++)
    	{
    		vet[i].set(ta, mo, co, ka);
    		
    		/*if (ka>temp) 
    			{
                                  temp=ka;
    				targa=ta;
    		        j=i;
    		    }*/
    		 
    		
    	}
    	   vet[j].get(targa);
    
    	system ("pause");
    	return 0;
    }
    
    come si può notare gli attributi sono privati, quindi nel main non posso operare su di essi. Ora la domanda che faccio è: come faccio a implementare un metodo a cui passo la variabile ka e mi deve restituire la targa che ha ka maggiore? in pratica il secondo punto dell'esercizio.
  • Re: Esercizio istanziare più oggetti della stessa classe

    L'approccio standard è quello dei metodi getter, cioè metodi che ti restituiscono una copia della variabile privata alla quale vuoi accedere. Il metodo getter, che sarà ovviamente public, può poi essere richiamato da qualunque parte.
  • Re: Esercizio istanziare più oggetti della stessa classe

    #include <iostream>
    #include <string>
    
    
    
    using namespace std;
    
    class automobile
    {
    private:
    		string t;
    		string m;
    		string c;
    		double k;
    
    public:
    	
    		automobile ()
    			{
    				t="";
    				m="";
    				c="";
    				k=0;
    		}
    
    	   	void set(string ta,string mo, string ca, double ka);
    		void get(string& ta,string& mo, string& ca, double& ka);
    		 
    };
    
    void automobile::set(string ta, string mo, string ca, double ka)
    {
    	t=ta;
    	m=mo;
    	c=ca;
    	k=ka;
    	
    }
    void automobile::get(string& ta,string& mo, string& ca, double& ka)
    {
    	ta=t;
    	mo=m;
    	ca=c;
    	ka=k;
    }
    
    void caricamento(automobile v[]);
    void canone_max(automobile v[]);
    void perc_can(automobile v[]);
    
    int main()
    {
    	
    	automobile vet[3];
    	caricamento (vet);
        canone_max(vet);
        perc_can(vet);
    
    	system ("pause");
    	return 0;
    
    }
    
    void caricamento(automobile v[])
    {
    	
    	string targ;
    	string mode;
    	string cogno;
    	double canon;
    	int i;
    	for(i=0;i<3;i++)
    	  {
    	     cout<<"inserisci targa:";
    	     cin>>targ;
    	     cout<<"inserisci modello:";
    	     cin>>mode;
    	     cout<<"inserisci cognome:";
    	     cin>>cogno;	
    		 cout<<"inserisci canone:";
    	     cin>>canon;
    		 v[i].set(targ,mode,cogno,canon);
    	  }
    }
    
    void canone_max(automobile v[])
        {
    		string targ;
    	    string mode;
    	    string cogno;
    		string tempta;
    	    double canon;
    		double tempca=0;
    		int i=0;
    		for(i=0;i<3;i++)
    	  { 
    		v[i].get(targ,mode,cogno,canon);
    		   if(canon>tempca)
    		   {
    			   tempta=targ;
    		       tempca=canon;   
    		   }
    		   
    	  }
      cout<<"La targa che corrisponde al canone piu' alto e':"<<tempta<<endl;
    
       }
    
    void perc_can(automobile v[])
      {
    	   string targ;
    	    string mode;
    	    string cogno;
    		string tempta;
    	    double canon=0;
    		double perc;
    		double j=0;
    		int i=0;
    		for(i=0;i<3;i++)
    	  { 
    		v[i].get(targ,mode,cogno,canon);
    		   if(canon>50)
    			   j=j+1;
    	   }
        perc= (j/3)*100;
    	cout<<"la percentuale dei paganti di canone maggiore a 50 euro e':"<<perc<<endl;
    }
    
    questa è la soluzione. Grazie a tutti.
Devi accedere o registrarti per scrivere nel forum
14 risposte