Использование функций
В точке, где в программе используется функция, компилятор должен иметь информацию об этой функции, чтобы скомпилировать ее вызов. Ему нужна достаточная информация, чтобы идентифицировать функцию, и убедиться, что функция применяется корректно. Для этого используют объявление функции с помощью оператора, который называется прототипом функции.
Прототип функции предоставляет базовую информацию, которую компилятор должен проверить, чтобы убедиться, что функция используется корректно. Он специфицирует параметры, передаваемые функции, ее имя и тип возвращаемого значения. По сути, прототип содержит ту же информацию, что содержится в заголовке функции, с добавлением точки с запятой. Понятно, что количество параметров и их типы в прототипе функции должны быть такими же, как в ее заголовке.
Прототипы функций, которые вызываются из другой функции, должны появляться перед операторами, где эти функции вызываются, и потому обычно помещаются в начале исходного файла программы. Заголовочные файлы, которые включаются для использования стандартных библиотечных функций, помимо прочего, включают в себя прототипы этих библиотечных функций.
Если прототипа не существует, то программист обязан сам следить за правильностью вызова функции и за последовательностью описания функций. То есть функции в коде программы должны быть описаны выше, чем используются. Таким образом, функция, использующая другую функцию должна стоять ниже, и самой последней должна стоять функция main().
Схема расположения таких функций см. на рис.
#include <iostream>
#include <math.h>
#include<iomanip>
using namespace std;
/* прототип функции которая проводит все вычисления, функция берет коэффициенты уравнения, проверяет что надо делать, и выводит текстовые строки с описанием ситуации, если необходимо считать корни вызывает функцию расчета корня*/
char* proverka (double a1,double b1,double c1);
// прототип функции считающей корень
double korny_2D(double a1,double a2,double a3,int k);
// описание функции
char* proverka (double a1,double b1,double c1)
{
double d,x1,x2; // локальные переменные
d=b1*b1-4.*a1*c1; // расчет дескреминанта
if(d<0.) return "действительных корней нет\n"; // возврат 1варианта значаний
else
if(d==0.)
{
x1=korny_2D(a1,b1,c1,1); // вызов фкнкции расчета 1 корня
cout<<x1<<endl;
return "один действительный корень=";//возврат 2варианта значаний
}
else
{
x1=korny_2D(a1,b1,c1,1); // вызов фкнкции расчета 1 корня
cout<<" корень№1="<<x1<<endl;
x2=korny_2D(a1,b1,c1,-1); // вызов фкнкции расчета 2 корня
cout<<"корень№2="<<x2<<endl;
return "два действительных корня\n"; =";//возврат 3варианта значаний
}
}
double korny_2D(double a,double b,double c,int k) // заголовок функции
{// коэффициен к определяет знак в вычислениях корня, если 1 то +, если -1
double d,x; // прототип функции
d=b*b-4.*a*c; // прототип функции
x=(-b+k*sqrt(d))/(2.*a); // прототип функции
return x; // возврат значения
}
int main(void) // заголовое функции main
{ setlocale(NULL,"Russian");// подключение кодовой страницы
double a,b,c; // локальные переменные
cout<<"Введите коэффициенты уравнения a*x^2+b*x+c+0\n";
cin>>a>>b>>c; // ввод значений с клавиатуры
cout<<proverka(a,b,c);
// вызов функции с последующей печатью на экран тестового сообщения
return 0;
}// конец программы
Если протопипы удалить, то компилятор выдаст ошибки (рис. 49).
Рис. 49. Пример ошибок, выдаваемых компилятором, в программе без прототипов функций
При наличии прототипов программа скомпилируется без ошибок, и результат её работы будет иметь вид (рис. 50).
Рис. 50. Результат работы безошибочной программы
Прототип функции из примера выглядит следующим образом:
double korny_2D(double a1,double a2,double a3,int k);
// прототип функции
Необходимо обратить внимание, что имена специфицированы в прототипе другими именами, на самом деле в прототипе можно использовать список спецификации формальных параметров без имен переменных. То есть он может иметь вид:
double korny_2D(double ,double ,double ,int );
// прототип функции
И этого достаточно. Совпадение списка спецификации заголовка функции и прототипа функции обычно обуславливается тем, что программист обычно пишет строку прототипа, а потом копирует её в строку заголовка, просто удалив из строки завершающую ;.