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é :
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 :
Trois cas sont alors possibles suivant le signe de Delta :
-b / (2 × a)
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...
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;
procedure TfmPrinc.btQuitterClick(Sender: TObject);
begin
Close;
end;
procedure TfmPrinc.FormShow(Sender: TObject);
begin
btReInit.Click;
end;
var
CoefA, CoefB, CoefC,
Delta,
Solution1, Solution2: Single;
CoefA := StrToFloat(edCoefA.Text);
CoefB := StrToFloat(edCoefB.Text);
CoefC := StrToFloat(edCoefC.Text);
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.
meResult.Lines.Add('Equation : '+FloatToStr(CoefA) + 'X² + ' +
FloatToStr(CoefB) + 'X + ' + FloatToStr(CoefC) + ' = 0');
Delta := CoefB * CoefB - 4 * CoefA * CoefC; { b * b - 4 * a * c }
meResult.Lines.Add('Delta vaut ' + FloatToStr(Delta));
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.
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));
meResult.Lines.Add('Le système n''admet pas de solution')
Solution1 := - CoefB / (2 * CoefA);
meResult.Lines.Add('Le système admet une seule solution égale à ' +
FloatToStr(Solution1));
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.
Code source du projet : 03_equation_second_degre