Sei sulla pagina 1di 4

Cognome: ………………………………………………….…… Nome…………………………….

……… Matricola…………
Fondamenti 2 (lettere A-I)
Esonero 1 (Classi e Oggetti, Vettori, Ereditarietà e Polimorfismo)
Prof. M. Angelaccio

1. (10 min.) Nella figura 1 è riportata la definizione di classe Product vista a lezione. class Product
{
1.1. Perché read() non ha l’attributo di const ? public:
Product();
Risposta…………………………………………………………………... void read();
bool is_better_than(Product b) const;
1.2. Fornire un esempio di implementazione per print che stampi in una riga per void print() const;
ciascuno dei campi dell’oggetto Product il suo nome e il suo valore nel private:
formato seguente string name;

“Il prodotto con nome…… ha un indice di qualità (score/price) …../…….” . double price;
int score;
1.3. Fornire un esempio di implementazione per is_better_than che restituisca true se }
l’oggetto corrente ha un indice di qualità maggiore di quello dell’oggetto Figura 1
parametro b.

implementazione per print implementazione per is_better_than

2. (40 min.) Implementare una classe base Person e derivare le classi Student e Teacher da Person. Una persona ha
nome e età come attributo. Lo studente ha matricola (intero di max 5 cifre) mentre l’insegnante ha uno stipendio.
2.1. Scrivere le definizioni della classe, i costruttori e la funzione membro print() per ciascuna delle classi.

Esercizio 2.1 (interfaccia)

Esercizio 2.1 (implementazione)

2.2. (retro foglio) Aggiungere una classe Course che contiene oltre al titolo del Corso, l’insegnante del corso e una lista
di studenti registrati al corso. Scrivere la definizione di classe per Course, il costruttore, la funzione membro void
student_registration(name, mat)che inserisce un nuovo studente, la funzione membro print()che
stampa il titolo e i dati di ciascuna delle persone del corso e il numero degli studenti frequentanti, il tutto usando
come implementazione un puntatore a Teacher e un vettore di puntatori a Student.
2.3. (retro foglio) Riscrivere la definizione per Course con un solo vettore di puntatori a Person.
Cognome: ………………………………………………….…… Nome…………………………….……… Matricola…………
Fondamenti 2 (lettere A-I)
Esonero 1 (Classi e Oggetti, Vettori, Ereditarietà e Polimorfismo) (soluzione)
Prof. M. Angelaccio

1. (10 min.) Nella figura 1 è riportata la definizione di classe Product vista a lezione. class Product
{
1.1. Perché read() non ha l’attributo di const ? public:
Product();
Risposta……la funzione read() modifica i campi dell’oggetto(parametro implicito)... void read();
bool is_better_than(Product b) const;
1.2. Fornire un esempio di implementazione per print che stampi in una riga per void print() const;
ciascuno dei i campi dell’oggetto Product il suo nome e il suo valore nel private:
formato seguente string name;

“Il prodotto con nome…… ha un indice di qualità (score/price) …../…….” . double price;
int score;
1.3. Fornire un esempio di implementazione per is_better_than che restituisca true se }
l’oggetto corrente ha un indice di qualità maggiore di quello dell’oggetto Figura 1
parametro b.
bool Product::is_better_than(Product b) const {
void Product::print() const {
if (b.price == 0) return false;
cout << "Il prodotto con nome “ <<name <<”ha un indice di qualità
if (price == 0) return true;
(score/price) “<<score<<” /” << price ;
return score / price > b.score / b.price;
}
}

2. (40 min.) Implementare una classe base Person e derivare le classi Student e Teacher da Person. Una persona ha
nome e età come attributo. Lo studente ha matricola (intero di max 5 cifre) mentre l’insegnante ha uno stipendio.
2.1. Scrivere le definizioni della classe, i costruttori e la funzione membro print() per ciascuna delle classi.
class Person { Person::Person(string n, int a) {
public: name = n;
Person(string n, int a); age = a;
void print() const; }
private: void Person::print() const {
string name; cout << "Person[name=" << name << ",age=" << age << "]";
int age; }
}; Student::Student(string m, int a, long mat): Person(m,a) {
class Student: public Person { matricola = mat;
public: }
Student (string name,int age, long matricola); void Student::print() const{
void print() const; Person:: print();
private: cout << "(and is a Student with matricola="<< matricola << ") \n";
long matricola; }
}; Teacher::Teacher(string m, int a, double sal): Person(m,a) {
class Teacher: public Person { salary = sal;
public: }
Teacher (string name,int age, double salary); void Teacher::print() const {
void print() const; Person:: print();
private: cout << "(and is a Teacher with salary="<< salary << ") \n";
double salary; }
};

