Функции¶
Функция (в программировании) — это фрагмент кода или алгоритм, реализованный на каком-либо языке программирования, с целью выполнения определённой последовательности операций.
Функция является основной программной единицей в Си, минимальным исполняемым программным модулем. Всякая программа обязательно включает в себя основную функцию с именем main. Если в программе используются и другие функции, то они выполняют роль подпрограмм. Рассмотрим пример. Требуется составить программу нахождения наибольшего значения из трех величин — max (a, Ь, с). Для ее решения можно использовать вспомогательный алгоритм нахождения максимального значения из двух, поскольку справедливо равенство: max (a, b, с) = max (max (a, b), с):
Формат определения функции¶
Формат определения функции следующий:
тип имя_функции *(спецификация_параметров) * {
тело_ функции
}
Тип функции — это тип возвращаемого функцией результата. Если функция не возвращает никакого результата, то для нее указывается тип void.
Имя функции — идентификатор, задаваемый программистом или main для основной функции.
Спецификации параметров — это либо «пусто», либо список имен формальных параметров функции с указанием типа для каждого из них.
Тело функции — это либо составной оператор, либо блок. Признаком блока является наличие описаний программных объектов (переменных, массивов и т.д.), которые действуют в пределах этого блока. Блок, как и составной оператор, ограничивается фигурными скобками.
Из всякой функции возможно обращение к другим функциям, однако они всегда являются внешними по отношению к вызывающей. Оператором возврата из функции в точку ее вызова является оператор return. Он может использоваться в функциях в двух формах:
return; или return выражение;
В первом случае функция не возвращает никакого значения в качестве своего результата. Во втором случае результатом функции является значение указанного выражения. Тип этого выражения должен либо совпадать с типом функции, либо относиться к числу типов, допускающих автоматическое преобразование к типу функции. Оператор return может в явном виде отсутствовать в теле функции. В таком случае его присутствие подразумевается перед закрывающей тело функции фигурной скобкой. Такая подстановка производится компилятором.
Формат обращения к функции (вызова функции) традиционный:
имя_функции(список_фактических_праметров)
Обращение к функции — это выражение. В этом выражении круглые скобки играют роль знака операции, для которой функция и фактические параметры (аргументы) являются операндами. Приоритет операции «скобки» самый высокий, поэтому вычисление функции в выражениях производится раньше других операций.
Между формальными и фактическими параметрами при вызове функции должны соблюдаться правила соответствия по последовательности и по типам.
Фактический параметр — это выражение того же типа, что и у соответствующего ему формального параметра. Необходимо строго следовать принципу соответствия типов.
Внимание
Передача параметров при вызове функции происходит только по значению. В Си допустимы только параметры-значения. Поэтому выполнение функции не может изменить значения переменных, указанных в качестве фактических параметров.
Прототип функции¶
Прототипом называется предварительное описание функции, в котором содержатся все необходимые сведения для правильного обращения к ней: имя и тип функции, типы формальных параметров. В прототипе имена формальных параметров указывать необязательно, хотя их указание не является ошибочным.
Полное определение функции МАХ () перед основной частью программы необязательно. Вот другой вариант программы, решающей ту же самую задачу.
Листинг maxproto.cpp:
Можно было написать и так, как в заголовке определения функции: int MAX(int x, int у);
Внимание
Точка с запятой в конце прототипа ставится обязательно!
Можно было бы записать прототип и в теле основной функции наряду с описаниями других программных объектов в ней. В
Пример Функции03:
Написать функцию, выводящую на экране строку, состоящую из 80 звездочек.
Листинг: line.cpp
В данной программе приводится пример использования функции, которая не имеет параметров и не возвращает никаких значений в точку вызова.
Использование библиотечных функций¶
Библиотечными назы ваются вспомогательные функции, хранящиеся в отдельных файлах. Стандартные библиотеки входят в стандартный комплект системы программирования на Си/Си++. Кроме того, программист может создавать собственные библиотеки функций. Для использования стандартных функций не обходимо подключать к программе заголовочные файлы соответ ствующих библиотек. Делается это с помощью директивы препроцессора #include с указанием имени заголовочного файла. Например, #include<stdio.h>. Эти файлы содержат прототипы функций библиотеки. На стадии препроцессора происходит подстановка прототипов перед основной функцией, после чего компилятор в состоянии контролировать правильность обращения к функциям. Сами программы, реализующие функции, хранятся в форме объектного кода и подключаются к основной программе на стадии редактирования свя ей (при работе компоновщика).
Пример Функции04:
Составить программу для вычисления площади выпуклого четырехугольника по декартовым координатам(рис. Функции01).
Математическая модель:
Обозначим координаты вершин четырехугольника так: (х1,у1), (х2,у2), (хЗ, у3), (х4, у4). Площадь четырехугольника можно вычислить как сумму площадей двух треугольников. В свою очередь, площадь каж дого треугольника вычисляется по формуле Герона.
Аналогично вычисляются длины других отрезков. Таким образом, для решения основной задачи — вычисления площади четырехугольника — требуется вспомогательный алгоритм вычисления площади треугольника для которого, в свою очередь, необходим вспомогательный алгоритм вычисления длины отрезка по координатам концов.
Листинг quadr.cpp
В этой программе используются функции из трех стандартных библиотек с заголовочными файлами iostream, math.h
Служебное слово typedef представляет собой спецификатор типа, позволяющий определять синонимы для обозначения типов. В результате в рассматриваемой программе вместо длинного слова double для обозначения того же самого типа можно употреблять одну букву D. Данное описание действует глобально и распространяется как на основную, так и навспомогательные функции.
typedef double D;
В функции Geron имеются обращения к функции Line, а в основной функции — обращение только к функции Geron.
Поэтому если из данной программы убрать прототип функции Line, то ошибки не будет. Но если одновременно с этим поменять местами определения функций Line и Geron, то компилятор выдаст сообщение об ошибке.
Пример Функции05 (самостоятельно):
Составить программу для вычисления площади выпуклого пятиугольника по декартовым координатам(рис. Функции02).
Для реализации данной задачи достаточно в программе предыдущего примера добавить ввод координат пятой точки и вычисление площади третьего треугольника с помощью функций Line и Geron






