
- •Тема 6. РЕШЕНИЕ ЗАДАЧ С
- •Задача вычисления арифметических выражений
- •Обратная польская запись
- •Описание класса для расшифровки и вычисления арифметических выражений
- •пояснения
- •Метод AV(strp:string)
- •Алгоритм вычисления выражения в ОПЗ
- •Алгоритм вычисления выражения в ОПЗ
- •Метод AV (начало)
- •Метод AV (продолжение)
- •Пример вычисления выражения
- •Метод
- •Алгоритм преобразования выражения из инфиксной формы в форму ОПЗ
- •Формулировка алгоритма
- •Формулировка алгоритма
- •стек
- •Пример перевода в ОПЗ
- •Пример перевода в ОПЗ
- •Пример перевода в ОПЗ
- •Программная реализация алгоритма Дейкстры (начало)
- •Программная реализация алгоритма Дейкстры
- •Программная реализация алгоритма
- •Программная реализация алгоритма
- •Сложение больших целых чисел
- •Заметим, что перевернуть список довольно просто
- •Пример алгоритма сложения
- •Описание используемого класса
- •Контрольные вопросы на экзамене
- •Задача 11 на экзамен
- •Задача 12 на экзамен
Тема 6. РЕШЕНИЕ ЗАДАЧ С
ИСПОЛЬЗОВАНИЕМ ЛИНЕЙНЫХ СВЯЗАННЫХ СПИСКОВ
Задача вычисления
арифметических выражений
Сложение больших целых
чисел
07/02/19 |
1 |
Задача вычисления арифметических выражений
Одной из задач при разработке трансляторов является задача расшифровки арифметических выражений, например, вида:
r:=(a+b)*(c+d)-e;
Запись выражения вида a+b называется инфиксной формой,
a и b операнды, + операция.
Возможны также другие формы записи этого выражения:
+ab префиксная,
ab+ постфиксная.
В наиболее распространенной инфиксной форме для указания последовательности выполнения операций необходимо
расставлять скобки.
07/02/19 |
2 |
Обратная польская запись
Польский математик Я. Лукашевич обратил внимание на тот факт, что при записи выражений в постфиксной форме ab+ скобки не нужны, а последовательность операндов и операций удобна для расшифровки основанной на применении эффективных методов.
Поэтому постфиксная запись выражений получила название
обратной польской записи (ОПЗ).
Например, вышеприведенное выражение
r=(a+b)*(c+d)-e; |
в ОПЗ r=ab+cd+*e–; |
r=a+b-c; ab+c-
r=c*(a+b-c); cab+c-*
Конечно, эти выражения менее наглядны и плохо
воспринимаются с непривычки, однако как мы увидим далее, они очень удобны для вычислений
07/02/19 |
3 |
Описание класса для расшифровки и вычисления арифметических выражений
•Используем класс TList, в котором
•Type Tinf=Char;
•Поиск нам не нужен, поэтому нет Key
•Нам понадобятся методы работы со стеком:
•Create, Read1, Add1
•Type
•Tpz=class(TList)
• |
zn:array[’a’..’я’]of extended; |
|
• |
stec:Tlist; |
|
• |
Procedure OBP(Var stri,strp:string); |
|
• |
Function AV(strp:string):extended; |
|
• |
End; |
4 |
|
07/02/19 |
пояснения
Для простоты используем однобуквенные операнды a – z в выражениях. Символы, расположенные после z используем как промежуточные.
Если имеется выражение a+b, то задание значений производится следующим образом
zn[’a’]:=2.5;zn[’b’]:=4;
07/02/19 |
5 |
Метод AV(strp:string)
вычисляет значение выражения, записанного в ОПЗ:
Var strp:string; r:extended; pz:Tpz;
zn[’a’]:=2.5;
zn[’b’]:=4;
strp:=’ab+’;
r:=pz.AV(strp);
В r будет 6.5
07/02/19 |
6 |
Алгоритм вычисления выражения в ОПЗ
основан на использовании стека.
При просмотре выражения слева направо каждый операнд заносится в стек.
В результате для каждой операции, относящиеся к ней операнды будут двумя верхними элементами стека.
Если символ является операцией, то берем из стека два операнда, выполняем над ними эту операцию и результат помещаем в стек.
07/02/19 |
7 |

Алгоритм вычисления выражения в ОПЗ
R:=ab+c*
a b |
+ |
a |
+ b |
д |
д |
|
|
|
|
д с |
* |
д + с |
ж |
ж |
Результат находится в ж
07/02/19 |
8 |

|
Еще пример |
|
R:= ab+cd+*e–; |
||
|
||
|
|
a b |
+ |
a + b |
д |
д |
|
|
|
|
д c d |
+ |
c + d |
ж |
д ж |
д ж |
* |
д * ж |
з |
з |
з e |
- |
з * e |
и |
и |
Результат находится в |
и |
07/02/19 |
9 |
Метод AV (начало)
•Function Tpz.AV(strp:string):extended;
•Var ch,ch1,ch2,chr:char;
•op1,op2,rez:extended;
•begin
•stec:=Tlist.create;
•chr:=Succ(’z’); //следующий за ’z’ символ
•for i:=1 to Length(strp) do
• |
begin |
• |
ch:=strp[i]; |
• |
if not ch in [’*’,’/’,’+’,’-’,’^’] |
• |
then stec.Add1(ch) |
• |
else … |
|
07/02/19 |
10 |