You are on page 1of 29

Правила за делокруг.

Функции без параметри и функции со повеќе параметри

ВОВЕД (10 мин)

Потсетување за аргумент и параметар , локални и глобални


променливи.

Функции се повикуваат со наведување на нивните аргументи - вредности кои им се


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

Параметрите на одредена функција може да се користат само локално - во блокот со кој


е ограничена функцијата и се викаат локални променливи. Додека ако една или повеќе
променливи се декларирани во главната функција main() тие има делокруг на целата
програма заедно со сите функции кои се повикуваат во неа и затоа се викаат глобални
променливи.

Прашања:

1. Во програмскиот јазик С++, како 2. Од кој тип е локалната променлива на


се нарекува променливата која е функцијата pv, а од кој тип е повратната
позната само во функцијата во вредност во следниот програмски код?
која е дефинирана? int pv(double a)
{
float b;
b=2*a;
return b;
}
3. Определи кој е резултатот од 4. Определи кој е резултатот од
извршувањето на следниот извршувањето на следниот програмски
програмски сегмент во сегмент во програмскиот јазик С++.
програмскиот јазик С++. float a, b, c;
float a, b; b = 3.456;
b = 3; a = floor(b);
a = pow(b,3); c = ceil(b);
cout << a; cout << “a=”<<a<<”c=”<<c<<endl;

ГЛАВЕН ДЕЛ (20 мин)

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


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

1. Што ќе се прикаже на екранот по 2. Каков вид параметри се а и b во


извршување на следниот програмски слeдниот програмски сегмент во
код? програмскиот јазик С++ и што е

1
#include <iostream> резултатат од програмата?
using namespace std;
void mojaFunkcija(); #include <iostream>
int main() using namespace std;
{ int max(int a,int b)
cout<<”Vo funkcijata main”<< endl; {
mojafunkcija(); int m;
cout<< “povtorno vo main”<<endl; if (a>b)
return 0; m=a;
} else
void mojaFunkcija() m=b;
{ return m;
cout<<”Vo funcijata }
mojaFunkcija”<<endl; int main ()
} {
int x,y;
cin>>x>>y;
cout<<max(x,y);
}

3. Што ќе се прикаже по извршување на 4. Петар дефинирал функција на следниот


следниот програмски код во начин. Напиши ја математички
програмскиот јазик С++? функцијата! Напиши ја целата програма
Колку формални параметри има на компјутер! Што ќе се прикаже на
функцијата f, и каква вредност враќа? екранот кога Петар ќе ја повика
Напиши ја целата програма на функцијата со наредбата f(5)? Каква
компјутер! вредност враќа функцијата f?

#include <iostream> int f (int x)


void f(int a) {
{ if (x%2)
a++; return x+1;
cout<<a<<”,”; else
} return x-1;
int main() }
{
int a=4;
f(a);
cout<<a*2;
return 0;
}

5. Кои се локални променливи, а кои се 6. Што ќе се отпечати со следниот


глобални променливи во програмата? програмски сегмент ако x и y се
Која вредност ќе ја врати реални променливи во програмскиот
подфункцијата на главната функција јазик С++? Напиши ја целата
при нејзиното повикување? Што ќе се програма на компјутер!
отпечати на екран како резултат? x = 2.7; y = 2.3;
Напиши ја целата програма на x = 2 * y;
компјутер! if (floor(x) < round(y))
cout<< x;
int funkcija (int x, int y) else
{ if (round(x) > 3 * floor(y))

2
x = x + y; cout<< y;
return x - y; else
} cout<< floor(y)+round(x);

int main ()
{
int x = 2, y = 3;
cout<<x-funkcija (x, y);
return 0;
}

Завршен дел(Рефлексија) (5 мин)

Што се декларира со следниот изказ во програмскиот јазик С++?

double Cena( int x );

Се декларира функција со име , чија локална променлива се вика


која прима вредност на аргумент од тип
, и враќа вредност од тип .

Домашна работа: (5 мин)

1.Што ќе се прикаже на екранот како 2.Што ќе се прикаже на екранот како


резултат од извршувањето на следниот резултат од извршувањето на следниот
програмски сегмент во програмскиот јазик програмски сегмент? Какви променливи се
С++? Дали функцијата има параметар и а и b?
дали враќа вредност? #include<iostream>
#include <iostream> #include<cmath>
using namespace std; using namespace std;
void pari() int main()
{ {
cout<<"valuta"; float a,b;
} a= 5.8;
int main() b= 5.3;
{ if (floor (a) == round (b))
pari (); cout <<"a="<<ceil(++a);
return 0; else cout <<"b="<< floor (--b);
} return 0;
}

3
Потсетување за примена на функции, функции од математичка
библиотека, .
. функции со различен број на параметри.
ВОВЕД

Прашања:

Прашање Одговор ученик


1. Каква вредност враќа функција које е од Не враќа
типот void во програмскиот јазик С++? вредност
воопшто.
2. Кој е минималниот број на функции кои треба 1
да ги има една програма во програмскиот
јазик С++?
3. Која функција во програмскиот јазик С++ НЕ Функцијата
може да има дефиниран параметар? main()

4. По кој редослед се доделува вредноста на Од десно кон


параметарот во програмскиот јазик С++? лево.

