Не зря эту статью, я назвал «Функции, как неотъемлемая часть программирования», ведь без них, по моему мнению, ни один язык не имеет право на существование. Что же это такое? Функция - это главная составляющая хорошо написанной программы. Она облегчает не только чтение кода, но и в корне меняет представление о структурном программировании. При помощи функций, Вы можете многократно использовать отдельные части программы, передавая им какие-либо параметры. Ни одну серьезную программу невозможно представить без этого чуда элемента программирования.

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

Грубо говоря, все выглядит так. Коротко поясню. Мы создаем какую-нибудь переменную и присваиваем ей результат выполнения функции myfunc, которая в свою очередь вычисляет значение возведения в квадрат какого-нибудь числа. Функции не исполняются сразу во время запуска программы, а исполняются только тогда, когда к ним обращаются. Может немного запутанно, но все именно так.

Как вызвать функцию?

Для того, чтобы вызвать функцию, необходимо ее создать. Хотя существуют, так же, встроенные функции. Например, это: cos, sin, md5, count, abs и так далее. Для их вызова необходимо лишь присвоить переменной искомое значение.

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

Function hello() { echo "Hello, world!"; }

Затем ее вызываем. Причем если она не имеет параметров, то мы просто ставим круглые скобки. Чтобы вызвать эту функцию, воспользуемся лишь строчкой: hello(); . Любая функция может так же возвращать значение с помощью зарезервированного слова return . Этот оператор прекращает выполнение функции и посылает возвращаемое значение в вызвавшую программу. function sum($first, $second) {$r=$first + $second; return $r;} echo sum(2,5); результат выполнения программы будет равен 7. Локальные и глобальные переменные

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

$per="Дима"; function primer() // Выполняет: вывод локальной переменной { echo "Меня зовут ".$per; } echo primer();

В данном случае на экране появится фраза «Меня зовут». Это означает, что внутри функции primer создалась переменная $per и ей, по-умолчанию, было присвоено нулевое значение. Для того, чтобы избежать таких косяков, нужно воспользоваться оператором global . В соответствии с этим исправим вышеизложенный код:

$per="Дима"; function primer() // Выполняет: вывод глобальной переменной { global $per; echo "Меня зовут ".$per; } echo primer();

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

Функции двух и более аргументов

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

… function font($text, $size=5) // Выполняет: вывод размера шрифта { echo "".$text.""; } font("Привет
",1); font("Привет
",2); font("Привет
",3); font("Привет
",4); font("Привет
",5); font("Привет
",6); font("Привет
");

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

Заключение

Прежде чем попрощаться, хочу обратить Ваше внимание на одном совете. Он заключается в том, чтобы вынести все написанные Вами функции в один файл (например, function.php). А затем, в файле, где необходимо обратиться к функции, достаточно лишь подключить function.php и все будет готово к использованию. Это намного облегчит понимание логики в Вашей программе. Для подключения, используйте:

include_once("function.php");

require_once("function.php");

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

Функции над числами. В языкеVBимеются следующие математические функции:abs (x ) - вычисление модуля;sqr (x ) - вычисление квадратного корня,a tn(x ) - вычисление арктангенса;cos (x ) - вычисление косинуса;sin (x ) - вычисление синуса;tan (x ) - вычисление тангенса;log (x ) - вычисление натурального логарифма,exp (x ) - вычисление экспоненты, гдеx - аргумент функции численного типа. Для вычисления значений функций, отсутствующих в языкеVisualBasic, необходимо воспользоваться формулами, известными из математики.

Выражение y =наVBбудет записано так:y=sin(x^2)+sqr(tan(x))*(x+5) ^ (1/5).

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

Функции преобразования значения из одного типа в другой. В языке программированияVBимеются функции для изменения типа данных значения. Например, имеется переменнаяaтипаDoubleи переменнаяsтипаString.

Для записи переменной aв переменнуюsнеобходимо осуществить преобразование типаS=CStr(a), а для записи переменнойsв переменнуюa–a=CDbl(s).

Функции VB для преобразования типа значения:

CStr– преобразование в строку;

CByte - преобразование вByte;

CInt – преобразование вInteger;

CLng– преобразование вLong;

CSng– преобразование вSingle;

CDbl – преобразование вDouble.

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

