Section courante

A propos

Section administrative du site

Introduction

L'évaluation d'une expression sans utiliser de pile n'est malheureusement pas aussi fiable. Le principe est simple, il faut parcourir la chaine de caractères et tenter de simplifié l'expression en enlevant dans la chaine de caractères les parties de l'expression résolu et recopie les solutions dans la chaine de caractères jusqu'à ce qu'il n'y est plus rien à résoudre. Cet algorithme nécessite un langage de programmation très fort dans la manipulation des chaines de caractères, ainsi, cet algorithme devient assez fastidieux en langage de programmation comme le C. Il est donc préférable d'utiliser du Pascal ou du Basic.

Exemple

L'exemple suivant, écrit en Free Pascal, permet de monter comment cet algorithme fonctionne :

  1. Program EvalRawSamples;
  2.  
  3. Function Formula(S:String):Real;
  4. Const
  5.  O : Array[0..3] of Char = '*/+-';
  6. Var
  7.  H,I,J:Byte;
  8.  a,b:Real;
  9.  Err:Word;
  10.  aS,bS,T:String;
  11.  BreakWhile:Boolean;
  12. Begin
  13.  Formula := 0.0;
  14.  If(S = '')Then Exit;
  15.  For H := 0 to 3 do While (Pos(O[H],S) > 0) do Begin
  16.   J := 1;
  17.   I := 1;
  18.   BreakWhile := False;
  19.   While (Not BreakWhile) and (I <= Length(S)) do Begin
  20.    BreakWhile := False;
  21.    If(S[I] = O[H])Then
  22.    Begin
  23.     aS := Copy(S,J,I-J);
  24.     Inc(I);
  25.     bS := '';
  26.     While (S[I] in ['0'..'9','.','E']) do Begin
  27.      bS := bS + S[I];
  28.      Inc(I);
  29.      If(I > Length(S))Then Break;
  30.     End;
  31.     Val(aS,a,Err);
  32.     Val(bS,b,Err);
  33.     Case H of
  34.      0 : Str(a * b:1:38,T);
  35.      1 : Str(a / b:1:38,T);
  36.      2 : Str(a + b:1:38,T);
  37.      3 : Str(a - b:1:38,T);
  38.     End;
  39.     S := Copy(S,1,J-1) + T + Copy(S,I,255);
  40.     If aS = ''Then Begin
  41.      Val(S,a,Err);
  42.      Formula := a;
  43.      Exit;
  44.     End;
  45.     BreakWhile := True;
  46.    End
  47.     Else
  48.    If Not(S[I] in ['0'..'9','.','E'])Then J := I + 1;
  49.    Inc(I);
  50.   End;
  51.  End;
  52.  Val(S,a,Err);
  53.  Formula := a;
  54. End;
  55.  
  56. BEGIN
  57.  WriteLn('8+8=',Formula('8+8'):0:0);
  58.  WriteLn('8*8+3=',Formula('8*8+3'):0:0);
  59.  WriteLn('8-9=',Formula('8-9'):0:0);
  60.  WriteLn('-9*3=',Formula('-9*3'):0:0);
  61.  WriteLn('9.3*9.1+9.0625*9.67/3.34*3+7.8=',Formula('9.3*9.1+9.0625*9.67/3.34*3+7.8'):0:3);
  62. END.
  63.  

on obtiendra le résultat suivant :

8+8=16
8*8+3=67
8-9=-1
-9*3=-27
9.3*9.1+9.0625*9.67/3.34*3+7.8=101.176


Dernière mise à jour : Vendredi, le 21 avril 2017