Рекомендации по предобработке скобочного выражения



Моделирование

 

Учебное пособие
для студентов специальности 230101

«Вычислительные машины, комплексы, системы и сети»

 

Самара

Самарский государственный технический университет

 

 

УДК 519.213, 519.216, 519.22, 004.421

 

Моделирование /Учебное пособие для студентов специальности 230101 «Вычислительные машины, комплексы, системы и сети» / Б.В.Мартемьянов, А.Б.Мартемьянов; Самар. гос. техн. ун-т, Самара, 2009, 101 с.

 

Учебное пособие содержит теоретические разделы, охватывающие широкий круг задач моделирования и тем дисциплины «Моделирование», а также разделы с рекомендуемыми темами лабораторного практикума.

В теоретических разделах изложены вопросы организации и моделирования компиляторов алгебраических выражений, основные понятия теории вероятностей и математической статистики, методы генерирования псевдослучайных числовых последовательностей, основы теории систем массового обслуживания, а также рассмотрены некоторые методы и алгоритмы выполнения операций умножения и деления чисел в формате с фиксированной позиционной точкой. Последние из перечисленных методов востребованы в лабораторной работе, ориентированной на задачу моделирования микропрограмм на примере микропрограммы выполнения арифметической операции.

В разделах, содержащих задания на лабораторные работы, сформулированы задачи, цели и требования к содержанию лабораторных работ, даны четкие методические указания по выполнению каждой работы, приведены контрольные вопросы.

 

Предназначено для студентов специальности 230101 всех форм обучения.

 

Ил. 8, табл. 10, библиогр. 8 назв.

 

Печатается по решению редакционно-издательского совета Самарского государственного технического университета

 

 

Ó Б.В.Мартемьянов, А.Б.Мартемьянов, 2009

Ó Самарский государственный
технический университет, 2009


Содержание

 

предисловие. 5

Введение. 6

1. моделирование компиляции алгебраических выражений.. 8

1.1. Три формы записи алгебраических выражений: инфиксная, постфиксная и префиксная. 8

1.2. Моделирование преобразования инфиксного выражения в постфиксное. 9

1.2.1. Формализация процесса преобразования инфиксного выражения в постфиксное по методу Дийкстра. 9

1.2.2. Рекомендации по предобработке скобочного выражения. 13

1.2.3. Программная реализация некоторых функций алгоритма преобразования 17

1.2.4. Пример пошагового моделирования преобразования инфиксного выражения 21

2. моделирование вычисления выражений, представленных в постфиксной форме. 22

2.1. Описание алгоритма вычисления значения выражения, представленного в постфиксной форме записи. 22

2.2. Пошаговое выполнение алгоритма вычисления значения выражения, представленного в постфиксной форме записи. 22

2.3. Мультимедийная обучающая система ”Трансляция алгебраических выражений” 26

3. Элементы теории вероятностей и математической статистики 28

3.1. Дискретные и непрерывные случайные величины.. 28

3.2. Законы распределения случайных величин. 28

3.3. Функции распределения случайных величин. 29

3.4. Основные числовые характеристики случайных величин. 31

3.5. Специальные распределения случайных величин. 32

3.5.1. Равномерное распределение. 32

3.5.2. Экспоненциальное распределение. 33

3.5.3. Распределение Пуассона. 34

3.5.4. Нормальное распределение. 35

4. Генерация псевдослучайных числовых последовательностей 36

4.1. Моделирование псевдослучайной числовой последовательности с равномерным законом распределения алгоритмическим способом. 36

4.1.1. Базовые понятия. 36

4.1.2. Общий подход к получению псевдослучайных последовательностей. 37

4.1.3. Метод Лемера. 39

5. Основы теории систем массового обслуживания.. 41

5.1. Простейшая система массового обслуживания. 41

5.2. Классы моделей СМО.. 43

5.3. Модели потоков заявок. 44

5.4. События основные и вспомогательные. 47

5.5. Моделирование событий. 48

5.6. Модельное время и таймер модельного времени. 49

6. Алгоритмы умножения и деления чисел с фиксированным положением позиционной точки.. 52

6.1. Классификация алгоритмов умножения. 52

6.2. Обработка множителя в алгоритмах поразрядного умножения. 56

6.3. Особенности вычисления сумм частичных произведений. 57

6.4. Формализация алгоритмов поразрядного умножения. 58

6.5. Особенности алгоритмов умножения дополнительных кодов. 66

6.6. Алгоритмы деления чисел с фиксированным положением позиционной точки 68

6.6.1. Особенности алгоритмов деления. 68

6.6.2. Классификация алгоритмов деления. 69

6.6.3. Целочисленное деление с восстановлением остатка. 70

6.6.4. Целочисленное деление без восстановления остатка. 73

