INFORMATIQUE Examen Semestre II
Transcription
INFORMATIQUE Examen Semestre II
EIDGENÖSSISCHE TECHNISCHE HOCHSCHULE – LAUSANNE POLITECNICO FEDERALE – LOSANNA SWISS FEDERAL INSTITUTE OF TECHNOLOGY – LAUSANNE Faculté Informatique et Communication Cours d’Informatique aux sections GM et EL Sam J. ÉC O L E P O L Y T E C H N I Q U E FÉ DÉR A L E D E L A U S A N N E INFORMATIQUE Examen Semestre II Instructions : – Vous disposez d’une heure quarante cinq minutes pour faire cet examen (14h15 - 16h). – Nombre maximum de points : 120 points. – Toute documentation est autorisée ; – Répondez aux questions sur les feuilles vides qui vous sont distribuées à cet effet (utilisez aussi le verso des feuilles si nécessaires ) Veillez à ne traiter qu’un exercice par feuille, et à indiquer votre numéro sciper sur chacune des feuilles. Une feuille sans identification ne sera pas corrigée. – L’examen compte 4 questions. Ces questions sont indépendantes. T JE SU À LA PA GE TE IV AN SU 1 Conception OO et programmation(45 points) Une organisation caritative recueille des lots de dons. Un lot est simplement un ensemble de dons. Un don peut être fait en nature ou sous la forme d’un chèque. Un don en nature est caractérisé par : – le nom du produit (par exemple : ”riz”) – la quantité en kg – le prix du kg – sa date de péremption Un chèque est caractérisé par : – son montant – une information indiquant si le chèque est correctement rempli ou pas Voici les règles utilisées pour l’évaluation d’un don : – La valeur d’un don en nature est donnée par la quantité multipliée par le prix du kg – La valeur d’un chèque est son montant – un don, quel qu’il soit, peut être invalide – Un don en nature n’est pas valide si sa date de péremption est dépassée – Un chèque n’est pas valide s’il n’est pas correctement rempli. Le but est de créer les deux méthodes suivantes : 1. une méthode montant calculant et retournant la valeur totale des dons valides d’un lot ; 2. une méthode dons invalides calculant et retournant le nombre de dons invalides d’un lot. Partie 1 : conception On vous demande de : 1. définir la (ou les) classe(s) permettant de représenter ce problème en un programme C++ orienté objets ; 2. donner les prototypes de ces classes (attributs et méthodes) nécessaires pour effectuer les opérations demandées, en notant en commentaire les significations des arguments et des valeurs de retour des méthodes. Les contraintes à respecter sont : 1. vous n’utiliserez pas de fonctions globales (mais uniquement des méthodes de classes) ; 2. votre conception ne doit pas nécessiter de dupliquer du code ; 3. elle ne doit surtout pas nécessiter de faire des tests sur le type des objets (dons en nature ou chèque par exemple) pour réaliser les traitements souhaités ; 4. vous porterez une attention particulière à la nature des méthodes (normales, const, virtuelles ou virtuelles pures), ainsi qu’aux droits d’accès aux attributs et aux méthodes. On ne vous demande pas d’écrire de programme complet, ni le corps des méthodes, mais uniquement leurs prototypes. Partie 2 : programmation Donnez le code de la méthode montant telle que décrite précédemment. Commentez votre solution en insistant sur les principaux aspects et explicitez son fonctionnement. EXAMEN COURS INFORMATIQUE II– GM & SEL ÉC O L E P O L Y T E C H N I Q U E FÉ DÉR A L E D E L A U S A N N E J. Sam 14 Juin 2007 E IT SU À LA PA GE TE IV AN SU 2 Questions de cours (29 points) Répondez clairement et succinctement aux questions suivantes : 1. Soit une classe B héritant d’une autre classe A. Le constructeur de B peut-il omettre l’appel explicite au constructeur de A si : (a) A ne définit aucun constructeur explicite ? (b) A définit un seul constructeur dont les arguments n’ont pas tous des valeurs par défaut ? Justifiez vos réponses. 2. Qu’affiche la portion de code suivante : #include <iostream> using namespace std; class A { public: A(int a) :a(a) {cout << "A construit" << endl;} ~A(){cout << "A détruit" << endl;} private: int a; }; //suite --> class B: public A { public: B(int a) :A(a) {cout << "B construit" << endl;} ~B(){cout << "B détruit" << endl;} }; int main() { A* a(new B(2)); delete a; return 0; } 3. La compilation de la portion de code suivante signale une erreur : #include <iostream> using namespace std; class A{ protected: int a; public: A() :a(0){} }; class B : public A{ }; int main(){ B b; cout << b.a << return 0; } endl; Expliquez la nature de l’erreur et proposez une correction qui ne modifie pas le code existant de la classe A. Votre proposition pourra par contre ajouter des éléments à la classe A. Ecrivez votre proposition de correction sous forme d’explication en français. EXAMEN COURS INFORMATIQUE II– GM & SEL ÉC O L E P O L Y T E C H N I Q U E FÉ DÉR A L E D E L A U S A N N E J. Sam 14 Juin 2007 4. Le programmeur de la classe Personne ci-dessous a défini l’attribut age comme public. class Personne { public: int age; }; Un utilisateur de cette classe peut donc accidentellement affecter une valeur négative à l’attribut age ; ce qui n’a pas de sens. Expliquez comment le programmeur de Personne peut améliorer le codage de sa classe pour éviter ce problème. Quelle(s) modification(s) lui suggéreriez-vous de faire (explication sous forme de texte) ? L’attribut age devra garder le type int. 5. Qu’affiche la portion de code suivante : #include <iostream> using namespace std; class A{ public: A(int un_a):a(un_a){} void m(){++a;} int a; }; class B: public A{ public: B(int un_a):A(un_a),b(0){} void m(){ A::m(); ++b; } int b; }; int main(){ B un_b(0); un_b.m(); cout << un_b.a << " " << un_b.b << endl; return 0; } Expliquez votre réponse au moyen des concepts vus en cours. 6. GM uniquement : Qu’est-ce qu’un itérateur ? A quoi sert cette notion. Donnez un exemple d’utilisation sous forme de code C++. 6. EL uniquement : Qu’entend-on par copie profonde (en particulier, dans quelle situation typique est-il recommandé d’y avoir recours). Donnez en exemple le code C++ d’une classe quelconque permettant de faire de la copie profonde. EXAMEN COURS INFORMATIQUE II– GM & SEL ÉC O L E P O L Y T E C H N I Q U E FÉ DÉR A L E D E L A U S A N N E J. Sam 14 Juin 2007 3 Analyse de programme(25 points) Un programmeur amateur, féru de jeu d’échecs, élabore le diagramme de classes suivant pour faire jouer son ordinateur : class Piece int x,y; // position sur l’echiquier string type; // type de la piece void deplacePiece(){x=0; y= 0} // choix arbitraire string getType(){return type} class Cheval class Fou // le constructeur initialisera le type à "cheval" Cheval(....){...} // le constructeur initialisera le type à "fou" Fou(....){...} // méthode changeant x et y de sorte // à faire faire le meilleur déplacement au fou void deplaceFou(){...} // méthode changeant x et y de sorte // à faire faire le meilleur déplacement au cheval void deplaceCheval(){...} Seule une partie des pièces est représentée ici, mais l’esprit reste le même pour les autres types de pièces. Il a programmé des méthodes de déplacement sophistiquées permettant à chacune de ses pièces de se mouvoir de façon intelligente sur l’échiquier (deplaceCheval, etc . . .) et souhaite maintenant tester ces méthodes. Il élabore donc une méthode main ayant l’allure suivante : int main() { vector <Piece*> echiquier; echiquier.push_back(new Cheval(...)); echiquier.push_back(new Fou(...)); // INSERTION D’AUTRES PIECES ICI .... for (int i(0); i< echiquier.size(); ++i){ if (echiquier[i]->getType() == "cheval"){ echiquier[i]->deplacerCheval(); } else if (echiquier[i]->getType() == "fou"){ echiquier[i]->deplacerFou(); } else // ET ON CONTINUE COMME CA // POUR LES AUTRE PIECES.... } return 0; } Questions : 1. Quelle(s) critique(s) peut-on formuler sur le contenu des classes proposées et le programme de test ? 2. Redessinez le diagramme de classes précédent en rectifiant son contenu, de sorte à corriger ces défauts. Votre nouvelle conception doit permettre de formuler une fonction main beaucoup plus concise. 3. Donnez le code de la fonction main adaptée à votre nouveau diagramme. EXAMEN COURS INFORMATIQUE II– GM & SEL ÉC O L E P O L Y T E C H N I Q U E FÉ DÉR A L E D E L A U S A N N E J. Sam 14 Juin 2007 E IT SU À LA PA GE TE IV AN SU 4 Déroulement de programme (21 points) Le programme suivant est constitué de 3 classes A, B et C héritant de la classe prédéfinie string. #include <iostream> #include <string> using namespace std; class A : public string { protected: class C : public B { void message(ostream& out) const { out << "Hello" << endl; B::message(); } }; public: typedef A(string _s) :string(_s) {} A() :string("isn’t it?") {} A* PtrA; int main() { PtrA a1(new B); PtrA a2(new C); PtrA a3(new B("as I said")); cout << (*a1) << endl; cout << (*a2) << endl; cout << (*a3) << endl; return 0; virtual ~A(){} virtual void message(ostream& out) const = 0; } friend ostream& operator<<(ostream& out, const A& a) { out << "Message : " << endl; a.message(out); for (unsigned int i(0); i < a.size(); ++i) out << a[i]; out << endl; return out; } }; class B : public A { public: B(){} B(string s) :A(s) {} void message(ostream& out) const {out << "Konitchiwa" << endl;} void message() const {cout << "everybody" << endl;} }; // suite --> 1. Donnez l’affichage exact produit par ce programme 2. Justifiez votre réponse (important !). EXAMEN COURS INFORMATIQUE II– GM & SEL ÉC O L E P O L Y T E C H N I Q U E FÉ DÉR A L E D E L A U S A N N E J. Sam 14 Juin 2007