Correction 3
Expressions et branchements conditionnels
Les solutions suivantes ne sont évidemment pas uniques. Si vous en trouvez de meilleures (ou si vous trouvez des erreurs), faites-le savoir ! Merci.
Par ailleurs, les solutions proposées correspondent à l'état de vos connaissances au moment où la série est abordée. D'autres solutions pourront être envisagées une fois de nouveaux concepts acquis.
Par ailleurs, les solutions proposées correspondent à l'état de vos connaissances au moment où la série est abordée. D'autres solutions pourront être envisagées une fois de nouveaux concepts acquis.
| Exercice 1 | Exercice 2 | Exercice 3 | Exercice 4 | Exercice 5 |
Exercice 1 : Expressions conditionnelles (niveau 1)
Dans cette exercice, le test sur la parité d'un nombre se fait en examinant le reste de la division entière (opérateur %) par 2 : si ce reste est nul, le nombre est pair. Les tests nécessaires pour vérifier la parité d'un nombre seront faits au moyen de if imbriqués. Dans la ligne 16, on teste si le nombre est nul (c'est le cas le plus simple). Si ce n'est pas le cas nous faisons un premier test pour savoir si le nombre est positif ou négatif (lignes 18 - 24), puis s'il est pair ou impair (lignes 28 - 32).#include <iostream>
using namespace std;
int main()
{
// Demander une valeur à l'utilisateur
cout << "Entrez un nombre entier : ";
int number;
cin >> number;
// Premièrement, on vérifie si le nombre est zéro, car
// dans ce cas le test de parité n'est pas nécessaire
// attention à bien utiliser l'opérateur de comparaison (==) et
// non pas celui d'affectation (=)
if (number == 0) {
cout << "Le nombre est zéro (et il est pair)" << endl;
} else {
// S'il n'est pas nul, voyons quel est son signe
if (number < 0) {
cout << "Le nombre est négatif ";
} else {
cout << "Le nombre est positif ";
}
// Teste la parité: si le reste de la division par deux est zéro
// alors le nombre est pair
if (number % 2 == 0) {
cout << "et pair" << endl;
} else {
cout << "et impair" << endl;
}
}
return 0;
}
Exercice 2
Exercice n°4 (pages 20 et 199) de l'ouvrage C++ par la pratique.
Il s'agissait dans cet exercice de vérifier l'appartenance d'un nombre à l'intervalle I=[-1,1[. En clair, un nombre x est dans I s'il est plus grand ou égal à -1, et s'il est strictement plus petit que 1. En C++, la même phrase s'écrit :
if ( (x >= -1.0) and (x < 1.0) ) {
// x est dans l'intervalle
} else {
// x n'est pas dans l'intervalle
}
et nous aboutissons donc au programme suivant :
#include <iostream>
using namespace std;
int main() {
cout << "Entrez un réel : " ; // demande à l'utilisateur d'entrer un réel
double x ; // déclaration de la variable x
cin >> x ; // enregistre la réponse dans x
if ( (x >= -1.0) and (x < 1.0) ) {
cout << "x appartient à I" << endl;
} else {
cout << "x n'appartient pas à I" << endl;
}
return 0;
}
Voici différents exemples d'exécution du programme :
./intervalle Entrez un nombre décimal : -2.5 x n'appartient pas à I ./intervalle Entrez un nombre décimal : -1 x appartient à I ./intervalle Entrez un nombre décimal : 0.5 x appartient à I ./intervalle Entrez un nombre décimal : 1 x n'appartient pas à I ./intervalle Entrez un nombre décimal : 1.5 x n'appartient pas à I
Exercice 3
Exercice n°4 (pages 20 et 199) de l'ouvrage C++ par la pratique.
Programme :
#include <iostream>
using namespace std;
int main() {
cout << "Entrez un réel : " ; // demande à l'utilisateur d'entrer un réel
double x ; // déclaration de la variable x
cin >> x ; // enregistre la réponse dans x
if ( (not(x < 2.0) and (x < 3.0) )
or (not(x < 0.0) and not(x == 0.0) and ((x < 1.0) or (x == 1.0)))
or (not(x < -10.0) and ((x < -2.0) or (x == -2.0)))
) {
cout << "x appartient à I" << endl;
} else {
cout << "x n'appartient pas à I" << endl;
}
return 0;
}
Voici différents exemples d'exécution du programme :
./intervalle Entrez un nombre décimal : -20 x n'appartient pas à I ./intervalle Entrez un nombre décimal : -10 x appartient à I ./intervalle Entrez un nombre décimal : -2 x appartient à I ./intervalle Entrez un nombre décimal : -1 x n'appartient pas à I ./intervalle Entrez un nombre décimal : 0 x n'appartient pas à I ./intervalle Entrez un nombre décimal : 1 x appartient à I ./intervalle Entrez un nombre décimal : 1.5 x n'appartient pas à I ./intervalle Entrez un nombre décimal : 2 x appartient à I ./intervalle Entrez un nombre décimal : 3 x n'appartient pas à I ./intervalle Entrez un nombre décimal : 4 x n'appartient pas à I
Exercice 4
Exercice n°5 (pages 20 et 200) de l'ouvrage C++ par la pratique.
Programme :
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x; // déclaration
cout << "Entrez un nombre réel : "; // message
cin >> x; // lecture de x
double resultat(0.0);
// Expression 1
cout << "Expression 1 : ";
if (exp(x) == 1.0) /* Condition qui rend la division ci-dessous invalide. *
* On pourrait bien sûr aussi écrire (x == 0.0), mais *
* nous avons ici voulu expliciter la raison de ce test. */
{ cout << "indéfinie" << endl; }
else {
resultat = x / (1.0 - exp(x));
cout << resultat << endl;
}
// Expression 2
cout << "Expression 2 : ";
if ( (x <= 0.0) // condition qui empêche le calcul du log
or (x == 1.0)) // condition qui empêche la division
{ cout << "indéfinie" << endl; }
else {
resultat = x * log(x) * exp( 2.0 / (x-1.0) ) ;
cout << resultat << endl;
}
// Expression 3
cout << "Expression 3 : ";
if ((x*x - 8.0*x < 0.0) /* Condition rend la racine ci-dessous invalide. *
* On pourrait bien sûr aussi écrire : *
* (x > 0.0) and (x < 8.0) *
* mais nous avons ici voulu expliciter la raison *
* de ce test. */
or (x == 2.0)) /* Condition pour empêche la division. *
* On pourrait bien sûr supprimer cette condition qui *
* est incluse dans la précédente, mais nous avons à *
* nouveau voulu illustrer la démarche générale... *
* ...laquelle peut ensuite être simplifiée. */
{ cout << "indéfinie" << endl; }
else {
resultat = ( -x - sqrt(x*x - 8.0*x) ) / (2.0-x) ;
cout << resultat << endl;
}
// Expression 4
cout << "Expression 4 : ";
if (x == 0.0) // pour pouvoir faire la division par x
{ cout << "indefinie" << endl; }
else {
resultat = x*x - 1.0/x; // calcul partiel
if (resultat <= 0.0) // condition pour pouvoir prendre le log de cette expression
{ cout << "indefinie" << endl; }
else {
resultat = (sin(x) - x/20.0) * log(resultat); // calcul partiel
if (resultat < 0.0) // condition pour prendre la racine de cette expression
{ cout << "indefinie" << endl; }
else {
cout << sqrt(resultat) << endl;
}
}
}
return 0;
}
Exercice 5 : équations du 3e degré
Exercice n°10 (pages 23 et 207) de l'ouvrage C++ par la pratique.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
// les trois coefficients
double a0(0.0);
double a1(0.0);
double a2(0.0);
cout << "Entrez a2, puis a1, puis a0 :" << endl;
cin >> a2 >> a1 >> a0;
// calculs intermédiaires
const double Q((3.0 * a1 - a2*a2) / 9.0);
const double R((9.0 * a2 * a1 - 27.0 * a0 - 2.0 * a2*a2*a2) / 54.0);
const double D(Q*Q*Q + R*R);
double S;
double T;
// solutions
double z1;
double z2;
double z3;
if (D < 0.0) { // test du déterminant
// cas de trois racines réelles
T = acos( R / sqrt(-Q*Q*Q) );
z1 = 2.0 * sqrt(-Q) * cos(T/3.0) - a2 / 3.0;
z2 = 2.0 * sqrt(-Q) * cos( (T+2.0*M_PI) / 3.0 ) - a2 / 3.0;
z3 = 2.0 * sqrt(-Q) * cos( (T+4.0*M_PI) / 3.0 ) - a2 / 3.0;
cout << "Trois racines ( " << z1 << " , " << z2
<< " , " << z3 << " )" << endl;
} else {
// cas de moins de trois racines réelles
// calcul de S
double s(R+sqrt(D));
/* Attention: la façon ci-dessous de comparer strictement des doubles
* avec == ou != n'est pas recommandée. Nous aurons l'occasion d'améliorer
* cette solution lorsque vous aurez vu les fonctions */
if (s == 0.0) { S = 0.0; }
else { S = cbrt(s); }
// calcul de T
s = R - sqrt(D);
if (s == 0.0) { T = 0.0; }
else { T = cbrt(s); }
// calcul des solutions
z1 = -a2 / 3.0 + S + T;
if ((D == 0.0) and (S+T != 0.0)) {
z2 = -a2 / 3.0 - (S + T) / 2.0;
cout << "Deux racines..." << endl
<< " l'une simple : " << z1 << endl
<< " l'autre double : " << z2 << endl;
cout << "(pour info D = " << D << ")" << endl;
} else {
cout << "Une seule racine : " << z1 << endl;
}
}
return 0;
}
Dernière mise à jour : 2025/09/24 18:08