Функции.
Использование функций
Функция по своей сути — это подпрограмма, которая может манипулировать данными и возвращать некоторое значение. Каждая программа имеет хотя бы дону программу — main().
Каждая функция обладает собственным именем, и если это имя встречается в программе, то управление переходит к телу этой функции. Этот процесс называют вызовом функции. По возвращению из функции выполнение программы продолжается со следующего за именем функции оператора.
Различают два вида функций : встроенные и определённые пользователем. Встроенные функции являются составной частью пакета компилятора и предоставляются фирмой-изготовителем. Нестандартные функции разрабатываются программистом.
Функции возвращают либо некоторое реальное значение либо некоторое значение типа void (то есть «ничего»).
Функция так же может принимать некоторые значения, то есть иметь параметры.
В общем виде объявление функции может иметь вид:
int MyFunction(int some Value, float SameFloat);
Вызов функции имеет вид:
Rezult=MyFunction(12.4,4.7);
Использование функций требует что бы функция была сначала объявлена, а потом определена. Объявление функции сообщает компилятору тип возвращаемого значения, тип параметров и как функция работает, и называется прототипом функции.
Существуют три способы объявления функции:
- можно записать протопип в файл, а потом подключить его в основную программу при помощи #include.
- поместить прототип в файл, где используется эта функция.
- определить функцию перед вызовом, в этом случае описание и есть объявление ( это не очень хороший стиль).
Прототип функции имеет вид:
В прототипе используется список формальных параметров.
Функции состоят из заголовка и тела. Заголовок содержит установки типа возвращаемого значения, имени и параметров функции. Параметры позволяют передавать в функцию значения.
Пример: заголовок функции складывающей два числа.
Параметр — это объвление типа данных значения, передаваемого в функцию.реальное значение, передаваемон при вызове функции называется аргументом функции.
Тело функции начинается с фигурной скобки и содержит раяд строк, за которыми следует закрывающая фигурная скобка. ( если тело функции содержит какие-то другие фигурные скобки, то они должны быть парными). Функция может возвращать значение при помощи оператора возврата.
Пример:
#include <iostream.h>
int Add(int x, int y);
int Add(int x,int y)
{
cout << “В Add складываются “ <<x<< “и”<<y<<”\n”;
return (x+y);
}
int main()
{ int a,b,c;
cout <<”Введите два числа:\n”;
cin >>a;
cin >> b;
c=Add(a,b);
cout <<”a+b=”<<c<<”\n”;
return 0;
}
Макрофункции
Иногда бывает полезно создать макроопределение с аргументами - макрофункцию. Макрофункция применяется там, где требуется произвести не очень сложные вычисления, и хороши тем, что они выполняются для любых типов данных (в отличие от обычных функций).
Однако, следует быть очень внимательным с использованием аргументов, поскольку происходит всего лишь подстановка аргумента в строку замещения, после которой, возможно, появятся синтаксические и логические ошибки (связанные с приоритетами операций).
Пример 3.
/* текст программы до обработки препроцессором */
#include<stdio.h>
#define SQUARE(x) x*x
void main(void)
{
int y=5,rez;
printf("квадрат y равен %d\n",SQUARE(y)); printf("квадрат y+2 равен %d\n",SQUARE(y+2)); printf("частное равно %f\n",100./SQUARE(y));
}
Перегрузка функций
В языке С++ предусмотрена перегрузка функций, то есть функция с одним именем описана для разных типов параметров, с разными результатами, если написать функцию с разным результатом, но с одним списком параметров, то компилятор выдаст ошибку.)
При вызове функции компилятор создаёт копию функции в памяти, выделяя под неё память, можно выиграть несколько в быстродействии, если использовать функцию, описанную так, что компилятор каждый раз подставляет её в программу , этого можно добиться, если описать функции inline.
inline int Area(int,int);
Возмоожны рекурсивные функции, то есть функции, вызывающие самое себя.
Пример.
#include <iostream.h>
int fib(int n);
int fib(int n)
{ if (n<3)
return 1;
else
return (fib(n-2)+fib(n-1));
}
int main(void)
{
int i,rez;
cout <<"введите число Фибоначи = ";
cin >> i;
rez=fib(i);
cout <<i<<"-oe число Фибоначи ="<<rez<<"\n";
return 0;
}
Результат:
введите число Фибоначи = 6
6-oe число Фибоначи =8
Возврат более одного результата
В языке С++ передача параметров в функцию может передаваться по адресу при помощи указателей. Делается это для возврата из функции нескольких значений, в этом случае связь с переменными, выступающими в качестве параметров, сохраняется и изменения их значений видны в вызывающей функцию программе.
Пример.
#include<iostream.h>
#include<conio.h>
// #include"sqwere.cpp"
#include <math.h>
int sqwere(float a,float b, float c,float *x1,float *x2);
// объявление функции, ниже идут заголовок и тело этой функции
int sqwere(float a,float b, float c,float *x1,float *x2)
{ float d;
d=b*b-4.*a*c;
if(d<0.)return 0;
*x1=(-b-sqrt(d))/(2.*a);
*x2=(-b+sqrt(d))/(2.*a);
if(d==0.)return 1;
if(d>0) return 2;
}
int main(void)
{
float a,b,c,x1,x2;
int rez;
cout <<"Введите числа\n a:";
cin >>a;
cout <<"\n b=:";
cin >>b;
cout <<"\n c=:";
cin >>c;
// вызов функции с фактическими параметрами
rez=sqwere(a,b,c,&x1,&x2);
switch(rez)
{ case 0: cout << "корней нет \n";break;
case 1: cout << "корнь один = "<< x1 <<" \n";break;
case 2: cout << "корней два x1= "<< x1 <<" x2= "<<x2<<"\n";break;
}
return 0;
}
Та же самая программа написана при помощи ссылок, найдите отличия
#include<iostream.h>
#include<conio.h>
#include <math.h>
int sqwere(float a,float b, float c, float &x1,float &x2);
int sqwere(float a,float b, float c,float &x1,float &x2)
{ float d;
d=b*b-4.*a*c;
if(d<0.)return 0;
x1=(-b-sqrt(d))/(2.*a);
x2=(-b+sqrt(d))/(2.*a);
if(d==0.)return 1;
if(d>0) return 2;
}
int main(void)
{
float a,b,c,x1,x2;
int rez;
cout <<"Введите числа\n a:";
cin >>a;
cout <<"\n b=:";
cin >>b;
cout <<"\n c=:";
cin >>c;
rez=sqwere(a,b,c,x1,x2);
switch(rez)
{ case 0: cout << "корней нет \n";break;
case 1: cout << "корнь один = "<< x1 <<" \n";break;
case 2: cout << "корней два x1= "<< x1 <<" x2= "<<x2<<"\n";break;
}
return 0;
}