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