Download as pdf or txt
Download as pdf or txt
You are on page 1of 96

4/3/2013

Why Use C?
In today's world of computer
programming, there are many highlevel languages to choose from, such
as C, Pascal, BASIC, and Java. These are
all excellent languages suited for most
programming tasks. Even so, there are
several reasons why many computer
professionals feel that C is at the top of
the list:

4/3/2013

Why Use C?
C is a powerful and flexible language.
What you can accomplish with C is
limited only by your imagination. The
language itself places no constraints on
you. C is used for projects as diverse as
operating systems, word processors,
graphics, spreadsheets, and even
compilers for other languages.

Why Use C?
C is a popular language preferred
by professional programmers. As
a result, a wide variety of C
compilers and helpful accessories
are available.

4/3/2013

Why Use C?
C is a portable language. Portable means
that a C program written for one
computer system (an IBM PC, for
example) can be compiled and run on
another system (a DEC VAX system,
perhaps) with little or no modification.
Portability is enhanced by the ANSI
standard for C, the set of rules for C
compilers.

Why Use C?
C is a language of few words, containing only
a handful of terms, called keywords, which
serve as the base on which the language's
functionality is built. You might think that a
language with more keywords (sometimes
called reserved words) would be more
powerful. This isn't true. As you program
with C, you will find that it can be
programmed to do any task.

4/3/2013

Why Use C?
C is modular. C code can (and should)
be written in routines called
functions. These functions can be
reused in other applications or
programs. By passing pieces of
information to the functions, you can
create useful, reusable code.

Why Use C?
What about C++?
You might have heard about C++ and
the programming technique called
object-oriented programming. Perhaps
you're wondering what the differences
are between C and C++ and whether
you should be teaching yourself C++
instead of C.

4/3/2013

Why Use C?
Not to worry! C++ is a superset of C,
which means that C++ contains
everything C does, plus new additions
for object-oriented programming. If you
do go on to learn C++, almost
everything you learn about C will still
apply to the C++ superset.

Why Use C?
In learning C, you are not only learning one
of today's most powerful and popular
programming languages, but you are also
preparing yourself for object-oriented
programming.
Another language that has gotten lots of
attention is Java. Java, like C++, is based on
C. If later you decide to learn Java, you will
find that almost everything you learned
about C can be applied.

4/3/2013

Prednosti C jezika
Jednostavnost
Univerzalnost i

slobodne forme programiranja, ine


ga jezikom opte namene i primene

Razvijena sredstva za prikazivanje strukture podataka


Projektovanje programa metodom odozgo na dole
Optimizovani C prevodioci za kreiranje efikasnih
programa za sistemsko programiranje

Uvod u jezik C++ u kome su uspeno zaivele ideje


objektno orjentisanog programiranja

Tradicionalni, klasini, algoritamski


nain
programiranja
je u osnovi proceduralan,
zasnovan
na
funkcionalnoj
dekompoziciji
korisnikog, a zatim i programskog zahteva.
(tipicno unos, obrada prikaz)
Pri tome, podaci (atributi) koji se obrauju i
operacije nad njima nisu grupisani zajedno u
objektima kao to je to sluaj kod OBJEKTNO
ORJENTISANOG PROGRAMIRANJA, ved su
razbacani po programu.

4/3/2013

Procesi u izvravanju programa


Tekst editor. Pisanje izvornog koda programa
Pretprocesor. Transformie izvorni kod prema
direktivama koji se u njemu nalaze

Kompajler. Transformie

izvorni kod u kod na

asemblerskom jeziku

Asembler. Asemblerski kod translira u objektni kod.


Linker. Od formiranog koda i modula iz biblioteke C
jezika kreira izvriv file

Lets go ! Example 1. Linear function


#include<stdio.h>
main ()
{
int a,b,x,y;
a=2;
b=4;
x=1;
y=a*x+b;
printf("%10d\n",y);
}

4/3/2013

Osnovni elementi C jezika


Identifikator je sekvenca velikih i malih slova, cifara, i
karaktera _.
Koristi se za dodeljivanje imena
objektima u programu (funkcije, promenljive...)
printf("%10d\n",y); je iskaz C jezika i predstavlja
elementarnu obradu koju program treba da obavi.
Mora se zavriti karakterom ;
{ i - su karakteri koji objedinjuju vie pojedinanih
iskaza u jednu programsku celinu,
analogno
komandama BEGIN i END u Pascalu.

Osnovni elementi C jezika, nastavak


main, printf i scanf su identifikatori sistemskih
funkcija
Funkcija main informie program gde treba poeti
izvravanje programa, a ( ); oznaava da sistemska
funkcija main nema argumenata.
#include<stdio.h>
Sve pretprocesorske direktive poinju znakom # i ne
pripadaju C jeziku.
#include<stdio.h> je instrukcija prevodiocu da
upotrebi standardne ulazno izlazne funkcije koje su
definisane u file-u <stdio.h>

4/3/2013

Funkcije za realizaciju ulazne i


izlazne aktivnosti
Funkcije printf i scanf obavljaju formatizovanu ulazno izlaznu
aktivnost.
Argumenti obe funkcije podeljeni su u dva dela:
A) Kontrolni ili konverzioni niz
B) Lista argumenata
Razlika funkcija scanf i printf je u u listi argumenata. Argumenti
funkcije printf se prenose vrednodu, dok se argumenti funkcije
scanf prenose svojom adresom, jer se uitana vrednost mora
vratiti u pozivajudi program. To se postie navoenjem karaktera
& ( operator indirekcije ) ispred liste argumenata.

Izlazna funkcija printf()


Sintaksa
printf (Upravljaki string *Arg1,Arg2,+)
Upravljaki string
A) printf ( Ispis izlaznih izvestaja)
Konstantni tekst
Ispis izlaznih izvestaja
B) Sadri specifikaciju konverzije
printf ( Broj Pi ima vrednost %f\n, Pi)
Karakter % f odreuje na kom mestu i u kom formatu de se
tampati vrednost odgovarajudeg argumenta iz liste.
\n Jedan karakter. Nekim karakterima se moe promeniti
uobiajeno znaenje ako im prethodi karakter \ , tzv. Escape
karakteri.

4/3/2013

Opti oblik specifikacije konverzije


%[-][ irina_polja][. Tanost][1] konverzioni_karakter
[-] Argument se poravnava na levoj strani zadane irine
irina_polja Zadaje maksimalnu irinu polja. Mesto na
kome se tampa argument naziva se polje, a broj
karaktera u polju je irina polja.
Tanost Definie se za realne brojeve, koliko se cifara
ispisuje desno od decimalne take
Konverzioni_karakter definie konverziju (iz tabele)

Simboli specifikacije konverzije


Simbol
konverzije

Tip argumenta

Osobina izlazne funkcije

char

Jedan znak

int

Ceo dekadni broj

int

Ceo dek. br.bez znaka

int

Ceo okt. br. bez znaka

x, X

int

Ceo hksdek. br. bez znaka

string

String

float double

Dekadni zapis real. broja

e, E

float double

Eksponencijalni zapis

g,G

float double

Kradi zapis izmeu %f i %e

10

4/3/2013

Example No 2
main()
{
printf("karakteri:\n%3c\n%5c\n%7c\n",'A','B','C');
}
Izlaz programa
Karakteri:
A
B
C

Ulazna funkcija scanf()


Sintaksa
scanf (Upravljaki string *Arg1,Arg2,+)

Upravljaki string sadri niz konverzionih


specifikacija
Lista argumenata sadri adrese promenljivih.
Ispred imena promenljive obavezan je znak &,
osim kod string promenljive.
scanf(%d%d%d,,&i,&j,&k);

11

4/3/2013

Opti oblik konverzione specifikacije


%**+ irina_polja] konverzioni_znak
* Odgovarajude ulazno polje se ignorie i ne
dodeljuje promenljivoj
irina_polja - Predstavlja maksimalnu irinu
ulaznog polja
konverzioni_znak Definie konverziju (data
tabelom)

Tabela konverzionih znakova


Simbol konverzije
c
d
ld ili D
h
o
lx, X
s
f
le, lE
g,G

Tip argumenta
char
int
long
short
int
long
string
float
double
float double

12

4/3/2013

Example No 3
main()
{
int x;
printf( Upotreba f. scanf:\n Ukucajte broj\n:) ;
scanf ( %d\n, &x);
printf(Ukucali ste\n%d\n, x);
}
Izlaz programa
Upotreba f. scanf:
Ukucajte broj
23
Ukucali ste
23

Example No 4
main()
{
int i,j,k;
scanf("%2d%3d%2d",&i,&j,&k);
printf("/%d/%d/%d%\n",i,j,k);
scanf("%d%d%d",&i,&j,&k);
printf("/%d/%d/%d%\n",i,j,k);
}
Za ulazne vrednosti
123 456 789
12 34 56
Ispisuje se
/12/3 /45/
/6//789/12/

13

4/3/2013

Osnovni tipovi podataka


Promenljive i konstante su objekti u okviru
programa koji se karakteriu svojim:
Imenom,
tipom podataka koji se moe dodeliti
promenljivoj,
Skupom operatora koji se moe primeniti nad tim
vrednostima
Memorijskim prostorom za smetaj podataka

Osnovni tipovi podataka su:

int, float, double i char

Tipovi podataka
Osnovni

Celobrojni
Realni
Znakovni
Nabrojivi
Prazan

(int)
(float)
(char)
(enum)
(void)

Slozeni ili Struktuirani


Nizovi
Strukture
Unije

14

4/3/2013

Promenljive tipa Int


U ovu kategoriju podataka ubrajaju se konstante, promenljive,
izrazi i funkcije.
Tri notacije za predstavljanje celobrojnih vrednosti dekadna,
oktalna i heksadecimalna.
Pri deklarisanju promenljivih i konstanti moe se vriti i
inicijalizacija promenljivih, npr. program Example No5
Opseg celobrojnih vrednosti je razliit i moe se menjati
primenom kvalifikatora Long i Short
Unsigned deklarie promenljivu za memorisanje + vrednosti
long int x;
short int y;
unsigned int z;

Example No 5
main()
{
int x =11,y =22,z =33;
printf(x = %d\n y = %d\n z = %d\n,x,y,z);
}
Izlaz programa
x = 11
y = 22
z = 33

15

4/3/2013

Promenljive tipa float i double


