Учебный курс. Микро Паскаль. Процедуры и функции.

AVR
статья №5
Трудно представить себе язык программирования без подпрограмм. В Паскале они тоже имеются. Здесь их даже два вида. Это процедуры и функции.

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

function primer(a:byte; b: char):word;
begin
 result := a+byte(b);
end;

function primer(a:byte; b: char):word;
begin
 primer := a+byte(b);
end;


Эти два примера эквивалентны.

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

procedure primer;
begin
 porta := not porta;
end;


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

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

Параметры – значения, Параметры – переменные.

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

procedure primer(a:byte; b: char);


Тогда допустимые вызовы подпрограммы будут:

primer (x, ‘A’);

primer (x+12, ‘A’);

primer (12, 1);

primer (12, ‘A’+1);

И так далее.

Параметр – переменная используется когда значение глобальной переменной или данные другой подпрограммы, должно быть обработаны в нутрии подпрограммы. Или когда значение параметра — переменной должно передаваться вызывающей программе. В Микро Паскале параметр – переменная это еще и способ передачи в подпрограмму структурных типов. Например — строк. Однако следует быть осторожным. Любое случайное изменение значения формального значения – переменной приведет к изменою и фактического значения параметра. Фактическое значение параметра – переменной должно иметь тип совместимый по присвоению с типом формального параметра – переменной. На самом же деле при вызове подпрограммы формальный параметр – переменная заменяется фактической переменной. Пример описания заголовка подпрограмм с использованием параметров – переменных:

function primer (var s: string[4]): word;


И соответственно вызов:

w := primer(txt);


Здесь допустимый параметр – объявленная ранее переменная.

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


function primer ( var s: string[4]; b:byte): word;


В Микро Паскале существуют еще подпрограммы – прерывания, которые описаны здесь. А мы с ними будем разбираться уже на практике.

  • +4
  • 28 марта 2011, 21:32
  • Rom

Комментарии (6)

RSS свернуть / развернуть
Всегда порадал Паскаль! Гы. Только там void Func(void) может трактоваться как процедура, а не как функция. Дикость, но вель до сих пор живет!
0
поражал, пардон.
0
В этом есть логика, которая развита в следущем языке Вирта — Обероне. Там запрещен «процедурный вызов функции» — т.е. вызов с игнорированием возвращаемого значения.
Функция — подпрограмма, которая обрабатывает полученные аргументы и возвращает зависящий от них результат. Вообще говоря, она не должна иметь побочных эффектов (т.е. влиять на глобальные переменные или параметры — во избежание всем известного вопроса «чему равно i++ + i++?»). Фактически, слово «функция» здесь имеет тот же смысл, что и в математике.
Процедура — это подпрограмма, которая выполняет некоторые действия (т.е. выполняет некую процедуру). Она по определению имеет побочные эффекты и потому не должна использоваться в правой части выражений.
В принципе, если этой логике следовать — программы будут надежнее. Как известно, основные цели, преследуемые Виртом в своих языках — простота языка (и его освоения) и надежность (минимизация средствами языка возможностей для ошибки).

Автору: нутрия — это такая зверушка (ЕМНИП с ценным мехом). В нутрии кишки, говно и прочая требуха. Обилие ошибок вообще, честно говоря, раздражает.
Также, нелишне рассмотреть параметры типа const.
+1
Для преобразования символа в число логичнее было бы юзать ord(b)
0
«может стоять с право от» — может, все-таки справа ...?
0
  • avatar
  • Lyon
  • 07 августа 2011, 16:36
Указывать на ошибки тут дохлое дело. Только переписывать)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.