Обмен информацией между вызываемой и вызывающей функциями осуществляется с помощью механизма передачи параметров.
Переменные, указанные в заголовке подпрограммы называются формальными параметрами или просто параметрами подпрограммы. Эти переменные могут использоваться внутри подпрограммы. Список переменных в операторе вызова подпрограммы – это фактические параметры, или аргументы.
Механизм передачи параметров обеспечивает обмен данных между формальными и фактическими параметрами, что позволяет выполнять подпрограмму с различными данными. Между фактическими параметрами в операторе вызова и формальными параметрами в заголовке подпрограммы устанавливается взаимно однозначное соответствие. Количество, типы и порядок следования формальных и фактических параметров должны совпадать.
Передача параметров выполняется следующим образом. Вычисляются выражения, стоящие на месте фактических параметров. В памяти выделяется место под формальные параметры в соответствии с их типами. Выполняется проверка типов и при их несоответствии выдается диагностическое сообщение. Если количество и типы формальных и фактических параметров совпадают, то начинает работать механизм передачи данных между фактическими и формальными параметрами.
|
|
Формальные параметры процедуры можно разделить на два класса: параметры-значения и параметры-переменные.
При передаче данных через параметры-значения в подпрограмму передаются значения фактических параметров, и доступа к самим фактическим параметрам из подпрограммы нет.
При передаче данных параметры-переменные заменяют формальные параметры, и, следовательно, в подпрограмме есть доступ к значениям фактических параметров. Любое изменение параметров переменных в подпрограмме приводит к изменению соответствующих им формальных параметров. Следовательно, входные данные следует передавать через параметры-значения, для передачи изменяемых в результате работы подпрограммы данных следует использовать параметры-переменные.
Процедуры.
Описание процедуры имеет вид:
procedure имя_процедуры(формальные_параметры);
label
описание_меток;
const
описание_констант;
type
описание_типов;
var
описание_переменных;
begin
//Тело процедуры.
end;
Начинается описание с заголовка процедуры, где procedure – ключевое слово языка, имя_процедуры – любой допустимый в языке Free Pasacal идентификатор, формальные_параметры – имена формальных параметров и их типы, разделенные точкой с запятой.
Рассмотрим примеры заголовков процедур с параметрами-значениями:
procedure name_1(r:real; i:integer; c:char);
Однотипные параметры могут быть перечислены через запятую:
|
|
procedure name_2(a,b:real; i,j,k:integer);
Список формальных параметров не обязателен и может отсутствовать:
procedure name_3;
Если в заголовке процедуры будут применяться параметры-переменные, то перед ними необходимо указывать служебное слово var, перед параметрами-значениями слово var отсутствует:
procedure name_4(x,y:real; var z:real);
//x, y – параметры-значения,
//z – параметр-переменная.
После заголовка идет тело процедуры, которое состоит из раздела описаний (константы, типы, переменные, процедуры и функции, используемые в процедуре) и операторов языка, реализующих алгоритм процедуры.
Для обращения к процедуре необходимо использовать оператор вызова:
имя_процедуры(список_фактических_параметров);
Фактические параметры в списке оператора вызова отделяются друг от друга запятой:
a:=5.3; k:=2;
s:=’a’;
name_1(a, k, s);
Если в описании процедуры формальные параметры отсутствовали, то и при вызове их быть не должно:
name_3;__
Функции.
Описание функции также состоит из заголовка и тела:
function имя_функции(формальные_параметры):тип;
label
описание_меток;
const
описание_констант;
type
описание_типов;
var
описание_переменных;
begin
//Тело функции.
end;
Заголовок функции содержит: служебное слово function, любой допустимый в языке Free Pascal идентификатор - имя_функции; имена формальных параметров и их типы, разделенные точкой с запятой - формальные_параметры, тип возвращаемого функцией значения - тип (функции могут возвращать скалярные значения целого, вещественного, логического, символьного или ссылочного типа).
Примеры описания функций:
function fun_1 (x:real):real;
function fun_2(a, b:integer):real;
Тело функции состоит из раздела описаний (константы, типы, переменные, процедуры и функции, используемые в процедуре) и операторов языка, реализующих ее алгоритм. В теле функции всегда должен быть хотя бы один оператор, присваивающий значение имени функции.
Например:
function fun_2(a, b:integer):real;
begin
fun_2:=(a+b)/2;
end;
Обращение к функции осуществляется по имени с указанием списка фактических параметров, разделенных запятой:
имя_функции (список_фактических_параметров);
Например:
y:=fun_1(1.28);
z:=fun_1(1.28)/2+fun_2(3,8);
Приложение 2.
Массивы.
Массив – структурированный тип данных, состоящий из фиксированного числа элементов одного типа.
Массив, представляющий собой просто список данных одного и того же типа, называют простым, или одномерным массивом. Для доступа к данным, хранящимся в определенном элементе массива, необходимо указать имя массива и порядковый номер этого элемента, называемый индексом.
Если возникает необходимость хранения данных в виде таблиц, в формате строк и столбцов, то необходимо использовать многомерные массивы.
Например массив, состоящего из строк и столбцов. Это двумерный массив. Строки в нем можно считать первым измерением, а столбцы — вторым. Для доступа к данным, хранящимся в этом массиве, необходимо указать имя массива и два индекса, первый должен соответствовать номеру строки, а второй — номеру столбца, в которых хранится необходимый элемент.
Описание массивов
Для описания массива служат служебные слова array of. Описать массив можно двумя способами:
Ввести новый тип данных, а потом описать переменные нового типа. В этом случае формат оператора type следующий:
type
имя_типа = array [тип_индекса] of тип_компонентов;
В качестве типа_индекса следует использовать перечислимый тип. Тип_компонентов — это любой ранее определенный тип данных, например:
type
massiv=array[0..12] of real;
//Тип данных massiv из 13 элементов, элементы нумеруются от 0 до 12.
dabc=array[-3..6] of integer;
//Тип данных dabc из 10 элементов, элементы нумеруются от -3 до 6.
var
x,y:massiv;
z: dabc;
Можно не вводить новый тип, а просто описать переменную следующим образом:
|
|
var
переменная: array [тип_индекса] of тип_переменной;
Например:
var
z,x: array[1..25] of word;
//Массивы z и x из 25 значений типа word,
//элементы нумеруются от 1 до 25.
g:array[-3..7] of real;
//Массив g из 11 значений типа real, которые нумеруюся от -3 до 7.
Для описания массива можно использовать предварительно определенные константы:
const
n=10;
m=12;
var
a: array[1..n] of real;
b: array[0..m] of byte;
Константы должны быть определены до использования, так как массив не может быть переменной длины!
Двумерный массив (матрицу) можно описать, применив в качестве базового типа (типа компонентов) одномерный:
type
massiv=array[1..200] of real;
matrica=array[1..300] of massiv;
var
ab:matrica;
Такая же структура получается при использовании другой формы записи:
Type
matrica = array [1..300,1..200] of real;
var
ab:matrica;
или
var ab:array [1..300,1..200] of real;
При всех трех определениях мы получали матрицу вещественных чисел, состоящую из 300 строк и 200 столбцов.
Аналогично можно ввести трехмерный массив, или массив большего числа измерений:
type
abc=array [1..4,0..6,-7..8,3..11] of real;
var b:abc;