54

Programiranje 2 · Pokaziva ci Bibliote cke funkcije l nd, bsearch i qsort Literatura Pregled 1 Pokaziva ci 2 Bibliote cke funkcije l nd, bsearch i qsort 3 Literatura Milena Vujo

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Programiranje 2

Pokaziva�ci

Milena Vujo�sevi�c Jani�ci�cJelena Graovac

www.matf.bg.ac.rs/~milena

www.matf.bg.ac.rs/~jgraovac

Programiranje 2

Beograd, 05. april, 2017.

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pregled

1 Pokaziva�ci

2 Bibliote�cke funkcije l�nd, bsearch i qsort

3 Literatura

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pregled

1 Pokaziva�ciPokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

2 Bibliote�cke funkcije l�nd, bsearch i qsort

3 Literatura

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci

Pokaziva�ci (engl. pointer) predstavljaju tip podataka u C-u �cijesu vrednosti memorijske adrese.

Broj bajtova koje pokaziva�c zauzima zavisi od sistema (2,4,8bajtova).

Pokaziva�ci implicitno �cuvaju informaciju o tipu onoga na �staukazuju (osim pokaziva�ca na tip void):

int *p1;

float* p2;

char* p3, p4;

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci

Unarni operator &, operator referenciranja ili adresni operatorvra�ca adresu svog operanda.

int a=10, *p;

p = &a;

*p = 5; /*operator derefernciranja*/

Simboli�cka konstanta NULL je de�nisana u zaglavlju<stdio.h>

Podrazumeva se da pokaziva�c koji ima vrednost 0 ne mo�ze dapokazuje ni na �sta smisleno.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci

Op�sti pokaziva�c void * � pokaziva�c koji mo�ze da ukazuje napromenljive razli�citih tipova.

Nije mogu�ce vr�siti dereferenciranje pokaziva�ca tipa void* jernije mogu�ce odrediti tip takvog izraza kao ni broj bajtova umemoriji koji predstavljaju njegovu vrednost.

Pre dereferenciranja, neophodno je konvertovati vrednost ovogpokaziva�ckog tipa u neki konkretan pokaziva�cki tip.

int a = 10;

void *p;

p = &a;

*(int*)p = 5;

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci

U jeziku C argumenti funkcija se uvek prenose po vrednosti.

Ukoliko �zelimo izmenu vrednosti argumenata funkcije, ondaargument mora da se prenese kao pokaziva�c.

void f(int *n) {

*n = *n + 3;

}

