AISP_p02

Embed Size (px)

Citation preview

  • Fakultet elektrotehnike Univerziteta u Tuzli 1

    Algoritmi i strukture podatakaAlgoritmi i strukture podatakadr.sc. Edin Pjani

  • Fakultet elektrotehnike Univerziteta u Tuzli 2

    Kratki pregled C++Kratki pregled C++ Varijable Pokazivai Reference Dinamiko alociranje memorije Pravilo trojke Iteratori

  • Fakultet elektrotehnike Univerziteta u Tuzli 3

    VarijableVarijable Varijabla je koncept za predstavljanje

    memorijske lokacije u koju emo upisivati neki podatak ili iz koje emo itati

    Uz varijablu se vee: ime tip (implicira koliinu zauzete memorije) vrijednost memorijska adresa

  • Fakultet elektrotehnike Univerziteta u Tuzli 4

    Varijable - primjeriVarijable - primjericlass Kompl

    {

    private:

    double re, im;

    public:

    Kompl(double r, double i):

    re(r), im(i){}

    };

    int main()

    { ...

    int a = 8;

    Kompl z(4.5, -8.6);

    int b;

    ...

    }

    Memorija...

    a52a56a60a64a68a72a76...

  • Fakultet elektrotehnike Univerziteta u Tuzli 5

    Varijable - primjeriVarijable - primjericlass Kompl

    {

    private:

    double re, im;

    public:

    Kompl(double r, double i):

    re(r), im(i){}

    };

    int main()

    { ...

    int a = 8;

    Kompl z(4.5, -8.6);

    int b;

    ...

    }

    Varijabla aime atip intvrijednost 8adresa a56

    Memorija...a52a56 8a60

    4.5a64a68

    -8.6a72a76 ?...

    Varijabla zime ztip Komplvrijednost (4.5,-8.6)adresa a60

    Varijabla bime btim intvrijednost ?adresa a76

    int (32 bita)double (64 bita)

    a

    z

    b

  • Fakultet elektrotehnike Univerziteta u Tuzli 6

    Pokazivai pointeri: tip *Pokazivai pointeri: tip * Varijabla koja sadri adresu neke druge varijable

    ili podatkaNpr.:int a = 8;int* p = &a;

    modifikator tipa: znai "pokaziva na"ita se sa desna ulijevoNpr. int* se ita kao pokaziva na int

    Memorija...

    a52a56a60a64a68a72a76...

    adresni operator (operator "adresa od"); vrijednost izraza &a je a52tip izraza je int*

  • Fakultet elektrotehnike Univerziteta u Tuzli 7

    Pokazivai pointeri: tip *Pokazivai pointeri: tip * Varijabla koja sadri adresu neke druge varijable

    ili podatkaNpr.:int a = 8;int* p = &a;

    Memorija...

    a52 8a56 a52a60a64a68a72a76...

    Varijabla aime atip intvrijednost 8adresa a52

    Varijabla pime ptip int *vrijednost a52adresa a56

    Kaemo: p pokazuje na a

  • Fakultet elektrotehnike Univerziteta u Tuzli 8

    PokazivaiPokazivaiKompl z(4.5, -8.6);Kompl* p1;Kompl* pkomp = &z;int* p2;

    Memorija...

    a52a56a60a64a68a72a76...

  • Fakultet elektrotehnike Univerziteta u Tuzli 9

    PokazivaiPokazivaiKompl z(4.5, -8.6);Kompl* p1;Kompl* pkomp = &z;int* p2;

    Memorija...

    a524.5

    a56a60

    -8.6a64a68 ?a72 a52a76 ?...

    Varijabla zime ztip Komplvrijednost (4.5,-8.6)adresa a52

    Varijabla pkompime pkomptip Kompl *vrijednost a52adresa a72

    Varijabla p1ime p1tip Kompl *vrijednost ?adresa a68

    Varijabla p2ime p2tip int *vrijednost ?adresa a76

  • Fakultet elektrotehnike Univerziteta u Tuzli 10

    PokazivaiPokazivaiPosmatrajmo dio koda:int a = 8;int* pint = &a;&pint;

    Memorija...

    a52 8a56 a52a60a64a68a72a76...

    Izraz &p daje adresu varijable pint;Vrijednost izraza: a56Tip izraza: pokaziva na "pokaziva na int" ili int**

    int** px;

    Deklaracija varijable sa imenom px tipa: pokaziva na "pokaziva na int"

  • Fakultet elektrotehnike Univerziteta u Tuzli 11

    Pokazivai - obratiti panju!Pokazivai - obratiti panju! Prilikom rada sa pokazivaima obratiti panju na Prilikom rada sa pokazivaima obratiti panju na

    tip i vrijednost izrazatip i vrijednost izraza

    int a;Kompl z;int* pint;Kompl* pkomp;

    pint = &z;pkomp = &a;

    tip: int* tip: Komp*

    tip: int*tip: Komp*

    Ako je potrebno (ako znate ta radite), koristite cast operator, npr.:double * pd;pd = (double*) &z;

    POGRENO

  • Fakultet elektrotehnike Univerziteta u Tuzli 12

    Operator dereferenciranja ili Operator dereferenciranja ili operator indirekcije (*)operator indirekcije (*)

    Ako je:int a=8;int * pint = &a;

    onda je*pint int varijabla na adresi a52 a*pint=5; a=5;

    (*(&a)) a(&(*pint) pint

    Memorija...

    a52 8a56 a52a60a64a68a72a76...

  • Fakultet elektrotehnike Univerziteta u Tuzli 13

    Dereferenciranje - nastavakDereferenciranje - nastavakAko pretpostavimo da u klasi Kompl postoji metod modul() i:Kompl z(4,6);Kompl* pkomp=&z;

    onda je(*pkomp) z(*pkomp).modul(); z.modul();pkomp->modul(); z.modul(); Dakle, x-> zamjenjuje (*x).

  • Fakultet elektrotehnike Univerziteta u Tuzli 14

    NizoviNizovi Nizom nazivamo seriju elemenata istog tipa

    smjetenih u sukcesivnim memorijskim lokacijama.

    Pojedinani elementi se referenciraju dodavanjem indeksa na identifikator niza.

    Deklaracija niza brzine od 10 elemenata tipa double:

    double brzine[10]; Deklaracija niza z od 6 elemenata tipa Kompl Kompl z[6]; Deklaracija i inicijalizacija niza x od 4 elementa

    tipa int: int x[4]={5,234,-6,2};

  • Fakultet elektrotehnike Univerziteta u Tuzli 15

    NizoviNizoviint x[4]={5,234,-6,2};

    Izraz x daje adresu poetka niza tj. prvog elementa niza. x &x[0]

    Memorija...

    a52 5 x[0]a56 234 x[1]a60 -6 x[2]a64 2 x[3]a68a72a76...

    Vrijednost izraza: a52Tip izraza: pokaziva na int ili int*

    U C i C++ postoji vrlo vrsta veza izmeu nizova i pokazivaa.&x[2] x + 2 x[2] *(x + 2)

  • Fakultet elektrotehnike Univerziteta u Tuzli 16

    Generiki pokazivaGeneriki pokaziva To je pokaziva koji ne pokazuje ni na jedan tip

    posebno. Slui samo za uvanje adrese. Nije ga mogue dereferencirati jer kompajler ne

    zna na koji tip podatka pokazuje. Nije mogue koristiti aritmetike operacije sa

    ovim tipom pokazivaa. Mogue mu je dodijeliti adresu bilo koje

    varijable. Za pristup podacima koristiti cast operator! Deklaracija: void * pgen;

  • Fakultet elektrotehnike Univerziteta u Tuzli 17

    Generiki pokaziva - primjerGeneriki pokaziva - primjer#include class Kompl{ private: double re, im; public: Kompl(double r, double i): re(r), im(i){}};

    int main(){ int a = 3; Kompl z(5.6, 6.33); void* pgen = &a;

    std::cout

  • Fakultet elektrotehnike Univerziteta u Tuzli 18

    Prenos parametara u funkcijuPrenos parametara u funkciju Po vrijednosti:#define KORAK 4int Uvecaj(int staraVr){ staraVr = staraVr + KORAK; return staraVr;}...int main(){ int a=5,b; ... b = 3 + 2 * Uvecaj(a); // a je 5 a = Uvecaj(a); // a je 9 ...}

    U staraVr iz Uvecaj() se prosljeuje vrijednost varijable a iz main()

    prosljeuje se 5 u oba sluaja

  • Fakultet elektrotehnike Univerziteta u Tuzli 19

    Prenos parametara u funkcijuPrenos parametara u funkciju Po referenci (pokazivakoj):#define KORAK 4int UvecajP(int* staraVr){ *staraVr = *staraVr + KORAK; return *staraVr;}...int main(){ int a=5,b; ... b = 3 + 2 * UvecajP(&a); // a je 9 a = UvecajP(&a); // a je 13 ...}

    U staraVr iz UvecajP() se prosljeuje vrijednost adrese varijable a iz main()

    U stvarnosti se prenosi adresa po vrijednosti, ali efektivno je preneena referenca do varijable a

  • Fakultet elektrotehnike Univerziteta u Tuzli 20

    Prenos parametara u funkcijuPrenos parametara u funkciju Po referenci:#define KORAK 4int UvecajR(int& staraVr){ staraVr = staraVr + KORAK; return staraVr;}...int main(){ int a=5,b; ... b = 3 + 2 * UvecajR(a); // a je 5 a = UvecajR(a); // a je 9 ...}

    U staraVr iz Uvecaj() se prosljeuje referenca na varijablu a iz main()

    staraVr u funkciji UvecajR() postaje drugo ime za a iz funkcije main()

  • Fakultet elektrotehnike Univerziteta u Tuzli 21

    Prenos parametara u funkcijuPrenos parametara u funkciju ta bi bilo: b = UvecajP(5); b = UvecajR(5);

    U staraVr iz Uvecaj() se prosljeuje adresa 5 (ne adresa broja 5), ime dobijamo referencu na memorijsku lokaciju koju ne kontroliemo. Rezultat je nepredvien.

    5 nije varijabla (nije lvalue) te nije mogue prenijeti ovakvu referencu.Kompajler prijavljuje greku.

  • Fakultet elektrotehnike Univerziteta u Tuzli 22

    ReferencaReferenca Prednosti:

    zgodna sintaksa, uteda prostora i vremena prilikom prenosa

    parametara - efikasan nain prenosa. Mana:

    u drugoj funkciji imamo referencu do originalne varijable.

    Rjeenje: konstantna referenca (referenca sa zabranom

    mijenjanja vrijednosti originalne varijable)

  • Fakultet elektrotehnike Univerziteta u Tuzli 23

    Modifikator tipa - Modifikator tipa - constconstconst int a=5; int const a = 5;

    a je konstantna varijabla tipa int

    const int * p; int const * p = &a;

    p je pokaziva na konstantnu int varijablu preko ovog pokazivaa je nije mogue mijenjati

    const int & r; int const & r = a;

    r je referenca na konstantnu int varijablu preko ove reference je nije mogue mijenjati

  • Fakultet elektrotehnike Univerziteta u Tuzli 24

    Modifikator tipa - Modifikator tipa - constconstint * const p = &a;

    p je konstantni pokaziva na varijablu tipa int vrijednost ovog pokazivaa (adresu na koju pokazuje) nije mogue mijenjati

    int const * const p = &a;

    p je konstantni pokaziva na konstantnu int varijablu

    int const * & r = p;

    r je referenca na pokaziva koji pokazuje na konstantnu int varijablu

  • Fakultet elektrotehnike Univerziteta u Tuzli 25

    Modifikator tipa - Modifikator tipa - constconstKompl Kompl::operator+(Kompl const & z2) const{ Kompl rez; rez.re = re + z2.re; rez.im = im + z2.im; return rez}

    Ovo je potrebno koristiti pri definisanju metoda koji e se pozivati na objektima koji su proslijeeni po konstantnoj referenci.

    Obeanje kompajleru da neemo mijenjati privatne lanove datog objekta. U suprotnom kompajler prijavljuje greku.

  • Fakultet elektrotehnike Univerziteta u Tuzli 26

    Dinamika alokacija memorije - Dinamika alokacija memorije - newnew

    Primjeri:int* a = new int();Kompl* z1 = new Kompl(5.6, 6.2);

    Dealociranje (oslobaanje) ovako alocirane memorije:delete a;delete z1;

    Lokalna deklaracija Dinamika alokacijaDA ime NEDA tip DADA vrijednost DADA adresa DA

    vrijedi u ogranienom opsegu

    opseg (scope) nije vezana za opseg

  • Fakultet elektrotehnike Univerziteta u Tuzli 27

    Dinamika alokacija memorijeDinamika alokacija memorijeKompl* z2;...

    z2 = new Kompl(5.2, 2,3);

    ...

    z2 = new Kompl(2.4, 7.5); Curenje memorije (memory leak)Ispravno bi bilo:Kompl* z2;...

    z2 = new Kompl(5.2, 2,3);

    ...

    delete z2;

    z2 = new Kompl(2.4, 7.5);

  • Fakultet elektrotehnike Univerziteta u Tuzli 28

    Pravilo trojkePravilo trojke Ako nisu eksplicitno definisani, za svaku klasu

    kompajler automatski kreira metode: default konstruktor destruktor copy konstruktor

    Prilikom dinamike alokacije unutar objekta, uglavnom je potrebno redefinisati sva tri metoda da ne bi dolo do curenja memorije.

    Primjer: lista sa predmeta OOP

  • Fakultet elektrotehnike Univerziteta u Tuzli 29

    IteratorIterator Iterator je koncept koji omoguava sekvencijalni

    pristup elementima nekog kontejnera u jednom ili oba smjera. To je neka vrsta pametnog pokazivaa.

    Najei operatori nad iteratorom: = (postavljanje iteratora na neki element) == (provjera identinosti dva iteratora) != (provjera razliitosti dva iteratora) ++ (pomjeranje iteratora na sljedei element) (pomjeranje iteratora na prethodni element) * (dereferenciranje referenca na element)

    Obino se definie kao ugnijedena klasa unutar klase-kontejnera za pristup njegovim elementima

  • Fakultet elektrotehnike Univerziteta u Tuzli 30

    Iterator - primjerIterator - primjer...

    std::vector v;

    ...

    for(std::vector::iterator i=v.begin(); i != v.end(); i++)

    std::cout