Функции

   Функцията представлява поредица от оператори, обединени в едно име.
Могат да бъдат извикани за изпълнение многократно от всяка точка на
програмата, чрез изписване на името на функцията. Щом достигне
до име на функция програмата спира своето изпълнение "отива"
там където се намира развита цялата функцията,изпълнява всички
оператори и се връща в програмата там където е прекъснала своето
изпълнение.
      Стойността която се изчислява се присвоява на самото име на функцията.

Синтаксис :

       тип Име (
  тип параметър 1,  тип параметър 2,  тип параметър N )
             {
                      Поредица от оператори;
             }

    Пример за създаване на функция за умножение на две числа :

          int multi ( int a, int b)
          {
             int c;
             c=a*b;
             return c;
          }

  тип -  валиден тип данни int, float, ... ;
  Име - Името си го създавате Вие, то не трябав да съвпада
със служебните думи на с++ , чрез него се извикват функциите в програмата;
  параметри - предават данни (идентификатори,променливи) от програмата
към функцията. Те се декларират като променливи
- например (int a,int b, double c) параметрите се разделят със запетая един от
друг и няма ограничение на броят им.
    Пример за създаване на функция за умножение на две числа :
     int multi ( int a, int b)
     {
        int c;
        c=a*b;
        return c;
     }

Обяснение: Името на функцията е multi a и b са ( формалните) параметри,
които ги получава от главната функция ( int main() ).
Декларираме си променливата с, с е равно на а*b , след това с return c; връщаме
резултата от произведението на главната функция. Стойността на с
се присвоява на самото име на функцията.
Целия пример с включване на функцията в програмата Ви го представям:

Пример 1 : Умножение на две числа .
#include <iostream> //for Code Blocks
using namespace std;
int multi ( int a, int b)
{
int c;
c=a*b;
return (c);
}
int main()
{
int d,e=2,f=4;
d=multi(e,f);
cout<< d;
return 0;
}
Обяснение :
function

Програмата започва своето изпълнение от int main(), задават се стойности
е=2, f=4 в реда d=multi(e,f); e много важен:
     1. Чрез достигане на името на функцията, главната програма спира
своето изпълнение и прескача на мястото, където е описана цялата функция.
Параметрите e и f в главната програма се наричат фактически параметри .
     Параметрите на програмата(фактическите) и на функциятя (формалните)
трябва да съвпадат по
тип, брой и последователност.

     2. Броя на параметрите в реда d=multi(e,f)трябва да съвпада с броя
на параметрите в реда int multi( int a, int b) , стойността на e се
присвоява на а, съответно f се присвоява на b. Не може да има разминаване например :
int multi( int a, int b)
d=multi(e,f,g)      - не съвпадат по брой.

int multi( double a, int b)
d=multi(e,f)      - не съвпадат по тип.
Параметъра а е от тип double.
Връщаме една стойност с return (c), която се присвоява на името на фунцията
d=multi(e,f), трябва да имаме друга променлива d, която да бъде от
същия тип от който е и самата функция( в конкретния пример int d
и int multi( int a,int b) ). Друг вариант е да изпишем : cout << multi(e,f);
т.е. да изведем резултата от функцията направо в оператора cout .
Очакваме да отпечатим на екрана 8 т.е 2*4=8

   Включването на функцията може да се осъществи в началото или края
на програмата, ако се пише в края на програмата трябва в началото на програмата
да напишете прототип на функция - кратко описание на самата функция. За конкретния
пример в началото на програмата, преди основната функция int main() трябва да напишете:
     int multi ( int a, int b);
               или                      прототипи на функция
     int multi ( int , int );
може да не се пишат имената на променливите (идентификаторите), важно е
типа да е изписан. Щом е функция след името трябва да има скоби (),
независимо дали има или няма параметри(аргументи).
    Всяка програма започва изпълнението си винаги от главната функция.
int main ()- тя също е функция без параметри, но има отваряща и затваряща скоби.
(int пред main()- означава, че след изпълнение на програмата (основната функцията) трябва
да върне целочислена стойност на операционната система).
Пример 2 : Програма за повдигане на xy x и y въведени от клавиатурата.
Създаваме прототип на функцията
double func_xy ( double , double );

#include <iostream> //for Code Blocks
#include <math.h>
using namespace std;
   double func_xy ( double , double );
int main()
{
double x,y,z;
cout<< "x=";
cin >>x;
cout<< "y=";
cin >>y;
z=func_xy(x,y);
cout<< "x^y="<< z;
return 0;
}
double func_xy ( double a, double b )
{
double c;
c=pow(a,b);
return (c);
}

Предаване параметри на функция по адрес

   Когато искате чрез функция да промените повече от една стойност на променлива (аргумент) във функция.
Пред името на аргумента (променливата) трябва да се пише знака &(амперсанд). Това означава, че се предават адресите на параметрите на функцията и функцията работи не със стойности, а с адресите на които се съдържат тези стойностите. По този начин можете да промените стойностите в главната програма.

     Примерна програма за умножение на променливата x*6 чрез използване на знака (&) във функция: function_2 и без използване на знака (&) във функция: function_1.

#include <iostream> //for Code Blocks
using namespace std;
void function_1(int x)
{ x=6*x;}
void function_2(int &x)
{ x=6*x; }
int main()
{
int a=5;
function_1(a);function_1(a);
cout<< "a="<< a<< endl;
function_2(a);
cout<< "a="<< a<< endl;
return 0;
}

Обяснение: двете функции се различават само по знака &, но се получават различни резултати. При изплзване на функция function_1 не се случва нищо, а при всяко използване на function_2 стойността на променливата а се умножава по 6.

Пример 4 : Програма за умножение на две числа и чрез фунццията променяме
стойностите на x и y.

#include <iostream> //for Code Blocks
using namespace std;
double func_xy ( double &a, double& b)
{
double c;
c=a*b;
a=2*a;
b=2*b;
return (c);
}
int main()
{
double x=4,y=6,z;
cout<< "x="<< x<< ", y="<< y<< endl;
z=func_xy(x,y);
cout<< "z="<< z<< endl;
cout<< "x="<< x<< ", y="<< y<< endl;
return 0;
}
   Обяснение : ако премахнем знака & (амперсанд) в този ред : double func_xy ( double & a, double & b) стойностите на x и y няма да се удвоят.

Функции без типове

   Всяка функция, която има определен тип пред името си трябва да завършва
с оператора return . Може след return да няма израз, но return трябва да го има.
Ако функцията не трябва да връща стойност, например да отпечати съобщение
или да изведем някъкъв резултат, тогава вместо определен тип пишем: void .
Декларация :
      void Име на функция ( параметри )

Пример 5 : Извеждаме ред от 20 броя звездички " * ".

#include <iostream> //for Code Blocks
using namespace std;
void asteric ()
{
char c='*';
for(int i=0;i< 21;i++)
cout<< c;
cout<< endl;
}
int main()
{
asteric ();
cout<< "First sentence ...\n";
asteric ();
cout<< "Second sentence ...\n";
asteric ();
cout<< "Third sentence ...\n";
asteric ();
return 0;
}

Пример 6 : Извеждаме ред от 20 броя знак плюс " + " и три изречения в таблица.
Използваме две функции без тип.


#include <iostream> //for Code Bloзcks
using namespace std;
void pluss ()
{
char c='+';
for(int i=0;i< 21;i++)
cout<< c;
cout<< endl;
}
void space()
{
cout<< "|                   |\n";
}
int main()
{
pluss ();space();
cout<< "| First sentence... |\n";
space();pluss ();space();
cout<< "| Second sentence.. |\n";
space();pluss ();space();
cout<< "| Third sentence... |\n";
space();pluss ();
return 0;
}

Пример 7 : Програма за изчисляване на корените на квадратно уравнение. Приемаме, че
коефициента
а е различен от нула, ако а=0 вече не е квадратно, а линейно уравнение.

#include <iostream> //for Code Blocks
#include <math.h>
using namespace std;
void kvadr(double a,double b, double c)
{
double x1,x2,x3,d;
d=b*b-(4*a*c);
cout<< "D="<< d<< endl;
if (d>0)
{
cout<< "Two root x1, x2"<< endl;
d=sqrt(d);
x1=(-b+d)/(2*a);
cout<< "x1="<< x1<< endl;
x2=(-b-d)/(2*a);
cout<< "x2="<< x2<< endl;
}
else if(d==0)
{
cout<< " One root "<< endl;
x3=-b/(2*a);
cout<< "x1=x2="<< x3<< endl;
}
else
cout<< "No solution in the set of real numbers."<< endl;
}
int main()
{
double a,b,c;
do
{
cout<< "a=";
cin >>a;
if (a==0)
cout<< "This is not quadratic equatio. Try again ..\n";
} while (a==0);
cout<< "b=";
cin >>b;
cout<< "c=";
cin >>c;
kvadr(a,b,c);
return 0;
}

Обяснение :
Въвеждаме коефициентите на а, b, c, a не трябва да бъде равно на 0 (нула) ,
проверката се осъществява с редовете :
if (a==0)
cout<< "This is not quadratic equatio. Try again ..\n";
} while (a==0);
Изчисляваме дискриминантата по формулата D=b*b-4*a*c ; и я извеждаме
на екрана, за жсеки случай.
Ако дискриминантата е равна на D=0 уравнението има един корен
x1=x2=-b/(2*a);
Ако D<0 извеждаме на екрана "Not solution ..." - няма решение.
Ако D>0 уравнението има два корена: x1=(-b+sqrt(b*b-4*a*c))/(2*a);
       и
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
Изпробвайте а=1, b=2, c=1, трябва да получите един корен x1=x2=-1


Благодаря за вниманието Ви !