Примеры фнукций в С++
В листинге ниже приведен пример программы с объявлением функции msum(int n), которая возвращает в качестве результата значение суммы натуральных чисел. Количество слагаемых в сумме определяется целочисленным аргументом функции.
Функция не всегда должна возвращать результат Если функция результат не возвращает, в качестве типа функции указывается void В этом случае функция напоминает процедуру Пример такой функции приведен в следующем коде.
Более того, функция не только не возвращает результат - у нее еще и нет аргументов (тем не менее, скобки после названия функции все равно указываются, причем как при объявлении функции, так и при ее вызове). Функциональность программы после внесения исправлений не изменилась: на экране выводится приглашения для пользователя ввести натуральное число (верхнюю границу для суммы натуральных чисел), это число считывается, после чего вычисляется сумма натуральных чисел. Что изменилось, так это организация программного кода. Фактически главный ме тод программы состоит всего из одной команды (если не считать стандартную инструкцию return 0) по вызову функции msum2(), Вся функциональность программы спрятана в этой функции. Вначале в рамках вызова функции msum2() запрашивается значение целочисленной переменной n (теперь это локальная переменная функции). Затем вводится переменная s для записи значения суммы натуральных чисел, выполняется оператор цикла и на экран выводится значение суммы (переменная s). На этом выполнение функции заканчивается.
Все переменные, использованные в теле функции, являются локальными. Это означает, что они доступны только в теле функции, но никак не за ее пределами. Вообще же доступность переменных определяется простым правилом: переменные доступны в пределах того блока, где они объявлены. Напомним, что блок в С++ ограничивается парой фигурных скобок. Несмотря на то что функция, объявленная с типом void, результат не возвращает, она может содержать инструкцию return, и не одну. В этом случае инструкция return является командой завершения функции. Пример такой функции приведен в коде.
В результате выполнения функции, в зависимости от значения аргумента, возможны два сценария. При ненулевом аргументе на экран выводится значение, обратное к аргументу. Если аргумент у функции нулевой, выводится сообщение соответствующего содержания.
Проверка аргумента на предмет равенства нулю осуществляется в услов ном операторе. Блок условного оператора, выполняющийся при нулевом аргументе, состоит из двух команд: выводится сообщение (команда cout<<"Division by zero!"<
В обеих командах вывода в функции использована инструкция завершения строки епdl. Кроме того, в данном случае фактически инструкция return использована как альтернатива к еlse-блоку условного оператора: можно было бы ту часть кода, что выполняется при ненулевом аргументе функции, разместить в еlse-6локе условного оператора, отказавшись при этом от инструкции завершения функции return. Тем не менее, в более сложных программах использование такой инструкции часто бывает не только оправданным, но и существенно упрощает структуру кода. Что касается непосредственно объявления функции, то в С++ допускается в начале программы указывать прототип функции (прототипом функции называется «шапка» с типом возвращаемого результата, именем функции и списком аргументов), а непосредственно объявление функции переносить в конец программы. Корректным является такой программный код (смотрите следующий листинг).
#includeusing namespace std; int msum(int n){ int s=0; for(int i=1; i <= n; i++) s+=i; return s;} int main(){ int n; cout << "Enter n = "; cin >> n; cout << "Sum is " << msum(n) << "\n"; return 0; }
#includeusing namespace std; void msum2(){ int n; cout << "Enter n = "; cin >> n; int s=0; for(int i=1; i <=n; i++) s+=i; cout << "Sum is " << s << "\n"; } int main(){ msum2(); return 0; }
Все переменные, использованные в теле функции, являются локальными. Это означает, что они доступны только в теле функции, но никак не за ее пределами. Вообще же доступность переменных определяется простым правилом: переменные доступны в пределах того блока, где они объявлены. Напомним, что блок в С++ ограничивается парой фигурных скобок. Несмотря на то что функция, объявленная с типом void, результат не возвращает, она может содержать инструкцию return, и не одну. В этом случае инструкция return является командой завершения функции. Пример такой функции приведен в коде.
void InvFunc(double z){ if(z==0){ cout << "Division by zero!" << endl; return;} double x; x=1/z; cout << "1/z =" << x << endl; }
В обеих командах вывода в функции использована инструкция завершения строки епdl. Кроме того, в данном случае фактически инструкция return использована как альтернатива к еlse-блоку условного оператора: можно было бы ту часть кода, что выполняется при ненулевом аргументе функции, разместить в еlse-6локе условного оператора, отказавшись при этом от инструкции завершения функции return. Тем не менее, в более сложных программах использование такой инструкции часто бывает не только оправданным, но и существенно упрощает структуру кода. Что касается непосредственно объявления функции, то в С++ допускается в начале программы указывать прототип функции (прототипом функции называется «шапка» с типом возвращаемого результата, именем функции и списком аргументов), а непосредственно объявление функции переносить в конец программы. Корректным является такой программный код (смотрите следующий листинг).
#includeusing namespace std; //Прототип функции InvFunc(): void InvFunc(double z); //Функция InvFunc() использована в программе: int main(){ double s; cout << " Enter number: "; cin >> s; InvFunc(s); return 0; } //Объявление функции InvFunc(): void InvFunc(double z){ if(z==0){ cout << "Division by zero!" << endl; return;} double x; x=1/z; cout << "1/z =" << x << endl; }