EXAMEN POO 1

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 10

Faculté des Sciences de Tunis

Département des Sciences de l’Informatique

Epreuve de : Programmation C++

Section : M.I

Date : 06/09/2021 (Session Ratt COVID)

Documents : Non Autorisés

PARTIE A :
Un équipement est caractérisé par les données suivantes:

* Code (entier)

* Libelle (une chaine de caractères de taille variable)

* Année d'acquisition (entier)

* Cout d'achat

1.1)

On vous demande d'écrire le code source de la classe équipement qui contient:

- Un constructeur sans paramètres: son rôle est d'initialiser le libelle à NULL

- Un constructeur avec 4 paramètres pour initialiser les données d'un équipement

- Un destructeur qui libère l'espace mémoire éventuellement alloué pour le libellé

- Un constructeur par recopie

- Des méthodes pour accéder à chacune des données (get_code, get_libelle,get_annee,get_cout )

- Des méthodes pour changer chacune des données (set_code, set_libelle,set_annee,set_cout)

1.2)

On souhaite accorder un rôle pour l'opérateur d'addition de deux équipements. L'addition de deux
objets e1 et e2 de la classe équipements doit fournir un objet équipement avec les règles suivantes:

- Le code doit correspondre à la somme des codes des deux objets e1 et e2

- Le libelle doit correspondre à la concaténation des libellés des deux objets

- L'année d'acquisition doit correspondre au minimum de l'année des deux objets

- Le cout sera la somme des couts des deux objets.

Implémenter l'addition pour la classe équipement.


1.3)

On souhaite définir la classe equipement_transport en exploitant le principe d'héritage. Un


équipement industriel est caractérisé par les données d'un équipement auxquelles on ajoute:

* L'immatriculation (chaine de caractères de longueur variable)

* Le nom du chauffeur (chaine de caractères de longueur variable)

Ecrire le code source de la classe equipement_transport avec les constructeurs, le destructeur , les
méthodes pour accéder aux données et les méthodes pour changer les données.

PARTIE B
On souhaite développer une template pour la classe liste pour gérer une liste chainée où les
éléments correspondent à un type quelconque.

2.1 )

on vous demande d'écrire le code source de la classe template liste. Cette classe doit disposer de :

- un constructeur

- un destructeur

- une méthode d'insertion d'un élément dans la liste

-une méthode pour supprimer le premier élément de la liste

- une méthode pour supprimer le dernier élément de la liste

- une méthode pour trier les éléments de la liste (dans l'ordre croissant )

- une méthode pour afficher les éléments de la liste

Correction

#include <iostream>

using namespace std;

template <class T> void permuter(T *a, T *b)

T temp=*a;
*a=*b;

*b=temp;;

template <class E> class element_liste

private:

E data;

element_liste *next;

public:

element_liste()

E get_data()

return(data);

E *get_pdata()

return(&data);

element_liste *get_next()

return(next);

}
element_liste **get_pnext()

return(&next);

void set_data(E data)

this->data=data;

void set_next (element_liste *p)

this->next=p;

};

template <class T> class liste

private:

element_liste <T> *first;

public:

liste()

first=NULL;

~liste()

{
element_liste<T> *p;

element_liste<T> *t;

for (p=first;p;)

t=p;

p=p->get_next();

delete t;

void inserer(T d)

element_liste<T> *p=new element_liste<T>;

p->set_data(d);

p->set_next(first);

first=p;

void view()

element_liste<T> *p;

for (p=first;p;p=p->get_next())

cout <<p->get_data()<<endl;

}
void delete_first()

if(first)

element_liste<T> *p=first;

first=first->get_next();

delete p;

void r_delete_last(element_liste<T> **p)

if(*p)

if((*p)->get_next() ==NULL)

delete *p;

*p=NULL;

return;

else

r_delete_last((*p)->get_pnext());

void delete_last()

{
r_delete_last(&first);

void tri()

element_liste<T> *p,*t,*pmin;

for(p=first;p;p=p->get_next())

for(pmin=p,t=p->get_next();t;t=t->get_next())

if(t->get_data()<pmin->get_data())

pmin=t;

if(pmin != p)

permuter(p->get_pdata(), pmin->get_pdata() );

};

int main()

class liste<int> e;

e.inserer(10);

e.inserer(34);
e.inserer(6);

e.tri();

e.view();

e.delete_first();

e.delete_last();

e.view();

return 0;

2.3)

Ecrire une fonction main qui permet de tester la template liste pour le type equipement défini dans
la parte A.

* Expliquer pourquoi il est nécessaire de redéfinir l'opérateur < pour la classe équipement et
l'opérateur char *.

* Donner la surdéfinition de l'opérateur < pour la classe equipement (un équipement e1 est < à un
équipement e2 si le code de e1 est inferieur au code de e2)

* Donner la surdéfinition de l'opérateur char * pour la classe equipement.

Correction

int main()

class liste<equipement> e;

equipement d1(100,”serveur de données”, 2022);

equipement d1(200,”Onduleur”, 2018);

equipement d1(300,”Imprimante”, 2017);

e.inserer(e1);

e.inserer(e2);
e.inserer(e3);

e.tri();

e.view();

e.delete_first();

e.delete_last();

e.view();

return 0;

Expliquer pourquoi il est nécessaire de redéfinir l'opérateur < pour la classe équipement et
l'opérateur char *.

Réponse :

La méthode tri de la template liste compare des objets avec l’opérateur <, la classe equipement doit
donc surdéfinir cet opérateur pour qu’il soit reconnu pat le compilateur dans l’évaluation de la
comparaison de deux objets de type equipement.

* Donner la surdéfinition de l'opérateur < pour la classe equipement (un équipement e1 est < à un
équipement e2 si le code de e1 est inferieur au code de e2)

Réponse

operator < (equipement m)

return(this->code < m.code) ;

* Donner la surdéfinition de l'opérateur char * pour la classe equipement.

operator char *()

char s[100] ;

sprintf(s, »%d %s %d »,code,libelle,annee) ;


return(s);

Vous aimerez peut-être aussi