Название: Алгоритмы и программы (Афанасьева Т. В.)

Жанр: Информационные системы и технологии

Просмотров: 1340


9.3. формальные и фактические параметры

 

Все формальные параметры можно разбить на четыре категории:

 

1) параметры-значения (они в основной программе подпрограммой не меняются);

2) параметры-переменные (их подпрограмма может изменить в основной программе);

3) параметры-константы (используются только в версии 7.0);

4) параметры без типа.

 

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

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

описание массива или записи.

 

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

 

function Max(A: array[1..100] of Real): Real;

 

Чтобы  правильно  записать  этот  заголовок,  следует  в  основной программе ввести тип-массив, а затем использовать его в заголовке:

 

type tArr = array[1..100] of Real;

function Max(A: tArr): Real;

 

Пример 9.3. Функция вычисления максимального элемента массива,

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

 

Program Maxelement; Type

tArr=array[1..100] of Integer; Var

Massiv : tArr; Maxim    : Integer; K ,X  : Byte;

Function Max(Mas : tArr; N: Byte): Integer; Var Ma : Integer;

i : Byte; Begin

Ma := Mas[1];

for i := 2 to N do

if Ma < Mas[i] then

Ma := Mas[i]; Max := Ma; End;{Max}

{**************************************} Begin

randomize;

k := random(10) + 1;    {размер массива}

write(' элементы массива :');

for x := 1 to K do begin

Massiv[x] := random(100);

write(' ',massiv[x]);

end;

Maxim := Max(Massiv,K);

writeln('            максимальный элемент массива : ',Maxim:3); End.

 

9.3.1. Параметры-значения

 

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

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

 

function Mult(X, Y: Integer; A: REAL):REAL;

 

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

9.3 формальные параметры являются параметрами-значениями.

 

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

 

Пример 9.4. Программа вычисления корней уравнения. program nat3;

uses crt;

var       a,b,c:integer;

x1,x2:real;

procedure srt( a1,b1,c1:integer );{вычисление корней уравнения}

{a1,b1,c1–формальные параметры–значения}

var       d:real;

{d локальная переменная}

begin d:=b1*b1–4*a1*c1; if d<0.0 then begin

writeln('нет корней.');

end else

if d=0.0 then begin

writeln('корни равны.');

x1:=–b1/(2*a1);

writeln(' x= ',x1:7:2);

end else begin

x1:=(–b1+sqrt(d))/(2*a1); x2:=(–b1–sqrt(d))/(2*a1); writeln('  x1= ',x1:7:2,','); writeln('           x2= ',x2:7:2,'.');

end;

end;{srt}

****** MAIN ********}

begin

writeln(' Пример 9.4:вычисление корней квадратного уравнения ');

writeln('         (коэффициенты уравнения вводятся с     '); writeln('           помощью датчика случайных чисел).    '); randomize;

a:=random(10); a:=a–random(10); b:=random(10); b:=b–random(10); c:=random(10); c:=c–random(10);

writeln(' Решаемое уравнение: ');

writeln('            ',a,'*x*x+',b,'*x+c=0.');

writeln(' Ответ: ');

{вызов процедуры}

srt(a,b,c);

end.

 

9.3.2. Параметры-переменные

 

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

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

Пример.

 

procedure MaxMin(A: tArr; var Max, Min: Real; N: Word);

 

Здесь Max, Min – параметры-переменные,  A и N – параметры- значения.   Тип параметров-переменных может быть любым,   включая и файловый. При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра должна использоваться переменная идентичного типа.

Так, если формальный параметр имеет тип, определенный следующим образом:

 

type tArr= array[1..10] of Integer;

 

то и фактический параметр должен быть переменной или типизированной константой типа tArr.

 

Пример 9.5. Процедура, меняющая местами первый и последний элемент массива.

 

Procedure MM(var Mas : tArr; N: Byte);

begin

Ma := Mas[1]; Mas[1]:=Mas[n]; Mas[n]:=Ma;

end;

 

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

 

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

 

9.3.3. Параметры-константы

 

Часто в качестве параметра в подпрограмму следует передать ту или иную переменную, но изменять ее подпрограмма не должна. В этой ситуации параметр лучше передать как    параметр-константу. Такой параметр, если  он структурированного типа,  передается своим адресом, но предусматривается защита от его изменения.

function NewString(const S: integer):integer;

Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра.

 

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

 

