Вызвать функцию можно только после объявления функции (то есть ниже объявления).

Объявление функции из стандартной библиотеки выполняется при помощи подключения библиотеки директивой препроцессора #include.

Оператор возврата из функции return

Существует несколько способов возврата управления к точке, из которой была вызвана функция:

- Если функция не должна возвращать результат, управление возвращается либо просто при достижении правой фигурной скобки, завершающей функцию, либо при выполнении оператора return.

- Если функция должна возвращать результат, то оператор

return выражение;

возвращает значение выражение в обращение к функции.

Таким образом, оператор возврата имеет две формы:

1) return;

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

2) return выражение;

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

Например:

return; не возвращает значения;
return 3; возвращаемое значение = 3;
return (a + b); возвращаемое значение = значению выражения (а + b); скобки необязательны, используются для улучшения читаемости кода.

Пример 9.

/* Программа для введеных с клавиатуры трех чисел предлагает выполнить след. действия: проверить на четность, вычислить сумму,вычислить сред. арифметическое нечетных чисел */

#include < iostream.h >

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

int IsEven(int);/* функция проверяет число на четность*/

int abcMultiple (int, int, int);/* функция вычисляет сумму трех чисел */

float ArithMean(int, int, int);/* функция вычисляет среднее арифметическое нечетных чисел*/

// описания функций

void OutputMenu()/* функция выводит на экран меню программы*/

{

cout << "1. Ввод чисел "<<endl<<"2. Проверка чисел на четность " <<endl<<"3. Вычислить произведение"<<endl<<"4. Вычислить среднее арифметическое нечетных чисел "<<endl;

cout << " Выберите пункт меню ";

return;

}

int InputNumber()/* функция ввода числа в заданном диапазоне */

{

int number = 0;

do

{

cout << " Введите целое число в диапозоне от 0 до 500: ";

cin >> number;

} while( number < 0 || number > 500);

return number;

}

void main()

{

int a = 0, b = 0, c = 0, /* объявление и инициализация переменных

целого типа для хранения чисел, введенных пользователем с клавиатуры*/

menuVal = 0; /* объявление и инициализация переменной целого

типа для хранения значения выбранного пункта меню */

do

{

OutputMenu(); /*вызов функции OutputMenu*/

cin >> menuVal;

switch (menuVal)

{

case 1: /* Метка соответствует задаче первого пункта меню */

a = InputNumber();

cout << " a = " << a;

b = InputNumber();

cout << " b = " << b;

c = InputNumber();

cout << " c = " << c;

break;

case 2: /* Метка соответствует задаче второго пункта меню */

if ( IsEven(a) ) cout << " а = " << a << " - четное";

if ( IsEven(b) ) cout << " b = " << b << " - четное";

if ( IsEven(c) ) cout << " c = " << c << " - четное";

break;

case 3: /* Метка соответствует задаче третьего пункта меню */

cout << " Произведение a*b*c = "

<< abcMultiple(a, b, c);

break;

case 4: /* Метка соответствует задаче четвертого пункта меню */

cout << " Среднее арифметическое нечетных чисел = "

<< ArithMean(a, b, c);

break;

default: /* В случае, если пользователь ввел значение вне диапозона 1-4 */

cout << "Будьте внимательней."

" Имеется всего 4 пункта меню :)";

}

cout << " Дальше? "

"0 - Нет, 1 - Да ";

cin >> menuVal;

}while(menuVal);

return;

}

// описания функций, прототипы функций объявлены выше

int IsEven(int val)

{

int valIsEven = val%2 ? 0 : 1;

return valIsEven;

}

int abcMultiple (int a, int b, int c)

{

return a*b*c;

}

float ArithMean(int val1, int val2, int val3)

{ int Sum = 0, count = 0;/* объявляем вспомогательные переменные

для вычисления среднего арифметического Sum/count */

if ( !IsEven(val1) )

{

count ++;

Sum += val1;

}

if ( !IsEven(val2) )

{

count ++;

Sum += val2;

}

if ( !IsEven(val3) )

{

count ++;

Sum += val3;

}

if ( count ) return float(Sum)/count;

else return 0;

}

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

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

1. Описать тип функции в ее определении:

char pun(ch, n) /* функция возвращает символ */int n;char ch; float raft(num) /* функция возвращает величину типа float */int num;

2. Описать тип функции также в вызывающей программе. Описание функции должно быть приведено наряду с описаниями переменных программы; необходимо только указать скобки (но не аргументы) для идентификации данного объекта как функции.



main( ){ char rch, pun( );float raft; }

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

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

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

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

Наши рекомендации