Promenljive tipa float i double memoriu vrednosti realnih
brojeva i vrednosti sa decimalnim zarezom.
Razlika izmeu tipa float i double je u tanosti
predstavljanja realnih vrednosti( brojem decimalnih cifara
koje se mogu memorisati).
Konstante sa pokretnim zarezom se u C jeziku se mogu
predstaviti u obinoj i naunoj konotaciji.
Ne postoji razlika izmeu konstanti tipa float i double C
prevodilac sve konstante sa pokretnim zarezom
predstavlja kao tip double
Promenljive tipa double mogu memorisati grubo dvaput
vie decimalnih cifara od promenljivih tipa float

Example No 6
main()
{
float pi = 3.14159265358979323845;
double sqrt_3 = 1.732050875687729356;
printf(pi = %20f\n sqrt_3 = %20f\n\n, pi,sqrt_3);
}
Izlaz programa:
pi = 3.14159274101257320000
sqrt_3 = 1.73205087568877260000

16

4/3/2013

Promenljive tipa char


Promenljive i konstante tipa char memoriu karaktere.
Promenljive i konstante tipa char uestvuju u izrazima
svojom kodnom vrednodu u kome je svaki karakter
kodiran svojom. 7-bitnom vrednodu ASCII koda. Poto
su karakteri kodirani celobrojnim vrednostima
(leksikografsko ureenje ), mogude je sortiranje karaktera
rei i linija.
Promenljive i konstante tipa char uestvuju u izrazima
svojom kodnom vrednodu koja se tretira kao celobrojna
vrednost. Promenljiva car sadri karakter a .
Sukcesivnim inkrementiranjem promenljive kar dobijaju
se karakteri b i c, program example No 7

Example No 7
main()
{
char car = 'a';
printf("karakter je %c\n",car);
printf("karakter je %c\n",car+1);
printf("karakter je %c\n",car+2);
printf("Kodna vrednost je %d\n",car+3);
}
Izlaz programa
Karakter je a
Karakter je b
Karakter je c
Kodna vrednost je 100

17

4/3/2013

Example No 8
main()
{
char c = 'A';
printf("/ %c / %d / %o / %x \n",c,c,c,c);
}
Izvrsavanjem programa dobija se:
/A/65//101/41
65- ASCII dekadna vrednost
101- ASCII oktalna vrednost
41- ASCII heksadekadna vrednost

Operacije, izrazi i operatori


Operaciju predstavlja

simbol koji oznaava odreenu akciju


nad odreenim podatkom koji se naziva operand.

Izraz se sastoji od jednog ili vie operanada i simbola


operacija.
Operacija operira nad operandom

Aritmetike operacije
* /%+ - -

mnoenje
deljenje
izdvaja ostatak pri deljenju celih brojeva
sabiranje
oduzimanje

18

4/3/2013

Operacije, izrazi i operatori


Operacije poreenja
>
>=
<
<=
==
!=

- vede
- vede ili jednako
- manje
- manje ili jednako
- jednako
- razliito

Logike operacije
!
&&,
II

- negacija
- konjukcija
- disjunkcija

Operacije, izrazi i operatori


Operacije dodeljivanja
< promenljiva> = <izraz>, izvrava se tako to se
vrednost desnog operanda, (izraz) dodeljuje levom
operandu (promenljiva), koji predstavlja vrednost izraza
sa operacijom dodeljivanja.
Operator
X = Y = Z = 1;
Se izvrava tako to izraz Z = 1 dobije vrednost 1 koja je
dodeljena promenljivoj Z, izraunata vrednost izraza 1
se dodeljuje promenljivoj y i postaje vrednost izraza
y = 1, i na kraju se vrednost izraza dodeljuje
promenljivoj x

19

4/3/2013

Operacije, izrazi i operatori


Pojam operatora
Operatori su sastavni delovi programa koji
predstavljaju potpunu instrukciju raunaru.
X = 2 je samo izraz, dok je X = 2; operator.
Operacije uvedavanja i umanjivanja
Izraz ++ x uvedava vrednost promenljive x za 1, a
izraz - - x umanjuje vrednost promenljive x za 1.
Prefiksni oblik ++x, promenljiva se najpre uvedava
pa tek onda koristi u izrazu
Postfiksni oblik x++ promenljiva se najpre koristi u
izrazu pa tek onda uvedava.

Grananje u programu
Uslovni operator se pojavljuje u slededim
oblicima:
If (izraz) operator1
If (izraz) operator1 else operator2

Ako su operator1 i operator2 prosti operatori


if (izraz)
operator1

else
operator2

20

4/3/2013

Ako su operator1 i operator2 sloeni operatori


if (izraz)
{
operator11
operator12
operator1k
}
else
{
operator21
operator22
operator2k
}

Operator viestrukog izbora SWITCH


Omogudava grananje u programu izborom jednog
izmeu vie operatora
switch (izraz)
{
case konstanta1:
operator1
break;
case konstanta2:
operator2
break;
case konstantan:
operator n
break;
default :
operator0
break;
}

21

4/3/2013

Operator viestrukog izbora SWITCH


Iza slubene rei switch navodi se izraz (selektor) ija je
vrednost celobrojna, ili znakovna koja se automatski
konvertuje u celobrojnu.
Operatorom viestrukog grananja izvrava se ona grupa
operatora ispred koje se nalazi konstanta koja je
jednaka vrednosti selektora. Ako nije jednaka nijednoj
od konstanti izvrava se grupa operatora koja se nalazi
iza default alternative.
Operator switch na osnovu brojnih ocena 5,4,3,2,1
ispisuje ocene odlian, vrlo dobar, dobar, dovoljan,
nedovoljan u example No 8

Example No 8
switch (ocena)
{
case 5: printf (odlian\n); break;
case 4: printf (vrlo dobar\n); break;
case 3: printf (dobar\n); break;
case 2: printf (dovoljan\n); break;
case 1: printf (nedovoljan\n); break;
default: printf (nekorektna ocena\n);

}
Break operator se koristi u switch operatoru da bi se obezbedio
izlaz neposredno iza njega. Ako se iza neke grupe operatora u
switch- u ispusti break, tada de se u sluaju izbora te grupe
izvravati sve preostale alternative do pojave break- a ili kraja
switch.-a.

22

4/3/2013

Organizacija ciklusa
Niz operatora koji se moe izvravati vie puta
naziva se ciklus.
Telo ciklusa - Niz operatora koji obrazuju ciklus
Izlazni kriterijum Uslov koji odreuje da li de se
telo ciklusa ponovo izvravati.
U zavisnosti od poloaja izlaznog kriterijuma u
odnosu na telo ciklusa, ciklusi mogu biti sa:
Preduslovom (while), skradeno varijanta sa (for)
Postuslovom (do while)

Ciklus while
Operator ciklusa sa preduslovom while omogudava
organizovanje ciklusa sa nepoznatim brojem
ponavljanja koji zavisi od izraunavanja u telu
ciklusa.
Opti oblik operatora while je:
while (izraz)
operator

Ako je vrednost izraza tano , izvride se operator


koji ini telo ciklusa. Operator se izvrava dok god
izraz ima vrednost tano. Svaki takav korak naziva se
iteracija.

23

4/3/2013

Example No 9
/* Stepen celog broja*/
main()
{
int a,n, i=1,stepen=1;
printf("Ucitaj a i n:\n");
scanf("%d%d",&a,&n);
while (i++<=n)
stepen*=a;
printf("stepen=%d\n",stepen);
}

Operator ciklusa for


Operator ciklusa for se koristi kada je unapred poznato koliko puta
treba izvriti telo ciklusa.
for (inicijalizacija; provera_uslova; korekcija)
operator
I predstavlja skradeni zapis ciklusa while oblika
inicijalizacija;
while (provera_uslova)
{
operator
korekcija
}
Ako provera_ uslova daje tano telo ciklusa se izvra jedanput.
Iz ciklusa se izlazi kada vrednost izraza za proveru_ uslova postane
netano.

24

4/3/2013

Example No 10
/* Faktorijel*/
main()
{
long i,n,fakt;
scanf("%ld",&n);
for (fakt=1,i= 1; i<=n;fakt*=i, i++);
printf("fakt=%ld\n",fakt);
}
Realizacija programa
1
1*2
1*2*3
1*2*3**n

Operator ciklusa do - while


Operator ciklusa sa postusloviom do - while ima oblik:
inicijalizacija;
do {
operator
}while (provera_uslova);
Operator koji ini telo ciklusa se izvrava bar jedanput, poto
se provera uslova vrI na kraju ciklusa. Ako je vrednost izraza
tano operator tela ciklusa se ponavlja. I ovaj postupak
traje, dok izraz ne dobije vrednost netano

25

4/3/2013

Example No 11
/* Stepeni dvojke*/
main()
{
int stepen,granica;
printf("Uneti granicu\n");
scanf("%d",&granica);
stepen=2;
do{
printf("%d\n",granica);
stepen*=2;
}
while (stepen<=granica);
}

Funkcije
Funkcije su osnovno sredstvo na kome su zasnovani osnovni
principi i realizacija struktuiranog programiranja.
Pomodu njih se:
Povedava itljivost programa.
Uspeno uvodi tehnika programiranja odozgo na dole.
o Problem se, u poetnoj fazi algoritma reenja, razbija na
logike celine koje se nazivaju moduli. Zatim se vri
detaljizacija svakog prethodno definisanog modula na
elementarnije.
o Modul na najviem hijerarhiskom nivou se transformie u main
funkciju a ostali moduli u pojedinane funkcije ili grupe funkcija.
Omogudava strategija u projektovanju podeli pa vladaj, koja
je pogodna kada tim programera stvara projekat.

26

4/3/2013

Definicija funkcije
Funkcije se dele na dve osnovne kategorije:
Funkcije koje vradaju vrednost (rezultat) pozivajudoj funkciji (main ili neka
druga)
Funkcije koje ne vradaju vrednost pozivajudoj funkciji (main ili neka druga).
Kod funkcija koje ne vradaju vrednost kao tip rezultata navodi se void.

Sintaksa Funkcije ima slededi oblik:


Tip_rezultata ime_funkcije(formalni parametri)
Opis formalnih parametara
{
Definicije i deklaracije
Operator1
....
OperatorN
}

Example No 12 a
/* Funkcija izraunava sumu kvadrata celih brojeva od m do n*/
long suma_kvadrata(m,n){
int i;
long s=0;
for(i=m;i<=n;i++)
s+=i*i;
return (s);
}
Telo funkcije poinje deklarisanjem unutranjih promenljivih koje su
nedostupne pozivajudoj funkciji. Promenljive koje su poznate samo funkciji
koja ih sadri nazivaju se lokalne promenljive.
Operator return predaje rezultat izraunavanja (vrednost funkcije )
pozivajudoj funkciji.

27

4/3/2013