7. Задания на лабораторные работы.. 76

7.1. Лабораторная работа 1: разработка имитационной модели компиляции алгебраического выражения по алгоритму Дийкстра. 76

7.2 Лабораторная работа 2: разработка имитационной модели вычисления значения алгебраического выражения, представленного в постфиксной форме записи. 82

7.3. Лабораторная работа 3: разработка и исследование генераторов псевдослучайных числовых последовательностей. 86

7.4. Лабораторная работа 4: разработка имитационной модели простейшей СМО 90

7.5. Лабораторная работа 5: разработка среды для имитационного моделирования микропрограммы выполнения арифметической операции. 94

Библиографический список.. 101


предисловие

 

Цель данного пособия состоит в изложении в достаточном объеме комплекса теоретических и методических материалов, относящихся к конкретным объектам моделирования и к используемым для их описания математическим моделям и методам моделирования. При этом общие вопросы теории моделирования, носящие характер вводного материала в дисциплину, не рассматриваются в расчете на их изложение в лекционном курсе.

Излагаемый теоретический и методический материал согласован с задачами, выносимыми на лабораторный практикум. При этом отдельные разделы пособия содержат формулировки конкретных задач, выносимых на лабораторные работы. Такая концепция пособия позволяет студенту на основе изучения изложенной теории и методических рекомендаций успешно выполнить лабораторные работы, и, в результате, глубже освоить вопросы дисциплины, а преподавателям – организовать выполнение лабораторного практикума и прием отчетов по работам.

Содержание всех рассмотренных в пособии вопросов соответствует разделам программы курса и охватывает большую часть рассматриваемого в курсе теоретического материала.

В описании каждой лабораторной работы сформулирована ее тема, даны четкие методические указания по ее выполнению, в некоторых случаях приведены примеры организации интерфейсов разрабатываемых программ, сформулированы основные контрольные вопросы, ответы на которые необходимо знать как для проектирования модели, так и при отчете по работе.

Рассмотренные в учебном пособии вопросы изложены достаточно полно и глубоко, что позволяет использовать пособие при работе со студентами всех форм обучения.

Для студентов заочников задания на лабораторные работы могут служить заданиями по курсовому проектированию.


Введение

 

В курсе «Моделирование» рассматриваются вопросы, относящиеся к нескольким достаточно самостоятельным разделам математики и вычислительной техники, обсуждаются задачи построения имитационных моделей разнообразных объектов. Широкая тематика затрагиваемых в курсе проблем приводит к отсутствию отдельного учебника, в котором бы рассматривались все необходимые вопросы. Учебники всегда оказываются более узкоспециализированными, чем этого требует содержание курса. Поэтому в содержание данного учебного пособия включено изложение в достаточном объеме основных теоретических положений и методических рекомендаций, изучение которых необходимо для успешного освоения материала дисциплины и выполнения рекомендованных лабораторных работ.

Лабораторный практикум по курсу «Моделирование» выполняется в 7 семестре. На каждой лабораторной работе студентам ставится задача по разработке, написанию и отладке моделирующей программы средствами универсального языка программирования высокого уровня. Поэтому содержание курса и лабораторных работ предполагает свободное владение студентами инструментарием среды разработки и отладки программ, технологиями программирования, знание теории, изучавшейся в различных курсах в предшествующие семестры и имеющей отношение к рассматриваемым объектам моделирования.

Разработка студентом собственных моделирующих программ способствует более глубокому усвоению теоретических вопросов курса, более глубокому пониманию законов функционирования объектов моделирования, развивает навыки программирования нетривиальных задач и в целом способствует развитию и становлению профессиональных знаний и навыков.

В теоретических разделах данного пособия излагаются вопросы построения компиляторов алгебраических выражений, основные понятия теории вероятностей и математической статистики, методы генерирования псевдослучайных числовых последовательностей, основы теории систем массового обслуживания, рассмотрены некоторые методы выполнения операций умножения и деления чисел в формате с фиксированной позиционной точкой. Последние из перечисленных методов востребованы в лабораторной работе, ориентированной на задачу моделирования микропрограмм на примере микропрограммы выполнения арифметической операции, которую студенты должны разработать самостоятельно на основе заданных преподавателем признаков используемого метода выполнения операции.

В разделах, описывающих лабораторные работы, сформулированы задачи и требования к содержанию лабораторных работ, даны четкие методические указания по выполнению каждой работы, приведены контрольные вопросы. По конкретной работе дается ссылка на соответствующий теоретический раздел данного пособия, что облегчает поиск востребованного теоретического материала.

