Программы процедуры и функции

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

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

// Определение процедуры procedure MyProc([список параметров]); begin … end; // Определение функции function MyFunc([список параметров]): [тип данных]; begin … end;

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

Процедуры и функции в программировании. Аргументы и объявление функции.


Proc([список параметров]); MyFunc([список параметров]); x := a + MyFunc([список параметров]) – b … y := MyFunc2 + 1000 — b;

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

В подпрограмме могут быть объявлены локальные переменные, видимые только в теле подпрограммы. Раздел объявления переменных находится между заголовком и телом. Пример:

procedure MyProc(Param1: Integer); var i, j: Integer; begin i := 1; … end;

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

Параметры процедур и функций

Синтаксис описания параметров разберем на примере:

function MyFunc(x, y: Integer; a: Double; const S, Str: String; var R: String): Boolean;

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

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

Параметры, передаваемые в подпрограмму, делятся на:

Параметры-значения. В примере это параметры x, y, a. В качестве фактических параметров могут передаваться константы, произвольные выражения, переменные. Результат вычисления параметра копируется в стек подпрограммы. Если в качестве параметра передается переменная, то изменения производятся над ее копией, а не оригиналом.

Параметры-переменные. В примере это параметр R. Перед параметрами указывается служебное слово var. В качестве параметра может передаваться только переменная. Тип фактического параметра должен строго соответствовать типу формального параметра. В процедуру или функцию передается ссылка на переменную.

Читайте также:
Как удалить все китайские программы

Информатика. Язык Pascal: Процедуры и функции в Pascal. Центр онлайн-обучения «Фоксфорд»

Все изменения производятся непосредственно над переменной.

Параметры-константы. В примере это параметры S, Str. Перед параметрами указывается служебное слово const. Параметры-константы похожи на параметры-значения, только в подпрограмму передается ссылка на адрес в памяти, где располагается результат вычисления параметра. Компилятор не позволяет изменять в подпрограмме параметр-константу.

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

Пример вызова функции:

var a: Word; MyStr, MyResult: String; b: Boolean; begin b := MyFunc(1, a, AnyFunc(20) + 30 / 0.5, MyStr, ‘Hello, World’, MyResult); end;

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

Если формальный определен как целое число, то фактический параметр может быть любого целого типа. Только нужно следить, чтобы формальный параметр мог «вместить» фактический параметр. В данном примере тип формального параметра Y «вмещает» переменную a, т. к. область допустимых значений больше. Целый формальный параметр несовместим с другими типами, в том числе с вещественными. А вот вещественный формальный параметр, совместим с целыми и вещественными.

В случае с параметрами-переменными требуется строгое соответствие типов, даже если формальный и фактический параметры являются родственными, например целыми. Т. е. если формальный параметр имеет тип Integer, то фактический параметр тоже должен иметь тип Integer, а не Byte, Word и т. д. Это касается и классов, даже если фактический параметр является потомком класса формального параметра.

Передача массивов в качестве параметров

Для передачи массива в подпрограмму должен быть определен пользовательский тип:

type TMyArr = array [1..20] of Integer; TMyArr2d = array [1..10] of array [1..5] of Byte; TDynaArr = array of String; procedure MyProc(Arr: TMyArr; var Arr2d: TMyArr2d; DynaArr: TDynaArr); begin … end; procedure AnyProc; var A: TMyArr; A2d: TMyArr2d; DArr: TDynaArr; begin … MyProc(A, A2d, DArr); end;

Фактический параметр должен быть переменной массива.

Компилятор не сообщит об ошибке, если объявить параметр-массив таким образом:

procedure MyProc(arr: array [1..10] of String); begin end; procedure AnyProc; var A: array [1..10] of String; begin MyProc(a); // type mismatch end;

Однако во время выполнения вы получите ошибку «type mismatch».

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

procedure MyProc(OpenArr: array of [тип]);

Открытый массив представляет собой одномерный массив. Нижняя граница массива всегда равна 0, даже если нижняя граница передаваемого массива отличается. Соответственно, верхняя граница равна длине массива минус 1. Для определения границ массива можно воспользоваться функциями Low и High. Пример:

procedure MyProc(Arr: array of Integer); begin // Low(открытый массив) = 0 for i := Low(Arr) to High(Arr) do … end; procedure AnyProc; var arr: array [1..10] of Integer; arr2: array [-2..5] of Integer; begin MyProc(arr); MyProc(arr2); MyProc([1,4,8,9,11,34,23]); end;

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

Читайте также:
Lost alpha dc произошла непредвиденная ошибка состояние программы нестабильно

В движке не поддерживаются вариантные открытые массивы, хотя некоторые встроенные подпрограммы имеют параметры такого типа (например, Format).

procedure Proc(arr: array of const); // не поддерживается

Возврат значения функции

Функция имеет предопределенную переменную Result, в которую сохраняется возвращаемое значение. Пример:

function SumAB(A, B: Double): Double; begin Result := A + B; end;

Выход из подпрограммы

В любой момент можно выйти из подпрограммы. Для этого предусмотрен оператор Exit.

В движке не поддерживается передача в EXIT возвращаемого значения.

Exit(-1); // Компилятор сообщит “internal error(20)”

Источник: dataexpress.wiki

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