Example No 12
/* main funkcija ilustruje koridenje funkcije suma_kvadrata */
main() {
int m,n,k,l;
long p;
long suma_kvadrata();
p=suma_kvadrata(2,4);
printf("%ld %ld\n",p,suma_kvadrata(-1,3));
scanf("%d%d%d%d",&m,&n,&k,&l);
p=suma_kvadrata(m,n)+suma_kvadrata(k,l);
printf("%ld %ld\n",p,suma_kvadrata(m+k,n+l));
}
/* Funkcija izracunava sumu kvadrata celih brojeva od m do n*/
long suma_kvadrata (int m,int n)
{
int i;
long s=0;
for(i=m;i<=n;i++)
s+=i*i;
return (s);
}

Koridenje funkcije suma_kvadrata();


u glavnoj funkciji main()
Definisana funkcija testira se pozivima iz glavne funkcije main()
Operatori funkcije suma_kvadrata() se izvravaju kada se iz glavne funkcije
main() pozove funkcija.
Obradanje funkciji se realizuje zapisom sa imenom funkcije iza koga sledi
spisak parametara. Parametri navedeni pri obradanju funkciji nazivaju se
stvarni, a (2,4) parametri navedeni u zaglavlju definicije funkcije nazivaju se
formalni (m,n).
Kada se u Main () funkciji pojavi operator p= suma_kvadrata(2,4); realizuju se
sledede akcije:
Rezervie se memorijski prostor za promenljive definisane u funkciji
suma_kvadrata();
Formalnim parametrima se dodeljuju vrednosti stvarnih parametara m = 2 i
n=4
Izvravaju se operatori funkcije, tj. Izraunava se suma kvadrata brojeva od 2
do 4.
Rezultat izraunavanja u funkciji se postavlja na mesto obradanja toj
funkciji,tj. Dodeljuje promenljivoj p, i prelazi se na izvravanje slededih
operatora funkcije main().

28

4/3/2013

Podela memorije izmeu promenljivih koje koriste


funkcije main () i suma_kvadrata()

main()

m
n
k
l
p
P = suma_kvadrata (2,4)

suma_kvadrata()
m
n
s
i

Pokazivake promenljive (Pointeri)


Pokazivaka promenljiva je promenljiva koja pokazuje
na drugu promenljivu, odnosno sadri adresu memorijske
lokacije u kojoj se uva ta promenljiva
Deklarie se tako to se u specifikaciji zada
tip
promenljive na koju ukazuje pokazivaka promenljiva.
Ispred imena promenljive pie se *

int *pi
/*pokaziva na celobrojnu promenljivu */
char *pc
/*pokaziva na znakovnu promenljivu */
float *pf1, *pf2 /*pokaziva na float promenljive */
j = *pi
//dodeljuje promenljivoj j celobrojnu vrednost
koja se nalazi na adresi sadranoj u promenljivoj pi.

29

4/3/2013

Pointeri
Pretpostavimo da postoji slededa deklaracija i inicijalizacija promenljive
prom:

int prom= 0 ;
Deklaracija int * ukaz_prom; nam omogudava da indirektno pristupimo
vrednosti promenljive prom.

Za promenljive prom i ukaz_prom moemo pisati iskaz:


ukaz_prom = &prom;

koji promenljivoj ukaz_prom dodeljuje adresu promenljive prom.

Ako je promenljiva x deklarisana kao int, tada se iskazom


x = *ukaz_prom;

dodeljuje vrednost promenljive na koju pointer ukaz_prom ukazuje. Poto je


promenljiva ukaz_prom
u ranijem iskazu postavljena na vrednost &prom efekat prethodnog iskaza
dodeljivanje promenljivoj x vrednost promenljive prom.

Operatori

& i * su unarni istog prioriteta i inverzni su meusobno.

Pointeri
Pretpostavimo da imamo deklaraciju
int x,y,*u
Tada su iskazi
u = &x
y= *u;
Ekvivalentni iskazu
y = *&x
Koji je opet ekvivalentan iskazu
y= x
Operatori dodeljivanja
pi = &i
j = *pi
Imaju isti efekat kao j = i

30

4/3/2013

Pokazivai
Int x=1, y=2;
Int *ip
ip=&x

x
100

y= *ip

100

x=ip x

x
x
100

ip

ip

200

100

100

*ip=3

200

y
y
200

100
100

1000

200

1000

ip

100

1000

ip
1000

100

Pointeri, opet, ali malo drugaije


Pokaziva se definie kao i ostale promenljive. Razlika je
to se nazivu promenljive dodaje unarni operator simbol
(*) ispred identifikatora odreene promenljive. Zvezdica
(*) je simbol za indirektno adresiranje pa se zato i sam
operator (*) naziva i operatorom indirektnog adresiranja.
Kada se operator indirekcije (*) primeni na neki pokaziva,
njime se pristupa objektu na koji pokaziva pokazuje.
int *p1;
/* pokaziva na integer promenljivu
char *p2;
/* pokaziva na char promenljivu
long double *p4;
/* pokaziva na long double prom.

31

4/3/2013

Pointeri
Pokaziva je dakle promenljiva koja sadri
adresu objekta tj. neke promenljive na koji
pokazuje. Kada je sadraj pokazivaa adresa
nekog objekta tada je pokaziva inicijalizovan.
Adresa nekog objekta u memoriji koji je
predstavljen svojim identifikatorom, moe da se
dobije pomou prefiksnog unarnog operator
(&), odnosno adresa neke promenljive dobija se
koridenjem ovog adresnog operatora.

Jedan pouan primer

int broj;
/* promenljiva tipa int
int *pok;
/* pokaziva na int tip
broj = 10;
/* inicijalizacija promenljive broj na 10
pok = &broj;
/* inicijalizacija pokazivaa tako da
pokazuje na promenljivu broj
*pok = 100;
/* promena sadraja promenljive broj
na 100 preko pokazivaa .
broj = 100;

32

4/3/2013

DEKLARACIJA POKAZIVAA
Pokaziva omogudava indirektan nain pristupa
vrednosti odreenog podatka, i to pomodu adresa
podatka u memoriji raunara. Kako to funkcionie
na najjednostavnem primeru:
int broj = 10, *pok;

Da bi se uspostavila veza izmeu promenljivih broj i pok,


koristi se operator (&) koji daje adresu odgovarajude
promenljive.
pok = &broj

Ovim je pridruena memorijska adresa promenljive broj


pokazivau pok, tj. sadraj promenljive pok je adresa
promenljive broj

33

4/3/2013

Vrednost promenljive broj pridruuje se nekoj


drugoj promenljivoj npr x upotrebom
promenljive pok, koristedi operator (*).
x = *pok;

ima isto znaenje kao i:


x = broj;
tj. u jednom i drugom sluaju vrednost
promenljive x je 10.

Veza izmeu funkcija koridenjem pokazivaa

Funkcija kvadrat_kub () koja je definisana iza glavne funkcije main() u primeru


No14 ima etiri parametra m, n, kv i kub. Prva dva parametra su ulazni podaci
koje ne elimo menjati u toku izvretka funkcije i nazivaju se vrednosni parametri.
Pre izvravanja funkcije tim parametrima se dodeljuju vrednosti stvarnih
parametara.
Pri pozivu funkcije kvadrat_kub(2,4 ,&p&q);
predaju se adrese promenljivih p i q to znai da de formalni parametri kv i kub
koji su definisani u zaglavlju funkcije kvadrat_kub (m, n, kv, kub) biti opisani kao
pokazivai.
Poto su p i q celobrojne promenljive promenljive kv , kub treba da budu
opisane kao pokazivai na celobrojne promenljive, pa se deklariu na slededi
nain
int m, int n, int *kv, int *kub
Ovi parametri se nazivaju adresni parametri, i koriste se za odreivanje izlaznih
vrednosti funkcije ili promenu vrednosti odgovarajudih stvarnih parametara.
Na mestu programa na kome se funkcija izvrava prvi put promenljivim p i q se
dodeljuju vrednosti stvarnih parametara 2 i 4. Pokazivake promenljive *kv, i
*kub
dobijaju adrese stvarnih parametara &p i &q tako da se sve operacije koje se u
funkciji realizuju nad *kv, i *kub su operacije koje se realizuju nad stvarnim
parametrima p i q

34

4/3/2013

Example No 14
main()
{
int m,n,k,l,p,q,r;
void kvadrat_kub();

kvadrat_kub(2,4,&p,&q);
printf("p = %d q =%d\n",p,q);
scanf("%d%d%d%d",&m,&n,&k,&l);
kvadrat_kub(m,n,&p,&q);
printf("p = %d q =%d\n",p,q);
kvadrat_kub(m-k,n+l,&p,&r);
printf("p = %d q =%d\n",p,r);
}
void kvadrat_kub(int m, int n, int *kv, int *kub) {
int i;
*kv = *kub =0;
for(i=m;i<=n;i++) {
*kv+=i*i;
*kub+=i*i*i;
}
}

Podela memorije izmeu promenljivih koje


koriste funkcije main () i kvadrat_kub()
main()

m
n
k
l

kvadrat_kub(int m, int n, int *kv, int *kub);


*kv

kv

i
m

n
*kub

kub

35

4/3/2013

Prosleivanje argumenata funkciji


upotrebom pokazivaa
U nekim sluajevima nije dovoljno da funkcija vrada samo jednu
vrednost.
Naredbom return mogude je vratiti samo jednu vrednost. U cilju
reavanja ovog problema, potrebno je razmotriti osobine koje imaju
parametri funkcije. U trenutku prenosa promenljive kao parametra
funkcije, u okviru funkcije se
automatski kreira lokalna kopija
promenljive. Ukoliko funkcija menja vrednost parametara (dodeljuje mu
vrednost i sl.), promena je ''vidljiva'' samo u okviru funkcije, jer se menja
samo vrednost lokalne kopije promenljive, a ne i ''originala''. Da bi
promena vrednosti parametara bila vidljiva i van okvira funkcije, tj. u
okviru programa koji je funkciju pozvao, potrebno je funkciji preneti ne
promenljivu, ved adresu promenljive. U tom sluaju se ne kreira kopija
promenljive.).

Prosleivanje argumenata funkciji


upotrebom pokazivaa
Prenos promenljive na nain na koji se kreira
lokalna kopija promenljive se naziva prenos
po vrednosti, a prenos promenljive na nain
na koji se koristi ''zajednika' promenljiva
se naziva prenos po referenci. Prenos po
vrednosti i prenos po referenci su ilustrovani
na slededem primeru:

36

4/3/2013

Prenos parametara po vrednosti


void f_ja(int x)
{
x = x + 3;
}
void main()
{
int param = 5;
f_ja(param);
}
Nakon poziva funkcije f_ja vrednost promenljive param je 5
(nepromenjena).

Prenos parametara po referenci


void f_ja(int *x)
{
*x = *x + 3;
}
void main()
{
int param = 5;
f_ja(&param);
}
Nakon poziva funkcije f_ja vrednost promenljive param je 8
(promenjena)

37

4/3/2013

Memorijske klase
Pored pripadnosti odredjenom tipu promenjlive
imaju i svoju memorijsku klasu.
Memorijska klasa daje mogudnost da se odredi
sa kojim funkcijama je povezana promenljiva ili
koje funkcije imaju pristup promenljivoj.
Pri opisu memorijske klase koriste se sledede
rezervisane rei:

auto
static
register
extern

Automatske promenljive
Automatske promenljive se deklariu rezervisanom rei auto
ispred specifikacije tipa kao u slededem primeru:
{
auto int a;
auto int b=777;
auto double d;

}
Oblast u kojoj deluje automatska promenljiva ograniena je blokom
(u granicama definisanim zagradama { } u kome je deklarisana). Dok
god se blok koji je sadri izvrava ona ivi , kada program napusti
taj blok promenljiva iezava. Ona je dostupna i u svakom podbloku
bloka u kome je deklarisana.
Primer No 15 ilustruje oblast
delovanja automatskih promenljivih.

38

4/3/2013

Example No 15
main()
{
/*spoljasnji blok*/
auto int x=1;
{
/*podblok #1 */
auto int y=2;
printf(%d%d\n,x,y);
}
{
/*podblok #2*/
printf(%d%d\n,x,y);/*linija 12 */
}
printf(%d%d\n,x,y);/*linija 14*/
}

