Top Banner
Složeni tipovi podataka Složeni tipovi ? C raspolaže sljedećim složenim tipovima podataka: polja (indeksirane promjenljive) jednodimenzionalno = NIZ, dvodimenzionalno = MATRICA, višedimenzionalno strukture unije
54

Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Jul 08, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Složeni tipovi podataka

Složeni tipovi

C raspolaže sljedećim složenim

tipovima podataka

polja (indeksirane promjenljive)

jednodimenzionalno = NIZ

dvodimenzionalno = MATRICA

višedimenzionalno

strukture

unije

Polja

NIZOVI

Nizovi

Niz ili vektor je jednodimenzionalno polje

To je skup podataka istog tipa

U memoriji se smješta u niz uzastopnih mem lokacija

Svi podaci u nizu imaju jedno ime = IME NIZA

Ime niza predstavlja početnu adresu niza u memoriji

Svaki element u nizu određen je

imenom niza i

indeksom (pomjerajem u

odnosu na početak niza)

MEMORIJA

niz[0]

niz[1]

niz[2]

niz[3]

niz[4]

niz[5]

niz[6]

niz[7]

Polja

NIZOVI

Deklaracija niza Opšti oblik deklaracije

tip ime_niza [broj_elemenata] = lista vrijednosti

tip niza

(tip podataka u nizu)

ime niza

(identifikator u skladu sa

sintaksom jezika važe sva

pravila kao i za skalarne

promjenljive) broj elemenata u nizu

(cjelobrojna konstanta)

(rezerviše se potreban

broj bajtova za

memorisanje deklarisanog

broja elemenata)

vrijednosti elemenata u nizu

(inicijalizacija niza)

(nije obavezno inicijalizovanje)

(vrijednosti se razdvajaju

zapetama)

Polja

NIZOVI

Deklaracija niza

Primjer deklaracije

int niz[5]

char tekst[10]

MEMORIJA

tekst

101B = 10B

niz

52B = 10B

niz[0]

niz[1]

niz[2]

niz[3]

niz[4]

tekst[0]

tekst[1]

tekst[9]

Primjer

define MAX 5

define LENG 10

main()

int niz[MAX]

char tekst[LENG]

Polja

NIZOVI

Deklaracija niza Primjer deklaracije sa inicijalizacijom

int A[3]=123

3 1 2

A[2] A[0] A[1]

B[2] B[0] B[1]

3 1 2 4

B[3]

C[2] C[0] C[1]

0 10 0 0

C[3]

0

C[4]

D[2] D[0] D[1]

0 0 0 0

D[3]

0

D[4]

int B[]=1234

int C[5]=10

int D[5]=0

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati redoslijedom kojim su učitani

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=0 iltn i++ )

printf(rdquo drdquo niz[i])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = 0 n-1

niz[i]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati obrnutim redoslijedom include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo

ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d

brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=n igt=1 i++ )

printf(rdquo drdquo niz[i-1])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = n 1

niz[i-1]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa

ispisati njihovu aritmetičku sredinu i

one učitane brojeve koji su veći od sredine

POČETAK

n

ISTINA n lt 1

LAŽ

i = 0 n-1

niz[i]

s = 0

s = s + niz[i]

T

KRAJ

i = 0 n-1

T

as = sn

LAŽ ISTINA

niz[i]

niz[i]gtas

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int ins=0

float as

do

printf(rdquon=rdquo)

scanf(rdquodrdquo ampn)

while (nlt1)

for (i=0ilt=n-1i++)

printf(rdquoUnesite brojrdquo)

scanf(rdquodrdquo ampniz[i])

s+=niz[i]

as=(float)s n

printf(rdquoSredina 73fnrdquoas)

printf(rdquoVeci su rdquo)

for ( i=0 iltn i++ )

if (niz[i]gtas)

printf(rdquo drdquo niz[i])

Polja NIZOVI

Primjer Program koji učitava niz cijelih brojeva a zatim ih ispisuje u rastućem

redoslijedu

Sortiranje niza

Sortiranje je postupak kojim se mijenja poredak elemenata

u nizu kako bi se podaci doveli u željeni redoslijed

rastući (ascending)

opadajući (descending)

Rješenje problema

Postoji velik broj algoritama za sortiranje

Najpopularniji algoritmi za sortiranje

select-sort

bubble-sort

quick-sort

shell-sort

stack-sort

SORTIRANJE

Polja NIZOVI

SELECT-SORT

SORTIRANJE

int i j niz[] = 5 2 9 4 pom

for(i=0 ilt3 i++) N-1 PROLAZA

for(j=i+1 jlt4 j++)

if(niz[i]gtniz[j])

pom = niz[i]

niz[i]=niz[j]

niz[j] = pom

2 4 5 9

niz[] pom

9

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 2: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja

NIZOVI

Nizovi

Niz ili vektor je jednodimenzionalno polje

To je skup podataka istog tipa

U memoriji se smješta u niz uzastopnih mem lokacija

Svi podaci u nizu imaju jedno ime = IME NIZA

Ime niza predstavlja početnu adresu niza u memoriji

Svaki element u nizu određen je

imenom niza i

indeksom (pomjerajem u

odnosu na početak niza)

MEMORIJA

niz[0]

niz[1]

niz[2]

niz[3]

niz[4]

niz[5]

niz[6]

niz[7]

Polja

NIZOVI

Deklaracija niza Opšti oblik deklaracije

tip ime_niza [broj_elemenata] = lista vrijednosti

tip niza

(tip podataka u nizu)

ime niza

(identifikator u skladu sa

sintaksom jezika važe sva

pravila kao i za skalarne

promjenljive) broj elemenata u nizu

(cjelobrojna konstanta)

(rezerviše se potreban

broj bajtova za

memorisanje deklarisanog

broja elemenata)

vrijednosti elemenata u nizu

(inicijalizacija niza)

(nije obavezno inicijalizovanje)

(vrijednosti se razdvajaju

zapetama)

Polja

NIZOVI

Deklaracija niza

Primjer deklaracije

int niz[5]

char tekst[10]

MEMORIJA

tekst

101B = 10B

niz

52B = 10B

niz[0]

niz[1]

niz[2]

niz[3]

niz[4]

tekst[0]

tekst[1]

tekst[9]

Primjer

define MAX 5

define LENG 10

main()

int niz[MAX]

char tekst[LENG]

Polja

NIZOVI

Deklaracija niza Primjer deklaracije sa inicijalizacijom

int A[3]=123

3 1 2

A[2] A[0] A[1]

B[2] B[0] B[1]

3 1 2 4

B[3]

C[2] C[0] C[1]

0 10 0 0

C[3]

0

C[4]

D[2] D[0] D[1]

0 0 0 0

D[3]

0

D[4]

int B[]=1234

int C[5]=10

int D[5]=0

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati redoslijedom kojim su učitani

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=0 iltn i++ )

printf(rdquo drdquo niz[i])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = 0 n-1

niz[i]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati obrnutim redoslijedom include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo

ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d

brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=n igt=1 i++ )

printf(rdquo drdquo niz[i-1])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = n 1

niz[i-1]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa

ispisati njihovu aritmetičku sredinu i

one učitane brojeve koji su veći od sredine

POČETAK

n

ISTINA n lt 1

LAŽ

i = 0 n-1

niz[i]

s = 0

s = s + niz[i]

T

KRAJ

i = 0 n-1

T

as = sn

LAŽ ISTINA

niz[i]

niz[i]gtas

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int ins=0

float as

do

printf(rdquon=rdquo)

scanf(rdquodrdquo ampn)

while (nlt1)

for (i=0ilt=n-1i++)

printf(rdquoUnesite brojrdquo)

scanf(rdquodrdquo ampniz[i])

s+=niz[i]

as=(float)s n

printf(rdquoSredina 73fnrdquoas)

printf(rdquoVeci su rdquo)

for ( i=0 iltn i++ )

if (niz[i]gtas)

printf(rdquo drdquo niz[i])

Polja NIZOVI

Primjer Program koji učitava niz cijelih brojeva a zatim ih ispisuje u rastućem

redoslijedu

Sortiranje niza

Sortiranje je postupak kojim se mijenja poredak elemenata

u nizu kako bi se podaci doveli u željeni redoslijed

rastući (ascending)

opadajući (descending)

Rješenje problema

Postoji velik broj algoritama za sortiranje

Najpopularniji algoritmi za sortiranje

select-sort

bubble-sort

quick-sort

shell-sort

stack-sort

SORTIRANJE

Polja NIZOVI

SELECT-SORT

SORTIRANJE

int i j niz[] = 5 2 9 4 pom

for(i=0 ilt3 i++) N-1 PROLAZA

for(j=i+1 jlt4 j++)

if(niz[i]gtniz[j])

pom = niz[i]

niz[i]=niz[j]

niz[j] = pom

2 4 5 9

niz[] pom

9

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 3: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja

NIZOVI

Deklaracija niza Opšti oblik deklaracije

tip ime_niza [broj_elemenata] = lista vrijednosti

tip niza

(tip podataka u nizu)

ime niza

(identifikator u skladu sa

sintaksom jezika važe sva

pravila kao i za skalarne

promjenljive) broj elemenata u nizu

(cjelobrojna konstanta)

(rezerviše se potreban

broj bajtova za

memorisanje deklarisanog

broja elemenata)

vrijednosti elemenata u nizu

(inicijalizacija niza)

(nije obavezno inicijalizovanje)

(vrijednosti se razdvajaju

zapetama)

Polja

NIZOVI

Deklaracija niza

Primjer deklaracije

int niz[5]

char tekst[10]

MEMORIJA

tekst

101B = 10B

niz

52B = 10B

niz[0]

niz[1]

niz[2]

niz[3]

niz[4]

tekst[0]

tekst[1]

tekst[9]

Primjer

define MAX 5

define LENG 10

main()

int niz[MAX]

char tekst[LENG]

Polja

NIZOVI

Deklaracija niza Primjer deklaracije sa inicijalizacijom

int A[3]=123

3 1 2

A[2] A[0] A[1]

B[2] B[0] B[1]

3 1 2 4

B[3]

C[2] C[0] C[1]

0 10 0 0

C[3]

0

C[4]

D[2] D[0] D[1]

0 0 0 0

D[3]

0

D[4]

int B[]=1234

int C[5]=10

int D[5]=0

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati redoslijedom kojim su učitani

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=0 iltn i++ )

printf(rdquo drdquo niz[i])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = 0 n-1

niz[i]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati obrnutim redoslijedom include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo

ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d

brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=n igt=1 i++ )

printf(rdquo drdquo niz[i-1])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = n 1

niz[i-1]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa

ispisati njihovu aritmetičku sredinu i

one učitane brojeve koji su veći od sredine

POČETAK

n

ISTINA n lt 1

LAŽ

i = 0 n-1

niz[i]

s = 0

s = s + niz[i]

T

KRAJ

i = 0 n-1

T

as = sn

LAŽ ISTINA

niz[i]

niz[i]gtas

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int ins=0

float as

do

printf(rdquon=rdquo)

scanf(rdquodrdquo ampn)

while (nlt1)

for (i=0ilt=n-1i++)

printf(rdquoUnesite brojrdquo)

scanf(rdquodrdquo ampniz[i])

s+=niz[i]

as=(float)s n

printf(rdquoSredina 73fnrdquoas)

printf(rdquoVeci su rdquo)

for ( i=0 iltn i++ )

if (niz[i]gtas)

printf(rdquo drdquo niz[i])

Polja NIZOVI

Primjer Program koji učitava niz cijelih brojeva a zatim ih ispisuje u rastućem

redoslijedu

Sortiranje niza

Sortiranje je postupak kojim se mijenja poredak elemenata

u nizu kako bi se podaci doveli u željeni redoslijed

rastući (ascending)

opadajući (descending)

Rješenje problema

Postoji velik broj algoritama za sortiranje

Najpopularniji algoritmi za sortiranje

select-sort

bubble-sort

quick-sort

shell-sort

stack-sort

SORTIRANJE

Polja NIZOVI

SELECT-SORT

SORTIRANJE

int i j niz[] = 5 2 9 4 pom

for(i=0 ilt3 i++) N-1 PROLAZA

for(j=i+1 jlt4 j++)

if(niz[i]gtniz[j])

pom = niz[i]

niz[i]=niz[j]

niz[j] = pom

2 4 5 9

niz[] pom

9

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 4: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja

NIZOVI

Deklaracija niza

Primjer deklaracije

int niz[5]

char tekst[10]

MEMORIJA

tekst

101B = 10B

niz

52B = 10B

niz[0]

niz[1]

niz[2]

niz[3]

niz[4]

tekst[0]

tekst[1]

tekst[9]

Primjer

define MAX 5

define LENG 10

main()

int niz[MAX]

char tekst[LENG]

Polja

NIZOVI

Deklaracija niza Primjer deklaracije sa inicijalizacijom

int A[3]=123

3 1 2

A[2] A[0] A[1]

B[2] B[0] B[1]

3 1 2 4

B[3]

C[2] C[0] C[1]

0 10 0 0

C[3]

0

C[4]

D[2] D[0] D[1]

0 0 0 0

D[3]

0

D[4]

int B[]=1234

int C[5]=10

int D[5]=0

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati redoslijedom kojim su učitani

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=0 iltn i++ )

printf(rdquo drdquo niz[i])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = 0 n-1

niz[i]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati obrnutim redoslijedom include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo

ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d

brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=n igt=1 i++ )

printf(rdquo drdquo niz[i-1])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = n 1

niz[i-1]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa

ispisati njihovu aritmetičku sredinu i

one učitane brojeve koji su veći od sredine

POČETAK

n

ISTINA n lt 1

LAŽ

i = 0 n-1

niz[i]

s = 0

s = s + niz[i]

T

KRAJ

i = 0 n-1

T

as = sn

LAŽ ISTINA

niz[i]

niz[i]gtas

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int ins=0

float as

do

printf(rdquon=rdquo)

scanf(rdquodrdquo ampn)

while (nlt1)

for (i=0ilt=n-1i++)

printf(rdquoUnesite brojrdquo)

scanf(rdquodrdquo ampniz[i])

s+=niz[i]

as=(float)s n

printf(rdquoSredina 73fnrdquoas)

printf(rdquoVeci su rdquo)

for ( i=0 iltn i++ )

if (niz[i]gtas)

printf(rdquo drdquo niz[i])

Polja NIZOVI

Primjer Program koji učitava niz cijelih brojeva a zatim ih ispisuje u rastućem

redoslijedu

Sortiranje niza

Sortiranje je postupak kojim se mijenja poredak elemenata

u nizu kako bi se podaci doveli u željeni redoslijed

rastući (ascending)

opadajući (descending)

Rješenje problema

Postoji velik broj algoritama za sortiranje

Najpopularniji algoritmi za sortiranje

select-sort

bubble-sort

quick-sort

shell-sort

stack-sort

SORTIRANJE

Polja NIZOVI

SELECT-SORT

SORTIRANJE

int i j niz[] = 5 2 9 4 pom

for(i=0 ilt3 i++) N-1 PROLAZA

for(j=i+1 jlt4 j++)

if(niz[i]gtniz[j])

pom = niz[i]

niz[i]=niz[j]

niz[j] = pom

2 4 5 9

niz[] pom

9

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 5: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja

NIZOVI

Deklaracija niza Primjer deklaracije sa inicijalizacijom

int A[3]=123

3 1 2

A[2] A[0] A[1]

B[2] B[0] B[1]

3 1 2 4

B[3]

C[2] C[0] C[1]

0 10 0 0

C[3]

0

C[4]

D[2] D[0] D[1]

0 0 0 0

D[3]

0

D[4]

int B[]=1234

int C[5]=10

int D[5]=0

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati redoslijedom kojim su učitani

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=0 iltn i++ )

printf(rdquo drdquo niz[i])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = 0 n-1

niz[i]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati obrnutim redoslijedom include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo

ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d

brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=n igt=1 i++ )

printf(rdquo drdquo niz[i-1])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = n 1

niz[i-1]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa

ispisati njihovu aritmetičku sredinu i

one učitane brojeve koji su veći od sredine

POČETAK

n

ISTINA n lt 1

LAŽ

i = 0 n-1

niz[i]

s = 0

s = s + niz[i]

T

KRAJ

i = 0 n-1

T

as = sn

LAŽ ISTINA

niz[i]

niz[i]gtas

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int ins=0

float as

do

printf(rdquon=rdquo)

scanf(rdquodrdquo ampn)

while (nlt1)

for (i=0ilt=n-1i++)

