Подсчитать результат, выполняя арифметические операции в порядке их приоритета - PascalABC.NET
Формулировка задачи:
Строка – это правильное арифметическое выражение, содержащее только натуральные числа и знаки арифметических операций между ними (+, -, *, /). Подсчитать результат, выполняя арифметические операции в порядке их приоритета.
Входные данные:
5*3-9/3
Выходные данные:
12
Решение задачи: «Подсчитать результат, выполняя арифметические операции в порядке их приоритета»
textual
Листинг программы
begin var s := ReadLnString('Введите выражение:'); var nums := New List<real>; var op := New List<char>; var n := 0; foreach var c in s do case c of #48..#57 : n := n * 10 + StrToInt(c); '+', '-', '*', '/' : begin nums.Add(n); n := 0; op.Add(c); end; else WriteLn('Встречен неожиданный символ «', c, '» в позиции ', Pos(c, s), '.', NewLine, 'Работа прекращена.'); Halt; end; if n > 0 then nums.Add(n); var opIndex := 0; repeat if (op[opIndex] = '*') or (op[opIndex] = '/') then begin if op[opIndex] = '*' then nums[opIndex] := nums[opIndex] * nums[opIndex + 1] else nums[opIndex] := nums[opIndex] / nums[opIndex + 1]; nums.RemoveAt(opIndex + 1); op.RemoveAt(opIndex); end else opIndex += 1; until opIndex = op.Count; repeat case op[0] of '+' : nums[0] := nums[0] + nums[1]; '-' : nums[0] := nums[0] - nums[1]; end; nums.RemoveAt(1); op.RemoveAt(0); until op.Count = 0; WriteLn(s, ' = ', nums[0]); end.
Объяснение кода листинга программы
- Программа запрашивает у пользователя ввод выражения и сохраняет его в переменную s.
- Переменная nums инициализируется как пустой список, который будет содержать числовые значения выражения.
- Переменная op инициализируется как пустой список, который будет содержать операции, которые нужно выполнить.
- Переменная n инициализируется как 0 и используется для подсчета числового значения выражения.
- В цикле foreach перебираются все символы в выражении.
- Если символ является числом (от #48 до #57), то он преобразуется в число и умножается на n, после чего добавляется в список nums и n обнуляется.
- Если символ является оператором (+, -, *, /), то числовое значение n добавляется в список nums, n обнуляется и оператор добавляется в список op.
- Если символ не является числом или оператором, то выводится сообщение об ошибке и программа завершается.
- Если n больше 0, то его значение добавляется в список nums.
- Переменная opIndex инициализируется как 0 и используется для индексации списка op.
- В цикле repeat выполняются операции из списка op.
- Если операция является умножением или делением, то выполняется соответствующая арифметическая операция и значение оператора удаляется из списка op.
- Если операция является сложением или вычитанием, то выполняется соответствующая арифметическая операция и значения, которые были на позициях 0 и 1 в списке nums, удаляются из списка.
- Если список op пуст, то выполняется цикл repeat, который выполняется до тех пор, пока в списке nums не останется только одно значение.
- В цикле repeat выполняются операции из списка op.
- Если операция является сложением или вычитанием, то выполняется соответствующая арифметическая операция и значение на позиции 1 в списке nums удаляется.
- Если операция является умножением или делением, то выполняется соответствующая арифметическая операция и значения на позициях 0 и 1 в списке nums удаляются.
- Если список nums пуст, то выводится сообщение об ошибке и программа завершается.
- Выводится результат выполнения выражения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д