unit unit1; interface procedure DelElem(var arr: array of char; i: integer); procedure DelElemnum(var arr: array of real; i: integer); function Kalkulator(orig:string):real; function NUM1(orig:string):real; implementation procedure DelElem(var arr: array of char; i: integer); var j: integer; begin for j:=i to length(arr)-2 do arr[j]:=arr[j+1]; setlength(arr,length(arr)-1); end; procedure DelElemnum(var arr: array of real; i: integer); var j,h: integer; cop: array of real; begin setlength(cop, length(arr)-1); for j := 0 to length(cop) - 1 do if j<>i then begin cop[j]:=arr[j]; end else begin h:=j; break; end; for j:=h to length(cop)-1 do cop[j]:=arr[j+1]; setlength(arr, length(cop)); arr := cop; end; function Kalkulator(orig:string):real; label 1; var Tarr: array of char; cop: string; num: array of real; i, h, g, po, p, j: integer; perem: string; res: real; bool: boolean; begin cop := orig; res := 0; h := 0; p := 0; g := -1; po := 0; for i := 1 to length(cop) do if (cop[i] = '*') or (cop[i] = '/') or (cop[i] = '+') or (cop[i] = '-') then //проверка на существование знаков *, / , - , + begin setlength(tarr, h + 1); //если есть то заносим их в массив-Tarr tarr[h] := cop[i]; po := g + 2;//определяем начало и p := i - 1;//конец значений позийций числа perem := ''; perem := copy(orig, po, p - po + 1);//записываем число ввиде строки в Perem setlength(num, h + 1);//добавляем это число в массив if trystrtofloat(perem,num[h])=false then begin writeln('Невозможно считать строку убедитеть что ввели все без ошибок и повторите еще раз'); result:=0; exit; end; g := p; h := h + 1; end; setlength(num, h + 1); po := g + 2; p := length(orig); perem := copy(orig, po, p - po + 1); num[h] := strtofloat(perem); //разбор на состовляюшие if length(tarr) = 1 then goto 1; repeat if length(tarr) = 0 then goto 1; for i := 0 to length(tarr) - 1 do case tarr[i] of '*': begin unit1.DelElem(tarr, i); res := num[i] * num[i + 1]; unit1.DelElemnum(num, i); num[i] := res; bool := false; break; end; '/': begin res := num[i] / num[i + 1]; unit1.DelElem(tarr, i); unit1.DelElemnum(num, i); num[i] := res; bool := false; break; end else bool := true; end; until bool <> false; 1: result := num[0]; if length(tarr) <> 0 then begin for i := 0 to length(tarr) - 1 do case tarr[i] of '+': result := result + num[i + 1]; '-': result := result - num[i + 1]; '*': result := result * num[i + 1]; '/': result := result / num[i + 1]; end end; end; function NUM1(orig:string):real; var cop: string; bool: boolean; res: real; Re: string; i, j, lan, k,g: integer; begin repeat bool := true; for i := 1 to length(orig) do if orig[i] = '(' then begin k := i; for j := k to length(orig) do if orig[j] = ')' then begin Re := copy(orig, i + 1, j - i - 1); lan := length(re) + 2; delete(orig, i, lan); inc(g); res := unit1.Kalkulator(Re); if (g=1) and (i=1) then orig := floattostr(res) + orig else begin cop:=copy(orig,i,length(orig)-i+1); delete(orig,i,length(orig)-i+1); orig := orig+floattostr(res)+cop; end; bool := false; break; end else begin bool := true; end; break; end else if i = length(orig) then begin bool := true; break; end; until bool = true; result :=Kalkulator(orig); end; begin end.