Choisissez votre style : colorisé, impression

Série 3  (Niveau 0):
Expressions et branchements conditionnels

Cet exercice est disponible en pas à pas (page 16) de l'ouvrage C++ par la pratique

Exercice 0 : Résolution de polynômes de degré 2

Nous voulons écrire un programme permettant de trouver les zéros de polynômes de degré 2 de la forme ax2+bx+c, où les coefficients sont des nombres réels et a est non nul (sans quoi ce ne serait plus un polynôme de degré 2...).

  1. Commencez par ouvrir le fichier (vide) binome.cc dans votre éditeur favori (par exemple Geany).
  2. Préparez la « coquille vide » de base accueillant votre programme :
    #include <iostream>
    using namespace std;
    
    int main()
    {
        return 0;
    }
    

    On peut maintenant commencer à attaquer notre problème.

  3. Commençons donc par prévoir la place pour les trois coefficients de notre polynome : a, b et c. Il faut pour cela déclarer des variables.

    Comme nous souhaitons que ces coefficients soient des nombres réels, nous déclarons des variables de type double  :

    #include <iostream>
    using namespace std;
    
    int main()
    {
      double a;
      double b;
      double c;
    
      return 0;
    }
    

    Note : on aurait aussi pu écrire en une ligne

    double a, b, c;
  4. Maintenant, le réflexe du bon programmeur : il faut penser à initialiser ces variables. Il nous semble ici naturel de les initialiser à zéro :
    #include <iostream>
    using namespace std;
    
    int main()
    {
      double a(0.0);
      double b(0.0);
      double c(0.0);
    
      return 0;
    }
    
  5. Il faut ensuite récupérer les valeurs des paramètres entrés par l'utilisateur. Étant donné que a ne doit pas être nul, nous avons ici un cas typique d'utilisation d'une boucle conditionnelle dans laquelle nous allons justement vérifier cette condition. Nous verons en détail la semaine prochaine comment l'écrire et vous proposons pour le moment simplement de suivre ce qui est fait ici. Nous y reviendrons la semaine prochaine.

    Nous pouvons ensuite acquérir les paramètres b et c.

    #include <iostream>
    using namespace std;
    
    int main()
    {
      double a(0.0);
      double b(0.0);
      double c(0.0);
    
      // tant que a est nul, demander une valeur à l'utilisateur
      do {
        cout << "Entrez une valeur non nulle pour a :";
        cin >> a;
      } while (a == 0.0);
    
      cout << "Entrez une valeur pour b:";
      cin >> b;
      cout << "Entrez une valeur pour c:";
      cin >> c;
    
      return 0;
    }
    
  6. Maintenant que nous connaissons tous les paramètres de l'équation, nous pouvons la résoudre. Il nous faut tout d'abord calculer le déterminant delta = b*b - 4*a*c.

    Il faut donc prévoir de la place pour le stocker : une variable nouvelle de type double.

    On peut ici choisir de la déclarer sans initialisation puis de l'affecter à la bonne valeur juste ensuite ou alors choisir de l'initialiser directement avec b*b - 4*a*c puisque toutes ces valeurs sont connues à ce stade là. C'est cette seconde solution qui est choisie ici :

    #include <iostream>
    using namespace std;
    
    int main()
    {
      double a(0.0);
      double b(0.0);
      double c(0.0);
    
      // tant que a est nul, demander une valeur à l'utilisateur
      do {
        cout << "Entrez une valeur non nulle pour a :";
        cin >> a;
      } while (a == 0.0);
    
      cout << "Entrez une valeur pour b:";
      cin >> b;
      cout << "Entrez une valeur pour c:";
      cin >> c;
    
      double delta(b * b - 4.0 * a * c);
    
      return 0;
    }
    
  7. Pour le calcul de la solution, différents cas peuvent se produire en fonction de la valeur prise par le déterminant, que nous distinguons dans le programme à l'aide de blocs if-else :

    • Si delta est négatif, il n'y a pas de solution réelles.
    • Si delta est nul, la solution est unique et vaut -b/2a.
    • Autrement, les solutions sont (-b ± sqrt(delta))/2a).

    La fonction permettant de calculer des racines carrées s'appelle sqrt(), qui vient de l'anglais "square root".
    Il est possible d'utiliser cette fonction (ainsi que d'autres fonctions mathématiques, cf. exercice 4 de la série) en ajoutant #include <cmath> au début du fichier. Les détails de cette instruction seront expliqués plus tard dans le cours.

    Le programme complet devient donc :

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main()
    {
      double a(0.0);
      double b(0.0);
      double c(0.0);
    
      // tant que a est nul, demander une valeur à l'utilisateur
      do {
        cout << "Entrez une valeur non nulle pour a :";
        cin >> a;
      } while (a == 0.0);
    
      cout << "Entrez une valeur pour b :";
      cin >> b;
      cout << "Entrez une valeur pour c :";
      cin >> c;
    
      double delta (b*b - 4.0*a*c);
    
      if (delta < 0.0) {
        cout << "Pas de solutions réelles." << endl;
      } else if (delta > 0.0) {
        cout << "Deux solutions : " << (-b-sqrt(delta))/(2.0*a)
             << " et " << (-b+sqrt(delta))/(2.0*a) << endl;
      } else {
        cout << "Une solution unique : " << -b/(2.0*a) << endl;
      }
    
      return 0;
    }
    

Retour à la série
Dernière mise à jour : $Date: 2017/09/28 18:03:01 $ ($Revision: 1.5 $)