5. Во програмскиот јазик С++, како се нарекува Локална


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

6. Како изгледа математички израз кој во C++ има


форма
x = pow (sqrt (a) – sqrt (b),2) /( a * b)?
7. Даден е математичкиот израз: z = x2 - y2. z = pow (x,2) –
Каква форма ќе има овој израз запишан во pow (y,2);
програмскиот јазик C++?

8. Што се декларира со следниот изказ во Се декларира


програмскиот јазик С++? функција со име
double Cena( int x ); Cena која добива
целоброен
аргумент x и
враќа
променлива од
типот double.
9. Која од наведените декларации на функција со А. bool broj (int
име broj, за цел број x враќа вредност 1 (точно) x);
или 0 (неточно) во програмскиот јазик С++?
А. bool broj (int x);
Б. int broj (int x);
В. float broj (int x);
Г. real broj (int x);
10.Што од наведеното е точно декларирана Б. double
функција во програмскиот јазик С++? funct(char x)
А. int funct(char x, y);
Б. double funct(char x)

4
В. void funct();
Г. char x();

ГЛАВЕН ДЕЛ

Задачи кои треба да се изработат на компјутер

11. Колкава вредност ќе има променливата x 0 Јас


по извршување на следната наредба? мин
x = (sqrt (25) <abs (-5) && sqrt(3) а
>sqrt(16)); Ди
мит
рие
вск
а
+
12. Која вредност ќе се прикаже со следниот 5 Бој
алгоритам ако n има вредност 25? ан
if (round(sqrt(n)) == sqrt (n)) III-3
cout<<sqrt(n); +
else
cout<<n;

13. Што ќе се отпечати со следниот 6


програмски код во програмскиот јазик
С++?
double a,b;
a= -3.7;
b=2.8;
cout<<floor(abs(a)+b);

14. Од кој тип е повратната вредност на целоброен


функцијата pv во следниот програмски
код?
int pv(double a)
{
float b;
b=2*a;
return b;
}

15. Што ќе се прикаже на екранот по извршување Vo funkcijata main


на следниот програмски код? Vo funcijata
#include <iostream> mojaFunkcija
using namespace std; povtorno vo main
void mojaFunkcija();
int main()
{
cout<<”Vo funkcijata main”<< endl;
mojafunkcija();
cout<< “povtorno vo main”<<endl;

5
return 0;
}
void mojaFunkcija()
{
cout<<”Vo funcijata mojaFunkcija”<<endl;

16. Определи кој е резултатот од извршување на 5500.263


следниот програмски код.
#include <iostream>
using namespace std;
void pecati(int i)
{
cout << i;
}
void pecati(double f)
{
cout << f;
}
int main(void)
{
pecati(5);
pecati(500.263);
return 0;
}

17. Определи кој е резултатот од извршувањето 27


на следниот програмски сегмент во
програмскиот јазик С++.
float a, b;
b = 3;
a = pow(b,3);
cout << a;

18. Определи кој е резултатот од извршувањето a=3 c=4


на следниот програмски сегмент во
програмскиот јазик С++.
float a, b, c;
b = 3.456;
a = floor(b);
c = ceil(b);
cout << “a=”<<a<<”c=”<<c<<endl;

19. Што ќе се прикаже по извршување на d=3 e=81 c=84


следниот програмски сегмент?

float a, b, c, d, e;
a= 9; b = 3;
d = sqrt (b*3);
e =pow(a,2);
c = d+e;
cout<<”d=”<<d<<endl;
cout<<”e=”<<e<<endl;

6
cout<<”c=”<<c;

20. Која вредност ќе се отпечати по извршување 8


на следните наредби ако целобројната
променлива n има вредност 64?
if (round(sqrt(n)) == sqrt(n))
cout<<sqrt(n);
else cout<<n;

21. Дефинирана е целобројна функција g со два 6


целобројни аргументи x и y.

int g (int x, int y)


{
int s;
y = y % 5;
s = 2 * x - y;
return (s);
}
Колкава ќе биде вредноста на целобројната
променлива t по извршување на следната
наредба?
t = g (4, g (15, 38));

22. Каков вид параметри се а и b во слeдниот Формални


програмски сегмент во програмскиот јазик параметри
С++?
#include <iostream>
using namespace std;
int max(int a,int b)
{
int m;
if (a>b)
m=a;
else
m=b;
return m;
}
int main ()
{
int x,y;
cin>>x>>y;
cout<<max(x,y);
}
23. Што ќе се прикаже по извршување на 5,8
следниот програмски код во програмскиот
јазик С++?
#include <iostream>
using namespace std;

7
void f(int a)
{
a++;
cout<<a<<”,”;
}
int main()
{
int a=4;
f(a);
cout<<a*2;
return 0;
}
24. Ана дефинирала функција на следниот 6
начин.

int f (int x)
{
if (x%2)
return x+1;
else
return x-1;
}
Што ќе се прикаже на екранот кога Ана ќе ја
повика функцијата со наредбата f(5)?

25. Што ќе се отпечати со следниот програмски 0


код во програмскиот јазик С++?
int funkcija (int x, int y)
{
x = x + y;
return x - y;
}
int main ()
{
int x = 2, y = 3;
cout<<x-funkcija (x, y);
return 0;
}
26. Која од наведените функции користи А. float g(int a1, int
предавање на аргументи само по вредност, a2, float a)
во програмскиот јазик С++?

А. float g(int a1, int a2, float a)


Б. int f1(int &t, int &u, int v)
В. void p(int j, int &f)
Г. char znak(int &y, char &b)

27. Кој програмски сегменти ќе ги пресмета int i;


квадратните корени на броевите од 1 до 10? for (i=1;i<10;i++)
cout << sqrt(i) <<
“\n”;
28. Што ќе се отпечати со следниот програмски 7
сегмент ако x и y се реални променливи во

8
програмскиот јазик С++?
x = 2.7; y = 2.3;
x = 2 * y;
if (floor(x) < round(y))
cout<< x;
else
if (round(x) > 3 * floor(y))
cout<< y;
else
cout<< floor(y)+round(x);
29. Што ќе се прикаже на екранот како резултат d=6.8, e=6
од извршување на следниот програмски
сегментво програмскиот јазик С++?
float a, b, d, e;
a= 3.4;
b= - 2;
d=abs(a*b);
e=floor(d);
cout<<”d=”<<d<<”, e=”<<e;
30. Што ќе се прикаже на екранот како резултат valuta
од извршувањето на следниот програмски
сегмент во програмскиот јазик С++?
#include <iostream>
using namespace std;
void pari()
{
cout<<"valuta";
}
int main()
{
pari ();
return 0;
}

Домашна работа

1. Која вредност ќе ја добие променливата x по извршување 10


на следниот програмски сегмент?
#include <iostream>
using namespace std;
void fun(int x, int y)
{
x = 20;
y = 10;
}
int main()
{
int x = 10;
fun(x, x);

9
cout << x;
return 0;
}
2. Кој е резултатот што се добива со извршување на следната 8
функција дефинирана во програмскиот јазик С++?
#include <iostream>
using namespace std;
int addition (int a, int b)
{
int r;
r=a+b;
return r;
}
int main ()
{
int z;
z = addition (5,3);
cout<<z;
}

3. Што ќе се прикаже на екранот како резултат од 7


извршувањето на следниот програмски сегмент?
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
float a,b;
a= 5.8;
b= 5.3;
if (floor (a) == round (b))
cout <<"a="<<ceil(++a);
else cout <<"b="<< floor (--b);
return 0;
}
4. Што ќе се прикаже на екранот како резултат од c=1
извршувањето на следниот програмски сегмент, ако n=11,
m=7
#include <iostream>
using namespace std;
void y2 (int n, int m)
{
int c;
if ( n >= m)
c = n%2;
else c =m*2;
cout <<"c="<< c <<endl;
}
int main()
{
int n,m;

10
cin>>n>>m;
y2(n,m);
return 0;
}

