
- •Тема 6. РЕШЕНИЕ ЗАДАЧ С
- •Задача вычисления арифметических выражений
- •Обратная польская запись
- •Описание класса для расшифровки и вычисления арифметических выражений
- •пояснения
- •Метод AV(strp:string)
- •Алгоритм вычисления выражения в ОПЗ
- •Алгоритм вычисления выражения в ОПЗ
- •Метод AV (начало)
- •Метод AV (продолжение)
- •Пример вычисления выражения
- •Метод
- •Алгоритм преобразования выражения из инфиксной формы в форму ОПЗ
- •Формулировка алгоритма
- •Формулировка алгоритма
- •стек
- •Пример перевода в ОПЗ
- •Пример перевода в ОПЗ
- •Пример перевода в ОПЗ
- •Программная реализация алгоритма Дейкстры (начало)
- •Программная реализация алгоритма Дейкстры
- •Программная реализация алгоритма
- •Программная реализация алгоритма
- •Сложение больших целых чисел
- •Заметим, что перевернуть список довольно просто
- •Пример алгоритма сложения
- •Описание используемого класса
- •Контрольные вопросы на экзамене
- •Задача 11 на экзамен
- •Задача 12 на экзамен
Программная реализация алгоритма Дейкстры (начало)
•Procedure Tpz.OBP(Var stri,strp:string);
•Function prior(ch:char):byte;
•begin
• |
case ch of |
• |
’(’,’)’:prior:=0; |
• |
’+’,’-’:prior:=1; |
• |
’*’,’/’:proir:=2; |
• |
’^’:proir:=3; |
• |
end; |
•end;
•Var pc:0..3;
•i:byte;ch,ch1:char;
07/02/19 |
21 |
Программная реализация алгоритма Дейкстры
(продолжение1)
•begin strp:=’’;
•stek:=Tlist.create;
•for i:=1 to length(stri) do
•begin
• |
ch:=stri[i]; |
|
• |
if not ch in[’+’,’-’,’*’,’/’,’(’,’)’,’^’] |
|
• |
then |
strp:=strp+ch//операнд в строку |
• |
else //операция |
|
• |
if stek.sp1=Nil then stec.Add1(ch)// стек пуст 1) |
|
• |
else |
|
• |
if ch=’(’then stec.Add1(ch) //откр. Скобка 2) |
|
• |
else |
|
• |
if ch=’)’then // выталкиваем все операции 3) |
07/02/19 |
22 |
Программная реализация алгоритма
Дейкстры (продолжение2)
•// выталкиваем все операции 3)
• |
begin |
• |
stec.Read1(ch); |
• |
While ch<>’(’do //до ближайшей ( |
• |
begin |
• |
strp:=strp+ch;// в strp |
• |
stec.Read1(ch); |
• |
End |
• |
End |
•else //ch=+ - * / ^
•begin // выталкивание более приоритетных 4)
07/02/19 |
23 |
Программная реализация алгоритма
Дейкстры (продолжение3)
•// выталкивание более приоритетных 4)
• |
pc:=prior(ch); |
• |
While (stek.sp1<>Nil) and |
• |
(pc<= prior(stek.sp1.Inf)) do |
• |
begin |
• |
stec.Read1(ch1); |
• |
strp:=strp+ch1; |
• |
end; |
• |
stec.Add1(ch); // добавить после выталкивания |
• |
end; |
•end;//for выталкивание оставшихся операций 5)
•While stek.sp1<>nil do begin stec.Read1(ch);
•strp:=strp+ch end;
•end;//OBP
07/02/19 |
24 |

Сложение больших целых чисел
Задача ставится следующим образом: для двух чисел с произвольным количеством разрядов (превосходящим возможности стандартных ячеек) требуется выполнить операцию сложения.
Число Р, содержащее n разрядов можно представить в виде
односвязного списка sp1 (стек) из отдельных цифр этого числа, причем единицы находятся в конце списка. Так число Р=1256 будет размешено следующим образом (перевернуто!):
sp1
6 |
A |
|
|
5 |
A |
|
|
2 |
A |
|
|
1 |
nil |
|
|
|
|
07/02/19 |
25 |
Заметим, что перевернуть список довольно просто
•Var stk1, stk2:Tlist;
•Var Inf:Tinf;
•Begin
•. . . .
•Stk2:=Tlist.create;
•While stk1.sp1<>nil do begin
•Begin
•stk1.Read1(inf);
•stk2.Add1(inf);
•End;
07/02/19 |
26 |

Пример алгоритма сложения
u=
+
v=
w=
07/02/19
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sp1 |
|
|
|
||||
1 |
|
9 |
|
8 |
|
4 |
|
3 |
|
6 |
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sp1 |
|
||||||
|
|
|
|
|
|
|
|
9 |
|
5 |
|
2 |
|
7 |
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
s= 0 или 1 |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sp1 |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sp1 |
|
||||||
|
|
|
|
|
|
|
3 |
|
6 |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
sp1 |
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
3 |
|
6 |
|
9 |
|
7 |
|
0 |
|
2 |
|
|
|
|
|
|
|
|
|
|
Нужно перевернуть! |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sp1 |
|||
|
|
|
2 |
|
0 |
|
7 |
|
9 |
|
6 |
|
3 |
|
|
|
27 |
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
Описание используемого класса
•Воспользуемся классом TList (стек), в котором тип
информационной ячейки TInf=byte (ключ отсутствует)
•Нам понадобятся методы Read1, Add1
•Исходные и полученое числа размещаются в стеках:
• Var u, v, w:Tlist; // три стека
•после сложения числа в списках u и v сохраняются
07/02/19 |
28 |
|
Метод сложения больших чисел |
• |
Procedure // q=2-10 основание системы счисления |
• |
TListTrn.SmB(u,v:Tlist;var w:Tlist;q:byte); |
•Var s:0..1; t:0..19;
•begin
•w:=Tlist.create;
•s:=0; // s=0 или 1- перенос
• u.sp:=u.sp1; v.sp:=v.sp1;
•While (u.sp<>Nil) and (v.sp<>Nil) do
•begin
• |
t:=u.sp^.Inf+ v.sp^.Inf+s; |
|
• |
w.Add1(t mod q); //остаток |
|
• |
s:=t div q; |
//разряд |
• |
u.sp:=u.sp^.A; v.sp:=v.sp^.A; |
•end;
07/02/19 |
29 |
• |
While u.sp<>Nil do |
//продолжение |
•begin
• |
t:=u.sp.Inf+s; |
• |
w.Add1(t mod q); |
• |
s:=t div q; |
• |
u.sp:=u.sp^.A; |
•end;
•While v.sp<>Nil do
•begin
• |
t:=v.sp.Inf+s; |
• |
w.Add1(t mod q); |
• |
s:=t div q; |
• |
v.sp:=v.sp^.A; |
•end;
•if s>0 then w.Add1(s);
•end;//smb
07/02/19 |
30 |