Professional Documents
Culture Documents
Cjezikjasno Prez
Cjezikjasno Prez
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
4/3/2013
Kompajler. Transformie
asemblerskom jeziku
4/3/2013
4/3/2013
4/3/2013
Tip argumenta
char
Jedan znak
int
int
int
x, X
int
string
String
float double
e, E
float double
Eksponencijalni zapis
g,G
float double
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
11
4/3/2013
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
Tipovi podataka
Osnovni
Celobrojni
Realni
Znakovni
Nabrojivi
Prazan
(int)
(float)
(char)
(enum)
(void)
14
4/3/2013
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
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
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
Aritmetike operacije
* /%+ - -
mnoenje
deljenje
izdvaja ostatak pri deljenju celih brojeva
sabiranje
oduzimanje
18
4/3/2013
- vede
- vede ili jednako
- manje
- manje ili jednako
- jednako
- razliito
Logike operacije
!
&&,
II
- negacija
- konjukcija
- disjunkcija
19
4/3/2013
Grananje u programu
Uslovni operator se pojavljuje u slededim
oblicima:
If (izraz) operator1
If (izraz) operator1 else operator2
else
operator2
20
4/3/2013
21
4/3/2013
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
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);
}
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
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.
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);
}
28
4/3/2013
main()
m
n
k
l
p
P = suma_kvadrata (2,4)
suma_kvadrata()
m
n
s
i
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.
Operatori
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
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.
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;
33
4/3/2013
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;
}
}
m
n
k
l
kv
i
m
n
*kub
kub
35
4/3/2013
36
4/3/2013
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 ;
..
}
40
4/3/2013
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
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
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
i 56012
x[2]
x[3],
POKAZIVAI NA NIZOVE
1004
1008
1012
1016
1020
1
2
3
4
v[0]
v[1]
v[2 ]
int* p2 = &v[1];
v[3]
int* p3 = &v[4];
\0
Primer:
.....
2010
p1
p2
p3
Sa indeksom
Sa pokazivaem
47
4/3/2013
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);
}
49
4/3/2013
50
4/3/2013
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]);
}
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+);
}
}
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]);
}
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
58
4/3/2013
59
4/3/2013
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
Example No 25
char veliko (char c)
{
if (c<=z && c>=a)
return (A+c-a);
else return (c)
}
62
4/3/2013
[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
65
4/3/2013
skradeni zapis
struct licnost
{
char ime [MAXIME];
char adresa [MAADRESA];
unsigned starost;
}osoba1, osoba2;
66
4/3/2013
67
4/3/2013
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
72
4/3/2013
73
4/3/2013
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
76
4/3/2013
77
4/3/2013
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
Program
space
Compile-time
allocate
memory
STACK
Run-time
allocate
memory
HEAP
80
4/3/2013
memory manager
Potreban je memorijski blok veliine n
malloc(n) ili calloc(x,n)
Nije vie potreban memorijski blok
free(p)
user code
if (a == NULL) {
printf("Greska : Nema dovoljno memorije!\n");
return 1; }
/* Nadalje a koristimo kao obican niz */
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.
a[n-1]
....
a
...
n-1
....
a[1]
...
n-1
a[0]
...
n-1
82
4/3/2013
*/
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); }
83
4/3/2013
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
85
4/3/2013
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.
87
4/3/2013
88
4/3/2013
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
90
4/3/2013
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