Название: Алгоритмы и программы (Афанасьева Т. В.) Жанр: Информационные системы и технологии Просмотров: 1375 |
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.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
1 / 4 / 2 / / 3
1 / 4 / 2 / / 3
1 / 4 / 2 / / 3 Контрольные вопросы
1. Для чего используют подпрограммы? 2. Чем отличаются описания процедур от описания функций? 3. Где задаются формальные и фактические параметры? 4. Когда применяются параметры-значения и параметры-переменные? 5. Глобальные и локальные объекты. 6. Что передается при вызове процедуры? 7. Переменные, описанные в основной программе, являются: глобальными, внешними, автоматическими, локальными? 8. Переменные, описанные внутри процедур, являются: локальными, автоматическими, глобальными, внешними? 9. Функции выхода из главной программы: exit, reset, assign, read. |
|