ФУНКЦИИ ОД МАТЕМАТИЧКА БИБЛИОТЕКА

ВОВЕД

Прашања:
1. Што претставуваат функциите? Функциите претставуваат множества наредби кои
се извршуваат при секој нивен повик.
2. Дали функцијата треба да се декларира? Да, задолжително треба да се
декларира.
3. Како се повикува функција и кој ја повикува? со нејзиното име и вредност за
параметарот во заграда.
4. На кого враќа вредност функцијата (потпрограмата)? На главната програма –
функцијата main()
5. Што се постигнува со користење на функции? Функциите овозможуваат делење
на програмата на помали парчиња - кои, соодветно, се поедноставни за
решавање. На овој начин, користејќи структурирано програмирање, ја намалуваме
сложеноста на проблемот кој сакаме да го решиме.
6. Која е разликата во изработка на програма со и без потпрпрограма?

ГЛАВЕН ДЕЛ
Библиотеки со потпрограми во C++

Потпрограмите кои се користат за решавање на стандардни проблеми, се напишани


најчесто од група програмери и усовршени се чуваат во посебни програмски
библиотеки.

Потпрограмите од библиотеките можат да се користат од секоја корисничка програма со


повикување преку името на потпрограмата. Претходно, програмата треба да биде
поврзана со програмската библиотека.

Со постоењето на програмските библиотеки се ослободуваат програмерите од


пишување на исти програми за проблеми со кои често се среќаваат.

На пример, во програмска библиотека cmath постојат потпрограми за:


наоѓање корени, степени, тригонометриски функции, заокружување на броеви и итн.

Потпрограмите што најчесто се користат при програмирањето, наречени стандардни


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

Во математиката се користат различни функции. Во програмскиот јазик C++ се


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

11
Таа гласи:

#include <cmath>

Некои функции кои се вклучени во математичката библиотека cmath и кои ние ќе ги


користиме во програми се:
fabs, sqrt, pow, ceil, floor, sin, cos и други.

Стандардни функции вградени во C++

Библиотека cmath

Голем број на математички операции и трансформации се веќе имплементирани во


програмскиот јазик C++ во вид на функции кои нашите програми може да ги повикуваат.
За да може да ги користиме овие функции, потребно е вклучување на соодветната
датотека од библиотеката на C++ која ги содржи нивните дефиниции (со користење на
директивата "#include <cmath>").

