Для организации подпрограмм используются 2 типа подпрограмм: процедуры и функции.
Функция – подпрограмма, в которой выполняется некоторый набор действий, в результате чего имя функции получает некоторое единственное значение, передаваемое в вызываемую подпрограмму, при этом управление при выходе из функции возвращается в точку ее вызова.
Процедура – подпрограмма, в которой производится некоторый набор действий, при этом имени процедуры ничего не присваивается: процедура не имеет возвращаемого значения. Результаты в вызывающую программу передаются через механизм параметров или глобальные переменные. Управление возвращается за точку вызова процедуры.
Локальные const, var, type, label – описательная часть.
Сравнение процедур и функций.
— Функция обязательно имеет тип возвращаемого значения. Процедура возвращаемого значения не имеет.
— Внутри тела функции – обязательно присвоение имени значения.
— Процедура вызывается отдельно с помощью оператора вызова с передачей параметров, функция – вызывается в операторе присваивания.
Основы Программирования — #4 — Функции
— Функция всегда возвращает хотя бы 1 результат; процедура не возвращает ничего.
Модель дальнего вызова подпрограмм.
Спецификатор far, объявленный около имени процедуры, включает директиву дальнего вызова. В данном режиме компилятор определяет модель памяти, для которой любые указатели воспринимаются как дальние, то есть, данные могут располагаться в сегменте, отличном от сегмента программы.
Предварительное описание подпрограмм.
В ряде случаев необходимо выполнять предварительные описания процедур или функций. Например, пусть существует процедура a, которая в ходе своей работы выполняет обращение к процедуре b. Следовательно, процедура b должна быть объявлена и известна компилятору до момента вызова (т.е. выше процедуры a).
Допустим, процедура b в ходе своей работы вызывает процедуру a. Для разрешения этого выполняют предварительное объявление. Оно представляет собой заголовок процедуры или функции без указания её тела с обязательной директивой forward. Эта директива указывает компилятору на то, что тело подпрограммы будет описано ниже с возможным досрочным вызовом.
Внешнее описание подпрограмм.
В процессе накопления опыта программирования может быть создан набор подпрограмм, удобных для дальнейшего использования. Обычно такие функции объединяют в библиотеки. Библиотека представляет собой откомпилированный файл, не являющийся программой.
В таком случае объектный код содержится в некотором *.obj-файле, а само подключение производится директивой . После описания заголовка подпрограммы из *.obj-файла необходимо задать служебное слово external. Это укажет компилятору, что вызываемую подпрограмму с данным именем следует искать в одном из подключенных объектных файлов.
Механизм параметров. Формальные и фактические параметры. Параметры значения, переменные, константы, нетипизированные параметры.
Организация обмена данными происходит с помощью механизма параметров.
Функции c++ примеры. Синтаксис. Объявление, реализация функции. Параметры, аргументы. C++ #33
Все данные можно разбить на 4 основных класса:
При организации вызова подпрограмм в оперативной памяти в специальной области, называемой областью рекурсивного стека, создается копия рабочих полей подпрограммы, содержащая всю локальную для этой подпрограммы информацию, необходимую для ее выполнения. Рекурсивный стек состоит из страниц и заполняется по мере вызова подпрограмм.
1 – указатель связи (адрес вызываемой подпрограммы)
2 – локальные переменные, объявленные в описательной части подпрограммы
3 – адрес возврата (куда будет передано управление)
4 – параметры из заголовка вызываемой подпрограммы, при этом список записывается в страницу стека в прямом порядке
5 – возвращаемое значение, если таковое имеется.
После завершения подпрограммы страница стека полностью удаляется.
Формальные и фактические параметры.
Обмен информацией между вызываемой и вызывающей подпрограммой осуществляется с помощью механизма передачи параметров. Переменные, указанные в заголовке подпрограммы называют формальными параметрами. Эти переменные используются только внутри подпрограммы.
Переменные, указанные в строке вызова подпрограммы называются фактическими параметрами. Их значение зависит от механизма передачи параметра. Для вызываемой подпрограммы данные переменные являются глобальными.
Между фактическими и формальными параметрами устанавливается взаимооднозначное соответствие. Количество, типы и порядок следования параметров должны совпадать.
Параметры значения: используются для передачи данных в подпрограмму, при этом создается копия передаваемого значения. Изменения таких параметров не видны на внешнем уровне. Тип формального и фактического параметра должен быть совместим по присваиванию.
Если в вызывающей программе описаны переменные X: Integer, C: Byte; Y: Longint;, то синтаксически правильными вызовами P будут P(X), P(C), P(Y), P(200).
Основной недостаток – временные затраты, необходимые для создания копии передаваемого параметра, затрата памяти в стеке и его переполнение.
Параметры ссылки (параметры-переменные): используются для организации передачи результатов работы подпрограммы через параметры, при этом передается адрес параметра без создания его копии.
Все изменения, производимые с параметром, передаваемым по ссылке, видны после вызова подпрограммы.
Параметры-константы так же, как и параметры-переменные, позволяют передавать в подпрограмму данные по ссылке, но в отличие от параметров-переменных модификация переданных значений внутри подпрограммы невозможна и эта ситуация будет отслеживаться компилятором. Параметры-константы используются для передачи в подпрограмму больших объемов данных с целью экономии динамической памяти.
Такие параметры передаются с указанием ключевого слова const и приводят в текущую область стека адрес передаваемого значения.
Нетипизированные параметры: В ряде случаев необходимо передавать параметры, тип которых в момент описания функциинеизвестен. Такие параметры называют нетипизированными, при этом тип формального параметра в заголовке функции не указывается, а производится подстановка типа фактического параметра.
Замечание: при работе с нетипизированными параметрами следует учитывать, что в качестве нетипизированных параметров могут использоваться только параметры-переменные. Для использования нетипизированных параметров необходимо выполнять приведение типов. Данное приведение должно быть явным. Явное приведение — указание имени типа перед именем переменной.
Процедурные типы. Параметры-функции и параметры-процедуры.
Передаваемым в подпрограмму параметром может также быть процедура или функция (указатель на нее), т.е. параметр процедурного типа.
Для параметров-функций и параметров-процедур существуют следующие правила: подпрограммы должны иметь ключевое слово far; они не должны являться стандартными подпрограммами; не должны объявляться внутри других подпрограмм; не должны иметь директив inline или interrupt.
Назначение процедурных типов состоит в том, чтобы дать программисту гибкое средство для передачи процедур или функций в качестве фактических параметров. Для объявления процедурного типа используется заголовок процедуры или функции без указания её имени с определением набора параметров, а для функции — возвращаемого значения.
Type
F1 = procedure;
F2 = function (X: Integer; var S: String): Boolean;
function F2(X: Integer; var S: String): Boolean; far;
Begin
end;
procedure F(Func: F2);
Источник: infopedia.su
Функция (программирование)
Фу́нкция в программировании, или подпрограмма — фрагмент программного кода, к которому можно обратиться из другого места программы. В большинстве случаев с функцией связывается идентификатор [en] , но многие языки допускают и безымянные функции. С именем функции неразрывно связан адрес первой инструкции (оператора), входящей в функцию, которой передаётся управление при обращении к функции. После выполнения функции управление возвращается обратно в адрес возврата — точку программы, где данная функция была вызвана.
Функция может принимать параметры и должна возвращать некоторое значение, возможно пустое. Функции, которые возвращают пустое значение, часто называют процедурами. В некоторых языках программирования объявления функций и процедур имеют различный синтаксис, в частности, могут использоваться различные ключевые слова.
Функция должна быть соответствующим образом объявлена и определена. Объявление функции, кроме имени, содержит список имён и типов передаваемых параметров (или: аргументов), а также, тип возвращаемого функцией значения. Определение функции содержит исполняемый код функции. В одних языках программирования объявление функции непосредственно предваряет определение функции, в то время как в ряде других языков необходимо сначала объявить функцию, а уже потом привести её определение.
В объектно-ориентированном программировании функции, объявления которых являются неотъемлемой частью определения класса, называются методами. Также в языках с ООП возможно объявление абстрактной (виртуальной) функции без объявления тела функции.
Для того, чтобы использовать ранее определённую функцию, необходимо в требуемом месте программного кода указать имя функции и перечислить передаваемые в функцию параметры. Параметры, которые передаются функции, могут передаваться как по значению, так и по ссылке: для переменной, переданной по значению создаётся локальная копия и любые изменения, которые происходят в теле функции с переданной переменной, на самом деле, происходят с локальной копией и никак не сказываются на самой переменной, в то время как изменения, которые происходят в теле функции с переменной, переданной по ссылке, происходят с самой переданной переменной.
Функция определяет собственную (локальную) область видимости, куда входят входные параметры, а также те переменные, которые объявляются непосредственно в теле самой функции.
Существует возможность вызвать функцию внутри самой функции: такой вызов функции называется рекурсивным, а сам процесс последовательных вложенных друг в друга вызовов функций называют рекурсией. Поскольку необходимо запомнить (в стеке) адрес возврата функции (а также, выделить в том же стеке память под параметры и локальные переменные, не являющиеся динамическими), то ничем не ограниченная рекурсия приводит к переполнению стека, поэтому в языках программирования устанавливается некоторый предельный уровень вложенности рекурсивных вызовов.
Источник: wiki2.org
Функции в JavaScript
При написании кода, часто появляется необходимость использовать один и тот же функционал во многих местах программы, для удобного решения этой задачи используют функции.
Функция — это блок кода, который решает определенную задачу или возвращает значение и может выполняться многократно в разных местах и с разными входными данными. В JavaScript уже есть встроенные функции, такие как Math.random() , prompt(message, default) , Date() и многие другие. Здесь мы поговорим о тех, которые можно создавать самостоятельно.
Синтаксис
Работу с функциями можно разделить на два этапа: создание (объявление) и выполнение (вызов).
Объявление функции
function showIntention()
function — ключевое слово, обозначающее функцию.
showIntention() — имя функции, а в круглых скобках её параметры.
< >- в фигурных скобках — тело функции.
Вызов
Для того, чтобы функция отработала мы должны ее вызвать.
showIntention();
Без вызова функции мы не увидим сообщение, а для того, чтобы выполнить действие несколько раз вызов надо всего лишь продублировать. В итоге мы получаем такую программу.
function showIntention() < alert( ‘Я хочу стать программистом!’ ); >showIntention(); showIntention();
- Из названия функции должно быть предельно понятно, что там происходит.
- Для нейминга функций обозначающих действие чаще всего используют глагольные префиксы + уточнение. К первым относят: show, get, calc, create, check.
- Название может быть написано, как в стиле lowerCamelCase, так и в стиле snake_case. Первый вариант более предпочтителен и рекомендуется к применению в JavaScript. Какой вариант вы бы не выбрали, важно помнить, что название функции чувствительно к регистру.
- Не используйте для нейминга кириллицу или транслит. Несмотря на то, что в первом случае все будет работать, а во втором вроде все понятно, подобная практика считается дурным тоном.
- Используйте для названия функций английские слова.
- Имя функции не должно начинаться с цифры.
Далее разберем особенности и нюансы, которые необходимо знать при работе с функциями в JavaScript
Параметры и аргументы
Параметры функции в JavaScript записываются в круглых скобках и передаются в качестве аргументов в тело программы, как локальные переменные.
function showStudentIntention(studentName, profession) < alert(studentName + » хочет освоить профессию » + profession); >showStudentIntention(«Лера», «React-разработчик»); showStudentIntention(«Константин», «Web-разработчик»);
При вызове showStudentIntention в локальные переменные name и profession копируются значения имени и профессии в первом случае это «Лера» и «React-разработчик». Далее они используются в теле функции — в итоге мы получаем “Лера хочет освоить профессию React-разработчик”.
Функция не меняет внешние переменные, а получает копии, с которыми и работает.
let studentName = «Лера»; let profession = «React-разработчик» function showStudentIntention(studentName, profession) < studentName = «Константин»; profession = «Web-разработчик»; alert(studentName + » хочет освоить профессию » + profession); >showStudentIntention(studentName, profession); alert(studentName + » хочет освоить профессию » + profession);
В этой программе первое модальное окно, которое вызывается showStudentIntention будет содержать информацию о Константине — внутри функции мы объявили переменные studentName и profession — внешние проигнорированы. Второй alert будет про Леру, так как здесь значения берутся уже из внешних переменных, которые еще называются глобальными. Такие переменные располагаются снаружи всех функций — в рабочих проектах их использование стараются сводить к минимуму.
Локальные переменные
Область видимости переменных объявленных внутри функции ограничиваются этой функцией.
function showStudentIntention() < let studentName = «Константин»; let profession = «Web-разработчик»; alert(studentName + » хочет освоить профессию » + profession); >showStudentIntention() alert(studentName + » считает профессию » + profession + » бесперспективной»);
В данном примере отработает только вызов функции, второй alert не сработает, а в консоли можно будет увидеть ошибку — Uncaught ReferenceError: studentName is not defined.
Параметры по умолчанию
Если при вызове функции параметр не указывается, тогда он принимает значение undefined . Это не будет ошибкой — функция отработает. Однако во многих случаях будет полезней задать параметр по умолчанию.
function showStudentIntention(studentName, profession = «программист») < alert(studentName + » хочет освоить профессию » + profession); >showStudentIntention(«Лера»); //Лера хочет освоить профессию программист
Здесь это — profession = «программист»
Также параметры по умолчанию могут использовать значения предыдущих параметров, которые расположены левее.
function calcScores(studentName, scoresFirstExam, scoresSecondExam, examResults = scoresFirstExam + scoresSecondExam) < alert(studentName + » набрала за экзамены » + examResults + » баллов»); >calcScores(«Лера», 50, 80);
Если говорить о максимальном количестве аргументов, которые может принять функция — это 255.
Возврат значения — return
В качестве результата функция может передавать определенное значение, для этого используют директиву return .
function calcScores(scoresFirstExam, scoresSecondExam, scoresThirdExam) < let examResults = «Результат за три экзамена » + (scoresFirstExam + scoresSecondExam + scoresThirdExam); return examResults; >alert(calcScores(50, 50, 80));
По умолчанию функция возвращает undefined , в том числе и при пустом return . Сама директива может встречаться в теле функции несколько раз. Как выполнение кода доходит до первого return программа останавливается и возвращается соответствующее значение.
function calcScores(scoresFirstExam, scoresSecondExam, scoresThirdExam) < let examResults = scoresFirstExam + scoresSecondExam + scoresThirdExam; if (examResults >= 185) < return «Вы поступили!»; >else < return «Вы не поступили!»; >> alert(calcScores(50, 50, 100)); // Вы поступили! alert(calcScores(50, 50, 50)); // Вы не поступили!
Пустой return используется и для того, чтобы просто прекратить выполнение функции.
При длинной записи может появиться соблазн добавить перевод строки между return и его значением. Однако делать этого нельзя, если только не заключить значение в круглые скобки.
return a + b + c; // верно return ( a + b + c // верно ) return // интерпретатор автоматически поставит ; после return a + b + c // функция не вернет значение
Итого
Функции являются одними из важнейших строительных блоков программы на JavaScript. Они бывают встроенными, когда функционал уже заложен в языке и самописными.
Самописные функции в свою очередь могут быть записаны с помощью разного синтаксиса: Function Declaration, Function Expression и «стрелочные функции». В данном уроке мы рассмотрели только первый способ.
Основные моменты работы с функциями записанными в стиле Function Declaration:
- для создания функции её необходимо объявить с помощью специальной команды function ;
- функция может иметь в своем арсенале до 255 параметров, которые записываются в круглых скобках — function name(param1, param2, param3) ;
- для вызова функции нужно прописать её название, круглые скобки и там же параметры, если они есть — functionName(param1, param2) ;
- функция имеет доступ к внешним переменным, но внешнее окружение не имеет доступа к переменным объявленным внутри функции;
- с помощью директивы return функция может возвращать необходимое значение, по умолчанию это undefined .
Skypro — научим с нуля
Источник: learnjs.ru