- •Системное программное обеспечение (pascal)
- •1.1.1. Пример вывода числа в виде строки символов.
- •1.2. Рекурсивные структуры данных и рекурсивные подпрограммы.
- •1.3. Линейная рекурсия в списке.
- •1.4. Деревья.
- •1.4.1. Обход дерева.
- •1.4.2. Двоичное (бинарное) дерево с указателями на объекты произвольного типа.
- •2. Функция ввода
- •3. Таблица имен
- •3.1. Поиск в таблице.
- •3.2. Основные алгоритмы поиска.
- •3.2.1. Прямой поиск строки.
- •3.2.4. Бинарный поиск.
- •3.3. Назначение и принципы организации таблиц идентификаторов.
- •3.3.4. Методы разрешения коллизий.
- •3. Метод построения таблиц, имеющих форму бинарного дерева.
- •3.3.5. Принципы работы хеш-функций.
- •3.3.6. Построение таблиц идентификаторов на основе хеш-функций.
- •1. Алгоритм организации таблицы идентификаторов.
- •2. Алгоритм поиска элемента в таблице идентификаторов.
- •3.3.8. Построение таблиц идентификаторов по методу цепочек.
- •1. Алгоритм работы метода цепочек.
- •2. Алгоритм поиска элемента в таблице идентификаторов.
- •4. Обработка ошибок
- •5. Драйвер
- •II. Контрольные вопросы
- •III. Последовательность выполнения индивидуального задания.
Системное программное обеспечение (pascal)
Лабораторный курс
доцента кафедры информационных систем и компьютерных технологий
Пановой Т.В. (panova_tat@rambler.ru)
Лабораторная работа № 2
Тема:
Калькулятор
Цель:
ознакомиться с подходом организации основных составных частей калькулятора.
I. Теоретическая часть.
Калькулятор – это миниатюрный компилятор, в котором программа синтаксического разбора производит синтаксический анализ, функция ввода осуществляет ввод и лексический анализ, в таблице имен хранится долговременная информация, а драйвер распоряжается инициализацией, выводом и обработкой ошибок.
Таким образом, калькулятор состоит из четырех основных частей:
1. программы синтаксического разбора;
2. функции ввода;
3. таблицы имен;
4. управляющей программы-драйвера.
1. Программа синтаксического разбора
Программа синтаксического разбора является последовательностью строк, каждая из которых состоит из одного или более выражений, разделенных запятой. Основными элементами выражения являются числа, имена и операции *, /, +, - (унарный и бинарный) и =. Имена не обязательно должны описываться до использования.
Обычно используется метод синтаксического анализа, который называется рекурсивным спуском (популярный и простой нисходящий метод).
1.1. Рекурсия.
Рекурсия – это такая организация алгоритма, при которой процедура обращается к самой себе, и такая подпрограмма называется рекурсивной. На первый взгляд может показаться, что рекурсия – это просто аналог циклической организации алгоритма, но на самом деле идея рекурсии сложнее.
Если во время работы программы в каждый момент в памяти компьютера находится несколько незавершенных копий исходной процедуры, то их количество определяет глубину рекурсии или глубину рекурсивных вызовов.
Существует понятие хвостовой рекурсии, когда рекурсивный вызов является последней командой процедуры.
Если в процедуре рекурсивный вызов не является завершающей инструкцией, то такая рекурсия называется вложенной рекурсией.
1.1.1. Пример вывода числа в виде строки символов.
Цифры генерируются в обратном порядке – младшие цифры получаются раньше старших, а выводится они должны в правильной последовательности.
Способы решения:
1. запомнить цифры в некотором массиве в том порядке, как они получались, а затем печатать их в обратном порядке;
2. воспользоваться рекурсией, при которой рекурсивная функция сначала вызывает себя, чтобы напечатать все старшие цифры, и затем печатает последнюю младшую цифру.
1.1.2. Пример рекурсии – быстрая сортировка, предложенная Хоаром в 1962 г.
Для заданного массива выбирается один элемент, который разбивает остальные элементы на два подмножества: элементы, меньшие данного элемента, и элементы, которые не меньше. Затем одна и та же процедура рекурсивно применяется к двум полученным подмножествам. Если в подмножестве менее двух элементов, то сортировать нечего, и рекурсия завершается.
Рекурсивная подпрограмма не обеспечивает ни экономии памяти, поскольку требуется где-то поддерживать стек значений, подлежащих обработке, ни быстродействия, но по сравнению со своим нерекурсивным эквивалентом она, как правило, короче, и часто намного легче для написания и понимания. Такого рода программы особенно удобны для обработки рекурсивно определяемых структур данных, например, деревьев.