функција значење
sin(x) Синус од аголот X (претставен во радијани)
cos(x) Косинус од аголот X (претставен во радијани)
tan(x) Тангенс од аголот X (претставен во радијани)
asin(x) Инверзна операција од sin(x). Резултатот е вредност (агол) изразен во радијани.
acos(x) Инверзна операција од cos(x). Резултатот е вредност (агол) изразен во радијани.
atan(x) Инверзна операција од tan(x). Резултатот е вредност (агол) изразен во радијани.
Аркус тангенс од y/x. Резултатот е вредност (агол) изразен во радијани.
atan2(y, x)
Функцијата го користи знакот на двата аргументи (x и y) за одредување на квадрантот.
exp(x) Вредноста на изразот ex, каде e=2.718281828 (основа на природен логаритам)
log(x) Природен логаритам (со основа e) од x.
log10(x) Логаритам (со основа 10) од x.
pow(x, y) Вредноста на изразот xy (x на степен y).
sqrt(x) Квадратен корен од x.
ceil(x) Најмалиот цел број што не е помал од x - ceil(4.3) = 5
floor(x) Најголемиот цел број што не е поголем од x - floor(4.8) = 4
fabs(x) Апсолутна вредност од x

Примери со користење на функции од математичката библиотека cmath

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
cout<<"Funkcijata fabs vraka apsolutna vrednost od daden broj"<<endl;
int a=5;

12
cout<<"Apsolutna vrednost na brojot "<<a<<" e: "<<fabs(a)<<endl;
int b=-5;
cout<<"Apsolutna vrednost na brojot "<<b<<" e: "<<fabs(b)<<endl;
float c=3.5;
cout<<"Apsolutna vrednost na brojot "<<c<<" e: "<<fabs(c)<<endl;
float d=-3.5;
cout<<"Apsolutna vrednost na brojot "<<d<<" e: "<<fabs(d)<<endl;

system("pause");
return 0;
}

//Programa za naoganje na razlikite vo ocenite na ucenicite od eksternoto ocenuvanje so


upotreba na potprograma
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int i,n,ocenaprof, ocenaeksterno;
float razlika,s,prosek;
cout<<"Kolku ucenici se testirani?"<<endl;
cin>>n;
s=0;
for(i=1;i<=n;i++)
{
cout<<"Ocena od profesor za ucenik broj "<<i<<"=";
cin>>ocenaprof;
cout<<"Ocena od eksterno za ucenik broj "<<i<<"=";
cin>>ocenaeksterno;
razlika=fabs(ocenaprof-ocenaeksterno);
s=s+razlika;
cout<<"Razlika="<<razlika<<endl;
}
prosek=s/n;
cout<<"Prosekot od ocenite na profesorot e "<<prosek;
system("pause");
return 0;
}

Да се реши квадратната равенка : ax2+bx+c=0 без и со помош на функциска потпрограма.


Без потпрограма (функција) Со потпрограма (функција)

13
/*resavanje na kvadratna ravenka bez potprograma*/ /*resavanje na kvadratna ravenka so
potprograma*/
#include <iostream>
#include <cmath> #include <iostream>
using namespace std; #include <cmath>
int main() using namespace std;
{
void resenie(float a, float b, float c)
float a,b,c,d,x1,x2; {
cout<<"Vnesete gi parametrite na kvadratnata float d,x1,x2;
ravenka: a,b i c"<<endl; d=pow(b,2)-4*a*c;
cin>>a>>b>>c; if (d==0) cout<<"x1=0 , x2=0"<<endl;
d=pow(b,2)-4*a*c; else if (d<0) cout<<" Ravenkata nema realni
if (d==0) cout<<"x1=0 , x2=0"<<endl; koreni "<<endl;
else if (d<0) cout<<" Ravenkata nema realni koreni else
"<<endl; {
else x1=(-b-sqrt(d))/(2*a);
{ x2=(-b+sqrt(d))/(2*a);
x1=(-b-sqrt(d))/(2*a); cout<<"x1="<<x1<<endl;
x2=(-b+sqrt(d))/(2*a); cout<<"x2="<<x2<<endl;
cout<<"x1="<<x1<<" x2="<<x2<<endl; }
} }
system("pause"); int main()
return 0; {
} float a,b,c,d,x1,x2;
cout<<"Vnesete gi parametrite na
kvadratnata ravenka: a,b i c"<<endl;
cin>>a>>b>>c;
resenie(a,b,c);
system("pause");
return 0;
}

//Programa so koja se ilustriraat funkciite sin i cos

#include<iostream>
#include<cmath>
using namespace std;
const double Pi=3.14159265;
main()
{
float agol_vo_stepeni, agol_vo_radijani;
cout<<"Vnesete agol vo stepeni"<<endl;
cin>>agol_vo_stepeni;
agol_vo_radijani=(agol_vo_stepeni*Pi)/180;
cout<<"Sinus od vneseniot agol e:"<<endl;
cout<<"sin("<<agol_vo_stepeni<<")="<<sin(agol_vo_radijani)<<endl;
cout<<"Kosinus od vneseniot agol e:"<<endl;
cout<<"cos("<<agol_vo_stepeni<<")="<<cos(agol_vo_radijani)<<endl;

system("pause");
return 0;
}

14
//Programa so koja se ilustrira funkcijata ceil