printf(rdquoUnesite brojrdquo)

scanf(rdquodrdquo ampniz[i])

s+=niz[i]

as=(float)s n

printf(rdquoSredina 73fnrdquoas)

printf(rdquoVeci su rdquo)

for ( i=0 iltn i++ )

if (niz[i]gtas)

printf(rdquo drdquo niz[i])

Polja NIZOVI

Primjer Program koji učitava niz cijelih brojeva a zatim ih ispisuje u rastućem

redoslijedu

Sortiranje niza

Sortiranje je postupak kojim se mijenja poredak elemenata

u nizu kako bi se podaci doveli u željeni redoslijed

rastući (ascending)

opadajući (descending)

Rješenje problema

Postoji velik broj algoritama za sortiranje

Najpopularniji algoritmi za sortiranje

select-sort

bubble-sort

quick-sort

shell-sort

stack-sort

SORTIRANJE

Polja NIZOVI

SELECT-SORT

SORTIRANJE

int i j niz[] = 5 2 9 4 pom

for(i=0 ilt3 i++) N-1 PROLAZA

for(j=i+1 jlt4 j++)

if(niz[i]gtniz[j])

pom = niz[i]

niz[i]=niz[j]

niz[j] = pom

2 4 5 9

niz[] pom

9

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 6: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati redoslijedom kojim su učitani

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=0 iltn i++ )

printf(rdquo drdquo niz[i])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = 0 n-1

niz[i]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati obrnutim redoslijedom include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo

ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d

brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=n igt=1 i++ )

printf(rdquo drdquo niz[i-1])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = n 1

niz[i-1]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa

ispisati njihovu aritmetičku sredinu i

one učitane brojeve koji su veći od sredine

POČETAK

n

ISTINA n lt 1

LAŽ

i = 0 n-1

niz[i]

s = 0

s = s + niz[i]

T

KRAJ

i = 0 n-1

T

as = sn

LAŽ ISTINA

niz[i]

niz[i]gtas

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int ins=0

float as

do

printf(rdquon=rdquo)

scanf(rdquodrdquo ampn)

while (nlt1)

for (i=0ilt=n-1i++)

printf(rdquoUnesite brojrdquo)

scanf(rdquodrdquo ampniz[i])

s+=niz[i]

as=(float)s n

printf(rdquoSredina 73fnrdquoas)

printf(rdquoVeci su rdquo)

for ( i=0 iltn i++ )

if (niz[i]gtas)

printf(rdquo drdquo niz[i])

Polja NIZOVI

Primjer Program koji učitava niz cijelih brojeva a zatim ih ispisuje u rastućem

redoslijedu

Sortiranje niza

Sortiranje je postupak kojim se mijenja poredak elemenata

u nizu kako bi se podaci doveli u željeni redoslijed

rastući (ascending)

opadajući (descending)

Rješenje problema

Postoji velik broj algoritama za sortiranje

Najpopularniji algoritmi za sortiranje

select-sort

bubble-sort

quick-sort

shell-sort

stack-sort

SORTIRANJE

Polja NIZOVI

SELECT-SORT

SORTIRANJE

int i j niz[] = 5 2 9 4 pom

for(i=0 ilt3 i++) N-1 PROLAZA

for(j=i+1 jlt4 j++)

if(niz[i]gtniz[j])

pom = niz[i]

niz[i]=niz[j]

niz[j] = pom

2 4 5 9

niz[] pom

9

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 7: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa ih

ispisati obrnutim redoslijedom include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int in

do

printf(rdquon=rdquo) scanf(rdquodrdquo

ampn)

while (nlt1)

for ( i=1 ilt=n i++ )

printf(rdquoUnesite d

brojrdquo)

scanf(rdquodrdquo ampniz[i-1])

printf(rdquoUnijeli ste rdquo)

for ( i=n igt=1 i++ )

printf(rdquo drdquo niz[i-1])

POČETAK

n

ISTINA n lt 1

LAŽ

KRAJ

i = 1 n

niz[i-1]

i = n 1

niz[i-1]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa

ispisati njihovu aritmetičku sredinu i

one učitane brojeve koji su veći od sredine

POČETAK

n

ISTINA n lt 1

LAŽ

i = 0 n-1

niz[i]

s = 0

s = s + niz[i]

T

KRAJ

i = 0 n-1

T

as = sn

LAŽ ISTINA

niz[i]

niz[i]gtas

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int ins=0

float as

do

printf(rdquon=rdquo)

scanf(rdquodrdquo ampn)

while (nlt1)

for (i=0ilt=n-1i++)

printf(rdquoUnesite brojrdquo)

scanf(rdquodrdquo ampniz[i])

s+=niz[i]

as=(float)s n

printf(rdquoSredina 73fnrdquoas)

printf(rdquoVeci su rdquo)

for ( i=0 iltn i++ )

if (niz[i]gtas)

printf(rdquo drdquo niz[i])

Polja NIZOVI

Primjer Program koji učitava niz cijelih brojeva a zatim ih ispisuje u rastućem

redoslijedu

Sortiranje niza

Sortiranje je postupak kojim se mijenja poredak elemenata

u nizu kako bi se podaci doveli u željeni redoslijed

rastući (ascending)

opadajući (descending)

Rješenje problema

Postoji velik broj algoritama za sortiranje

Najpopularniji algoritmi za sortiranje

select-sort

bubble-sort

quick-sort

shell-sort

stack-sort

SORTIRANJE

Polja NIZOVI

SELECT-SORT

SORTIRANJE

int i j niz[] = 5 2 9 4 pom

for(i=0 ilt3 i++) N-1 PROLAZA

