Показать сообщение отдельно
Старый 10.05.2012, 19:04   #2
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Калькулятор с приоритетом операций

Прошу администраторов перенести пост в комментарий к похожей теме, т.к. для написания комментария у меня почему-то не хватает прав(

Функция для калькулятора, поддерживает знаки () +-/*
Входные данные - строка, на выходе - число, например, для 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
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
AVL (15.05.2012)