You are on page 1of 10

Univerzitet u Beogradu Programiranje (Vežbe)

Tehnički fakultet u Boru

15. - 16. Funkcije


Funkcije u programskom jeziku C++ u opštem slučaju imaju sintaksu oblika:
povratni_tip ime_funkcije (lista_argumenata) {
naredba1;
naredba2;

return ime_promenljive;
}
Izvršavanje se prekida naredbom return.

Prilikom kreiranja funkcije definiše se šta funkcija treba da radi. Da bi se funkcija izvršila ona
se mora pozvati. Kada program (funkcija) pozove funkciju kontrola se iz glavnog programa
(funkcije) prenosi na pozvanu funkciju. Funkcija se izvršava sve dok ne dođe do kraja ili do
naredbe return. Tada funkcija završava izvršavanje i vraća kontrolu glavnom program (funkciji).
Da bi funkcija bila pozvana potrebno je da se navede njeno ime i proslede konkretne vrednosti
parametara kako je predviđeno u njenoj deklaraciji. Ukoliko funkcija vraća vrednost, nju treba
upotrebiti ili zapamtiti u odgovarajućoj promenljivoj kao što je ilustrovano sledećim primerom.

Primer 1. Odredi manju vrednost od zadatih vrednosti koristeći funkciju.


#include<iostream>
using namespace std;
int min(int a, int b); //Deklaracija funkcije

int main() {
int x = 3;
int y = 8;
int rez1 = min(3, 1); //Poziv f-je min konkretne vrednosti
int rez2 = min(x, y); //Poziv f-je min za promenljive x i y
cout << "Prvi minimum je " << rez1 << ", a drugi minimum je
"<< rez2<< endl;
return 0;
}

int min(int a, int b) { //Definicija funkcije


if (a > b)
return b;
else
return a;
}

Postoje dva načina prenosa parametara funkcije:

1. Prenos parametara po vrednosti podrazumeva da sve što se desi u funkciji nema nikakvog
uticaja na vrednost promenljivih u glavnom programu. Prilikom poziva funkcije prave se kopije
prosleđenih parametara koje postoje samo dok funkcija ne završi sa izvršavanjem.

2. Prenos parametara po referenci podrazumeva da se sve promene promenljivih koje su na


ovaj način prosleđene vide i u glavnom programu. Ovaj prenos se može koristiti kako bi funkcija
vratila više od jedne vrednosti.

1
Univerzitet u Beogradu Programiranje (Vežbe)
Tehnički fakultet u Boru

Rekurzivne funkcije

Rekurzija je pojava kada funkcija poziva samu sebe kao što je to prikazano sledećim
primerom.
void rekurzija() {
rekurzija(); /*funkcija poziva samu sebe*/
}

void main() {
rekurzija(); /*Poziv f-je u programu(funkciji)*/
}

U programskom jeziku C++ rekurzivno pozivanje funkcije je dozvoljeno, ali se naročito mora
voditi računa o definisanju kada se rekurzivni poziv funkcije završava. U protivnom postoji
opasnost od kreiranja mrtve (beskonačne) petlje.
Rekurzivni poziv funkcije predstavlja jedan od osnovnih programerskih metoda za rešavanje
određenih klasa problema, naročito matematičkih. Primeri primene predstavljaju računanje
faktorijela broja, fibonačijevog niza, implementaciju algoritma sortiranja i pretraživanja (quick sort
i dr.).

Zadaci za vežbu
Zadatak 1. Napisati program koji u sebi sadrži funkciju za proveru unete brojne vrednosti. Funkcija
int Provera(float Broj)potrebno je da izvrši proveru da li je uneti broj nula ili različit od
nule. Na osnovu toga ispisati odgovarajuću poruku.
#include<iostream>
using namespace std;

int Provera(float Broj) { //Deklaracija i definicija funkcije


if (Broj == 0)
cout << "Uneti broj je NULA." << endl;
else
cout << "Unet je korektan broj." << endl;
return 0;
}

int main() {
float x;
cout << "Unesi realan broj: ";
cin >> x;
Provera(x); //Poziv funkcije u programu(funkciji)
return 0;
}