for(j=i+1 jlt4 j++)

if(niz[i]gtniz[j])

pom = niz[i]

niz[i]=niz[j]

niz[j] = pom

2 4 5 9

niz[] pom

9

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 8: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja NIZOVI

Primjer Učitati niz od n cijelih brojeva pa

ispisati njihovu aritmetičku sredinu i

one učitane brojeve koji su veći od sredine

POČETAK

n

ISTINA n lt 1

LAŽ

i = 0 n-1

niz[i]

s = 0

s = s + niz[i]

T

KRAJ

i = 0 n-1

T

as = sn

LAŽ ISTINA

niz[i]

niz[i]gtas

include ltstdiohgt

define MAX 100

main()

int niz[MAX]

int ins=0

float as

do

printf(rdquon=rdquo)

scanf(rdquodrdquo ampn)

while (nlt1)

for (i=0ilt=n-1i++)

printf(rdquoUnesite brojrdquo)

scanf(rdquodrdquo ampniz[i])

s+=niz[i]

as=(float)s n

printf(rdquoSredina 73fnrdquoas)

printf(rdquoVeci su rdquo)

for ( i=0 iltn i++ )

if (niz[i]gtas)

printf(rdquo drdquo niz[i])

Polja NIZOVI

Primjer Program koji učitava niz cijelih brojeva a zatim ih ispisuje u rastućem

redoslijedu

Sortiranje niza

Sortiranje je postupak kojim se mijenja poredak elemenata

u nizu kako bi se podaci doveli u željeni redoslijed

rastući (ascending)

opadajući (descending)

Rješenje problema

Postoji velik broj algoritama za sortiranje

Najpopularniji algoritmi za sortiranje

select-sort

bubble-sort

quick-sort

shell-sort

stack-sort

SORTIRANJE

Polja NIZOVI

SELECT-SORT

SORTIRANJE

int i j niz[] = 5 2 9 4 pom

for(i=0 ilt3 i++) N-1 PROLAZA

for(j=i+1 jlt4 j++)

if(niz[i]gtniz[j])

pom = niz[i]

niz[i]=niz[j]

niz[j] = pom

2 4 5 9

niz[] pom

9

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 9: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja NIZOVI

Primjer Program koji učitava niz cijelih brojeva a zatim ih ispisuje u rastućem

redoslijedu

Sortiranje niza

Sortiranje je postupak kojim se mijenja poredak elemenata

u nizu kako bi se podaci doveli u željeni redoslijed

rastući (ascending)

opadajući (descending)

Rješenje problema

Postoji velik broj algoritama za sortiranje

Najpopularniji algoritmi za sortiranje

select-sort

bubble-sort

quick-sort

shell-sort

stack-sort

SORTIRANJE

Polja NIZOVI

SELECT-SORT

SORTIRANJE

int i j niz[] = 5 2 9 4 pom

for(i=0 ilt3 i++) N-1 PROLAZA

for(j=i+1 jlt4 j++)

if(niz[i]gtniz[j])

pom = niz[i]

niz[i]=niz[j]

niz[j] = pom

2 4 5 9

niz[] pom

9

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 10: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja NIZOVI

SELECT-SORT

SORTIRANJE

int i j niz[] = 5 2 9 4 pom

for(i=0 ilt3 i++) N-1 PROLAZA

for(j=i+1 jlt4 j++)

if(niz[i]gtniz[j])

pom = niz[i]

niz[i]=niz[j]

niz[j] = pom

2 4 5 9

niz[] pom

9

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 11: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja MATRICE

Dvodimenzionalna polja

Element niza može da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)

0 1 j m-1

0

1

i

n-1

red (vrsta)

kolona

(stupac) mat[i][j]

mat[1][0]

mat[n-1][m-1]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 12: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja MATRICE

Deklaracija matrice

Opšti oblik deklaracije

tip ime_mat [D1][D2] = L1L2Ln-1

tip matrice

(tip podataka) ime matrice

dimenzije matrice

D1 = broj redova

D2 = broj kolona

rezerviše se potreban broj bajtova

za memorisanje D1D2 elemenata

vrijednosti elemenata u matrici

inicijalizacija matrice

nije obavezno inicijalizovanje

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 13: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

MEMORIJA

fizička predstava

Polja MATRICE

Deklaracija matrice

Primjer deklaracije

char tablica[2][3]

2 0 1

0

1

logička predstava tablica[0][0]

tablica[0][1]

tablica[0][2]

tablica[1][0]

tablica[1][1]

tablica[1][2]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 14: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja MATRICE

Deklaracija matrice Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318 256

2 0 1

8 3 1

6 2 5

0

1

Primjer deklaracije sa inicijalizacijom

int mat[2][3] = 318

2 0 1

8 3 1

0 0 0

0

1

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 15: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja MATRICE

Manipulacija matricom Primjer učitavanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquomat[d][d]=rdquored-1kol-1)

scanf(rdquodrdquo ampmat[red-1][kol-1])

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquomat[d][d]=rdquoredkol)

scanf(rdquodrdquo ampmat[red][kol])

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 16: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja MATRICE

Manipulacija matricom

Primjer ispisivanja matrice

for ( red=1 redlt=n red++ )

for ( kol=1 kollt=m kol++ )

printf(rdquo 4drdquomat[red-1][kol-1])

printf(rdquonrdquo)

ili

for ( red=0 redltn red++ )

for ( kol=0 kolltm kol++ )

printf(rdquo 4drdquomat[red][kol])

printf(rdquonrdquo)

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 17: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja MATRICE

Manipulacija matricom

Primjer manipulacije glavnom dijagonalom

mat[0][0]

mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali

printf(rdquoGlavna dijagonala rdquo)

for ( i=0 iltn i++ ) printf(rdquo drdquo

mat[i][i])

Suma elemenata na glavnoj dijagonali

for ( s=i=0 iltn i++ ) s+=mat[i][i]

printf(rdquoSuma elemenata na GD drdquos)

mat[i][j] i=j

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 18: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

transponovana

matrica

Polja MATRICE

Manipulacija matricom

Primjer transponovanja matrice

2

3

1 4

6

5

7

8

9

3 2

6 4

7 8

1

5

9

polazna matrica

Ispis transponovane matrice

na osnovu originalne matrice

printf(rdquoTransponovanan rdquo)

for ( i=0 iltn i++ )

for ( j=0 jltn j++ )

printf(rdquo 4drdquo

mat[j][i])

printf(rdquonrdquo)

Transponovanje matrice

for ( i=0 iltn i++ )

for ( j=i+1 jltn j++

)

pom=mat[i][j])

mat[i][j]=mat[j][i]

mat[j][i]=pom

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 19: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja MATRICE

Manipulacija matricom

Primjer množenja dvije matrice

3 2

1 0

1

2

6 4 5

Matrica A

(mn)

3 2

1 4

7 1

1

2

0

Matrica B

(np)

Matrica C

(mp)

30

66

15

9

24

4

5

17

3

Množenje matrica

for ( i=0 iltm i++ ) red matrice C

for ( j=0 jltp j++ ) kolona matrice C

for ( k=0 kltn k++ )

c[i][j]+=a[i][k]b[k][j]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 20: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja VIŠE DIMENZIJE

Višedimenzionalna polja

C omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno polje

tip ime[d1][d2][d3]

Primjer deklaracije

int kocka[3][6][6]

Primjer 4-dim polja

char P4[d1][d2][d3][d4]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 21: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja - Funkcije prenos VEKTORA u

funkciju

VEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adrese

1 prilikom poziva funkcije šalje se adresa niza (vektora)

bull kao stvarni argument navodi se ime niza

(ime niza je početna adresa niza)

2 funkcija prihvata adresu niza

bull formalni argument u definicji funkcije mora da sadrži [ ]

broj elemenata niza ne mora da se navodi

bull ne stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima

a ne kopijom niza Zato funkcija može da promijeni niz

pa po povratku iz funkcije nemamo originalni nego

modifikovani niz

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 22: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji pronalazi najveći element u nizu

include ltstdiohgt

int max ( int niz[] int n)

main()

int a[] = 215508

int n = 5

printf(rdquoNajveci dnrdquo max( an )

)

int max ( int niz[] int n )

int i m=niz[0]

for (i=1 iltn i++)

if (niz[i]gtm) m=a[i]

return (m)

Najveci 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 23: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja - Funkcije prenos VEKTORA u

funkciju

Primjer Program koji sortira i ispisuje niz korišćenjem funkcija

include ltstdiohgt

void sort ( int niz[] int n)

void pisi ( int niz[] int n)

main()

int a[] = 215508

printf(rdquoPrijerdquo) pisi( an )

sort( an )

printf(rdquoPoslijerdquo) pisi( an

)

void pisi ( int niz[] int n )

int i

for (i=0 iltn i++)

printf(rdquo drdquo niz[i])

printf(rdquonrdquo)

void sort ( int niz[] int

n )

int ijrbpom

for (i=0 iltn-1 i++)

for (rb=i j=i+1 jltn

j++)

if (niz[j]ltniz[rb])

rb=j

if (rb=i)

pom=niz[i]

niz[i]=niz[rb]

niz[rb]=pom

Prije 2 15 5 0 8

Poslije 0 2 5 8 15

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 24: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja - Funkcije prenos MATRICE u

funkciju

VIŠEDIMENZIONALNO polje kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara

bull prva dimenzija ne mora da se navede (može samo [ ] )

bull ostale dimenzije moraju da se navedu

Primjer

int funkcija (int a[][10][10] int p int q)

ili

int funkcija (int a[10][10][10] int p int q)

U funkciji se manipuliše stvarnim podacima

a ne kopijom polja Zato po povratku iz funkcije

nemamo originalno nego modifikovano polje

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 25: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Polja - Funkcije prenos MATRICE u

funkciju

Primjer Program koji transponuje kvadratnu matricu

include ltstdiohgt

void tran ( int m[10][10] int n)

void pisi ( int m[10][10] int n)

main()

int a[10][10] = 1234

printf(rdquoPrijenrdquo) pisi(an)

tran( an )

printf(rdquoPoslijenrdquo) pisi(an)

void pisi (int m[10][10] int n)

int ij

for (i=0 iltn i++)

for (j=0 jltn j++)

printf(rdquo 4drdquo m[i][j])

printf(rdquonrdquo)

void tran (int m[10][10] int n)

int ijpom

for (i=0 iltn i++)

for (j=i+1 jltn j++)

pom=m[i][j]

m[i][j]=m[j][i]

m[j][i]=pom

Prije

1 2

3 4

Poslije

1 3

2 4

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 26: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) POINTERI

Pokazivači (Pointeri)

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje ndash tada je to adresa početnog elementa polja

ako je u pitanju funkcija ndash tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q kažemo da p pokazuje na q

Primjer

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača

tip ime

Primjer

int pi

char pc

tekst

100 p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 27: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima

Adresni operator amp

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

ampq daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=ampq

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva a p

pokazivač na isti tip tada se može pisati

s=p

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=ampq 100 p

p=ampq

65 s

s=p

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 28: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) POINTERI