Для представления информации в памяти ЭВМ (как числовой, так и не числовой) используется двоичный способ кодирования.

Элементарная ячейка памяти ЭВМ имеет длину 8 бит (байт). Каждый байт имеет свой номер (его называют адресом ). Наибольшую последовательность бит, которую ЭВМ может обрабатывать как единое целое, называютмашинным словом . Длина машинного слова зависит от разрядности процессора и может быть равной 16, 32, 64 битам и т.д.

Кодирование символов. Для кодирования символов достаточно одного байта. При этом можно представить 256 символов (с десятичными кодами от 0 до 255). Набор символов персональных ЭВМ, совместимых с IBM PC, чаще всего является расширением кода ASCII (American Standard Code for Information Interchange - стандартный американский код для обмена информацией). В настоящее время используются и двухбайтовые предсталения символов.

Представление целых чисел в дополнительном коде. Диапазон значений величин зависит от количества бит памяти, отведенных для их хранения. В памяти объемомnбит может хранитьсяразличных значений.Например, величины типа Integer лежат в диапазоне от -32768 (-2 15) до 32767 (2 15 - 1) и для их хранения отводится 2 байта (16 бит); типа Long - в диапазоне от -2 31 до 2 31 - 1 и размещаются в 4 байтах (32 бита).

Для беззнакового представления целых двоичных числа изменяются от 0 до
, а в представлении со знаком – от
до
. В современных ЭВМ принято длинуn разрядной сетки целых чисел выбирать кратной 8 (т.е. целое число байтов).

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

Разряды нумеруются справа налево, начиная с 0. На рис. .2.2 показана нумерация бит в двухбайтовом машинном слове.

Рис. 2.2. Н умерация бит в двухбайтовом машинном слове

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

Например, если число 37 (10) = 100101 (2) объявлено величиной типа Integer (шестнадцатибитовое со знаком), то его прямым кодом будет 0000000000100101, а если величиной типа Long (тридцатидвухбитовое со знаком), то его прямой код будет. Для более компактной записи чаще используют шестнадцатеричное представление кода. Полученные коды можно переписать соответственно как 0025 (16) и 00000025 (16) .

Дополнительный код целого отрицательного числа может быть получен по следующему алгоритму:

    записать прямой код модуля числа;

    инвертировать его (заменить единицы нулями, нули - единицами);

    прибавить к инверсному коду единицу.

Например, запишем дополнительный код числа -37, интерпретируя его как величину типа Long (тридцатидвухбитовое со знаком):

    прямой код числа 37 есть ;

    инверсный код;

    дополнительный код или FFFFFFDB (16) .

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

    вычесть из кода числа 1;

    инвертировать код;

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

Примеры. Запишем числа, соответствующие дополнительным кодам:

    0000000000010111. Поскольку в старшем разряде записан нуль, то результат будет положительным. Это код числа 23.

    1111111111000000. Здесь записан код отрицательного числа. Исполняем алгоритм: 1) 1111111111000000 (2) - 1 (2) = 1111111110111111 (2) ; 2) 0000000001000000; 3) 1000000 (2) = 64 (10) . Ответ: -64.

Цель работы: 1) изучить правила описания функций; 2) приобрести навыки использования функций при написании программ на языкеC++.

Теоретические сведения

Основным модулем программ в языке С++ является функция.

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

Каждая программа на языке С++ обязательно содержит функцию с именем main (главная), которая является телом программы. Для всех остальных функций, если они присутствуют в программе, следует объявлять прототипы - схематические записи, которые сообщают компилятору имя и форму каждой функции в программе.

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

тип_возвращаемого_значения имя_функции (список_параметров_с_указанием_типов);

Функции в С++ бывают стандартные (библиотечные) и программируемые пользователем.

Стандартные функции

Описания стандартных функций находятся в файлах, включаемых в программу с помощью директивы #include. Такие файлы называют заголовочными; они имеют расширение h.

Обращение к имени функции в основной программе называется вызовом функции.

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

y = sin (x); //функция вычисления синуса

Определение функции

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

тип_возвращаемого_значения имя_функции (тип имя_параметра,...,тип имя_параметра)

тело_функции

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

Функции, которые программист создает сам, упрощают процесс написания программ, поскольку они:

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

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

