Компьютеры Windows Интернет

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

Оператор цикла является важнейшим оператором и имеется в большинстве современных языков программирования, а сама идея цикла возникла еще в XIX веке. Цикл позволяет многократно выполнить некоторую последовательность действий, которая задается операторами, составляющими тело цикла.

Начнем с оператора цикла с предусловием . Данный оператор имеет вид:

While <условие> do <оператор>.

При выполнении этого оператора вначале вычисляется значение логического выражения. Если это значение истинно, выполняется оператор. Затем значение выражения проверяется вновь, и все повторяется до тех пор, пока выражение не примет значение «ложь». Каждое выполнение цикла иногда называют итерацией цикла. Если выражение принимает значение «ложь» при первой же проверке, то оператор не выполняется вообще.

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

Цикл с постусловием имеет вид:

Repeat…<выражние_1>until…<выражение_2>

Здесь вначале выполняется оператор statement(утверждение), и только затем вычисляется значение логического выражения. Именно поэтому такой цикл называют циклом с постусловием. Процесс повторяется, пока выражение имеет значение «ложь». Как только его значение становится истинным, выполнение цикла прекращается. Оператор может быть любым, в том числе и составным оператором:

Оператор_1;

Оператор_2;

…………….

Оператор_N;

Until<условие>

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

Операторы цикла со счетчиком: for...to...do и for…downto …do.

Третий вариант оператора цикла - цикл с параметром . Можно считать, что есть две очень похожих друг на друга разновидности цикла со счетчиком. Первый из этих операторов имеет вид:

For параметр цикла:= начальное значение to конечное значение do <оператор>;

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

После выполнения цикла for значение управляющей переменной становится неопределенным.

Вариант for…downto...do... цикла for аналогичен циклу for..to…do за исключением того, что в нем управляющая переменная на каждом шаге выполнения не увеличивается, а уменьшается на единицу:

for j:- <выражение_1> downto <выражение_2> do <оператор>.

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

Используйте цикл for в том случае, когда точно знаете, сколько раз должно быть выполнено тело цикла. В противном случае обратитесь к циклам repeat или while.

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

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

Такой выход из цикла обеспечивается процедурой Break, которая прерывает выполнение самого внутреннего вложенного цикла, будь то for, while или repeat. Указанный модуль подключается к программе автоматически, если в этом есть необходимость.

While true do begin

<Выражение_1>

If <оператор> then Break

<Выражение_2>; end

Следует также упомянуть процедуру Continue, которая прерывает выполнение тела самого внутреннего цикла for, while или repeat и передает управление на его заголовок, так что начинается выполнение очередной итерации цикла.

Шаг цикла for всегда постоянный и равен интервалу между двумя ближайшими значениями типа параметра цикла.

Var {описание параметров цикла}

i: integer(целочисленный тип);

c: char(символьный тип);

1. Begin {вывод на печать целых чисел от 1 до 10}

For i:=1 to 10 do writeln (i);{шаг цикла равен 1}

2. {вывод на печать чисел от 10 до -10}

For 10 down to -10 {шаг цикла равен -1}

3. {вывод на печать латинских символов от A до R}

{параметр цикла изменяется от A до R в алфавитном порядке}

For c:=‘A’ to ‘R’ do writeln (c);

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

Пример: Вычисление суммы от 1 до n.

var s,n,i: integer;

writeln (‘Введите n’);

for i:=1 to n do s:=s+i;

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

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

Существует множество встроенных в язык программирования функций. С некоторыми такими в Python мы уже сталкивались. Это print(), input(), int(), float(), str(), type(). Код их тела нам не виден, он где-то "спрятан внутри языка". Нам же предоставляется только интерфейс – имя функции.

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

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

i = 0 while i < 3 : a = int (input () ) b = int (input () ) print (a+b) i += 1

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

print () a = int (input () ) b = int (input () ) print ("Всего" , a+b, "шт." ) print () a = int (input () ) b = int (input () ) print ("Всего" , a+b, "шт." )

