Telechargé par EL MAMOUN ABDELLAH

2012-13.CE.correction.progc++

publicité
Programmation en C++
L2 2012-2013
Le 5 Juin 2013
Devoir Ecrit de Programmation en C++
Durée : 2 heures
Sans documents, sans calculatrices
Les réponses aux questions devront être portées dans les espaces prévus à cet effet. Aucune autre
copie ne sera acceptée. N'oubliez pas d'inscrire lisiblement vos noms et prénoms sur la feuille.
NOM
Prénom
Groupe
Programmation en C++
L2 2012-2013
Partie I : Bases du C++
Soit le code suivant (on a reporté les numéros de ligne). Toutes les questions de la partie 1 sont
relatives à ce code. Vous trouverez en annexe une copie de ce code que vous pouvez détacher pour
répondre aux questions sur les pages suivantes.
1. class Vecteur3
2. {
3.
private :
4.
5.
double x, y, z;
6.
7.
public :
8.
9.
Vecteur3(double=0.0, double=0.0, double=0.0);
10.
Vecteur3(const Vecteur3 &);
11.
~Vecteur3();
12.
13.
Vecteur3
normalise();
14.
double
calculNorme();
15.
static Vecteur3 unitX();
16.
17.
double
getx();
18.
double
gety();
19.
double
getz();
20.
21.
friend ostream& operator<<(ostream&, const Vecteur3&);
22.
friend Vecteur3 operator*(double, const Vecteur3 &);
23.
24.
};
A votre avis, ce code est-il dans le fichier vecteur3.cpp ou vecteur3.h ? Justifiez votre réponse.
Il est dans le fichier vecteur3.h car c'est une description de classe qui ne comporte pas de code
Quelle est la signification des mots-clés private et public aux lignes 3 et 7 ?
private indique que les membres suivants ne sont accessibles que par les méthodes de la classe
Vecteur3
public indique que les membres suivants sont accessibles hors de la classe Vecteur3
Comment s'appellent les méthodes dont les prototypes sont fournis aux lignes 9 et 10 ?
Ce sont des constructeurs
Programmation en C++
L2 2012-2013
Quand ces méthodes sont-elles appelées ?
Elles sont appelées à chaque fois qu'un objet de la classe Vecteur3 est instancié (créé)
Comment s'appelle la méthode dont le prototype est fourni à la ligne 11 ?
Il s'agit du destructeur
Que signifient les écritures double=0.0 dans le prototype de la méthode de la ligne 9 ?
Ce sont des arguments par défaut. Ainsi, si l'utilisateur ne fournit pas de valeur pour ces arguments
lors de l'appel du constructeur, ces arguments vaudront 0.
Quelles informations sont fournies par le prototype en ligne 15 ?
Ce prototype indique que la méthode nommé unitX retourne un objet de la classe Vecteur3, et
que cette méthode est static, c’est-à-dire que c'est une méthode de classe qui n'est pas liée à
une instance particulière.
On vous propose de modifier le prototype double getx(); en ligne 17 par : double getx()
const; Etes-vous d'accord avec ce changement ? Justifiez votre réponse.
Oui, car la méthode getx() ne modifie pas l'objet qui l'appelle. const placé en fin de prototype
indique que la méthode s'engage à ne pas modifier l'objet qui l'appelle : c'est donc une sécurité
supplémentaire qui permet au compilateur de vérifier que la méthode ne modifie pas l'objet. En
fait, il faudrait le mettre !
QCM : 4 questions avec plusieurs réponses possibles (sauf la dernière, une seule réponse possible)
Dans la classe Vecteur3, x, y et z sont :
 Des attributs
 Des propriétés
 Des membres
 Des méthodes
Programmation en C++
L2 2012-2013
La méthode normalise() dont le prototype se trouve en ligne 13 :
 Est une méthode statique
 Retourne un objet de classe Vecteur3
 Est une méthode de la classe Vecteur3
 A un paramètre par défaut
La méthode dont le prototype est fourni à la ligne 22
 Peut accéder aux membres private de la classe Vecteur3
 Permet de multiplier un réel par un vecteur en utilisant la notation *
 Est une méthode de la classe Vecteur3 // note : c'est une méthode friend, donc
n'appartient pas à la classe Vecteur3
 Ne retourne aucune valeur
Parmi les 4 définitions de la méthode calculNorme(), laquelle est la bonne (1 seule réponse) ? On
suppose que le calcul de la norme est correct.

double calculNorme()
{
return sqrt(x*x+y*y+z*z);
}

double calculNorme(const Vecteur3 &v)
{
return sqrt((v.x*v.x)+(v.y*v.y)+(v.z*v.z));
}
 double Vecteur3::calculNorme()
{
return sqrt(x*x+y*y+z*z);
}

double Vecteur3::calculNorme()
{
return sqrt((this.x*this.x)+(this.y*this.y)+(this.z*this.z));
}
Note : this étant un pointeur, la notation correcte est this-> et non this.
Fin du QCM
Programmation en C++
L2 2012-2013
On vous donne le corps de la méthode d'affichage (que l'on trouvera dans le fichier Vecteur3.cpp)
ostream& operator<<(ostream& os, const Vecteur3 &v)
{
os << "[" << v.x << ", " << v.y << ", " << v.z << "]";
return os;
}
Soit (enfin !) le main suivant, où l'on considère que tous les #include nécessaires sont faits, ainsi que
using namespace std;
On considère que racine(2) vaut 1.414 et que 1/racine(2) vaut 0.707
int main(int argc, char *argv[])
{
Vecteur3 v1;
Vecteur3 v2(1.0, 0.0, -1.0);
Vecteur3 v3 = v2.normalise();
cout << v2 << endl;
cout << v3 << endl;
v1 = v2.calculNorme() * Vecteur3::unitX();
cout << v1;
return 0;
}
Expliquer la syntaxe : Vecteur3::unitX();
UnitX étant une méthode static, elle est appelée en la faisant précéder du nom de la classe
Qu'affiche ce programme ?
[1.0, 0.0, -1.0]
[0.707, 0.0, -0.707]
[1.414, 0.0, 0.0]
Programmation en C++
L2 2012-2013
Programmation en C++
L2 2012-2013
Partie II : Et voilà le polymorphisme
Un peu de vocabulaire…En biologie, le règne animal est grossièrement divisé en taxons (mammifères,
reptiles, oiseaux, poissons), puis en genres (chien, serpent, vautour, requin par exemple). On ne
descendra pas au niveau des espèces pour l'exemple traité dans cette partie. Le nom de chaque animal
correspond au nom qu'on peut affectueusement lui donner. Ainsi, un animal du taxon mammifère et
du genre hamster peut porter le nom "Kiki", "Terminator" ou "Jean-Claude".
Note : la syntaxe des paramètres a été simplifiée autant que possible
Soit la classe suivante, présentée dans le fichier Animal.h
class Animal
{
protected :
string
string
string
nom;
taxon;
genre;
public :
Animal(string, string, string);
virtual ~Animal();
virtual string what();
friend ostream& operator<<(ostream&, const
Animal&);
virtual void manger(string);
virtual void seDeplacer()=0;
};
Dans le fichier animal.cpp, trouvera-t-on le corps de la méthode manger() ? Justifiez votre réponse.
Oui, car une méthode virtuelle a un corps.
Dans le fichier animal.cpp, trouvera-t-on le corps de la méthode seDeplacer() ? Justifiez votre
réponse.
Non, car seDeplacer() est une méthode virtuelle pure, elle n'a donc pas de corps
Que peut-on dire de la classe Animal ?
Animal est une classe abstraite car elle contient une méthode virtuelle pure.
Programmation en C++
L2 2012-2013
Que signifie le qualificateur protected pour l'accessibilité des attributs nom, taxon et genre ?
protected signifie que ces attributs seront accessibles par la classe Animal et par les classes
héritant de Animal uniquement.
On s'intéresse maintenant au taxon des mammifères, en définissant la classe Mammifere. Un
Mammifere étant un Animal, on utilise la relation d'héritage
class Mammifere: public Animal
{
protected :
long duree_gestation;
public :
Mammifere(string nom, string genre):Animal(nom,"Mammifere",genre)
{}
virtual ~Mammifere();
virtual string what();
};
La classe Mammifere est-elle abstraite ? Justifiez votre réponse.
Oui, car elle hérite de la méthode seDeplacer(), qui est virtuelle pure, et n'en fournit pas une
implémentation.
Expliquez la syntaxe utilisée pour le constructeur de cette classe
Le constructeur de Mammifere appelle le constructeur de Animal en précisant que le paramètre
Taxon vaut "Mammifere"
Programmation en C++
L2 2012-2013
En allant plus loin dans la classification des animaux, on s'intéresse au genre des hamsters. Un hamster
est un mammifère, on utilise de nouveau la relation d'héritage.
Ecrivez le fichier hamster.h en utilisant les informations suivantes :
Le constructeur de hamster a pour paramètre un nom, et appelle le constructeur de Mammifere en
indiquant que le genre est "hamster". Le constructeur doit également initialiser la durée de gestation
du hamster qui est de 20 jours.
Le destructeur de hamster est virtuel
Le hamster se déplace en trottinant : il faut donc un prototype pour la méthode seDeplacer()
hamster.h
class
Hamster : public Mammifere
{
// inutile ici de mettre un attribut nom car cet attribut est défini dans la
// classe Animal dont on hérite
public :
Hamster(string nom):Mammifere(nom,"Hamster);
virtual ~Hamster();
virtual void seDeplacer();
}
La classe Hamster est-elle abstraite ? Justifiez votre réponse.
Non, car la méthode seDeplacer() aura une implémentation dans la classe Hamster
Programmation en C++
L2 2012-2013
Ecrivez le fichier hamster.cpp
hamster.cpp
Hamster::Hamster(string nom):Mammifere(nom,"Hamster")
{
duree_gestation=20; // car duree_gestation est un attribut protected
// de la classe Mammifere : on en herite et on y a accès
}
Hamster::~Hamster() {}
Void Hamster::seDeplacer()
{
cout << " se deplace en trottinant" << endl;
}
Enfin, parmi les instructions suivantes, barrez celles qui sont incorrectes
int main(int argc, char *argv[])
{
Hamster h("Kiki"); // ok correspond au prototype du constructeur
Mammifere m;
// car Mammifere est une classe abstraite
Animal *a = new Hamster("Jean-Claude"); // oui
Mammifere *m = new Hamster("Hamsterminator"); // oui
Hamster *ptr = new Animal("Elliot","Mammifere","Hamster");
// car Animal est une classe abstraite, et donc ne peut être instanciée
return 0;
}
Programmation en C++
L2 2012-2013
ANNEXE : code de la partie I : les bases du C++
1. class Vecteur3
2. {
3.
private :
4.
5.
double x, y, z;
6.
7.
public :
8.
9.
Vecteur3(double=0.0, double=0.0, double=0.0);
10.
Vecteur3(const Vecteur3 &);
11.
~Vecteur3();
12.
13.
Vecteur3
normalise();
14.
double
calculNorme();
15.
static Vecteur3 unitX();
16.
17.
double
getx();
18.
double
gety();
19.
double
getz();
20.
21.
friend ostream& operator<<(ostream&, const Vecteur3&);
22.
friend Vecteur3 operator*(double, const Vecteur3 &);
23.
24.
};
Documents connexes
Téléchargement