Функции

1. Што се потпрограми,која е нивната задача?
2. Која е разликата помеѓу функции и процедури? Кога се користи функција, а кога процедура.
3. Какви можат да бидат функциите
4. Напиши 3 програми со користење на математички функции
5. Која е разликата помеѓу прототип и дефиниција на функција? Од што се состои прототипот
6. Што се пишува во заглавието на функцијата?
7. Од што е составено телото на функцијата?
8. Дали имињата на параметрите мораат да бидат исти во прототипот, дефиницијата и повикот на функцијата ?
9. Ако не декларираме повратен тип на функцијата, тогаш се подразбита дека е од тип ?
10. Објасни за формални и вистински параметри ( пример)
11. Објасни ги повикувањето на функцијата по вредност и повикувањето на функцијата по референца!
12. Во кој случај се користи повикување на функцијата по референца?

Во секоја сложена програма може да се издвојат низа наредби кои чинат логичка целина и извршуваат одредена работа. Таквите издоени самостојни целини се  нарекуваат потпрограми Задачата на потрограмите е да се подобри структурата на програмата .


Предности при користење на потпрограми
  • пократок запис на програмата
  • поедноставно одржување на програмата
  • можност за користење претходно развиени функции
  • се користат постоечки функции како градбени блокови за новите програми
  • се одбегнува повторување на еден ист код на различни места на програмата
  • заштеда на мемориски простор

Суштината на потпрограмите е во тоа што тие можат да се користат во различни програми, а и на повеќе места во иста програма . Тоа е овозможено со примена на т.н. формални (потпрограма) и вистински аргументи (програма).
Формалните (вистинските) аргументи можат да бидат влезни и излезни. Тие се ставаат во зграда по името на потпрограмата– листа на формални (вистински) аргументи.

Според бројот на излезни формални аргументи (параметри) постојат два вида потпрограми

  • функциски
  • процедурални

Функциските потпрограми, наречени функции (анг. function), имаат само еден излезен формален аргумент, а можат да имат еден или повеќе влезни аргументи.

Излезниот параметар се нарекува излезен формален параметар, додека влезните параметри, кои можат да бидат и повеќе, се нарекуваат влезни формални параметри .
Влезните формални параметри се ставаат во заграда по името. За да одлучиме дали за една подзадача може да се напише функциски подалгоритам, потребно е да се одговори на следното прашање:
0      Дали потпрограмот за подзадачата има една излезна вредност?

Ако одговорот на ова прашање е да, тогаш за подзачата може да се напише функциски потпрограм.
При пишување на функциски потпрограм за зададена подзадача, потребно е да се одговорат и прашањата:

    1.  Од кои аргументи директно зависи резултатот на подзадачата?

    2. Од кој тип е излезниот резултат на подзадачата?

Одговорот на првото прашање ќе ни укаже на тоа: кои, колку и каков тип влезни формални аргументи ќе има во листата на формални аргументи.

Одговорот на второто прашање ќе го одреди типот на излезниот резултат од функцискиот подалгоритам.

Пример на задача каде решението не може да се добие со функциски подалгоритам: 

Да се подредат три броја по големина. Одговорот на основното прашање (ред. бр. 0) е НЕ, затоа што во задачата се бара влезните податоци (трите броја) да бидат и излезни резултати, пак три броја, само подредени по големина. Затоа решението не можеме да го добиеме со функциски подалгоритам. 

Потпрограмите кои имаат повеќе излезни аргументи се нарекуваат процедурални потпрограми или процедури .

Општа синтакса на еден функциски потпрограм:


тип  име_потпрограма( влезни параметри/формални);
повикување на потпрограм 
променлива = име_потпрограма(листа на вистински аргументи); или 
име_потпрограма(листа на вистински аргументи);

Листата на вистински аргументи, во однос на листата формални аргументи, мора да биде со:
• ист број на аргументи
• ист редoслед на аргументи
• ист тип на аргументи.

Кај сите програми кои ги разгледавме досега, наредбите ги пишувавме во една функција - main(). Тоа е основниот дел кој го содржат сите програми - main() e првата функција која се повикува при стартот на програма напишана во C++. Затоа функцијата mаin се нарекува и влезна точка. Ако нема функција main, преведувачот јавува грешка.

