Esercizio sulle classi (liste, ereditarietà, ecc)

di il
4 risposte

Esercizio sulle classi (liste, ereditarietà, ecc)

Siano date le seguenti intestazioni:
class ComponenteCucina
 {
 private:
  string marca;
  int qualita;
  TipoComponente tipo;
  double costo;
public:
  ComponenteCucina( string=””,
     string=””, tipo=nessuno,    
     costo=0;
  bool operator==(const
                ComponenteCucina &);

  string getMarca() const;
  void setMarca(string); 
   
... //tutti i getters and setters
}
class Cucina
{
private:
 list<ComponenteCucina> comp;
 double sconto_percentuale;

public:
 bool verificaCompatibilita();
 bool aggiungiComponente( 
              ComponenteCucina);
 double prezzo();
 double qualita(); 
 string getNomeAcquirente();
...
}

enum TipoComponente {nessuno = 0, forno, lavello, cappa, frigo}
      
Supponendo che tutti i metodi sopra elencati tranne quelli indicatio in grassetto siano implementati:

1. Implementare, il metodo double prezzo() della classe Cucina. In particolare, il prezzo di una cucina si ottiene sommando il prezzo di tutti i suoi componenti (prezzo di listino) e applicando lo sconto
double Cucina::prezzo()
	{
	double prezzo=0;
	list<ComponenteCucina>::iterator it;
	for(it=comp.begin(); it!=comp.end(); it++)
		prezzo+=(*it).getCosto();
	return (prezzo*getScontoPercentuale())/100)	
	}
2.Implementare, il metodo double qualita() della classe Cucina. In particolare, la qualità di una cucina è data dalla media della qualità dei suoi componenti.
double Cucina::qualita()
	{
	double totQualita=0;
	list<ComponenteCucina>::iterator it;
	for(it=comp.begin(); it!=comp.end(); it++)
		totQualita+=(*it).getQualita();
	return totQualita/comp.size();
	}
3. Utilizzare l’ereditarietà per realizzare l’interfaccia della classe ElencoCucineOrdinatePerRapportoQualitaPrezzo che implementa una lista ordinata di cucine in cui gli elementi a miglior rapporto qualità prezzo sono inseriti in ordine decrescente dalla testa verso la coda della lista.
class ElencoCucineOrdinatePerRapportoQualitaPrezzo : public vector<Cucina>
	{
	public:	
			ElencoCucineOrdinatePerRapportoQualitaPrezzo()
				{
				ordina(elenco);
				}

			ordina(vector<Cucina>&)
				{
				Cucina temp;
				for(int i=0; i<elenco.size()-1; i++)
					for(int j=0; j<elenco.size()-1; j++)
						if(rapporto(elenco[i])<rapporto(elenco[j])
							{
							temp=elenco[i];
							elenco[i]=elenco[j];
							elenco[j]=temp;
							}	
				}

			double rapporto(Cucina&)
				{
				return getQualita()/getCosto()
				}
	private:
			vector<Cucina> elenco;	
	}
4.Implementare, almeno un metodo tra push_back(Cucina) e push_front(Cucina) della lista.


Sareste così gentili da dirmi se questo esercizio l ho fatto bene? E' uno dei miei primi esercizi sulle classi, quindi non me ne vogliate se ci sono errori.. non sono riuscito a fare il punto 4.. qualcuno sarebbe così gentile da spiegarmi come fare? grazie in anticipo.. Saluti..

4 Risposte

  • Re: Esercizio sulle classi (liste, ereditarietà, ecc)

    Utilizzare l’ereditarietà per realizzare l’interfaccia della classe ElencoCucineOrdinatePerRapportoQualitaPrezzo che implementa una lista ordinata di cucine
    Io vedo un vector non una list. Poi se fai uso di STL l'ordinamento lo puoi fare con std::sort nel caso del vettore oppure list.sort nel caso della lista.

    Ma tutte ste classi che hai elencato sono almeno compilabili? A me non sembra. Il punto 4 viene da se. Una std::list ha già push_back e push_front quindi non capisco la domanda. l'operatore == non è stato sviluppato, insomma hai molte mancanze nel codice per capire cosa vuoi fare.
  • Re: Esercizio sulle classi (liste, ereditarietà, ecc)

    Ah già... mi sa che dovevo implementare con una list.. sorry mi spiegheresti perfavore la funzione sort per effettuare l ordinamento? spero avrai tenuto conto che non è una semplice lista di numeri e quindi l ordinamento va fatto sul rapporto qualita/prezzo (per questo non riesco a cpaire come si usa questa funzione).. saresti così gentile da spiegarmelo? al punto 4 bisogna fare proprio quello che c'è scritto.. implementare uno dei metodi.. so che ci sono gia nelle list, ma evidentemente il prof vuole capire se gli studenti hanno appreso bene il comportamento di questi metodi.. un ultima domanda.. perchè avrei dovuto ridefinire l operatore == se nn l ho proprio usato? comunque grazie tante già per avermi dato retta...
  • Re: Esercizio sulle classi (liste, ereditarietà, ecc)

    Guarda sto piccolo esempio:
    
    #include<iostream>
    #include <list>
    
    
    class test
    {
    public:
    	test() : val(0){};
    	bool operator <(const test & rhs)
    	{
    		return val < rhs.val;
    	}
    	int val;
    };
    
    int main()
    {
    	std::list<test> lista;
    	
    	test test1;
    	lista.push_back(test1);
    
    	test test2;
    	test2.val = 1;
    
    	lista.push_front(test2);
    	lista.sort();
    }
    
    l'operatore < (less than) fa si che una classe abbia un operatore di confronto. Quando questa classe viene inserita in una lista e viene chiamato list.sort, la funzione sort cerca nella classe a definizione del operatore < per sapere l'ordine di inserimento delle strutture. La stessa cosa devi fare tu con la tua classe.
  • Re: Esercizio sulle classi (liste, ereditarietà, ecc)

    Perfetto.. ho capito come procedere ed ora ci provo... veramente gentile, grazie... alla prossima
Devi accedere o registrarti per scrivere nel forum
4 risposte