PROGRAMMAZIONE AD OGGETTI 2001-2002

10-1-2002 (ESERCITAZIONE)

 

Numero esercizio

Descrizione
ESERCIZIO 1
Esempio di uso delle classi con costruttore di copia
ESERCIZIO 2
Esempio di uso dellle liste linkate

 

ESERCIZIO 1

#include <iostream.h>
#include <string>

class player
{

private:
string nome;
int partite;
double media;
int punti;
double calcola_media();
public:
player(string, int, int);

/* Il costruttore sottostante e' un costruttore di copia, ovvero crea una copia di un oggetto della stesa classe. Nel nostro caso riceve: il puntatore all'oggetto atleta che deve essere una costante (per evitare modifiche del primo oggetto); il nome del giocatore della stessa squadra (ovviamente diverso dal precedente); il numero di punti (diverso per ogni giocatore).*/

player(const player* , string, int);
~player();
void print();
void update();
void setall();

};

/* Questo costruttore crea l'ogetto della classe player con dei parametri di default. Il programma realizzato, comunque, potrebbe lavorare anche con un costruttore senza parametri di default, in quanto nel 'main' viene creato solo un oggetto senza argomenti*/

player::player(string NOME = " ", int PARTITE = 0, int PUNTI = 0)
{

nome=NOME;
partite=PARTITE;
punti=PUNTI;
media=calcola_media();

}

player::player(const player* atl, string n, int pt)
{

nome=n;
partite=atl->partite;
punti=pt;
media=calcola_media();

}

/* Nella member function 'calcola_media' viene effettuato il controllo sul numero di partite per evitare divisioni per zero*/

double player::calcola_media()
{

double x;
if (punti==0)
x=0;
else
x=(double)punti/partite;

return x;

}

player::~player()
{

cout << "Addioooo ... mondo crudele! ";

}

void player::print()
{

cout << "PLAYER: " << nome << endl;
cout << "GIOCATE: " << partite << endl;
cout << "PUNTI: " << punti << endl;
cout << "MEDIA: " << media << endl;

}

/* La member function 'update' aggiorna i dati dell'oggetto ricalcolando ovviamente la media */

void player::update()
{

int inc;

cout << "Inserisci il numero di punti per la nuova partita: ";
cin >> inc;

partite++;
punti+=inc;
media=calcola_media();

}

/* La member function 'setall' assegna agli attributi dell'oggetto creato i dati inseriti dall'utente */

void player::setall()
{

cout << "Inserisci il nome del giocatore: ";
cin >> nome;
cout << "Inserisci il numero di partite giocate: ";
cin >> partite;
cout << "Inserisci il numero di punti totalizzati: ";
cin >> punti;
media=calcola_media();

}

void main ()
{

player atleta;

cout << "La ringraziamo per averci scelto ancora!" << endl;
atleta.setall();
atleta.print();
atleta.update();
atleta.print();

string n;
int pt;

cout << "Inserisci il nome del nuovo atleta della stessa squadra: ";
cin >> n;
cout << "Inserisci il suo numero dei punti fatti: ";
cin >> pt;

player atleta2(&atleta,n, pt);

atleta2.print();

}

Home


 

ESERCIZIO 2

#include <iostream.h>
#include <string>

struct node
{

string nome;
int voto;
node *next;

};

class lista
{

private:
/* Variabili 'private' sono i puntatori alla testa ed alla coda della losta linkata */

node *head;
node *tail;

public:
lista();
~lista();
void insert_head(string, int);
void insert_tail(string, int);
void print();
void print_head();
void print_tail();

/* La member function 'clear' deve liberare la memoria allocata per la lista linkata e non solo 'perdere' il puntatore iniziale alla lista */

void clear();

node *search(string);

};

/* Il costruttore inizializza a 'zero' tutti gli attributi dell'oggetto */

lista::lista()
{

head=0;
tail=0;

}

/* Il distruttore libera anche la memoria allocata per i puntatori alla testa e alla coda della lista linkata*/