2.2. (retro foglio) Aggiungere una classe Course che contiene oltre al titolo del Corso, l’insegnante del corso e una lista
di studenti registrati al corso. Scrivere la definizione di classe per Course, il costruttore, la funzione membro void
student_registration(name, mat)che inserisce un nuovo studente, la funzione membro print()che
stampa il titolo e i dati di ciascuna delle persone del corso e il numero degli studenti frequentanti, il tutto usando
come implementazione un puntatore a Teacher e un vettore di puntatori a Student.
2.3. (retro foglio) Riscrivere la definizione per Course con un solo vettore di puntatori a Person.
Cognome: ………………………………………………….…… Nome…………………………….……… Matricola…………

Prova di esecuzione per l’esercizio 2.1


Il seguente programma di test
int main()
{
Student s = Student("Sam", 20, 1500);
Teacher t = Teacher("Mary", 26, 45000);
s.print();
t.print();

return 0;
}

determina il risultato seguente:


Person[name=Sam,age=20](and is a Student with matricola=1500)
Person[name=Mary,age=26](and is a Teacher with salary=45000)
Soluzione per l’esercizio 2.2
/* Interfaccia */ /* Implementazione (con costruttore di default )
class Course { */
public: Course :: Course () { };
Course(); void Course::print() const {
void student_registration (String name, int mat); cout << "Titolo " << titolo<<”Docente:”<<
void print() const; insegnante->print();
private: }
string titolo; void student_registration (String name, int mat) {
Teacher* insegnante; Student* s = new Student (name, mat);
vector <Student*> studenti; studenti.push_back( s);
}; }

Soluzione per l’esercizio 2.3


/* Interfaccia */ /* Implementazione (con costruttore di default )
class Course { */
public: Course :: Course () { };
Course(); Virtual void Course::print() const {
void student_registration (String name, int mat); cout << "Titolo " << titolo<<”Docente:”<<
virtual void print() const; people[0]->print();
private: }
string titolo; void student_registration (String name, int mat) {
vector <Person*> people; Student* s = new Person (name, age); /* la
}; matricola non appare */
people.push_back( s);
}
Cognome: ………………………………………………….…… Nome…………………………….……… Matricola…………

Fondamenti 2 (lettere A-I)


Esonero 1 (Classi e Oggetti, Vettori, Ereditarietà e Polimorfismo)
Prof. M. Angelaccio(10 min.) Nella figura 1 è riportata la definizione di classe Person
Class Person
vista a lezione.
public:
1.1. Indicare qual è il costruttore predefinito Person();
Person( string pname, int page)
Risposta…………………………………………………………………... void get_name() const;
void get_age() const;
1.2. Fornire un esempio di implementazione per il costruttore di persone con un bool is_younger_than(Person p) const;
terzo attributo che descrive il luogo di residenza come variabile di tipo string.
private:
Person( string pname, int page, string pcity) string name;
int age;
}
1.3. Fornire un esempio di implementazione per is_younger_than() che
Figura 1
restituisca true se l’oggetto corrente ha età inferiore a quello dell’oggetto
parametro p.

implementazione per costruttore implementazione per is_younger_than

2. (40 min.) Implementare una classe base Appointment e derivare la classe Lesson. Un appuntamento ha una
descrizione di tipo string , una data (anno, mese, giorno), e un inizio e fine di tipo Time mentre Lesson considera
anche il luogo dell’appuntamento di tipo String .
2.1. Scrivere le definizioni della classe, i costruttori e la funzione membro print() per ciascuna delle classi.

Esercizio 2.1 (interfaccia)

Esercizio 2.1 (implementazione)

2.2. (retro foglio) Scrivere una funzione virtuale bool occurs_in(string place) che verifica se l’appuntamento
è nel luogo specificato dal parametro.
2.3. (retro foglio) Scrivere un ambiente di test che inizializza un vettore schedule di puntatori a Appointments e
Lessons , legge un certo luogo e stampa tutti gli appuntamenti.