|
|
6. Функции и
структура программы. 6.1. Функции пользователя. В языке Паскаль, наряду со стандартными процедурами и функциями, существует возможность самому написать и использовать процедуру или функцию. На языке Си, как уже говорилось, программа состоит из одной или более функции. В языке Си, именно функции являются основными модулями, из которых собирается программы на языке Си. Рассмотрим программы, в которых определяется функция, возводящая число в степень.
В этой программе основные действия оформлены в виде функции. Началом описания функции является зарезервированное слово function. Далее следует имя функции и, в скобках после имени, указан список аргументов. Сама функция ожидает возврат некоего значения, тип которого описывается здесь же. В данном случае это longint;. Структура функции на Паскале такая же, как у обычной программы, за исключением того, что в конце функции, после слова end, ставится знак “точка с запятой”. Кроме того, в тексте функции должно присутствовать, хоть одно присвоение результата работы, “имени” функции. Теперь рассмотрим программу на Си.
В этой программе, в виде функции, выделен основной цикл. Как же оформляется функция пользователя в языке Си? Первоначально объявление прототипа функции начинается с описания типа результата, возвращаемого функцией. Кроме того, в скобках после имени функции указывается, что функция ожидает два целочисленных аргумента. ( 1 ) Любое использование функции (вызов) должен быть согласован с прототипом. Имена аргументов не требуют согласования. Фактически, они вообще могут отсутствовать. Эти же замечание касается и функций на Паскале. Как и в программе на языке Паскаль, при вызове функции (при обращении к функции) используется оператор присваивания, имя функции и, в скобках, значения фактических аргументов. (2) Описание самой функции начинается с заголовка функции. Заголовок должен полностью соответствовать своему прототипу. (3) При обращении к функции формальным аргументам присваиваются значения фактических аргументов. Фактический аргумент может быть константой (как в данном примере), переменной или сложным выражением. Независимо от типа фактического аргумента, он сначала вычисляется, а затем его величина передаётся функции. Ключевое слово return указывает на то, что значение выражения, заключенного в круглые скобки, будет присвоено функции, содержащей это ключевое слово. Таким образом, результат вычислений, являющийся значением переменной p, присваивается функции, а значение функции, в свою очередь, присваивается переменной s при вызове этой функции. Правила написания функции, такие же, как и при написании основной функции main: указывается имя функции, круглые скобки с описанием используемых переменных, операторы определяющие работу. Тело функции заключено в фигурные скобки. Над созданной функцией можно выполнять те же операции, что и над любой стандартной функцией, в частности использовать как аргумент стандартной функции печати, которая сразу печатает результат функции. К тому же, функция без аргумента может вызываться простым указанием её имени. Применение функций для выполнения отдельных промежуточных действий алгоритма, позволяет сделать программу хорошо структурированной и более понятной, что позволит достичь меньшего количества ошибок. В отличие от Паскаля, принципы программирования на Си основаны на понятии функции. Наряду с системными функциями (printf(), scanf(), getchar(), и др.) можно создавать и свои собственные функции и делать их доступными для функции main(), а так же друг для друга. Функция – самостоятельная единица программы, спроектированная для реализации конкретной задачи. При работе с функцией самое главное – знать, какую информацию надо передавать ей на вход, и, что получим в результате на выходе. Если рассматривать программу, как последовательность решения более мелких задач, то решение каждой такой задачи можно оформить в виде отдельной функции (или модуля). Тогда функция main() будет содержать лишь обращения к функциям.
Ещё одно преимущество такого подхода в том, что если Вы создадите функции достаточно общего вида, то их можно будет использовать и в других программах. Теперь рассмотрим, как можно определить функции, как к ним обращаться и как устанавливать связи между функцией и программой. При написании функции придерживаются тех же правил, что и при написании main():
Следует, однако, помнить, что переменные, описанные внутри тела функции пользователя, являются её внутренними (локальными) переменными и не известны вызывающей функции. Точно так же, как переменные вызывающей функции неизвестны в вызываемой. Для передачи значений переменных из программы в функцию, используют функции с аргументами. Здесь, при определении функции, в скобках, после имени, указываются аргументы. В случае если аргументов несколько – они разделяются запятыми: Function1(1,j,number). Для сравнения вспомним, что в Паскале функция с аргументами определяется следующим образом: Function1(l,j,number:integer):integer;, где :integer; - тип значения функции. Вот ещё одно отличие функции на Си, от функции на Паскале: выходная величина присваивается функции с помощью ключевого слова return. В примере, приведённом в начале раздела, значение внутренней переменной p будет присвоено функции, и таким образом передано вызывающей программе. Оператор return оказывает и другое действие. Он завершает выполнение функции и передает управление следующему оператору в вызывающей функции. Это происходит даже в том случае, если оператор return является не последним оператором тела функции, т.е. прерывает работу функции на определённом этапе выполнения. Как и в языке Паскаль, функция может принимать значения любого базового типа. Для этого её тип указывается в двух местах:
Однако, по умолчанию тип функции в Си – целый. В Паскале же – тип функции всегда должен быть определён. |