Vous êtes sur la page 1sur 5

C++ - Examen partiel du 30 Mars 2001

Corrig

Question 1 (longueur maximale de la rponse : 10 12 lignes)

Qu'est-ce que le type d'une variable ? Qu'est-ce que le type d'une fonction ?
Le type d'une variable dfinit les conventions de codage adoptes dans la zone de mmoire
correspondante et, notamment, la taille de cette zone. Le type d'une variable dtermine aussi
l'ensemble des oprations qu'il est possible d'effectuer sur cette variable. Le type d'une fonction est
simplement le type de la valeur que celle-ci renvoie, ce qui n'a videmment rien voir avec la faon
dont est code la fonction, la place qu'elle occupe en mmoire ou les oprations qu'ont peut lui faire
subir.

Question 2 (longueur maximale de la rponse : 10 12 lignes)

Qu'est-ce qu'un type numr ? Donnez un exemple de situation dans laquelle il vous semblerait
judicieux d'en utiliser un.
Un type numr est un type cr par l'utilisateur. Il est judicieux de crer un tel type lorsqu'une
variable doit prendre ses valeurs dans un ensemble restreint et ne fera pas l'objet de traitements
complexes. Les rponses un questionnaire pourraient, par exemple, chapper au strict cadre
boolen grce un type dfinit ainsi :
enum REPONSE {OUI, NON, NE_SAIT_PAS};

Question 3 (longueur maximale de la rponse : 12 15 lignes)

Qu'est-ce que la valeur par dfaut d'un paramtre ?


C'est la valeur qui doit tre utilise pour initialiser le paramtre en question lorsque la fonction
appelante ne fournit aucune valeur cet effet.Cette valeur doit tre mentionne dans la dclaration
de la fonction.

Question 4 (longueur maximale de la rponse : 10 12 lignes)

Qu'est-ce qu'une classe ?


Une classe est un type cr par l'utilisateur. Alors qu'on dfinit un type numr en donnant les
valeurs possibles pour une variable de ce type, on dfinit une classe en donnant la liste de ses
membres. Les variables membre permettent de stocker de l'information dans une instance de la
classe, alors que les fonctions membre permettent de manipuler cette information.

Question 5

S'il existe une fonction affiche() qui est capable d'afficher l'cran la valeur qui lui est
transmise, quelles seront les valeurs affiches lors de l'excution du fragment de code suivant ?
int Q5;
for(Q5 = 2 ; Q5 < 13 ; Q5 = Q5 * 2)
affiche(Q5);
Passage Q5 Q5 < 13 Valeur affiche
1 2 oui 2
2 4 oui 4
3 8 oui 8
4 16 non
L'excution de ce fragment de code se traduit donc par l'affichage de : 2 4 8

Question 6

S'il existe une fonction affiche() qui est capable d'afficher l'cran la valeur qui lui est
transmise, quelles seront les valeurs affiches lors de l'excution du fragment de code suivant ?

Universit de Provence Centre Informatique pour les Lettres et les Sciences Humaines J-L Pris - 02/04/01
C++ Correction du partiel du 28 Mars 2001 2/5

int Q6 = 0;
int k = 5;
do {
Q6 = Q6 + k;
k = k + 1;
affiche(Q6);
} while (Q6 < 12);
Passage Q6 k Valeur affiche Q6 < 12
0 0 5
1 5 6 5 oui
2 11 7 11 oui
3 18 8 18 non
L'excution de ce fragment de code se traduit donc par l'affichage de : 5 11 18

Question 7

Quelle est la valeur contenue dans la variable Q7 l'issue de l'excution du fragment de code
suivant :
int Q7 = 0;
int i = 1;
while(i < 5)
{
Q7 = Q7 + i;
i = i + 1;
}
Passage i<5 Q7 i
0 0 1
1 oui 1 2
2 oui 3 3
3 oui 6 4
4 oui 10 5
5 non
Aprs excution de ce fragment de code, la variable Q7 contient donc 10.

Question 8

Par quel code quivalent peut-on remplacer le fragment de code suivant1, si l'on souhaite viter
d'utiliser l'oprateur ternaire :
int reponse = poseQuestion(); //la fonction poseQuestion() renvoie un entier
int Q8 = (reponse == 1) ? reponse : reponse + 1;

int reponse = poseQuestion(); //la fonction poseQuestion() renvoie un entier


int Q8 ;
if (reponse == 1)
Q8 = reponse;
else
Q8 = reponse + 1;

Attention, la version suivante NE CONVIENT PAS, car les variables Q8 qui y sont cres sont locales
leur bloc respectif et cessent donc d'exister immdiatement aprs avoir t initialises...

1 Considrez que les variables ou fonctions dont la dfinition n'apparat pas dans le fragment de code propos sont dfinies

d'une faon compatible avec l'usage qui en est fait.

J-L Pris - 02/04/01


C++ Correction du partiel du 28 Mars 2001 3/5

int reponse = poseQuestion(); //la fonction poseQuestion() renvoie un entier


if (reponse == 1)
{
int Q8 = reponse; //une variable locale ce bloc ?
}
else
{
int Q8 = reponse + 1; //une variable locale ce bloc ?
}

Question 9 (longueur maximale de la rponse : 10 12 lignes)