Program NoolevoiElement; Type

tArr=array[1..15] of Integer; Var

Massiv : tArr; Ma,Number,K ,X           : Byte;

Function Nool(const Mas : tArr; N: Byte): Byte; Var

i: Byte; begin Nool:=0;

for i := 1 to N do

if Mas[i]=0 then begin

Nool := i;

Exit; {выход из подпрограммы}

end       else Ma := Ma +1; {Ma-глобальный параметр}

end;{Nool} Begin randomize;

K := random(10) + 1;

writeln(' размер массива : ',K); write(' элементы массива :'); for x := 1 to K do

begin

Massiv[x] := random(100);

write(' ',massiv[x]);

end;

Ma := 0;

Number := Nool(Massiv,K);

if Ma = K then writeln(' нулевого элемента в массиве нет') else writeln(' первый нулевой элемент в массиве с номером ',Number); End.

9.3.4. Параметры без типа

 

В Turbo Pascal можно использовать параметры-переменные   и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.

 

Пример.

function Equal(var Param1, Param2; Len: Word):Boolean;

 

Здесь Param1,   Param2 – параметры–переменные без типа (вместо них можно  использовать, например, любые переменные простого типа, типа-массив, типа-запись и т. д.); Len – параметр-значение.

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

 

Пример   9.7.   Функция   вычисления   максимального   элемента   в массиве.

function Max(Var Mas; N: Byte;Var Ma:integer);

type

tArray = array[1..Maxint] of Integer;

{тип массива максимального размера}

var

i: Byte;

begin

Ma := tArray(Mas)[1]; {преобразование}

for i := 2 to N do

if tArray(Mas)[i] > Ma then

Ma := tArray(Mas)[i];

end;

В этом случае в качестве первого  пeредаваемого  параметра  можно использовать  любой массив (и не только массив),  так что подпрограмма становится более универсальной.

 

9.3.5. Массивы открытого типа

 

В  версии 7.0  можно в  качестве параметров-переменных         исполь-

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

В качестве фактического параметра в этом случае            можно исполь-

зовать  массив  любого размера, однако массив должен состоять из тех же

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

 

Пример   9.8.   Функция   вычисления   максимального   элемента   в массиве.

function Max(var Mas : Array of Integer): Integer;

var Ma: Integer;

i: Byte;

begin

Ma := Mas[0];

for i := 1 to High(Mas) do         {цикл до наибольшего индекса}

if Ma < Mas[i] then

Ma :=Mas[i]; Max := Ma

end;

 

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

 

Program SummaElementov; Type

tArr=array[1..15] of Integer; Var

Massiv                         : tArr; Ma,K,X                         : Byte; C          : Integer; Sum               : Integer;

Function Summa(var Mas : Array of integer): Integer; Var S: Integer;

i: Byte;

begin

S := 0;

for i := 0 to High(Mas) do

if Mas[i] < C then S := S + Mas[i] else Ma := Ma + 1; Summa := S;

end;{Summa}

Begin randomize;

K := random(10) + 1;

writeln(' размер массива : ',k); write(' элементы массива :'); for x := 1 to K do

begin

Massiv[x] := random(100) – 50;

writeln(' ',Massiv[x]);

end;

writeln(' введите число для сравнения '); READLN(C);

Ma := 0;

Sum := Summa(Massiv);

if Ma=K then writeln(' элементов меньше ',C:3,' в массиве нет')

else begin

writeln(' сумма элементов массива меньше числа ',C:3);

writeln(' равно ',Sum);

end;

End.

 

Пример 9.10. Программа сортировки столбцов двумерного массива модифицированным методом простого выбора.

 

program nat6;

uses crt;

type

d=array[1..4] of integer;

b=array[1..4] of d;        {двумерный массив}

var

c:b; s:d; i,j:byte;

procedure sort(   var a:array of integer);   {сортировка одномерного массива, формальный параметр a типа открытый массив  передается по ссылке}

var

i,j,k:byte;

m:integer;

{i,j,k,m–локальные переменные}

begin

{high–возвращает       верхний          предел            диапозона      значений аргумента}

for i:=0 to high(a) do begin

m:=a[i];

k:=i;

for j:=i+1 to high(a) do if a[j]>m then begin

m:=a[j];

k:=j;

end; a[k]:=a[i]; a[i]:=m;

end;

end;{sort}

{****** MAIN **************}

begin

writeln(' Пример : расположить по убыванию элементы '); writeln('          каждого столбца двумерного массива '); writeln('        (элементы массива вводятся с         ');

writeln('            помощью датчика случайных чисел). ');

writeln(' Исходный массив: ');

randomize;

for i:=1 to 4 do begin

for j:=1 to 4 do begin

c[j,i]:=random(100);

write(c[j,i],' ');

end; writeln; end;

for j:=1 to 4 do begin

{move–копирует заданное количество последоватепльных байтов из исходной области памяти в назначенную область}

move(c[j],s,8);

{вызов процедуры,где s типа массив фактический параметр}

sort(s);

move(s,c[j],8);

end;

writeln(' Измененный массив: ');

for j:=1 to 4 do

begin

for i:=1 to 4 do write(c[i,j],' ');

writeln;

end;

end.

 

Задания для самостоятельного выполнения

А.        С         помощью        процедур        сортировки    одномерного  массива

(параметр – одномерный массив) реализовать следующие задачи.

А.1. Расположить по возрастанию элементы каждой строки  двумер-

ного массива.

А.2. Расположить по убыванию элементы каждого столбца двумер-

ного массива.

А.3. Расположить четные элементы двумерного массива  в  порядке убывания их значений.

А.4.  С  помощью  процедуры  сортировки  в  каждом  столбце двумерного массива определить три максимальных элемента.

А.5. Расположить элементы в первой и последней строке   по возрастанию, а в остальных – по убыванию значений.

 

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

В.1. Решить уравнение линейной алгебры вида: (A*X –beta2* Y )* B2   + Z, где

A, B – матрицы, X, Y, Z – вектора, beta - константа.

В.2. Решить уравнение линейной алгебры вида: X2* (AT – B)T   * Y –Z, где

A, B – матрицы, X, Y, Z – вектора, T – операция транспонирования.

В.3. Решить уравнение линейной алгебры вида: Y* ( alfa* A2   –B2)2 –X , где

A, B – матрицы, X, Y – вектора, alfa – скаляр. В.4. Решить уравнение линейной алгебры вида: ( X* AT + 1/(alfa+beta)*Y)*BT  – Z, где

A, B – матрицы, X, Y, Z – вектора, alfa, beta – скаляры.

В.5. Решить уравнение линейной алгебры вида: X * (alfa / beta *A2)T+BT* Y, где

A, B – матрицы, X, Y – вектора, alfa, beta – cкаляры.

 

С.  Все  необходимые  действия  по            определению минимальных,

максимальных  значений,  суммы,  произведения  и  количества,  а  также

формирования           других значений        в          программах    реализовать    с использованием подпрограмм–функций с параметрами.

С.1. В квадратной матрице размером 5х5, заполненной случайными целыми числами из диапазона (–30,+30) в секторах 1 и 2    найти соответственно максимальный и минимальный элементы. Сектор включает диагональные элементы.

 

           1 /

4         / 2

/          

/ 3

 

С.2. В квадратной матрице размером 5х5, заполненной случайными целыми числами из диапазона (–35,+35) в секторах 2 и 3 найти соответственно максимальный отрицательный и минимальный положительный элементы. Сектор включает диагональные элементы.

 

           1 /

4         / 2

/

/           3

 

С.3. В квадратной матрице размером 5х5, заполненной случайными целыми числами из диапазона (–40,+40) в секторах 3 и 4 найти соответственно максимальный отрицательный и минимальный положительный элементы. Сектор включает диагональные элементы.

 

           1 /

4         / 2

/

/           3

 

С.4. В квадратной матрице размером 5х5, заполненной случайными целыми  числами из диапазона (–45,+45) в секторах 1 и 3 найти количество положительных элементов. Сектор включает диагональные элементы.

 

           1 /

4         / 2

/

/           3

Контрольные вопросы

 

1. Для чего используют подпрограммы?

2. Чем отличаются описания процедур от описания функций?

3. Где задаются формальные и фактические параметры?

4. Когда применяются параметры-значения и параметры-переменные?

5. Глобальные и локальные объекты.

6. Что передается при вызове процедуры?

7. Переменные, описанные в основной программе, являются:

глобальными, внешними, автоматическими, локальными?

8. Переменные, описанные внутри процедур, являются:

локальными, автоматическими, глобальными, внешними?

9. Функции выхода из главной программы: exit, reset, assign, read.