Изучение основ моделирования в среде GPSS World. Создание пользовательских переменных. Блоки и команды для манипуляции с сохранёнными данными, страница 6

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

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

Из этих определений видно, что функция – это частный случай процедуры. Так в Visual Basic нет явного деления на функции и процедуры. Всё относятся к процедурам, но есть процедуры-функции (возвращающие в точку вызова результат и определяемые через ключевое слово Function), а есть собственно процедуры – которые можно вызвать только с помощью специального оператора. В то же самое время в JavaScript и функции и процедуры определяются одним словом  – FUNCTION, как и в языке PHP, и не имеют каких либо различий по принципу вызова и использвованию.

Так и в PLUS, используя оператор "PROCEDURE", нельзя однозначно говорить что это "процедура" (хотя и впредь будем оперировать именно этим термином) или "функция", поскольку их можно использовать как в выражениях (смотри определение функции) так и вызывать иным способом.

Несмотря на это PLUS процедура всегда возвращает какое-либо значение (по умолчанию – нуль). Но для того, чтобы возвратить значение нужное пользователю необходимо использовать оператор RETURN. Как и во многих языках программирования, данный оператор не только возвращает значение, но и завершает саму процедуру.  Синтаксис этого оператора следующий:

RETURN       <выражение>;

В качестве выражения может выступать как число, так строка (заключённая в двойные кавычки) и собственно математическое выражение.

Теперь переделаем наш предыдущий пример и допишем, что наша процедура должна возвращать квадратный корень принимаемого параметра.

PROCEDURE         MyProc (FormalPar)            BEGIN

TEMPORARY    LocalVar;

LocalVar=FormalPar#FormalPar;

RETURN       LocalVar;

END;

Теперь давайте рассмотрим принцип организации ветвления и циклов в процедурах.

Для организации ветвлений предусмотрены операторы IF/THEN и IF/THEN/ELSE. У них похожий синтаксис, за исключением того, что второй оператор имеет дополнительные операторы после ключевого слова ELSE:

IF(<выражение>) THEN <оператор1> ELSE <оператор2>;

При необходимости использовать несколько операторов после слов THEN или ELSE, то используется составной оператор BEGIN/END:

IF(<выражение>) THEN BEGIN

<оператор1>;

<оператор2>;

END;

ELSE BEGIN

<оператор3>;

<оператор4>;

END;

Чтобы организовать цикл используется оператор  WHILE/DO. Он аналогичен по принципу работы подобному оператору из других языков программирования. Синтаксис этого оператора выглядит так:

WHILE(<выражение>) DO BEGIN

<оператор1>;

<оператор2>;

END;

Давайте ещё усложним наш пример. Пусть при положительном параметре, передаваемом процедуре, возвращается его квадрат, иначе – лишь удвоенное значение. Тогда процедура может принять вид:

PROCEDURE         MyProc (FormalPar)            BEGIN

TEMPORARY    LocalVar;

IF(FormalPar>0) THEN BEGIN

LocalVar=FormalPar#FormalPar;

RETURN           LocalVar;

END;

ELSE         LocalVar=2#FormalPar;

RETURN       LocalVar;

END;

Для организации переходов в PLUS используется оператор GOTO. Данный оператор очень прост и имеет следующий синтаксис:

GOTO         <Метка>;

Соответственно, при использовании оператора GOTO необходимо использовать оператор "маркированное выражение" или говоря иначе – метку. Синтаксис использования меток в PLUS следующий:

<метка>:          <выражение>;

Также как и при построении алгоритма модели с помощью блоков и команд GPSS, метка должна начинаться с первого символа строки.