Вызвать функцию можно только после объявления функции (то есть ниже объявления).
Объявление функции из стандартной библиотеки выполняется при помощи подключения библиотеки директивой препроцессора #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, нужно указать тип функции в ее определении и в разделе описаний вызывающей программы. Если требуется, чтобы при выполнении функции происходило изменение значении переменных в вызывающей программе, необходимо пользоваться адресами и указателями.