lista::~lista()
{

delete head;
delete tail;

}

/* La member function 'insert_head' inserisce un nuovo elemento di cui prende nome e voto in testa alla lista. Per fare cio' crea una copia di 'head' in 'lptr', crea un nuovo nodo della lista che viene messo in testa ed infine il puntatore al nuovo elemento creato viene reimpostato ad 'head'. In caso di lista vuota, si deve assegnare a 'tail' lo stesso valore di 'head' (poi per altri inserimenti in testa 'tail' rimane invariato).*/

void lista::insert_head(string n, int v)
{

node * lptr;


lptr=head;
head=new node;

head->nome=n;
head->voto=v;
head->next=lptr;

if(head->next==0)
{

tail=head;

}

}

/* La member function 'insert_tail' inserisce un nuovo nodo in coda alla lista. Per fare cio', crea un nuovo elemento, lega l'ultimo elemento delle 'vecchia' lista al nuovo creato e 'sposta' 'tail'. Se, pero', la lista e' vuota 'head' e 'tail' vengono impostati al puntatore del nuovo elemento.*/

void lista::insert_tail(string n, int v)
{

node * lptr;

lptr=new node;

lptr->nome=n;
lptr->voto=v;
lptr->next=0;

if(tail!=0)
tail->next=lptr;

if(tail==0)
{

head=lptr;

}

tail=lptr;

}

/* La member function 'print' stampa tutti i nodi della lista finche' 'lptr' non punta a null.*/

void lista::print()
{

node* lptr;

lptr=head;
while(lptr!=0)
{

cout << "nome: "<< lptr->nome << endl;
cout << "voto"<< lptr->voto << endl;

lptr=lptr->next;

}

}

void lista::print_head()
{

cout << "il primo nome e': "<< head->nome << endl;
cout << "il primo voto e': " << head->voto << endl;

}

void lista::print_tail()
{

cout << "l'ultimo nome e': "<< tail->nome << endl;
cout << "l'ultimo voto e': " << tail->voto << endl;

}

node* lista::search(string sc)
{

node* lptr;

lptr=head;
while(lptr->nome!=sc)
{

if(lptr->next==0)
{

lptr=0;
break;

}

lptr=lptr->next;

}

return lptr;

}

/* La member function 'clear' dealloca tutta la memoria utilizzata per la lista. Per fare cio' prende il nodo in testa crea una copia del puntatore al suo successivo, elimina l'elemento in testa e rinomina il puntatore della 'vecchia testa' a quella 'nuova' ( ad 'head' viene assosiato il puntatore 'head->next'). Viene infine deallocato lo spazio per la variabile di lavoro 'lptr'.*/

void lista::clear()
{

node* lptr;

lptr=head;

while(lptr!=0)
{

lptr=head->next;
delete head;
head=lptr;

};

delete lptr;

}

void main ()
{

lista link;
int fine,v;
string s, n;

while(fine!=1)
{

cout << "vuoi inserire un elemento ? (s/n)";
cin >> s;

if(s=="s")
{

cout << "inserisci il nome: ";
cin >>n;
cout << "inserisci il voto: ";
cin >>v;

cout << "vuoi fare un inserimento in testa o in coda (t/c) ?" << endl;
cin >> s;

if (s=="t")

link.insert_head(n,v);

if (s=="c")

link.insert_tail(n,v);

}
else

fine=1;

}

cout << "la lista e':" << endl;
link.print();

cout << "il primo elemento e':" << endl;
link.print_head();

cout << "l'ultimo elmento e':" << endl;
link.print_tail();

cout << "vuoi ricercare un elemento ? (s/n) :";
cin >> s;

if(s=="s")
{

node* lptr;
cout << "inserisci l'elemento da ricercare" << endl;
cin >> s;

lptr=link.search(s);

if(lptr==0)

cout << "nessun elemento trovato";

else
{

cout << "il nodo cercato e':" << endl;
cout << lptr->nome;
cout << lptr->voto;

}

}

link.clear();

}

 

Home