За разлика од некои програмски јазици (на пр. Pascal) кои разликуваат процедури и функции, во C++ се користат само функции. Функциите претставуваат множества наредби кои се извршуваат при секој нивен повик.

Повик на одредена функција претставува наредба до процесорот за запирање на тековното извршување на наредби, запишување на моментната локација во програмата и повикување на соодветната функција. По завршување на повиканата функција, програмата продолжува со извршување од местото од каде е функцијата повикана.

 Можно е:

- User-defined Function: Created by users да се напишат сопствени функции па тие да се користат во програма (кориснички функции) или
Standard Library Functions: Predefined in C++ да се користат веќе постоечки функции кои се подготвени за користење и зачувани во библиотеки ( вградени функции

Голем број на математички операции и трансформации се веќе имплементирани во програмскиот јазик C++ - во вид на функции кои  може да се повикуваат

За да може да ги користиме овие функции, потребно е вклучување на соодветната датотека од библиотеката на C++ која ги содржи нивните дефиниции 

 (користење на директивата    #include <cmath> )

Основни математички функции – библиотека cmath


 #include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x = 3.0, y = 2.7;
cout << pow(2.0, 3.0) << endl; //pechati '8'
cout << sqrt(4) << endl; //pechati '2'
cout << fabs(-7.123) << endl; //pechati '7.123'
cout << log(x) << endl; //pechati '1.09861'
cout << log10(x) << endl; //pechati '0.477121'
cout << floor(y) << endl; //pechati '2'
cout << ceil(y) << endl; //pechati '3'
return 0;
}

 Задача: Да се пресмета y= x3,зa  x=2, x=3

 





      Exercise:

Use the correct function to print the highest value of x and y.

int x = 5;
int y = 10;
cout << (x, y);

Start the Exercise

Функциите се создаваат надвор од главната ( main ) функција. Во  main функцијата се повикуваат. Може да се сместат пред или после main функцијата.

Ако функцијата се дефинира пред главната ( main) функција тогаш таа е подготвена за користење.

Доколку функцијата ја дефинираме после  маин функцијата тогаш истата мора да се декларира - мора да се користи прототип на функцијата (тоа е првиот ред од функцијата/header  кој содржи:  тип на податок кој ја враќа функцијата, име на функцијата и листа на параметри).

Кога компалјерот  во програмскиот код наиде на име на функција која е дефинирана после маин , тој знае согласно прототипот дека функцијата постои, ја бара и извршува.  

Видови на функции

Во С++ постојат 2 вида на функции:

  • Функции кои враќаат вредност
  • Функции кои не враќаат вредност (void)
Секоја функција има свое име и тело претставено во загради { }. Функциите кои не враќаат вредост мора да започнат со клучниот збор void, додека функциите кои враќаат некоја вредност мора да имаат return statement која враќа вредност при повикување на функцијата. Секоја функција може да прима еден или повеќе аргументи или да не прима ниеден.


Function Declaration and Definition


A C++ function consist of two parts:

  • Declaration: the function's name, return type, and parameters (if any)
  • Definition: the body of the function (code to be executed)

  • Декларирање на функција

 Општ облик на декларирање на функција

tip    ime_na_funkcijata ( lista na parametri);      // прототип   ( Прототипот завршува со  ;  )

·       tip – каква вредност враќа функцијата како резултат (int, float,  char, bool)  (типот на податокот што функцијата го враќа (повратна вредност) го определува типот на функцијата.)

·       ime – име на функцијата (го бира корисникот и треба да  асоцира на тоа за што е наменета функцијата)

·       tip_parametri – (int, float …)

Прототипот на функцијата ја декларира истата пред нејзината дефиниција . Врз оснoва на прототипот компајлерот знае кој е повратниот тип на функцијата, колку аргументи има и кој тип се .


Единствена функција која не бара прототип е функцијата main (), истата е вградена во јазикот

Пример :

float  volumen_na_kvadrat  (float a, float b, float c ); 

Кога се декларира некоја функција, треба да се одговори на следниве прашања:

  • ·       колку параметри (влезни податоци) има функцијата,
  • ·       од кој тип се тие податоци и
  • ·       каков тип ќе има резултатот (повратната вредност).
Three ways exist to declare a function: 
• Write your prototype into a file, and then use the #include directive to include it in your program.
• Write the prototype into the file in which your function is used. 
• Define the function before it is called by any other function. When you do this, the definition acts as its own prototype.

Пример:

float koren(float x) ; − реална функција со реален аргумент

int pomal(int, int)  ;  − целобројна функција без имиња на аргументити

int g()  ;                     − целобројна функција без аргументи

int f(int a, b);            − неправилно ,  треба int f(int a, int b)

long plostina (long a, long b);  − тип на резултатот long

void pecati(int broj) ; − тип на резултатот void


 Дефинирање на функцијата

Секоја функција се состои од  низа наредби кои одредуваат што и како функцијата работи. Оваа низа се нарекува тело на функцијата. Телото започнува со { , a завршува со }Секоја наредба завршува со ;  Во еден ред можат да се запишат и повеќе наредби раздвоени со знакот ;

Функцијата завршува со return по што се запишува податокот кој функцијата го враќа како резултат од работата.

Пример:

Funkcija volumen_na_kvadrat

    float volumen_na_kvadrat (float a, float b, float c )

     {

           float v;

            v=a*b*c;

return v;

     }

-  дефиницијата на функцијата мора да е во  соглаcност со  нејзиниот прототип 

 ако функцијата има параметри  тие  мора да имаат     име
-  параметрите се одвојуваат со запирка
-  ако функцијата враќа вредност се користи клучниот збор return
-  ако функцијата не враќа вредност таа  се  декларира како void

Повикување на функцијата

Функцијата се извршува така што се повикува во главната програма . Се наведува нејзиното име и аргументите запишани по истиот редослед како при декларирањето.

Ime _na_funkcija (листа на аргументи )

 Пример:

Повикување на функцијата volumen_na_kvadrat

vol = volumen_na_kvadrat (x,y,z) 

Пример :

#include <iostream>
using namespace std;
int max(int a, int b); //prototip (so iminja na parametri)
int min(int , int); //prototip (bez iminja na parametri)
int main()
{
cout << max(3, 4) << endl; //pechati '4'
cout << min(2, 1) << endl; //pechati '1'
return 0;
}
//definicija na max(int a, int b)
int max(int a, int b)
{
if (a > b)
return a;
return b;
}
//definicija na min(int a, int b)
int min(int a, int b)
{
if (a < b)
return a;
return b;
}

Вежба:

Креирај функција со име  myFunction и повикај ја во главната ф-ја main().

void () {
  cout << "I just got executed!";
}

int main() {  
  ;
  return 0;
}


Start the Exercise

Example

int main() {
  myFunction();
  return 0;
}
void myFunction() {
  cout << "I just got executed!";
}
// Error
Try it Yourself »
Предавање на вредностите во функцијата. Аргументи и параметри

Функциите се повикуваат со наведување на нивните аргументи – вредности кои им се потребни за да ја извршат својата задача.

Аргумент на функција претставува вредност (константа, променлива или израз) со која се повикува одредена функција. Функцијата може, но не мора да има аргументи

Параметар претставува променлива наведена во декларацијата и во заглавието на истата таа функција која ја прифаќа вредноста на аргументот.

Значи вредностите на аргументите во функцијата се предаваат преку нејзините параметри.




Објасни !  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
int f1(int a, int b, int c)
{
a = a+1;
b = b-1;
c = c + (a*b);
return c;
}
int main()
{
int a=3, b=2, c=5;
cout << f1(1, 1, 1) << endl; //pechati '1'
cout << f1(a, 2, 0) << endl; //pechati '4'
cout << f1(a, b, c) << endl; //pechati '9'
//vrednostite na a, b i c se nepromeneti
cout << a << " " << b << " " << c << endl; //pechati '3 2 5'
return 0;
}

#include <iostream>
using namespace std;
int soberi(int a, int b)
{
cout << "2 ";
int r = (a+b);
return r;
}
//(x+x)*(y+y)
int mnozenje(int x, int y)
{
cout << "4 ";
int p = soberi(x, x);
int v = soberi(y, y);
return (p*v);
}
void ispechatiKraj()
{
cout << "Kraj na programata." << endl;
}
int main()
{
int a=4, b=4;
cout << "1 ";
int rezultat1 = soberi(3, 5);
cout << "3 ";
//presmetaj (a+a)*(b+b) + 1
int rezultat2 = mnozenje(a, b) + 1;
cout << "5 " << endl;
//dosega, izlezot od programata e '1 2 3 4 2 2 5'
cout << rezultat1 << endl; //pechati '8'
cout << rezultat2 << endl; //pechati '65'
cout << soberi(3, soberi(1, 2) + 1) << endl; //pechati '2 2 7'
//ispechati 'Kraj na programata.'
ispechatiKraj();
return 0;
}

Напишете програма која ќе го пресметува збирот на два дадени броја. Ако двете вредности се исти, тогаш вратете го нивниот троен збир.
Примерок за внесување
1, 2
3, 2
2, 2
Излезен примерок:
3
5
12 исти
#include <iostream>
using namespace std;
int test(int x, int y)
        {  int a,b;
            if (x == y) 
           return ((x + y)*3) ;
            else 
             return (x + y);
        }
        
int main() 
 {
  cout << test(1, 2) << endl;  
  cout << test(3, 2) << endl;  
  cout << test(2, 2) << endl;  
  return 0;    
}

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

Предавање аргументи по вредност

При повикување функција, аргументите во функцијата стандардно се предаваат по вредност – ваков начин на повикување се нарекува повикување по вредност

Бидејќи параметрите на функцијата претставуваат локални променливи (се креираат со повикување на функцијата и ги снемува кога ќе се изврши наредбата return), промените кои се прават врз параметрите не влијаат на промена на аргументите

Ова значи дека не постои начин на кој функцијата може да ги промени вредностите на аргументите. 

Така, на пр. не е можно да се направи функција за замена на два броја со повикување по вредност. Променливите ќе се заменат во функцијата, а во главната програма ќе останат исти. 


void swap(int x, int y)
{
   int temp;
   temp = x; /* save the value of x */
   x = y; /* put y into x */
   y = temp; /* put x into y */
}

Предавање аргументи по референца

Во ваквите случаи се користи повикување по референца – во функцијата се пренесува адресата на променливата, а не нејзината вредност. На тој начин, со промена на вредноста на параметрите, директно се менуваат и вредностите на аргументите. 

Кога е потребно аргументите да се предадат по референца, во заглавието на функцијата, пред имињата на параметрите се става знакот & (ampersand). 

Пример :    int   &a       или   int&  a 

Разлика

1. пренос по вредност: (pass-by-value)

·       вредноста на аргументот се копира во параметарот на функцијата /  локалните параметри на функцијата се копии на оригиналните (вистинските ) параметри кои се пренесуваат /

·       измените на параметрите немаат никаков ефект на аргументите кои се користат за повикување на функцијата  / локалните променливи не ги менуваат вистинските параметри /

·       повикување по вредност е default  начин на пренос на параметри

 2. пренос по референца  ( pass-by-reference)

 ·       во параметарот се копира адресата, а не вредноста на аргументот / локалните параметри на функцијата се референци (покажуваат) на мемориската локација на оригиналните (вистинските ) параметри кои се пренесуваат /

·       промените на параметарот , го менуваат и аргументот  / измените на овие променливи во функцијата влијаат, ги менуваат вистинските параметри

·       не се прави копија на променливите, но памети каде и кога е складиран податокот така што се заштедува на време и простор.


#include <iostream>
using namespace std;
void reshi(int x, int y, int &sob, int &odz, int &mnoz)
{
sob = x+y;
odz = x-y;
mnoz = x*y;
}
int main()
{
int a = 30, b = 4;
int s, o, m;
reshi(a, b, s, o, m);
cout << s << " " << o << " " << m << endl; //pechati '34 26 120'
return 0;
}

 ППример: Функција за замена на вредностите на две променливи

# include < iostream>

using namespace std;

 // prototip na Функција за замена на вредностите на две променливи

void zameni(int &x, int&y);

 int main()

{ int a,b;

cout<<"vnesi dva broja"<< endl;
cin>>a>>b;

zameni(a, b);

cout<<"novite vredvosti se "<<a<<" "<< b;
return 0; }

void zameni(int& x, int& y) // x i y se parametri
 { int t;
   t=x; // vrednosta na x se stava vo privremena promenliva t
   x=y; // vrednosta na y se stava vo promenlivata x
  y=t; // vrednosta na t se stava vo promenlivata y
}

No comments: