Professional Documents
Culture Documents
Delannoy
Exercices en 3e dition
Claude Delannoy
LANGAGE
C++ Exercices en
3e dition
LANGAGE
Ingnieur informaticien au CNRS, Claude Delannoy
150 exercices corrigs pour matriser la langage C++ possde une grande pratique de la formation conti-
Complment idal de Programmer en langage C++, du mme auteur, cet
nue et de lenseignement suprieur. Rputs pour la
ouvrage vous propose 150 exercices corrigs et comments pour mieux qualit de leur dmarche pdagogique, ses ouvrages
C++
Les exercices proposs vous permettront de vous forger une vritable
mthodologie de conception de vos propres classes C++. Vous saurez
notamment dcider du bien-fond de la surdfinition de loprateur
Au sommaire
daffectation ou du constructeur par recopie, tirer parti de lhritage
(simple ou multiple), crer vos propres bibliothques de classes, exploiter Gnralits sur le C++, types de base, oprateurs et
les possibilits offertes par les patrons de fonctions et de classes, etc. expressions (7 exercices) Instructions de contrle
(16 exercices) Fonctions (10 exercices) Tableaux,
Chaque chapitre dbute par un rappel de cours suivi de plusieurs exercices
pointeurs et chanes de type C (13 exercices) Struc-
de difficult croissante. Les corrigs sont tous prsents suivant le mme
tures (6 exercices) Du C au C++ (9 exercices)
canevas: analyse dtaille du problme, solution sous forme de programme
Classes, constructeurs et destructeurs (7exercices)
avec exemple de rsultat dexcution, justification des choix oprs car il
Proprits des fonctions membres (5 exercices)
ny a jamais de solution unique un problme donn ! et, si besoin,
commentaires sur les points dlicats et suggestions sur les extensions
possibles du programme.
Construction, destruction et initialisation des objets
(7 exercices) Fonctions amies (3 exercices)
Surdfinition doprateurs (11 exercices) Conversions
150 exercices corrigs
Le code source des corrigs est fourni sur le site www.editions-eyrolles.com. de type dfinies par lutilisateur (7 exercices) Tech-
nique de lhritage (7 exercices) Hritage multiple
qui sadresse ce livre ? (6 exercices) Fonctions virtuelles et polymorphisme
(3 exercices) Flots dentre et de sortie (5 exer-
Aux tudiants des cursus universitaires (DUT, licence, master), ainsi quaux cices) Patrons de fonctions (4exercices) Patrons
lves des coles dingnieur. de classes (8 exercices) Gestion des exceptions
tout programmeur ayant dj une exprience de la programmation (7exercices) Exercices de synthse (6 exercices)
(C, Python, Java, PHP) et souhaitant sinitier au langage C++. Composants standard (11 exercices).
3e dition
ISBN : 978-2-212-67387-6
Code diteur : G67387
19,90
Conception de couverture :
Jrmie Barlog / Studio Eyrolles
ditions Eyrolles
LANGAGE
C++ Exercices en
3e dition
LANGAGE
Ingnieur informaticien au CNRS, Claude Delannoy
150 exercices corrigs pour matriser la langage C++ possde une grande pratique de la formation conti-
Complment idal de Programmer en langage C++, du mme auteur, cet
nue et de lenseignement suprieur. Rputs pour la
ouvrage vous propose 150 exercices corrigs et comments pour mieux qualit de leur dmarche pdagogique, ses ouvrages
C++
Les exercices proposs vous permettront de vous forger une vritable
mthodologie de conception de vos propres classes C++. Vous saurez
notamment dcider du bien-fond de la surdfinition de loprateur
Au sommaire
daffectation ou du constructeur par recopie, tirer parti de lhritage
(simple ou multiple), crer vos propres bibliothques de classes, exploiter Gnralits sur le C++, types de base, oprateurs et
les possibilits offertes par les patrons de fonctions et de classes, etc. expressions (7 exercices) Instructions de contrle
(16 exercices) Fonctions (10 exercices) Tableaux,
Chaque chapitre dbute par un rappel de cours suivi de plusieurs exercices
pointeurs et chanes de type C (13 exercices) Struc-
de difficult croissante. Les corrigs sont tous prsents suivant le mme
tures (6 exercices) Du C au C++ (9 exercices)
canevas: analyse dtaille du problme, solution sous forme de programme
Classes, constructeurs et destructeurs (7exercices)
avec exemple de rsultat dexcution, justification des choix oprs car il
Proprits des fonctions membres (5 exercices)
ny a jamais de solution unique un problme donn ! et, si besoin,
commentaires sur les points dlicats et suggestions sur les extensions
possibles du programme.
Construction, destruction et initialisation des objets
(7 exercices) Fonctions amies (3 exercices)
Surdfinition doprateurs (11 exercices) Conversions
150 exercices corrigs
Le code source des corrigs est fourni sur le site www.editions-eyrolles.com. de type dfinies par lutilisateur (7 exercices) Tech-
nique de lhritage (7 exercices) Hritage multiple
qui sadresse ce livre ? (6 exercices) Fonctions virtuelles et polymorphisme
(3 exercices) Flots dentre et de sortie (5 exer-
Aux tudiants des cursus universitaires (DUT, licence, master), ainsi quaux cices) Patrons de fonctions (4exercices) Patrons
lves des coles dingnieur. de classes (8 exercices) Gestion des exceptions
tout programmeur ayant dj une exprience de la programmation (7exercices) Exercices de synthse (6 exercices)
(C, Python, Java, PHP) et souhaitant sinitier au langage C++. Composants standard (11 exercices).
3e dition
Du mme auteur
Autres ouvrages
Exercices
enlangageC++
3e dition
La troisime dition du prsent ouvrage est parue en 2007 sous lISBN 978-2-212-12201-5.
loccasion de ce troisime tirage, elle bnficie dune nouvelle couverture. Le texte reste inchang.
Avant-propos
ditions Eyrolles V
exos_c++.book Page VI Jeudi, 5. juillet 2007 11:10 11
sortie, les patrons de fonctions et les patrons de classes ; la gestion des exceptions. Le cha-
pitre 20 propose des exercices de synthse.
Chaque chapitre dbute par un rappel dtaill des connaissances ncessaires pour aborder les
exercices correspondants (naturellement, un exercice dun chapitre donn peut faire intervenir
des points rsums dans les chapitres prcdents).
Le cours complet correspondant ces rsums se trouve dans louvrage Apprendre le C++, du
mme auteur.
Au sein de chaque chapitre, les exercices proposs vont dune application immdiate du cours
des ralisations de classes relativement compltes. Au fil de votre progression dans louvrage,
vous raliserez des classes de plus en plus ralistes et oprationnelles, et ayant un intrt
gnral ; citons, par exemple :
les ensembles ;
les piles ;
les complexes.
Naturellement, tous les exercices sont corrigs. Pour la plupart, la solution propose ne se
limite pas une simple liste dun programme (laquelle ne reprsente finalement quune rdac-
tion possible parmi dautres). Vous y trouverez une analyse dtaille du problme et, si besoin,
les justifications de certains choix. Des commentaires viennent, le cas chant, clairer les parties
quelque peu dlicates. Frquemment, vous trouverez des suggestions de prolongement ou de
gnralisation du problme abord.
Outre la matrise du langage C++ proprement dit, les exercices proposs vous permettront de
vous forger une mthodologie de conception de vos propres classes. Notamment, vous
saurez :
dcider du bien-fond de la surdfinition de loprateur daffectation ou du constructeur
par recopie ;
VI ditions Eyrolles
exos_c++.book Page VII Jeudi, 5. juillet 2007 11:10 11
Avant-propos
exploiter, lorsque vous jugerez que cela est opportun, les possibilits de conversions
implicites que le compilateur peut mettre en place ;
tirer parti de lhritage (simple ou multiple) et dterminer quels avantages prsente la cration
dune bibliothque de classes, notamment par le biais du typage dynamique des objets qui
dcoule de lemploi des fonctions virtuelles ;
mettre en uvre les possibilits de fonctions gnriques (patrons de fonctions) et de classes
gnriques (patrons de classes).
Quelques exercices proposs dans les prcdentes ditions de louvrage trouvent maintenant
une solution vidente en faisant appel aux composants standard introduits par la norme. Nous
les avons cependant conservs, dans la mesure o la recherche dune solution ne faisant pas
appel aux composants standard conserve un intrt didactique manifeste. De surcrot, nous
avons introduit un nouveau chapitre (21), qui montre comment rsoudre les exercices
lorsquon accepte, cette fois, de recourir ces composants standard.
3 Les fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Exercice 24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Exercice 25 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Exercice 26 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Exercice 27 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
ditions Eyrolles IX
exos_c++.book Page X Jeudi, 5. juillet 2007 11:10 11
Exercices en C++
Exercice 28. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Exercice 29. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Exercice 30. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Exercice 31 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Exercice 32. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Exercice 33. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5 Les structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Exercice 47 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Exercice 48. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Exercice 49. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Exercice 50. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Exercice 51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Exercice 52. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6 De C C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Exercice 53. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Exercice 54. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Exercice 55. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Exercice 56. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Exercice 57 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Exercice 58. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
X ditions Eyrolles
exos_c++.book Page XI Jeudi, 5. juillet 2007 11:10 11
Exercice 59 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Exercice 60 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Exercice 61 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
ditions Eyrolles XI
exos_c++.book Page XII Jeudi, 5. juillet 2007 11:10 11
Exercices en C++
Exercice 87 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Exercice 88. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Exercice 89. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Exercice 90. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Exercice 91 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Exercice 92. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Exercice 93. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Exercice 94. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Exercices en C++
Chapitre 1
Rappels
Gnralits
Le canevas minimal utiliser pour raliser un programme C++ se prsente ainsi :
#include <iostream>
using namespace std ;
main() // en-tte
{ ..... // corps du programme
}
Toute variable utilise dans un programme doit avoir fait lobjet dune dclaration en prcisant
le type et, ventuellement, la valeur initiale. Voici des exemples de dclarations :
int i ; // i est une variable de type int nomme i
float x = 5.25 ; // x est une variable de type float nomme x
// initialise avec la valeur 5.25
const int NFOIS = 5 ; // NFOIS est une variable de type int dont la
// valeur, fixe 5, ne peut plus tre modifie
ditions Eyrolles 1
exos_c++.book Page 2 Jeudi, 5. juillet 2007 11:10 11
Laffichage dinformations lcran est ralis en envoyant des valeurs sur le flot cout ,
comme dans :
cout << n << 2*p ; // affiche les valeurs de n et de 2*p sur lcran
La lecture dinformations au clavier est ralise en extrayant des valeurs du flot cin ,
comme dans :
cin >> x >> y ; // lit deux valeurs au clavier et les affecte x et y
Types de base
Les types de base sont ceux partir desquels seront construits tous les autres, dits drivs (il
sagira des types structurs comme les tableaux, les structures, les unions et les classes, ou
dautres types simples comme les pointeurs ou les numrations).
Il existe trois types entiers : short int (ou short), int et long int (ou long). Les limita-
tions correspondantes dpendent de limplmentation. On peut galement dfinir des types
entiers non signs : unsigned short int (ou unsigned short), unsigned int et unsi-
gned long int (ou unsigned long). Ces derniers sont essentiellement destins la mani-
pulation de motifs binaires.
Les constantes entires peuvent tre crites en notation hexadcimale (comme 0xF54B) ou
octale (comme 014). On peut ajouter le suffixe u pour un entier non sign et le suffixe l
pour un entier de type long.
Il existe trois types flottants : float, double et long double. La prcision et le domaine
reprsentable dpendent de limplmentation.
Le type caractre permet de manipuler des caractres cods sur un octet. Le code utilis
dpend de limplmentation. Il existe trois types caractre : signed char, unsigned char et
char (la norme ne prcise pas sil correspond signed char ou unsigned char).
Les constantes de type caractre, lorsquelles correspondent des caractres imprimables ,
se notent en plaant le caractre correspondant entre apostrophes.
Certains caractres disposent dune reprsentation conventionnelle utilisant le caractre \
notamment \n qui dsigne un saut de ligne. De mme, \ reprsente le caractre et \"
dsigne le caractre ". On peut galement utiliser la notation hexadcimale (comme dans \
x41) ou octale (comme dans \07).
Le type bool permet de manipuler des boolens . Il dispose de deux constantes notes
true et false.
2 ditions Eyrolles
exos_c++.book Page 3 Jeudi, 5. juillet 2007 11:10 11
ditions Eyrolles 3
exos_c++.book Page 4 Jeudi, 5. juillet 2007 11:10 11
(oprandes de types diffrents) ou contenant des oprandes dautres types (bool, char et
short), grce lexistence de deux sortes de conversions implicites :
les conversions dajustement de type, selon lune des hirarchies :
int -> long -> float -> double -> long double
unsinged int -> unsigned long -> float -> double -> long double
les promotions numriques, savoir des conversions systmatiques de char (avec ou sans
attribut de signe), bool et short en int.
0 && 0 faux
0 && non nul faux
non nul && 0 faux
non nul && non nul vrai
0 || 0 faux
0 || non nul vrai
non nul || 0 vrai
non nul || non nul vrai
! 0 vrai
! non nul faux
Les deux oprateurs && et || sont court-circuit : le second oprande nest valu que si
la connaissance de sa valeur est indispensable.
Oprateurs daffectation
Loprande de gauche dun oprateur daffectation doit tre une lvalue, cest--dire la rf-
rence quelque chose de modifiable.
Les oprateurs daffectation (=, -=, += ...), appliqus des valeurs de type numrique, provo-
quent la conversion de leur oprande de droite dans le type de leur oprande de gauche. Cette
conversion force peut tre dgradante .
4 ditions Eyrolles
exos_c++.book Page 5 Jeudi, 5. juillet 2007 11:10 11
Oprateur de cast
Il est possible de forcer la conversion dune expression quelconque dans un type de son choix,
grce loprateur dit de cast . Par exemple, si n et p sont des variables entires,
lexpression :
(double) n / p // ou : static_cast<double> (n/p)
aura comme valeur celle de lexpression entire n/p convertie en double.
Oprateur conditionnel
Cet oprateur ternaire fournit comme rsultat la valeur de son deuxime oprande si la condi-
tion mentionne en premier oprande est non nulle (vraie pour une expression boolenne), et
la valeur de son troisime oprande dans le cas contraire. Par exemple, avec cette affectation :
max = a>b ? a : b ;
on obtiendra dans la variable max la valeur de a si la condition a>b est vraie, la valeur de b
dans le cas contraire. Avec :
valeur = 2*n-1 ? a : b ;
on obtiendra dans la variable valeur la valeur de a si lexpression 2*n-1 est non nulle, la
valeur de b dans le cas contraire.
Exercice 1
nonc
liminer les parenthses superflues dans les expressions suivantes :
a = (x+5) /* expression 1 */
a = (x=y) + 2 /* expression 2 */
a = (x==y) /* expression 3 */
(a<b) && (c<d) /* expression 4 */
(i++) * (n+p) /* expression 5 */
a = x+5 /* expression 1 */
Loprateur + est prioritaire sur loprateur daffectation =.
ditions Eyrolles 5
exos_c++.book Page 6 Jeudi, 5. juillet 2007 11:10 11
a = (x=y) + 2 /* expression 2 */
Ici, loprateur + tant prioritaire sur =, les parenthses sont indispensables.
a = x==y /* expression 3 */
Loprateur == est prioritaire sur =.
a<b && c<d /* expression 4 */
Loprateur && est prioritaire sur loprateur <.
i++ * (n+p) /* expression 5 */
Loprateur ++ est prioritaire sur * ; en revanche, * est prioritaire sur +, de sorte quon ne
peut liminer les dernires parenthses.
Exercice 2
nonc
Soient les dclarations :
char c = '\x01' ;
short int p = 10 ;
Quels sont le type et la valeur de chacune des expressions suivantes :
p + 3 /* 1 */
c + 1 /* 2 */
p + c /* 3 */
3 * p + 5 * c /* 4 */
1. p est dabord soumis la conversion systmatique short -> int, avant dtre
ajout la valeur 3 (int). Le rsultat 13 est de type int.
2. c est dabord soumis la conversion systmatique char -> int (ce qui aboutit la
valeur 1), avant dtre ajout la valeur 1 (int). Le rsultat 2 est de type int.
3. p est dabord soumis la conversion systmatique short -> int, tandis que c est sou-
mis la conversion systmatique char -> int ; les rsultats sont alors additionns
pour aboutir la valeur 11 de type int.
4. p et c sont dabord soumis aux mmes conversions systmatiques que ci-dessus ; le rsultat
35 est de type int.
6 ditions Eyrolles
exos_c++.book Page 7 Jeudi, 5. juillet 2007 11:10 11
Exercice 3
nonc
Soient les dclarations :
char c = '\x05' ;
int n = 5 ;
long p = 1000 ;
float x = 1.25 ;
double z = 5.5 ;
Quels sont le type et la valeur de chacune des expressions suivantes :
n + c + p /* 1 */
2 * x + c /* 2 */
(char) n + c /* 3 */
(float) z + n / 2 /* 4 */
1. c est tout dabord converti en int, avant dtre ajout n. Le rsultat (10), de type int,
est alors converti en long, avant dtre ajout p. On obtient finalement la valeur 1010,
de type long.
2. On value dabord la valeur de 2*x, en convertissant 2 (int) en float, ce qui fournit la
valeur 2.5 (de type float). Par ailleurs, c est converti en int (conversion systmati-
que). On value ensuite la valeur de 2*x, en convertissant 2 (int) en float, ce qui
fournit la valeur 2.5 (de type float). Pour effectuer laddition, on convertit alors la
valeur entire 5 (c) en float, avant de lajouter au rsultat prcdent. On obtient finale-
ment la valeur 7.75, de type float.
3. n est tout dabord converti en char ( cause de loprateur de cast ), tandis que c est
converti (conversion systmatique) en int. Puis, pour procder laddition, il est nces-
saire de reconvertir la valeur de (char) n en int. Finalement, on obtient la valeur 10,
de type int.
4. z est dabord converti en float, ce qui fournit la valeur 5.5 (approximative, car, en fait,
on obtient une valeur un peu moins prcise que ne le serait 5.5 exprim en double). Par
ailleurs, on procde la division entire de n par 2, ce qui fournit la valeur entire 2. Cette
dernire est ensuite convertie en float, avant dtre ajoute 5.5, ce qui fournit le rsul-
tat 7.5, de type float.
ditions Eyrolles 7
exos_c++.book Page 8 Jeudi, 5. juillet 2007 11:10 11
Exercice 4
nonc
Soient les dclarations suivantes :
int n = 5, p = 9 ;
int q ;
float x ;
Quelle est la valeur affecte aux diffrentes variables concernes par chacune des instructions
suivantes ?
q = n < p ; /* 1 */
q = n == p ; /* 2 */
q = p % n + p > n ; /* 3 */
x = p / n ; /* 4 */
x = (float) p / n ; /* 5 */
x = (p + 0.5) / n ; /* 6 */
x = (int) (p + 0.5) / n ; /* 7 */
q = n * (p > n ? n : p) ; /* 8 */
q = n * (p < n ? n : p) ; /* 9 */
1. 1
2. 0
3. 5 (p%n vaut 4, tandis que p>n vaut 1).
4. 1 (p/n est dabord valu en int, ce qui fournit 1 ; puis le rsultat est converti en
float, avant dtre affect x).
5. 1.8 (p est converti en float, avant dtre divis par le rsultat de la conversion de n en
float).
6. 1.9 (p est converti en float, avant dtre ajout 0.5 ; le rsultat est divis par le
rsultat de la conversion de n en float).
7. 1 (p est converti en float, avant dtre ajout 0.5 ; le rsultat (5.5) est alors converti
en int avant dtre divis par n).
8. 25
9. 45
8 ditions Eyrolles
exos_c++.book Page 9 Jeudi, 5. juillet 2007 11:10 11
Exercice 5
nonc
Quels rsultats fournit le programme suivant :
#include <iostream>
using namespace std ;
main ()
{
int i, j, n ;
i = 0 ; n = i++ ;
cout << "A : i = " << i << " n = " << n << "\n" ;
i = 10 ; n = ++ i ;
cout << "B : i = " << i << " n = " << n << "\n" ;
i = 20 ; j = 5 ; n = i++ * ++ j ;
cout << "C : i = " << i << " j = " << j << " n = " << n << "\n" ;
i = 15 ; n = i += 3 ;
cout << "D : i = " << i << " n = " << n << "\n" ;
i = 3 ; j = 5 ; n = i *= --j ;
cout << "E : i = " << i << " j = " << j << " n = " << n << "\n" ;
}
A : i = 1 n = 0
B : i = 11 n = 11
C : i = 21 j = 6 n = 120
D : i = 18 n = 18
E : i = 12 j = 4 n = 12
ditions Eyrolles 9
exos_c++.book Page 10 Jeudi, 5. juillet 2007 11:10 11
Exercice 6
nonc
Quels rsultats fournira ce programme :
#include <iostream>
using namespace std ;
main()
{
int n=10, p=5, q=10, r ;
r = n == (p = q) ;
cout << "A : n = " << n << " p = " << p << " q = " << q
<< " r = " << r << "\n" ;
n = p = q = 5 ;
n += p += q ;
cout << "B : n = " << n << " p = " << p << " q = " << q << "\n" ;
A : n = 10 p = 10 q = 10 r = 1
B : n = 15 p = 10 q = 5
C : n = 15 p = 11 q = 10
D : n = 16 p = 11 q = 15
10 ditions Eyrolles
exos_c++.book Page 11 Jeudi, 5. juillet 2007 11:10 11
Exercice 7
nonc
Quels rsultats fournira ce programme :
#include <iostream>
using namespace std ;
main()
{ int n, p, q ;
n = 5 ; p = 2 ; /* cas 1 */
q = n++ >p || p++ != 3 ;
cout << "A : n = " << n << " p = " << p << " q = " << q << "\n" ;
n = 5 ; p = 2 ; /* cas 2 */
q = n++<p || p++ != 3 ;
cout << "B : n = " << n << " p = " << p << " q = " << q << "\n" ;
n = 5 ; p = 2 ; /* cas 3 */
q = ++n == 3 && ++p == 3 ;
cout << "C : n = " << n << " p = " << p << " q = " << q << "\n" ;
n = 5 ; p = 2 ; /* cas 4 */
q = ++n == 6 && ++p == 3 ;
cout << "D : n = " << n << " p = " << p << " q = " << q << "\n" ;
}
Il ne faut pas oublier que les oprateurs && et || nvaluent leur second oprande que lorsque
cela est ncessaire. Ainsi, ici, il nest pas valu dans les cas 1 et 3. Voici les rsultats fournis
par ce programme :
A : n = 6 p = 2 q = 1
B : n = 6 p = 3 q = 1
C : n = 6 p = 2 q = 0
D : n = 6 p = 3 q = 1
ditions Eyrolles 11