- •Содержание
- •Часть 1. Основные понятия программирования §1.1. Этапы разработки программного обеспечения
- •§1.2. Основные сведения об алгоритмах Понятие алгоритма
- •Свойства алгоритма
- •Формы записи алгоритмов
- •Блок-схемы алгоритмов
- •§1.3. Языки программирования
- •§1.4. Паскаль и Object Pascal, Турбо-Паскаль и Delphi
- •Контрольные вопросы
- •Язык, оболочка и интегрированная среда разработки
- •Часть 2. Общие сведения о языке Паскаль §2.1. Алфавит и служебные слова
- •Описание общих конструкций языка
- •§2.2. Структура программы
- •§2.3. Разделы описаний Описание меток
- •Определение констант
- •Определение типов
- •Описание переменных
- •Контрольные вопросы
- •Часть 3. Простые типы данных Иерархия типов
- •§3.1. Целые типы
- •§3.2. Вещественные типы
- •§3.3. Логический тип
- •§3.4. Литерный тип
- •§3.5. Перечисляемый тип
- •§3.6. Диапазоны (интервальный тип)
- •Дополнительные типы в Delphi
- •Контрольные вопросы
- •Глава 4. Операторы языка Паскаль Выражения
- •§4.1. Оператор присваивания
- •§4.2. Ввод-вывод данных
- •§4.3. Составной оператор
- •§4.4. Пустой оператор
- •§4.5. Безусловный оператор перехода
- •§4.6. Условный оператор
- •§4.7. Оператор цикла с параметром for
- •§4.8. Оператор цикла с предусловием while
- •§4.9. Оператор цикла с постусловием repeat
- •§4.10. Оператор выбора case
- •Контрольные вопросы
- •Глава 5. Процедурное программирование §5.1. Функции
- •Параметры – значения
- •Параметры – переменные
- •Бестиповые параметры
- •§5.2. Процедуры
- •Правила использования подпрограмм
- •Рекурсия
- •Директивы
- •Процедурные типы
- •Пример использования подпрограмм
- •Контрольные вопросы
- •Глава 6. Структурированные типы данных
- •§6.1. Массивы
- •§6.2. Строки
- •§6.3. Записи
- •§6.4. Множества
- •Пример использования множеств
- •§6.5. Файлы
- •Установочные и завершающие операции
- •Операции ввода-вывода
- •Перемещения по файлу
- •Пример работы с файлом
- •Обработка ошибок ввода-вывода
- •Специальные операции
- •Пример объединения двух файлов
- •Текстовые файлы
- •Стандартные текстовые файлы
- •Файлы без типа
- •Контрольные вопросы
- •Глава 7. Динамические структуры данных §7.1. Динамические переменные
- •§7.2. Указатели
- •Работа с динамическими переменными
- •Пример двухсвязанного циклического списка
- •Указатели без типа
- •Контрольные вопросы
- •Глава 8. Низкоуровневые возможности Паскаля §8.1. Язык Ассемблер
- •§8.2. Доступ к аппаратуре Доступ к памяти
- •Доступ к портам ввода-вывода
- •Работа по прерываниям
- •Контрольные вопросы
- •Глава 9. Модули §9.1. Основные понятия
- •§9.2. Использование модулей
- •§9.3. Стандартные модули
- •§9.4. Модуль Crt
- •Работа с экраном в текстовом режиме
- •Работа с клавиатурой
- •Работа со звуком
- •§9.5. Модуль dos
- •§9.6. Графический режим монитора
- •Контрольные вопросы
- •Глава 10. Введение в объектно-ориентированное программирование §10.1. История развития программирования
- •Понятие объекта
- •§10.2. Свойства объектов
- •Раннее и позднее связывание
- •§10.3. Виртуальные методы
- •Конструкторы и деструкторы
- •§10.4. Динамические объекты
- •Скрытые поля и методы
- •Контрольные вопросы
- •Литература
Рекурсия
В языке Паскаль допустимо обращение подпрограммы самой к себе, то есть рекурсивные вычисления.
Решение некоторой задачи рекурсивно, если его можно выразить в терминах решения более простой версии этой же задачи. Природа многих математических алгоритмов рекурсивна, поэтому рекурсия достаточно широко применяется в программировании.
Большинство циклических алгоритмов с известным количеством повторений можно записать с помощью рекурсии, например, вычисление факториала или суммы:
Program SumRec;
Var S:real;
Procedure Sum(Var S:real;N:integer);
Begin
If N=1 then
S:=1
Else
Begin
Sum(S,N-1);
S:=S+1/N
end
end;
Begin
sum(S,100);
Writeln('Сумма=',S:10:4)
end.
При использовании рекурсивных вычислений необходимо внимательно следить за параметром выхода из рекурсии, так как эта конструкция является причиной трудно обнаруживаемых программных ошибок. Рекурсия применяется только при принципиальном упрощении программы при вычислении, например, кратных интегралов, дифференциальных уравнений высоких порядков, решении комбинаторных задач.
Директивы
Директивы используются для задания параметров трансляции, а так же при описании программ. Единственной стандартной директивой языка Паскаль является директива опережающего описания Forward.
Так как имена в Паскале просматриваются последовательно, то при обращении одной программы к другой последняя должна быть описана ранее вызывающей подпрограммы. Если этого сделать нельзя, например, при перекрестных ссылках, то используется директива Forward.
При этом в начале раздела описывается только заголовок подпрограммы, а сама подпрограмма записывается далее через несколько блоков, но только с указанием в заголовке его имени, например:
Procedure Q(x:T); Forward;
Procedure P(y:T);
…
Begin
…
Q(A);
…
end;
Procedure Q;
…
Begin
…
P(B);
…
end;
Хотя по прямому назначению эта директива используется очень редко, но для больших программ, составляющих сотни страниц, удобно в самом начале компактно собрать все названия подпрограмм с помощью директивы опережающего описания.
В Турбо-Паскале есть еще несколько директив, относящимся к подпрограммам. Если подпрограмма или группа подпрограмм разработана вне системы Турбо-Паскаль, например, на языке Ассемблер или Си, а их объектный код находится в объектном файле, то такую подпрограмму можно подключить с помощью директивы External, дополнительно задав директиву компилятора $L с именем OBJ-файла:
Procedure SqRoots(A,B,C:word); external;
…
{$L ROOTS.OBJ}
Для обеспечения корректности такого подключения необходимо соблюдать определенные межъязыковые соглашения о связях.
Другим вариантом создания машинного кода подпрограмм с непосредственным указанием машинных команд является директива Inline. Так же можно составлять программы с использованием мнемонических или ассемблерных обозначений команд, используя директиву Assembler.
Для подпрограммы допускается указание типа вызова процедуры: дальний (межсегментный) или ближний (внутри одного сегмента), задаваемые соответственно словами Far и Near. Они эквивалентны директивам компилятора {$F+} и {$F‑}.
Подпрограмма может вызываться не только явно в тексте программы, но и по определенному событию, – прерыванию. В этом случае используется директива Interrupt, служащая для определения процедур прерываний. Такие процедуры должны использовать только дальний вызов.