#include<iostream>
#include<cmath>
using namespace std;
main()
{
cout<<"ceil od 2.0 e: "<<ceil(2.0)<<endl;
cout<<"ceil od 2.1 e: "<<ceil(2.1)<<endl;
cout<<"ceil od 2.2 e: "<<ceil(2.2)<<endl;
cout<<"ceil od 2.3 e: "<<ceil(2.3)<<endl;
cout<<"ceil od 2.4 e: "<<ceil(2.4)<<endl;
cout<<"ceil od 2.5 e: "<<ceil(2.5)<<endl;
cout<<"ceil od 2.6 e: "<<ceil(2.6)<<endl;
cout<<"ceil od 2.7 e: "<<ceil(2.7)<<endl;
cout<<"ceil od 2.8 e: "<<ceil(2.8)<<endl;
cout<<"ceil od 2.9 e: "<<ceil(2.9)<<endl;

cout<<"ceil od -2.0 e: "<<ceil(-2.0)<<endl;


cout<<"ceil od -2.1 e: "<<ceil(-2.1)<<endl;
cout<<"ceil od -2.2 e: "<<ceil(-2.2)<<endl;
cout<<"ceil od -2.3 e: "<<ceil(-2.3)<<endl;
cout<<"ceil od -2.4 e: "<<ceil(-2.4)<<endl;
cout<<"ceil od -2.5 e: "<<ceil(-2.5)<<endl;
cout<<"ceil od -2.6 e: "<<ceil(-2.6)<<endl;
cout<<"ceil od -2.7 e: "<<ceil(-2.7)<<endl;
cout<<"ceil od -2.8 e: "<<ceil(-2.8)<<endl;
cout<<"ceil od -2.9 e: "<<ceil(-2.9)<<endl;

system("pause");
return 0;
}

//Programa so koja se ilustrira funkcijata floor

#include<iostream>
#include<cmath>
using namespace std;
main()
{
cout<<"floor od 2.0 e: "<<floor(2.0)<<endl;
cout<<"floor od 2.1 e: "<<floor(2.1)<<endl;
cout<<"floor od 2.2 e: "<<floor(2.2)<<endl;
cout<<"floor od 2.3 e: "<<floor(2.3)<<endl;
cout<<"floor od 2.4 e: "<<floor(2.4)<<endl;
cout<<"floor od 2.5 e: "<<floor(2.5)<<endl;
cout<<"floor od 2.6 e: "<<floor(2.6)<<endl;
cout<<"floor od 2.7 e: "<<floor(2.7)<<endl;
cout<<"floor od 2.8 e: "<<floor(2.8)<<endl;
cout<<"floor od 2.9 e: "<<floor(2.9)<<endl;

cout<<"floor od -2.0 e: "<<floor(-2.0)<<endl;


cout<<"floor od -2.1 e: "<<floor(-2.1)<<endl;

15
cout<<"floor od -2.2 e: "<<floor(-2.2)<<endl;
cout<<"floor od -2.3 e: "<<floor(-2.3)<<endl;
cout<<"floor od -2.4 e: "<<floor(-2.4)<<endl;
cout<<"floor od -2.5 e: "<<floor(-2.5)<<endl;
cout<<"floor od -2.6 e: "<<floor(-2.6)<<endl;
cout<<"floor od -2.7 e: "<<floor(-2.7)<<endl;
cout<<"floor od -2.8 e: "<<floor(-2.8)<<endl;
cout<<"floor od -2.9 e: "<<floor(-2.9)<<endl;

system("pause");
return 0;
}

Домашна работа

Да се разгледаат примерите од веб порталот


https://sites.google.com/site/informatikaiprogramiranje/programirane/11

Референци и референцни параметри

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

Стандардно, аргументите во C++ се предаваат по вредност. Ова значи дека, кога се


прави повик до одредена функција, во позадина се прави копија од аргументите и
таквите копии се користат како параметри на функцијата. Бидејќи се прави копија од
аргументите, не постои начин на кој функцијата може да ги промени нивните вредности.
Или, кажано поинаку, промените на параметрите немаат никаков ефект врз аргументите.

Пример 1:

16
#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()
{ //vrednostite
int a=3, b=2, c=5; na a, b i c se
cout << f1(1, 1, 1) << endl; //pechati nepromeneti
'1'
cout << f1(a, 2, 0) << endl; //pechati '4'
cout << f1(a, b, c) << endl; //pechati '9'
cout << a << " " << b << " " << c << endl;
//pechati '3 2 5'
return 0;
}
На пример, при последниот повик на функцијата f1(int a, int b, int c), се прават копии од
вредностите на аргументите (a=3, b=2, c=5). Притоа, промените на вредностите на
параметрите немаат никакво влијание на аргументите предадени на функцијата при
нејзиниот повик - променливите a, b и c од функцијата main().
Иако функциите може да испратат вредност до оној што ги повикал (на пример, двете
функции во програмата дадена погоре, со return наредби, враќаат вредност од тип int),
постојат и ситуации кога таквото комуницирање со функциите не е доволно. На пример,
понекогаш сакаме функциите да променат повеќе вредности или пак директно да
изменат вредност на одредена променлива.
Во C++, најдобриот начин на кој може да им се дозволи на функциите да ги променат
вредностите на аргументите е доколку таквите аргументи ги предадеме по референца.
За да го овозможиме тоа, единствено нешто што треба да направиме е да означиме
дека параметрите претставуваат референци до аргументите, а не нивни копии. Во C++,
тоа се прави со запишување на знакот & пред името на соодветниот параметар.”

