Задача 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
- 666 reads
vedro-compota
Mon, 07/17/2023 - 19:41
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)