| Romeo_sh 
 
  
 Member
 | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Фух, вроде получилось решить выражение со скобками правда ограничение на вложенность скобок - 1 уровень, и с отрицательными числами пока не работает, но при желании можно проапгрейдить.
 
 Может кому тоже пригодится.
 
 Кстати может у меня где баги и ошибки закрались, как не нужно делать, если кто может - пробегитесь свежим взглядом плиз, а то в прошлый раз я лоханулся
   
 
 Код:
 | program test;
 
 uses strutils, sysutils;
 
 {функция вычисляет простое выражение типа 6*8, возвращает результат (48) в виде строки}
 function calc_simple(str:string):string;
 var
 oper:string;
 operindex, i, number1, number2: integer;
 result:integer;
 begin
 for i:=1 to length(str) do
 if str[i] in ['+','-','*','/'] then operindex:=i;
 oper:=copy(str,operindex,1);
 number1:=StrToInt(copy(str,1,operindex-1));
 number2:=StrToInt(copy(str,operindex+1,999));
 
 if oper='*' then
 result:=number1*number2;
 if oper='+' then
 result:=number1+number2;
 if oper='-' then
 result:=number1-number2;
 if oper='/' then
 result:=round(number1/number2);
 
 calc_simple:=IntToStr(result);
 
 end;
 
 {функция вычисляет выражение из нескольких операций вида 2+2*2}
 function calc_complex(str:string):string;
 var
 posx, i:integer;
 starting,ending:integer;
 substr:string;
 
 begin
 {ищем операции в порядке приоритета}
 posx:=pos('/',str);
 if posx=0 then
 posx:=pos('*',str)
 else if posx>pos('*',str) then
 posx:=pos('*',str);
 if posx=0 then posx:=pos('+',str);
 if posx=0 then posx:=pos('-',str);
 
 if posx>0 then
 begin
 starting:=1;
 ending:=length(str);
 for i:=1 to posx-1 do
 if str[posx-i] in ['*','/','+','-'] then
 begin
 starting:=posx-i+1;
 break;
 end;
 for i:=posx+1 to length(str) do
 if str[i] in ['*','/','+','-'] then
 begin
 ending:=i-1;
 break;
 end;
 substr:=calc_simple(copy(str,starting,ending-starting+1));
 str:=StringReplace(str, copy(str,starting,ending-starting+1), substr,[]);
 calc_complex:=calc_complex(str);
 end
 else
 calc_complex:=str;
 end;
 
 {функция вычисляет выражение со скобками, раскладывая его на более простые и вычисляя их}
 function calc_wbrackets(str:string):string;
 var
 substr, substrnew: string;
 begin
 while pos('(',str)>0 do
 begin
 substr:=copy(str,pos('(',str)+1,pos(')',str)-pos('(',str)-1);
 substrnew:=calc_complex(substr);
 str:=StringReplace(str,'('+substr+')',substrnew,[]);
 end;
 calc_wbrackets:=calc_complex(str);
 end;
 
 var
 str,result:string;
 begin
 str:='50*8-(5-2)*3/9*(3*2-1)';
 result:=calc_wbrackets(str);
 writeln(result);
 
 end.
 
 | 
 |