Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

Назначение функций

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

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

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

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

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

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

· Подпрограммы – процедуры.

· Подпрограммы – функции.

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

· Функции, возвращающие значение.

· Функции, не возвращающие значение.

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

Прежде всего, следует различать старый и новый стиль организации функций. Старый стиль организации функций связывают с именами авторов классической книги по языку Си: Кернигана и Ритчи (стиль K&R). Новый стиль – это стиль, принятый в стандарте языка Си. В настоящее время при разработке новых программ старый стиль организации функций практически не используется. Учитывая это обстоятельство, основное внимание уделим новому стилю организации функций.

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

Заголовок_функции
{
определения, объявления и инструкции
}

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

Заголовок функции имеет следующую структуру:

тип имя ([ определения_формальных_параметров ])

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

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

Третий элемент заголовка определения_формальных_параметров, который не является обязательным, содержит список определений формальных параметров. Аппарат параметров (формальных и фактических) лежит в основе способа абстрагирования, который используется в процедурной абстракции. В отличие от определений переменных определения формальных параметров нельзя объединять в группы. Каждый формальный параметр должен быть определен отдельно.

Замечание. Стандарт С89 поддерживал так называемый принцип неявного int. В соответствии с этим принципом при отсутствии спецификатора типа по умолчанию предполагает использовании типа int. Стандарт C99 не рекомендует придерживаться этого принципа.

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

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

return выражение;

Инструкция return, рассматриваемого вида, выполняет два действия:

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

2. Прекращает вычисления, выполняемые в теле функции, и возвращает управление клиентскому коду.

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

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

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

double pow(double x, double y)

Заметим, что недопустимо написать заголовок функции pow() в следующем виде:

double pow(double x,y) /* Синтаксическая ошибка */

Функция pow принимает два аргумента, имеющих тип double, и возвращает в точку ее вызова значение типа double.

Приведем еще один пример заголовка функции:

void table(double xn, double xk, int n)

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

Телом любой функции, является блок. Блоком называется последовательность инструкций, заключенная в фигурные скобки. Тело функции может содержать вложенные блоки. В блоке могут встречаться инструкции двух видов: инструкции объявления и выполняемые инструкции. В стандарте C89 в блоке вначале следует располагать инструкции объявления, а затем выполняемые инструкции. В стандарте C99 это ограничение отсутствует, и инструкции объявления могут располагаться в любом месте блока. Используя эту возможность, можно располагать определение переменной в той точке программы, где она начинает использоваться. Это повышает читабельность программы.

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

Пример 1. Приведенная ниже функция (max2()) принимает два аргумента вещественного типа и возвращает значение набольшего из своих аргументов.

double max2(double a, doubl e b)
{
double max;
if (a > b)
max = a;
else
max = b;
return max;
}

 

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

double max2_2(double a, doubl e b)
{
if (a > b)
return a;
return b;
}

 

Сравним два варианта решения. Второй вариант (функция max2_2()) выглядит более компактной. Некоторые программиста возможно в качестве недостатка отметили бы наличие в теле этой функции двух инструкций return. Это можно рассматривать как нарушение принципа одного входа и одного выхода. Действительно лучше придерживаться принципа, в соответствии с которым функция имеет только одну точку выхода. Это улучшает читабельность программного кода. Однако тело функции оказывается достаточно компактным, нарушение этого принципа не приводит к заметным негативным последствиям.

Пример 2. Табулирование функции y = x2 в n равноотстоящих точках.

void table(double xn, double xk, int n)
{
int i;
double x, dx;
printf("%5s%10s%10s\n", "Number", "X", "Y");
x = xn;
dx = (xk - xn) / (n - 1);
for (i = 1; i <= n; i++)
{
printf("%6d%10.3f%10.3f\n", i, x, x * x);
x += dx;
}
}

<== предыдущая лекция | следующая лекция ==>
Понятие о функции | Вызов функции. Передача параметров по значению
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 357; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.