Использование функций

 

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

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

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

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

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

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