Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Си.doc
Скачиваний:
38
Добавлен:
27.03.2016
Размер:
2.8 Mб
Скачать

Функции

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

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

Таким образом, подпрограмма представляет собой самостоятельную программу, имеющую входные и выходные аргументы (параметры), которая может быть написана и отлажена отдельно от других программ, а затем использована в них.

Примерами подпрограмм являются программы вычисления отдельных функций, имеющихся в библиотеках языков программирования, – стандартных функций, а также функций ввода-вывода. Эти подпрограммы размещены в системной библиотеке языка, подключаемой к программе пользователя при ее обработке. Значит, используя в своей программе, например, функцию printf, мы обращаемся к стандартной библиотеке ввода-выводаstdio.h, подсоединяемой к нашей программе директивой препроцессора#include <stdio.h>.

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

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

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

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

директивы препроцессора

прототипы функций

Void main()

{

головная программа с обращениями к функциям

}

описание функций

Таким образом, функции, используемые в программе, должны быть обязательно объявлены – указан их прототип. Прототип – это заголовок функции с указанием ее типа, имени, типов и имен аргументов – формальных параметров:

int summa(int a, int b);

void vorm_mass(int n, int m, int mass[n][m]);

Внимание! После закрывающих скобок точка с запятой ставится обязательно!

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

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

int summa(int a, int b)

{

int s; // s – локальная переменная

s = a + b;

return s; // возврат вычисленного значения

}

void vorm_mass(int n, int m, int mass[n][m])

{

int i, j;

for (i=0; i<n; i++)

for (j=0; j<m; j++)

{

// задание значений элементам массива mass[n][m]

}

}

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

В последнем случае оператор returnне нужен, так как функцияvorm_massимеет типvoid– ничего не возвращает.

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

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

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

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

Функция возвращает вычисленное значение, если она заканчивается оператором возврата return, после которого следует имя переменной или выражение, значение которого должна определить функция: