2. Која е разликата помеѓу функции и процедури? Кога се користи функција, а кога процедура.
3. Какви можат да бидат функциите
4. Напиши 3 програми со користење на математички функции
5. Која е разликата помеѓу прототип и дефиниција на функција? Од што се состои прототипот
6. Што се пишува во заглавието на функцијата?
7. Од што е составено телото на функцијата?
8. Дали имињата на параметрите мораат да бидат исти во прототипот, дефиницијата и повикот на функцијата ?
9. Ако не декларираме повратен тип на функцијата, тогаш се подразбита дека е од тип ?
10. Објасни за формални и вистински параметри ( пример)
11. Објасни ги повикувањето на функцијата по вредност и повикувањето на функцијата по референца!
12. Во кој случај се користи повикување на функцијата по референца?
Во секоја сложена програма може да се издвојат низа наредби кои чинат логичка целина и извршуваат одредена работа. Таквите издоени самостојни целини се нарекуваат потпрограми Задачата на потрограмите е да се подобри структурата на програмата .
Предности при користење на потпрограми
- пократок запис на програмата
- поедноставно одржување на програмата
- можност за користење претходно развиени функции
- се користат постоечки функции како градбени блокови за новите програми
- се одбегнува повторување на еден ист код на различни места на програмата
- заштеда на мемориски простор
Суштината на потпрограмите е во тоа што тие можат да се користат во различни програми, а и на повеќе места во иста програма . Тоа е овозможено со примена на т.н. формални (потпрограма) и вистински аргументи (програма).
Формалните (вистинските) аргументи можат да бидат влезни и излезни. Тие се ставаат во зграда по името на потпрограмата– листа на формални (вистински) аргументи.
Според бројот на излезни формални аргументи (параметри) постојат два вида потпрограми
- функциски
- процедурални
Излезниот параметар се нарекува излезен формален параметар, додека влезните параметри, кои можат да бидат и повеќе, се нарекуваат влезни формални параметри .
Влезните формални параметри се ставаат во заграда по името. За да одлучиме дали за една подзадача може да се напише функциски подалгоритам, потребно е да се одговори на следното прашање:
0 Дали потпрограмот за подзадачата има една излезна вредност?Ако одговорот на ова прашање е да, тогаш за подзачата може да се напише функциски потпрограм.
При пишување на функциски потпрограм за зададена подзадача, потребно е да се одговорат и прашањата:
1. Од кои аргументи директно зависи резултатот на подзадачата?
2. Од кој тип е излезниот резултат на подзадачата?
Одговорот на првото прашање ќе ни укаже на тоа: кои, колку и каков тип влезни формални аргументи ќе има во листата на формални аргументи.
Одговорот на второто прашање ќе го одреди типот на излезниот резултат од функцискиот подалгоритам.
Пример на задача каде решението не може да се добие со функциски подалгоритам:
Да се подредат три броја по големина. Одговорот на основното прашање (ред. бр. 0) е НЕ, затоа што во задачата се бара влезните податоци (трите броја) да бидат и излезни резултати, пак три броја, само подредени по големина. Затоа решението не можеме да го добиеме со функциски подалгоритам.
Потпрограмите кои имаат повеќе излезни аргументи се нарекуваат процедурални потпрограми или процедури .
Општа синтакса на еден функциски потпрограм:
тип име_потпрограма( влезни параметри/формални);
име_потпрограма(листа на вистински аргументи);
• ист редoслед на аргументи
• ист тип на аргументи.
За разлика од некои програмски јазици (на пр. Pascal) кои разликуваат процедури и функции, во C++ се користат само функции. Функциите претставуваат множества наредби кои се извршуваат при секој нивен повик.
Повик на одредена функција претставува наредба до процесорот за запирање на тековното извршување на наредби, запишување на моментната локација во програмата и повикување на соодветната функција. По завршување на повиканата функција, програмата продолжува со извршување од местото од каде е функцијата повикана.
Можно е:
- Standard Library Functions: Predefined in C++ да се користат веќе постоечки функции кои се подготвени за користење и зачувани во библиотеки ( вградени функции)
Голем број на математички операции и трансформации се веќе имплементирани во програмскиот јазик C++ - во вид на функции кои може да се повикуваат
За да може да ги користиме овие функции, потребно е вклучување на соодветната датотека од библиотеката на C++ која ги содржи нивните дефиниции
(користење на директивата #include <cmath> )
Основни математички функции – библиотека cmath
#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);
Функциите се создаваат надвор од главната ( main ) функција. Во main функцијата се повикуваат. Може да се сместат пред или после main функцијата.
Ако функцијата се дефинира пред главната ( main) функција тогаш таа е подготвена за користење.
Доколку функцијата ја дефинираме после маин функцијата тогаш истата мора да се декларира - мора да се користи прототип на функцијата (тоа е првиот ред од функцијата/header кој содржи: тип на податок кој ја враќа функцијата, име на функцијата и листа на параметри).
Кога компалјерот во програмскиот код наиде на име на функција која е дефинирана после маин , тој знае согласно прототипот дека функцијата постои, ја бара и извршува.
Видови на функции
Во С++ постојат 2 вида на функции:
- Функции кои враќаат вредност
- Функции кои не враќаат вредност (void)
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 );
Кога се декларира некоја функција, треба да се одговори на следниве прашања:
- · колку параметри (влезни податоци) има функцијата,
- · од кој тип се тие податоци и
- · каков тип ќе има резултатот (повратната вредност).
Пример:
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;
}
Example
int main() {
myFunction();
return 0;
}
void myFunction() {
cout << "I just got executed!";
}
// Error
Функциите се повикуваат со наведување на нивните аргументи – вредности кои им се потребни за да ја извршат својата задача.
Аргумент на функција претставува вредност (константа, променлива или израз) со која се повикува одредена функција. Функцијата може, но не мора да има аргументи
Параметар претставува променлива наведена во декларацијата и во заглавието на истата таа функција која ја прифаќа вредноста на аргументот.
Значи вредностите на аргументите во функцијата се предаваат преку нејзините параметри.
Објасни !
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 исти
Предавање аргументи по вредност
При повикување функција, аргументите во функцијата стандардно се предаваат по вредност – ваков начин на повикување се нарекува повикување по вредност.
Бидејќи параметрите на функцијата претставуваат локални променливи (се креираат со повикување на функцијата и ги снемува кога ќе се изврши наредбата 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 начин на пренос на параметри
· во параметарот се копира адресата, а не вредноста на аргументот / локалните параметри на функцијата се референци (покажуваат) на мемориската локација на оригиналните (вистинските ) параметри кои се пренесуваат /
· промените на параметарот , го менуваат и аргументот / измените на овие променливи во функцијата влијаат, ги менуваат вистинските параметри
· не се прави копија на променливите, но памети каде и кога е складиран податокот така што се заштедува на време и простор.
#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>
// prototip na Функција за замена на вредностите на две променливи
{ int a,b;
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:
Post a Comment