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. |
|