Проект закрыт, ничего заказать и купить нельзя! Существует лишь для ностальгии создателя!

Подпрограммы пользователя: Процедуры и Функции

Pascal 2016-02-27 в 22:27 2098

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

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

Использование подпрограммы позволяет улучшить структуру основной программы, делает её компактной и наглядной, облегчает процесс проектирования, разработки и отладки программ.

Виды подпрограмм:

  • function - Функции. Возвращают результат своего выполнения в место вызова.
  • procedure - Процедуры. Не возвращают результат выполнения, лишь производя необходимые действия.

В языке Паскаль существуют стандартные процедуры, например:
write, writeln, read, readln,

и стандартные функции, например,
sin, cos, abs, exp

Для использования пользовательских подпрограмм необходимо

  1. объявить подпрограмму (единожды);
  2. описать подпрограмму (единожды);
  3. вызывать подпрограмму (можно многократно)

Пользовательские Функции

Как уже было сказано выше, функция возвращает значение, в отличии от процедуры, запомните это, так как это очень важно.

Объявление функции

Функции пользователя объявляются следующим образом:


function <имя_функции> [(<список_формальных_параметров>)]:<тип результата>;

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

<имя_функции> - должно быть корректным идентификатором.

<список_формальных_параметров> - перечень идентификаторов с указанием типа, которые принимают значения, передаваемые в функцию извне во время её вызова и могут использоваться внутри функции как локальные переменные.

<тип_результата> - тип возвращаемого значения функции.

Пример


function max (a,b:real):real;
begin
 if a > b then
 max := a
 else
 max := b;
end;

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

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


program prim1;

function max (a,b:real) :real;
begin
 if a > b then
 max := a
 else
 max := b;
end;

var
 temp, c, d: real;

begin
 c := 2;
 d := 5;
 temp := max(c,d);
end.

В данном примере переменной темп будет присвоено значение переменной c, то есть 5.

Описание функции

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


[<раздел_описаний>]
begin
. . .
 <имя_функции> := <выражение>;
end.

В нашем предыдущем примере отсутствует <раздел_описаний>


begin
 if a > b then
 max := a
 else
 max := b;
end;

<раздел_описаний> - раздел локальных описаний используемых в процедуре меток, констант, типов, переменных, процедур и функций;

<имя_функции> := <выражение> - особый оператор, который возвращает в основную программу результат вычислений функции, при этом тип результата вычисления выражения должен совпадать с <типом_результата> из объявления данной функции;

begin ... end - служебные слова ограничивающие содержательную часть функции (тело функции).

Вызов функции

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


[<переменная> := ] <имя_функции> [(<список_фактических_параметров>)]

включив её имя в качестве операнда в выражение.

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


begin
 c := 2;
 d := 5;
 temp := max(c,d);
end.

<список_фактических_параметров> - это перечень конкретных значений (возможно выражений) и имен, подставляемых на место формальных параметров функции при каждом её вызове и выполнении. Замена формальных параметров фактическими осуществляется в порядке их следования слева направо.

Число и типы формальных и фактических параметров должны совпадать!

Пользовательские Процедуры

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

Объявление процедуры

Процедуры объявляются следующим образом:


procedure <имя_процедуры> [(<список_формальных_параметров>)];

Все тоже самое, как у функции, только без возвращаемого типа результата.

Все критерии объявления точно такие же, как у рассмотренных выше функций.

Пример


procedure max (a,b:real; var c:real);

Используем тот же пример на определение большего числа, но теперь появилась третья переменная c. Зачем она?

Как я уже сказал процедура не может вернуть значение в основную программу - это удобно использовать в некоторых алгоритмах, но иногда все же нужно что-то вернуть и если для этого нельзя использовать функцию, то мы добавляем в <список_формальных_параметров> дополнительную переменную, но перед ней необходимо поставить оператор var.

Этот оператор позволяет изменять передаваемую переменную напрямую, а не только локальную со значением основной.

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

Описание процедуры

Описание процедуры ничем не отличается от описания функции, за исключением того, что не нужно возвращать результат в основную программу


[<раздел_описаний>]
begin
. . .
end.

Вернемся к нашему примеру.


procedure max (a,b:real; var c:real);
begin
 if a > b then
 c := a
 else
 c := b;
end;

Теперь результат мы присваиваем переменной c, которая изменяется непосредственно в основной программе. Что бы вы не делали с переменными a и d - это никак не скажется на переменные в основной программе.

Вызов процедуры

А вот вызов отличается от функции. Процедура вызывается обособленно, как стандартные процедуры вроде: writeln

Возвращаемся к примеру


program prim2;

procedure max (a,b:real; var c:real);
begin
if a > b then
 c := a
else
 c := b;
end;

var
 temp, c, d: real;

begin
 c := 2;
 d := 5;
 max(c,d,temp);
end.

Суть не изменилась, выберется наибольшее число и значение наибольшего присвоится переменной temp

Практикуйся

Обычно при первом знакомстве возникают трудности с использованием подпрограмм, но стоит немножко попрактиковаться, как все становиться элементарно.

Так что, советую скачать методичку и практиковаться, пока не станет все понятно :)

Не можете справиться с заданием?
Специалисты нашего проекта помогут вам справиться с любыми заданиями по программированию!
Чтобы оставлять комментарии, необходимо войти или зарегистрироваться