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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()