Operatori za rad sa pokazivačima Adresni operator amp i operator indirekcije su INVERZNI OPERATORI

y = amp x ili y = x

ili

int xyz

z = ampx

y = z y = z = ampx = x

Primjer

include ltstdiohgt

main()

int x prom=5 pokaz

pokaz = ampprom

x = pokaz

printf(rdquoprom=dnx=dnrdquopromx)

prom=5

x=5

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 29: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]=0

int p q

p = a

ili

p = ampa[0]

q = a+3

ili

q = ampa[3]

Napomena

a je statička promjenljiva

Nije dozvoljeno a=a+2 ili

a++

Napomena

p je dinamička promjenljiva

Dozvoljeno je p=p+2 ili p++

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 30: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na vektor (jednodimenzionalno polje)

Primjer

include ltstdiohgt

static int x[5] = 12345

main()

int p

p = x

printf(rdquod d dnrdquo x[0] x[1] x[2])

printf(rdquod d dnrdquo p (p+1) (p+2) )

1 2 3

1 2 3

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 31: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) POINTER NA POLJE

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz n)

int niz[] n

pristup elementima u nizu

niz[indeks]

int funkcija (p n)

int p n

pristup pomoću pointera

(p+indeks)

ili

Primjer

int suma (int niz[] int

n)

int s=0 i

for (i=0 iltn i++)

s += niz[i]

return (s)

Primjer

int suma (int p int n)

int s=0 i

for (i=0 iltn i++)

s += (p+i)

return (s)

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 32: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) POINTER NA POLJE

Pokazivač na matricu (dvodimenzionalno polje)

0 1 j m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int p

p = mat ili

p = ampmat[0][0]

( mat + mi + j ) ili

( ampmat[0][0] + mi + j )

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 33: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Adresna aritmetika Neka je

a ndash vektor sa elementima tipa T

v ndash izraz tipa T

n ndash cjelobrojni izraz

p q ndash pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila

a ndash pokazivač na početak niza

ampa[0] ndash pokazivač na početak niza

p ndash element niza a na koji pokazuje p

p=v ndash elementu na koji pokazuje p dodjeljuje vrijednost v

++p ndash pokazuje na sljedeći element niza

--p ndash pokazuje na prethodni element niza

++p ndash inkrementira p pa pristupa tom (sljedećem) elementu

p++ - pristupa elementu na koji pokazuje p a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

(p+n)=v ndash dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 34: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) ADRESNA

ARITMETIKA

Primjer

include ltstdiohgt

main()

static char c[] = rsquoarsquorsquobrsquorsquocrsquorsquodrsquo

static int i[] = 1 2 3 4

char pc1=ampc[0] pc2=ampc[3]

int pi1=ampi[0] pi2=ampi[3]

printf(rdquoc=c i=dnrdquo c i)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquo(pc1+1)=c (pi1+2)=dnrdquo (pc1+1) (pi1+2))

printf(rdquo++pc1=c ++pi1=dnrdquo ++pc1 ++pi1)

printf(rdquopc1++=c pi1++=dnrdquo pc1++ pi1++)

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

pc1-=2 pi1-=2

printf(rdquopc1=c pi1=dnrdquo pc1 pi1)

printf(rdquopc2-pc1=d pi2-pi1=dnrdquo pc2-pc1 pi2-pi1)

c=a i=1

pc1=a pi1=1

(pc1+1)=b (pi1+2)=3

++pc1=b ++pi1=2

pc1++=b pi1++=2

pc1=c pi1=3

pc1=a pi1=1

pc2-pc1=3 pi2-pi1=3

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 35: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) REFERISANJE

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta

1 Prilikom poziva funkcije treba slati adresu

2 Formalni argument treba definisati kao pokazivač na tip

3 U tijelu funkcije treba koristiti operator indirekcije

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 36: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Pokazivači (pointeri) REFERISANJE

Primjer

include ltstdiohgt

void suma ( niz n s )

int niz n s

int i

s = 0

for (i=0 iltn i++)

s += niz++

main()

static int i[]=1234

int x

suma (i 4 ampx)

printf(rdquoSuma drdquo x)

Suma 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 37: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Stringovi STRING

Stringovi

String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0) rsquo0rsquo

Deklaracija stringa

char ime[duzina] = rdquostringrdquo

ili

char ime[duzina] = znak znak hellip znak

Primjer

char grad1[] = rdquoPODGORICArdquo

char grad2[] = rsquoBrsquorsquoErsquorsquoRrsquorsquoArsquorsquoNrsquorsquoErsquorsquo0rsquo

Označavanje znakovnih i string konstanti

rsquoDrsquo ndash ovo je znak D

rdquoDrdquo ndash ovo je string rsquoDrsquorsquo0rsquo

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 38: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Stringovi STRING

Manipulacija stringom Ispisivanje stringa

ispisivanje pomoću funkcije

printf(rdquosrdquo string)

ispisivanje pomoću funkcije

puts(string)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

printf(rdquosnrdquo grad)

Primjer

include ltstdiohgt

main()

char grad[]= rdquoBANJA

LUKArdquo

puts(grad)

BANJA LUKA BANJA LUKA

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 39: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Stringovi STRING

Manipulacija stringom Učitavanje stringa

učitavanje pomoću funkcije

scanf(rdquosrdquo string)

učitavanje pomoću funkcije

gets(string)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

scanf(rdquosrdquo tekst)

printf(rdquosrdquo tekst)

Primjer

include ltstdiohgt

main()

char tekst[50]

printf(rdquoUnesi

recenicunrdquo)

gets(tekst)

printf(rdquosrdquo tekst)

Unesi recenicu