Процедура — это вспомогательный алгоритм, который исполняет некоторые действия.

Процедура записывается до основной программы и вызывается внутри неё.

Синтаксис процедуры

Процедура в Pascal

Процедура в Python

procedure название (параметры);

var. ;

begin

end;

def название (параметры):

#объявление переменной

#тело процедуры

Обрати внимание!

Имена переменных в процедуре не должны совпадать с именами в основной программе.

Функция — это вспомогательный алгоритм, который, в отличие от процедуры, возвращает значение (результат).

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

Синтаксис функции

Источник: www.yaklass.ru

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

vedro-compota's picture

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

Чем процедуры отличаются от функций

Различия между процедурами и функциями в Паскаль:

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

Сигнатура процедур и функций

Вызов функции и её сигнатура

Сигнатура функции определяется:

  1. Именем функции
  2. Числом, типом входных переменных и порядком их следования
  3. Типом возвращаемого значения

Процедуры

Рассмотрим пример программы с процедурой:

var a, b, c: integer; // объявляем глобальные переменные программы procedure sum(x, y: integer; var z: integer); // начало объявления процедуры begin z := x + y; // тело процедуры end; begin // начало тела программы write(‘Введите два числа: ‘); readln(a, b); sum(a, b, c); < — вызов процедуры с параметрами (аргументами) процедура вызывается своим именем, которое вы написали после зарезервированного слова procedure в описании>writeln(c); end.

  • переменная $z$ в процедуру $sum()$ передана по ссылке, это значит, что если её изменить в теле процедуре, то она изменится и в том месте, откуда её передали в процедуру (например, в теле основной программы).
  • Переменные же $x$ и $y$ переданы по значению — это надо понимать так, что если их значения будут изменяться внутри процедуры (в данном случае), то «снаружи» эти изменения видны не будут.

Функции и псевдопеременная result

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

var a, b, c: integer; // глобальные переменные function sum(x, y: integer): integer; begin // начало тела функции result := x + y; < результат для возврата наружу (в глобальное пространство программы из локального пространства функции) >end; // конец описания функции (её тела) begin // начало тела основной программы readln(a, b); writeln(sum(a, b)); end. // конец основной программы

Читайте также:
Как сделать чтобы компьютер не скачивал программы

— чтобы вернуть значением мы использовали так называемую псевдопеременную с именем result . (т.е. «не совсем переменную, но что-то похожее на ней»)

  1. Не нуждается в объявлении в секции var (локальной или глобальной)
  2. Служит для возврата из функции (возвращено будет то значение. которое вы присвоите этой переменной)

Примеры кода — разбор решений

Пример №1 — функция не принимающая аргументов

Напишите функцию, которая не принимает аргументов и возвращает число $55$

function f1():integer; // возвращает целое число 5 begin result := 55; // всё просто end; begin // тело программы writeln(‘f1() vernula:’, f1()); // вызов функции как аргумент readln(); end.

— таким образом, что вернуть какое-либо значение из функции, мы должны использовать переменную result, в примере выше именно значение из нее подставляется как аргумент writeln() после выполнения функции f1 в строке:

writeln(‘f1() vernula:’, f1()); // вызов функции как аргумент

Пример №2 — функция: входящие аргументы разного типа, локальные переменные подпрограммы

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

Решение:

var m: integer; z : real; function f2(a: integer; b: real): real; var h: real; // объявим собственную (локальную) переменную функции begin h := a*b — (a+b); // присваимаем результат выражения локальной переменной result := h; // возвращаем результат функции «наружу» end; // конец тела функции begin // начало тела основной программы m := 2; z := 4.5; z := f2(m, z); // перезапишем z результатом работы функции writeln(‘z=’, z); readln(); end.

Задачи для самостоятельного решения

  1. Напишите функцию, которая возвращает сумму трёх целых чисел.
  2. Напишите процедуру, которая принимает переменную целого типа по ссылке, просит пользователя ввести значение в консоли и инициализирует переменную этим значением (убедитесь, что в теле программы значение изменилось).
  3. Составьте программу, которая выводит на экран прямоугольный флаг N×M вида (с чередованием плюсов и минисов в строках):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Видео-пояснения

К этому уроку есть следующие видео-пояснения:

  1. Процедуры и Функции в Паскаль: отличия, возврат значения, перегрузка процедур и функций: https://youtu.be/gUr6SeA7r-E
  2. Процедуры и Функции в Паскаль: передача по ссылке и по значению. Какая разница, пример с указателем: https://youtu.be/201KCCOOtyo
  3. Ещё раз о том, что значит, что функция «возвращает значение», и другие замечания: https://youtu.be/C11m4t2Yv78

Источники и полезные материалы:

  1. Урок 13. Процедуры и функции в Pascal. Часть 2: http://learnpascal.ru/vvedenie-v-paskal/.

Key Words for FKN + antitotal forum (CS VSU):

  • процедуры и функции паскаль
  • Как описывать объявлять вызывать и использовать процедуры и функции в Паскаль
  • Паскаль Чем отличаются процедуры и функции
  • Паскаль что такое сигнатура
  • паскаль функция без входящих значений пример
  • Паскаль примеры процедур и функций как их создавать
  • чем отличается функция от процедуры паскаль

Источник: fkn.ktu10.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru