Les traigo una funcion hecha en delphi para hacer operaciones matematicas como la suma,resta,multiplciacion y potencia
utilizando string
Ejemplo tenemos la operacion ---------->(5*3)+(2^4)-(2*-3) en vez de estar realizando la operacion paso por paso la metemos dentro de un string y la evaluamos directamente
con nuestra funcion y dara el resultado correcto
al utilizar la funcion es necesario especificar los operadores aritmeticos porque sino dara error
abajo les dejo un ejemplo de su uso
Mostrar/Ocultar
program Project1;
{$APPTYPE CONSOLE}
{$WriteableConst On}//esta directiva es necearia para modificar constantes
uses
SysUtils,Math;
// Grammar:
// expression = term | expression `+` term | expression `-` term
// term = factor | term `*` factor | term `/` factor | term brackets
// factor = brackets | number | factor `^` factor
// brackets = `(` expression `)`
//Esta funcion utliza recursividad mutua
function EvaluarString(const str:string):double;
const
pos:integer=0;//inicia en cero para despues convertirse en 1
var
c:integer;
procedure eatChar; //va obteniendo caracter por caracter excepto los vacios
begin
inc(pos);
if pos<=length(str) then c:=ord(str[pos])
else c:=0;
end;
procedure eatSpace; //come los espacions en blanco
begin
while c=32 do eatChar;
end;
function parseExpresion:double; forward; //prototipo de la funcion
function parseTerm:double; forward; //prototipo de la funcion
function parseFactor:double; forward; //prototipo de la funcion
function parse:double;
var
v:double;
begin
eatChar();
v:=parseExpresion();
if c<>0 then
begin
writeln('Error en el simbolo ',char(c));
Result:=0.0;
Exit;
end;
Result:=v;
end;
function parseExpresion:double;
var
v:double;
begin
v:=parseTerm();
while(true)do
begin
eatSpace();
if c=ord('+') then //suma
begin
eatChar();
v:=v+parseTerm();
end
else if c=ord('-') then //resta
begin
eatChar();
v:=v-parseTerm();
end
else
begin
Result:=v;
break;//necesario si no entra en un bucle sin fin
end;
end;
end;
function parseTerm:double;
var
v:double;
begin
v:=parseFactor();
while True do
begin
eatSpace();
if c=ord('/') then
begin
eatChar;
v:=v/parseFactor;
end
else if((c=ord('*')) or (c=ord('('))) then //multiplicacion
begin
if c=ord('*') then eatChar;
v:=v*parseFactor();
end
else
begin
Result:=v;
break;//necesario si no entra en un bucle sin fin
end;
end;
end;
function parseFactor:double;
var
v:double;
negate:boolean;
sb:string;
begin
negate:=false;
eatSpace;
if c=ord('(') then
begin
eatChar;
v:=parseExpresion;
if c=ord(')') then eatChar;
end
else //numeros
begin
if ((c=ord('+')) or (c=ord('-'))) then //simbolos unarios positivo y negativo
begin
negate:=c=ord('-');
eatChar;
eatSpace;
end;
sb:='';
while (((c>=ord('0'))and (c<=ord('9'))) or (c=ord('.'))) do
begin
sb:=sb+chr(c);
eatChar;
end;
if length(sb)=0 then
begin
writeln('Error no existen caracterese en sb');
result:=0.0;
Exit;
end;
v:=strtofloat(sb);
end;
eatSpace;
if c=ord('^') then //exponente
begin
eatChar;
v:=Math.Power(v,parseFactor);
end;
if negate then v:=-v;
result:=v;
end;
begin
result:=parse();//retorna la operacion
end;
var
e:double;
begin
//Ejemplo de uso
e:=EvaluarString('(5*3)+(5^2)'); //evaluar expresion
writeln(e:0:2);//resultado 40
readln;
end.
Esta funcion esta traducida del java, no recuerdo el nombre del autor orginal si alguien lo asocia hagalo saber