Statike promenljive
Kao i automatske, statike promenljive su lokalne u funkciji odnosno
bloku u kome su deklarisane. Razlika je u tome to statike
promenljive ne iezavaju kada funkcija koja ih sadri prekine
izvravanje. Ako program ponovo pree na izvravanje funkcije koja
sadri statiku promenljivu ona de imati vrednost sa kojom je
prekinuta funkcija u prethodnom izvravanju. Primer deklaracije i
inicijalizacije:
{
static int a = 1;
float c = 0,0;
...
}
U slededem primeru Example No 16 funkcija uvedaj () se poziva tri
puta. Inicijalna vrednost promenljive x je 0. U slededim pozivima
funkcije koristi se vrednost sauvana iz prethodnog izvravanja.

39

4/3/2013

Example No 16
main()
{
void uvecaj();
uvecaj();
uvecaj();
uvecaj();
}
void uvecaj() {
static int x=0;
x++;
printf(%d\n,x);
}
Ispisuje se
1
2
3

Spoljanje promenljive
Promenljiva deklarisana van funkcije naziva se spoljanja
promenljiva. Ona se moe deklarisati i u funkciji koja je koristi
navoenjem rezervisane rei extern. Na primer:
int x; /*deklaracija spoljasnje promenljive x */
char c;
double x;
main()
{
extern int a;
extern char c ;
extern double x ;
..
}

Navoenjem rezervisane rei extern spoljanja promenljiva


postaje dostupna funkciji definisanoj bilo gde u tom i u bilo
kom file-u

40

4/3/2013

Primeri deklarisanja spoljanjih promenljivih

int x = 707; /* globalna deklaracija promenljive x */


main()
{
printf(%d/n, x);
}
Poto je promenljiva x definisana van funkcije main() ona je globalna I
funkcija joj moe pristupiti. Izvravanjem programa dobija se 707
A izvrenjem programa
int x = 707; /* globalna deklaracija promenljive x */
main()
{
int x = 101; /* lokalna deklaracija promenljive x */
printf(%d/n, x);
}
dobija se 101
U toku izvravanja funkcije vaeda je vrednost lokalne promenljive

Example No17
int x;
/*deklaracija spoljasnje promenljive x */
main()
{
printf("Pocetna vrednost od x je%d\n",x);
dodaj();
oduzmi();
dodaj();
oduzmi();
printf("krajnja vrednost od x je %d\n",x);
}
/*uvecava spoljasnju promenjivu x*/
dodaj()
{
x++;
printf("dodavanjem 1 dobija se %d\n",x);
}
/*umanjuje spoljasnju promenjivu x*/
oduzmi()
{
x--;
printf("oduzimanjem 1 dobija se %d\n",x);
}

41

4/3/2013

Kreiranje projekta

U okruenju C jezika programi koji se formiraju iz vie file-ova nazivaju se projekti.


Svaki projekat je povezan sa projektnim file-om koji treba kreirati i u kome se nalazi
opis projekta, ili spisak file-ova koji obrazuju projekat. Projektni file-ovi moraju imati
ekstenziju PRJ. Na primer ako treba napraviti program iz file-ova
PRVI. C
main()
{
printf(Ovo je iz file-a1.\n);
pisi() /*U File-u DRUGI.C */
}
i DRUGI. C
pisi()
{
printf(Ovo je iz file-a2.\n);
}
Treba kreirati projektni file npr. PRVIPROJ. PRJ:
PRVI
DRUGI

U podmeniju Project u opciji Project Name navede se ime projekta


PRVIPROJ. Opcijom RUN zadaje se kompilacija i izvravanje projekta. U
podmeniju Compile opcija Make kreira se EXE verzija projekta.

Nizovi
Niz je ogranien ureen skup promenljivih istog tipa, koje se nazivaju
komponente. Tip komponenti se naziva bazni tip. Vrednostima pojedinih
komponenti moe se pristupiti pomodu indeksa, koji ukazuje koju
komponentu treba obraivati.Pri definisanju nizova treba voditi rauna o
dve stvari:
Treba ukazati na broj komponenti i nain referisanja na komponente.
Treba ukazati na tip vrednosti koje se u njemu uvaju.

Opis niza
Niz se opisuje kao i ostali podaci, samo to se dodaju kvadratne zagrade iza
imena niza. Unutar zagrada se navodi broj koji pokazuje broj elemenata u
nizu.
Int broj [1000] ;
Ovom deklaracijom se uvodi niz broj koji se sastoji iz 1000 celobrojnih
promenljivih sa imenima broj [0], broj [1] ... broj [999]. Indeksiranje
elemenata niza je od 0. Svaka promenljiva poto je celobrojna zauzima dva
bajta.

42

4/3/2013

Example No 18
//Izracunati srednju vrednost niza od n elemenata(n<50)
main()
{
int n,i;
float x[50];
printf(Uneti broj elemenata niza);
scanf(%d,&n);
for(suma=0,i=0; i<n; i++)
{
printf(%3d.broj x=,i);
scanf(%f,&x*i]);
suma+= x[i];
}
printf(Srednja vrednost je %f\n, (float)suma/n);
}

Example No 19
//Izracunati maksimalnu vrednost u nizu od n elemenata(n<50)
main()
{
int n,i;
float x[50],xmax;
printf(uneti broj elemenata niza);
scanf(%d,&n);
for(i=0;i<n;i++)
{
printf(%3d.broj x=,i);
scanf(%f,&x*i+)
}
/*izracunava maksimalnu vrednost niza*/
xmax=x[0];
for (i=1;i<n;i++)
if (x[i]>xmax)
xmax=x[i];
printf(\nmaksimalna vrednost je %f\n,xmax);
}

43

4/3/2013

Example No 20
//Izracunati indeks najveceg elemenata niza x od n elemenata (n<50)
main(){
int n,i,imax;
float x[50],xmax;
printf(Uneti broj elemenata niza);
scanf(%d,&n);
for(i=0;i<n;i++)
{
printf(%3d.broj x=,i);
scanf(%f,&x*i]);
}
/*Izracunava indeks maksimalne vrednosti u nizu*/
xmax=x[0]; /*pretpostavljajuci da je x[0] najveca vrednost*/
imax=0;
/*sacuvamo njen indeks*/
for(i=1;i<n;i++)
if(x[i]>xmax) /*kada se naidje na element veci od xmax*/
{
/*zamenjuje se vrednost xmax I imax*/
xmax=x[i]; /*sa x[i] I indeksom i*/
imax=i;
}
printf(\nIndeks maksimalne vrednosti je %d\n,imax);
}

Example No20a
DRUGO RESENJE ISKLJUCUJE UPOTREBU
PROMENLJIVE XMAX:
imax=0;
for(i=1;i<n;i++)
if(x[i]>x[imax])
imax=i;

44

4/3/2013

Inicijalizacija Nizova
Nizovima je u C jeziku moguce dodeljivati pocetne vrednosti. Ako se
inicijalizacija ne zadaje eksplicitno niz se inicijalizuje nulom, Medjutim
ako je potrebno da se niz inicijalizuje vrednostima razlicitim od nule
potrebno je da se pri deklaraciji niza izmedju viticastih zagrada navedu
zeljene vrednosti razdvijene zarezom.
Int dani [12]= {31,28,31,30,31,30,31,31,30,31,30,31}
main()
{
int i;
extern int dani[ ]; /*neobavezna deklaracija*/
for (i=0; i<12; i++)
printf(Mesec%d ima%dana.\n,i+1,dani[i]);
}
Izvrsavanjem programa se ispisuje:
Mesec 1 ima 31 dana

Nizovi i pokazivai
Ime niza ekvivalntno je adresi njegovog nultog elementa
x =&x[0], jer se u oba dela jednakosti definiu adrese nultog
elementa niza.
Na primer ako je data deklaracija
int x[4],*pti;
Dodela pti=x i ako je niz smeten poev od adrese 56006
(&x[0]), da bi se odredile lokacije i elementi niza na koje
pokazuju
pti, pti+1 pti+2pti+3. Dodavanje
jedinice
pokazivau automatski povedava adresu na koju on pokazuje
za 2 jer se radi pokazivau na int tip.

45

4/3/2013

Nizovi i pokazivai
Oba dela jednakosti X= &x[0] definiu adresu
nultog elementa niza. Obe oznake su konstante
pokazivakog tipa i ne mogu se menjati. Prema
tome njih moemo dodeljivati
pokazivakim
promenljivim.
x+2 ==&x[2]
/*jer su im iste adrese*/
*(x+2) == x[2]
/*jer su im iste vrednosti*/
Odavde se vidi da se pokazivai mogu koristiti za
adresiranje elemenata niza , kao i za dobijanje
njihove vrednosti.

Nizovi i pokazivai
Kada se navede X+2 to kompajler tretira kao
adresu koja se dobija dodavanjem na adresu
X ne 2, ved 2 puta broj baytova koje
zauzimaju komponente niza X.
U sutini se radi o razliitim oznakama za
jedno te isto, jer kompajler pretvara oznake
niza u pokazivae , pa je brzine radi,
preporuljivo koristiti pokazivae.

46

4/3/2013

Ilustracija pokazivaa i adresa na koje ukazuju

pti
Adresa: 56006 56007

X[0]

Pokazivaci
pti, pti+1,

pti+1
56008 56009

pti+2

pti+3

56010 56011

56012 56013

X[1]

X[2]

X[3]

pti+2 i pti+3

redom pokazuju na adrese:


56006,
56008, 56010
i elemente niza:
x[0],
x[1],
X[0]

i 56012

x[2]

x[3],

POKAZIVAI NA NIZOVE
1004
1008
1012
1016
1020

1
2
3
4

v[0]

int v[ ] = {1, 2, 3,4};


/*niz */
int* p1 = v;
/*pokaziva na niz odnosno uvek na prvi ele
ment niza tj. p1=&v[0] */

v[1]
v[2 ]

int* p2 = &v[1];

v[3]

int* p3 = &v[4];

/*pokaziva na prvi element niza */


/*pokaziva na poslednji element niza */

\0

Primer:
.....
2010

tampanje zadatog niza


1004
1020

p1
p2
p3

Sa indeksom

Sa pokazivaem

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


printf("%d ", a[i]);

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


printf("%d ", p1++);

47

4/3/2013

Funkcije, nizovi, pokazivai, parametri, prenoenje


argumenata ...
Prenoenja nizova kao argumenata moe se analizirati na
problemu odreivanja broja studenata koji su imali
natprosene rezultate na proveri znanja iz osnova
programskog jezika C.
Algoritam ovog problema se moe razloiti na sledede
module
Uitavanje vrednosti elemenata niza
Izraunavanje prosenog rezultata
Prebrojavanje natprosenih rezultata
Ispis izlaznog izvetaja

Example No .
main(){
int n,i,broj,ocena[50]; /*niz od 50 elemenata*/
float prosek();
printf('\n Unesi broj takmicara:');
scanf(%d',&n);
/*ucitavanje elemenata niza*/
printf('\n Unesi rezultate:\n');
for (i:=0;i<n;i++)
{
printf('ocena[%d]+',i);
scanf('%d,&ocena[i])
}

To be continue

48

4/3/2013

Contnue.
/*prebrojavanje natprosecnih rezultata*/
broj=0
for(i=0;i<n;i++)
if(ocena[i]>prosek(ocena,n))
broj++;
printf(''prosecan rezultat je:%f.\n'',prosek(ocena,n));
printf (''natprosecne rezultate je imalo:%d takmicara.\n'',broj);
}
float prosek(int x [],int n){
int i,suma;
suma=0;
for(i=0;i<n;suma+=x[i],i++);
return ((float)suma/n);
}

Funkcije, nizovi, pokazivai, parametri,


prenoenje argumenata ...
Pri definiciji funkcije prosek() koja se poziva iz main()
deklaracija int x[] kreira, ne niz, ved pokaziva na niz:
float prosek(int *x, int n)
{
int i,suma;
suma=0;
for(i=0;i<n;suma+=*(x+i),i++);
return ((float)suma/n);
}

49

4/3/2013

Funkcije, nizovi, pokazivai, parametri,


prenoenje argumenata ...
Poziv funkcije
prosek (ocena,n) sadri ime ocena koje predstavlja
adresu nultog elementa od najvie 50 elemenata.
Time se pri pozivu funkcije predaje pokazivaka
konstanta (adresa nultog elementa niza)
ocena = &ocena[0]
To znai da je formalni parametar funkcije
pokazivakog tipa pa se u funkciji prosek() moe
izvriti deklaracija na slededi nain
prosek(int *x,int n)

Funkcije, nizovi, pokazivai, parametri,


prenoenje argumenata ...
Operatori
int x [];
int*x;

Su ekvivalentni jer oba deklariu promenljivu x kao


pokaziva na niz celih brojeva
... Operatori koji u funkciji prosek () koriste pokaziva
*X rade sa nizom ocena koji se nalazi u telu funkcije
main() Poziv funkcije inicijalizuje pokaziva X tako
da pokazuje na ocena [0] Kada index i u funkciji
prosek ()
uzme vrednost 4 tada je izraz x [4]
ekvivalentan sa *(x+4).

50

4/3/2013

Funkcije, nizovi, pokazivai, parametri,


prenoenje argumenata ...
Znai poto (x+0) pokazuje na ocena[0] to
x+4 pokazuje na ocena[4].
Prenos jednodimenzionalnih nizova
se
ostvaruje navoenjem imena niza u pozivu
funkcije bez ikakvog indeksa. Na ovaj nain
u funkciju se prenosi informacija (adresa) o
lokaciji niza u pozivajudoj funkciji.

Funkcije, nizovi, pokazivai, parametri,


prenoenje argumenata ...
ak i deklaracija x [100] ima isto znaenje kao i x []
jer C kompajler generie kod koji funkciji predaje
pokaziva tako da je beznaajna specificirana duina
niza.
X== &x[0]
X +0== &x[0]
X+2 ==&x[2]
*(x+2) == x[2]
*(x+i) == x[i]

/*jer su im iste adrese*/


/*jer su im iste vrednosti*/

Prema tome jednodimenzionalni nizovi se prenose


iskljuivo po adresi

51

4/3/2013

Sortiranje nizova
Program kojim se koridenjem odgovarajude funkcije uitani
niz sortira u monotono neopadajudi poredak

Example No 21

main()
{
int
float a[50];
void citaj();
void pisi();
void sort1();
printf(\nUneti broj elemenata niza:);
scanf(%d,&n);
printf(\nUnesi elemente niza:\n);
citaj(a,n);
sort1 (a,n);
printf(Niz posle sortiranja je:\n);
pisi(a,n);
}

Example No 21
void citaj(float x[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf(x*%d+=,i);
scanf(%f,&x*i+);
}
}
void pisi(float x[],int n)
{
int i;
for(i=0;i<n;i++)
printf(x*%d+=%f\n,i,x[i]);
}

52

4/3/2013

Example No 21
void razmeni(float*a,float*b)
{
float pom;
pom=*a;*a=*b;*b=pom;
}
void sort(float a[],int n)
{
int i,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j])
razmeni(&a[i],&a[j]);
}

ISTI ALGORITAM SE MOGAO


PRIMENITI U FUNKCIJI KOJA
KORISTI POKAZIVACE:
void sort1(float*a,int n)
{
int i,j;
for(i=0;n-1;i++)
for(j=i+1;j<n;j++)
if(*(a+i)>*(a+j))
razmeni(a+i,a+j);
}

Viedimenzionalni nizovi
Dvodimenzionalni nizovi se se u memoriji registruju po
vrstama zauzimajudi susedne memorijske lokacije.ako se
dvodimezionalni niz deklarie na slededi nain:
int a[3][2] ; njegovi elementi de biti rasporeeni na slededi
nain: a [0][0] a [0][1] a [1][0] a [1][1] a [2][0] a [2][1]
Imajudi ovo u vidu, ako definiemo pokaziva na int tip
int * poki, dodelom
poki = a;
definie pokazivaka promenljiva na element u nultoj vrsti i
koloni jer vai jednakost
a =& a [0][0]

53

4/3/2013

Viedimenzionalni nizovi
Prema navedenoj deklaraciji vai:
poki =& a [0][0]
Poki+1 =& a [0][1]
Poki+2 =& a [1][0]
Poki+3 =& a [1][1]
Poki+4 =& a [2][0]
Poki+5 =& a [2][1]
U ovom primeru a je ime dvodimenzionalnog niza a, a [0], a [1], a [2]
su imena jednodimenzionalnih nizova koje predstavljaju vrste matrice.
Ime niza je pokaziva na taj niz jer pokazuje na njegov prvi element, tako da vai:
a [0] =& a [0][0]
a [1] =& a [1][0]
a [2] =& a [2][0]
Ova osobina nam koristi da funkciju namenjenu za obradu jednodimenzionalnog
niza koristimo pri obradi vrsta dvodimenzionalnog niza.

Example No 22
main()
{
static float a[3][4]={
{1.0,2.0,3.0,4.0},
{11.5,22.4,33.3,44.2},
{10.1,20.2,30.3,40.4}
};

int i;
float sredina();
for (i=0;i 3;i++)
printf(srednja vrednost vrste %d je %f\n,i,sredina(a*i+,4));
/*a[i] je jednodimenzionalni niz od etirielementa*/
}
float sredina(float x[],int n)
{
int i;
float suma=0;
for (i=0;i<n;i++)
suma+=x[i];
return suma/n;
}

54

4/3/2013

Example No 23
main()
{
int i,n;
int x[10][10]
void citaj();
void pisi();
void sort1();
printf(\nUneti broj vrsta matrice:);
scanf(%d,&n);
printf(\nUnesi elemente matrice po vrstama :\n);
citaj(x,n);
sort1(x[i],n);
printf(matrica posle sortiranja je:\n);
pisi(x,n);
}

Example No 23
/*funkcija koja ucitava elemente matrice*/
void citaj(int x[][10],int n)
{

int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{

printf(x*%d,%d+=,i,j);
scanf(%d,&x*i+*j+);
}
}

/*funkcija koja ispisuje elemente matrice*/


void pisi(int x[][10],int n)
{

int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf(%3d,x*i+*j+);
printf(\n);
}
}

55

4/3/2013

Example No 23
void razmeni(int*a,int*b)
{
float pom;
pom=*a;*a=*b;*b=pom;
}
void sort_po_vrstama(int a[][10],int n)
{
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++)
if(a[i][j]>a[i][k])
razmeni(&a[i][j],&a[j][k]);
}

Znakovni nizovi u jeziku c


Jezik C nema ugraen znakovni niz podataka . Umesto
toga, jezik C sledove znakova koji se zavravaju
nultim znakom (NULL) tretira kao znakovne nizove.
Znakovni nizovi mogu se napraviti deklarisanjem niza
znakova
i dodeljivanjem
vrednosti njegovim
elementima . Zavrni znak mora biti nulti znak, koji se
prikazuje kao znakovna konstanta sa vrednodu \0.
Bez ovog znaka imate obian niz znakova.

56

4/3/2013

(Malo podsedanja)
main()
{
char c = A;
printf(/ %c / %d / %o / %x \n,c,c,c,c);
}
Izvrsavanjem programa dobija se:
/A/65//101/41
65- ASCII dekadna vrednost
101- ASCII oktalna vrednost
41- ASCII heksadekadna vrednost

