Смекни!
smekni.com

НН Трушин Информатика (стр. 23 из 37)

В данном примере Point является указателем (ссылкой) на переменную типа Mas. Для обращения к значению переменной типа Point служит идентификатор Vector^.

Переменная-указатель занимает 4 байта памяти и является носителем фактического адреса в памяти ЭВМ величины базового типа. Значение этой переменной можно задать с помощью стандартных процедур New или GetMem, использования адресного оператора @, присваиванием ей значения другой переменной этого же типа. Указателю можно присвоить значение nil, означающее отсутствие ссылки на какой-либо объект (фактически в этом случае указателю присваивается нулевое значение).

В языке Turbo Pascal имеется стандартный тип Pointer, который дает указатель, не связанный ни с каким конкретным базовым типом. Операция получения адреса объекта имеет следующий вид:

X:=@Y; {X - адрес переменной Y}

Использование указателей совместно со стандартными процедурами New и Dispose позволяет осуществить динамическое распределение памяти.

Процедура New(P), где P – указатель, позволяет выделить область памяти такого размера, в котором можно разместить объект базового типа. Указатель принимает значение адреса выделенной области.

Процедура Dispose(P), где P – указатель, позволяет освободить область памяти, на которую ссылается указатель P, для последующего использования. После выполнения процедуры значение указателя P становится неопределенным.

Пример. Реализация динамического массива.

Program DYNAMIK;

Type

Mas=array[1...500] of Real;

Point=^Mas;

Var

P: Point; i: Word;

Begin

New(P); {Выделение области памяти для 500 чисел}

For i:=1 to 500 do read(P^[i]);

For i:=500 downto 1 do write(P^[i]);

Dispose(P); {Освобождение области памяти} End.

6.9. Подпрограммы

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

М. Уилксом была предложена концепция подпрограмм, которая получила широкое распространение практически во всех языках программирования.

Подпрограмма – это именованная логически законченная группа операторов языка, которую можно вызвать для выполнения любое количество раз из различных мест программы. В языке TurboPascal существуют две разновидности подпрограмм: процедуры и функции.

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

Функция аналогична процедуре, но имеет два отличия:

1) функция передает в программу результат своей работы в виде значения простого типа;

2) имя функции может находиться в выражении как операнд.

Все процедуры и функции языка TurboPascal подразделяются на две группы: стандартные и определенные пользователем.

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

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

В отличие от стандарта языка Паскаль в версии TurboPascal не реализованы стандартные процедуры Get, Put, Pack, UnPack, Page.

Все параметры, которые использует подпрограмма, можно разбить на две категории: локальные и глобальные. Локальные параметры объявляются внутри подпрограммы и доступны только ей самой. Глобальные параметры объявляются в основной программе и доступны как самой программе, так и всем ее подпрограммам. Обмен информацией между программой и подпрограммой может осуществляться только с помощью глобальных параметров.

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

6.9.1. Процедуры

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

Procedure <имя> (<формальные параметры>);

<разделы описаний>

Begin

<раздел операторов - тело процедуры>

End;

Имя процедуры – идентификатор, уникальный в пределах программы. Разделы описаний в процедуре – такие же, как и в основной программе. Формальные параметры могут отсутствовать. Формат оператора вызова процедуры:

<имя процедуры> (<список фактических параметров>);

Список фактических параметров может отсутствовать.

Несколько параметров, записываемых в объявлении процедуры и операторе вызова, разделяются запятыми. Фактические параметры должны совпадать по количеству и типам с формальными параметрами процедуры. Пример. Процедура ввода N целых чисел.

Program Prim;

Type

Arr=array[1..100] of Integer;

Var

Vector: Arr;

Kol: Byte;

Procedure InpInt(var Mas:Arr; N:Byte);

Var i:Integer;

Begin {Тело процедуры InpInt}

Writeln('Введите ',N,' целых чисел');

For i:=1 to N do Readln(Mas[i])

End;

Begin {Тело основной программы}

. . .

{Здесь должна быть проверка N<=100 перед вызовом процедуры}

. . .

InpInt(Vector,Kol); {Вызов процедуры InpInt} . . . End.

6.9.2. Функции

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

Function <имя> (<формальные параметры>):<тип результата>; <разделы описаний>

Begin

<раздел операторов>

End;

Пример. Функция вычисления факториала числа N.

Function Factorial(N: Byte): LongInt;

Var i: Byte;

Begin

Factorial:=N;

For i:=(N-1) downto 2 do

Factorial:=Factorial*i;

End;

Для досрочного выхода из подпрограммы предусмотрена процедура Exit. Досрочно прекратить выполнение программы можно с помощью процедуры Halt.

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

Формальные параметры указывают, с какими параметрами следует обращаться к этой подпрограмме (количество параметров, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка формальных параметров, разбитого на группы, разделенные точками с запятыми. В группу формальных параметров включаются однотипные параметры одной категории. В языке Turbo Pascal существует четыре категории формальных параметров:

• параметры-значения, которые в подпрограмме не изменяются;

• параметры-переменные, которые подпрограмма может изменить и передать в основную программу;

• параметры-константы (используются только в версии 7.0); параметры-подпрограммы (параметры процедурного типа).

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

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

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

Type

Vector: array[1..100] of Real;

Function Max(A: Vector): Real;

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

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

Procedure One(Max,Min: Real; Number: Word);

Function Two(X,Y: Integer): Real;

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

One(Abs(Max),Abs(Min),Sqr(N));

Rezult:=Two(X+Y,X-Y);

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

Пример. Объявление подпрограммы с разными параметрами:

Procedure MxMn(Mas:Vector; Var Max,Min:Real; Num:Word);

Здесь Max и Min – параметры-переменные, Mas и N – параметры- значения.

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

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