Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комплексное пособие Си.pdf
Скачиваний:
57
Добавлен:
12.03.2015
Размер:
1.57 Mб
Скачать

Подпрограммы

Описание подпрограмм

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

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

Перед использованием функции необходимо дать ее определение,

например: P(x) = x * (x + 1)

После этого ее можно использовать, например, получить значение функции P(x) при x=10: P(10) = 10 *( 10 + 1) = 110

Вызов подпрограммы (команда «выполнить подпрограмму») записывается аналогично использованию математической функции:

f(a1, a2, ... , an)

где f - имя подпрограммы (аналогично имени функции P), a1, a2, ... , an -

аргументы вызова (фактические параметры), конкретные величины,

подставляемые вместо формальных параметров при выполнении подпрограммы (как аргумент 10 при вычислении значения функции P).

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

При изменении имени формального параметра смысл подпрограммы не изменяется (как если бы в определении функции F(x) заменить x, например,

на y).

Подпрограммы могут быть двух типов:

функция – подпрограмма, обладающая значением;

процедура – подпрограмма, не обладающая значением.

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

85

функции, обладающие значением;

функции, не обладающие значением.

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

Определение функции имеет вид:

<Заголовок_ функции>

// тело

{

<Объявление переменных функции>

}

<Операторы функции>

// функции

 

 

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

<тип значения> <имя функции> ([<тип> <имя>[,<тип> <имя>] …])

Если функция не обладает значением, в качестве типа значения пишется ключевое слово void. Тип значения функции разрешается не указывать. В этом случае (по умолчанию) подразумевается тип int.

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

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

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

Оператор возврата имеет вид:

return [<выражение>];

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

86

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

Подпрограмма выполняется после ее вызова. Программа, в составе которой выполняется подпрограмма, по отношению к подпрограмме называется главной, основной или вызывающей программой. В то же время,

она сама может быть подпрограммой (подчиненной программой) по отношению к вызывающей ее программе.

Вызов подпрограммы, т.е. команда для выполнения подпрограммы имеет вид:

<имя функции> ([<имя> [,<имя>] …])

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

Вызов функции, не обладающей значением, обозначает действие и

может записываться только как самостоятельный оператор.

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

Значение функции используется при вычислении значения выражения. Например, вызов функции может быть в правой части оператора присваивания.

Вызов функции, обладающей значением (возвращающей значение), в

операторе присваивания:

<имя переменной> = <имя функции> ([<имя> [, <имя>] …]);

Например, в языке С операция извлечения квадратного корня из величины x реализуется вызовом стандартной функции sqrt (x). Можно записать выражение, содержащее вызовы функций sqrt с разными аргументами, называемыми фактическими параметрами функции:

z= (sqrt (x) + sqrt (y*2)) / 2;

Примеры заголовков функций, не обладающих значением:

87

void p_f (float x, float *z) - процедура p_f от входного вещественного параметра x и выходного вещественного параметра z;

void p_fakt (int k, int *f) - процедура p_fakt с входным целочисленным параметром k и выходным целочисленным параметром f.

Примеры вызова функций p_f и p_fakt:

float a = 15.2, b; int p;

p_f (a, &b); p_fakt (4, &p);

Примеры заголовков функций, обладающих значением:

float f (float x) - вещественная функция f от вещественного параметра x; int fakt (int k) - целочисленная функция fakt с входным целочисленным

параметром k.

Примеры вызова функций f и fakt:

float a,

b;

int

n=4,

p;

a =

15.2;

*f(20.5);

b

=

f (a)

p

=

fakt

(n) + fakt(5);

Пример описания функции:

/* функция определения наибольшего из двух чисел */ float max ( float x, float y )

{ if (x>y) return x; else return y;

}

Пример вызова функции:

f = max(a,b) - max(a+b,c);

содержит два вызова приведенной выше функции max. При первом обращении функции max передаются значения переменных a и b, она возвращает наибольшее из этих чисел, которое подставляется вместо указателя функции max(a,b). При втором вызове функции max формальным параметрам x и y присваиваются соответственно значения фактических параметров a+b и c. Оператор return возвращает наибольшее из этих значений в точку вызова функции.

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

88