Задания, выносимые на лабораторный практикум, достаточно трудоемкие и не всегда могут быть выполнены за часы, отведенные на лабораторный практикум. В таком случае студент обязан закончить работу в свое «свободное» время. С целью поддержания такого режимы выполнения работ в учебных планах и в рабочих программах дисциплин планируются десятки часов, которые студент должен затратить на самостоятельную работу по освоению учебных дисциплин. Поэтому требование завершать выполнение работ в «свободное» время не является нарушением права студентов на отдых.

Лабораторные работы рекомендуется выполнять в порядке возрастания номера работы, учитывая запланированную в описании работы трудоемкость в аудиторных часах. Трудоемкость работ запланирована с учетом опыта проведения этих работ в течение ряда предшествующих лет. Суммарная трудоемкость работ позволяет преподавателям часы последних занятий отвести на прием отчетов по последним работам.

 


1. моделирование компиляции
алгебраических выражений

1.1. Три формы записи алгебраических выражений:
инфиксная, постфиксная и префиксная

Форму записи алгебраических выражений со знаком операции между операндами называют инфиксной (infix). Именно эта форма знакома нам со школы.

Форму записи алгебраических выражений со знаком операции после операндов называют постфиксной (postfix) или обратной польской записью (в честь польского математика Ю. Лукасевича, исследовавшего свойства этой записи).

Некоторые примеры трех форм записи выражений даны в табл. 1.1.

Таблица 1.1

№ п/п Инфиксная форма Постфиксная форма Префиксная форма
  a + b - c a b + c – или a b c - + - + a b c или + a - b c
  a + b * c a b c * + + a * b c
  (a + b) * c a b + c * * + a b c
  a + b * sin(c - d / e) a b c d e / - sin * + + a * b sin - c / d e
  exp(sin(a + b / (c - d))) a b c d - / + sin exp exp sin + a / b - c d

При построении трансляторов произвольных алгебраических выражений, заданных в инфиксной форме, возникает ряд сложностей, связанных со следующими особенностями инфиксной формы:

- последовательность исполнения операций зависит от скобочной структуры выражения;

- на одном уровне вложенности скобок последовательность выполнения операций зависит от их приоритета.

Поэтому при многократных вычислениях по одному и тому же выражению приходится каждый раз заново анализировать и учитывать как скобочную структуру выражения, так и приоритет операций.

Постфиксная форма устраняет сложности, связанные с указанными особенностями выражений в инфиксной форме, потому что:

- выражения не имеют скобок;

- все операции и функции, входящие в выражение, вычисляются в порядке их записи в выражении, что позволяет исключить понятие приоритетности операций и, следовательно, учет этих приоритетов.

Постфиксная форма упрощает процесс анализа выражения и с целью обнаружения синтаксических ошибок, и с целью выполнения вычислений.

1.2. Моделирование преобразования
инфиксного выражения в постфиксное

1.2.1. Формализация процесса преобразования
инфиксного выражения в постфиксное по методу Дийкстра

По примерам, приведенным в таблице 1.1, можно заметить, что во всех трех формах записи выражений операн­ды не меняют своего относительного расположения. Изменяется только порядок следования символов операций и функций как по отношению к операндам, так и по отношению друг к другу.

В основу излагаемого ниже алгоритма преобразования инфиксной записи в обратную польс­кую запись положен алгоритм Дийкстра (Dijkstra E.W.) [1, 2].

В алгоритме входная (исходная) строка символов задает выражение в инфикс­ной форме, а выходная строка - в постфиксной. В процессе преобразо­вания выражения, для изменения порядка следования символов операций в выходной строке по отношению к их порядку в исходной строке используется память со стеко­вой адресацией. Основой алгоритма является таблица решений, приведенная ниже в таблице 1.2.

В таблице 1.2:

- символ ^ соответствует пустой входной строке и пустому стеку.

 

Таблица 1.2

Таблица принятия решений
для алгоритма Дийкстра

    ^ + - * / ( )
