Прошу администраторов перенести пост в комментарий к похожей
теме, т.к. для написания комментария у меня почему-то не хватает прав(
Функция для калькулятора, поддерживает знаки () +-/*
Входные данные - строка, на выходе - число, например, для 2+2*2-2*(3-4*(-2+1))/2 выдаст ответ -1
Исходный код:
function Calc2(S:string):real;
var
i:integer;
L:integer;
n:integer;
c:Char;
nashel:boolean;
begin
Calc2:=0;
if s<>'' then
if S<>'0' then
begin
n:=StringToInteger(s);
if n<>0 then
Calc2:=n //проверка на число
else
begin
L:=Length(s);
n:=0;
nashel:=false; //знакu + u -
for i:=L downto 0 do
begin
c:=GetChar(s,i);
if c=')' then n:=n+1;
if c='(' then n:=n-1;
if (n=0) and ((c='+') or (c='-')) then
begin
nashel:=true;
break;
end;
end;
if nashel then
begin
if c='+' then
Calc2:=Calc2(copy(s,0,i))+Calc2(copy(s,i+1,L))
else
Calc2:=Calc2(copy(s,0,i))-Calc2(copy(s,i+1,L))
end
else
begin //знаки * и /
for i:=L downto 0 do
begin
c:=GetChar(s,i);
if c=')' then n:=n+1;
if c='(' then n:=n-1;
if (n=0) and ((c='*') or (c='/')) then
begin
nashel:=true;
break;
end;
end;
if nashel then
begin
if c='*' then
Calc2:=Calc2(copy(s,0,i))*Calc2(copy(s,i+1,L))
else
Calc2:=Calc2(copy(s,0,i))/Calc2(copy(s,i+1,L));
end
else
begin
Calc2:=Calc2(copy(s,1,L-1));
end;
end;
end;
end;
end;