Алгоритм вычисления алгебраических выражений

Содержание

Слайд 2

Дано выражение в естественной записи
со скобками вида:
5+8/6+(45-7)/3
Необходимо вычислить значение выражения

Дано выражение в естественной записи со скобками вида: 5+8/6+(45-7)/3 Необходимо вычислить значение выражения

Слайд 3

Первый этап – разбивка на лексемы (парсинг)

Первый этап – разбивка на лексемы (парсинг)

Слайд 4

Лексема это:
Число
Знак операции { + - * / }
Круглые скобки {

Лексема это: Число Знак операции { + - * / } Круглые
( ) }

Слайд 5

Структуры данных:

Используется два стека:
стек операндов (S1)
и стек операций (S2)

Структуры данных: Используется два стека: стек операндов (S1) и стек операций (S2)

Слайд 6

Присваиваем операциям приоритеты:

{ ( } – приоритет 0;
{ + - } –

Присваиваем операциям приоритеты: { ( } – приоритет 0; { + -
приоритет 1;
{ * / } – приоритет 2;
{ ^ } - приоритет 3.

Слайд 7

Второй этап - вычисление

Второй этап - вычисление

Слайд 8

Список лексем исчерпан? Да – на п.7;
Берем очередную лексему;
Это число – кладем

Список лексем исчерпан? Да – на п.7; Берем очередную лексему; Это число
его в стек S1. На п.1;
Это открывающая скобка – кладем её в стек S2. На п.1;
Это операция – сравниваем её приоритет с приоритетом вершины стека S2.
Если приоритет операции ВЫШЕ – кладём операцию в стек S2. На п.1;
Иначе извлекаем из стека S1 ДВА элемента, а из стека S2 – операцию, ВЫПОЛНЯЕМ операцию и результат кладем в стек S1. Повторяем, пока в стеке операций есть операции с приоритетом, равным приоритету пришедшей операции. Пришедшую операцию – в стек!
Это закрывающая скобка – извлекаем из стека S2 операцию, а из стека S1 пары чисел, ВЫПОЛНЯЕМ операцию, результат кладем в стек S1. Повторяем п.6 до появления открывающей скобки. Удаляем ее. На п.1;
Извлекаем из стека S2 операцию, а из стека S1 пары чисел, ВЫПОЛНЯЕМ операцию, результат кладем в стек S1. Повторяем п.7 до исчерпания стека S2. Результат – в S1

Слайд 9

1+5*(6-2)/2

1 ? 1
2 ? +
3 ? 5
4 ? *
5 ? (
6 ? 6

7 ? -
8 ? 2
9

1+5*(6-2)/2 1 ? 1 2 ? + 3 ? 5 4 ?
? )
10 ? /
11 ? 2

Слайд 10

1+5*(6-2)/2

Вх. Сост:
S1 ? { }
S2 ? { }

Вых. Сост:
S1 ? {

1+5*(6-2)/2 Вх. Сост: S1 ? { } S2 ? { } Вых.
1 }
S2 ? { }

Слайд 11

1+5*(6-2)/2

Вх. Сост:
S1 ? { 1 }
S2 ? { }

Вых. Сост:
S1 ?

1+5*(6-2)/2 Вх. Сост: S1 ? { 1 } S2 ? { }
{ 1 }
S2 ? { + }

Слайд 12

1+5*(6-2)/2

Вх. Сост:
S1 ? { 1 }
S2 ? { + }

Вых. Сост:
S1

1+5*(6-2)/2 Вх. Сост: S1 ? { 1 } S2 ? { +
? { 1 5}
S2 ? { + }

Слайд 13

1+5*(6-2)/2

Вх. Сост:
S1 ? { 1 5 }
S2 ? { + }

Вых.

1+5*(6-2)/2 Вх. Сост: S1 ? { 1 5 } S2 ? {
Сост:
S1 ? { 1 5 }
S2 ? { + * }

Prty(*) > Prty(+)

Слайд 14

1+5*(6-2)/2

Вх. Сост:
S1 ? { 1 5 }
S2 ? { + *

1+5*(6-2)/2 Вх. Сост: S1 ? { 1 5 } S2 ? {
}

Вых. Сост:
S1 ? { 1 5 }
S2 ? { + * ( }

Слайд 15

1+5*(6-2)/2

Вх. Сост:
S1 ? { 1 5 }
S2 ? { + *

1+5*(6-2)/2 Вх. Сост: S1 ? { 1 5 } S2 ? {
( }

Вых. Сост:
S1 ? { 1 5 6 }
S2 ? { + * ( }

Слайд 16

1+5*(6-2)/2

Вх. Сост:
S1 ? { 1 5 6 }
S2 ? { +

1+5*(6-2)/2 Вх. Сост: S1 ? { 1 5 6 } S2 ?
* ( }

Вых. Сост:
S1 ? { 1 5 6 }
S2 ? { + * ( - }

Prty(-) > Ptry(()

Слайд 17

1+5*(6-2)/2

Вх. Сост:
S1 ? { 1 5 6 }
S2 ? { +

1+5*(6-2)/2 Вх. Сост: S1 ? { 1 5 6 } S2 ?
* ( -}

Вых. Сост:
S1 ? { 1 5 6 2}
S2 ? { + * ( - }

Слайд 18

1+5*(6-2)/2

Вх. Сост:
S1 ? { 1 5 6 2}
S2 ? { +

1+5*(6-2)/2 Вх. Сост: S1 ? { 1 5 6 2} S2 ?
* ( - }

Вых. Сост:
S1 ? { 1 5 4}
S2 ? { + * }

A2=2
A1=6
R=(A1-A2)=4

Слайд 19

1+5*(6-2)/2

Вх. Сост:
S1 ? { 1 5 4}
S2 ? { + *

1+5*(6-2)/2 Вх. Сост: S1 ? { 1 5 4} S2 ? {
}

Вых. Сост:
S1 ? { 1 20}
S2 ? { + /}

Prty(/)=Prty(*)

A2=4
A1=5
R=A1*A2=20

Слайд 20

1+5*(6-2)/2

Вх. Сост:
S1 ? { 1 20}
S2 ? { + /}

Вых. Сост:
S1

1+5*(6-2)/2 Вх. Сост: S1 ? { 1 20} S2 ? { +
? { 1 20 2}
S2 ? { + /}

Слайд 21

Список лексем исчерпан. Опустошаем стек S2

Вх. Сост:
S1 ? { 1 20

Список лексем исчерпан. Опустошаем стек S2 Вх. Сост: S1 ? { 1
2}
S2 ? { + /}

Вых. Сост:
S1 ? { 1 10}
S2 ? { + }

A2=2
A1=20
R=A1/A2=10

Слайд 22


Вх. Сост:
S1 ? { 1 10}
S2 ? { + }

Вых. Сост:
S1

Вх. Сост: S1 ? { 1 10} S2 ? { + }
? { 11}
S2 ? { }

A2=10
A1=1
R=A1+A2=11

Продолжаем опустошать стек S2

Результат = 11

Слайд 23

УРА!!!

УРА!!!

Слайд 24

Еще один пример:
5+8-6*3
Необходимо вычислить значение выражения

Еще один пример: 5+8-6*3 Необходимо вычислить значение выражения

Слайд 25

5+8-6*3

1 ? 5
2 ? +
3 ? 8
4 ? -
5 ? 6
? *
? 3

5+8-6*3 1 ? 5 2 ? + 3 ? 8 4 ?

Слайд 26

5+8-6*3

Вх. Сост:
S1 ? { }
S2 ? { }

Вых. Сост:
S1 ? {

5+8-6*3 Вх. Сост: S1 ? { } S2 ? { } Вых.
5 }
S2 ? { }

Слайд 27

5+8-6*3

Вх. Сост:
S1 ? { 5 }
S2 ? { }

Вых. Сост:
S1 ?

5+8-6*3 Вх. Сост: S1 ? { 5 } S2 ? { }
{ 5 }
S2 ? { + }

Слайд 28

5+8-6*3

Вх. Сост:
S1 ? { 5 }
S2 ? { + }

Вых. Сост:
S1

5+8-6*3 Вх. Сост: S1 ? { 5 } S2 ? { +
? { 5 8 }
S2 ? { + }

Слайд 29

5+8-6*3

Вх. Сост:
S1 ? { 5 8 }
S2 ? { + }

Вых.

5+8-6*3 Вх. Сост: S1 ? { 5 8 } S2 ? {
Сост:
S1 ? { 13 }
S2 ? { - }

Prty(+)=Prty(-)

A2=5
A1=8
R=A1+A2=13

Слайд 30

5+8-6*3

Вх. Сост:
S1 ? { 13 }
S2 ? { - }

Вых. Сост:
S1

5+8-6*3 Вх. Сост: S1 ? { 13 } S2 ? { -
? { 13 6 }
S2 ? { - }

Слайд 31

5+8-6*3

Вх. Сост:
S1 ? { 13 6 }
S2 ? { - }

Вых.

5+8-6*3 Вх. Сост: S1 ? { 13 6 } S2 ? {
Сост:
S1 ? { 13 6 }
S2 ? { - *}

Prty(*)>Prty(-)

Слайд 32

5+8-6*3

Вх. Сост:
S1 ? { 13 6 }
S2 ? { - *}

Вых.

5+8-6*3 Вх. Сост: S1 ? { 13 6 } S2 ? {
Сост:
S1 ? { 13 6 3}
S2 ? { - *}

Слайд 33

Список лексем исчерпан Опустошаем стек S2

Вх. Сост:
S1 ? { 13 6 3}
S2

Список лексем исчерпан Опустошаем стек S2 Вх. Сост: S1 ? { 13
? { - *}

Вых. Сост:
S1 ? { 13 18}
S2 ? { - }

A2=3
A1=6
R=A1*A2=18

Слайд 34

Продолжаем опустошать стек S2

Вх. Сост:
S1 ? { 13 18}
S2 ? {

Продолжаем опустошать стек S2 Вх. Сост: S1 ? { 13 18} S2
- }

Вых. Сост:
S1 ? { -5 }
S2 ? { }

A2=18
A1=13
R=A1-A2=-5

Результат = -5

Слайд 35

УРА!!!

УРА!!!

Слайд 36

Применение деревьев поиска

“Угадай животное” – программа, способная обучаться

Применение деревьев поиска “Угадай животное” – программа, способная обучаться

Слайд 37

Постановка задачи:

Программа должна задавать человеку вопросы и “отгадать” загаданное человеком животное. Вопросы

Постановка задачи: Программа должна задавать человеку вопросы и “отгадать” загаданное человеком животное.
должны носить “двоичный характер” (да-нет).
Если программа не в состоянии отгадать животное, она “сдаётся”, спрашивает человека, как называется животное и чем отличается от названного…

Слайд 38

Эта информация запоминается в “базе знаний” (БЗ) и может быть использована при

Эта информация запоминается в “базе знаний” (БЗ) и может быть использована при следующих сеансах игры.
следующих сеансах игры.

Слайд 39

Проектируем…

Очевидно, что “сердцем” программы является хранилище данных.
Какую структуру данных выбрать?

Проектируем… Очевидно, что “сердцем” программы является хранилище данных. Какую структуру данных выбрать?

Слайд 40

Выбираем двоичное дерево!

Узел дерева будет хранить текст вопроса, а правая и левая

Выбираем двоичное дерево! Узел дерева будет хранить текст вопроса, а правая и
ссылки будут указывать на поведение программы при ответе “Да” (правая) и “Нет” (левая).

Слайд 41

Исходное состояние БЗ

Исходное состояние БЗ

Слайд 42

Загадываем слона.

Загадываем слона.

Слайд 43

1-й вопрос программы

1-й вопрос программы

Слайд 44

2-й вопрос программы

2-й вопрос программы

Слайд 45

3-й вопрос программы

Ответ “Да” – и Слон вычислен!

3-й вопрос программы Ответ “Да” – и Слон вычислен!

Слайд 46

А теперь загадываем мамонта. Мамонта в базе знаний нет. Посмотрим на поведение программы…

А теперь загадываем мамонта. Мамонта в базе знаний нет. Посмотрим на поведение программы…

Слайд 47

1-й вопрос программы

1-й вопрос программы

Слайд 48

2-й вопрос программы

2-й вопрос программы

Слайд 49

3-й вопрос программы

Ответ “нет” и у слона нет потомков в дереве поиска…

3-й вопрос программы Ответ “нет” и у слона нет потомков в дереве поиска…

Слайд 50

Программа признаёт проигрыш и спрашивает, как называется загаданное животное.
Человек отвечает: “Мамонт”
Поскольку программа

Программа признаёт проигрыш и спрашивает, как называется загаданное животное. Человек отвечает: “Мамонт”
остановилась на Слоне, то нужно спросить человека, чем Мамонт отличается от Слона.
Человек отвечает “Животное вымерло”

Слайд 51

Что должна сделать программа?

Создать новый узел в дереве поиска и занести в

Что должна сделать программа? Создать новый узел в дереве поиска и занести
него…
вопрос “Животное вымерло?”
“Подвесить” этот узел к предку Слона
У этого нового узла сделать левым потомком (почему?) узел “Слон?”, а правым – еще один новый узел (в него записать “Мамонт?”)

Слайд 52

Новое состояние БЗ

Новое состояние БЗ

Слайд 53

Еще раз загадаем мамонта и пройдем по дереву поиска…

Еще раз загадаем мамонта и пройдем по дереву поиска…

Слайд 54

Первый вопроc:

Первый вопроc:

Слайд 55

Второй вопрос:

Второй вопрос:

Слайд 56

Третий вопрос (уже новый!)

Третий вопрос (уже новый!)

Слайд 57

Последний вопрос

Мамонт успешно угадан…

Последний вопрос Мамонт успешно угадан…