Нужна ! ( или хотя бы объясните, как из обычной получить постфиксную форму. вот, , которые нужно переделать в постфиксной форме: 1. (a+b)*(c+2*d) 2.(2*a-3*d)*c+2*b 3.(a+b+2*c)*d 4. 3*a - (2*b+c) * d

alina20067 alina20067    3   10.06.2019 17:40    1

Ответы
Duglas17 Duglas17  08.07.2020 23:54
Постфиксная (она же - обратная польская запись, польская - потому что введена польским математиком Яном Лукашевичем) - это запись, в которой сначала следуют операнды, а затем знаки операций. Удобна для организации вычислений, потому что не требует для записи скобок и может вычисляться по мере считывания. Для преобразования обычной записи в польскую удобно использовать логическую структуру, называемую стеком (stack).
Поскольку нам не надо составлять алгоритм, а только перевести привычную запись в постфиксную, при переводе будем просто рассуждать.
1. (a+b)*(c+2*d)
Первая операция - a+b. Её постфиксная запись (далее - ПЗ) выглядит как ab+
и понимается так: "взять а, взять b, сложить"
Следующая операция 2*d, в ПЗ это 2d*. Т.е по сути мы меняем местами знак операции и второй операнд.
Третья операция - вычисление c+2*d. В ПЗ мы запишем (с учетом предыдущего) 2d*c+. У нас уже была операция 2d*, теперь мы прибавляем к результату c.
Содержимое обоих скобок вычислено, осталось выполнить умножение.
Получаем в ПЗ: ab+2d*c+*
Как это будет вычисляться?
Считываем a. Считываем b. Считываем знак операции +. Выполняем операцию, получая a+b. Обозначим результат R и тогда текущее состояние вычисляемого выражения будет R2d*c+*
Считываем 2. Считываем d. Считываем знак операции * (заметим, что читать надо, пока не встретим знак операции). Перемножаем два операнда, предшествующие операции. Получаем S=2*d. Текущее состояние вычисляемого выражения будет RSc+*
Считываем операнд с. Считываем знак операции +. Складываем два операнда, предшествующие операции. Получаем S=S+c. Почему не вводим новой переменной? Потому что один из операндов - временная переменная, следовательно её прежнее значение не нужно. Текущее состояние вычисляемого выражения будет RS*
Считываем знак операции *. Перемножаем два операнда, предшествующие операции. Получаем R=R*S. Все выражение просмотрено, следовательно вычисление завершено.
Второй пример не будем столь подробно разбирать.
2. (2*a-3*d)*c+2*b
Тут операции в ПЗ будут 2a*, 3d*, 2a*3d*- (первая скобка), далее 2a*3d*-с*, 2b* и окончательно 2a*3d*-c*2b*+
Читаем: 2 и a умножить, 3 и d умножить, из первого произведения вычесть второе, результат и с умножить, 2 и b умножить и два последних результат сложить. Все верно.
3. (a+b+2*c)*d
ab+, 2c*, вся скобка ab+2c*+, окончательно ab+2c*+d*
4. 3*a-(2*b+c)*d
В ПЗ: 3a*2b*c+d*-
Проверим: 3 и a умножить, запомнить, 2 и b умножить, с прибавить, на d умножить, из запомненного вычесть. Все верно.
ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика