Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Пример 1.6



Использование процедуры с параметрами процедурного типа. Программа вычисления значений натуральных логарифмов (Ln) или экспонент (Ехр) элементов одномерного массива. Процедура Log вычисляет логарифмы элементов массива. Процедура Step вычисляет экспоненты элементов массива. Процедура Vizov вызывает нужную процедуру Log или Step и выводит результаты их выполнения.

Program Proced;

Const

Razmer = 4;

Type

Mas = Array [1 .. Razmer] Of Real;

Proc = Procedure (Х : Mas; Var Х1: Mas); {Объявление процедурного типа}

Var

Vec1: Mаs; {Vec1 – массив из четырех вещественных чисел}

Priznak, N, I: Integer; {Priznak – признак выбора нужной процедуры Log или Sтер}

{$f+} {Директива компилятора включения дальнего вызова в памяти}

{Процедура вычисления Ln элементов одномерного массива}

Procedure Log (У: Mas; Var У1: Mas);

Var

J: Integer; {J – локальная переменная}

Begin

Writeln (' Вызвана процедура Log. Значения Ln (Vec1[J]): ');

For J:= 1 To Razmer Dо

Y1[J]:= Ln (Y[J]);

End;

{Процедура вычисления Ехр элементов одномерного массива}

Procedure Step (У: Mas; Var У1: Mas);

Var

N: Integer; {N – локальная переменная}

Begin

Writeln (' Вызвaна процедура Step. Значения ЕХР (Vec1[J]): ');

For N:= 1 To Razmer Do

У1[N]:= Ехр (Y[N]);

End;

{$f-} {Директива компилятора выключения дальнего вызова в памяти}

{Процедура вызова вычисляющих процедур и вывода результатов их работы}

Procedure Vizov (G: Mas; Proced: Рrос ); {Proced — параметр процедурного типа}

Var

N: 1 .. Razmer; {N, Rez – локальные переменные }

Rez: Mas;

Begin

Proced (G, Rez); {Вызов вычисляющей процедуры}

For N:= 1 To Razmer Do Write (Rez [N]); {Вывод результатов работы вызванной процедуры}

Writeln;

End;

Begin {Вызывающая программа}

Writeln(' Введите значения элементов массива в последовательности:');

Writeln ('Vес1[1] Vecl[2] ... Vec1[', Razmer, ']');

For I:= 1 To Razmer Dо

Read (Vec1[I]); {Ввод массива Vec1}

Readln;

Writeln ('Введите признак вида вычислений: ');

Writeln (' 0для вычисления Ln(Vес1), 1для вычисления Exp(Vec1)');

Rеаdln (Priznak); {Ввод признака вида вычислений}

If Priznak = 0 Then

Vizov (Vес1, Log) {Вызов процедуры Vizov. Фактические параметры –массив Vec1 и имя процедуры Log}

Else

If Priznak = 1 Then

Vizov (Vес1, Step) {Вызов процедуры Vizov. Фактические параметры – массив Vec1 и имя процедуры Step}

Else

Writeln ('Ошибка признака'); {Неверно указано значение признака вычислений}

End.

Программа, приведенная в данном примере, выполняет обработку элементов одномерного массива Vec1 типа Mas, состоящего из четырех вещественных чисел. В зависимости от значения переменной Priznak вычисляются натуральные логарифмы или экспоненты элементов массива. Результаты вычислений выводятся на экран.

Данная программа содержит три процедуры - Log, Step, Vizov. Процедура Log вычисляет значения натуральных логарифмов элементов массива Vec1, передаваемого на вход процедуры с помощью параметра-значения Y типа Mas. Результаты работы процедуры присваиваются параметру-переменной Y1 типа Mas.

Процедура Step вычисляет значение экспоненты элементов массива Vec1. Для передачи исходного массива на вход процедуры также используется параметр-значение Y типа Mas, а для формирования и хранения ее результатов - параметр-переменная Y1 того же типа.

Процедура Vizov служит для вызова необходимой вычисляющей процедуры и вывода результатов вычислений. Параметрами процедуры Vizov являются параметр-значение G типа Mas и параметр Proced процедурного типа Рrос

Рrос = Procedure (Х: Mas; Var Xl: Mas);

объявленного в разделе Type вызывающей программы.

В вызывающей программе вводятся значения четырех элементов массива Vec1 и значение Priznak признака вида вычислений (логарифм или экспонента).

Затем вызывается процедура Vizov. В качестве первого фактического параметра при этом используется Vec1. Вторым фактическим параметром в зависимости от значения переменной Priznak является имя процедуры Log или Step.

Так как процедуры Log, Step передаются в качестве фактического параметра, то они должны компилироваться с директивой компилятора {$f+} (данная директива записана перед первой из вышеназванных процедур - Log). Для отмены данной директивы после второй из процедур (Step) помещена директива компилятора {$f-}.

Таким образом, при вызове процедуры Vizov используется оператор вызова вычисляющей процедуры

Proced (G, Rez);

В зависимости от конкретного значения процедурной переменной Proced будет вызвана к исполнению либо процедура Log, либо процедура Step. Результаты работы вызванной процедуры помещаются в массив Rez, являющийся локальной переменной процедуры Vizov, и выводятся на экран.

1.2.11. Использование производных типов в качестве параметров подпрограмм

Производные типы могут использоваться в качестве параметров подпрограмм. Они могут применяться как параметры-переменные, параметры-значения или параметры-константы. Во всех случаях фактическими параметрами могут быть только переменные соответствующего типа, но не выражения (за исключением строковых констант).

В заголовке подпрограмм для указания типов формальных параметров могут использоваться только имена типов, но не их задание.

Например, нельзя написать:

Procedure X (Y: Array [1 .. 10] Of Integer; I: 1 .. 100);

Нужно предварительно определить типы:

Type

Mas = Array [1 .. 10] Of Integer;

Diap = 1 .. 100;

Procedure X (Y: Mas; I: Diap);

При использовании массива в качестве параметра-значения при входе в подпрограмму образуется локальная переменная-массив, куда заносится значение фактического параметра-массива, то есть осуществляется копирование массива. На это требуется дополнительное время. Кроме того, для размещения данной локальной переменной-массива требуется дополнительная память.

Поэтому использования массивов как параметров-значений без необходимости следует избегать.

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

Аналогично следует передавать и переменные других производных типов, используемые в качестве параметров подпрограмм.

1.2.12. Принцип локализации имен

Трудоемкость разработки многих реальных программ составляет десятки лет. Для изготовления таких программ обычно привлекается одновременно большое количество программистов, каждый из которых разрабатывает свой фрагмент программы (подпрограмму). При этом важно, чтобы программисты не зависели друг от друга при выборе идентификаторов.

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

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

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





Дата публикования: 2014-12-11; Прочитано: 199 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...