Символ в вершине стека ^              
+              
-              
*              
/              
(              

 

- символы операций, отмечающие столбы, изображены прямым шрифтом и задают символы исходной строки, а символы операций, отмечающие строки, изображены курсивом и задают символы, находящиеся в вершине стека.

Содержимое ячеек таблицы задает один из 5 возможных вариантов поведения алгоритма:

1 - поместить символ из входной строки в стек;

2 - извлечь символ операции из стека и отправить его в выходную строку (при этом входная строка не изменяется!);

3 - удалить символ ")" из входной строки и символ "(" из стека;

4 - успешное окончание преобразования;

5 - ошибка в скобочной структуре.

Подчеркнем, что в таблице символы ^ задают не символы в стеке и входной строке, а состояния стека и входной строки.

Действие 1 позволяет последующие символы входной строки поместить в выходную строку впереди данного символа.

Действие 2 выполняется:

- когда символ входной строки задает операцию не менее приоритетную, чем символ в вершине стека;

- когда во входной строке встречается символ ")", означающий, что закончилось выражение, обрамленное скобками.

Комментарии к таблице имели целью пояснить логику формирования ее содержимого, что необходимо понимать при ее самостоятельном задании или дополнении. Подобная логика должна использоваться и при построении такой таблицы для преобразования логических, теоретико-множественных и других выражений.

При введении в выражения операций, не предусмотренных в таблице 1.2, последняя должна быть доработана. Примером такой доработки с учетом введения новой операции (возведения в степень) и функций является таблица 1.3.

 

Таблица 1.3

Дополненная таблица принятия решений
для алгоритма Дийкстра

        Очередной символ входной строки
    a                    
  b   ^ + - * / Ù ( ) F P
Символ в вершине стека 0 ^                    
1 +                    
2 -                    
3 *                    
4 /                    
5 Ù                    
6 (                    
7 F                    
                           

 

В таблице 1.3 использованы следующие обозначения:

- символ ^ соответствует пустой входной строке и пустому стеку.

Ù - операция возведения в степень;

P - переменная;

F – любая функция (унарная операция);

1 - поместить символ из входной строки в стек;

2 - извлечь символ из стека и отправить его в выходную строку;

3 - удалить символ ")" из входной строки и символ "(" из стека;

4 - успешное окончание преобразования;

5 - ошибка скобочной структуры;

6 - переслать символ из входной строки - в выходную строку;

7 - ошибка: после функции отсутствует "(".

Заметим, что здесь содержимое действия 3 изменилось в сравнении с таблицей 1.2.Это связано с введением в рассмотрение функций.

Использование памяти со стековой адресацией на этапе преобразования инфиксной формы в постфиксную форму иллюстрирует рисунок 1.1.

 

Текущее состояние постфикс­ного выражения:   Исходное инфиксное выраже­ние (обраба­тывается по символам слева - направо):
a b c d e   a + b * sin(c - d / e)

 

/
-
(
sin
*
+

 

Результирующее постфиксное выражение: a b c d e / - sin * +

Рисунок 1.1 - Использование стековой памяти в процессе
получения постфиксной формы выражения

 

На рисунке 1.1 стрелки указывают возможные направления перемещения символов. В ситуации, изображенной на рисунке 1.1, все содержимое стека (кроме символа "(") должно быть через его вершину передано в выходную строку и "приклеено" к ней справа. Получится следующее выражение в постфиксной форме: a b c d e / - sin * +.

Рекомендации по предобработке скобочного выражения

В процессе преобразования выражения в постфиксную форму необходимо обнаруживать имена функций, которые всегда задаются строками символов. Это приводит к невозможности использования оператора case для организации ветвления алгоритма. Использование же оператора if делает структуру алгоритма менее наглядной. Кроме того, использование строкового типа для элементов стека приводит к применению отношений "равно/не равно" между строковыми переменными и константами. Сравнение строковых типов осуществляется более сложно, чем сравнение символьных типов. Поэтому представляется целесообразным выполнить такое преобразование исходной строки-выражения, после которого можно будет оперировать не строковыми типами, а символьными. С этой целью предлагается исходную строку в инфиксной форме подвергнуть обработке, в результате которой:

- из входной строки удаляются все пробелы;

- все подстроки, задающие функции, заменяются символами некоторого алфавита А1 по правилу, заданному таблицей соответствия имен функций и символов алфавита А 1(таблица может быть задана как массив-константа в тексте программы);

- все подстроки, задающие числа, заменяются символами некоторого алфавита А 2: первое число заменяется первым символом алфавита, второе число - вторым символом и т.д.

Алфавиты А 1 и А 2 не должны иметь общих символов.

В результате такой замены каждый операнд (переменная или число) и каждая функция оказываются представ­ленными не подстроками символов, а отдельными символами, как и отдельная операция. Поэтому и в алгоритме преобразования к постфиксной форме и в алгоритме вычислений (что более существенно для повышения быстродействия программы) исключается необходи­мость обнаружения подстрок, задающих имена функций, и удается во всех случаях использовать оператор выбора case. Такое преобразование упрощает также и синтаксический анализ исходного выражения, если его необходимо делать.

Приводимая ниже таблица 1.4 дает пример соответствия имен некоторых наиболее часто используемых функций символам алфавита А 1, в качестве которого в данном случае взяты строчные символы русского алфавита. При использовании такой таблицы исходное выражение, например, sin(arcsin(x ^2)), будет преобразовано в выражение в(а(x ^2)).

 

Таблица 1.4

Соответствия имен функций
и символов алфавита А 1

Функция Символ из А 1   Функция Символ из А 1
arcsin а   arcth н
arccos б   sh о
sin в   ch п
cos г   cth р
arcctg д   th с
arctg е   abs т
ctg ж   exp у
tg з   lg ф
ln и   round х
arsh к   trunc ц
arch л   fruc ч
arth м   MyFunc ш

 

 

Можно предложить, по крайней мере, два подхода к замене имен функций на символы алфавита A1.

Подход первый. Пусть A - алфавит символов, из которых составляются имена переменных и функций. Из входной строки выделяется очередная лексема из символов алфавита A. Затем выделенная лексема сравнивается со всеми возможными именами функций. При обнаружении совпадения лексема во входной строке заменяется соответствующим символом алфавита A1. Отсутствие совпадения после сравнения со всеми именами функций позволяет классифицировать лексему как недопустимую или как имя переменной. При таком подходе порядок записи имен функций в таблицу вида таблица 1.4 влияет на скорость обнаружения совпадения лексемы с именем функции (ближе к началу таблицы следует помещать имена функций встречающихся в выражениях наиболее часто) и не влияет на результат замены.

Подход второй. Из таблицы 1.4 последовательно выбираются имена функций, затем обнаруживаются все вхождения выбранного имени в входную строку и заменяются на соответствующий символ из таблицы.

При реализации второго подхода произвольный порядок замены имен функций на символы алфавита A1 недопустим. Необходимо сначала заменить все вхождения функции arcsin, только потом - все вхождения функции sin. Сначала - все вхождения функции arccos, только потом -все вхождения функции cos, и т. д. Если сначала все вхождения функции sin заменить на символ "в", затем все вхождения функции cos заменить на символ "г" и т.д., то в результате: функция arcsin превратится в функцию arcв, функция arccos превратится в функцию arcг, … что приведет к ошибкам.

В первую очередь следует заменять на символы алфавита A1 функции, идентификаторы которых содержат в своем написании в качестве подстрок идентификаторы других функций. Такая особенность преобразования выражений учтена порядком перечисления функций в таблице 1.4. В такую таблицу можно ввести свои собственные функции, оформленные как подпрограммы, что позволит использовать их при задании выражений. Пример такой функции в таблице 1.4 дан под абстрактным именем MyFunc.

Таблица 1.4 на языках программирования Pascal и Delphi может быть задана, например, так:

Const

TableSize = 23;

Table: array [ 1..TableSize, 1..2 ] of string [ 6 ] =

(('arcsin', 'а'), ('arccos', 'б'), ('sin', 'в'),

('cos', 'г'), ('arcctg', 'д'), ('arctg', 'е'),

('ctg', 'ж'), ('tg', 'з'), ('ln', 'и'),

('arsh', 'к'), ('arch', 'л'), ('arth', 'м'),

('arcth', 'н'), ('sh', 'о'), ('ch', 'п'),

('cth', 'р'), ('th', 'с'), ('abs', 'т'),

('exp', 'у'), ('lg', 'ф'), ('round', 'х'),

('trunc', 'ц'), ('fruc', 'ч'));

 

Для получения менее разветвленного алгоритма в части, обеспечивающей выбор значения из таблицы решений, полезно ввести вспомогательные переменные, задающие номера строк и столбцов таблицы (таблица 1.5).

 

Таблица 1.5

        Очередной символ входной строки
    a                    
  b   ^ + - * / Ù ( ) F P
Символ в вершине стека 0 ^                    
1 +                    
2 -                    
3 *                    
4 /                    
5 Ù                    
6 (                    
7 F                    
                               

 

В таблице 1.5:

a - номер варианта символа во входной строке;

b - номер варианта символа в вершине стека;

число в таблице = a + 10 b.

Выражение от a и b, использованное для заполнения таблицы 1.5, может быть другим. Важно, чтобы оно разным клеткам таблицы сопоставляло разные числа.

Мысленно совместив таблицу 1.5 с таблицей 1.3, получим соответствие между значением выражения a + 10 b из таблицы 1.5 и вариантом поведения алгоритма преобразования выражения к постфиксной форме из таблицы 1.3

1.2.3. Программная реализация некоторых функций
алгоритма преобразования

На языках программирования Pascal и Delphi алгоритм, обеспечивающий выбор варианта поведения алгоритма преобразования выражения к постфиксной форме, можно реализовать, например, следующим образом (см. далее Function SymbNumInputStr, Function Pop, Function SymbNumInStek, Procedure CreatePostfix).

 

Функция SymbNumInputStr столбцам таблицы 1.5 ставит в соот­вет­ствие номера от 1 до 9 (слева-направо).

 

Function SymbNumInputStr(Symb: char): byte;

Begin

if Symb = #0

then SymbNumInputStr:= 1 {для Delphi: Result:= 1}

else case Symb of

'+': SymbNumInputStr:= 2; {для Delphi: Result:=2}

'-': SymbNumInputStr:= 3; {для Delphi: Result:=3}

'*': SymbNumInputStr:= 4; {для Delphi: Result:=4}

'/': SymbNumInputStr:= 5; {для Delphi: Result:=5}

'^': SymbNumInputStr:= 6; {для Delphi: Result:=6}

'(': SymbNumInputStr:= 7; {для Delphi: Result:=7}

')': SymbNumInputStr:= 8; {для Delphi: Result:=8}

'а'..'п', 'р'..'я': {очередной символ - функция}

SymbNumInputStr:= 9; {для Delphi: Result:=9}

'A'..'Z': {очередной символ - переменная}

SymbNumInputStr:= 10; {для Delphi:Result:=10}

end; {case}

end; {SymbNumInputStr}

 

Функция Pop считывает из стека один элемент.

 

const StekSize = 100; {т.е. глубина стека 100 элементов}

type TStek = record

StekArr: array [1..StekSize] of Char;

StekPointer: byte

{Указывает на первое свободное место в стеке.

StekPointer = 1 указывает на дно стека}

end;

Function Pop(var Stek: TStek; var StekData: Char): boolean;

Begin

with Stek do

Begin

if StekPointer > 1

{StekPointer=1 указывает на дно стека}

Then begin

Pop:= TRUE; {- считывание из стека закончилось успешно} {для Delphi: Result:=TRUE}

Dec(StekPointer);

StekData:= StekArr[ StekPointer ]

End

else Pop:= FALSE {- стек пустой: считывать нечего } end {with Stek do}

end; {Pop}

 

Функция SymbNumInStek строкам таблицы ставит в соответствие номера от 0 до 7 (сверху-вниз).

 

Function SymbNumInStek: byte;

var LastSymbInStek: Char;

Begin

if Pop(Stek, LastSymbInStek)

then case LastSymbInStek of

'+': SymbNumInStek:= 1; {для Delphi: Result:=1}

'-': SymbNumInStek:= 2; {для Delphi: Result:=2}

'*': SymbNumInStek:= 3; {для Delphi: Result:=3}

'/': SymbNumInStek:= 4; {для Delphi: Result:=4}

'^': SymbNumInStek:= 5; {для Delphi: Result:=5}

'(': SymbNumInStek:= 6; {для Delphi: Result:=6}

else SymbNumInStek:= 7 {- символ функции (переменные в стек не попадают)}

end {case}

else SymbNumInStek:= 0 { - стек пуст}

end; {SymbNum In Stek}

Ниже приведен один из вариантов реализации процедуры преобразования исходного выражения, заданного строкой InputStr, записанной в инфиксной форме, в постфиксную форму записи, заданную выходной строкой OutputStr.

 

Procedure CreatePostfix;

Begin

OutputStr:= '';

Stek.StekPointer:= 1; {- это "очистка стека"}

Repeat

case SymbNumInputStr(InputStr[1])+10*SymbNumInStek of

{ SymbNumInputStr + 10 * SymbNumInStek º a + 10 b}

2..7, 9, 14..17, 19, 24..27, 29, 36, 37, 39, 46, 47, 49, 57, 59, 62..67, 69, 77: Выполняем действие 1 из табл. 1.3

11..13, 21..23, 31..35, 41..45, 51..56,18,28,38,48,

58, 71..76: Выполняем действие 2 из табл. 1.3

68: Выполняем действие 3 из табл. 1.3

1: Выполняем действие 4 из табл. 1.3

8, 61: Выполняем действие 5 из табл. 1.3

10, 20, 30, 40, 50, 60, 70: Выполняем действие 6 из табл. 1.3

78, 79: Выполняем действие 7 из табл. 1.3

end; {case}

Until FALSE {выход через действие 4 из табл. 1.3 }

end; {CreatePostfix}

Ниже приведен второй вариант реализации процедуры CreatePostfix: Алгоритм использует таблицу решений, заданную явно в тексте программы. При этом отпадает необходимость использования таблицы 1.5.

 

type TTRArr = array [ 0..7, 1..10 ] of byte;

{********* ТАБЛИЦА РЕШЕНИЙ: *********}

const TR: TTRArr = ((4, 1, 1, 1, 1, 1, 1, 5, 1, 6),

(2, 2, 2, 1, 1, 1, 1, 2, 1, 6),

(2, 2, 2, 1, 1, 1, 1, 2, 1, 6),

(2, 2, 2, 2, 2, 1, 1, 2, 1, 6),

(2, 2, 2, 2, 2, 1, 1, 2, 1, 6),

(2, 2, 2, 2, 2, 2, 1, 2, 1, 6),

(5, 1, 1, 1, 1, 1, 1, 3, 1, 6),

(2, 2, 2, 2, 2, 2, 1, 7, 7, 6));

Procedure CreatePostfix;

Begin

OutputStr:= '';

Stek.StekPointer:= 1; {- это "очистка стека"}

Repeat

case TR[SymbNumInStek, SymbNumInputStr(InputStr[1])] of

1: Выполняем действие 1 из табл. 1.3

2: Выполняем действие 2 из табл. 1.3

3: Выполняем действие 3 из табл. 1.3

4: Выполняем действие 4 из табл. 1.3

5: Выполняем действие 5 из табл. 1.3

6: Выполняем действие 6 из табл. 1.3

7: Выполняем действие 7 из табл. 1.3

end; {case TR}

Until FALSE {выход через действие 4 из табл. 1.3}

end;

 

В процессе преобразования выражения к постфиксной форме можно обнару­жить лишь некоторые ошибки, например:

- непра­вильную скобочную структуру выражения;

- отсутствие символа ( после имени функции.

Для более полного и тонкого синтаксического анализа необходимо применять дополнительные алгоритмы.

1.2.4. Пример пошагового моделирования
преобразования инфиксного выражения

Рассмотрим действие алгоритма на примере следующего выражения: sin(cos(56 - 8)^38.6 - 2)

1. Заменим имен функций символами алфавита A 1 (таблица 1.4).

1.1. sin заменим на "в". Получим: в(cos(56-8)^38.6-2);

1.2. cos заменим на "г". Получим: в(г(56-8)^38.6-2);

2. Заменим числа символами алфавита A 2 (возьмем в качестве алфавита А2 прописные буквы латинского алфавита)

2.1. Заменим число 56 первым символом алфавита A 2 (буквой A). Получим: в(г(A -8)^38.6-2).

2.2. Заменим число 8 вторым символом алфавита A 2 (буквой B). Получим: в(г(A - B)^38.6-2).

2.3. Заменим число 38,6 третьим символом алфавита A 2 (буквой C). Получим: в(г(A - B)^ C -2).

2.4. Заменим число 2 четвертым символом алфавита A 2 (буквой D). Получим: в(г(A - B)^ C - D).

3. Преобразуем полученное выражение "в(г(A - B)^ C - D)" к постфиксной форме.

Подробно это преобразование рассматривается ниже.

В результате преобразования будет получено следующее выражение: ABC ^ D -в.

Теперь остается только заменить символы алфавита A 1 на соответст­вующие им функции и символы алфавита A 2 на соответствующие им числа. В результате, выражение sin(cos(56-8)^38.6-2)будет преобразовано в постфиксную форму: 56 8 - cos 38.6 ^ 2 – sin.


2. моделирование вычисления выражений,
представленных в постфиксной форме

2.1. Описание алгоритма вычисления значения выражения,
представленного в постфиксной форме записи

Наиболее простой алгоритм вычисления выражения по его постфиксной форме строится на основе стековой адресации памяти. В этом алгоритме строка символов, задающая выражение, просматривается слева - направо, при этом:

- очередной операнд «заталкивается» в стек через его вершину;

- при встрече очередного символа операции или функции из стека через его вершину извлекается необходимое число операндов этой операции или аргументов функции. Затем, выполняется операция (или вычисля­ется функция) и результат вычисления «заталкивается» в стек через его вершину;

- по окончании входной строки вычисленное значение выражения находится в верши­не стека. При этом, если формула была корректна, ничего другого в стеке нет.

В процессе вычислений легко обнаруживаются некоторые ошибки в задании выражений пропущенные на этапе преобразования к постфиксной форме. К таким ошибкам относятся, например, следующие:

- следование друг за другом символов операций;

- пропуск символа операции;

- отсутствие аргумента у функции или недостаточное количество операндов в двухместной операции.

2.2. Пошаговое выполнение алгоритма вычисления значения
выражения, представленного в постфиксной форме записи

Для получения более полного представления о взаимодействии алгоритма преобразования выражения, записанного в инфиксной форме - в постфиксную и алгоритма вычисления значения выражения по постфиксной форме рассмотрим действие алгоритма вычисления на примере функции sin(cos(56-8)^38,6-2).

Эта функция была ранее преобразована к постфиксной форме вида: 56 8 - cos 38,6 ^ 2 - sin.При этом, в процессе преобразования исходного инфиксного выражения имена функций и числа были заменены символами двух алфавитов и была получена постфиксная форма выражения следующего вида:

ABC ^ D -в,

где A, B, C и D - символы алфавита A 2, обозначающие числа;

г - обозначение функции cos;

в - обозначение функции sin.

Именно это последнее выражение используем для иллюстрации процесса вычислений на основе постфиксной формы записи выражения.

1. В начале входной строки ABC ^ D -в имеем символ A алфавита A 2 - число. Отправим в стек число 56, соответствующее символу A.

 

    Остаток входной строки
Содержимое стека   BC ^ D
     
    указатель на вершину стека
^   Дно стека

 

2. В начале входной строки BC ^ D -в имеем символ B алфавита A 2 - число. Отправим в стек число 8, соответствующее символу B.

 

    Остаток входной строки
Содержимое стека   C ^ D
    указатель на вершину стека
     
^   Дно стека

 

3. В начале входной строки -г C ^ D -в имеем символ "-" - бинарную операцию. Учтем, что операнд, находящийся в вершине стека, должен стоять справа от знака двухместной операции (это 8), а операнд, находящийся под вершиной стека, должен стоять слева от знака операции (это 56). Извлечем из стека два верхних операнда (числа 8 и 56), выполним операцию "-" (56-8) и ее результат (48) поместим в стек.

 

    Остаток входной строки
Содержимое стека   г C ^ D
     
    указатель на вершину стека
^   Дно стека

 

4. В начале входной строки г C ^ D -в имеем символ г алфавита A 1, обозначающий функцию cos. Достанем из стека аргумент функции (число 48), вычислим значение функции, и результат поместим в стек.

 

    Остаток входной строки
Содержимое стека   C ^ D
     
     
0,6691306   указатель на вершину стека
^   Дно стека

 

5. В начале входной строки C ^ D -в имеем символ C алфавита A 2 - число. Отправим в стек число 38,6, соответствующее символу C.

 

    Остаток входной строки
Содержимое стека   ^ D
38,6   указатель на вершину стека
0,6691306    
^   Дно стека

 

6.В начале входной строки ^ D -в имеем символ "^". Достанем из стека два операнда и, выполнив операцию "0,6691306 ^ 38,6", поместим ее результат (1,8395879e-7) в стек.

    Остаток входной строки
Содержимое стека   D
38,6    
1,8395879e-7   указатель на вершину стека
^   Дно стека

7.В начале входной строки D -в имеем символ D алфавита A 2 - число. Отправим в стек число 2, соответствующее символу D.

 

    Остаток входной строки
Содержимое стека  
    указатель на вершину стека
1,8395879e-7    
^   Дно стека

 

8. В начале входной строки имеем символ "-" - бинарную операцию. Достанем из стека два операнда и, выполнив операцию, поместим ее результат в стек.

 

    Остаток входной строки
Содержимое стека   в
     
-1,9999998   указатель на вершину стека
^   Дно стека

 

9. В начале входной строки имеем символ в алфавита A 1 - функцию. Достанем из стека операнд -1,9999998 – аргумент функции и, вычислив функцию sin(-1,9999998), поместим результат в стек.

 

    Остаток входной строки
Содержимое стека    
     
-0,0348995   указатель на вершину стека
^   Дно стека

10. Входная строка пуста, поэтому в стеке по его указателю находится искомое значение выражения, равное -0,0348995.

Итак, sin(cos(56-8)^38,6-2) = -0,0348995.

В рассмотренном примере результаты вычислений даны с точностью меньшей, чем обеспечивает компьютер.

2.3. Мультимедийная обучающая система
”Трансляция алгебраических выражений”

На кафедре «Вычислительная техника» СамГТУ имеется Мультимедийное обучающее приложение ”Трансляция алгебраических выражений”, разработанное на основе изложенных методов и алгоритмов. Это приложение поддерживает следующие функции.

1. Позволяет задавать произвольное алгебраическое выражение в инфиксной форме с помощью встроенного мастера функций. Мастер поддерживает около 30 наиболее распространенных функций, в том числе, тригонометрические, гиперболические, ареа-функции, функции работы с целой и дробной частями чисел, показательные, степенные и логарифмические функции, генератор псевдослучайных чисел, и другие функции.

2. Позволяет наблюдать за процессом трансляции выражения в пошаговом (управляемом пользователем) режиме или режиме автоматического выполнения (каждое действие выполняется по истечении некоторого промежутка времени, задаваемого пользователем, после выполнения предыдущего действия). При этом на экране дисплея отображается содержимое входной строки, выходной строки и стека.

3. Наблюдать за процессом вычисления значения выражения по полученной постфиксной форме. При этом на экране дисплея отображается содержимое входной строки (в постфиксной форме), значения операндов и содержимое стека. Предусмотрено 2 режима работы: пошаговый режим и режим автоматического выполнения.

4. Каждое действие сопровождается словесными голосовыми комментариями (при желании звуковое сопровождение можно отключить), способствующими лучшему восприятию представляемых алгоритмов и позволяющими проводить занятия в отсутствии лектора.

 


3. Элементы теории вероятностей
и математической статистики


Дата добавления: 2016-01-04; просмотров: 18; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!