
- •Лекция 7 Подпрограммы, модули, файлы
- •1. Подпрограммы
- •1.1 Глобальные данные
- •1.4 Процедуры
- •1.5. Передача массивов в качестве параметров
- •1.5.1. Формальные параметры как массивы с фиксированными размерами
- •Var {main – главная программа }
- •1.5.2. Формальные параметры как массивы со «свободными» размерами
- •1.6. Передача подпрограммы как параметра
- •1.7. Рекурсивные подпрограммы
- •2. Модули
- •Interface {интерфейс модуля}
- •Implementation {реализация }
- •3. Файлы. Основные понятия и операции
- •3.1. Последовательный доступ к компонентам файла
- •3.2. Типизированные файлы
- •Стандартные процедуры и функции работы с типизированными файлами
- •3.3. Текстовые файлы
- •Процедуры и функции работы с текстовыми файлами
Лекция 7 Подпрограммы, модули, файлы
Очевидно, что сложные программы составляются из концептуальных блоков, значительно более крупных, чем отдельные операторы языка программирования. Такими блоками являются подпрограммы и модули.
Декомпозиция (разбиение) программы на небольшие логически завершенные блоки – это один из основных путей написания программы в ясной и понятной форме.
1. Подпрограммы
Подпрограмма – это логически завершенный компонент программы. Подпрограмма представляет собой некоторую функцию обработки информации, которая отображает конкретный набор аргументов в некоторый набор результатов. Определение подпрограммы состоит из двух частей: спецификации и реализации.
Спецификация (прототип) подпрограммы включает:
Тип подпрограммы: function (функция), procedure (процедура). function – подпрограмма явно возвращает только один результирующий объект данных; procedure – подпрограмма возвращает более одного значения или действия подпрограммы сводятся только к модификации ее аргументов вместо возвращения результата.
Имя подпрограммы;
Формальные параметры: аргументы (порядок следования, тип каждого аргумента) и результаты (порядок следования, тип каждого результата).
Реализация подпрограммы (тело подпрограммы) включает:
Описание локальных данных, используемых подпрограммой;
Операторы, задающие действия, которые должна выполнить подпрограмма.
Локальные данные и операторы инкапсулированы (спрятаны), так что ни локальные данные, ни операторы по отдельности не доступны пользователю подпрограммы. Пользователь может только вызвать подпрограмму. В тело подпрограмм могут входить определения других (вложенных) подпрограмм.
Вызывающая программа – программа (подпрограмма), которая обращается к подпрограмме (вызывает подпрограмму).
Оператор вызова – оператор вызывающей программы, с помощью которого она обращается к подпрограмме. Оператор вызова подпрограммы содержит:
имя подпрограммы;
список фактических параметров
Фактические параметры – это элементы вызывающей программы (константы, переменные, массивы и другие), значения которых пере даются в подпрограмму или возвращаются из нее. При вызове подпрограммы значения фактических параметров присваиваются соответствующим формальным параметрам (типы фактических и формальных параметров должны совпадать!).
Вызываемая программа – подпрограмма, к которой обращается вызывающая программа. Вызываемая программа возвращает управление вызывающей программе, которая продолжает свое выполнение с оператора, следующего за оператором вызова.
Схема передачи управления между вызывающей и вызываемой программами приведена на рисунке 1.
Рисунок 1 – Схема передачи управления между вызывающей
и вызываемой программами
Обмен информацией между вызывающей и вызываемой программами может осуществляться с использованием глобальных данных или передачей параметров.
1.1 Глобальные данные
Глобальные данные – это данные (константы, переменные, массивы и другие), объявленные в начале программы и доступные в подпрограммах и «главной программе» (основном блоке программы).Глобальные данные следует использовать только для передачи информации от одной программы (подпрограммы) к другой. Например, одна подпрограмма формирует значения данных, а другая подпрограмма использует эти значения.
1.2 Способы передачи параметров
Когда вызывающая программа обращается к подпрограмме, требуется связать фактические параметры вызывающей программы с формальными параметрами подпрограммы. Чаще всего применяются два подхода: либо фактический параметр вычисляется и полученное значение передается формальному параметру (передача значением), либо формальному параметру становится доступен адрес значения фактического параметра (передача по адресу).
Передача значением
В этом случае формальный параметр a обрабатывается в подпрограмме как локальная переменная, инициализируемая в начале выполнения подпрограммы значением соответствующего фактического параметра x.
В операторе вызова фактическим параметром может быть:
Константа;
Переменная;
Выражение;
Функция.
Значение фактического параметра при изменении соответствующего ему формального параметра не изменяется
Передача по адресу
В этом случае формальный параметр a (описание параметра начинается со слова var) обрабатывается в подпрограмме как переменная, адрес которой есть адрес соответствующего фактического параметра x.
В операторе вызова фактическим параметром может быть только переменная. Любое изменение формального параметра a есть изменение соответствующего ему фактического параметра x.
1.3 Функции
Формат спецификации функции:
function <имя>(<список формальных параметров>): <тип результата>;
Для возвращения результата функция должна содержать хотя бы один оператор присваивания следующего вида:
<имя подпрограммы> := <результат>;
где результат – это вычисленное значение в подпрограмме (константа, переменная, элемент массива и другие элементы данных).
Вызов функции включается в оператор языка Pascal.
Пример вызова функции P(x):
y:= P(x); {вызов P(x) в операторе присваивания}
if P(x)>0 then {вызов P(x) в операторах if и writeln }
writeln(P(x));
В качестве примера рассмотрим описание и использование функции
power, которая возводит переменную base в степень exponent – baseexponent.
function power( base, exponent: real): real;
begin
power:= exp( exponent * ln(base)); {exp, ln – встроенные функции Pascal: }
{ exp (x) – ex}
{ ln (x)– натуральный логарифм x }
end;
Вызов функции power может быть, например, таким: writeln (power(3, 5));