2
Univerzitet u Beogradu Programiranje (Vežbe)
Tehnički fakultet u Boru
𝑎2
Zadatak 2. Napisati program koji izračunava vrednost iztaza 𝑐 = , na osnovu unetih vrednosti za
𝑏
a i b. Program napisati koristeći funkciju int Provera(float a, float b) koja vrši proveru
parametar b da li je različit od nule.
#include<iostream>
using namespace std;
int Provera(float a, float b) {//Deklaracija i definicija funkcije
float c;
if (b == 0)
cout << "Parametar b je NULA. Nedozvoljena vrednost.";
else {
c = (a*a) / b;
cout << "Vrednost izraza c = " << "(" << a << "*" << a <<
")" << "/" << b <<endl;
cout << "je c = " << c;
}
return 0;
}
int main() {
float x, y;
cout << "Unesite vrednost promenljive a: ";
cin >> x;
cout << "Unesite vrednost promenljive b: ";
cin >> y;
Provera(x, y); //Poziv funkcije u programu(funkciji)
return 0;
}

Zadatak 3. Napisati program za izračunavanje hipotenuze pravouglog trougla. U glavnom


programu izvršiti unos vrednosti prve i druge katete i štampati vrednost hipotenuze. U funkciji
izračunati vrednost hipotenuze.
#include<iostream>
#include<cmath>
using namespace std;
float hipotenuza(float a, float b); //Deklaracija funkcije
int main() {
float kat1, kat2, hip;
cout << "Unesi duzinu stranice a= ";
cin >> kat1;
cout << "Unesi duzinu stranice b= ";
cin >> kat2;
hip = hipotenuza(kat1, kat2); //Poziv funkcije po vrednosti
cout << "Hipotenuza c = " << hip << endl;
return 0;
}
float hipotenuza(float a, float b) { //Definicija funkcije
float rez = sqrt(a*a + b * b);
return rez;
}

3
Univerzitet u Beogradu Programiranje (Vežbe)
Tehnički fakultet u Boru

Zadatak 4. Napisati program za prenos argumenata pozivom po vrednosti.


#include <iostream>
using namespace std;
int promeni(int u, int v); //Deklaracija funkcije

int main() {
int x = 10, y = 20;
cout << "U programu originalne vrednosti za x i y su: x = "<< x
<< ", y = "<< y<< endl;
promeni(x, y); //Poziv funkcije po vrednosti
cout << "U programu nakon poziva funkcije vrednosti za x i y su:
x = " << x << ", y = " << y << endl;
return 0;
}

int promeni(int u, int v) {//Definicija funkcije


int temp;
cout << "U funk. originalne vrednosti su: u = " << u << ", v = "
<< v << endl;
temp = u;
u = v;
v = temp;
cout << "U funk. nakon promene vrednosti: u = " << u << ", v = "
<< v << endl;
return 0;
}

Rezultat programa nakon pokretanja:


U programu originalne vrednosti za x i y su: x = 10, y = 20
U funk. originalne vrednosti su: u = 10, v = 20
U funk. nakon promene vrednosti: u = 20, v = 10
U programu nakon poziva funkcije vrednosti za x i y su: x = 10,
y = 20

Iz dobijenog rezulta na osnovu poziva funkcije po vrednosti možete videti da originalne


vrednosti promenljivih x i y ostaju nepromenjene u programu (funkciji). Ovaj problem možete rešiti
pomoću pokazivača ili referenci.

4
Univerzitet u Beogradu Programiranje (Vežbe)
Tehnički fakultet u Boru

Zadatak 4-1. Napisati program za prenos argumenata pozivom po referenci pomoću pokazivača.
#include <iostream>
using namespace std;
int promeni(int *x, int *y); //Deklaracija funkcije

int main() {
int x = 10, y = 20;
cout << "U programu originalne vrednosti za x i y su: x = " << x
<< ", y = " << y << endl;
promeni(&x, &y); //Poziv funkcije po referenci
cout << "U programu nakon poziva funkcije vrednosti za x i y su:
x = " << x << ", y = " << y << endl;
return 0;
}

int promeni(int *x, int *y) {//Definicija funkcije


int temp;
cout << "U funk. originalne vrednosti su: x = " << *x << ", y =
" << *y << endl;
temp = *x;
*x = *y;
*y = temp;
cout << "U funk. nakon promene vrednosti: x = " << *x << ", y =
" << *y << endl;
return 0;
}

