pri_p_10_ 2015_16.ppt

13
© www.fit.ba Programiranje I Predavanje 10 Predavač: prof.dr. Murat Prašo Student: Haris Balta III godina

Upload: bakir-omercausevic

Post on 14-Feb-2016

230 views

Category:

Documents


2 download

DESCRIPTION

dadad

TRANSCRIPT

Page 1: PRI_P_10_ 2015_16.ppt

© www.fit.ba

Programiranje IPredavanje 10

Predavač:prof.dr. Murat PrašoStudent:Haris Balta III godina

Page 2: PRI_P_10_ 2015_16.ppt

C++ podržava upotrebu dva oblika parametara: prijenos parametara po vrijednost i prijenos parametara po referenci. Prijenos parametara po vrijednosti – formalni parametar prima kopiju vrijednosti argumenata koja im se prenosi. Kao posljedica toga, ako funkcija napravi bilo kakvu promjenu na parametrima, ovo neće promijeniti vrijednosti argumenta. Na primjer,   #include <iostream>  using namespace std;  void Uradi (int broj);

  int main ()  {  int x = 10;  Uradi(x);  cout << "x = " << x << '\n';  system("PAUSE");  return 0;  } 

void Uradi (int broj)  {  broj = 0;  cout << "broj = " << broj << '\n';  }

 Napomena- u ovom tekstu:formalni parametar je parametarStvarni (aktualni) parametar je argument

Funkcije - nastavak

Poziv funkcije po vrijednosti i poziv funkcije po referenci:

Page 3: PRI_P_10_ 2015_16.ppt

Parametar broj u funkciji Uradi() je parametar po vrijednosti. On se ponaša kao lokalna varijabla u funkciji. Kada se funkcija pozove i vrijednost x se prenese, varijabla broj primi kopiju vrijednosti varijable x. Kao rezultat toga, iako varijabla broj u funkciji mijenja vrijednost na 0, to neće utjecati na varijablu x. Program će dati sljedeći izlaz:           broj = 0;          x = 10;

Za razliku od parametra po vrijednosti, parametar po referenci prima argument koji se prenosi i sve obavlja direktno na njemu (na originalnoj lokaciji argumenta). Bilo koja promjena parametra po referenci u samoj funkciji, direktno se odnosi i na argument, tj. i on se mijenja. Da bismo definisali parametar po referenci, potrebno je dodati simbol & (operator adrese) iza tipa parametra u deklaraciji funkcije i u zaglavlju definicije funkcije (“funkcija zna adresu stvarnog parametra ili argumenta”).U predhodnom primjeru funkcije   Uradi() bilo bi :

        void Uradi (int &num); 

U kontekstu poziva funkcija, a na osnovu prethodno iznesenog, razlikujemo dvije vrste pridruživanja: priduživanje prema vrijednosti i pridruživanje prema referenci. U praksi (u pogledu funkcija) se mnogo više koristi priduživanje prema vrijednosti.

void Uradi (int &broj)  {  broj = 0;  cout << "broj = " << broj << '\n';  }

Page 4: PRI_P_10_ 2015_16.ppt

- slijedi detaljniji prikaz na primjeru -

vrijednost in1

adresa

vrijednost in2

adresa

Varijabla in1 u memoriji

Varijabla in2 u memoriji

Variajble in1 i in2 upotrijebićemo kao parametre funkcije:

void fff(int in1, int in2);

void fff(int in1, int &in2);

Parametri po vrijednosti

Parametar po vrijednosti

Parametar po referenci

Ili izlazni parametar

& je adresni operator – funkcija fff “zna” memorijsku adresu varijable in2

Page 5: PRI_P_10_ 2015_16.ppt

#include <iostream>using namespace std;void fff(int in1, int in2);int main(){int brojac = 7, indeks = 12; cout << "vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

fff(brojac, indeks);

cout <<"vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

return 0;}

//definicija funkcije

void fff(int in1, int in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}

Poziv funkcije po vrijednosti :

Funkciji fff se, kod poziva, daju kopije vrijednosti (7, 12)

Prikazujemo vrijednosti in1 i in2:

-prije poziva funkcije fff

-iz funkcije fff

-nakon poziva funkcije fff

Page 6: PRI_P_10_ 2015_16.ppt

7 in1

adresa

12 in2

adresa

fff(brojac, indeks);

Adresa (poziva)

in1

in2

//definicija funkcije

void fff(int in1, int in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}

Adresa (poziva)

7

12

107

112

Page 7: PRI_P_10_ 2015_16.ppt

7 in1

adresa

12 in2

adresa

7

12

Adresa (poziva)

(in1 = in1 + 100) je 107

(in2 = in2 + 100) je 112

in1

in2

//definicija funkcije

void fff(int in1, int in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}

Adresa (poziva)

#include <iostream>using namespace std;

void fff(int in1, int in2);

int main(){int brojac = 7, indeks = 12;

cout << "vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

fff(brojac, indeks);

cout <<"vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

return 0;}

Page 8: PRI_P_10_ 2015_16.ppt

#include <iostream>using namespace std;

void fff(int in1, int &in2);

int main(){int brojac = 7, indeks = 12;

cout << "vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

fff(brojac, indeks);

cout <<"vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

return 0;}

//definicija funkcije

void fff(int in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}

Poziv funkcije po referenci :

Funkciji fff se, kod poziva, daje kopija vrijednosti 7 za parametar po vrijednosti a za referentni parametar funkcija fff “zna” adresu.

int in1 parametar po vrijednosti

int &in2 parametar po refrenci

Page 9: PRI_P_10_ 2015_16.ppt

7 in1

adresa

12 in2

adresa

fff(brojac, indeks);

Adresa (poziva iz main)

in1

//definicija funkcije

void fff(int in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}

Adresa (poziva)

7

107

112

Page 10: PRI_P_10_ 2015_16.ppt

7 in1

adresa

12 in2

adresa

7Adresa (poziva iz main)

(in1 = in1 + 100) je 107

in1

//definicija funkcije

void fff(int in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}

Adresa (poziva)

#include <iostream>using namespace std;

void fff(int in1, int &in2);

int main(){int brojac = 7, indeks = 12;

cout << "vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

fff(brojac, indeks);

cout <<"vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

return 0;}

112

Page 11: PRI_P_10_ 2015_16.ppt

#include <iostream>using namespace std;

void fff(int &in1, int &in2);

int main(){int brojac = 7, indeks = 12;

cout << "vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

fff(brojac, indeks);

cout <<"vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

return 0;}

//definicija funkcije

void fff(int &in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}

Poziv funkcije po referenci :

Kod poziva, ne daju se kopije parametara __za referentne parametre funkcija fff “zna” adrese.

int &in1 parametar po referenci

int &in2 parametar po refrenci

Page 12: PRI_P_10_ 2015_16.ppt

7 in1

adresa

12 in2

adresa

fff(brojac, indeks);

Adresa (poziva iz main)

in1

//definicija funkcije

void fff(int &in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}

Adresa (poziva)

112

107

Page 13: PRI_P_10_ 2015_16.ppt

7 in1

adresa

12 in2

adresa Adresa (poziva iz main)

//definicija funkcije

void fff(int &in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti iz funkcije su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}

Adresa (poziva)

#include <iostream>using namespace std;

void fff(int &in1, int &in2);

int main(){int brojac = 7, indeks = 12;

cout << "vrijednosti prije poziva funkcije su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

fff(brojac, indeks);

cout <<"vrijednosti nakon poziva funkcije su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;

return 0;}

112

107