Mini-projet n°3 : Equations du second degré

Enoncé

Le sujet, loin d'effrayer les matheux, est : Calcul des racines d'un trinôme du second degré. Que les non matheux se rassurent, je vais poser plus clairement le problème et faire tous les rappels mathématiques nécessaires.

Le but de l'exercice est de donner les valeurs de X vérifiant l'équation du second degré :

a × X2 + b × X + c = 0

où a, b et c sont des constantes réelles, a non nul.

Nous nous placerons au niveau de la classe de première. Je rappelle que l'existence de solutions dépend d'une valeur Delta calculée à partir de a, b et c. Voici la valeur de Delta :

Delta = b2 - 4 × a × c

Trois cas sont alors possibles suivant le signe de Delta :

Si vous avez suivi la progression normale du guide, vous savez effectuer chacune des opérations nécessaire au calcul de ces solutions (je rappelle cependant que la fonction sqrt permet de calculer une racine carrée).

C'est à vous de déterminer quelles variables et quels types vous allez utiliser. Je ne vous donnerai pas l'interface, mais seulement une idée de ce qu'elle devrait être : elle montrera en haut de la seule fenêtre du logiciel un polynôme avec 3 zones d'éditions pour remplir les valeurs des coéfficients a, b et c. Vous pourrez supposer que l'utilisateur donnera des valeurs réelles correctes, pour cette fois. En dessous, un mémo affichera les résultats des calculs lancés par un bouton : valeur de Delta, existence de solutions et valeurs éventuelles de ces solutions. Un autre bouton effacera le contenu des zones d'édition ainsi que du mémo, et un dernier permettra de quitter le logiciel.

Vous veillerez à certains détails, comme à vérifier que a est bien non nul, sans quoi vos calculs risquent de ne pas fonctionner. Pensez également à initialiser vos variables, et à vider le mémo avant d'y écrire du texte. Vous êtes libre quant aux noms donnés à vos composants et quant aux textes affichés. Veillez cependant à créer une interface agréable que vous apprécieriez vous-même.

En option (pour ceux qui connaissent uniquement) : L'équation admet des solutions non réelles si Delta est négatif. Donnez les solutions dans ce cas.
















Attention, indications et solution ci-dessous...
