Da sumiramo
Znai, izraz A je znakovna konstanta
a, A je prikriven, skradeni, prikaz
konstantnog znakovnog niza sastavljenog iz
dve znakovne konstante A i \0 .

57

4/3/2013

Inicijalizacija znakovnih nizova

Rekli smo da je nizovima u C jeziku mogude


dodeljivati poetne vrednosti. Ako se inicijalizacija
ne zadaje eksplicitno niz se inicijalizuje nulom,
meutim, ako je potrebno da se niz inicijalizuje
vrednostima razliitim od nule potrebno je da se
pri deklaraciji niza izmedju vitiastih zagrada
navedu eljene vrednosti razdvijene zarezom.

Inicijalizacija znakovnih nizova


Nizovi se mogu inicijalizovati koridenjem string konstanti. Na
primer, operator
static char tekst * +=,F,e,s,t,i,n,a,t,a,m,
s,e,m,e,n,t,e,m, s,a,e,p,e, d,e,c,i,p,e,r,e,,
s,e,r,o,t,i,n,a,m,s,e,m,p,e,r,\0 -;
inicijalizuje statiki niz tekst datom string konstantom ili
skradeni oblik inicijalizacije izgleda ovako:
static char tekst [ ]={
Festinatam sementem saepe decipere, serotinam semper
};

58

4/3/2013

Nizovi karaktera i pokazivai

Poto je ime niza ekvivalentno adresi njegovog nultog


elementa ( predstavlja pokaziva na nulti element) tako
je i string konstanta pokaziva na nulti element niza u
kome je registrovan string.
Operator
static char s[ ] = IBM PC ; inicijlizije statiki niz s
datom string konstantom On predstavlja skradeni oblik
inicijalizacije
static char s[ ] = ,I,B,M, P,C, \0-;
Ako bi se izostavio zavrni znak to vie ne bi bio string
ved samo niz znakova.
Kao i kod drugih nizova ime s predstavlja pokaziva na
nulti element.

s =& s[0], *s = I , *(s +1) = s[1] = B ,

Nizovi karaktera i pokazivai


Za kreiranje stringa moe se koristiti i pokaziva. Na primer
deklaracijom:
char *pok = Festinatam sementem saepe decipere, serotinam
semper ;
pokaziva pok je inicijalizovan adresom nultog znaka stringa
Ekvivalentna inicijalizacija se moe realizovati slededim
operatorima:
char *pok;
pok = Festinatam sementem saepe decipere, serotinam semper
;
Za razne operacije nad ovim stringom dovoljno je da znamo
adresu njegovog nultog znaka.

59

4/3/2013

Example N0 .... koji ispisuje string u direktnom i


inverznom poretku.
main()
{
static char s[ ]={ Festinatam sementem saepe decipere,
serotinam semper };
char *pok;
pok = s;
while (*pok)
/*ili while (*pok!= \0 ) */
putchar (*pok++);
while (--pok >=s)
putchar (*pok);
putchar (\n );
}

Inicijalizacija stringova
Opisom stringa pomodu niza u statikoj memoriji
se kreira niz. Svaki element niza se inicijalizuje
odgovarajudim znakom a ime niza postaje sinonim
adrese nultog elementa. Ime niza je konstanta
pokazivakog tipa koja se ne moe menjati.
Opisom stringa pomodu pokazivaa takoe se u
statikoj memoriji kreira niz
ali i rezervie
memorijski prostor za pokazivaku promenljivu koja
pokazuje na poetak stringa. Njena vrednost se
moe menjati
na primer sa ++ pok da bi se
definisao pokaziva na slededi znak stringa.

60

4/3/2013

Pokazivai na stringove
Primer funkcije kojom se na osnovu
parametara koji je
POKAZIVA NA STRING
ispituje da li je dati string palindrom

Funkcija palindrom
int palindrom (char * strpok)
{
char *strpok1 = strpok;
while (*strpok1)
++strpok;
--strpok1;
/* povratak unazad za jedan znak */
while (strpok<strpok1)
if(*strpok++!=*strpok1--) /* poredjenje simetricnih znakova*/
return 0;
return 1;
}

61

4/3/2013

Testiranje funkcije palindrom


main()
{
if (palindrom(ANAVOLIMILOVANA))
printf(string 1 je palindrom\n);
if (palindrom(ASTERIX))
printf(string 2 je palindrom\n);
}

Example No 25
char veliko (char c)
{
if (c<=z && c>=a)
return (A+c-a);
else return (c)
}

62

4/3/2013

Nizovi pokazivaa na stringova


Koristedi niz stringova Stringu se moe pristupiti preko indexa.
Deklaracijom:
static char *jezici [4] = ,PASCAL,MODULA,C++, ADA-;
Definisan je niz pokazivaa jezici na stringove
Nulti pokaziva jezici [0] pokazuje na nulti string, prvi pokaziva jezici [1]
pokazuje na prvi string , tako da vai :
*jezici *0+=P, *jezici *1+=M, *jezici *2+=C, *jezici *3+=A
jezici

[0]

PASCAL

jezici

[1]

MODULA

jezici

[2]

C++

jezici

[3]

ADA

NIZOVI POKAZIVAA

Adr. Vred.

Naziv

1004

1036

Dan[0]
0

1008

1044

Dan[1]
1

1032

1077

Dan[6]

1036

1037

1038

1039

....

#include <stdio.h>
main()
{
static char *dani[] = {"Nedelja", "Ponedeljak",
"Utorak", "Sreda", "Cetvrtak", "Petak",
"Subota"};
int i;
for( i = 0; i < 6; ++i );
printf( "%s\n", dani[i]);
Rezultat
}
Nedelja
Ponedeljak

Subota

1040

1041

1042

1043

\0
\0

1044

1045
.....
1052
1053
....

o
..
\0
\0
U
..

1081

1082

1083

\0

.....

63

4/3/2013

Nizovi pokazivaa
Ime niza je dani. Veliina niza nije specificirana.
Prevodilac, onaj bistrooki, de izraunati veliinu
niza.
Svaki element niza je pokaziva na znak. Zbog
prisustva konstantnih znakovnih nizova u
inicijalizatorskoj listi nizovi se smetaju negde u
memoriji, a njihove adrese u NIZ DANI. U
elementu 0 nalazi se adresa konstantnog
znakovnog niza Nedelja a, u elementu 1
adresa niza Ponedeljak....

Strukture
Struktura predstavlja skup podataka

kojim se opisuju
svojstva objekta ili, strukture predstavljaju sloene
objekte koji se sastoje od komponenti raznih tipova
Komponente koje obrazuju strukturu nazivaju se
elementi strukture

Opis strukture:
struct oznaka_str
{
Tip ime _elementa1
Tip ime _elementa2
};

64

4/3/2013

Deklaracija strukturnih promenljivih


Ako definiemo model strukture oznaene sa linost
ispred funkcije main ()
#define MAXIME 31
#define MAXADRESA 41
struct licnost
{
char ime [MAXIME];
char adresa [MAXADRESA];
unsigned starost;
};

Tada u funkciji moemo opisati strukturne promenljive


koridenjem oznake strukture
struct licnost osoba 1, osoba2;

Strukture koje sadre pokazivae


Dva niza znakova u ovoj strukturi zauzimaju
prostor fiksne veliine . Poto su lanovi
strukture ime i adresa nizovi oni zauzimaju
podjednako veliki memorijski prostor bez obzira
ta je u njih upisano.
Efikasniji nain organizovanja podataka je
koridenje POKAZIVAA kao lanova strukture i
njihovo usmeravanje na efikasnije i
ekonominije smetanje znakovnih nizova.

65

4/3/2013

Strukture koje sadre pokazivae


Nova deklaracija ablona strukture
struct licnost
{
char *ime;
char *adresa ;
unsigned starost;
};
Dva niza znakova zamenjena su pokazivaima na znak pri
emu svaki zauzima onoliko mesta koliko je potrebno za
pokaziva

Deklaracija strukturnih promenljivih


Pri opisu strukturnog modela dozvoljeno je da se
definiu i promenljive, tako da je:
struct licnost osoba 1, osoba2;

skradeni zapis
struct licnost
{
char ime [MAXIME];
char adresa [MAADRESA];
unsigned starost;
}osoba1, osoba2;

66

4/3/2013

Inicijalizacija i dodela vrednosti strukturnim


