Département d informatique Professeur : Clermont Dupuis Université Laval Bureau : 3976 Date : 22 octobre 2001 IFT-19946 Programmation orientée objet Examen partiel # 1 Question # 1. (2 points) Pour développer des systèmes informatiques, on doit prendre en compte plusieurs critères de qualité d un logiciel. Nommez-en quatre. Donnez leur signification. Question # 2. (3 points) Distinguez entre les concepts de type de donnée et celui de classe. Qu est-ce que le concept de classe apporte de nouveau en dehors des principes d héritage et de polymorphisme? (3 éléments de réponse sont attendus) Question # 3. (6 points) Vous partez en expédition prochainement. Vous devez déterminer les objets que vous transporterez dans votre sac à dos sachant que vous ne voulez pas transporter un poids de plus de W kg. Sachant que chaque objet est décrit comme suit : - code entier unique représentant l'objet, - nom de l'objet, - nombre d'unités (valeur entière), - poids unitaire de l'objet (kg.), vous construisez une classe "Sac_a_dos" qui renfermera les objets que vous emporterez tout en n'excédant pas le poids maximum W. Vous devez pouvoir créer un nouveau sac à dos avec un poids maximum défini, ajouter un nouvel objet ou en enlever un à votre sac à dos, accéder aux caractéristiques d'un objet à partir de son code, vérifier la présence d un objet dans le sac à dos à partir de son code numérique et détruire le sac à dos au complet. Donnez la spécification fonctionnelle et la représentation interne des données de la classe «Sac_a_dos» (i.e. le contenu du fichier en-tête «Sac_a_dos.h»).
- 2 - Question # 4. (6 points) Donnez l implantation de la classe «Polynome» dont la spécification est donnée cidessous (i.e. le contenu du fichier «Polynome.cpp»). class Polynome /* Spécification fonctionnelle de la classe "Polynome". Composantes : Chaque composante représente un terme du polynôme de degré n. Structure : La structure choisie est une suite de n termes. Domaine : Le i ième terme du polynôme est de la forme a i x i : */ protected : int degre; float * coefficients; public : Polynome(int n); /* Permet de construire un polynôme nul de degré n. Post - Nous avons un polynôme nul de degré n. */ void Inserer_Terme(int i, float Coefficient); /* Permet d'insérer le i ième terme dont le coefficient est passé en paramètre. Pré - Le polynôme de degré "degre" a déjà été créé. 0 <= i <= degre. Post - Le i ième terme fait maintenant partie du polynôme. */ float Acces_Coefficient_Terme(int i); /* Permet d'accéder au coefficient du i ième terme du polynôme. Pré - Le polynôme de degré "degre" a déjà été créé. 0 <= i <= degre. Post - Retourne le i ième coefficient du polynôme. */ float Evaluer_polynome(float x); /* Permet d'évaluer le polynôme à x et retourne le résultat. Pré - Le polynôme est déjà créé. Post - Retourne la valeur du polynôme évalué à x. */ 2
- 3 - Question # 5. (6 points) Implanter les deux classes «Auto» et «Auto_usagee» dont la spécification est fournie ci-après. Vous devez donc fournir le contenu des fichiers «Auto.cpp» et «Auto_usagee.cpp». -------------------------------------------------------------- class Auto /* Spécification fonctionnelle de la classe "Auto" */ protected: char Reference[20+1]; char Marque[20+1]; int Prix_vente; public: Auto(char * reference = "", char * marque = "", int prix_vente = 0); /* Permet de créer un objet de la classe Auto. Post - L'objet de la classe Auto est créé en tenant compte des valeurs par défaut pour les différents arguments. */ void Init_Prix_vente(int Prix); /* Initialise le prix de vente. Pré - L'objet de la classe Auto est créé. Post - Le prix de vente est conservé. */ int Acces_Prix_vente(); /* Fournit le prix de vente. Pré - L'objet de la classe Auto est créé. Post - Retourne le prix de vente. */ 3
- 4 - class Auto_usagee : public Auto protected: char Nom_Ancien_Proprietaire[20+1]; char Prenom_Ancien_Proprietaire[20+1]; int Cout_achat; public: Auto_usagee( char * ref = "", char * marque = "", int prix = 0, int cout_achat = 0, char * nom_ancien = "", char * nom_prenom = ""); /* Permet de créer un objet de la classe Auto_usagee. Post - L'objet Auto_usagee est créé en tenant compte des valeurs par défaut pour les différents arguments. */ void Init_Cout_achat(int cout_achat); /* Initialise le coût d'achat. Pré - L'objet de la classe Auto_usagee est créé. Post - Le coût d'achat est conservé. */ int Acces_Cout_achat(); /* Fournit le coût d'achat. Pré - L'objet de la classe Auto_usagee est créé. Post - Retourne le coût d'achat de l'auto usagée. */ Question # 6. (2 points) Vous voulez définir une classe «Vecteur_3D» dans votre environnement de programmation. Cette classe permettra entre autres (i) de créer un vecteur 3D nul, ou encore, (ii) de créer un vecteur 3D dont les coordonnées réelles sont (x, y, z), ou encore, (iii) de créer un vecteur 3D à l aide d un autre vecteur. Comment procéderiez-vous pour y arriver? Il s agit de donner les renseignements pertinents que l on doit retrouver dans le fichier «Vecteur_3D.h». Note : Il faut s en tenir à ce qui vous est demandé. Vous n avez pas à concevoir et implanter une classe «Vecteur_3D» complète. Question # 7. (2 points) Décrivez brièvement 2 approches vous permettant de construire une classe «Liste_simple» où la définition de chaque élément de la liste simple est inconnue lors de la conception et de l implantation de cette classe. 4
- 5 - Question # 8. (1 point) Considérons les classes A, B et C où chacune d elles renferme un constructeur. A est une classe de base; B est une classe dérivée de la classe A et C est une classe dérivée de B. Vous créez un objet de la classe C. Les constructeurs des classes A et B sont-ils appelés? Si oui, dans quel ordre? Question # 9. (2 points) Nous avons vu différents types d héritage. Toutefois, certains d entre eux ne sont pas appropriés; il faut plutôt opter pour d autres approches de modélisation. Donnez deux contextes où l utilisation du concept d héritage n est pas souhaitable. Soyez explicite. 5