Пример 9 .1. Создадим функцию, которая печатает 65 символов "*" в ряд. Чтобы эта функция выполнялась в некотором контексте, она включена в программу печати фирменного бланка. Программа состоит из функций: main() и stars().

// Фирменный бланк

#include

const int Limit=65;

void stars(void); // прототип функции stars()

cout<<"Moscow Institute of Electronic Engineering"<

// Определение функции stars()

for (count=1; count<=Limit; count++)

Мы рассмотрели пример простейшей функции, не имеющей аргументов и не возвращающей никаких значений.

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

Рассмотрим на примере использование параметров функции.

Пример 9. 2. Напишем функцию space(), в качестве аргумента которой будет число пробелов, которое должна напечатать эта функция.

#define address " Zelenograd"

#define name " Moscow Institute Electronic Engineering "

#define department " Informatics and Programming"

const int LIMIT=65;

#include

void space(int number);

cout<

spaces=(LIMIT - strlen(name))/2; // Вычислить, сколько

// нужно пробелов

cout<

space((LIMIT - strlen(department))/2); // аргумент – выражение

cout<

//Определение функции stars()

for (count=1; count<=LIMIT; count++)

//Определение функции space()

void space(int number)

for (count=1; count <=number; count++)

Переменная number называется формальным аргументом. Эта переменная приобретает значения фактического аргумента при вызове функции. Другими словами, формальный аргумент - переменная в определении вызываемой подпрограммы, афактический аргумент - конкретное значение, присвоенное этой переменной вызывающей программой.

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

void printnum (int i, int j)

{ cout<<"Координаты точек”<< i << j <

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

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

Побочный эффект

Функции и процедуры

В некоторых языках программирования (например, в Паскале) функции и процедуры (подпрограммы, не возвращающие значения) чётко разграничены синтаксисом языка . В других - например, в языке Си , - процедуры являются частным случаем (подмножеством) функций, возвращающими значение типа (псевдотипа) void - пустое значение.

Аргументы и параметры

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

Функция без аргументов

Такая функция не требует никаких аргументов .

См. также

Ссылки

  • Функции PHP. Синтаксис и примеры использования функций PHP

Wikimedia Foundation . 2010 .

Смотреть что такое "Функция (программирование)" в других словарях:

    В Викисловаре есть статья «функция» Функция многозначный термин, который означает такое отношение между элементами, в котором изменение в одном влечет измен … Википедия

    Функция заглушка в программировании функция не выполняющая никакого осмысленного действия, возвращающая пустой результат или входные данные в неизменном виде. Аналогичное английское слово stub . Используется: Для наглядности при… … Википедия

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

    Математическое программирование математическая дисциплина, изучающая теорию и методы решения задач о нахождении экстремумов функций на множествах конечномерного векторного пространства, определяемых линейными и нелинейными ограничениями… … Википедия

    В области компьютеризации понятие программирования сетевых задач или иначе называемого сетевого программирования (англ. network programming), довольно сильно схожего с понятиями программирование сокетов и клиент серверное программирование,… … Википедия

    Функция высшего порядка функция, принимающая в качестве аргументов другие функции или возвращающая другую функцию в качестве результата. Основная идея состоит в том, что функции имеют тот же статус, что и другие объекты данных.… … Википедия

    ПРОГРАММИРОВАНИЕ МАТЕМАТИЧЕСКОЕ - комплекс математич. моделей и методов решения задач отыскания экстремума (максимума или минимума) функций многих переменных при ограничениях в виде неравенств. Имеется в виду, что переменные характеризуют какие либо аспекты механизма… … Российская социологическая энциклопедия

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

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

    ПРОГРАММИРОВАНИЕ, МАТЕМАТИЧЕСКОЕ - раздел прикладной математики, применяющийся в качестве метода в экономических исследованиях. Разрабатывает теорию и методы решения условных экстремальных задач, является основной частью формального аппарата анализа разнообразных задач управления … Большой экономический словарь

Если вы такой же разработчик, как и я, то наверняка сперва изучали парадигму ООП. Первым вашим яыком были Java или C++ - или, если вам повезло, Ruby, Python или C# - поэтому вы наверняка знаете, что такое классы, объекты, экземпляры и т.д. В чём вы точно не особо разбираетесь, так это в основах той странной парадигмы, называющейся функциональным программированием, которая существенно отличается не только от ООП, но и от процедурного, прототипно-ориентированного и других видов программирования.

Функциональное программирование становится популярным - и на то есть причины. Сама парадигма не нова: Haskell , пожалуй, является самым функциональным языком, а возник он в 90-ых. Такие языки, как Erlang, Scala, Clojure также попадают под определение функциональных. Одним из основных преимуществ функционального программирования является возможность написания программ, работающих конкурентно (если вы уже забыли, что это - освежите память прочтением ), причём без ошибок - то есть взаимные блокировки и потокобезопасность вас не побеспокоят.

У функционального программирования есть много преимуществ, но возможного максимального использования ресурсов процессора благодаря конкурентному поведению - это его главный плюс. Ниже мы рассмотрим основные принципы функционального программирования.

Вступление : Все эти принципы не обязательны (многие языки следуют им не полностью). Все они теоретические и нужны для наиболее точного определения функциональной парадигмы.

1. Все функции - чистые

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

  1. Функция, вызываемая от одних и тех же аргументов, всегда возвращает одинаковое значение.
  2. Во время выполнения функции не возникают побочные эффекты .

Первое правило понятно - если я вызываю функцию sum(2, 3) , то ожидаю, что результат всегда будет равен 5. Как только вы вызываете функцию rand() , или обращаетесь к переменной, не определённой в функции, чистота функции нарушается, а это в функциональном программировании недопустимо.

Второе правило - никаких побочных эффектов - является более широким по своей природе. Побочный эффект - это изменение чего-то отличного от функции, которая исполняется в текущий момент. Изменение переменной вне функции, вывод в консоль, вызов исключения, чтение данных из файла - всё это примеры побочных эффектов, которые лишают функцию чистоты. Может показаться, что это серьёзное ограничение, но подумайте ещё раз. Если вы уверены, что вызов функции не изменит ничего “снаружи”, то вы можете использовать эту функцию в любом сценарии. Это открывает дорогу конкурентному программированию и многопоточным приложениям.

2. Все функции - первого класса и высшего порядка

Эта концепция - не особенность ФП (она используется в Javascript, PHP и других языках) - но его обязательное требование. На самом деле, на Википедии есть целая статья, посвящённая функциям первого класса . Для того, чтобы функция была первоклассной, у неё должна быть возможность быть объявленной в виде переменной. Это позволяет управлять функцией как обычным типом данных и в то же время исполнять её.

3. Переменные неизменяемы

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

4. Относительная прозрачность функций

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

Пусть у нас есть Java-функция, которая складывает 3 и 5:

Public int addNumbers(){ return 3 + 5; } addNumbers() // 8 8 // 8

Очевидно, что любой вызов этой функции можно заменить на 8 - значит, функция относительно прозрачна. Вот пример непрозрачной функции:

Public void printText(){ System.out.println("Hello World"); } printText() // Returns nothing, but prints "Hello World"

Эта функция ничего не возвращает, но печатает текст, и при замене вызова функции на ничто состояние консоли будет другим - значит, функция не является относительно прозрачной.

5. Функциональное программирование основано на лямбда-исчислении

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

  1. В лямбда-исчислении все функции могут быть анонимными, поскольку единственная значимая часть заголовка функции - это список аргументов.
  2. При вызове все функции проходят процесс каррирования . Он заключается в следующем: если вызывается функция с несколькими аргументами, то сперва она будет выполнена лишь с первым аргументом и вернёт новую функцию, содержащую на 1 аргумент меньше, которая будет немедленно вызвана. Этот процесс рекурсивен и продолжается до тех пор, пока не будут применены все аргументы, возвращая финальный результат. Поскольку функции являются чистыми, это работает.

Как я уже говорил, лямбда-исчисление на этом не заканчивается - но мы рассмотрели лишь ключевые аспекты, связанные с ФП. Теперь, в разговоре о функциональном программировании вы сможете блеснуть словечком “лямбда-исчисление”, и все подумают, что вы шарите 🙂

Заключение

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

Если вы хотите узнать о функциональном программировании побольше, то советуем вам ознакомиться с примерами использования принципов ФП в JavaScript ( , ), а также с , посвящённым функциональному C#.