#include using namespace std; class Studente { public: enum tipo { Neutrale, Scettico, Pettegolo }; // costruisco un studente con stato "neutrale" Studente(tipo stato = Studente::Neutrale) { _stato = stato ; } // interagisco on un altro studente void interagisci(Studente&) ; // cambio il mio stato e lo faccio diventare X void cambioStato(tipo nuovoStato) { _stato = nuovoStato; } // ritorno il mio stato tipo stato() const { return _stato; } private: // il mio stato tipo _stato; }; void Studente::interagisci(Studente& s ) { // io sono un pettegolo if (stato()==Pettegolo) { if (s.stato()==Neutrale) { // altro e' neutrale // diventa pettegolo s.cambioStato(Pettegolo); } else if (s.stato()==Pettegolo) { // altro e' pettegolo: // diventiamo scettici cambioStato(Scettico); s.cambioStato(Scettico); } else if (s.stato()==Scettico) { // altro e' scettico // divento scettico cambioStato(Scettico); } } else if (stato()==Scettico) { // io sono scettico if (s.stato()==Pettegolo) s.cambioStato(Scettico); } } class Popolazione { public: Popolazione(int N) { // costruisce N studenti di cui uno pettegolo _ilPopolo = new Studente[N]; _numStudenti = N; _ilPopolo[0].cambioStato(Studente::Pettegolo);} ~Popolazione(){ // distrugge gli studenti delete [] _ilPopolo; } int numPettegoli() const { // ritorna il numero di pettegoli int numPett=0; for (int i=0; i<_numStudenti; ++i) if (_ilPopolo[i].stato()==Studente::Pettegolo) numPett++; return numPett; } int numScettici() const { // ritorna il numero di scettici int numPett=0; for (int i=0; i<_numStudenti; ++i) if (_ilPopolo[i].stato()==Studente::Scettico) numPett++; return numPett; } int numNeutrali() const { // ritorna il numero di neutrali int numPett=0; for (int i=0; i<_numStudenti; ++i) if (_ilPopolo[i].stato()==Studente::Neutrale) numPett++; return numPett; } void vivi() { // fa interagire gli studenti a coppie finche' ci sono pettegoli // li faccio incontrare finche' ci sono pettegoli while (numPettegoli()>0) { // prendo due studenti a caso int i = static_cast(rand()*1./RAND_MAX*_numStudenti); int j = static_cast(rand()*1./RAND_MAX*_numStudenti); _ilPopolo[i].interagisci(_ilPopolo[j]); } } private: Studente* _ilPopolo; // array di studenti int _numStudenti; }; int main () { Studente primo(Studente::Neutrale); Studente secondo(Studente::Pettegolo); if (primo.stato() == Studente::Neutrale) cout << "Sono neutrale" << endl; Popolazione popolo(1000); popolo.vivi(); cout << "Neutrali sono " << popolo.numNeutrali() << endl; }