BANJA LUKA

BANJA

Unesi recenicu

BANJA LUKA

BANJA LUKA

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 40: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Stringovi STRING

Primjer Program koji učitava string a zatim ispisuje njegovu dužinu

include ltstdiohgt

int strlen ( char s )

int i

for (i=0 s=rsquo0rsquo i++)

return(i)

main()

char grad[]=rdquoPODGORICArdquo

printf(rdquoBroj slova drdquo

strlen(grad) )

Broj slova 9

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 41: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Stringovi STRING

Primjer Program koji učitava string i pravi kopiju tog stringa

include ltstdiohgt

void strcopy ( char s1 char s2 )

while ( s2++ = s1++ )

main()

char original[100]=rdquoPODGORICArdquo

char kopija[100]

strcopy(original kopija)

printf(rdquosnrdquo original)

printf(rdquosnrdquo kopija)

PODGORICA

PODGORICA

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 42: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Stringovi (biblioteka stringh)

strlen() za određivanje dužine stringa bez znaka null na kraju

strcmp() za poređenje kompletnih sadržaja dva stringa

strncmp() za poređenje delova sadržaja dva stringa

strcpy() za kopiranje jednog stringa u drugi od početka drugog

strncpy() za kopiranje dela jednog stringa u drugi od početka drugog

strcat() za kopiranje jednog stringa u drugi u produžetku sadržaja drugog

strncat() za kopiranje dela jednog stringa u drugi u produžetku sadržaja

drugog

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 43: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Stringovi (biblioteka stringh)

printf(sn strcmp(rec1 rec2) razlicitiisti) isti

printf(sn strcmp(rec1 rec3) razlicitiisti) razliciti

printf(sn strcmp(rec2 rec3) razlicitiisti) razliciti

char rec1[ ] = abc

char rec2[ ] = abc

char rec3[ ] = aeo

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 44: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Stringovi

(biblioteka stringh)

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 45: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Stringovi

KOPIRANJE STRINGA

include ltstdiohgt

include ltstringhgt

int main(void)

char bafer[6]

char rec[ ] = abc

strcpy(bafer rec)

puts(bafer)

getchar()

return(0)

(biblioteka stringh)

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 46: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Stringovi biblioteka stdlibh) (biblioteka stringh)

1048708 atoi() za konverziju stringa u ceo broj ako je to moguće

1048708 atof() za konverziju stringa u realan broj ako je to

moguće PRIMJER atof()

include ltstdiohgt

include ltstringhgt

include ltstdlibhgt

int main(void)

char tekst1[ ] = 25

char tekst2[ ] = 0005

char tekst3[ ] = 1025 i neki tekst

char tekst4[ ] = 5e+2

char tekst5[ ] = neki tekst 20030

printf(nbroj f atof(tekst1)) 2500000

printf(nbroj f atof(tekst2)) 5000000

printf(nbroj f atof(tekst3)) 10250000

printf(nbroj f atof(tekst4)) 500000000

printf(nbroj f atof(tekst5)) 0000000

getchar()

return(0)

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 47: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Znakovi znakovi

Znak potreban programu može biti slovo cifra ostali

bull Tip promenljive za čuvanje znaka ndash samo jedan char

bull Svaki znak je kodiran u ASCII tabeli ndash pomoću broja

bull Nema posebnih operatora za znakove

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 48: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Znakovi

ASCII TABELA

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 49: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Znakovi

bull UPRAVLJAČKI (NEKI)

bull 13 Povratak na početak reda r

bull 12 Prelaz na novu stranu f

bull 11 Vertikalni pomeraj v

bull 10 Prelaz u nov red n

bull 9 Horizontalni pomeraj t

bull 8 Povratak za jedno mesto blsquo

bull 7 Zvono

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 50: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Znakovi

bull Prepoznavanje slova ili cifre u znaku

Prostor u mem

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 51: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Strukture STRUKTURA

Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi

prezime visina

ime

struct osoba

char prezime[15]

char ime[15]

int visina

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 52: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Strukture STRUKTURA

Deklaracija strukture

Opšti oblik deklaracije

struct ime

tip1 element1

tip2 element2

tipN elementN

lista_promjenljivih

ključna riječ

ime strukture

Deklaracija

elementa (polja)

lista promjenljivih

ovog tipa Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student1 student2 klub[100]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 53: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Strukture STRUKTURA

Pristup elementima (poljima) strukture

Pristup pomoću operatora

rdquordquo = ELEMENT STRUKTURE

Primjer

struct osoba

char prezime[15]

char ime[15]

int visina

student klub[100]

Pristup poljima

studentprezime = rdquoMarkovicrdquo klub[1]prezime = rdquoJankovicrdquo

studentime = rdquoMarkordquo klub[1]ime = rdquoJankordquo

studentvisina = 190 klub[1]visina = 202

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()

Page 54: Složeni tipovi podatakaapeg.ac.me/nastava/Slozeni tipovi podataka.pdf · niz[5] niz[6] niz[7] Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

Strukture STRUKTURA

Primjer Ilustracija struktura

include ltstdiohgt

include ltstringhgt

struct evid

char prezime[50]

char ime[50]

int maticni

trazena = StojanovicRadovan234 osoba

int main()

int abc

printf(Upisi Prezime Ime osobe i maticni broj )

scanf(s s d osobaprezime osobaime amposobamaticni)

printf(s s dosobaprezime osobaime osobamaticni)

a=strcmp(osobaprezime trazenaprezime)

b=strcmp(osobaime trazenaime)

if((a ampamp b)ampamp(osobamaticni=trazenamaticni))

printf(WANTED)

else

printf(PASS)

getchar()

getchar()