Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Algoritmo de analisis de integridad de Calculo (https://www.clubdelphi.com/foros/showthread.php?t=64694)

MaMu 15-04-2009 03:54:14

Algoritmo de analisis de integridad de Calculo
 
Algoritmo de analisis de integridad de Calculo

Quiciera desarrollar una función, para analizar la integridad de un calculo matematico con operaciones simples +,-,* y /, usando parentecis, corchetes y llaves.
Unos ejemplos:

(A + B)
[(A+B)*C]-D

serian correctas, y

(A + ) B
(A+B)D*4)

serian incorrectas, puesto a la incosistencia de signos de operacion y/o parentesis.

Me gustaria que me dieran opiniones respecto al tema, e ideas de como lo resolverian.

Saludos y muchas gracias

Delphius 15-04-2009 05:39:05

Hola MaMu,
Creo que para lo que buscas es muy buena idea optar por notación polaca inversa.

La forma en cómo se evalúan los paréntesis, corchetes y llaves, por lo general se consigue con pilas. Se van encolando los signos ( en la medida en que se leen. En cuanto se lee un ) se da por entendido de que una expresión se ha entendido y por tanto se desapila el ( guardado. Este proceso se puede llevar de forma análoga con los corchetes y llaves.

Tal vez lo que se trató en otra ocasión sea de utilidad.

Saludos,

MaMu 16-04-2009 04:57:56

Cita:

Empezado por Delphius (Mensaje 344985)
Hola MaMu,
Creo que para lo que buscas es muy buena idea optar por notación polaca inversa.

Me parece exelente. Pero la verdad, me maree un poco:

Código Delphi [-]
const 
  Abre = '(';
  Cierra = ')';
 
//(1+2)+4*(5+2)
function RPNCalculo(Calculo : String) : Boolean;
var
  nPos, nCalc, Resultado: Integer;
  StrChar: Char;
  Pila : TStringList;
  UltimaOperacion : String;
begin
  result := false;
  Pila := TStringList.Create;
  for nPos := 1 to Length(Calculo) do
  begin
    StrChar := Calculo[nPos];
    if StrChar in ['0','1','2','3','4','5','6','7','8','9'] then
    begin
      Pila.Add(StrChar);
      if (UltimaOperacion<>'') then
      begin
        Resultado := 0;
        for nCalc := 0 to Pila.Count -1 do
        begin
          Resultado := Resultado + StrToInt(Pila.Strings[nCalc]);
        end;
        Pila.Clear;
        Pila.Add(IntToStr(Resultado));
      end;
    end
    else if StrChar in [ABRE,CIERRA] then
    begin
    end
    else if StrChar in ['+','-','*','/'] then
    begin
      if Calculo[nPos + 1] in [ABRE,CIERRA] then
      begin
        UltimaOperacion := '';
      end  
      else UltimaOperacion := StrChar;
    end
    else
    begin
      UltimaOperacion := '';
    end;  
  end;
  Pila.Free;
end;

No se que hago mal, no doy pie con bola de la congestion.
Alguna ayuda????

Saludos y Muchas Gracias

MAXIUM 16-04-2009 05:23:36

Hay componentes que te hacen el trabajo sucio, busca por Parse o Parsing http://www.torry.net/pages.php?id=307


La franja horaria es GMT +2. Ahora son las 17:43:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi