Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 35

Funkcije

Programski jezici
2017/18
Funkcije
• Kod pisanja programa koji trebaju da riješe neke
složenje probleme, problemi se razlažu na niz
jednostavnih (elementarnih) problema
• Za rješavanje elementarnih problema pišu se
potprogrami (funkcije)
• Složeni problem se rješava pozivanjem funkcija koje
rješavaju elementarne probleme
• Funkcija predstavlja modul ili blok programskog koda
koji izvršava određeni zadatak
• Primjeri: printf, scanf, strlen, malloc, calloc, realloc...
Definisanje funkcije
[<tip_povratne_vrednosti>] <ime_funkcije> ([<lista_parametara>])
{
<telo_funkcije>
}

• <tip_ povratne_vrednosti > – određuje tip vrednosti koju funkcija


vraća. Ako je izostavljen podrazumijeva se int. Ako je void funkcija
ne vraća ništa.
• <ime_funkcije> je simboličko ime pomoću koga se vrši poziv
funkcije iz programa (ujedno predstavlja i adresu funkcije)
• <telo_funkcije> - blok naredbi (deklarativnih i izvršnih)
• <lista_parametara> - proizvoljan broj parametara razdvojenih sa ,.
Parametri služe za unošenje vrijednosti (i iznošenje rezultata).
Definišu se kao i ostale promjenljive, ali tip mora biti naveden za
svaku posebno
Primjer 1
int minimalni(int a, int b)
{
if (a < b)
povratna {
vrijednost
return a; ime funkcije
}
else
parametri
{ funkcije
return b;
}
tijelo funkcije primjer
}
poziva

int a = minimalni(5,3);
Naredba return
• Ovom naredbom prekida se izvršenje funkcije
• Može da vrati i rezultat funkcije koji prihvata
pozivajuća funkcija
• Rezultat koji funkcija vraća je tipa koji je naveden kao
tip povratne vrijednosti funkcije
• Funkcija može da sadrži nijednu (ako je tipa void),
jednu ili više naredbi return
• Postoje dva oblika:
– return (<vrijednost>); - <vrijednost> je rezultat funckije
– return; - ne vraća ništa, za fukncije tipa void
Deklaracija funkcije
• Omogućava poziv funkcije prije njenog
definisanja
[<tip_rezultata>] <ime_funkcije>();
• <tip_rezultata> mora da se poklapa sa tipom u
kasnijoj definiciji fukncije
• U deklaraciji se mogu navesti i tipovi argumenata
(imena nisu obavezna)
int minimalni(int, int);
Primjer 2
#include<stdio.h>

deklaracija int minimalni(int, int);

void main()
{
poziv int min = minimalni(5, 3);
}

int minimalni(int a, int b)


{
if (a < b)
{
return a;
definicija }
else
{
return b;
}
}
Prenos parametara
• Parametri se funkciji prenose po vrijednosti. To znači
da se pri pozivu u operativnoj memoriji prave kopije za
sve parametre funkcije. Funkcija radi sa kopijama. U
trenutku završetka kopije se brišu iz memorije.
• Na ovaj način je onemogućeno da se stvarni parametar
iz pozivajuće funkcije promijeni u pozvanoj funkciji
• Funkcija može da vrati samo jednu vrijednost. Ukoliko
treba da se prenese više vrijednosti u pozivajuču
funkciju, umjesto podataka u funkciju se prenose
pokazivači podataka koje treba mijenjati. Tada se
kreiraju kopije za pokazivače (njihovi sadržaji su
adrese), a pomoću njih mijenjamo sadržaj lokacija na
koje oni pokazuju
Primjer 3
#include<stdio.h>

void ispis(int);

void main()
{
int broj = 5;
printf("Prije poziva: %d\n", broj);
ispis(broj);
printf("Posle poziva: %d\n", broj);
}

void ispis(int a) Ispis:


{ Prije poziva: 5
a++; U funkciji: 6
printf("U funkciji: %d\n", a); Posle poziva: 5
}
Primjer 4
Napisati program koji sa tastature prihvata dva
cijela broja, a potom napisati funkciju koja
računa zbir i razliku ta dva broja, pa rezultate
dobijene funkcijom ispisati na ekran.

Problem: Kako vratiti dvije vrijednosti?


Primjer 4 – Rješenje 1
#include<stdio.h>

int zbirIRazlika(int a, int b, int *razlika);

void main()
{
int x, y, zbir, razlika;
printf("Unesite dva cijela broja: ");
scanf("%d %d", &x, &y);

zbir = zbirIRazlika(x, y, &razlika);


printf("Zbir: %d\nRazlika: %d\n", zbir, razlika);

system("pause");
}

int zbirIRazlika(int a, int b, int *razlika)


{
int zbir;
zbir = a + b;
*razlika = a - b;
return zbir;
}
Primjer 4 – Rješenje 2
globalne promjenjive
#include<stdio.h>

void zbirIRazlika();

int x, y, zbir, razlika;

void main()
{
printf("Unesite dva cijela broja: ");
scanf("%d %d", &x, &y);

zbirIRazlika();
printf("Zbir: %d\nRazlika: %d\n", zbir, razlika);

system("pause");
}

void zbirIRazlika()
{
zbir = x + y;
razlika = x - y;
return zbir;
}
Primjer 5
Napisati funkciju koja računa cjelobrojan
pozitivan stepen realne osnove. U galvnoj funkciji
omoguciti unos osnove i eksponenta, pa rezultat
dobijen pozivom funkcije ispisati na ekran.
Primjer 5 - Rješenje
#include <stdio.h>

double stepen(float a, int n);

void main()
{
int eksponent;
float osnova;
printf("Unesite osnovu i eksponent:\n");
scanf("%f %d", &osnova, &eksponent);
printf("rez=%f\n", stepen(osnova, eksponent));
system("pause");
}

double stepen(float a, int n)


{
int i;
double rez;
for (i = 1, rez = 1; i <= n; i++, rez *= a);
return (rez);
}
Prosljeđivanje niza funkciji
• Kada se niz prosljeđuje funkciji ona ne dobija kopiju
niza nego adresu prvog elementa niza
• Bilo koja modifikacija načinjena ovim pokazivačem
vidjeće se u pozivajućem programu
• Niz se funkciji prosleđuje tako što se pored imena
parametra stavi par [ ], ili pomoću pokazivača

void sortraj(int niz[], int n)


ili
void sortraj(int *niz, int n)
Primjer 6
Napisati program u kome se pri deklaraciji
inicijalizuje niz od 10 proizvoljnih elemenata tipa
float, a potom napisati funkcije za sortiranje i
ispis niza, te ga sortirati i ispisati korištenjem
ovih funkcija.
Primjer 6 - Rješenje
#include<stdio.h> void sortraj(float niz[], int n)
{
void sortraj(int niz[], int n); int i, j;
void ispisi(int niz[], int n); float pom;
for (i = 0; i < n-1; i++)
void main() for (j = i + 1; j < n;j++)
{ if (niz[i]>niz[j])
float a[] = { 1, 2, 7, 9, 0, 8, 6, 3, 5, 4 }; {
int duzina = 10; pom = niz[i];
niz[i] = niz[j];
sortraj(a, duzina); niz[j] = pom;
ispisi(a, duzina); }
system("pause"); }
}
void ispisi(float *niz, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%.2f ", niz[i]);
printf("\n");
}
Prenos višedimenzionalnih nizova
• Pri deklarisanju argumenata funkcije koji su
višedimenzionalni nizovi ne navodi se prva
dimenzija, a ostale dimenzije se moraju navesti
• Kod dinamički alociranih višedimenzionalnih
nizova prenosi se samo pokazivač, a dimenzije
se ne navode
int sumaElemenataMatrice(int mat[][5], int brRedova, int brKolona)
{
...
}
Primjer 7
Napisati program koji omogućava da se sa
tastature unese matrica dimenzija mxn (m i n nisu
veći od 10) čiji su elementi tipa int.
Napisati funkciju koja računa sumu elemenata
matrice
Napisati funkciju koja ispisuje matricu na ekran
Korištenjem ovih funkcija ispisati na ekran
unesenu matricu i sumu elemenata matrice
Primjer 7 - Rješenje
#include<stdio.h>

int suma(int mat[][10], int m, int n); int suma(int mat[][10], int m, int n)
void ispisi(int mat[][10], int m, int n); {
int i, j, suma = 0;
void main() for (i = 0; i < n; i++)
{ for (j = 0; j < n; j++)
int mat[10][10], m, n, i, j; suma += mat[i][j];
int sumaElemenata;
printf("Unesite m i n: "); return suma;
scanf("%d %d", &m, &n); }
printf("Unesite matricu:\n");
for (i = 0; i < m; i++) void ispisi(int mat[][10], int m, int n)
for (j = 0; j < n; j++) {
scanf("%d", mat[i] + j); int i, j, suma = 0;
for (i = 0; i < n; i++)
sumaElemenata = suma(mat, m, n); {
printf("\nUnijeli ste matricu:\n"); for (j = 0; j < n; j++)
ispisi(mat, m, n); printf("%d ", mat[i][j]);
printf("Suma elemenata je: %d\n", sumaElemenata); printf("\n");
}
system("pause"); }
}
Rekurzivne funkcije

• Rekurzivne funkcije su funkcije koje


pozivaju same sebe
• Svi problemi koji se mogu riješiti
rekurzivnim funkcijama mogu se riješiti i
korištenjem programskih petlji
Primjer 8
Napisati rekurzivnu funkciju za računanje
faktorijela. U glavnoj funkciji omogućiti unos
pozitivnog cijelog broja većeg od 1, pa rezultat
dobijen korištenjem pomenute funkcije ispisati na
ekran.

4! = 4 * 3! = 4 * 3 * 2! = 4 * 3 * 3 * 1! = 4 * 3 * 2 * 1
Primjer 8 - Rješenje
#include <stdio.h>

int faktorijel(int n);

void main()
{
int broj;
printf("Unesite cijeli broj (veci od 1): ");
scanf("%d", &broj);

printf("Faktorijel broja %d je %d.\n", broj, faktorijel(broj));


system("pause");
}

int faktorijel(int n)
{
if (n == 1)
return 1;
else
return n*faktorijel(n - 1);
}
Primjer 9
Napisati rekurzivnu funkciju za računanje i-tog
člana Fibonačijevog niza, zatim omogućiti
korisniku unos indeksa člana, i na ekranu prikazati
vrijednosti člana sa unijetim indeksom.

1,1,2,3,5,8,13,21,…
F[i] = F[i-1] + F[i-2]
Primjer 10
Napisati program koji omogućava korisniku unos stringa, a
potom napisati funkcije koje konvertuju dati string u sva
mala i sva velika slova. U glavnoj funkciji pozvati ove
funkcije i njihov rezultat prikazati na ekranu.
Primjer 11
Napisati program koji omogućava korisniku da unese niz
od N cijelih brojeva. N se unosi sa tastature. Niz cuvati u
dinamickoj zoni memorije.
• Napisati funkciju koja racuna geometrijsku sredinu
elemenata niza.
• Napisati funkciju koja iz niza izbacuje sve elemente
koji su manji od geometrijske sredine (niz uvijek treba
da zauzima tačno onoliko prostora koliko mu je
potrebno) *
Primjer 12
Napisati program koji omogućava unos ocjena sa tastature
(od 1 do 10) sve dok se ne unese 0. Niz ocjena čuvati u
dinamičkoj zoni memorije, i omogućiti da uvijek zauzima
tačno onoliko prostora koliko je potrebno.
Napisati funkcije za ispis histograma ocjena na ekran koje
omogućavaju izbor karaktera od koga se pravi histogram.
10 *****
9 *******
8 ******
7 **********
6 *********
...
Primjer 13
Napisati program koji omogućava unos matrice mxn (m, n
< 10). Potom omogućiti unos cijelog broja X koji je u
granicama 0<X<m. Napisati funkciju koja računa sumu
elemenata i-te vrste matrice, pa koristeći tu funkciju
ispisati na ekran sumu vrste X date matrice.
Globalne promjenljive
C program sastoji se od skupa globalnih objekata, koji
mogu biti:
• promjenljive
• funkcije
Globalne promjenljive su definisane izvan svake funkcije i
zato su potencijalno na raspolaganju raznim funkcijama.
Funkcije su uvijek globalne, jer C ne dozvoljava
definisanje funkcija unutar drugih funkcija.
Primjer 14
#include <stdio.h> void prebrojZnakove()
{
/*Globalne promjenljive*/ char c;
int br_slova, br_cifara;
printf("Unesite tekst: ");
void prebrojZnakove(); c = getchar();

void main() while (c!='\n')


{ {
prebrojZnakove(); if (c >= '0' && c <= '9')
{
printf("Broj slova je %d.\n", br_slova); br_cifara++;
} else if ( (c >= 'a' && c <= 'z') ||
printf("Broj cifara je %d.\n", br_cifara); (c >= 'A' && c <= 'Z') )
{
} br_slova++;
}

c = getchar();
}
}
Poređenje globalnih i lokalnih
promjenljivih

• Lokalne promjenljive su unutrašnje za funkciju. One


nastaju kada otpočinje izvršavanje funkcije i nestaju
kada se funkcija završi.

• Globalne promjenljive su permanentne i stoga


zadržavaju svoje vrijednosti između poziva funkcija.
Dakle, životni ciklus ovih promjenljivih je duži.
Statičke promjenljive
• Deklaracija static, koja se primjenjuje na globalnu
promjenljivu ili funkciju, ograničava domet tog objekta
na preostali dio izvorne datoteke.

• Deklaracija static se može primjeniti i na unutrašnje i


lokalne promjenljive. Unutrašnje statičke promjenljive
su lokalne za određenu funkciju baš kao i lokalne
promjenljive, ali za razliku od njih, one nastavljaju da
postoje i nakon završetka funkcije. One ne nastaju i ne
nestaju sa svakim pozivom funkcije.
Inicijalizacija statičkih i globalnih
promjenljivih
• Globalne i statičke promjenljive se uvijek inicijalizuju
na nulu, ukoliko nisu eksplicitno inicijalizovane.
Inicijalizator mora biti konstantan izraz. Inicijalizacija
se obavlja samo jednom, prije početka izvršavanja
programa.
static int i = j; // Neispravno
static int i = 2; // Ispravno

• Lokalne promjenljive imaju nedefinisane početne


vrijednosti ukoliko nisu eksplicitno inicijalizovane.
Inicijalizacija se obavlja svaki put prilikom izvršavanja
funkcije ili bloka.
Primjer 15
#include <stdio.h> void uvecaj(char c)
{
void uvecaj(char); static int br_uvecanja = 0;
void uvecaj_l(char);
if (c == '+')
void main() {
{ br_uvecanja++;
char c; }
else if (c == '-')
printf("Unesite znak (+ ili -): "); {
scanf("\n%c", &c); br_uvecanja--;
}
do{
printf("Stanje (stat): %d. ", br_uvecanja);
uvecaj(c); }
uvecaj_l(c);
void uvecaj_l(char c)
printf("Unesite znak (+ ili -): "); {
scanf("\n%c", &c); int br_uvecanja = 0;

}while (c != '*'); if (c == '+')


} {
br_uvecanja++;
}
else if (c == '-')
{
br_uvecanja--;
}

printf("Stanje (lok): %d.\n", br_uvecanja);


}
Pitanja?

You might also like