Пример исполнения программы:

Сколько бананов и ананасов для обезьян? 15 5 Всего 20 шт. Сколько жуков и червей для ежей? 50 12 Всего 62 шт. Сколько рыб и моллюсков для выдр? 16 8 Всего 24 шт.

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

Определение функции. Оператор def

В языке программирования Python функции определяются с помощью оператора def. Рассмотрим код:

def countFood() : a = int (input () ) b = int (input () ) print ("Всего" , a+b, "шт." )

Это пример определения функции. Как и другие сложные инструкции вроде условного оператора и циклов функция состоит из заголовка и тела. Заголовок оканчивается двоеточием и переходом на новую строку. Тело имеет отступ.

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

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

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

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

Рассмотрим полную версию программы с функцией:

def countFood() : a = int (input () ) b = int (input () ) print ("Всего" , a+b, "шт." ) print ("Сколько бананов и ананасов для обезьян?" ) countFood() print ("Сколько жуков и червей для ежей?" ) countFood() print ("Сколько рыб и моллюсков для выдр?" ) countFood()

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

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

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

print ("Сколько бананов и ананасов для обезьян?" ) countFood() print ("Сколько жуков и червей для ежей?" ) countFood() print ("Сколько рыб и моллюсков для выдр?" ) countFood() def countFood() : a = int (input () ) b = int (input () ) print ("Всего" , a+b, "шт." )

Результат:

Сколько бананов и ананасов для обезьян? Traceback (most recent call last ) : File "test.py" , line 2 , in < module> countFood() NameError: name "countFood" is not defined

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

Функции придают программе структуру

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

Пусть надо написать программу, вычисляющую площади разных фигур. Пользователь указывает, площадь какой фигуры он хочет вычислить. После этого вводит исходные данные. Например, длину и ширину в случае прямоугольника. Чтобы разделить поток выполнения на несколько ветвей, следует использовать оператор if-elif-else:

figure = input () if figure == "1" : a = float (input ("Ширина: " ) ) b = float (input ("Высота: " ) ) print ("Площадь: %.2f" % (a*b) ) elif figure == "2" : a = float (input ("Основание: " ) ) h = float (input ("Высота: " ) ) print ("Площадь: %.2f" % (0.5 * a * h) ) elif figure == "3" : r = float (input ("Радиус: " ) ) print ("Площадь: %.2f" % (3.14 * r**2 ) ) else : print ("Ошибка ввода" )

Здесь нет никаких функций, и все прекрасно. Но напишем вариант с функциями:

def rectangle() : a = float (input ("Ширина: " ) ) b = float (input ("Высота: " ) ) print ("Площадь: %.2f" % (a*b) ) def triangle() : a = float (input ("Основание: " ) ) h = float (input ("Высота: " ) ) print ("Площадь: %.2f" % (0.5 * a * h) ) def circle() : r = float (input ("Радиус: " ) ) print ("Площадь: %.2f" % (3.14 * r**2 ) ) figure = input ("1-прямоугольник, 2-треугольник, 3-круг: " ) if figure == "1" : rectangle() elif figure == "2" : triangle() elif figure == "3" : circle() else : print ("Ошибка ввода" )

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

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

Если понадобиться использовать эти функции в какой-нибудь другой программе, то мы сможем импортировать их туда, сославшись на данный файл с кодом (как это делается в Python, будет рассмотрено позже).

Практическая работа

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

Основная ветка программы, не считая заголовков функций, состоит из одной строки кода. Это вызов функции test(). В ней запрашивается на ввод целое число. Если оно положительное, то вызывается функция positive(), тело которой содержит команду вывода на экран слова "Положительное". Если число отрицательное, то вызывается функция negative(), ее тело содержит выражение вывода на экран слова "Отрицательное".

Локальные и глобальные переменные

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

Что такое функция

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

Резюмируем

