programiranje 2 · pdf fileprogramiranje 2 pokaziva ci milena vujo sevi c jani ci c jelena...
TRANSCRIPT
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, 12. april, 2016.
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