Indications
Solution pas à pas
  1. Commencez par créer l'interface ci-dessous (annotée en rouge pour donner les noms des composants) :

  2. Certaines propriétés doivent maintenant être modifiées :
  3. Règlons tout de suite les cas des boutons "Quitter" et "Réinitialiser". Générez la procédure associée à l'événement OnClick du bouton "Réinitialiser". Il faut, depuis cette procédure, effacer le contenu des trois zones d'éditions et du mémo. Pour les zones d'édition, il suffit d'affecter la chaîne vide à la propriété Text de chaque zone. Pour le mémo, il faut appeler la méthode Clear de la propriété objet Lines du mémo. Voici la procédure complète :

    procedure TfmPrinc.btReInitClick(Sender: TObject);
    begin
      { effacement du contenu des trois zones d'édition }
      edCoefA.Text := '';
      edCoefB.Text := '';
      edCoefC.Text := '';
      { effacement du contenu du mémo }
      meResult.Lines.Clear;
    end;

  4. Faites de même pour le bouton Quitter. Ici, c'est encore plus simple, il suffit d'appeler la méthode Close de la fiche, et ce dans une procédure appartenant directement à la fiche. L'appel se fait donc directement en écrivant "Close;". Voici la procédure :

    procedure TfmPrinc.btQuitterClick(Sender: TObject);
    begin
      Close;
    end;

  5. Au lancement de l'application, il faut penser à initialiser les zones d'éditions et le mémo. En fait, l'idéal serait d'appeler automatiquement la procédure associée au bouton Réinitialiser. Pour cela, il suffit d'appeler la méthode Click du bouton, ce qui simule un clic sur ce bouton. La question à se poser est : où va-t-on faire cet appel ?
    La réponse est tout simplement dans l'événement OnShow de la fiche (familiarisez-vous avec ce jargon : en fait, c'est "dans la procédure associée à l'événement OnShow de la fiche", que l'on a raccourci pour faire plus simple). Générez la procédure associée à cet événement. Dans cette procédure, appellez la méthode Click du bouton "btReInit". Voici la procédure :

    procedure TfmPrinc.FormShow(Sender: TObject);
    begin
      btReInit.Click;
    end;

  6. Seul le bouton de calcul reste à programmer, et c'est le gros morceau de ce mini-projet. Générez la procédure associée à l'événement OnClick de ce bouton. Nous allons avoir besoin de diverses variables dans cette procédure : Déclarez donc ces variables. Voici le bloc var correspondant :

    var
      CoefA, CoefB, CoefC,
      Delta,
      Solution1, Solution2: Single;

  7. La première chose à faire est de déterminer les trois coefficients CoefA, CoefB et CoefC. Ceci se fait en récupérant à chaque fois la propriété Text de la zone d'édition correspondante et en la transformant en nombre grâce à StrToFloat. Voici les trois premières instructions de la procédure :

    CoefA := StrToFloat(edCoefA.Text);
    CoefB := StrToFloat(edCoefB.Text);
    CoefC := StrToFloat(edCoefC.Text);

  8. Ensuite, il nous faut envisager deux cas. Soit le coefficient a est non nul et on continue, soit il ne l'est pas et on arrète. Le moyen de réaliser ceci est d'utiliser un appel à Exit (vu au chapitre 6) depuis un bloc if. Voici le bloc permettant de quitter la procédure en emettant un message d'erreur si a est nul :

    if CoefA = 0 then
      begin
        ShowMessage('Erreur: le premier coefficient ne doit pas être nul.');
        exit;
      end;

    Le contenu du bloc est exécuté si a est nul : un message d'erreur est montré à l'utilisateur, puis l'appel à exit termine brutalement la procédure, ce qui permet de règler très rapidement ce cas gènant.

  9. Il est temps d'écrire une première ligne dans le mémo : on va écrire une ligne informant de l'équation résolue :

    meResult.Lines.Add('Equation : '+FloatToStr(CoefA) + 'X² + ' +
      FloatToStr(CoefB) + 'X + ' + FloatToStr(CoefC) + ' = 0');

  10. On peut ensuite calculer la valeur de Delta. On utilise simplement un calcul et une affectation : aucune difficulté ici :

    Delta := CoefB * CoefB - 4 * CoefA * CoefC; { b * b - 4 * a * c }

  11. Il faut maintenant afficher le résultat de ce calcul dans le mémo. Voici l'instruction :

    meResult.Lines.Add('Delta vaut ' + FloatToStr(Delta));

  12. Vient ensuite le moment de discerner trois cas suivant la valeur de Delta. Il va falloir écrire un "double" bloc if, c'est-à-dire deux blocs imbriqués l'un dans l'autre. Voici le squelette de ce bloc :

    if Delta > 0 then
      { Delta positif, deux solutions }
    else if Delta < 0 then
      { Delta négatif, pas de solution }
    else
      { Delta nul, une solution }

    Vous remarquerez qu'on commence par le cas le plus probable, ou tout du moins le plus intéressant. Le cas le moins probable est traité en dernier, de sorte que ce cas ne sera envisagé que lorsque les deux autres ne conviendront pas, c'est-à-dire comme dans la réalité, assez peu souvent.

  13. Le premier cas (a > 0) est le plus intéressant puisqu'il faut calculer deux solutions et les afficher. Le calcul des deux solutions ne doit pas poser de gros problème (comme pour Delta) :

    Solution1 := (- CoefB - sqrt(Delta)) / (2 * CoefA);
    Solution2 := (- CoefB + sqrt(Delta)) / (2 * CoefA);

    L'affichage des résultats des calculs ne posera lui aussi que peu de problèmes :

    meResult.Lines.Add('Le système admet deux solutions égales à ' +
      FloatToStr(Solution1) + ' et ' + FloatToStr(Solution2));

  14. Le second cas n'est pas des plus intéressants car il n'y a pas de solution. On se contente d'informer l'utilisateur de cela :

    meResult.Lines.Add('Le système n''admet pas de solution')

  15. Dans le dernier cas, il n'y a qu'une solution. Son calcul et son affichage sont similaires à ce qui est fait plus haut :

    Solution1 := - CoefB / (2 * CoefA);
    meResult.Lines.Add('Le système admet une seule solution égale à ' +
      FloatToStr(Solution1));

  16. Enfin, on ajoute dans le mémo une ligne séparatrice qui permettra d'ajouter d'autres résultats à la suite sans avoir besoin de l'effacer :

    meResult.Lines.Add('-------------------------------------------------');

Et c'est fini ! Bien sûr, cette solution ne résoud pas le système lorsque Delta est négatif, et mériterait certaines améliorations dans l'affichage de l'équation (lorsque les coefficients sont négatifs par exemple) ou dans l'affichage des solutions (avec moins de décimales...), mais l'esentiel est de vous avoir faità la fois travailler la création d'interface et l'écriture du code source, présentant quelques petites difficultés.

Si vous vous en sentez le courage et si vous avez les connaissances nécessaires, traitez le cas où Delta est négatif, ce n'est pas beaucoup plus compliqué. La solution ne sera pas donnée ici mais vous pouvez me contacter pour l'obtenir (par email uniquement).

Pour consulter la procédure complète ou l'interface de l'application, téléchargez le source complet du mini-projet ci-dessous.

Téléchargement

Code source du projet : 03_equation_second_degre


© Copyright 2000 par Frédéric BEAULIEU. Tous droits de reproduction réservés.