Пример 2.1:

#include <iostream> Што ќе Какви Што


using namespace std; биде докази навистина ќе
int f1(int t, int u, int v) резултат имате за биде
{ од тоа? резултатот?
t = t+1; дадената
u = u-1; програма?
v = v + (t*u);
return v; 9
}
int main() 3 2 5 2 5'
{
int a=3, b=2, c=5;
cout << f1(a, b, c) << endl;
cout << a << " " << b << " " << c << endl;
return 0;
}

17
Пример 2.2:

#include <iostream> Што ќе Какви Што


using namespace std; биде докази навистина ќе
int f1(int &t, int u, int v) резултат имате за биде
{ од тоа? резултатот?
t = t+1; дадената
u = u-1; програма?
v = v + (t*u);
return v; 9
}
int main() 4 2 5 2 5'
{
int a=3, b=2, c=5;
cout << f1(a, b, c) << endl;
cout << a << " " << b << " " << c << endl;
return 0;
}

Пример 2.3:

#include <iostream> Што ќе Какви Што


using namespace std; биде докази навистина ќе
int f1(int &t, int &u, int v) резултат имате за биде
{ од тоа? резултатот?
t = t+1; дадената
u = u-1; програма?
v = v + (t*u);
return v; 9
}
int main() 4 1 5 2 5'
{
int a=3, b=2, c=5;
cout << f1(a, b, c) << endl;
cout << a << " " << b << " " << c << endl;
return 0;
}

Пример 2.4:

#include <iostream> Што ќе Какви Што


using namespace std; биде докази навистина ќе
int f1(int &t, int &u, int &v) резултат имате за биде
{ од тоа? резултатот?
t = t+1; дадената
u = u-1; програма?
v = v + (t*u);
return v;
}
int main()
{
int a=3, b=2, c=5;

18
cout << f1(a, b, c) << endl;
cout << a << " " << b << " " << c << endl; 9
return 0;
} 4 1 9 2 5'

Во програмата дадена погоре, параметарот t во функцијата f1(int &t, int &u, int &v)
претставува референца до променливата a дефинирана во функцијата main().
Останатите два аргументи се пренесуваат по вредност (се прави нивна копија), и
промените над соодветните параметри немаат никаков ефект врз аргументите со кои се
повикува функцијата.

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


Имињата на параметрите и аргументите не мора да се совпаѓаат - како што може да се
забележи и од програмата дадена претходно. Во позадина, референците најчесто се
имплементираат (од страна на компајлерите) со помош на покажувачи.
На овој начин, параметрите веќе не претставуваат обични променливи, туку
"референци" до истата мемориска локација до која што покажуваат променливите кои се
предадени како аргументи на функцијата.
Следната програма прикажува како една функција може да промени вредности на
повеќе променливи:

Покрај тоа што се овозможува промена на аргументите и враќање на повеќе вредности,


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

Но, што доколку сакаме на функцијата да и предадеме голема структура на податоци, но


не сакаме функцијата да може да ги промени вредностите кои се чуваат во структурата.
Во тој случај, најдобро решение е аргументите да ги предадеме по т.н. константна
референца (референца која не дозволува промена на вредноста на аргументот).
Во C++, тоа се прави така што, во декларацијата на функцијата, се додава клучниот
збор const – или пред името или пред типот на параметарот. Нормално, бидејќи се
работи за референци, задолжително е наведување и на знакот '&'.

Пример 4:
int f1(int const &x, int const &y)
{
Што ќе Какви Што
x = x+1; //greshka, nedozvoleno
биде докази навистина
y = y*3; //greshka, nedozvoleno
резултат имате за ќе биде
return x+y;
од тоа? резултатот?
}
дадената
int f2(const int &x, const int &y)
програма?
{
x = x+1; //greshka, nedozvoleno
y = y*3; //greshka, nedozvoleno
return x*y;
}
int main()

19
{
int a = 30, b = 4;
cout << f1(a, b) << endl;
cout << f2(a, b) << endl;
system("pause");
return 0;
}

Во програмата дадена погоре, промената на кој било од параметрите ќе предизвика


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

Вежби за самостојна работа:


Задача 1:
#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() //pechati '34
{ 26 120'
int a = 30, b = 4;
int s, o, m;
reshi(a, b, s, o, m);
cout << s << " " << o << " " << m << endl;
return 0;
}

Завршен дел/Рефлексија
Прашања:

1. Што се пренесува при повикување на функцијата по референца во програмскиот


јазик С++?
А. Адресата на променливата, Б. Вредноста на променливата
В. Аргументот Г. Параметарот.
2. Која функција во програмскиот јазик С++ користи предавање на аргументи по
референца?
А. int f1(int &t, int &u, int v); В. int z1(int j, int k);
Б. void p( float x, double z); Г. float k(int t1, int t2);
3. Која од наведените функции користи предавање на аргументи само по
вредност, во програмскиот јазик С++?
А. int f1(int &t, int &u, int v), В. void p(int j, int &f),
Б. float g(int a1, int a2, float a), Г. char znak(int &y, char &b)
4. Определи со кој израз е дефинирана наредбата со која ќе се повика функцијата pr
во главната програма?
int pr(int x, int y, int &soberi, int &odzemi, int & mnozi)

