Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Раздел 3_2.pdf
Скачиваний:
23
Добавлен:
11.02.2016
Размер:
1.22 Mб
Скачать

Параметры процедур и функций

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

параметр1, параметр2, ... :тип или var параметр1, параметр2, ... :тип.

Параметры в списке отделяются друг от друга символом точка с запятой. Существует два типа параметров: значение и переменная. Они характеризуются

следующим:

Группа параметров без предшествующего ключевого слова var является списком параметров-значений.

Группа параметров, перед которыми стоит ключевое слово var и за которыми следует тип, является списком параметров-переменных.

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

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

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

Модули

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

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

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

Общая структура модуля

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

62

заголовка модуля, который определяет имя модуля и имеет следующий формат:

unit идентификатор_модуля;

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

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

Общая структура модуля может быть представлена следующей схемой: unit идентификатор_модуля;

interfaсe {интерфейсная секция} uses

{перечисление модулей} const

{раздел описания глобальных констант} type

{раздел описания глобальных типов переменных} var

{раздел описания глобальных переменных} {раздел заголовков процедур и функций} procedure имя_глобальной_процедуры(параметры); function имя_глобальной_функции(параметры):тип;

implementation {Секция реализации} uses

{перечисление модулей} const

{раздел описания локальных констант} type

{раздел описания локальных типов переменных} var

{раздел описания локальных переменных} {раздел реализации процедур и функций} procedure имя_локальной_процедуры(параметры); begin

{операторы реализации локальной процедуры} end;

function имя_глобальной_функции(параметры):тип; begin

{операторы реализации глобальной функции } end;

procedure имя_глобальной_процедуры(параметры); begin

{операторы реализации глобальной процедуры} end;

{секция инициализации} begin

end.

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

63

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

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

Здесь также описываются константы, переменные, процедуры и функции, являющиеся локальными, то есть недоступными основной программе.

Пример модуля:

unit Myunit; {myunit - имя модуля} interface {раздел интерфейса} const

Mmax=10; type

Mas1 = array[1..Mmax] of Integer;

{описан новый тип переменной,который теперь может быть использован в программе ользователя}

procedure Vvod(St: string; var Kk:Mas1; N:Integer);

{заголовок процедуры vvod предназначенной для ввода "n" данных в массив "kk" с названием “St”, которая может быть использова- на в программе пользователя}

procedure Sum(var M:Mas1; N:Integer; var Su:Integer); {заголовок процедуры sum позволяющей находить суммы "n" элементов массива "m", которая может быть использована в программе пользователя}

implementation {раздел реализации} var

N, I: Integer; {описание скрытых переменных}

Proc: String; {эти переменные: N,I, Proc видны (доступны) только в разделе реализации}

procedure Error(S:String);

{скрытая процедура, служит для вывода сообщения об ошибке; может вызываться только процедурами описанными в разделе реализации: Vvod и Sum}

begin

Writeln(Proc); {вывод значения скрытой переменной proc; эту переменную могут использовать только процедуры, описанные внутри раздела реализации}

Writeln('N= ',N,' ошибка: ',S); end; {конец процедуры Error }

procedure Vvod(St: string; var Kk:Mas1; N:Integer); {определение (реализация) процедуры Vvod}

begin

Proc:='ошибка в процедуре Vvod'; if N<= Mmax then begin

{если количество вводимых элементов укладывается в массив} for i:=1 to n do begin

Write(St,’[‘,I:2,’] = ’); Readln(Kk[I]);

end;

end else begin

Error('N > Mmax');

64

{если при вводе данных значение n> Mmax, то вызывается процедура Error, выводящая сообщение об ошибке}

end;

end; {конец процедуры Vvod}

procedure Sum(var M:Mas1; N:Integer; var Su:Integer); {определение (реализация) процедуры Error}

begin

Proc:='Ошибка в процедуре Sum'; Su:=0;

if N<=Mmax then for I:=1 to N do

Su:= Su + M[I]; else

Error('N > Mmax');

{если значение n>10,то вызывается процедура error выводящая сообщение об ошибке}

end; {конец процедуры Sum} end. {конец модуля}

Компиляция и использование модулей

Модуль компилируется таким же образом, как и обычные подпрограммы. Однако, поскольку модуль не является непосредственно выполняемой программной единицей, то в результате на магнитном диске компилятором создается не exe-модуль (готовая к выполнению программа), а дисковый файл с расширением "tpu" (Turbo Pascal Unit). Имя такого файла будет совпадать с именем файла, содержащего исходный текст этого модуля.

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

uses имя1, имя2,..., имяN>;

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

Если модуль "подключен" указанным выше образом, то к его интерфейсным объектам можно обращаться из программы точно также, как если бы эти объекты были описаны в самой программе. Например:

program Primer;

uses Myunit; {подключение модуля myunit} var

Aa,Bb : Mas1;

Sss ,I : Integer; begin

Write('Введите количество элементов в массивах I= '); Readln(I);

Vvod(‘AA’,Aa,I);

{ввод данных в массив Aa с помощью процедуры Vvod модуля

Myunit}

Vvod(‘BB’,Bb,I);

Sum(Aa,I,Sss);

{нахождение величины суммы sss i элементов массива aa c помощью процедуры sum модуля myunit}

Writeln('Сумма ',I,' элементов массива AA равна ',Sss); Writeln('Макс. колич. элементов массива AA Mmax= ',Mmax);

{значение Mmax определено в интерфейсном разделе} Sum(Bb,100,Sss);

{при подсчете суммы sss элементов массива bb будет обнаружено,

65