Итак, функции - это своеобразные контейнеры для группировки алгоритмов. Они:

  1. ответственны за конкретные задачи;
  2. взаимодействуют с другими объектами;
  3. являются концептуальной основой современного программирования, как бы пафосно сие ни звучало.

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

Предыдущие публикации:

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

Положительные моменты:

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

Функции избавляют программиста от рутинного клонирования массы повторяющихся операторов;

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

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

Что надо знать о функциях? Во-первых, как правильно их вызывать из программы, во-вторых, как оформлять в отдельные библиотеки, в-третьих, как устанавливать взаимосвязи с другими функциями.

Функции в языке Си можно условно разделить на три вида: системные, внутренние и внешние.

Системные функции прилагаются к любому компилятору. В WinAVR их можно найти в библиотечном справочнике, находящемся по адресу C:\WinAVR-2010010\ doc\avr-libc\avr-libc-user-manual.pdf (далее - «Библиотечное руководство»).

Каждая системная функция входит строго в свою библиотеку. Названия библиотек и функций в разных компиляторах отличаются. Объявление используемых библиотек производится в «шапке» программы директивой препроцессора «#inC1ude <имя заголовочного файла-хеддера>».

Символ «#» пишется слитно со словом «inC1ude» и обязательно начинается в первом столбце листинга. «Хеддер» - это файл с расширением «.h», в котором описываются параметры функций. К системным также относится головная функция «main», без которой не обходится ни одна программа в языке Си.

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

Компилятор AVR-GCC, используемый в пакете WinAVR, занимает по сравнению с другими компиляторами золотую середину. В его составе имеются примерно в равной части функции общепринятых стандартов ANSI, C99, а также собственные микроконтроллерные библиотеки.

Досконально изучив системные функции одного компилятора, программист в какой-то мере «привязывается» к ним и не хочет переучиваться на новые. Вот где требуется поистине шахматный расчёт, чтобы с первого раза выбратьдля изучения солидный, мощный и постоянно обновляемый (а значит, «живой»!) компилятор. К слову сказать, AVR-GCC пока оправдывает все ожидания пользователей.

В стандартные библиотеки компиляторов, наряду с функциями, входят также системные макроопределения, например, специфические для пакета WinAVR «_BV», «bit_is_set», «bit_is_C1ear». Подробности их применения освещаются в «Библиотечном руководстве».

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

Сколько раз должна вызываться внутренняя функция? Желательно два и более раза, иначе теряются преимущества от её применения. Использование внутренних функций эффективно там, где требуется много раз выполнять одни и те же повторяющиеся действия. Чем чаще вызываются функции, тем выше получается степень сжатия программного кода.

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

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

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

3. Если сделать внешние функции максимально автономными в работе, то их в будущем можно использовать совместно с другими программами. Дальновидные программисты стараются создавать свои «родные» библиотеки, состоящие из специализированных функций. К примеру, хороший набор готовых внешних функций для AVR-контроллеров содержится в бесплатной библиотеке Паскаля Стэнга .

По устоявшейся традиции, все имена функций, как и имена переменных, записывают малыми латинскими буквами. Цифры допускаются во всех позициях имени, кроме первой слева. Названия системных функций изменять нельзя, они определяются стандартами, в отличие от внутренних и внешних функций, имена которым придумывают, кто как хочет. Единственное ограничение, чтобы новые названия отличались от названий системных функций, иначе компилятор выдаёт сообщение об ошибке: «Error previous definition».

За именем функции обязательно следуют круглые скобки, в которых при необходимости указывают передаваемые/принимаемые параметры. В Табл. 6.9 перечислены все допустимые форматы объявления и вызова функций в AVR-GCC.

Таблица 6.9. Форматы объявления и вызова функций в AVR-GCC

Формат объявления функции __ «example()»

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

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

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

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

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

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

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

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

См. также

Ссылки

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

Wikimedia Foundation . 2010 .

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

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

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

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

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

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

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

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

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

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

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