20
{
soberi = x+y;
odzemi = x-y;
mnozi = x*y;
}

А. int pr(a,b,s, o,m); В. pom=pr(a,b,s,o,m);


Б. pr(a,b,s, o,m); Г. cout<<pr(a,b,s,o,m);

Домашна работа:

Да се напише програмата за смена на вредности од порталот


https://sites.google.com/site/informatikaiprogramiranje/programirane/11

ОБРЕМЕНУВАЊЕ (ПРЕОПТОВАРУВАЊЕ) НА ФУНКЦИИ

ВОВЕД

Понекогаш сакаме да креираме две или повеќе функции кои враќаат еден ист резултат
(на пример, збир на броеви), но се извршуваат врз различни типови на податоци (цели
броеви, реални броеви, еден цел и еден реален број, итн).
C++ нуди механизам (т.н. преоптоварување на функции) преку кој неколку функции
може да имаат едно исто име. За да се реализира ова, нормално, потребно е овие
функции да се разликуваат по бројот на параметрите и/или по нивниот тип.
ГЛАВЕН ДЕЛ

На пример, следната програма креира неколку функции со име zgolemi, секоја со


различна комбинација на параметри.
Гледајќи го кодот на програмата, забележуваме дека таа е составена од четири
функции со име zgolemi. Притоа, сите функции примаат различна комбинација од
параметри (еден цел број, два цели броеви, еден реален број или два реални броеви).
Притоа, зависно од типот на аргумент/и кои се предаваат, компајлерот знае точно која
функција да ја повика.
Пример 1:
#include <iostream> Што ќе Какви Што
using namespace std; биде докази навистина
int zgolemi(int a, int b) резултат имате за ќе биде
{ од тоа? резултатот?
return a+b; дадената
} програма?

21
int zgolemi(int a)
{
return a+1;
}
double zgolemi(double a, double b)
{
return a+b;
}
double zgolemi(double a)
{
return a+1;
}
int main()
{
cout << zgolemi(2, 3) << endl;
cout << zgolemi(5, 9) << endl;
cout << zgolemi(3) << endl;
cout << zgolemi(3.0, 0.5) << endl;
cout << zgolemi(4.1, 2.9) << endl;
cout << zgolemi(2.0) << endl;
return 0;
}

Пример 2:

#include <iostream> Што ќе Какви Што


using namespace std; биде докази навистина ќе
int kolicnik (int x, int y) резултат имате за биде
{ од тоа? резултатот?
int z=x/y; дадената
return z; програма?

22
}
float kolicnik(float x, float y)
{
float z=x/y;
return z;
}
int main()
{
int m,n;
float a,b;
cout<<"Vnesete dva celi broevi
razlicni od 0 "<<endl;
cin>>m>>n;
cout<<"Kolicnikot na dvata celi
broevi e "<<kolicnik(m,n)<<endl;
cout<<"Vnesete dva decimalni
broevi razlicni od 0 "<<endl;
cin>>a>>b;1
cout<<"Kolicnikot na dvata decimalni
broevi e "<<kolicnik(a,b)<<endl;
system("pause");
return 0;
}

Изборот која од неколку преоптоварени функции ќе се повика се сведува на проверка на


исполнувањето на некои од следните услови:

1. Доколку кај една функција постои целосно совпаѓање на типовите на аргументите со


типовите на параметрите, тогаш таа е функцијата која ќе се повика. На пример, како
аргументи на функцијата zgolemi(int a, int b) испраќаме две вредности од тип int.
2. Доколку не постои функција која го задоволува условот 1, се проверува дали постои
одредена функција чија листа на параметри може да се совпадне со аргументите со
едноставно проширување на нивниот опсег. На пример, како аргумент на функцијата
zgolemi(int a, int b) испраќаме две вредности од тип short. Бидејќи int има поголем
опсег од short, а и двата типа се однесуваат на исто множество на податоци (цели
броеви), C++ ќе го претвори short во int и ќе ја повика таа функција.
3. Доколку не постои функција која ги задоволува условите 1 или 2, се проверува дали
постои функција чија листа на параметри може да се совпадне со аргументите преку
претворање на нивниот тип. На пример, како аргумент на функцијата zgolemi(double
a, double b) испраќаме две вредности од тип int (во програмата дадена погоре,
можеме да ја избришеме првата функција за да го забележиме овој ефект). Тука
може да се појави мал проблем - т.н. амбициозно совпаѓање. На пример, што да се
направи доколку постојат две функции - zgolemi(double a, double b) и zgolemi(float a,
float b), и ние испратиме повик со аргументи од тип int. Во C++, бидејќи сите
претворања (од еден тип на податок во друг) се сметаат за еднакви, ваквото
повикување на функција е недозволено. Овој проблем може да го решиме пред
самиот повик на функцијата, преку експлицитно претопување на податоците во
соодветниот (посакуван) тип: zgolemi((double) x, (double) y)). Слично, може да
напишеме уште една функција со истото име, но со параметри од соодветниот тип:
во случајов zgolemi(int a, int b).

Функциите може да се преоптоваруваат само според параметрите, а не и според типот


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

