Upload
selmir-mujezinovic
View
9
Download
0
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