Задача 8 Урок 22 (Задача 2 [!] Pascal.js Алгоритмическая практика)
Primary tabs
Задача 2 [!] Pascal.js Алгоритмическая практика:
Решите на Паскале и/или JS Задачку №8 Урока 22, про расчет выражений вида:
5*(3+4)-7*9+3*(2+(2-7))с помощью рекурсии.
Задача 8 Урок 22
"Калькулятор":
Напишите функцию, которая получает на вход произвольную строку вида:5*(3+4)-7*9+3*(2+(2-7))(арифметическое выражение со скобками любого уровня вложенности и операциями умножения, вычитания и сложения)
и в качестве ответа возвращает результат этого выражения.
Рекомендация: сначала убедитесь, что число открывающих скобок, равно числу закрывающих.
Решение:
function calculateExpression(s: string; var i: integer): integer; var temp, num, n, code: integer; prevOp, currOp: char; close, open: boolean; begin currOp := ' '; prevOp := '+'; result := 0; temp := 0; num := 0; close := true; open := false; while((i <= length(s)) and close) do begin val(s[i], n, code); if (s[i] = '(') then open := true; if ((code = 0) and open) then begin num := calculateExpression(s, i); open := false; end else while (code = 0) do begin num := num * 10 + n; inc(i); val(s[i], n, code); end; if (s[i] = '*') then begin currOp := '*'; if (temp = 0) then temp := num else temp *= num; num := 0; end; if ((s[i] = '+') or (s[i] = '-') or (s[i] = ')') or (i >= length(s))) then begin if (currOp = '*') then temp *= num else temp := num; case prevOp of '+': calculateExpression += temp; '-': calculateExpression -= temp; end; prevOp := s[i]; temp := 0; num := 0; currOp := ' '; if (s[i] = ')') then close := false; end; inc(i); end; end; var s: string; index: integer; begin s := '5*(3+4)-7*9+3*(2+(2-7))'; index := 1; writeln(calculateExpression(s, index)); readln(); end.
Вывод консоли:
Входные данные Результат 5*(3+4)-7*9+3*(2+(2-7)) -37
- Log in to post comments
- 756 reads
vedro-compota
Wed, 07/10/2024 - 01:06
Permalink
function calculateExpression
-- если мы встречаем открывающую скобку, то это значит что мы уже может вызывать рекурсивно функцию начиная с позиции i+1
Предлагаю модифицировать решение, чтобы в нем:
_____________
матфак вгу и остальная классика =)
maxheong54
Wed, 07/10/2024 - 09:16
Permalink
Внес изменения:
1. Рекурсия вызывается с позиции i+1, если встречается открывающая скобка.
2. Убрал флаги close и open.
3. Нет попытки сконвертировать в число символы, которые не конвертируются.
Вывод консоли:
vedro-compota
Wed, 07/10/2024 - 17:21
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)