[console] discriminant d'un polynôme du second degré

Soyez le premier à donner votre avis sur cette source.

Vue 6 138 fois - Téléchargée 170 fois

Description

Comme ce code source est devenu inaccessible du fait d'un plantage du réseau codes-sources le week-end dernier, je le publie de nouveau en attendant de pouvoir supprimer le précédent.

Ce code est en réponse à une question sur le forum, à savoir : calcul du discriminant et des racines d'un polynôme du second degré réalisé dans une application console.

Merci à JMP77 qui s'est exprimé sur ce même sujet en réalisant le tout sous la forme d'une application GUI de laquelle je me suis fortement inspiré (ben oui, mes souvenirs en la matière ayant 30 ans d'âge environ) mais en prenant une petite précaution pas inutile (voir plus bas).

Source / Exemple :


program discriminant;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

const
  T1 = 'Discriminant = ';
  T2 = 'Racine 1 = ';
  T3 = 'Racine 2 = ';
  NoRoots = 'Pas de racine reelles';

var
  A, B, C, D, X1, X2: Double;
  StrA, StrB, StrC: string;
  Response: char;

begin
  Response := ' ';
  SetConsoleTitle('Polynôme du second degré');

  repeat
    Writeln('*********************************************');
    WriteLn('*  Calcul du discriminant et des racines     *');
    Writeln('*      d''un polynome du second degre        *');
    WriteLn('*                                           *');
    WriteLn('* exemple : 2 X^2 + 3 X - 1                 *');
    WriteLn('* Les coefficients A, B et C du polynome    *');
    WriteLn('* ci-dessus sont respectivement :           *');
    WriteLn('* A = 2, B = 3 et C = 1                     *');
    WriteLn('*********************************************');
    WriteLn;
    {Récupération des infos saisies}
    Write('Valeur de A : ');
    Readln(StrA);
    Write('Valeur de B : ');
    Readln(StrB);
    Write('Valeur de C : ');
    Readln(StrC);

    //conversions en flottants
    A := StrToFloatDef(StrA, 0);
    B := StrToFloatDef(StrB, 0);
    C := StrToFloatDef(StrC, 0);

    //Eviter la division par zéro, ça fait désordre...
    if A <> 0 then
    begin
      WriteLn('___________________');
      WriteLn('Resultats :');
      {Calcul}
      D := Sqr(B) - 4 * A * C;
      WriteLn(T1 + FloatToStr(D));

      if D < 0 then
      begin
        WriteLn(T2 + NoRoots);
        WriteLn(T3 + NoRoots);
      end
      else
      begin
        X1 := (-B + SQR(D)) / (2 * A);
        X2 := (-B - SQR(D)) / (2 * A);
        WriteLn(T2 + FloatToStr(X1));
        WriteLn(T3 + FloatToStr(X2));
        WriteLn('*** VERIFICATION ***');
        Write(StrA,' X^2 + ', StrB, ' X + ', StrC, ' = 0 ');
        WriteLn('lorsque X vaut ', FloatToStr(X1), ' ou ', FloatToStr(X2), '.');
      end;
    end
    else
    begin
      WriteLn('A ne doit pas etre nul !');
      MessageBeep(MB_ICONEXCLAMATION);
    end;
    
    WriteLn('Tapez sur une touche pour continuer ou');
    Write('sur la lettre ''Q'' pour quitter...');
    ReadLn(Response);
    WriteLn;
  until UpperCase(Response) = 'Q';
end.

Conclusion :


Dans ce code, vous remarquerez que l'on teste que la valeur de A ne soit pas nulle avant d'effecture une division.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
15
Le disciple a tout à fait raison.

A quand la gestion des racines complexes... Autant aller jusqu'au bout de la formule:

Delta:=b²-4ac
r1:=(-b - i.sqrt(-Delta))/(2a)
r2:=(-b + i.sqrt(-Delta))/(2a)

Avec i le fameux nombre fondamental du domaine complexe défini par i²=-1
Messages postés
68
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
17 août 2005

Oh ! Toutes mes excuses ! Mais alors pourquoi dans l'expression des deux racines réelles c'est SQR(D) et par sqrt(D) ?
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
28
Négatif, cher ami :
La fonction Sqr renvoie le carré de l'argument.
Ce n'est donc pas une étourderie ;o)

Je pense que tu as confondu avec la fonction sqrt qui renvoie la racine carrée (square root).
Messages postés
68
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
17 août 2005

petite étourderie :
le discriminant c'est pas D:=sqr(B)-4*A*C
mais D:=B*B-4*A*C !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.