23
Не е дозволено креирање на две функции со исто име, иста комбинација од параметри и
различен тип на податок кој се враќа како резултат.
Едноставно, во овој случај, компајлерот нема да знае која функција да ја повика.

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

Домашна работа:

1. Определи кој е резултатот од извршување на следниот програмски код:

#include <iostream> Што ќе Какви Што


using namespace std; биде докази навистина
void pecati(int i) резултат имате за ќе биде
{ од тоа? резултатот?
cout << i; дадената
} програма?
void pecati(double f)
{
cout << f;
}
int main(void)
{
pecati(5);
pecati(500.263);
return 0;
}

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

//Paskalov triagolnik

#include<iostream>
using namespace std;
long int Faktoriel(int broj)
{
int k;
int Proizvod=1;
for(k=1;k<=broj;k++)
Proizvod=Proizvod*k;

24
return Proizvod;
}
void BinKoef(int n,int k,float & BinKoeficient)
{
BinKoeficient=Faktoriel(n)/(Faktoriel(k)*Faktoriel(n-k));
}
main()
{
int n,i,k;
float BinomenKoeficient;
cout<<"Vnesete go n: ";cin>>n;
cout<<"1"<<endl;
for(i=1;i<=n;i++)
{
cout<<"1 ";
for(k=1;k<=i-1;k++)
{
BinKoef(i,k,BinomenKoeficient);
cout<<BinomenKoeficient<<" ";
}
cout<<"1"<<endl;
}
system("pause");
return 0;
}

Рекурзија и рекурзивни функции

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


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

#include<iostream>
using namespace std;
int faktoriel(int n)
{
if (n==1) return 1;
else return (n)*faktoriel(n-1);
}

25
int main()
{
int x;
cout<<"Vnesi broj x=";
cin>>x;
cout<<faktoriel(x);
system("pause");
return 0;
}

//Paskalov triagolnik bez rekurzija


#include<iostream>
using namespace std;
long int Faktoriel(int broj)
{
int k;
int Proizvod=1;
for(k=1;k<=broj;k++)
Proizvod=Proizvod*k;
return Proizvod;
}
void BinKoef(int n,int k,float & BinKoeficient)
{
BinKoeficient=Faktoriel(n)/(Faktoriel(k)*Faktoriel(n-k));
}
main()
{
int n,i,k;
float BinomenKoeficient;
cout<<"Vnesete go n: ";cin>>n;
cout<<"1"<<endl;
for(i=1;i<=n;i++)
{
cout<<"1 ";
for(k=1;k<=i-1;k++)
{
BinKoef(i,k,BinomenKoeficient);
cout<<BinomenKoeficient<<" ";
}
cout<<"1"<<endl;
}
system("pause");
return 0;
}

//Paskalov triagolnik so rekurzija


#include<iostream>
using namespace std;
long int Faktoriel(int broj)
{
int k;

26
int Proizvod=1;
for(k=1;k<=broj;k++)
Proizvod=Proizvod*k;
return Proizvod;
}
void BinKoef(int n,int k,float & BinKoeficient)
{
BinKoeficient=Faktoriel(n)/(Faktoriel(k)*Faktoriel(n-k));
}
main()
{
int n,i,k;
float BinomenKoeficient;
cout<<"Vnesete go n: ";cin>>n;
cout<<"1"<<endl;
for(i=1;i<=n;i++)
{
cout<<"1 ";
for(k=1;k<=i-1;k++)
{
BinKoef(i,k,BinomenKoeficient);
cout<<BinomenKoeficient<<" ";
}
cout<<"1"<<endl;
}
system("pause");
return 0;
}

Примери со користење рекурзија

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


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

//niza na Fibonaci so rekurzija


#include <iostream>
using namespace std;
int fibonaci(int i)
{
if ((i==1) or (i==2)) return 1;
else return fibonaci(i-1)+fibonaci(i-2);
}
int main()
{
int n,k;
cout<<"Vnesi kolku broevi da se pecatat od nizata na Fibonaci"<<endl;
cin>>n;

27
for(k=1;k<=n;k++)
cout<<fibonaci(k)<<", ";

system("pause");
return 0;
}

//Stepenuvanje so rekurzija i so prototip na funkcija koj ima 2 formalni parametri


#include <iostream>
using namespace std;
int stepen(int x,int n);
int main()
{
int x,n;
cout<<"Vnesete ja osnovata x "<<endl;
cin>>x;
cout<<"Vnesete go stepenot n"<<endl;
cin>>n;
cout<<"Rezultat="<<stepen(x,n)<<endl;
system("pause");
return 0;
}
int stepen(int x, int n)
{
if (n==1) return x;
else return x*stepen(x,n-1);
}

Вежба:

1. Дефинирана е целобројна функција g со два целобројни аргументи x и y.


int g (int x, int y)
{
int s;
y = y % 5;
s = 2 * x - y;
return (s);
}
Колкава ќе биде вредноста на целобројната променлива t по извршување на следната
наредба?
t = g (4, g (15, 38));

Домашна работа:

2. Да се пресмета збир на првите n природни броеви со помош на рекурзивна


функција како попрограма.
3. Да се печати низата: 1,1,1,3,5,9,17,... со користење на рекурзивна функција како
потпрограма.

28
29

You might also like