Trimestre Hiver, 2013 Mohamed Lokbani IFT119 Examen Intra Inscrivez tout de suite : votre nom et le code permanent. Nom : Prénom(s) : Signature : Code perm : Date : mardi 12 mars 2013 Durée : 2 heures (de 18h30 à 20h30) Local : Z-205 ; Pavillon Claire McNicoll Directives : - Toute documentation est permise. - Calculatrice non permise. - Répondre directement sur le questionnaire. - Les réponses doivent être brèves, précises, claires et nettement présentées. 1. /12 (1.1. à 1.) 2. /25 (2.1 à 2.5) 3. /20 (3.1 à 3.5) 4. /28 (4.1 à 4.) 5. /15 (5.1) Total : /100 Directives officielles * Interdiction de toute communication verbale pendant l'examen. * Interdiction de quitter la salle pendant la première heure. * L'étudiant qui doit s'absenter après la première heure remettra sa carte d'étudiant au surveillant, l'absence ne devant pas dépasser 5 minutes. Un seul étudiant à la fois peut quitter la salle. * Toute infraction relative à une fraude, un plagiat ou un copiage est signalée par le surveillant au directeur de département ou au professeur qui suspend l'évaluation. F.A.S IFT119 Trimestre Hiver, 2013: Examen Intra 1/10
Exercice 1 (12 points) Encerclez la bonne réponse et donnez une courte explication. 1.1 [VRAI FAUX] C++ est un langage orienté objet. 1.2 [VRAI FAUX] Une classe a accès par défaut à un opérateur d'affectation. 1.3 [VRAI FAUX] L'opérateur de résolution de portée «::» permet l'accès à l'ensemble des noms importés d'un espace de noms. 1.4 [VRAI FAUX] Les trois grands principes de la programmation orientée objet sont : encapsulation, héritage et l amitié. 1.5 [VRAI FAUX] Une classe amie d une classe n a pas accès aux zones protégées («protected») de cette classe? 1. [VRAI FAUX] Dans un «makefile» on sépare les cibles des dépendances par deux-points «:». IFT119 Trimestre Hiver, 2013: Examen Intra 2/10
Exercice 2 (25 points) Expliquez d abord les messages d avertissements et/ou d erreurs générés par le compilateur. Par la suite, corrigez les lignes du code pour éliminer ces avertissements et/ou erreurs, dans le cas où il est possible de le faire. 2.1 1 2 3 4 5 8 class C {; C::~C() { class D { D::~D(); ; D::~D() { 2_1.cpp:2:: error: definition of implicitly-declared 'C::~C()' 2_1.cpp:5:4: error: extra qualification 'D::' on member 'D' [-fpermissive] 2.2 8 9 10 11 class X { void unefonction (X *x){ this = x; ; 2_2.cpp: In member function 'void X::someFunction(X*)': 2_2.cpp:9:1: error: lvalue required as left operand of assignment IFT119 Trimestre Hiver, 2013: Examen Intra 3/10
2.3 char c = 'E'; if( c >= 'A' && c <= 'Z' c = " " c = ","){ 2_3.cpp::34: warning: suggest parentheses around '&&' within ' ' [-Wparentheses] 2_3.cpp::49: error: lvalue required as left operand of assignment 2.4 1 2 3 4 5 8 9 10 11 namespace M { namespace N { void f1(); void f2(); void N::f1() { namespace O { void M::N::f2() { 2_4.cpp:9:18: error: declaration of 'void f2()' not in a namespace surrounding 'M::N' IFT119 Trimestre Hiver, 2013: Examen Intra 4/10
2.5 Pour cet exemple, les lignes barrées ne contiennent pas d erreurs, même si le compilateur les a signalées comme étant des erreurs (dommages collatéraux : l erreur est ailleurs). 1 2 3 4 5 8 namespace a::b {int i; int main() { a::b::i = 2; cout << "i: " << a::b::i << endl; return 0; 2_5.cpp:5:12: error: expected '{' before '::' token 2-5.cpp:5:12: error: 'b' in namespace '::' does not name a type 2-5.cpp: In function 'int a::main()': 2-5.cpp:8:8: error: 'a::b' has not been declared 2-5.cpp:9:25: error: 'a::b' has not been declared 2-5.cpp: At global scope: 2-5.cpp:11:1: error: expected '' at end of input IFT119 Trimestre Hiver, 2013: Examen Intra 5/10
Exercice 3 (20 points) Les fragments de code suivants sont extraits à partir d un programme qui a compilé correctement : class Chanson { private: string Titre; // Titre de la chanson int Duree; // Duree de la chanson Chanson(); Chanson(string T, int L); string gettitre() const; int getduree() const; ; class Album { private: string Titre; // Titre de l'album string Auteur; // Auteur de l'album int nombrechansons; // Nombre de chansons dans l'album Chanson* ListeEcoute; // La liste des chansons Album(string T, string A,int nombrechansons); void AjoutChanson(const Chanson& T); Chanson getchanson(int Position) const; int getnombrechansons() const; ~Album(); ; Album::Album(string T, string A, int nt) { Titre = T; Auteur = A; nombrechansons = nt; ListeEcoute = new Chanson[nT]; element=0; Album::~Album() { delete [] ListeEcoute; int DureeGlobale(Album CD) { int DureeTotale = 0; for (int Index = 0; Index < CD.getnombreChansons(); Index++) { DureeTotale += CD.getChanson(Index).getDuree(); return DureeTotale; 3.1 Comme nous l avons mentionné au début de cet exercice, le programme va passer l étape de compilation sans erreur. Si «pc» est une instance de «Album» et, même si le code de la fonction «DureeGlobale» est conceptuellement correct, expliquez pourquoi un appel à la méthode «DureeGlobale(pc)» va avoir un effet de bord dommageable! IFT119 Trimestre Hiver, 2013: Examen Intra /10
3.2 Est-ce que les appels à «DureeGlobale(pc)» vont-ils provoquer une erreur à l exécution du programme? Justifiez votre réponse. 3.3 Sachant qu il n est pas possible de modifier le code de la fonction «DureeGlobale» et qu il n est pas possible d utiliser de variables globales, que faudra-t-il ajouter comme élément dans le précédent programme pour corriger le problème posé précédemment? (Ne pas écrire de code, juste mentionner ce qu il faut et pourquoi). 3.4 En plus de l action prise en 3.3, faudrait-il ajouter d autres éléments pour couvrir «toutes les bases»? Si oui, quoi au juste? 3.5 Qu est-ce qui aurait pu vous mettre la puce à l oreille dans les classes «Album» et «Chanson» que vous alliez frapper un mur! Justifiez votre réponse. IFT119 Trimestre Hiver, 2013: Examen Intra /10
Exercice 4 (28 points) Le programme suivant compile et s exécute correctement. Vous allez fournir et expliquer l affichage en sortie après les appels 1 à. 1 2 3 4 5 8 9 10 11 12 13 14 15 1 1 18 19 20 21 22 23 24 25 2 2 28 29 30 31 32 33 34 35 3 3 include <iostream> using namespace std; class Base { void X(){cout << "Base:X\n";; virtual void Y() = 0; virtual void Z(){cout << "Base:Z\n";; ; class C : public Base { void X(){cout << "C:X\n";; void Y(){cout << "C:Y\n";; void Z(){cout << "C:Z\n";; ; class D : public C { void X(){cout << "D:X\n";; void Y(){cout << "D:Y\n";; ; int main() { C* ptrc = new C; Base* ptrb = (Base*) ptrc; ptrb->x(); // appel 1 ptrb->y(); // appel 2 ptrb->z(); // appel 3 D* ptrd = new D; ptrb = (Base*) ptrd; ptrc = (C*) ptrd; ptrb->x(); // appel 4 ptrc->x(); // appel 5 ptrb->y(); // appel ptrd->z(); // appel return 0; 4.1 Ligne 25, appel N o 1 : ptrb->x(); 4.2 Ligne 2, appel N o 2 : ptrb->y(); IFT119 Trimestre Hiver, 2013: Examen Intra 8/10
4.3 Ligne 2, appel N o 3 : ptrb->z(); 4.4 Ligne 2, appel N o 4 : ptrb->x(); 4.5 Ligne 2, appel N o 5 : ptrc->x(); 4. Ligne 2, appel N o : ptrb->y(); 4. Ligne 2, appel N o : ptrd->z(); IFT119 Trimestre Hiver, 2013: Examen Intra 9/10
Exercice 5 (15 points) Écrire un programme qui réalise ce qui suit : 1- Ouvre le fichier «sortiefic.txt» pour y écrire quelques lignes, puis ferme le fichier. 2- Ouvre de nouveau le fichier «sortiefic.txt» pour : a- calculer le nombre de caractères dans chaque ligne y compris le caractère de retour à la ligne, b- incrémenter ce nombre avec le nombre de caractères y compris le caractère de retour d une nouvelle ligne, c- les opérations a & b sont réalisées pour toutes les lignes du fichier, d- finalement écrire à la fin du fichier la position des marqueurs de fin de chaque ligne dans le même fichier «sortiefic.txt». Pour le précédent exemple, à la fin des ces opérations, le fichier «sortiefic.txt» va contenir ce qui suit : Fichier «sortiefic.txt» après -1- Fichier «sortiefic.txt» après 2.d abcd abcd efg efg hi hi j j 5 9 12 14 Le symbole correspond à un retour à ligne et il est indiqué à titre informatif. Il n est pas nécessaire d utiliser les exceptions. IFT119 Trimestre Hiver, 2013: Examen Intra 10/10