Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Процедуры_функции_осень_2012ред.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
120.32 Кб
Скачать

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) Гораздо проще контролировать потоки передаваемой информации.

В связи с этим НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ выполнять обмен информацией только через параметры.