promenljivim
Elementima strukturne promenljive mogud je
direktan pristup ( bez nabrajanja elemenata koji mu
prethode.
Pristup elementima ime, adresa, starost promenljive
osoba1 moe se ostvariti pomodu sloenih imena
osoba1. ime
osoba1.adresa
osoba1.starost

Inicijalizacija i dodela vrednosti strukturnim


promenljivim
Elementima strukture mogu se uitavati vrednosti
koridenjem funkcija gets() i scanf()
gets(osoba1.ime);
gets(osoba1.adresa);
scanf(%d,&osoba1.starost);

67

4/3/2013

Inicijalizacija i dodela vrednosti strukturnim


promenljivim

Za uitavanje stringova jednostavnije je koristiti funkciju


gets() od scanf().

Funkcija gets() prihvata znake sa tastature dok ne naie na


znak za novu lininju (\n) koji se proizvodi pritiskom na taster
ENTER. Funkcija predaje uitane znake pozivajudoj funkciji
ignoriudi znak za novu liniju i dodajudi zavrni ili nulti znak
(\0)
Funkcija scanf() omogudava uitavanje meovitih podataka u
standardnoj formi.
o poinje znakom koji nije praznina,
o ako je specifikacija %s uitava se do prvog praznog znaka, ali ignoriudi ga

Strukturne promenljive i pokazivai


Ako je definisana pokazivaka promenljive osoba:
struct linost*osoba;

Elementima strukture na koju ova promenljiva pokazuje


moe se pristupiti koridenjem operatora taka
(*osoba).ime
(*osoba).adresa
(*osoba).starost

Radi jednostavnijeg pristupa elementima strukturne


promenljive na koju pokazuje pokazivaka promenljiva
uveden je operator strelica u desno (->)
osoba->ime
osoba->adresa
osoba->starost

68

4/3/2013

Example No .
Napisati program kojim se uitavaju podaci za
dve osobe i ispisuju podaci o starijoj
#include<stdio.h>
#define MAXIME 31
#define MAXADRESA 41
struct licnost
{
char ime[MAXIME];
char adresa[MAXADRESA];
unsigned starost;
};

Example No .
void citaj(struct licnost * osoba)
{
printf(Unesite ime osobe:);
gets(osoba->ime);
printf(Unesite adresu osobe:);
gets(osoba->sdresa);
printf(Unesite starost osobe:);
scanf(%u,&osoba->starost);
while(getchar()!=\n);
/*ocistiti ulazni string iz scanf jer je nova linijaseparator */

69

4/3/2013

Example No .
main()
{
struct licnost osoba 1,osoba2,*stariji;
printf(Unesi poidatke za prvu osobu:\n);
citaj(&osoba 1);
printf(Unesi podatkke za drugu osobu:\n);
citaj(&osoba2);
if (osoba1.starost>osoba2.starost)
stariji=&osoba1;
else
stariji=&osoba2;
printf(Stariji je:);
printf(%s,%s,star:%ug.\n,stariji->adresa,stariji->starost);
}

Nizovi struktura
Niz struktura se opisuje kao i svaki drugi niz deklaracijom
struct licnost osoba[MAXOS]
Ovom deklaracijom opisuje se struktura od MAXOS elemenata.
Svaki element predstavlja strukturu tipa linost.
Ako deklariemo pokaziva na strukturu licnost
struct licnost osoba[MAXOS], *pok_lic;
Otada su inicijalizacije pokazivake promenljive
pok_lic=osoba;
pok_lic=&osoba [0]; ekvivalentne
Poto pok_lic pokazuje na osoba [0], to pok_lic +1 pokazuje na
osoba [1].
osoba [0].starost == (*pok_lic) starost== pok_lic-> starost

70

4/3/2013

Example No .
Napisati program kojim se itaju broj fudbalskih ekipa,
za svaku ekipu: naziv, broj osvojenih bodova i gol razlika
, a zatim ispisuje tabela sa gol razlikom.
# define MAXIME 30
#define MAXEKIPA 20
struct tabela
{
char ime [maxekipa];
unsigned bodovi;
int razlika;
};

main()
{
int n;
struct tabela ekipa[MAXEKIPA];
void citaj();
void pisi();
void sort();
printf(''\n Unesi broj ekipa:'');
scanf(''%d'',&n);
printf(''\n Unesi ime,bodove I gol-razliku svake ekipe:\n'');
citaj(ekipa,n);
sort(ekipa,n);
printf(''Niz posle sortiranja je :\n'');
pisi(ekipa,n);
}

71

4/3/2013

void citaj(struct tabela x[],int n)


{
int i;
for(i=0;<n;i++)
{
printf(''%d.'',i+1);
scanf(''%s %u %d',&x[i].ime,&x[i].bodovi,&x[i].razlika);
}
}

void pisi(struct tabela x[],int n)


{
int i;
for(i=0; i<n;i++)
printf(''%d. %s %u %d\n'',i+1,x[i].bodovi,x[i].razlika);
}

72

4/3/2013

void razmeni(struct tabela *a, struct tabela *b)


{
struct tabela pom;
pom=*a;*a=b;*b=pom;
}

void sort (struct tabela a[],int n)


{
int I,j;
for(i=0;i<n-1;i++)
for(j=I+1;j<n;j++)
if((a[i].bodovi<a[j].bodovi)||((a[i].bodovi==a[j].bodovi&
&(a[i].razlika<a[j].razlika)))
razmeni(&a[i],&a[j]);
}

73

4/3/2013

DINAMIKO DODELJIVANJE MEMORIJE


U programskom jeziku C mogude je izvriti
dinamiku dodelu memorijskog prostora, tako da
se u toku izvrenja programa koristi samo
potreban memorijski prostor. Statika dodela je
neracionalna.
Dinamikim
zauzimanjem
memorijskog prostora, koje se obavlja tokom
izvrenja programa, postie se racionalno
koridenje memorije. U toku programa mogude je
dodeljivanje
i
otkazivanje
"rezervacije"
memorijskog prostora.

DINAMIKO DODELJIVANJE MEMORIJE


Za razliku od statike dodele memorije gde se
podacima pristupa preko imena promenljivih,
dinamiki pristup podacima vri se uglavnom preko
pokazivaa. Sama dodela memorije obavlja se uz
pomod bibliotenih funkcija koje se nalaze u
<stdlib.h> kao to su:
malloc(n) - funkcija dodeljuje memoriju od n
bajtova;
calloc(x,n) - dodeljuje memorijski prostor za x
komponenti niza od n bajtova.
free(p) - oslobaa prostor.

74

4/3/2013

malloc
char *malloc( unssigned n)
gde n predstavlja broj bajtova koje izdvaja
funkcija.
Vreednost funkcije je znakovni pokaziva na prvi
bajt izdvojene oblasti.
Slededi operatori funkcijom malloc izdvajaju 200
bajta
int *pint
pint = (int*) malloc(200)

sizeof
sizeof (izraz) - Vrada memorijski prostor
neophodan za uvanje izraza
sizeof (T) - Vrada memorijski prostor
neophodan za uvanje vrednosti tipa T

75

4/3/2013

Statika dodela memorije


Prilikom definicije niza od n lanova u pokazivau niz
poinje sa adresom u memoriji prvog elementa niza.
int *niz;
niz=calloc(n,sizeof(int));
Na ovaj nain dodeljivanja memorijskog prostora
unapred je definisan broj lanova niza n, tj veliina
memorije na poetku izvrenja program. Ovako se
rezervie n puta 2 (4) bajta jer je sizeof(int) 2 ili 4 u
zavisnosti od raunara.

Dinamika dodela memorije


Kada je potrebno rezervisati prostor za pokaziva
p sa jo nedefinisanim sadrzajem treba napisati
sledede: p=(int*)malloc(sizeof(int);

76

4/3/2013

Dinamika dodela memorije


Rezervisanom prostoru se moe pristupiti samo preko
pokazivaa p naredbom:
*p=5;
na adresi 1253 dolazi vrednost 5.

Dinamika dodela memorije


Funkcija free oslobaa prostor u memoriji
koji je prethodno rezervisan preko funkce
malloc, a ija se adresa nalazila u
pokazivau p.
free(p)
Vrednost koja se nalazi na toj adresi na
koju je upudivao pokaziva p ostaje, ali joj
se vie ne moe pristupiti

77

4/3/2013

Dinamika dodela memorije


Vrednost koja se nalazi na toj adresi na koju
je upudivao pokaziva p ostaje, ali joj se vie
ne moe pristupiti

Example N
#include <stdio.h>
/* Neophodno je ukljuciti stdlib.h */
#include <stdlib.h>
main()
{
int n;
/* Deklaracija int a[n]; nije dozvoljena, jer kompajler ne moze u
vreme prevodjenja da odredi potrebnu kolicinu memorije.
Umesto ovoga, vri se dinamika alokacijai memorije tj.
rezervacija memorije u fazi izvrsavanja rograma kada bude
poznata vrednost broja n. Zbog toga je potrebno upamtiti samo
adresu pocetka
alociranog bloka sto
se
postize
koriscenjem sledeceg pokazivaca: */

78

4/3/2013

Example N
int* a;
int i, max;
printf("Unesi dimenziju niza : ");
scanf("%d", &n);
/* U ovom treunutku se zna koliko je memorije
potrebno i poziva se funkcija malloc za dinamicku
alokaciju. */

Example N
a = (int*) malloc(n*sizeof(int));
/* U slucaju da nema dovoljno memorije malloc vraca
NULL */
if (a == NULL)
{
printf("Greska : Nema dovoljno memorije!\n");
return 1;
}

79

4/3/2013

/* Kao obican niz */


for (i = 0; i<n; i++)
{
printf("a[%d]=", i);
scanf("%d", &a[i]);
}
/* Nalazi maksimum */
max = a[0];
for (i = 1; i<n; i++)
if (a[i] > max)
max = a[i];
printf("Najveci element je %d\n", max);
/*Alocirana memorija se oslobadja */
free(a);
return 0;
}

DINAMIKA ALOKACIJA MEMORIJE


CODE
STATIC DATA
System
space

Program
space

Compile-time
allocate
memory

STACK
Run-time
allocate
memory

HEAP

80

4/3/2013

DINAMIKA ALOKACIJA MEMORIJE


Rezervacija i oslobadjanje
heap

memory manager
Potreban je memorijski blok veliine n
malloc(n) ili calloc(x,n)
Nije vie potreban memorijski blok
free(p)

user code

Ovde je pokaziva bloka

malloc(n) - funkcija dodeljuje memoriju od n bajtova;


calloc(x,n) - dodeljuje memorijski prostor za x komponenti niza od n bajtova.
free(p) - oslobaa prostor.

PROGRAM UNOSI NIZ PROIZVOLJNE DIMENZIJE I


NALAZI NAJVECI ELEMENT
*/#include <stdio.h> /* Neophodno je ukljuciti stdlib.h */
#include <stdlib.h>
int main(){
int n; int* a;
int i, max;
printf("Unesi dimenziju niza : ");
scanf("%d", &n);
a = (int*) malloc(n*sizeof(int));
/* U slucaju da nema dovoljno memorije malloc vraca NULL */

if (a == NULL) {
printf("Greska : Nema dovoljno memorije!\n");
return 1; }
/* Nadalje a koristimo kao obican niz */

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


{printf("a[%d]=", i);
scanf("%d", &a[i]); }
/* Nalazimo maksimum */

max = a[0];
for (i = 1; i<n; i++)
if (a[i] > max) max = a[i];
printf("Najveci element je %d\n", max);
/* Duzni smo da rucno alociranu memoriju rucno i oslobodimo */

free(a);
return 0;}

81

4/3/2013

POKAZIVAI NA MATRICE
Matrica je po definiciji
dvodimenzionalni niz.
Matrica predstavlja niz
jednodimenzionalnih
nizova.
U memoriji su smetene u
jednodimenzionalni niz tako to se
prvo smeta prvi red matrice a zatim
redom i ostali stoga pokaziva ukazuju
na niz pokazivaa koji ukazuju na
niz(red) podataka.

DINAMIKA ALOKACIJA MATRICE


int i, j, n; /*i, j indeksi matrice; n veliina*/
double **a;

Alociranje memorije za n elemenata double pokazivaa

a = (double **) calloc(n, sizeof(double *));


Alociranje memorije za redove matrice
(n elementa-double)

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

a[i] = (double *) calloc(n, sizeof(double));

a[n-1]

....
a

...

n-1

....

a[1]

...

n-1

a[0]

...

n-1

82

4/3/2013

FORMIRANJE I BRISANJE MARTICE


I polu dinamiko
II dinamiko
#include <stdio.h>
#include <stdlib.h>
main ()
{
int *a[5]; /* Niz pokazivaca na int.

*/

int m, n, i, j;
/* Broj vrsta i kolona: */
printf ("m,n? "); scanf ("%d%d", &m, &n);
/* Stvaranje matrice: */
for (i=0; i<m; i++)
{
a[i] = malloc (n*sizeof(int));
for (j=0; j<n; j++) printf ("%4.4d
*(a[i]+j)=100*i+j,(a[i]+j));
putchar ('\n');
/* Unistavanje matrice: */
for (i=0; i<m; i++) free(a[i]);
}

a%d ",

#include <stdio.h>
#include <stdlib.h>
main ()
{
int **a; /* Pokazivac na pokazivac na
int.*/
int m, n, i, j;
/* Broj vrsta i kolona: */
printf ("m,n? "); scanf ("%d%d", &m, &n);
/* Stvaranje matrice: */
a = malloc (m*sizeof(int*));
for (i=0; i<m; i++)
{
*(a+i) = malloc (n*sizeof(int));
for (j=0; j<n; j++)
printf ("%4.4d ", *(*(a+i)+j)=100*i+j);
putchar ('\n'); }
/* Unistavanje matrice: */
for (i=0; i<m; i++) free(*(a+i));
free (a); }

Povezane strukture podataka


Struktura koja sadri pokaziva na objekat
istog tipa kao to je i ona sama naziva se
samoupudujua struktura podataka, to je
osnova za vezane liste, koje mogu biti:
Jednostruko povezane liste
Dvostruko povezane liste

83

4/3/2013

Jednostruko povezane liste


Jednostruko povezana lista je skup vorova
povezanih pokazivaima u jednom smeru.
Svaki vor je strukturna promenljiva koja ima
najmanje dva elementa:
jedan za uvanje informacija, i
drugi koji se koristi za uvanje pokazivaa na
slededi vor liste

Deklaracija jednostruko povezane liste


vezane liste
typedef char TIP
typedef struct cvor_st
{
TIP inf;
struct cvor_st *sledeci ;
} LCVOR;
LCVOR *pocetak_liste;
Na poetak liste pokazuje pokazivaka promenljiva
pocetak_liste. Krajnji vor liste u elementu za vezu (sledeci)
sadri vrednost NULL.

84

4/3/2013

Kreiranje vora
Da bi se kreirao prvi dinamiki objekat ( vor liste ) mora
mu se dodeliti neophodan memorijski prostor.
novi = (LCVOR*)malloc(sizeof (LCVOR));
Gde je novi pokazivac na LCVOR
Dinamikom objektu (voru liste ) mogu se dodeliti
vrednosti
novi->inf = A;
novi->sledeci = pocetak_liste ;
Da bi se promenljiva pocetak_liste pokazivala na poetak
treba joj dodeliti vrednost promenljive novi
pocetak_liste = novi

Novi vor liste


novi = (LCVOR*)malloc(sizeof (LCVOR));
Gde je novi pokazivac na LCVOR
Dinamikom objektu (voru liste ) mogu se dodeliti
vrednosti
novi->inf = B;
novi->sledeci = pocetak_liste ;
Da bi promenljiva pocetak_liste zaista pokazivala
na poetak ponavlja se dodela
pocetak_liste = novi

85

4/3/2013

Dvostruko povezane liste


Dvostruko povezane liste se prepoznaju po
paru lanova pokazivaa na vor kojima se
vorovi mogu povezati u oba smera.
Deklaracija tipa DCVOR formira novo ime
za tip strukture dcvor_st. Pokazivaci
unapred ( sledeci) i unazad ( prethodni)
pokazuju na tip DCVOR

Deklaracija vora dvostruko povezane liste


typedef struct dcvor_st
{
TIP inf;
struct dcvor_st *sledeci, *prethodni ;
} DCVOR;
LCVOR *pocetak_liste*pocetak, *tekuci;

86

4/3/2013

Rezime
Algoritmi, struktura podataka, kontrola toka
programa, funkcije i pokazivai predstavljaju
sr
programiranja. Programerska vetina
podrazumeva poznavanje ovih pojmova i
daje solidnu osnovu za osedaj
trenutka
kada i kako ih treba primeniti.

Osobine jezika C++


Tradicionalni nain programiranja je u osnovi
proceduralan, zasnovan na funkcionalnoj
dekompoziciji korisnikog, a zatim i programskog
zahteva.
Pri tome, podaci (atributi) koji se obrauju i
operacije nad njima nisu grupisani zajedno u
objektima kao to je to sluaj kod OBJEKTNO
ORJENTISANOG PROGRAMIRANJA, ved su razbacani
po programu.

87

4/3/2013

Osobine jezika C++


Osnovna ideja objektno orjentisanog programiranja
je da sve te podatke (atribute ) izvuemo iz
navedenih struktura i grupiemo po klasama
zajedno sa relevantnim operacijama (funkcijama).
Klase zatim struktuiramo hijerarhijski, formirajudi
hijerarhijsko stablo klasa, vodedi rauna da atributi
i operacije koji su zajedniki za sve klase budu na
viim hijerarhijama, kako bi ih nie hijerarhije
mogle koristiti preko mehanizma nasleivanja

Osobine jezika C++


Time se izbegava redundansa podataka i operacija.
Tako uaurenim podacima i operacijama definiemo
interface prema korisniku tih klasa a takoe i
interface izmeu pojedinih klasa u hijerarhiji klasa,
sakrivajudi kao implementacione detalje sve ono to
nije bitno za njihovo koridenje. Na taj naiin
stvaramo softverske komponente ( softverske ipove
) koje moemo nasleivati novim klasama i na taj
nain iste ugraujemo u nove softverske proizvode.

88

4/3/2013

Objektno Orijentisano Programiranje


osnovni koncept

apstrakcija
nasleivanje
polimorfizam

(abstraction)
(inheritance)
(polymorphism)

Klase su :
Prototipski mehanizam za stvaranje objekta,
omogudavajudi njihovu klasifikaciju po grupama sa istim
osobinama
Model za sve objekte koji se grade,
Agregacija podataka (atributa) obino razliitog tipa i
operacija, realizovanim funkcijama, nazvanim metodama
koje obrauju te atribute
Kolekcija vie objekata koji imaju istu strukturu
Prototipski mehanizam stvaranja objekata,
omogudavajudi njihovu klasifikaciju po grupama sa
slinim osobinama
Korisniki izveden tip podataka,

89

4/3/2013

Objekti su:
Nezavisne programske celine koje sadre
metode (funkcije) i podatke
Razliita pojavljivanja iste klase
Promenljive koje se kreiraju iz
struktura tipa klase
Individualna realizacija klasa

Klasi su pridodata svojstva:


Enkapsulacije (sakrivanje, uaurenje)
podataka (atributa i operacija nad njima)
Metode (operacije nad atributima klase)
Nasleivanje ( osobina da klase sa niih
hijerarhijskih nivoa mogu naslediti atribute
i metode klasa sa viih hijerarhijskh nivoa

90

4/3/2013

Enkapsulacija, sakrivanje ili uaurenje


podataka
Klasa omogudava zatvaranje i sakrivanje
podataka (atributa i metoda ) unutar klase.
C++ omogudava tri nivoa zatite podataka.
Public
Private
Protected

Public:
Kada je mogud m pristup svim lanicama objekta
klase iz:
bilo koje lanice te iste klase,ili
bilo koje druge klase, ili
bilo koje predefinisane funkcije (definisane u heder
datotekama), ili
bilo koje nae (sopstvene )funkcije, ili
bilo kog izraza u glavnom programu ili izvan njega
pod uslovom da je taj objekat u svom opsegu
vaenja (scope)

91

4/3/2013

Private:
pristup podacima klase je dozvoljen samo
lanicama klase tj metodama koje pripadaju
toj klasi .
Izuzetno, prisatup je dozvoljen specijalnim
metodama ispred ijeg naziva se stavlja re
FRIEND

Protected:
kada je mogud pristup svim podacima
objekta bazne klase od strane bilo koje
lanice izvedene klase ( klase koja nasleuje
baznu klasu)

92

4/3/2013

Metode
Funkcije koje su uaurene sa podacima
(atributima) unutar jedne klase nazivaju se
metode. Iste su obino public, ali mogu biti i
private i protected. Dve specijalne metode
koje slue za inicijalizaciju i unitavanje
objekata su:
konstruktor i destruktor.

Konstruktor
Objekti mogu imati jednu ili vie specijalnih
metoda koje se nazivaju konstruktorima, i koje
se koriste za inicijalizaciju objekata prilikom
njihovog deklarisanja kao pojavljivanja neke
klase. Ime konstruktora nosi ime svoje klase.

93

4/3/2013

Primer.......
class AutomatNovca
// Definisanje klase
{ double trezor; .................. // clan klase (podatak
atribut)
public :
//Kontrola pristupa
podacima
automatNovca (double p) {trezor=p;} // Kada se neka
metoda implementira u okviru same klase za istu se kaze
da je inline Ista se tada ponasa kao makro.
Void ulaganje (double);
// clan klase (metoda)
Double podizanje (double);
// clan klase (metoda)
};

Destruktor
Specijalna metoda destruktor koristi se
za brisanje ( unitavanje ) objekata.
Nosi ime svoje klase sa znakom ~
ispred imena.
Destruktor se automatski poziva uvek kada
objekat napusta svoj opseg scope vazenja

94

4/3/2013

Ilustracija...

class AutomatNovca
// Definisanje klase
{ double trezor; .................. // clan klase (podatak atribut)
public :
//Kontrola pristupa podacima
AutomatNovca (double p) {trezor=p;} // Kada se neka metoda
implementira u okviru same klase za istu se kaze da je inline
Ista se tada ponasa kao makro.
~AutomatNovca(void ) {cout'' destruktor se obavezno koristi
kod dinamickih <<''objekata\n'';
void ulaganje (double);
// clan klase (metoda)
double podizanje (double);
// clan klase (metoda)
};

Nasleivanje
Predstavlja mogudnost da se iz postojede
klase izvede nova klasa. Pri tome nova klasa
moe naslediti sve lanove postojede klase u
zavisnosti od definisanih naina pristupa.
Postojeda klasa se naziva bazna klasa dok se
klasa naslednik naziva izvedena klasa.

95

4/3/2013

Nasleivanje
Nasleivanje se moe koristiti i viestruko po
dubini
Nasleivanje je kljuni deo objektno orjentisanog
programiranja i omogudava dve vane prednosti
kod programiranja:
Visok stepen ponovnog koridenja istog koda
reuseability
Polimorfizam, koridenje istog naziva za funkcije
koje rade sline stvari.

96

You might also like