Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Reconocedor de funciones? (https://www.clubdelphi.com/foros/showthread.php?t=2009)

Magneto 05-07-2003 06:34:30

¿Reconocedor de funciones?
 
¡Saludos!
Estoy haciendo un programa al cual le pueda ingresar funciones mediante el teclado (a través de un edit, por ejemplo) y hacer que el programa reconozca la cadena como una función (si le escribo por ejemplo "sen(x^2+1)") y que luego me grafique la función puesta. Sé cómo hacer para graficarla, pero no he podido hacer que reconozca el texto ingresado. ¿Alguien me puede ayudar? He intentado varias cosas y he tenido algunos "éxitos".....casi.....

Lepe 05-07-2003 12:25:09

Mira este hilo, creo que la solucion que propone Roman puede servirte de iniciacion a tu problema:

http://www.clubdelphi.com/foros/show...ht=matchesmask

andres1569 05-07-2003 13:29:22

Hola:

Bueno, creo que a lo que se refiere Magneto es a identificar los comandos que se escriben en el Edit y a traducirlo en operaciones matemáticas.

Lo que pides te va a costar un poco bastante de implementar, aunque seguro que ya hay por ahí algo hecho. Si te sirve de orientación mírate la clase TParser en la unit classes, y mejor aún la clase TExprParser en la unit dbcommon que es utilizada por Delphi para analizar sentencias SQL. Te puede servir como ejemplo para ir desmenuzando los elementos de una cadena en operaciones simples.

A modo de orientación, deberás definirte un conjunto de todas las operaciones posibles, y a medida que vas desmenuzando la cadena, ir almacenando las operaciones en un array (junto a los factores / sumandos ... asociados), por orden de ejecución (mirar los paréntesis) para luego pasarle a una rutina inteligente ese array y que te genere coordenadas Y, a partir de coordenadas X.

Un ejemplo al vuelo de esto último:
Código:

TOperacion = (opSuma, opResta, opProducto, opDivision);

TNodoOperacion = class
private
  FOperacion : TOperacion;
public
  constructor Create (AOperacion : TOperacion);
  function DevuelveValor (AParametros: array of Double) : Double;
end;

constructor TNodoOperacion.Create (AOperacion : TOperacion);
begin
  FOperacion := AOperacion;
end;

function TNodoOperacion.DevuelveValor (AParametros: array of Double) : Double;
var
  i : Integer;
begin
  result := 0;
  Case FOperacion of
      opSuma : for i:=Low(AParametros) to High (AParametros) do
                  Inc(result, AParametros[i]);
      opResta : ...
  opProducto : ...
  opDivision : ...
  end;
end;

De esta forma al analizar la cadena, vas creas objetos del tipo TNodoOperacion, en el Create les pasas el tipo de Operacion que es cada uno. Para esa lista te puedes valer de un TList, que te permite inserciones, puesto que al analizar la cadena no puedes saber de antemano si las operaciones que vas encontrando se analizarán en el mismo orden.

Una vez confeccionada la lista, no hay más que recorrerla e ir calculando valores.


La franja horaria es GMT +2. Ahora son las 00:10:31.

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