You are on page 1of 5

FUNKCIJE

Deklaracija i definicija


Deklaracija:

<povratni tip> ime funkcije (<tip> argument1, <tip> argument1, ...,<tip>
argument n )

Tip ispred imena definira vrijednost koju vracamo pozivatelju.
Tip ispred argumenta definira ulazne vrijednosti, kojih moze biti proizvoljan broj


Primjer 4.1 :
Napisati funkciju koja racuna faktorijel zadang broja.

long int faktorijel(int n){
int i;
long int suma;
for (i=2;i<=n;i++){
suma*=n;
}
return suma;
}





Pokazivaci i refrence kao argumenti


Koristi se kada se funkcija ne moze implemenirati koristenjem prijenosa po
vrijednosti (npr. prijenos elemenata niza).


Primjer 4.2.
Napisati funkciju koja racuna sumu elemenata zadanog cjelobrojnog niza.

int suma(int *niz,int n){
int i,zbroj=0;
for (i=0;i<n;i++){
zbroj+=niz[i];
}
return zbroj;
}



Upotreba funkcije assert()

Makro funkcija assert() je pogodna za provjeru uvjeta na argumentima funkcije


Primjer 4.3
Napisat i funkcij u pot encij a( double baza, int eksponent ) koj a se izvrava uz uvj et :
baza >0.

double potencija(double x,int n){
assert(x>0);//provjera da li je argument x>0
double y=1.0;
for(int i=0;i<n;i++){
y*=x;
}
for(int i=0;i<n;i++){
y/=x;
}
return y;
}



Pokazivaci i reference kao povratne vrijednosti

Funkcije obicno vracaju vrijednost prilikom poziva, ali mogu vratiti i pokazivac.

Primjer 4.4
Napisati funkciju koja spaja dva znakovna niza i vraca pokazivac na prvi element
novostvorenog niza.

Prototip funkcije:
char *spoji(char *niz1, char *niz2, char *rezultat)


#include <iostream>
using namespace std;

char *spoji(char *niz1, char *niz2, char *rezultat){
rezultat=new char[80];
char *indeks =rezultat;
while (*niz1){
*(indeks++)=*(niz1++);
}
while (*niz2){
*(indeks++)=*(niz2++);
}
*indeks='\0';
return rezultat;
}
void main(){
char *test="";
char *prvi="prvi niz znakova";
char *drugi="drugi niz znakova";
test=spoji(prvi,drugi,test);
cout <<test;
}

Preopterecenje funkcija


Programski jezik C++ omogucava koristenje istog imena za razlicite argumente
funkcije (preopterecenje funkcije, engl. RYHUORDGLQJ). Prevodilac na osnovu
argumenata odabire koju inacicu funkcije koristi. Funkcije se preopterecuju samo
prema tipovima argumenata, ali ne i prema tipu povratne vrijednosti.


Primjer 4.5
Napraviti preopterecenje na funkciji float kvadrat() koja racuna kvadrat zadanog
broja, za ulazne tipove float i int.

#include <iostream>
using namespace std;

//varijanta za int
float kvadrat(int x){
return x*x;
}
//varijanta za float
float kvadrat(float x){
return x*x;
}
void main(){
int x=23;
float y=32;
//izvrsice se varijanta za int
cout<<"\nKvadrat od int x=23 :"<<kvadrat(x);
//izvrsice se varijanta za float
cout<<"\nKvadrat od float y=32 :"<<kvadrat(y);
}

Pitanje: t o ako j e argument x t ipa double, u pozivu funkcij e ?

Rj eenj e: error C2668: 'kvadrat' : ambiguous call to overloaded function
( Gr eka u Visual St udio. Net C+ + prevodiocu)
Prevodilac ne prepoznaje argument.



Zadaci za vjezbu:

1. zadatak
Napiit e funkcij u koj a sort ira element e realnog j ednodimenzionalnog polj a po
velicini, od najmanjeg prema najvecem.

2. zadatak
Napiit e funkcij u koj a br oj i poj avlj ivanj e zadanog znaka u nizu znakova.

3. zadatak
Napisati funkciju koja spaja dva znakovna niza u jedan tako da drugi znakovni niz
doda na kraj prvoga.

Rj eenj a:

1. zadatak

#include <iostream>
using namespace std;

void sort(float *x,int n){
//sortiranje
for (int i=n-1;i>0;i--){
for(int j=0;j<i;j++){
if(x[j+1]<x[j]){
float priv=x[j];
x[j]=x[j+1];
x[j+1]=priv;
}
}
}

//ispis sortiranih
for (int i=0;i<n;i++){
cout << "Element "<<i+1<<".: ";
cout << x[i];
cout << endl;
}
}
void main(){
const int nmax=100;
int n;
float x[nmax];
cout << "Unesite broj elemenata :";
cin >>n;
for (int i=0;i<n;i++){
cout << "Element "<<i+1<<".: ";
cin >>x[i];
cout << endl;
}
sort(x,n);
}

2. zadatak

#include <iostream>
using namespace std;

#define MAXNIZ 255
int strchr(char *s, char c ) {
int i=0;
while( *s != '\0' ) {
if( *s == c )
{
i++;
}
s++;
}
return i;
}


void main()
{
char recenica[MAXNIZ],znak;
cout<<"Unesite recenicu:";
cin.getline(recenica,80);
cout<<"\nUnesite znak koji trazite:";
cin>>znak;
cout<<"\n Broj pojavljivanja zadanog znaka u recenici: ";
cout<<strchr(recenica,znak);
}

3. zadatak

#include <iostream>
using namespace std;

#define MAXNIZ 255

void strcat( char *dest, char *src ) {
int i=0, j=0;
while( dest[i] != '\0' ){ // trazimo kraj stringa
i++;
}
while( src[j] != '\0' ){
dest[i++] = src[j++];
dest[i] = src[j]; // dodajemo \0 na kraj stringa

}
}
void main(){
char prvi[MAXNIZ],drugi[MAXNIZ];
cout<<"Unesite 1.niz:";
cin.getline(prvi,MAXNIZ);
cout<<"Unesite 2.niz:";
cin.getline(drugi,MAXNIZ);
strcat(drugi,prvi);
cout<<"\nNovi niz je:"<<drugi;
}

You might also like