Подсчитать результат, выполняя арифметические операции в порядке их приоритета - 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 пуст, то выводится сообщение об ошибке и программа завершается.
- Выводится результат выполнения выражения.