Задача 8 Урок 20
Primary tabs
Напишите функцию, которая получает на вход произвольную строку вида:
5*(3+4)-7*9+3*(2+(2-7))(арифметическое выражение со скобками любого уровня вложенности и операциями умножения, вычитания и сложения)
и в качестве ответа возвращает результат этого выражения.
Рекомендация: сначала убедитесь, что число открывающих скобок, равно числу закрывающих.
Примечание: алгоритмически похожая задача использовалась на собеседовании стажеров в DataArt.
var
s: string;
j: integer;
function calculator(s: string; var j: integer): integer;
var
pred_x, pendent_x, len: integer;
pred_op, op, pendent_op: char;
strx: string;
begin
len:=length(s);
result:=-1;
pendent_x:=-1;
op:='0';
pendent_op:='0';
strx:='';
while (j<=len) and (s[j]<>')') do
begin
if (s[j] in ['0'..'9']) then
begin
strx:=strx+s[j];
if (j<len) and (s[j+1]<>')') then
begin
j:=j+1;
continue;
end;
end ;
pred_op:=op;
pred_x:=result;
if (s[j]='(') then
begin
j:=j+1;
result:=calculator(s, j);
j:=j+1;//пролистнули закрывающуюся скобку
end else
begin
val(strx, result);
strx:='';
end;
op:=s[j];
if (pred_op='*') then result:=pred_x*result;
if (op in ['+', '-']) or (j=len) or (s[j+1]=')') then
begin
case pred_op of
'+': result:=pred_x+result;
'-': result:=pred_x-result;
end;
case pendent_op of
'+': result:=pendent_x+result;
'-': result:=pendent_x-result;
end;
pendent_op:='0';
end;
if (op = '*') and (pred_op in ['+', '-']) then
begin
pendent_op:=pred_op;
pendent_x:=pred_x;
end;
j:=j+1;
end;
end;
begin
writeln('Введите выражение.');
readln(s);
j:=1;
writeln('Результат: ', calculator(s, j));
readln();
end. Консоль:
Введите исходное выражение 5*(3+4)-7*9+3*(2+(2-7)) Результат: -37
- Log in to post comments
- 1081 reads
vedro-compota
Mon, 07/17/2023 - 19:41
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)