- •Функция.
- •Function имя (список; параметров):тип;
- •1) Возвращаемое значение – скаляр;
- •2) Тип возвращаемого значения должен быть базовым;
- •3) Обязательной является хотя бы однократная запись в теле функции оператора вида:
- •I,max: integer;
- •Модули.
- •Interface
- •Implementation
- •Interface
- •Implementation
- •I,j, X:integer;
- •1: Begin
- •2: Begin
- •3: Begin
- •Var max,imax:integer);
- •I: integer;
Var max,imax:integer);
VAR
I: integer;
BEGIN
MAX:=A[1];
Imax:=1;
FOR I:=1 TO N DO
IF A[I]>max
THEN BEGIN
max:=A[I];
Imax:=I;
END;
END;
{Тело главной вызывающей программы}
begin
F := true; { Флаг управления циклом меню }
while (F = true) do
begin
repeat
writeln(' Заголовок меню');
writeln('1. Первый вариант действий');
writeln('2. Второй вариант действий ');
writeln('3. Третий вариант действий’);
writeln('4. Четвёртый вариант действий ');
writeln('5. Выход из программы');
writeln('Ваш выбор:');
readln (choice2);
val (choice2, choice, code);
if (code<>0)
then writeln ('Вы ввели не число!’,
’ Повторите ввод! ');
until code=0 ;
case choice of
1: begin
{ Реализация первого варианта действий }
{ операторы }
. . .
End;
2: begin
{ Реализация второго варианта действий }
{ операторы }
. . .
End;
3: begin
{Реализация третьего варианта действий }
{ операторы }
MAX_VECT (n1, A1,MAX1,IMAX1);
. . .
End;
. . . . .
Перемещение процедуры из главной программы в модуль
Создаётся модуль (библиотека) для размещения подпрограмм. В примере – это процедура «максимум вектора». Из главной программы процедура переносится в модуль. Туда же - и тип описания одномерного массива (Это не обязательно. Тип может оставаться и в главной программе). Обращение к процедуре в ветви главной программы остаётся без изменений.
PROGRAM Menu;
Uses labrabota;
{ Подключение созданного модуля }
Var
A1 : VCT;
exit_ans : string;
choice, code : integer;
F, Fl : boolean;
N1,H,I,Imax1,MAX1 : INTEGER;
{процедура перенесена в модуль}
{Тело главной вызывающей программы}
begin
F := true; { Флаг управления циклом меню }
while (F = true) do
begin
repeat
writeln(' Заголовок меню');
writeln('1. Первый вариант действий');
. . . . . .
case choice of
. . . . . .
3: begin
{Реализация поиска максимума }
{ операторы }
MAX_VECT (n1, A1,MAX1,IMAX1);
. . .
End;
. . . . .
{ содержание файла –модуля. Его имя – LABRABOTA.pas }
Unit labrabota;
{В модуле могут размещаться и другие процедуры }
Interface
Type
VCT = ARRAY [1..15] OF INTEGER;
PROCEDURE MAX_VECT (n : intrger; A : VCT;
var MAX,IMAX:INTEGER);
Implementation
PROCEDURE MAX_VECT (n : integer; A : VCT;
var MAX,IMAX:INTEGER);
VAR
I: INTEGER;
BEGIN
MAX:=A[1];
Imax:=1;
FOR I:=1 TO N DO
IF A[I]>max
THEN BEGIN
max:=A[I];
Imax:=I;
END;
END;
End. { МОДУЛЬ }
Область действия имён.
(Область видимости имён)
В связи с тем, что подпрограммы могут быть размещены в тексте вызывающей программы (внутренние блоки), возникает и начинает действовать понятие области действия (видимости) имён.
Переменная, объявленная в блоке, действует (видима) во всех блоках внутренних по отношению к данному, за исключением блоков, где она пере объявлена явно, то есть встречается в разделе Var. Это основано на следующем механизме:
Информация для распределения памяти из раздела Var используется транслятором, память выделяется при входе в блок и освобождается при выходе из него. Переменная, объявленная в блоке является локальной для этого блока и глобальной для всех блоков, внутренних к данному, т.е. видна в них. Этот механизм может использоваться для обмена информацией между вызывающей и вызываемыми программами. Метод хорош тем, что не нуждается в специальных приёмах передачи. Вместе с тем существенными недостатками являются:
0) легкость внесения изменений, в том числе и некорректных, в исходные данные;
1) затруднённый поиск места, из которого было сделано некорректное изменение глобальных данных.
2) способ перестаёт работать, если программы становятся внешними по отношению друг к другу, перемещаются в библиотеку (модуль).
Способ обмена информацией через параметры более трудоёмок, но:
1) работает при любом взаимном расположении подпрограмм и вызывающей программы.
2) Гораздо проще контролировать потоки передаваемой информации.
В связи с этим НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ выполнять обмен информацией только через параметры.