int main() {

...

f(&n);

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci

U slu�caju nizova, prenosi se adresa po�cetka niza, ne kopiraju sesvi elementi niza.

Prenos niza kao argumenta funkcijeint f(int niz[])

ekvivalentno je saint f(int * niz)

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci

Mogu�ce je de�nisati i pokaziva�ce na strukture.struct razlomak *pa = &a;

U slu�caju da se �clanovima strukture pristupa preko pokaziva�ca,umesto kombinacije operatora * i ., mogu�ce je koristitioperator ->:(*pa).imenilac <==> pa->imenilac

Îperator -> je operator najvi�seg prioriteta.

Prenos struktura u funkcije se naj�ce�s�ce vr�si preko adrese, tjpokaziva�ca.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Veza pokaziva�ca i nizova

Postoji �cvrsta veza izmedu pokaziva�ca i nizova.

Niz od deset elemenata tipa int

int a[10];

a uvek ukazuje na isti prostor koji je rezervisan za elementeniza tako da se ne mo�ze koristiti kao l-vrednost

Tip promenljive a je int [10] i mo�ze se po potrebikonvertovati u pokaziva�c int*

Vrednosti a odgovara pokaziva�c na prvi element niza (adresaelementa a[0]), vrednosti a+1 odgovara pokaziva�c na drugielement niza (adresa elementa a[1]).

Umesto &a[i] mo�ze se pisati a+i, a umesto a[i] mo�ze sepisati *(a+i).

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Veza pokaziva�ca i nizova

Ako je p pokaziva�c nekog tipa (npr. int* p) na njega mo�zebiti primenjen nizovski indeksni pristup (na primer, p[3]).

Vrednost takvog izraza odreduje se tako da se poklapa saodgovaraju�cim elementom niza koji bi po�cinjao na adresi p(bez obzira �sto p nije niz nego pokaziva�c).

Dakle, bez obzira da li je x pokaziva�c ili niz, x[n] isto je �sto i*(x+n), tj. x+n isto je �sto i &x[n].

Ovo je i �cest izvor gre�saka, naj�ce�s�ce prilikom alokacijememorije

int a[10];

int *b;

a[3] = 5; /* ok */

b[3] = 8; /* greska!!! */

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Veza pokaziva�ca i nizova

Izraz &a ima istu vrednost (tj. sadr�zi istu adresu) kao i a, alidruga�ciji tip � tip int (*)[10] � to je tip pokaziva�ca na nizod 10 elemenata koji su tipa int. Taj tip ima u narednomprimeru promenljiva c:

int a[10]; /*niz od 10 elemenata tipa int*/

int *b[10]; /*niz od 10 pokazivaca na int*/

int (*c)[10]; /*pokazivac na niz od 10

elemenata koji su tipa int*/

c = &a; /* (*c)[0] <==> a[0] */

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�cka aritmetika

Pokaziva�cka aritmetika se razlikuje od obi�cnog izra�cunavanja:izraz p+1 ne ozna�cava dodavanje vrednosti 1 na p, ve�cdodavanje du�zine jednog objekta tipa na koji ukazuje p.

Na primer, ako p ukazuje na int, onda p+1 i p mogu da serazlikuju za dva ili �cetiri � za onoliko koliko bajtova na tomsistemu zauzima podatak tipa int.

Od pokaziva�ca je mogu�ce oduzimati cele brojeve.

Pokaziva�ce nije mogu�ce sabirati (jer to nema smisla!), ali ihmo�zemo oduzimati (razlika je broj objekata izmedju).

Mogu�ce je koristiti operatore ++ i --

Pokaziva�ce je mogu�ce porediti.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Prioritet operatora

Operator Opis Asocijativnost

() Poziv funkcije sleva na desno

[] indeksni pristup elementu niza

. pristup �clanu strukture ili unije

-> pristup �clanu strukture ili unije preko pokaziva�ca

++ -- postfiksni inkrement/dekrement

------------------------------------------------------------------------

++ -- prefiksni inkrement/dekrement zdesna na levo

+ - unarni plus/minus

! ~ logi�cka negacija/bitski komplement

(type) eksplicitna konverzija tipa (cast)

* dereferenciranje

& referenciranje (adresa)

sizeof veli�cina u bajtovima

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Prioritet operatora

Unarni operatori & i * imaju vi�si prioritet nego binarniaritmeti�cki operatori.

Koje je zna�cenje izraza *p+1? Da li je to (*p)+1 ili *(p+1)?

Êîjå jå zna�cenje ++*p?

Koje je zna�cenje *p++? Da li se uzima vrednost na lokaciji p izatim inkrementira pokaziva�c ili se inkrementira sadr�zaj nalokaciji p?

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci i niske

Koja je razlika izmedu

char *p = "informatika";

char a[] = "informatika";

p je pokaziva�c za koji se memorija odvaja na steku, niskainformatika se �cuva u segmentu podataka

a je niz od 12 karaktera koji su inicijalizovani niskominformatika i za niz je rezervisana memorija na steku

p je pokaziva�c pa mo�ze da promeni vrednost (da pokazuje nane�sto drugo)

a je niz i ne mo�ze da promeni vrednost.

Promena vrednosti p[0] �ce pro�ci prevodenje, ali imanede�nisano pona�sanje u fazi izvr�savanja.

Promena vrednosti a[0] je regularna.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci i niske

int strlen(char s[])

{

int i, n=0;

for(i=0; s[i]!='\0'; i++)

n++;

return n;

}

int strlen(char s[])

{

int i=0;

while(s[i])

i++;

return i;

}

Povratna vrednost treba da bude tipa unsigned.size_t ozna�cava neozna�cen celobrojni tip, koji obi�cno slu�zi zareprezentovanje veli�cine objekata u memoriji � naj�ce�s�ce je tounsigned int.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

strlen

Êàko se funkcija strlen implementira kori�s�cenjem pokaziva�ckearitmetike?

int strlen(char s[])

{

int i, n=0;

for(i=0; s[i]!='\0'; i++)

n++;

return n;

}

int strlen(char s[])

{

int i=0;

while(s[i])

i++;

return i;

}

size_t strlen(const char *s) {

size_t n;

for (n = 0; *s != '\0'; s++)

n++;

return n;

}

size_t strlen(const char *s) {

const char* t = s;

while(*s)

s++;

return s - t;

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci i niske

Êàko se funkcija strlen implementira kori�s�cenjem pokaziva�ckearitmetike?

size_t strlen(const char *s) {

size_t n;

for (n = 0; *s != '\0'; s++)

n++;

return n;

}

size_t strlen(const char *s) {

const char* t = s;

while(*s)

s++;

return s - t;

}

Zbog neposrednih veza izmedu nizova i pokaziva�ca, strlen mo�ze dase primeni i na konstantnu nisku (npr strlen("informatika") i zaargument koji je ime niza (npr strlen(a) gde je niz deklarisan sachar a[10]) kao i za pokaziva�c (npr strlen(p) gde je p deklarisano sachar* p;)

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Vi�sedimenzioni nizovi

Pored jednodimenzionih mogu se koristiti i vi�sedimenzioninizovi, koji se deklari�su na slede�ci op�sti na�cin:

tip ime_niza[dimenzija_1]...[dimenzija_N];

Na primer, dvodimenzioni niz (matrica) sa celobrojnimelementima:

int a[10][20];

Dvodimenzioni nizovi (matrice) tuma�ce se kao jednodimenzioninizovi �ciji su elementi nizovi. Npr, svaki od izraza a[0], a[1],a[2] do a[9] ozna�cava niz od 20 elemenata tipa int.

Elementu i-te vrste i j-te kolone dvodimenzionalnog nizapristupa se sa:

a[i][j]

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Matrice

Inicijalizacija matrice (prikazati na steku):

char a[2][3] = {

{1, 2, 3},

{4, 5, 6}

};

Inkrementiranje svih elemenata matrice dimenzije nxm:

for(i=0; i<n; i++)

for(j=0; j<m; j++)

a[i][j]++;

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Matrice

Razni zadaci sa matricama

Izra�cunati ne�sto �sto je funkcija svih elemenata matrice (suma,maksimum, minimum...)Transfromisati elemenate matrice (apsolutne vrednosti,uve�canje, umanjenje...)Izra�cunati neku osobinu svake vrste/kolone matrice(maksimum/minimum, zbir, proizvod...)Koristiti samo deo matrice za izra�cunavanje (elemente ispodglavne dijagonale, elemente iznad sporedne dijagonale...)Na osnovu dve matrice formirati tre�cu (zbir, razlika, proizvod...)...

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Niz nizova i niz pokaziva�ca

int a[10][20]; /*Deset nizova od po 20 elemenata tipa int

200 lokacija za podatak tipa int

je rezervisano */

int *b[10]; /*Deset pokaziva�ca na int

deset pokaziva�ca na int je alocirano*/

U oba slu�caja mo�ze se pristupiti npr a[3][5] i b[3][5], ali uprvom slu�caju imamo alociran prostor za element a[3][5] dok udrugom slu�caju moramo da obezbedimo da pokaziva�c koji senalazi na poziciji b[3] bude pokaziva�c na niz koji sadr�zinajmanje 6 elemenata.

U slu�caju da za svaki pokaziva�c niza b obezbedimo dapokazuje na niz od po 20 elemenata, onda u tom slu�cajuimamo tih 200 lokacija plus 10 pokaziva�ca �sto zauzima vi�seprostora nego za a.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Niz nizova i niz pokaziva�ca

int a[10][20]; /*Deset nizova od po 20 elemenata tipa int

200 lokacija za podatak tipa int

je rezervisano */

int *b[10]; /*Deset pokaziva�ca na int

deset pokaziva�ca na int je alocirano*/

Elementi matrice a su na uzastopnim lokacijama u memorijidok elementi matrice b to ne moraju da budu.

Nizovi na koje pokazuju pokaziva�ci niza b ne moraju da buduistih veli�cina.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Niz nizova i niz pokaziva�ca

Prikazati memoriju za prvi i drugi primer

char meseci_nn[][10] = {

"Greska", "Januar", "Februar", "Mart", "April",

"Maj", "Jun", "Jul", "Avgust", "Septembar",

"Oktobar", "Novembar", "Decembar"};

char *meseci_np[] = {

"Greska", "Januar", "Februar", "Mart", "April",

"Maj", "Jun", "Jul", "Avgust", "Septembar",

"Oktobar", "Novembar", "Decembar"};

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci na funkcije

void povecaj1(int a[], int n, int b[]) {

int i;

for (i = 0; i < n; i++)

b[i] = a[i] + 1;

}

void pomnozi2(int a[], int n, int b[]) {

int i;

for (i = 0; i < n; i++)

b[i] = a[i] * 2;

}

void parni0(int a[], int n, int b[]) {

int i;

for (i = 0; i < n; i++)

b[i] = a[i] % 2 == 0 ? 0 : a[i];

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci na funkcije

void transformacija(int a[], int n, int b[], int (*f) (int)) {

int i;

for (i = 0; i < n; i++)

b[i] = (*f)(a[i]);

}

int uvecaj1(int x) { return x + 1; }

int pomnozi2(int x) { return 2 * x; }

int parni0(int x) { return x % 2 == 0 ? 0 : x; }

/*poziv funkcije map*/

transformacija(a, N, b, &uvecaj1);

transformacija(a, N, b, &pomnozi2);

transformacija(a, N, b, &parni0);

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci na funkcije

Pokaziva�ci na funkcije se razlikuju po tipu funkcije na kojeukazuju (po tipovima argumenata i tipu povratne vrednosti).

Deklaracija promenljive tipa pokaziva�ca na funkciju se vr�si tako�sto se ime promenljive kojem prethodi karakter * navede uzagradama kojima prethodi tip povratne vrednosti funkcije, aza kojima sledi lista tipova parametara funkcije.

double *a(double, int); /*Funkcija koja vraca pokazivac na

double i prima dva argumenta

double i int*/

double (*b)(double, int); /*Pokazivac na funkciju koja vraca

double i prima dva argumenta

double i int*/

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pokaziva�ciVeza pokaziva�ca i nizovaPokaziva�cka aritmetikaPokaziva�ci i niskeVi�sedimenzioni nizoviPokaziva�ci na funkcije

Pokaziva�ci na funkcije

Mogu�ce je kreirati i nizove pokaziva�ca na funkcije. Ovi nizovi semogu i incijalizovati (na uobi�cajeni na�cin). U primeru

int (*nf[3]) (int) = {&povecaj1, &pomnozi2, &parni0};

nf predstavlja niz od 3 pokaziva�ca na funkcije koje vra�caju int, iprimaju argument tipa int.Funkcije �cije se adrese nalaze u nizu se mogu direktno i pozvati.Na primer, naredni k�od ispisuje vrednost 4:

printf("%d", (*nf[0])(3));

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Pregled

1 Pokaziva�ci

2 Bibliote�cke funkcije l�nd, bsearch i qsortl�ndbsearchqsort

3 Literatura

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Bibliote�cke funkcije l�nd, bsearch i qsort

Algoritmi pretrage (linerana ili binarna) pretra�zuju niz ponekom klju�cu pretrage, vr�se�ci poredenje elemenata niza sadatim klju�cem.

Pretraga se uvek vr�si po istom algoritmu, razlika je samo utipu niza koji se pretra�zuje i u na�cinu poredenja elemenata.

Algoritam sortiranja sortira niz vr�se�ci poredenje elemenata naneki na�cin koji zavisi od tipa elemenata u nizu, i razmenuelemenata niza.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Bibliote�cke funkcije l�nd, bsearch i qsort

Poredenje u oba slu�caja se mo�ze izdvojiti u zasebnu funkciju

Mo�ze se de�nisati algoritam tako da mo�ze da se koristi zaproizvoljne tipove podataka.

Zavaljuju�ci tome, postoje bibliote�cke funkcije l�nd, bsearch iqsort koje se mogu primeniti za pretragu/sortiranje proizvoljnihnizova.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija l�nd

Funkcija l�nd vr�si linearnu pretragu elemenata niza i imanaredni potpisvoid *lfind(const void *x, void *array, int *n,

int s, int (*comp)(const void *, const void *));

Funkcija lfind vra�ca adresu elementa u nizu koji je jednaktra�zenom elementu, ili NULL ukoliko element nije pronaden.

Prvi argument je pokaziva�c na klju�c pretrage.

Drugi argument je adresa po�cetka niza

Tre�ci argument je adresa veli�cine niza.

�Cetvrti argument je veli�cina jednog elementa u nizu.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija l�nd

void *lfind(const void *x, void *array, int *n,

int s, int (*comp)(const void *, const void *));

Poslednji argument je pokaziva�c na funkciju poredenja kojade�ni�se na koji na�cin se vr�si pretra�zivanje po klju�cu.

Funkcija poredenja mora da ima naredni potpis:

int uporedi(const void* key, const void* pelem)

Prvi argument ove funkcije je klju�c pretrage, a drugi je elementniza.

Povratna vrednost funkcije poredenja je 0, ukoliko su elementijednaki, i vrednost razli�cita od nule, ukoliko nisu jednaki.

Da bi se koristila funkcija lfind, neophodno je de�nisatifunkciju poredenja.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija l�nd

Primer poziv-a funkcije lfind:

int niz[] = {1, 5, 2, 4, 3, 11, 12, 9, 6};

int* p = NULL;

int n = sizeof(niz) / sizeof(int);

int x = 8;

p = (int*)lfind(&x, niz, &n, sizeof(int), &uporedi);

if(p==NULL) printf("Broj nije pronadjen!\n");

else printf("Broj je pronadjen na poziciji %d.\n", p-niz);

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija l�nd

U slu�caju pretrage niza celih brojeva, funkcija poredenja sede�ni�se na slede�ci na�cin:int uporedi(const void* key, const void* pelem) {

int kljuc = *(int *)key;

int element_niza = *(int *)pelem;

if(kljuc == element_niza) return 0;

else return 1;

/* return kljuc - element_niza; */

}

/* skracen zapis */

int uporedi(const void* key, const void* pelem) {

return *(int *)key - *(int *)pelem;

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija l�nd

U slu�caju pretrage niza studenata, pri �cemu je studentde�nisan strukturom koja sadr�zi ime i prezime studenta i brojindeksa, funkcija uporedi se de�ni�se na slede�ci na�cin:int uporedi(const void* key, const void* pelem) {

student kljuc = *(student *)key;

student element_niza = *(student *)pelem;

if((strcmp(kljuc.ime, element_niza.ime) == 0) &&

(strcmp(kljuc.prezime, element_niza.prezime) == 0) &&

(kljuc.indeks == element_niza.indeks))

return 0;

return 1;

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija l�nd

Prethodni primer je podrazumevao da su klju�c pretrage ielement niza istog tipa.

Ukoliko �zelimo u nizu studenata da pronademo studenta saodredenim indeksom, onda funkciju poredenja pi�semo na drugina�cin:int uporedi(const void* key, const void* pelem) {

int kljuc = *(int *)key;

student element_niza = *(student *)pelem;

return (kljuc == element_niza.indeks ? 0 : 1);

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija bsearch

Funkcija bsearch vr�si binarnu pretragu niza za koji sepodrazumeva da je sortiranvoid *bsearch(const void *x, void *array, int n,

int s, int (*comp)(const void *, const void *));

Funkcija bsearch vra�ca adresu elementa u nizu koji je jednaktra�zenom elementu, ili NULL ukoliko element nije pronaden.

Prvi argument je pokaziva�c na klju�c pretrage.

Drugi argument je adresa po�cetka niza.

Tre�ci argument je veli�cina niza (nije adresa, kao �sto je to ulfind!).

�Cetvrti argument je veli�cina jednog elementa u nizu.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija bsearch

Poslednji argument je pokaziva�c na funkciju poredenja kojade�ni�se na koji na�cin se vr�si pretra�zivanje po klju�cu.

Funkcija poredenja mora da ima naredni potpis:

int uporedi(const void* key, const void* pelem)

Prvi argument ove funkcije je klju�c pretrage, a drugi je elementniza.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija bsearch

Povratna vrednost funkcije poredenja je

0 � ukoliko su elementi jednaki,vrednost manja od nule � ukoliko je klju�c pretage manji odelementa u nizuvrednost ve�ca od nule � ukoliko je klju�c pretrage ve�ci odelementa u nizu sa kojim se vr�si poredenje.

Da bi se koristila funkcija bsearch, neophodno je de�nisatifunkciju poredenja.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija bsearch

Primer poziv-a funkcije bsearch:

int niz[] = {1, 3, 5, 7, 8, 9, 13, 16, 18};

int* p = NULL;

int n = sizeof(niz) / sizeof(int);

int x = 16;

p = (int*)bsearch(&x, niz, n, sizeof(int), &uporedi);

if(p==NULL) printf("Broj nije pronadjen!\n");

else printf("Broj je pronadjen na poziciji %d.\n", p-niz);

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija bsearch

U slu�caju pretrage niza celih brojeva, funkcija poredenja sede�ni�se na slede�ci na�cin:int uporedi(const void* key, const void* pelem) {

int kljuc = *(int *)key;

int element_niza = *(int *)pelem;

if(kljuc < element_niza) return -1;

else if(kljuc > element_niza) return 1;

else return 0;

/* return kljuc - element_niza; */

}

/* skracen zapis */

int uporedi(const void* key, const void* pelem) {

return *(int *)key - *(int *)pelem;

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija qsort

Funkcija qsort vr�si sortiranje niza algoritmom brzog sortiranjavoid qsort(void *array, int n,

int s, int (*comp)(const void *, const void *));

Funkcija nema povratnu vrednost

Prvi argument je adresa po�cetka niza.

Drugi argument je veli�cina niza.

Tre�ci argument je veli�cina jednog elementa u nizu.

�Cetvrti argument je pokaziva�c na funkciju poredenja.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija qsort

Poslednji argument je pokaziva�c na funkciju poredenja kojade�ni�se na koji na�cin se vr�si poredenje elemenata u nizu.

Funkcija poredenja mora da ima naredni potpis:

int uporedi(const void* pa, const void* pb)

Oba argumenta ove funkcije su elementi niza!

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija qsort

Povratna vrednost funkcije poredenja je

0 � ukoliko su elementi jednaki,vrednost manja od nule � ukoliko je prvi argument manji oddrugog,vrednost ve�ca od nule � ukoliko je prvi argument ve�ci oddrugog.

Da bi se koristila funkcija qsort, neophodno je de�nisatifunkciju poredenja.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija qsort

Na primer, upotreba funkcije qsort za sortiranje niza celih brojeva:

int niz[] = {1, 5, 2, 4, 3, 11, 12, 9, 6};

int n = sizeof(niz) / sizeof(int);

qsort(niz, n, sizeof(int), &uporedi);

Niz mo�ze da bude stati�cki/dinami�cki alociran, elementi niza moguda su inicijalizovani ili da se unose sa standardnog ulaza/izdatoteke...Funkcija uporedi:

int uporedi(const void* pa, const void* pb) {

return *(int *)pa - *(int *)pb;

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija qsort

Mo�ze se sortirati niska karaktera. Na primer:

char niska[]="Informatika";

qsort(niska,sizeof(niska)/sizeof(char),sizeof(char),&cmp);

Za nisku karaktera, funkcija poredenja mo�ze se de�nisati na slede�cina�cin:

int cmp(const void* pa, const void* pb) {

return *(char *)pa - *(char *)pb;

}

Ukoliko �zelimo opadaju�ce sortiran niz:return *(char *)pb - *(char *)pa;

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija qsort

Sortiranje niza pokaziva�ca (nacrtati memoriju!):

char* reci[] = {"do", "while", "if", "switch",

"break", "continue"};

int n = sizeof(reci)/sizeof(char*);

qsort(reci, n, sizeof(char*), &uporedi);

Funkcija uporedi za leksikografsko sortiranje:

int uporedi(const void* pa, const void* pb) {

/*Element niza je pokazivac na nisku.

Funkciji se prosledjuje adresa jednog elementa niza,

dakle adresa pokazivaca na nisku.*/

char* s1 = *(char**)pa;

char* s2 = *(char**)pb;

return strcmp(s1,s2);

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija qsort

Sortiranje niza pokaziva�ca:

char* reci[] = {"do", "while", "if", "switch",

"break", "continue"};

int n = sizeof(reci)/sizeof(char*);

qsort(reci, n, sizeof(char*), &uporedi);

Funkcija uporedi za sortiranje po du�zini re�ci:

int uporedi(const void* pa, const void* pb) {

/*Element niza je pokazivac na nisku.

Funkciji se prosledjuje adresa jednog elementa niza,

dakle adresa pokazivaca na nisku.*/

char* s1 = *(char**)pa;

char* s2 = *(char**)pb;

return strlen(s1) - strlen(s2);

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija qsort

Funkcija uporedi za sortiranje po du�zini, ako su iste du�zine, ondaleksikografski:

int uporedi(const void* pa, const void* pb) {

char* s1 = *(char**)pa;

char* s2 = *(char**)pb;

int n1 = strlen(s1);

int n2 = strlen(s2);

if(n1==n2) return strcmp(s1,s2);

else return n1-n2;

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

l�ndbsearchqsort

Funkcija qsort

Ukoliko imamo niz nizova, na primer

char niz_nizova[][10]={"do", "while", "if", "switch",

"break", "continue"};

Va�ze druga�cija pravila, nacrtati memoriju, napisati funkcijuporedenja.

Koriste�ci qsort, sortirati nizove struktura po razli�citimkriterijumima...

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Pregled

1 Pokaziva�ci

2 Bibliote�cke funkcije l�nd, bsearch i qsort

3 Literatura

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pokaziva�ciBibliote�cke funkcije l�nd, bsearch i qsort

Literatura

Literatura

Slajdovi su pripremljeni na osnovu desetog poglavlja knjigeFilip Mari�c, Predrag Jani�ci�c: Programiranje 1i �sestog poglavlja knjigePredrag Jani�ci�c, Filip Mari�c: Programiranje 2

Za pripremu ispita, slajdovi nisu dovoljni, neophodno jekoristiti knjigu!

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2