Составить программу выполнения заданных преобразований арифметических выражений с применением деревьев. Преобразование выражения в дерево рекомендуется осуществлять одним из известных методов (Рутисхаузера, Дейкстры и др.). Операнды в обрабатываемых выражениях могут быть целого или вещественного типа (по усмотрению преподавателя). Задания могут быть переформулированы и для булевского типа. Преобразование выражения реализовать в виде набора подпрограмм. Программа должна вводить и печатать выражения в исходном (текстовом) виде, преобразовывать их в деревья, выполнять заданные преобразования путем обращения к подпрограммам и печатать результаты в виде дерева и в текстовом представлении.
Для некоторых задач приводятся примеры, поясняющие постановку задачи. В примерах слева от стрелки приводится фрагмент выражения до, а справа — после выполнения преобразования. Программа должна обрабатывать все вхождения сходных фрагментов в анализируемых выражениях, а не только те, что приведены в примерах.
Программу необходимо проверить на нескольких выражениях, среди которых должны быть выражения, не содержащие преобразуемых элементов, содержащие ровно один такой элемент или несколько элементов, подлежащих преобразованию, причем в «разных» местах дерева.
(a/b) * (c/d) -> (a*c)/(b*d)
Ввод:
(a/b) * (c/d) + x
Фрагмент результата:
Исходное выражение: (((a / b) * (c / d)) + x)
Количество преобразований: 1
Преобразованное выражение: (((a * c) / (b * d)) + x)