Si la fonction f() est dfinie de la faon suivante :


void f (int p)
{
p = p * 3.14;
}
Quelle sera la valeur contenue dans la variable Q9 l'issue de l'excution du fragment de code
suivant :
int Q9 = 17;
f(Q9);

17, bien entendu : la fonction f() ne peut accder cette variable, dont seule la valeur lui est
transmise pour initialiser le paramtre p.!

Question 10

Un programme comporte les dfinitions suivantes :


enum OBJET {PIERRE, PAPIER, CISEAUX, INCONNU};

class CJoueur
{
public:
int score;
OBJET objet;
void initialise();
void affronte(CJoueur unAutre);
};
void CJoueur::initialise()
{
score = 0;
objet = INCONNU;
}
void CJoueur::affronte(CJoueur unAutre)
{
OBJET tropFortPourMoi;
switch(objet)
{
case PIERRE : tropFortPourMoi = PAPIER;
break;
case PAPIER : tropFortPourMoi = CISEAUX;
break;
case CISEAUX : tropFortPourMoi = PIERRE;
}
if (unAutre.objet == tropFortPourMoi)
unAutre.score = unAutre.score + 1;
else
score = score + 1;
}

J-L Pris - 02/04/01


C++ Correction du partiel du 28 Mars 2001 4/5

Quelles sont les valeurs contenues dans les variables moi.score et lui.score l'issue de
l'excution du fragment de code suivant :
CJoueur moi;
CJoueur lui;
moi.initialise();
lui.initialise();
moi.objet = PIERRE;
lui.objet = CISEAUX;
moi.affronte(lui);
lui.objet = PIERRE;
lui.affronte(moi);
Le premier appel est effectu au titre de l'instance moi, la valeur de l'instance lui tant transmise
la fonction pour initialiser le paramtre unAutre. Nous avons donc :
PIERRE dans objet et CISEAUX dans unAutre.objet
ce qui signifie que le switch() attribue la valeur PAPIER la variable tropFortPourMoi. Comme
cette valeur est diffrente de celle de unAutre.objet, c'est score qui est incrment, c'est dire
que c'est l'instance au titre de laquelle la fonction a t appele qui gagne un point. A l'issue de cet
appel nous avons donc 1 dans moi.score et 0 dans lui.score.
Le second appel est effectu au titre de l'instance lui, la valeur de l'instance moi tant transmise
la fonction pour initialiser le paramtre unAutre. Nous avons donc :
PIERRE dans objet et PIERRE dans unAutre.objet
ce qui signifie que le switch() attribue la valeur PAPIER la variable tropFortPourMoi. Comme
cette valeur est diffrente de celle de unAutre.objet, c'est score qui est incrment, c'est dire
que c'est nouveau l'instance au titre de laquelle la fonction a t appele qui gagne un point.
Comme c'est cette fois lui qui a t utilis pour invoquer la fonction, nous obtenons finalement
1 dans moi.score et 1 dans lui.score.
Ce second appel rvle un premier dfaut de la fonction affronte(). En effet, lorsque les deux
joueurs choisissent le mme objet, il n'est pas normal que l'un d'entre eux marque un point.Un
second problme, plus subtil, n'est pas mis en vidence par les deux appels envisags
prcdemment. En effet, dans un cas comme dans l'autre, les valeurs de tropFortPourMoi et de
unAutre.objet sont diffrentes, ce qui vite que la ligne
unAutre.score = unAutre.score + 1;
soit excute. Comme d'habitude, le fait que la valeur d'une variable soit utilise pour initialiser un
paramtre ne donne pas la fonction le pouvoir d'accder la variable en question. C'est donc ici le
score du paramtre/variable locale unAutre qui serait augment, sans que ceci ait le moindre effet
sur la variable (lui ou moi) utilise comme paramtre lors de l'appel (cf. Question9). Pour obtenir une
fonction affronte() qui soit satisfaisante, il nous faut pour l'instant nous appuyer sur la capacit
des fonctions renvoyer une valeur :
int CJoueur::affronte(CJoueur unAutre)
{
if (unAutre.objet == objet)
return 0; //personne ne marque de points dans ce cas !
OBJET tropFortPourMoi;
switch(objet)
{
case PIERRE : tropFortPourMoi = PAPIER;
break;
case PAPIER : tropFortPourMoi = CISEAUX;
break;
case CISEAUX : tropFortPourMoi = PIERRE;
}
if (unAutre.objet == tropFortPourMoi)
return 1;
score = score + 1;
return 0;
}
L'utilisation de la fonction affronte() doit alors devenir

J-L Pris - 02/04/01


C++ Correction du partiel du 28 Mars 2001 5/5

CJoueur moi;
CJoueur lui;
moi.initialise();
lui.initialise();
moi.objet = PIERRE;
lui.objet = CISEAUX;
lui.code = moi.affronte(lui);
lui.objet = PIERRE;
moi.code = lui.affronte(moi);
ce qui n'est bien entendu pas trs pratique. La Leon 6 propose un moyen plus lgant pour
rsoudre ce problme, mais nous devrons pour cela attendre la semaine prochaine...

J-L Pris - 02/04/01

Vous aimerez peut-être aussi