Общая психология и история психологии

Тема 8. Программирование вспомогательных алгоритмов

1. Процедуры-операторы.

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

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

Рассмотрим объявления процедуры.

Процедура состоит из следующих частей:

·  заголовка процедуры;

·  раздела описаний процедуры;

·  операторной  части (тела) процедуры.

Заголовок процедуры начинается служебным словом  procedure , после которого указывается имя процедуры и описывается список формальных параметров (если он присутствует). Формальные параметры задают исходные данные для процедуры и переменные для результатов ее работы.

ПРИМЕР:

procedure print (x: string);

procedure paint;

Раздел описаний процедуры содержит описание объектов, которые будут использоваться только данной процедурой. Такие объекты называются локальными для данной процедуры. Их использование вне процедуры невозможно и приведет к появлению сообщения об ошибке. Использование локальных переменных не является обязательным.Можно обойтись глобальными переменными, которые описаны в основной программе. Однако использование локальных переменных делает и процедуру, и основную программу более понятными.

Блок операторов задает действия, которые должна выполнить процедура.

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

ПРИМЕР. Рассмотрим описание процедуры для вычисления произведения первых k натуральных чисел (k!).

Процедура содержит два формальных параметра: параметр k является исходной величиной, параметр p результатом. О правилах объявления параметров будет сказано далее.

procedure fakt (k: integer; var p: integer);

{В заголовке процедуры содержится два параметра: первый - k - является параметром-значением и представляет исходные данные; второй - p -представляет собой результат и объявлен как параметр-переменная}

var

 i: integer;

{Локальная переменная i будет использоваться в качестве параметра цикла}

begin

{Тело процедуры задает действия}

 p = 1;

 for i: = 1 to k do p = p * i;

end;

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

Объявлением, опережающий называется объявление процедуры,  задает  директиву  forward  вместо блока описаний и блока операторов. После этого объявления процедура должна быть определена  с помощью определяющего объявления, то есть такого объявления процедуры, использует такой же идентификатор процедуры, но опускает список формальных параметров и содержит  блок описаний и блок операторов. Объявления, опережает и определяющее объявления должны находиться в  одной  и той же части объявления процедур и функций. Между ними могут быть  объявлены  другие  процедуры и функции, и они могут вызвать процедуру с объявлением, что опережает. Таким образом, возможна взаимная рекурсия. Как правило, такая запись процедуры используется именно при взаимной рекурсии.

Объявления, опережает и определяющее объявление  составляют  полное объявление процедуры. Считается, что процедура задана в объявлении, что опережает.

ПРИМЕР объявление, что опережает:

procedure first (k: integer; var p: integer): forward;   {опережающее объявление}

procedure second (var n: integer; var s: real);

{Данная процедура использует процедуру  first , тело которой будет задан дальше}

begin

 ...

 first (n, m); {Вызов процедуры, еще не объявлена}

...

end;

procedure first;

begin

 ...

 second (k, p); {Вызов процедуры, тело которой описано выше}

 ...

end;

 

 

2. Процедуры-функции.

Функции, объявленные пользователем, также состоят из заголовка, блока объявлений и тела функции.

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

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

Если идентификатор функции используется для вызова функции внутри блока функции, то функция выполняется  рекурсивно . Такие функции будут рассмотрены далее.

ПРИМЕР: рассмотрим описание функции для вычисления произведения первых k натуральных чисел (k!).

function fact (k: integer): integer;

{В заголовке процедуры содержится параметр k - он параметром значением и представляет собой исходные данные; сама функция объявлена ​​также целочисленной}

 

var

 i: integer;

{Локальная переменная i будет использоваться в качестве параметра цикла}

 p: integer; {Эта переменная нужна для вычисления

результата в цикле}

begin {тело процедуры задает действия}

 p = 1;

 for i: = 1 to k do p = p * i;

 facf = p; {Имя fact не могло использоваться в цикле, так как это противоречит правилам вызова функции}

end;

 

Как и процедуры, функции могут быть  объявлены  как  forward .

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

Существует Они характеризуются  таким образом :

·  группа параметров без предварительного ключевого слова  var  и с последующим за ней типу  является  списком параметров-значений;

·  группа параметров с предыдущим ключевым словом  var  и следующим за ней типу  является  списком  параметров-переменных ;

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

Примеры:

procedure example (x: integer; var a, b: real; var s, t)

В данном случае параметр x является параметром значением, a и b являются параметрами-переменными, а переменные s ИТ является не типизированными параметрами-переменными.

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

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

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

ПРИМЕР:

Пусть объявлена ​​процедура sum (x, y: integer; var z: integer)

Пусть вызов процедуры выглядит sum (a, b, c). В таком случае будут созданы новые переменные x и y, которые получат значения переменных a и b соответственно. А вместо переменной z будет подставлена ​​переменная c.

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

Фактический параметр, соответствующий параметру-переменной, может быть только переменной. Внутри процедуры или функции любое  ссылки  на формальный  параметр переменную  дает доступ к самому фактического параметра. Тип фактического параметра должен быть тождественен типа формального  параметра-переменной  (можно обойти это ограничение через  нетипизированные  параметры-переменные ). Если типом формального параметра  является  тип String, то задается атрибут длины, равный 255, и фактический  параметр переменная  должен иметь строковый тип с атрибутом длины, равным 255.

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

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

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

ПРИМЕР: использование нетипизированных параметров-переменных:

program example;

const n = 10;

type massiv = array [1..n] of integer;

var x: massiv;

 y, i: integer;

function sum (var a: array of integer): integer;

{Параметр а объявлен как нетипизированных массив}

var s, i, k, m: integer;

begin

 s = 0;

 k = low (a);

 m = high (a);

 {Переменные k и m определяют верхнюю и нижнюю границу индексов массива}

 for i: = k to m do s = s + a [i];

 sum = s;

end;

begin

 for i: = 1 to n do x [i] = random (10);

 y = sum (x);

 writeln ('y =', y);

end.

 

Обобщение по теме.

Язык Паскаль позволяет пользователю создавать собственные вспомогательные алгоритмы. Различают два вида алгоритмов: процедуры-операторы (далее просто процедуры) и процедуры-функции (далее просто функции). Они позволяют включать в основной программный блок дополнительные блоки команд. Процедура активизируется с помощью оператора процедуры. Функция активизируется при исчислении  выражения , что  содержит  вызов этой функции.

Блок описания процедур и функции не имеет специального служебного слова для своего начала. Этот блок всегда располагается последним в описательной части программы и начинается объявлением соответствующего вспомогательного алгоритма.

Объявления вспомогательного алгоритма состоит из следующих частей:

·  заголовка;

·  раздела описаний;

·  операторной  части (тела).

Заголовок содержит имя вспомогательного алгоритма и список формальных параметров. Для функции нужно указать тип имени этой функции, так как оно является результатом ее работы. Существует три  вида параметров: значение, переменная и  Нетипизированные  переменная. Раздел объявлений содержит список локальных объектов (типов, констант, переменных), которые будут использоваться данным алгоритмом. Операторная часть содержит набор операторов, которые составляют тело вспомогательного алгоритма. Для функции обязательно нужно указать хотя бы один оператор присваивания, в левой части которого указывается имя функции, а в правой - выражение, которое задает результат ее работы.

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

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

 

Вопрос темы:

·  понятие файлового типа;

·  обработки типизированных файлов.

 

Основные сроки темы:  файловый тип данных, текстовый файл, типизированный файл, нетипизированных файл, открытие файла, закрытие файла, запись.

 

Зацікавило?

Змiст

Нові надходження

Всього підручників:

292