Rezultat programa nakon pokretanja:


U programu originalne vrednosti za x i y su: x = 10, y = 20
U funk. originalne vrednosti su: x = 10, y = 20
U funk. nakon promene vrednosti: x = 20, y = 10
U programu nakon poziva funkcije vrednosti za x i y su: x = 20, y =
10

Iz dobijenog rezulta na osnovu poziva funkcije po referenci možete videti da originalne vrednosti
promenljivih x i y su zamenile vrednosti u programu (funkciji) nakon poziva funkcije po referenci.

5
Univerzitet u Beogradu Programiranje (Vežbe)
Tehnički fakultet u Boru

Zadatak 4-2. Napisati program za prenos argumenata pozivom po referenci pomoću upućivača.
#include <iostream>
using namespace std;
int promeni(int &x, int &y); //Deklaracija funkcije

int main() {
int x = 10, y = 20;
cout << "U programu originalne vrednosti za x i y su: x = " << x
<< ", y = " << y << endl;
promeni(x, y); //Poziv funkcije po referenci pomocu upucivaca
cout << "U programu nakon poziva funkcije vrednosti za x i y su:
x = " << x << ", y = " << y << endl;
return 0;
}

int promeni(int &x, int &y) {//Definicija funkcije


int temp;
cout << "U funk. originalne vrednosti su: x = " << x << ", y = "
<< y << endl;
temp = x;
x = y;
y = temp;
cout << "U funk. nakon promene vrednosti: x = " << x << ", y = "
<< y << endl;
return 0;
}

Rezultat programa nakon pokretanja:


U programu originalne vrednosti za x i y su: x = 10, y = 20
U funk. originalne vrednosti su: x = 10, y = 20
U funk. nakon promene vrednosti: x = 20, y = 10
U programu nakon poziva funkcije vrednosti za x i y su: x = 20, y =
10

Iz dobijenog rezulta na osnovu poziva funkcije po referenci pomoću upućivača možete videti da
originalne vrednosti promenljivih x i y su zamenile vrednosti u programu (funkciji) nakon poziva
funkcije po referenci pomoću upućivača.

6
Univerzitet u Beogradu Programiranje (Vežbe)
Tehnički fakultet u Boru

Zadatak 5. Napisati program za određivanje aritmrtičke sredine dinamičkog niza celih brojeva.
Elemente niza unosimo koristeći funkciju unos_elemenata, a za prikazivanje elemenata
koristimo funkciju stampaj. Aritmetičku sredinu unetih elemenata određujemo uz pomoć
funkcije a_sredina.
#include <iostream>
using namespace std;
int unos_elemenata(int *a, int n); //Deklaracija funkcije
int stampaj(int *a, int n); //Deklaracija funkcije
float a_sredina(int *a, int n); //Deklaracija funkcije

int main() {
int n, i, j;
cout << "Unesite duzinu niza n = ";
cin >> n;
while (n <= 0) {
cout << "Za duzinu niza uneliste nulu ili negativan
broj. Unesite duzinu niza: ";
cin >> n;
}
int * a = new int[n];
unos_elemenata(a, n); //Poziv funkcije
float sredina = a_sredina(a, n); //Poziv funkcije
cout << "Aritmeticka sredina elemenata niza je: " << sredina
<< endl;
stampaj(a, n); //Poziv funkcije
delete[] a;
return 0;
}
int unos_elemenata(int *a, int n) {//Definicija funkcije
cout << "Unesite elemente niza:" << endl;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
return 0;
}
int stampaj(int *a, int n) {//Definicija funkcije
cout << "Uneti niz:" << endl;
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
float a_sredina(int *a,int n) {//Definicija funkcije
int j;
float s = 0, as;
for (j = 0; j < n; j++)
s += a[j];
as = (float)s / n;
return as;
}
7
Univerzitet u Beogradu Programiranje (Vežbe)
Tehnički fakultet u Boru

Zadatak 6. Napisati program koji prikazuje sve proste brojevi do zadatog prirodnog broja n.
#include <iostream>
using namespace std;
int prost(int broj); //Deklaracija funkcije

int main() {
int n, i;
cout << "Unesi prirodan broj veci od jedan."<< endl;
cin >> n;
cout << "Svi prosti brojevi manji ili jednaki od broja " << n
<<" su:" << endl;
for (i = 2; i <= n; i++)
if (prost(i) == 1) //Poziv funkcije
cout << i << " ";
return 0;
}

int prost(int broj) {//Definicija funkcije


int i;
for (i = 2; i < broj; i++)
if (broj % i == 0)
return 0;//Funkcija vraca vrednost 0 ako broj nije prost
return 1; //Funkcija vraca vrednost 1 ako je broj prost
}

Zadatak 7. Napisati program za izračunavanje faktorijela koristeći funkciju koja izračunava


faktorijel datog broja.
#include<iostream>
using namespace std;
long faktorijel(int broj); //Deklaracija funkcije

int main() {
int n, i;
cout << "Unesi prirodan broj: ";
cin >> n;
cout << n<<"! = " << faktorijel(n) << endl; //Poziv funkcije
return 0;
}

long faktorijel(int broj) {//Definicija funkcije


int i;
long fakt = 1;
for (i = 1; i <= broj; i++)
fakt *= i;
return fakt;
}

8
Univerzitet u Beogradu Programiranje (Vežbe)
Tehnički fakultet u Boru

Zadatak 8. Napisati rekurzivnu funkciju koja izračunava faktorijel datog broja. Funkcija faktorijela
se rekurzivno može predstaviti kao f(n)=n*f(n-1) sa početnim uslovom f(1)=1.
#include<iostream>
using namespace std;
long faktorijel(int broj); //Deklaracija funkcije

int main() {
int n, i;
cout << "Unesi prirodan broj: ";
cin >> n;
cout << n << "! = " << faktorijel(n) << endl; //Poziv funkcije
return 0;
}

long faktorijel(int n) {//Definicija funkcije


if (n == 1)
return 1;
return n * faktorijel(n - 1); //Rekurzivni poziv funkcije
}

Zadatak 9. Napisati program koji prikazuje sve trocifrene brojeve koji su jednaki sumi faktorijela
svojih cifara. (primer: 123 treba da bude jednak zbiru 1! + 2! + 3! da bi bio prikazan)
#include<iostream>
using namespace std;
long fakt(int k); //Deklaracija funkcije

int main() {
long i;
unsigned a, b, c;
for (i = 100; i <= 999; i++) {
a = i % 10;
b = i % 100 / 10;
c = i / 100;
if (fakt(a) + fakt(b) + fakt(c) == i) //Poziv funkcije
cout << i<< endl;
}
return 0;
}

long fakt(int k) {//Definicija funkcije


long f = 1;
int i;
for (i = 1; i <= k; i++)
f *= i;
return(f);
}

9
Univerzitet u Beogradu Programiranje (Vežbe)
Tehnički fakultet u Boru

Zadaci za samostalni rad studenata

Zadatak 1. Napisati program za izračunavanje funkcije 𝑦(𝑎, 𝑏). U glavnom program učitati
vrednost promenljivih a i b, zatim pozvati funkciju float y_a_b(int a, int b) u glavnom
program da izračuna vrednost funkcije 𝑦(𝑎, 𝑏) pod datim uslovima i na kraju prikazati dobijeni
rezultat. Promenljive a i b su integer tipa.
3 ∗ 𝑎 + 2 ∗ 𝑏, 𝑎 < 𝑏
𝑦(𝑎, 𝑏) = { − 5 ∗ 𝑏,
𝑎 𝑎 = 𝑏.
𝑏
𝑎3 − 2 , 𝑎>𝑏

Zadatak 2. Napisati program za izračunavanje sume:


𝑖!+𝑛
𝑆 = ∑𝑛𝑖=1 ∗ 𝑧𝑖
𝑥𝑖
Promenljive i i n su integer tipa, a promenljive x i z su realni brojevi. Za izračunavanje stepena
broja i faktorijela napisati sopstvene (korisničke) funkcije i njih koristiti prilikom izračunavanja
sume.

Zadatak 3. Napisati program za izračunavanje broja kombinacija m-te klase od n elemenata po


𝑛 𝑛!
formuli: (𝑚 ) = 𝑚!(𝑛−𝑚)!. Gde su m i n celi brojevi i 𝑛 > 𝑚. Za izračunavanje faktorijala napisati
rekurzivnu funkciju.

10

You might also like