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