Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SPO / LAB2_PAS / Lab2_SPO_PAS.doc
Скачиваний:
35
Добавлен:
26.03.2015
Размер:
169.47 Кб
Скачать

19

Системное программное обеспечение (pascal)

Лабораторный курс

доцента кафедры информационных систем и компьютерных технологий

Пановой Т.В. (panova_tat@rambler.ru)

Лабораторная работа № 2

Тема:

Калькулятор

Цель:

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

I. Теоретическая часть.

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

Таким образом, калькулятор состоит из четырех основных частей:

1. программы синтаксического разбора;

2. функции ввода;

3. таблицы имен;

4. управляющей программы-драйвера.

1. Программа синтаксического разбора

Программа синтаксического разбора является последовательностью строк, каждая из которых состоит из одного или более выражений, разделенных запятой. Основными элементами выражения являются числа, имена и операции *, /, +, - (унарный и бинарный) и =. Имена не обязательно должны описываться до использования.

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

1.1. Рекурсия.

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

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

Существует понятие хвостовой рекурсии, когда рекурсивный вызов является последней командой процедуры.

Если в процедуре рекурсивный вызов не является завершающей инструкцией, то такая рекурсия называется вложенной рекурсией.

1.1.1. Пример вывода числа в виде строки символов.

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

Способы решения:

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

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

1.1.2. Пример рекурсии – быстрая сортировка, предложенная Хоаром в 1962 г.

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

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

Соседние файлы в папке LAB2_PAS