cpp predavanja
TRANSCRIPT
-
7/28/2019 Cpp Predavanja
1/334
1
Uvod
2
Literatura
Laslo Kraus: Programski jezik C++ sa reenimzadacima, Akademska misao
-
7/28/2019 Cpp Predavanja
2/334
3
Programski jezik C
Jezik opte namene
Ima karakteristike
viih programskih jezika
strukturirani tipovi podataka
upravljake strukture
niih programskih jezika (simbolikih programskih jezika)
rad sa bitovima
korienje procesorskih registara
pristup podacima pomou adrese operatore orijentisane ka hardveru raunara
4
Razvoj programskog jezika C
C je projektaovao Dennis Ritchie
1972 u Bell-ovim laboratorijama
Cilj razvoja novog jezika
jezika nezavisan od raunara
karakteristike vieg programskog jezika
korienje umesto simbolikih mainskih jezika koji suzavisni od raunara
Standardizovan 1989
standard izdao American National Standards Institute
ANSI C
-
7/28/2019 Cpp Predavanja
3/334
5
Razvoj programskog jezika C++
1980 su dodate klase, jezik je nazvan C sa klasama
Dalja proirenja jezika:
virtuelne funkcije (isto to i redefinisanje u Javi, ali nije sasvimisto to i apstraktna funkcija, koja je istavirtuelna funkcija)
preklapanje operatora
1983/84 je nazvan C++
ime oznaava da C++ nije novi programski jezik, ve proirenjejezika C
preko 95% jezika C je usvojeno bez izmena u C++
promenjeni su neki detalji radi obezbeivanja konzistentnosti novihkoncepcija u C++
Autor C++ je Bjarne Stroustrup, njegova knjiga The C++Programming Languagekoriena je kao definicija jezika pre negoto je standardizovan
6
Razvoj programskog jezika C++
Dalji razvoj
viestruko nasleivanje
apstraktne klase
generike klase
rukovanje izuzecima
1991 objavljena knjiga The Annotated C++ ReferenceManual, autori su Margaret A. Elis i Bjarne Stroustrup,
ANSI standard je izdat 1997, jezik je proiren:
provera tipa objekta u toku izvrenja programa
razraene generike funkcije i klase
definisana biblioteka gotovih klasa i funkcija koje se esto
koriste
-
7/28/2019 Cpp Predavanja
4/334
7
Obrada programa na jeziku C++
pod operativnim sistemom MS Windows
Unoenje izvornog teksta programa u datoteku.Ekstenzije datoteka su:
.c, ako je napisana u jeziku C
.cpp, ako je napisana u jeziku C++
Prevoenje izvornog teksta programa
ekstenzija datoteke je .obj
Povezivanje prevedenog oblika programa sa potrebnimkorisnikim i sistemskim potprogramima u izvrni oblik
ekstenzija datoteke je .exe
Izvravanje programa
8
Prikazivanje algoritma
Algoritam je opis koraka koji se izvravaju u toku nekeobrade
Opis algoritma
govornim jezikom
grafiki pomou dijagrama toka
pomou pseudojezika
pomou programskog jezika
Najjasnije je grafiko predstavljanje
Vrste dijagrama toka
standardni dijagram toka
strukturirani dijagram toka
-
7/28/2019 Cpp Predavanja
5/334
9
Standardni dijagram toka
Orijentisani graf koji ima jednu poetnu i jednu zavrnutaku
10
Strukturirani dijagram toka
Podrava principe strukturiranog programiranja
-
7/28/2019 Cpp Predavanja
6/334
11
Tipovi podataka
12
Elementi jezika C
Skup znakova
Leksiki simboli
Beli znaci
Naredbe
Direktive pretprocesora
-
7/28/2019 Cpp Predavanja
7/334
13
Skup znakova
Mala i velika slova engleskog alfabeta
razlikuju se mala i velika slova
Deset decimalnih cifara
Vei broj znakova interpunkcije
14
Leksiki simboli
Leksiki simboli su nedeljivi nizovi znakova
identifikatori
konstante
slubene rei
operatori
separatori
Leksiki simboli se piu spojeno ili razdvojeno belimznacima
-
7/28/2019 Cpp Predavanja
8/334
15
Beli znaci
Beli znaci su
razmak
tabulacija
vertikalna tabulacija
prelazak u novi red
prelazak na novu stranicu
16
Komentari
Komentar u jednom redu
// Proizvoljan tekst do kraja reda
Komentar u proizvoljnom broju redova
/*
tekst napisan u proizvoljnom broju redova
*/
/* moe i unutar jednog reda */
Komentari se mogu smatrati belim znacima
-
7/28/2019 Cpp Predavanja
9/334
17
Naredbe
Naredbe su nizovi leksikih simbola
Vrste naredbi
deklarativne naredbe slue za definisanje podataka,potprograma (funkcija), ...
izvrne naredbe izvode elementarne obrade
18
Direktive pretprocesora
Pretprocesor je deo prevodioca koji koji priprema izvornitekst programa pre samog prevoenja
Direktive pretprocesora su uputstva kojima se utie natok prevoenja programa
Nisu deo programa tj. nisu naredbe
Piu se u posebnim redovima, prvi ne-beli znak je # Naredbe se ne piu u istom redu sa direktivom
Primer direktive pretprocesora:
#define PI 3.14
-
7/28/2019 Cpp Predavanja
10/334
19
Identifikatori
Identifikatori slue za oznaavanje
podataka
simbolikih konstanti
tipova podataka
potprograma (funkcija)
oznake koje su odredita za naredbe skoka
Identifikatori se sastoje od velikih i malih slova, cifara iznaka donja crta "_" (u Javi moe i "$!)
prvi znak ne moe biti cifra
mogu da budu proizvoljno dugaki
po standardu najmanje 31 znak je znaajan
20
Primeri identifikatora
Ispravni identifikatori
alfa
a
b356
c5a
ime_i_prezime
imeIprezime
Neispravni identifikatori
3a // poinje cifrom
int // rezervisana re
x-z // operator nije dozvoljen
-
7/28/2019 Cpp Predavanja
11/334
21
Tipovi podataka
Tipovi podataka odreuju osobine podatka:
skup moguih vrednosti podatka
operacije koje mogu da se urade sa podatkom
Podaci se predstavljaju
vrednostima (konstantama)
identifikatorima
22
Podaci predstavljeni konstantama
Ne mogu da se promene u toku izvravanja programa
Konstante predstavljene identifikatorima se nazivajusimbolike konstante
Konstante ne zauzimaju prostor u memoriji, ugraene sudirektno u naredbe programa
Pod terminom "podatak" nee se nadalje podrazumevatikonstante
-
7/28/2019 Cpp Predavanja
12/334
23
Podaci predstavljeni identifikatorima
Zauzimaju prostor u memoriji
Vrednost podatka se smeta u prostor u memoriji
Vrste podataka na osnovu mogunosti promene
Promenljivi podaci su najei oblik podataka koji sekoriste
Nepostojani podaci su podaci koji mogu da se menjajuizvan kontrole programa
npr. hardverski registri perifernih ureaja
Nepromenljivi podaci su podaci koji ne mogu da se
menjaju Razlika izmeu #define and const deklaracije kompajler
prepoznaje identifikator deklarisan kao const
const int KONST=96;
24
Prosti i sloeni podaci
Prosti (skalarni, nestrukturirani) podaci ne mogu da sedele na manje delove koji mogu nezavisno da seobrauju (nemaju strukturu)
Sloeni (strukturirani) podaci se sastoje od vieelemenata koji mogu biti prosti ili sloeni
-
7/28/2019 Cpp Predavanja
13/334
25
Prosti tipovi podataka
U jeziku C postoje samo numeriki (prosti) tipovipodataka
celobrojni
realni
Logiki tip podataka je uveden u C++
spada u grupu celobrojnih tipova
26
Celobrojni tipovi podataka
Celobrojni tipovi su char i int sa svojim varijantama
int je osnovni celobrojni tip
oznaen je (ima pozitivne i negativne vrednosti)
najbolje odgovara hardveru raunara
obino je duine jedne mainske rei raunara
char je mali celobrojni podatak dovoljan da primi jedanznak iz skupa znakova koji se koriste na raunaru
standardom nije precizirano da li je oznaen
Modifikatori pomou kojih se dobijaju varijante tipova su
short
long
unsigned
-
7/28/2019 Cpp Predavanja
14/334
27
Varijante tipa char
char tipino ima duinu jednog bajta
tipini opsezi vrednosti su
od 128 do 127 ako je oznaen
od 0 do 255 ako je neoznaen
kodovi znakova su pozitivni
unsigned char je neoznaena varijanta tipa char
tipini opseg vrednosti je od 0 do 255
signed char je oznaena varijanta tipa char
tipini opseg vrednosti je od 128 do 127
28
Varijante tipa int
Varijante su oznaene
Neoznaene varijante se dobijaju dodavanjemmodifikatora unsigned
Oznaene varijante
short int, tipina duina je 16 bita
int, tipina duina je 16 ili 32 bita
long int, tipina duina je 32 bita
Neoznaene varijante
unsigned short int
unsigned int
unsigned long int
-
7/28/2019 Cpp Predavanja
15/334
29
Skraeno pisanje varijanti tipa int
U varijantama tipa int sa modifikatorima moe seizostaviti re int
Ekvivalentno je korienje
short i short int
long i long int
unsigned short i unsigned short int
unsigned long i unsigned long int
30
Realni tipovi podataka
float je realni podatak u jednostrukoj tanosti
broj tanih decimalnih cifara je 6 do 7
double je realni podatak u dvostrukoj tanosti
broj tanih decimalnih cifara je 15 do 16
long double je realni podatak u viestrukoj tanosti
Raunari obino podravaju IEEE standard za brojeveIEEE 754
-
7/28/2019 Cpp Predavanja
16/334
31
Standard IEEE 754, opsezi brojeva
2,2210308 1,7910308(2252)2102321022double
1,171038 3,401038(2223)21272126floatpriblini opsegmaxmin
Sa normalizovanom mantisom (eksponent 0)
4,9410324 2,2210308(1252)2102221074double
1,401045 1,751038(1223)21262149float
priblini opsegmaxmin
Sa denormalizovanom mantisom (eksponent = 0)
32
Logiki tip podataka
Uveden je u C++
Celobrojni tip
Tipbool ima dve vrednosti
false je logika neistina
true je logika istina
-
7/28/2019 Cpp Predavanja
17/334
33
Celobrojne konstante
Piu se u numerikim sistemima
decimalnom
oktalnom
heksadecimalnom
34
Decimalne celobrojne konstante
Prva cifra ne moe da bude 0
Moe se pisati predznak + ili
bez predznaka se podrazumeva +
-
7/28/2019 Cpp Predavanja
18/334
35
Konstante u oktalnom numerikom sistemu
Osnova sistema je 8
Cifre su od 0 do 7
Prva cifra oktalne konstante mora da bude 0
Znak broja je odreen prvim bitom broja u binarnomnumerikom sistemu
Primeri
01
0145
36
Konstante u heksadecimalnom numerikom
sistemu Osnova sistema je 16
Cifre su od 0 do 9 i slova A, B, C, D, E, F
mogu se koristiti mala ili velika slova
heksadecimalna konstanta poinje sa 0x ili 0X
Znak broja je odreen prvim bitom broja u binarnom
numerikom sistemu
Primeri
0x1a
0XCF05
0x2F3B
0xFFFFFFFF
-
7/28/2019 Cpp Predavanja
19/334
37
Konstante varijanti celobrojnih tipova
Konstante su tipa int ako je celobrojna konstantaunutar opsega tipa int, inae je tipa long int
Sufiks u ili U slui za neoznaene celobrojne konstante
Primeri: 1u, 06U, 0xFFu
Sufiks l ili L slui za celobrojne konstante tipa longint
Primeri za oznaeni tip long int:
1l, 024L, 0xFFL
Primeri za neoznaeni tip long int:
1ul, 024UL, 0xFFUL
38
Realne konstante
Piu se u decimalnom numerikom sistemu
Za vrlo velike i vrlo male brojeve koristi se zapis samantisom i eksponentomE
Mantisa je decimalni broj sa decimalnom takom
mora da ima bar jednu cifru
Moe da se koristi malo ili veliko slovo e ili E
Pojedini delovi mogu da nedostaju
Da bi se razlikovale od ceolbronih konstanti mora dapostoji ili decimalna taka ili E ili e
-
7/28/2019 Cpp Predavanja
20/334
39
Realne konstante
Podrazumeva se tip double
Za tip float dodaje se F ili f na kraju
Za tip long double dodaje se L ili l na kraju
Primeri:1.23 1.2E5 1e5 .2e3 .10.1F 3.1e3f
Primeri neispravnih realnih konstanti:1,23 1.a2
40
Znakovne konstante
Piu se izmeu jednostrukih navodnika
Primeri:'A' 'a' '3'
U jeziku C++ su tipa char, a u jeziku C su tipa int
-
7/28/2019 Cpp Predavanja
21/334
41
Pridruivanje identifikatora tipovima podataka
Tipovima se mogu dodeliti sopstveni identifikatorinaredbom opteg oblika
typedef opis_tipa naziv_tipa;
opis_tipa je tip kojem se dodeljuje identifikator
moe biti i tip koji je prethodno uveden naredbomtypedef
naziv_tipa je identifikator koji se dodeljuje tipu iji je
opis naveden
Primeri:
typedef unsigned int pozitivan;
typedef pozitivan neoznacen;
Tipovi pozitivan i neoznacen su nova imena
Podaci ovih tipova su u stvari istog tipa unsigned int
42
Definisanje podataka
Promenljivi podaci se definiu deklarativnom naredbomopteg oblika
tip podatak = vrednost,podatak, ... ;
tip je opis tipa
podatak je identifikator podatka
Podatku moe da se dodeli poetna vrednostnavoenjem = vrednost
ako se ne dodeli poetna vrednost podatak e imati nekusluajnu vrednost zateenu u memoriji!
neki podaci dobijaju poetnu vrednost 0
Dodeljivanje poetne vrednosti naziva se inicijalizacija
Vrednost koja se dodeljuje naziva se inicijalizator
-
7/28/2019 Cpp Predavanja
22/334
43
Primeri definisanja podataka
int i=0, pocetak, kraj=10;
float duzina = 101.5;
typedef unsigned int pozitivan;
typedef pozitivan neoznacen;
pozitivan alfa=0, beta=100;
neoznacen a=alfa+beta;
44
Definisanje nepostojanih podataka
Nepostojani podaci su promenljivi podaci ija vrednostmoe da se promeni u toku izvravanja programa izvankontrole programa
Definiu se modifikatorom volatile na poetkunaredbe
Primer:volatile int znak, v=4;
-
7/28/2019 Cpp Predavanja
23/334
45
const
U jeziku C sa const se definiu nepromenljivi podaci
nepromenljivi podatak mora da se inicijalizuje
ne moe da mu se promeni vrednost u toku izvravanjaprograma
nije konstanta, tj. ne moe da se koristi na mestu gde sezahtevaju konstante
U jeziku C++ sa const se definiu simbolike
konstante
mogu da se koriste na mestima gde se oekuju konstante
Primeri
const int DIMENZIJA=100;
const double e=2.71828182845905;
const long dan=24L * 60 * 60;
46
Simbolike konstante u jeziku C
Definiu se direktivom define iji je opti oblik:
#define IME_KONSTANTE vrednost_konstante
IME_KONSTANTE je identifikator, obino se pie velikim
slovima
vrednost_konstante je konstanta standardnog tipa
U jeziku C++ mogu da se koriste i simbolike konstantedefinisane direktivom define
Primeri
#define MIN 0
#define MAX 1000
#define PI 3.14159
-
7/28/2019 Cpp Predavanja
24/334
47
Nabrojane konstante
Nabrojane konstante su simbolike konstante
Dodeljuju im se vrednosti eksplicitno ili implicitno poredosledu
Opti oblik naredbe je
enumime_nabrajanja {
IME_KONSTANTE=vrednost,
...
IME_KONSTANTE=vrednost}
Nabrojane simbolike konstante su formalno tipa int
48
Nabrojane konstante
ime_nabrajanja je identifikator nabrajanja koji moe
da se izostavi
IME_KONSTANTEje identifikator konstante
svi identifikatori moraju biti razliiti
vrednost je vrednost koja se dodeljuje konstanti i
moe da se izostavi konstanta kojoj nije eksplicitno dodeljena vrednost dobija
vrednost za jedan veu u odnosu na prethodnu konstantuu nabrajanu
ako prvoj konstanti nije dodeljena vrednost ona dobijavrednost 0
-
7/28/2019 Cpp Predavanja
25/334
49
Nabrojane konstante
Nabrojane konstante mogu da se koriste kao novi tip
u jeziku C mora se pisati i re enum
u C++ moe se koristiti ime_nabrajanja bez enum
ako ne postoji podatak sa tim imenom, inae se morapisati i enum
50
Nabrojane konstante
Da ne bi morala da se pie re enumu jeziku C moese koristiti naredba typedef oblika
typedef enum
{
IME_KONSTANTE= vrednost,
IME_KONSTANTE= vrednost,
...
} Ime_tipa;
ime_nabrajanja koje se pie iza rei enumse u
ovom sluaju najee izostavlja, ali moe da se napie
-
7/28/2019 Cpp Predavanja
26/334
51
Primeri za nabrojane konstante
enum{ NE, DA };
enumKONSTANTE { C1=5, C2, C3=10, C4 };
enummeseci { JAN=1,FEB,MAR,APR,MAJ,JUN,
JUL,AVG,SEP,OKT,NOV,DEC };
typedef enum
{ PON=1,UTO,SRE,CET,PET,SUB,NED } Dani;
typedef enummeseci Meseci;
Dani dan1 = PON;(bez enum)
Dani dan2 = PON + 2;
enummeseci mesec = JAN;(sa enum)
Meseci mesec1 = FEB;
52
Ulaz i izlaz podataka
Preko tastature podaci se unose kao nizovi znakova tj. utekstualnom obliku
Na ekranu se podaci prikazuju u tekstualnom obliku
Podaci u memoriji raunara su u binarnom obliku
Prilikom unoenja podataka preko tastature tastature
radi se ulazna konverzija
Prilikom prikazivanja podataka na ekranu radi se izlaznakonverzija
-
7/28/2019 Cpp Predavanja
27/334
53
Ulaz i izlaz podataka u jeziku C
Za ulaz i izlaz podataka postoje biblioteke funkcije(potprogrami)
Funkcija scanf se koristi za itanje podataka preko
glavnog ulaza (tastature) i ulaznu konverziju podataka
Funkcija printf se koristi za pisanje podataka preko
glavnog izlaza (ekran) uz primenu izazne konverzije
Deklaracije funkcija scanf i printf nalaze se u
stdio.h
54
Skretanje glavnog ulaza i glavnog izlaza
Moe da se uradi skretanje glavnog ulaza (tastature) iglavnog izlaza (ekran) i da to postanu datoteke
Pokretanje programa, glavni ulaz je tastatura, a glavniizlaz je ekran
ime_programa
Pokretanje programa sa skretanjem glavnog ulaza iglavnog izlaza
ime_programa glavni_izlaz
-
7/28/2019 Cpp Predavanja
28/334
55
Ulazna konverzija
Opti oblik funkcije scanf je:
scanf(format, &arg1, &arg2, ... , &argN);
format je tekstualni podatak oblika "tekst" kojiodreuje ulazne konverzije koje se koriste
pojedinane konverzije su oblika %nq
% je oznaka za poetak konverzije
n su dopunski parametri konverzije
q je oznaka za vrstu konverzije
&arg su adrese promenljivih ije se vrednosti uitavaju arg su identifikatori podataka koji se uitavaju
& je operator za dohvatanje adrese podatka
56
Ulazna konverzija
Ulazni podaci su razdvojeni belim znakom, tj. podatak jeniz znakova izmeu dva bela znaka
itanje podatka se zaustavlja na prvom znaku izaproitanog podatka
Broj znakova u jednom podatku
moe da bude proizvoljan moe da se nevede parametrom n (unutar %nq)
u ovom sluaju ne mora da beli znak izmeu dva podatka
Vrste ulaznih konverzija
za celobrojne podatke
za realne brojeve
-
7/28/2019 Cpp Predavanja
29/334
57
Konverzije za celobrojne podatke
Konverzije za tip int su: i, d, u, o, x
i je decimalna, oktalna ili heksadecimalna konverzija
zavisno od oblika podatka na osnovu pravila pisanja
d je decimalna konverzija
u je decimalna konverzija za tip unsigned int
o je oktalna konverzija (bez obzira na vodeu 0)
x je heksadecimalna konverzija (bez obzira na 0x)
Za tipove short dodaje se znak h ispred oznake
konverzije: hi, hd, hu, ho, hx
Za tipove long dodaje se znak l ispred oznakekonverzije: li, ld, lu, lo, lx
58
Konverzije za realne podatke
Konverzije za tip float su: f, e, g
ulazne konverzije su iste, izlazne se razlikuju
Za tip double dodaje se znak l ispred oznake
konverzije: lf, le, lg
Za tip long double dodaje se znak L ispred oznake
konverzije: Lf, Le, Lg
-
7/28/2019 Cpp Predavanja
30/334
59
Tok konverzije
scanf(format, &arg1, &arg2, ... , &argN);
Analizira se format sleva udesno, znakovi razmaka i
tabulacije se
Kad se naie na opis konverzije vri se konverzija irezultat se dodeljuje sledeem podatku iz liste
itanje se zavrava kad se naie na kraj formata ili akose desi greka
Programer obezbeuje da broj opisa konverzije i brojpodataka budu isti
ako je broj podataka vei od broja opisa, prekobrojnipodaci nee dobiti vrednost
ako je broj opisa vei od broja podataka posledice sunepredvidive
60
Dodatni znaci u formatu
U opisu konverzije mogu postojati dodatni znaci
ita se po jedan znak za svaki dodatni iz opisakonverzije
moraju da budu isti
ne radi se dodela vrednosti
Ako je dodatni znak %, piu se dva znaka %% umestojednog, jer jedan znak oznaava poetak opisakonverzije
-
7/28/2019 Cpp Predavanja
31/334
61
Primer uitavanja
int i;
float f;
double d;
scanf("%i%f%lf", &i, &f, &d);
62
Izlazna konverzija
Opti oblik fukncije scanf je:
printf(format, izraz1, ... , izrazN);
format je tekstualni podatak oblika "tekst" koji
odreuje izlazne konverzije koje se koriste
pojedinane konverzije su oblika % -+0#n.kq
prvi znak % je oznaka za poetak konverzije znaci -+0#n.k su dopunski parametri konverzije i ne
moraju da postoje
poslednji znak q je oznaka za vrstu konverzije
izrazi su numeriki izrazi ije se vrednosti ispisuju
-
7/28/2019 Cpp Predavanja
32/334
63
Dopunski parametri konverzije -+0 #n.kq
znak n je celobrojna decimalna konstanta
oznaava najmanji broj znakova za ispisivanje
ako je potrebno ispisuje se vie znakona od n, inae se saleve strane dodaju prazni znaci
znak k razdvojen takom oznaava tanost prikazivanja
podataka koja zavisi od vrste konverzije
znak - oznaava poravnanje uz levu stranu
znak + oznaava da treba da se ispie znak + ispred
pozitivnog broja
znak razmaka oznaava da treba da se ostavi jednoprazno mesto umesto znaka +
znak 0 oznaava da se u sluaju ravnanja na desnu ivicu
sa leve strane umesto praznih znakova ispisuju nule
znak # oznaava alternativni nain ispisivanja koji zavisi
od vrste konverzije
64
Parametar konverzije *
Umesto dopunskih parametara n i k moe da se staviznak *
kao irina polja za ispisivanje uzima se vrednost sledeegcelobrojnog izraza meu argumentima funkcije printf
-
7/28/2019 Cpp Predavanja
33/334
65
Konverzije za celobrojne podatke
Konverzije za tip int su: i, d, u, o, x, X
Sve konverziju osim u se primenjuju za tipove int i
unsigned int, a u se primenjuju za unsigned int
i, d oznaavaju decimalnu konverziju
o oznaava oktalnu konverziju
vodea 0 se ispisuje ako postoji znak # u opisu konverzije
x, X oznaavaju heksadecimalnu konverziju, pri emu se
cifre oznaene slovima se ispisuju malim ili velikim slovima vodei 0x se ispisuje ako postoji znak # u opisu konverzije
Za tipove short dodaje se znak h, a za long znak lispred oznake konverzije: hi, hd, hu, ho, hx, hX,odnosno li, ld, lu, lo, lx, lX
Tanost k oznaava najmanj broj cifara
dodaju se vodee nule ako je potrebno
66
Konverzije za realne podatke
Konverzije za tip double su: f, e, E, g, G
f oznaava konverzije oblika ccc.cccccc k oznaava broj decimalnih mesta, podrazumevano je 6, a
za k=0 se ne ispisuje ni decimalna taka
# oznaava obavezno ispisivanje decimalne take
e, E oznaavaju konverziju u eksponencijalni oblik
c.ccccccexx ili c.ccccccExx k oznaava ukupan broj cifara, podrazumeva se 6, a jedna
nenulta cifra je uvek ispred decimalne take
# oznaava obavezno ispisivanje decimalne take
konverzije g, G su iste kao e, E ako je eksponent veiod 4 ili vei ili jednak od tanosti, inae su iste kao f
Za tip long double dodaje se znak L ispred oznake
konverzije: Lf, Le, LE, Lg, LG Konverzije za tip float su iste kao za double
tanost k treba da je primerena tipu float
-
7/28/2019 Cpp Predavanja
34/334
67
Tok konverzije
printf(format, izraz1, ... , izrazN);
Analizira se format sleva udesno, znakovi koji nisu
deo opisa konverzije ispisuju se kako su navedeni
Kad se naie na opis konverzije vri se konverzijasledeeg izraza i rezultat se ispisuje
Ispisivanje se zavrava kad se doe do kraja formata
Programer obezbeuje da broj opisa konverzije i brojpodataka budu isti
ako je broj podataka vei od broja opisa, prekobrojnipodaci se nee ispisati
ako je broj opisa vei od broja podataka posledice sunepredvidive
Posledice su nepredvidive ako se ne slau vrstakonverzije i tip podatka
68
Znaci u formatu
Znak \n oznaava prelazak u novi red
Ako je potrebno ispisati dodatni znak %, piu se dvaznaka %% umesto jednog, jer jedan znak oznaava
poetak opisa konverzije
-
7/28/2019 Cpp Predavanja
35/334
69
Primeri ispisivanja
printf("Dobar dan!\n");
printf("Zapremina lopte poluprecnika %7.3f je %g\n",
r, v);
printf("Zbir brojeva %d i %d je %d\n", m, n, m+n);
printf("Srednja vrednost je %*.*f\n", m, n, s);
70
Primer programa
Program ispisuje: Pozdrav svima!
#include
main()
{
printf("Pozdrav svima!");
}
-
7/28/2019 Cpp Predavanja
36/334
71
Primer programa
Primer programa koji uitava dva cela broja, sabira ih iispisuje rezultat
#include
main()
{
int a, b;
printf("unesite dva cela broja: ");
scanf("%d%d", &a, &b);int c = a + b;
printf("Zbir unetih brojeva: %d\n", c);
}
72
Operatori
-
7/28/2019 Cpp Predavanja
37/334
73
Operatori i izrazi
Operator je radnja koja se izvrava nad operandima idaje rezultat
Izraz je proizvoljno sloeni sastav operanada i operatora
Izrazi su:
konstanta
podatak
operator izraz
izraz operator
izraz operator izraz
izraz ? izraz : izraz
( izraz )
74
Tipovi operatora na osnovu broja operanada
Unarni
Binarni
Ternarni
-
7/28/2019 Cpp Predavanja
38/334
75
Vrste operatora
Adresni operatori
Aritmetiki operatori
Relacijski operatori
Operatori nad bitima
Logiki operatori
Operatori za dodelu vrednosti
Operator zarez
izraunava prvi operand i odbacuje rezultat, a zatim izraunava
drugi operandi vraa tu vrednost. Poeljno kada su potrebniboni efekti.
Primer:
int a = 1, b=2;
i = a += 2, a + b; // increases a by 2, then stores a = 5 into i
76
Operatori
>
212
+ -213
* / %214
.* ->*215
! ~ ++a --a + - * &
(tip) sizeof new delete116
a++ a-- static_cast
const_cast dynamic_cast
reinterpret_cast typeid
117
[] () . ->218
::1, 219
OperatoriSmergrupisanja
Brojoperanada
Prioritet
-
7/28/2019 Cpp Predavanja
39/334
77
Operatori
< >=211
== !=210
,21
throw12
= += -= *= /= %=
&= ^= |= =
23
?:34
||25
&&26
|27
^28
&29
OperatoriSmergrupisanja
Brojoperanada
Prioritet
78
Unarni aritmetiki operatori + i -
+ vrednost operanda bez promenene znaka
vrednost operanda sa promenjenim znakom
Prefiksni operatori
Prioritet je 16
Grupisanje je zdesna ulevo
-
7/28/2019 Cpp Predavanja
40/334
79
Unarni aritmetiki operatori ++ i --
++ uveavanje za jedan
umanjivanje za jedan
Operatori mogu biti prefiksni i postfiksni
Za postfiksne operatore
prioritet je 17
smer grupisanja nije definisan
Za prefiksne operatore
prioritet je 16 smer grupisanja je zdesna ulevo
++k // k=k+1
k++ // k=k+1
j = --k // k=k1, j=k
j = k-- // j=k, k=k-1
80
Binarni aritmetiki operatori
+ zbir
razlika
* proizvod
/ kolinik
% ostatak deljenja dva broja
Grupisanje je sleva udesno
Prioritet je:
14 za *, /, %
13 za +, -
-
7/28/2019 Cpp Predavanja
41/334
81
Primeri osnovnih operacija
int a = 1 + 1; // a = 2
int b = a * 3; // b = 6
int c = b / 4; // c = 1
int g = b % 4; // g = 2
int d = c - a; // d = -1
int e = -d; // e = 1
double a = 1 + 1; // a = 2
double
b = a * 3; // b = 6double c = b / 4; // c = 1.5
//double g = b % 4; //greka, definisan za celobrojne tipove
double d = c - a; // d = -1
double e = -d; // e = 1
82
Boni efekat
Boni efekat je promena vrednosti nekog operandaoperatora u toku izvravanja operatora
Primer
j = --k; // k = k - 1, j = k
--k; // k = k - 1
-
7/28/2019 Cpp Predavanja
42/334
83
Aritmetiki operatori dodeljivanja
izraz1 = izraz2;
izraz1 operator= izraz2;
//izraz1 = izraz1 operator izraz2;
Operatori su
+=
-=
*=
/=%=
Prioritet je 3
Grupisanje zdesna ulevo
84
Primeri aritmetikih operatora za dodeljivanje
a = b = c = d + 5;
b = b % c;
b %= c;
d = d + e * f;
d += e * f;
a = b++ + 3*(c=d-3);
//a = b++ + 3*c=d-3;// greka
-
7/28/2019 Cpp Predavanja
43/334
85
Lvrednost
Lvrednostje vrednost koja oznaava podatak umemoriji, odnosno moe da se nalazi na levoj strani
operatora za dodelu vrednosti
Neki operatori se primenjuju samo na lvrednosti
operandi operatora ++, --, &
operandi na levoj strani operatora za dodelu vrednosti
Rezultat nekih operatora je lvrednost
operatora za posredni pristup * i indeksiranje [ ]
prefiksnih operatora ++ i -
svih operatora za dodelu vrednosti
rezultat ternarnog operatora ?: je lvrednost ako su drugii trei operand isttog tipa i ako su oba lvrednosti
86
Primeri za lvrednosti
++ ++k; // ++(++k) ili k=k+2
--k*=5; // (--k)*=5 ili k=(k-1)*5
k++ ++; // greka
d*=e+=f; // e=e+f, d=d*e
(d*=e)+=f; // d=d*e, d=d+f ili d=d*e+f
x=y=5; // x=(y=5) ili y=5, x=y
++(p/=q); // p=p/q, p=p+1 ili p=p/q+1
++p/=q; // p=p+1, p=p/q ili p=(p+1)/q
long x=5;
int a,b;
x ? a : b = 1; // x ? a=1 : b=1
x ? x : b = 1; // greka
x ? 2 : b = 1; // greka
-
7/28/2019 Cpp Predavanja
44/334
87
Konverzija tipa
Binarni operatori se izvravaju nad operandima istihtipova
Za operande razliitih tipova radi se automatskakonverzija
Oprez: kompajler ne upozorava tako striktno kao kod Jave mogue nenamerne greke.
Pravilo za automatska konverziju tipa: tip operandajednostavnijeg tipa se pretvori u tip operanda sloenijeg
tipa i posle toga se izraunava rezultat operatora Neoznaena varijanta istog tipa je sloenija od oznaene
varijante
88
Automatska konverzija tipa
ako je jedan operand tipa long double, i drugi sepretvori u tip long double;
inae, ako je jedan operand tipa double, i drugi sepretvori u tip double;
inae, ako je jedan operand tipa float, i drugi se
pretvori u tip float; inae, ako je bilo koji od operanada tipa char ilishort pretvori se u tip int,ili ako je jedan operand tipa unsigned char iliunsigned short pretvori se u tip unsigned, (popotrebi se oba pretvore u tip int ili unsigned;
-
7/28/2019 Cpp Predavanja
45/334
89
Automatska konverzija tipa - nastavak
posle, ako je jedan operand tipa unsigned long, idrugi se pretvori u tip unsigned long;
inae, ako je jedan operand tipa long, i drugi sepretvori u tip long;
inae, ako je jedan operand tipa unsigned, i drugi sepretvori u tip unsigned
Tip rezultata je uvek bar tip int ili unsigned
Primeri5/4*3. // (5/4)*3.= 1*3. = 1.*3. = 3.
3.*5/4 // (3.*5)/4= (3.*5.)/4= 15./4= 15./4.= 3.75
90
Automatska konverzija tipa kod dodele vrednosti
Tip operanda sa desne strane se pretvara u tip operandasa leve strane oprez!
Realni podatak se konvertuje u celobrojni odsecanjemrazlomljenog dela
Pretvaranje kraeg celobrojnog podatka u dui
za oznaene tipove proiruje se predznak
za neoznaene tipove dodaju se nule sa leve strane
-
7/28/2019 Cpp Predavanja
46/334
91
Konverzija logikog tipa u C++
Automatska konverzija u izrazima iz tipabool u
numeriki tip (ne moe u Javi!)
false se konvertuje u celobrojnu vrednost 0
true se konvertuje u celobrojnu vrednost 1
Dodela vrednosti numerikog podatka promenljivoj tipabool
vrednost 0 se pretvara u false
vrednost razliita od 0 se pretvara u true
Na mestima gde se oekuju logike vrednosti mogu dase piu numeriki podaci
Primer:
int i;
if( i ) ...
92
Eksplicitna konverzija tipa
Pretvaranje u eljeni tip se radi unarnim prefiksnim castoperatorom (unutar zagrada se napie ime tipa u koji sepretvara)
( ime_tipa )
Primeri:
(double)a
(unsigned int) a+b //((unsigned int)a)+b
-
7/28/2019 Cpp Predavanja
47/334
93
Relacijski operatori (operatori poreenja)
> Vee
< Manje>= Vee ili jednako
, =, 5; // 8==(13>5), 8==1, false
a < b < 5; // (a
-
7/28/2019 Cpp Predavanja
48/334
95
Logiki operatori
! Logika negacija
Prefiksni unarni operator
Prioritet je 16
Grupisanje zdesna ulevo
&& Logiko i
|| Logiko ili
Binarni operator Prioritet operatora && je 6, a operatora || je 5
Grupisanje je sleva udesna
96
Tabela logikih operatora
falsetrue
truefalse~
truetruetrue
truefalsefalse
truefalse||
truefalsetrue
falsefalsefalse
truefalse&&
-
7/28/2019 Cpp Predavanja
49/334
97
Uslovni izraz ?:
Opti oblik je
uslov ? izraz1 : izraz2
Primeri
(a > b) ? a : b // max(a, b)
(x
-
7/28/2019 Cpp Predavanja
50/334
99
Logike operacije po bitima
Prefiksni unarni operator
~ komplementiranje po bitima (prioritet 16)
Binarni operatori
& logika "i" operacija nad bitima (prioritet 9)
| logika "ili" operacija nad bitima (prioritet 8)
^ logika "iskljuivo ili" operacija nad bitima (prioritet 7)
100
Logike operacije po bitima
01
10~
111
100
10|
101
000
10&
011
100
10^
-
7/28/2019 Cpp Predavanja
51/334
101
Primeri za operatore nad bitima
37001001011000001010
15^ 0000111115& 00001111
42001010104200101010
47001011114311010101
15| 0000111142~ 00101010
4200101010
102
Operatori za pomeranje po bitima
Binarni operatori za pomeranje levog operanda zaonoliko bita koliko iznosi desni operand
> pomeranje udesno
nema >>> kao u Javi jer postoje oznaeni i neoznaeni
tipovi
Prioritet je 11
Grupisanje je sleva udesno
Rezultat je nedefinisan ako je desni operand negativan ilije vei od broja bita u levom operandu
-
7/28/2019 Cpp Predavanja
52/334
103
Operatori za pomeranje po bitima
Pri pomeranju ulevo sa desne strane se dodaju nule
Pri pomeranju udesno sa leve strane se dodaju
za neoznaene (unsigned) tipove dodaju se nule
(logiko pomeranje)
za oznaene tipove dodaju se biti koji su jednakipredznaku opearnda (aritmetiko pomeranje)
104
Operatori po bitima i dodela vrednosti
Za binarne operatore za rad po bitima postoje i operatoriza dodelu vrednosti
&=
^=
|=
=
Prioritet je 3
Grupisanje zdesna ulevo
-
7/28/2019 Cpp Predavanja
53/334
105
Primeri za pomeranje ulevo
vrednost 2; // a = 0...0 00001000 (tj. a=8)
a >>= 4; // a = 0...0 00000000 (tj. a=0)
int b = -8; // b = 1...1 11111000
b = b >> 2; // b = 1...1 11111110 (tj. b=-2)
b >>= 1; // b = 1...1 11111111 (tj. b=-1)
b >>= 1; // b = 1...1 11111111 (b ostaje -1)
-
7/28/2019 Cpp Predavanja
54/334
107
Pomeranje udesno za neoznaene tipove
vrednost >> broj_bita_za_koliko_se_pomera;
Sa leve strane se dodaju nule
Biti sa desne strane se gube
Primer:unsigned k = 0xFFFFFFFF; // k je najvei unsigned
k = k >> 1; // 0x7FFFFFFF
k >>= 23; // 0x000000FF (k je 255)
108
Primeri za operacije nad bitima
022222 & 055555 // =000000, operator po bitima
022222 && 055555 // =true, logiki operator
-
7/28/2019 Cpp Predavanja
55/334
109
Niz izraza
Izrazi mogu da se sastave u niz izraza pomou binarnogoperatora zarez (,), pri emu se niz izraza ponaa kao
jedan izraz Binarni operator zarez (,) je prioriteta 1 i grupie se
sleva udesno
Primer
a=5, b+=13, c++
x=3, y*=x+3, x--, z-=x*3- --y
Zbog smera grupisanja i izrazi se izraunavaju slevaudesno u sluaju da ima vie uzastopnih operatora zarez
Rezultat koji vraa niza izraza je vrednost poslednjegizraza (krajnji desni koji se poslednji izraunava)
110
Korienje zagrada
Zagrade slue za definisanje redosleda izraunavanja(prioriteta) i za pisanje jasnijih izraza
a >> b + 3; // prvo se b uveava za 3,
// zatim se sadraj a pomera udesno
// ("+" ima vei prioritet od ">>")
a >> (b + 3); // ekvivalentno gornjem
(a >> b) + 3; // prvo se sadraj a pomera udesno,
// zatim se uveava za 3
-
7/28/2019 Cpp Predavanja
56/334
111
Veliina podataka
Operator sizeof je prefiksni unarni operator koji
izraunava veliinu memorije, izraenu u bajtovima, koja
je potrebna za smetanje podatka nekog tipa
Operand je izraz ili identifikator tipa
Ako je operand identifikator tipa stavlja se u zagradama
Primeri
sizeof(char)
sizeof(long double)
Tip rezultata je size_t koji je celobrojni tip definisannaredbom typedef u fajlu
Standardom nije precizirano kojeg celobrojnog tipa jesize_t
112
Biblioteke funkcije
Funkcije na osnovu svojih argumenata daju rezultate
Funkcije mogu da imaju neogranien broj argumenata
Opti oblik pozivanja funkcije jeidentifikator_funkcije(argument, ... , argument)
Ako su argumenti izrazi, izraunavaju se pre pozivanja
funkcije po proizvoljnom redosledu
U sastavu jezika je standardna biblioteka sa velikimbrojem standardnih funkcija
Funkcije su deklarisane u datotekama zaglavlja(header), i imaju ekstenziju *.h
-
7/28/2019 Cpp Predavanja
57/334
113
Korienje bibliotekih funkcija
Na poetku datoteke sa izvornim kodom se napiedirektiva include sa imenom *.h datoteke koja e se
koristiti
Opti oblik je
#include
114
Biblioteka matematikih funkcija
Matematike funkcije su deklarisane u datoteci
-
7/28/2019 Cpp Predavanja
58/334
115
Naredbe
116
Naredbe
Naredba je osnovna jedinica obrade u programu
Proste naredbe ne mogu da se podele na manje delovekoji su takoe naredbe
Sloene naredbe su strukture narebi (upravljakestrukture) koje odreuju redosled izvravanja naredbi u
strukturi. Dele se na: sekvence
selekcije
cikluse (petlje)
Upravljake naredbe ne vre obradu, ve prenose tokupravljanja na neko drugo mesto (skokovi)
-
7/28/2019 Cpp Predavanja
59/334
117
Naredbe
Deklarativne naredbe deklarisanje tipova podataka
Izvrne naredbe
118
Prosta naredba
Opti oblik je
izraz;
Prazna naredba se koristi kada sintaksa jezika zahtevanaredbu, a nije potrebna nikakva obrada
;
-
7/28/2019 Cpp Predavanja
60/334
119
Sekvenca (blok)
Niz naredbi koje se izvravaju jedna za drugom
Opti oblik sekvence je
{
naredba1
naredba2
...
naredbaN
}
Moe da se pie i u jednom redu
{ naredba1 naredba2 ... naredbaN }
Moe da bude prazna { }
120
Primer sekvence
int a, b;
...
{
int t;
t = a;
a = b;
b = t;
}
ili u jednom redu
{ t=a; a=b; b=t; }
-
7/28/2019 Cpp Predavanja
61/334
121
Doseg identifikatora (oblast vaenja)
Oblast vaenja je deo programa u kojem identifikatormoe da se koristi
Blokovski doseg za identifikatore deklarisane unutarbloka: identifikator moe da se koristi od mesta gde jedeklarisan do kraja bloka u kojem je deklarisan
Primer
{
int x = 5;
double y = x / 2.;
printf("x=%d, y=%f\n", x, y);
}
122
Uklapanje dosega
Unutar jednog bloka (spoljanji) moe da se nalazi drugiblok (unutranji)
U unutranjem bloku mogu da se koriste identifikatoridefinisani u spoljanjem bloku, oni su globalni zaunutranji blok
Identifikatori definisani u unutranjem bloku su lokalniza taj blok, i ne mogu da se koriste izvan njega
U unutranjem bloku se moe definisati identifikator kojiima isto ime kao i identifikator iz spoljanjeg bloka, i nataj nain identifikator iz spoljanjeg bloka postajenevidljiv u unutranjem bloku
-
7/28/2019 Cpp Predavanja
62/334
123
Primer uklapanja dosega
{
double x = 0.5;
printf("x=%f\n", x);{
int x=0;
{
int a=1, b=2;
x = a * b;
}
printf("x=%d\n", x);
}printf("x=%f\n", x);
}
x=0.500000
x=2
x=0.500000
124
Selekcije
if-else
switch
-
7/28/2019 Cpp Predavanja
63/334
125
Osnovna selekcija if-else
Uslovno izvravanje jedne od dve mogue naredbe
Opti oblik
if(uslov)
naredba1
else
naredba2
uslov je izraz logikog tipa
naredba je jedna naredba ili blok naredbi deo else nije obavezan
Izvravanje
ako uslov vrati vrednost true izvrava se naredba1
inae se izvrava naredba2 (ako else deo postoji)
126
Primeri za if
if(a < b) a = 0;
else b = 0;
if(a > b)
{
t=c; c=a; a=t;
}
else
{
t=c; c=b; b=t;
}
if(a > b) { t=a; a=b; b=t; }
-
7/28/2019 Cpp Predavanja
64/334
127
Uklapanje selekcije if-else
if(uslov1)
if(uslov2)
naredba1
else
naredba2
Deo else se uvek odnosi na poslednji if ispred
njega
128
Primer za uklapanje selekcije if-else
if(i == 10)
{
if(j < 20) a = b;
if(k > 100) c = d;
else a = c; // ovaj else se odnosi na uslov if(k > 100)
}
else a = d; // ovaj else se odnosi na uslov if(i == 10)
-
7/28/2019 Cpp Predavanja
65/334
129
if else if
if(uslov1)
naredba1;
else if(uslov2)
naredba2;
else if(uslov3)
naredba3;
else if(uslov4)
naredba4;
else
naredba5;
if(uslov1)
naredba1;
else
if(uslov2)
naredba2;
else
if(uslov3)
naredba3;
else
if(uslov4)
naredba4;
else
naredba5;
130
Naredba switch
Grananje u vie putanja zavisno od vrednosti izraza
Opti oblikswitch(izraz)
{
case vrednost1:
niz_naredbi1
case vrednost2:
niz_naredbi2
...
default:
niz_naredbiD
...
case vrednostN:
niz_naredbiN
}
-
7/28/2019 Cpp Predavanja
66/334
131
Naredba switch
izraz je celobrojni izraz
Svaka od vrednosti je celobrojna konstanta
Ne sme se ponoviti ista vrednost u istom switch
Sa break se zavrava switch
Ako ne postoji break nastavlja se izvravanje sledeegcase
Deo default je opcioni i oznaava mesto na koje se skaeako vrednost izraza nije jednaka nijednoj od vrednosti u
oznakama case
132
Prekidanje naredbe switch
Naredba switch se moe prekinuti naredbom break,i taj oblik naredbe switch se ee koristi
switch(izraz)
{
case vrednost1: niz_naredbi1;
break;
case vrednost2: niz_naredbi2;
break;
...
default: niz_naredbiN;
break;
...
case vrednostN: niz_naredbiN;
break;
}
-
7/28/2019 Cpp Predavanja
67/334
133
Primer za switch
switch(i + j * k)
{
case 0: printf("Unseite 3 cela broja:");
scanf("%d%d%d", &i, &j, &k);
case 7:
case 3:
case 5: a = i + j * k;
b = i j / k;
default: c = a * b;
case12: printf("Rezultati su: %d %d %d", a, b, c );
}
134
Uklopljena naredba switch
switch (izraz_spoljasnjeg_switch)
{
case 1:
switch (izraz_unutrasnjeg_switch)
{
case 0: a=0;
break;
case 1: b=0;
break;
}
break;
case 2:
...}
-
7/28/2019 Cpp Predavanja
68/334
135
Poreenje if i switch
switch proverava samo jednakost, a if proizvoljan
logiki izraz
switch je efikasniji od ugnjedenih if else if
136
Ciklusi (petlje)
Izvravanje (ponavljanje) jedne naredbe ili bloka naredbipotreban broj puta, zavisno od uslova
Naredbe ciklusa (petlje)
while
do while
for
-
7/28/2019 Cpp Predavanja
69/334
137
Petlja while
Opti oblik while petlje
while(uslov)telo_petlje
uslov je proizvoljan logiki izraz
telo_petlje je jedna naredba (moe biti i prazna
naredba) ili blok naredbi
telo_petlje se ponavlja sve dok uslov ima
vrednost true
while petlja je sa izlazom na vrhu, ako uslov imavrednost false pri prvoj proveri, ne ulazi se u petlju, tj.telo_petlje se ne izvrava nijednom
138
Primer za while petlju
int n = 5; // Za n=0 petlja se ne bi izvrila nijednom
while(n > 0)
{
printf("Vrednost n je %d\n", n);
n--;
}
Vrednost n je 5Vrednost n je 4Vrednost n je 3Vrednost n je 2
Vrednost n je 1
-
7/28/2019 Cpp Predavanja
70/334
139
Primeri za while petlju: zbir n brojeva
int s=0, i=1;
while(i
-
7/28/2019 Cpp Predavanja
71/334
141
Primer za do while
int n = 5; // Za n=0 petlja bi se izvrila jednomdo
{printf("Vrednost n je %d\n", n);
n--;
}
while(n > 0);
Vrednost n je 5
Vrednost n je 4Vrednost n je 3Vrednost n je 2Vrednost n je 1
Za n=0 rezultat bi bioVrednost n je 0
142
Krae napisan primer za do while
int n = 5;
do
printf("Vrednost n je %d\n", n);
while(--n > 0);
Vrednost n je 5Vrednost n je 4Vrednost n je 3Vrednost n je 2Vrednost n je 1
-
7/28/2019 Cpp Predavanja
72/334
143
do while petlja: zbir kvadrata n brojeva
int s=0, i=1;
do
{s += i * i;
i++;
}
while(i
-
7/28/2019 Cpp Predavanja
73/334
145
Petlja for
inicijalizacija je izraz
izvrava se samo jednom na poetku pre ulaska u petlju
obino inicijalizuje jednu ili vie promenljivih petlje uslov je logiki izraz, proverava se pre izvravanja tela
petlje ako je vrednost true izvrava se telo petlje
ako je false ne izvrava se telo petlje i izlazi se iz petlje
obino zavisi od upravljake promenljive petlje
telo_petlje je jedna naredba ili blok naredbi
iteracija je izraz
izvrava se posle tela petlje
obino menja jednu ili vie upravljakih promenljivih petlje
Petlja se nastavlja proverom uslova i izvravanjem telapetlje i iteracije sve dok je uslov taan
146
Naini pisanja for petlje
for(inicijalizacija; uslov; iteracija) naredba
for(inicijalizacija; uslov; iteracija)
naredba
for(inicijalizacija; uslov; iteracija) {
naredba1
...naredbaN
}
for(inicijalizacija; uslov; iteracija)
{
naredba1
...
naredbaN}
-
7/28/2019 Cpp Predavanja
74/334
147
Nain pisanja
Smatra se loim programerskim stilom ako se u jedan ilivie delova petlje: inicijalizacija, uslov,
iteracija, stavljaju radnje koje se ne odnose naopsluivanje petlje
148
Primeri za for
for(i=pocetak; i
-
7/28/2019 Cpp Predavanja
75/334
149
Primer za for
int n;
for(n=5; n>0; n--)
printf("Vrednost n je %d\n", n);
Vrednost n je 5Vrednost n je 4Vrednost n je 3Vrednost n je 2Vrednost n je 1
150
Deklaracija promenljive unutar for petlje
Upravljaka promenljiva petlje se esto deklarie unutarpetlje u delu inicijalizacija
Takva promenljiva postoji samo unutar petlje
for(int n=5; n>0; n--)
printf("Vrednost n je %d\n", n);
-
7/28/2019 Cpp Predavanja
76/334
151
Vie upravljakih promenljivih for petlje
U inicijalizaciji se moe deklarisati i inicijalizovati vieupravljakih promenljivih petlje
U iteraciji se moe menjati vie promenljivih Izrazi u inicijalizaciji i iteraciji se razdvajaju zarezima
for(int a=1, b=4; a
-
7/28/2019 Cpp Predavanja
77/334
153
for petlja bez inicijalizacije i iteracije
Delovi for petlje inicijalizacija ili iteracija, ili oba dela,
mogu da se izostave
boolean kraj = false;
int i = 0;
for( ; !kraj; ) {
printf("i je %d", i);
if(i == 5)kraj = true;
i++;
}
154
Beskonana for petlja
for( ; ; ) {
// ...
if(uslov)
break;
// ...
}
-
7/28/2019 Cpp Predavanja
78/334
155
Ugnedene for petlje
for(int i=0; i
-
7/28/2019 Cpp Predavanja
79/334
157
Prolazni podaci
Stvaraju se naredbom za definisanje
dodeljuje im se prostor u memoriji
inicijalizator se svaki put izvrava
imaju sluajnu vrednost ako nisu inicijalizovani
unitavaju se pri naputanju dosega njihovog identifikatora
Primer
{
int t=0;
int a;
...
}
158
Modifikatori za prolazne podatke
Dodaju se na poetku naredbe za definisanje
auto
moe se dodati da bi se naglasila prolaznost podataka, izato se prolazni podaci nazivaju i automatski podaci
register
sugerie prevodiocu da se podaci smeste u brzeprocesorske registre
koriste se npr. za promeljive koje se koriste u najdubljojpetlji kad postoji nekoliko uklopljenih petlji
nije sigurno da e prevodilac to i uraditi
-
7/28/2019 Cpp Predavanja
80/334
159
Primeri korienja modifikatora
{
register int t=0;
auto int a;
...
}
160
Trajni podaci (static)
Stvaraju se prilikom prvog pozivanja naredbe zadefinisanje
Inicijalizatori se izvravaju samo jednom
Ako inicijalizatori ne postoje promenljive imaju poetnuvrednost nula
Unitavaju se pri zavravanju programa
Da bi podatak postao trajni, na poetak naredbe zadefinisanje dodaje se modifikator static
Ovi podaci se zovu i statiki podaci
-
7/28/2019 Cpp Predavanja
81/334
161
Primer definisanja statikih podataka
{
static int t=0; // Inicijalizacija je suvina
static int a;
...
}
162
Privremeni podaci
Slue za odlaganje meurezultata sloenih izraza
Stvara ih prevodilac tako da programer ne zna zanjihovo postojanje
Unitavaju se automatski kad vie nisu potrebni
-
7/28/2019 Cpp Predavanja
82/334
163
Razlika dosega i trajnosti podatka
Doseg odreuje deo programa u kojem podatak moeda se koristi
Trajnost odreuje vreme koliko dugo podatak postoji
Trajni podaci postoje i kad se izvravaju delovi programaizvan njihovog dosega, ali u tim delovima programer nemoe da ih koristi
Za privremene podatke doseg i trajnost se u izvesnomsmislu poklapaju
164
Mesto definisanja podataka
Podatke je najbolje definisati najblie mestu gde sekoriste
npr. unutar najmanjeg bloka koji obuhvata sva mesta nakojima se podatak koristi
Tipovi podataka, npr. definisani sa typedef, obino se
koriste u veem delu programa definiu se u *.h fajlu ili na poetku fajla
-
7/28/2019 Cpp Predavanja
83/334
165
Naredbe skoka
Slue za prekidanje izvravanja redosleda naredbi i
nastavljanje na definisanom mestu, tj. slue zapreskakanje naredbi
break
continue
return
Naredbe skoka nemaju strukturu, pa nisu upravljakestrukture
Naredbe skoka ne vre nikakvu obradu pa nisu prostenaredbe
166
Naredba break
Slui za iskakanje iz upravljake strukture
preskakanje preostalih naredbi unutar naredbe switch iskakanje na prvu naredbu iza naredbe switch
prevremeni zavretak petlje (for, while, do) i skakanje
na prvu naredbu iza naredbe
uobiajeno je da se iz petlje izlazi na osnovu uslova
Prekida samo jednu upravljaku strukturu
-
7/28/2019 Cpp Predavanja
84/334
167
Selekcija alternativnih grana
int godina, mesec, broj_dana;
...
switch(mesec){
case 1: case 3: case 5: case 7:
case 8: case 10: case 12:
broj_dana = 31; break;
case 4: case 6: case 9: case 11:
broj_dana = 30; break;
case2:
broj_dana = 28 + (godina%4==0 && godina%100!=0
|| godina%400==0); break;
default:
broj_dana = -1; break;
}
168
Izlazak iz for petlje sa break
for(int i=0; i
-
7/28/2019 Cpp Predavanja
85/334
169
Izlazak iz while petlje sa break
int i=0;
while(i
-
7/28/2019 Cpp Predavanja
86/334
171
break u uklopljenim strukturama
for(int i=0; i
-
7/28/2019 Cpp Predavanja
87/334
173
Naredba continue
Naredba continue se obino nalazi unutar naredbe
if ili switch, inae se naredbe iza continue nikad
ne bi izvravale Primer
petlja
{
...
if(uslov)
continue;
...
}
174
Primer za continue
for(int i=0; i
-
7/28/2019 Cpp Predavanja
88/334
175
Skok sa proizvoljnim odreditem
Opti oblik naredbe goto je:
goto oznaka;
Oznaka je odredite skoka
pie se po pravilima pisanja za identifikator
oznaka ima funkcijski doseg
Naredba na koji se skae obeleava se oznakom koja sepie ispred naredbe
oznaka: naredba
Odredite skoka moe biti na bilo kojem mestu
uskakanje u blok nije zabranjeno, ali treba smatrati kao dajeste
naredba goto se moe koristiti npr. da se prekine vie
uklopljenih struktura
176
Primer za goto
for(...){
for(...){
for(...){
...
if(propast) goto greska;
...
}
}
}
greska: // obrada greke
-
7/28/2019 Cpp Predavanja
89/334
177
Naredba return
Opti oblik
tip ime_metode(lista_parametara) {
...
if(uslov) return [vrednost];
...
}
Slui za izlazak iz metode
Posle naredbe return kontrola se vraa pozivaocu metode Naredba if je se najee pie ako naredba return nije
poslednja naredba u metodi, inae se naredbe iza naredbereturn nikad ne bi izvravale
vrednost ne postoji ako je tip metode void, inae postoji
178
Nizovi
-
7/28/2019 Cpp Predavanja
90/334
179
Nizovi
Sloeni (strukturirani) tipovi podataka
Slue za predstavljanje vektora, matrica,viedimenzionalnih nizova
Predstavljaju niz podataka istog tipa koji se nazivajuelementi niza
Elementi niza se identifikuju pomou rednog broja unutarniza koji se naziva indeks
Indeksiranje uvek poinje od nule, tj. prvi element nizauvek ima indeks 0
180
Nizovi
Imaju jednu ili vie dimenzija
Jednodimenzionalni niz (vektor) ima skalarne elemente
Dvodimenzionalni niz (matrica) je niz iji su elementijednodimenzionalni nizovi
-
7/28/2019 Cpp Predavanja
91/334
181
Definisanje nizova
Opti oblik je:tip identifikator_niza [duina1][duina2]...[duinaN]
Duina mora da bude konstantan izraz
Primer
float vektor[50], matrica[10][20], x;
Elemenit niza vektor imaju indekse od 0 do 49
Dvodimenzionalni niz matrica ima 10 vrsta i 20 kolona,indeksi vrsta su od 0 do 9, a kolona od 0 do 19
182
Inicijalizacija niza
Pri definisanju niza mogu da se navedu poetne vrednostitj. inicijalizatori
Nizovi sa inicijalizatorima su uvek trajni
Inicijalizator niza je oblika:
{ vrednost1, vrednost2, ... vrednostN }
Primeri:int dani[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int dani[] = {31,28,31,30,31,30,31,31,30,31,30,31};
long a1[5] = { 1, 2, 3 };
long a2[5] = { 1, 2, 3, 0, 0 }; // iste vrednosti ima i niz a1
long a3[5] = { 1, 2, 3, 4, 5, 6 }; // greka
const int tablica[] = { 1, 5, 3, 4, 2 };
-
7/28/2019 Cpp Predavanja
92/334
183
Inicijalizacija dvodimenzionalnih nizova
int tab_dan[2][12] =
{
{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31},
};
int tab_dan[2][13] =
{
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31},
};
184
Inicijalizacija dvodimenzionalnih nizova
short kvadrat1[4][4] =
{ {0,1,2}, {3,4}, {5,6,7,8}, {9} };
short kvadrat2[4][4] =
{ {0,1,2,0}, {3,4,0,0}, {5,6,7,8}, {9,0,0,0} };
short kvadrat3[4][4] = { 0,1,2,3,4,5,6,7,8,9 };
short kvadrat4[4][4] =
{ {0,1,2,3}, {4,5,6,7}, {8,9,0,0}, {0,0,0,0} };
-
7/28/2019 Cpp Predavanja
93/334
185
Predstavljanje dvodimenzionalnog niza
[0][3][0][2][0][1][0][0]
[1][3][1][2][1][1][1][0]
int matrica[3][4];
Prvi indeks odreuje vrstu a drugi kolonu
[2][3][2][2][2][1][2][0]
186
Pristupanje elementima niza
Elementu se pristupa pomou indeksa tj. rednog brojaunutar niza
Pristup elementima niza naziva se indeksiranje
Koristi se binarni operator []
Prvi operand je niz i pie se ispred operatora, a drugi je
indeks i pie se "unutar" operatora []
niz[indeks]
indeks moe da bude proizvoljan celobrojni izraz
Operator za indeksiranje je prioriteta 18 i grupie sesleva udesno
-
7/28/2019 Cpp Predavanja
94/334
187
Pristupanje elementima niza
Skalarni element niza je lvrednost
Operatorom za dodelu vrednosti = ne moe se sadrajjednog niza preneti u drugi niz
Niz moe da se koristi kao operand operatora [] isizeof
Primeri
vektor[1] = 155;
vektor[i+(j-1)*n] = a+b*c;
matrica[i][j] = vektor[i+j];
188
Identifikatori nizovnih tipova
Opti oblik je
typedef tip identifikator_tipa [d1]...[dN];
Primer
typedef double Niz[10];
Niz p, q[3];
p[7] = q[0][9];
double p[10];
-
7/28/2019 Cpp Predavanja
95/334
189
Veliina niza
Veliina memorije koju zauzima neki niz dobija seunarnim operatorom sizeof
Primeri:
typedef double Niz[10];
Niz p, q[3];
p[7] = q[0][9];
sizeof(double) // 8
sizeof(Niz) // 10 x 8 = 80sizeof(q) // 3 x 10 x 8 = 240
sizeof(q[1]) // 10 x 8 = 80
sizeof(q[2][7]) // 8
190
Pokazivai (pointeri) i reference
-
7/28/2019 Cpp Predavanja
96/334
191
Pokazivai
Operativna memorija je niz adresnih lokacija koje sunumerisane celim brojevima 0, 1, 2, ... , m-1, gde je m
kapacitet memorije
Brojevi pridrueni memorijskim lokacijama nazivaju seadrese
Najmanja memorijska lokacija koja moe da se adresiraje obino jedan bajt
Pokazivaje prost podatak u koji moe da se smesti
adresa neke lokacije u memoriji
Pokaziva obino zauzima 2 ili 4 bajta
192
Operator za dohvatanje adrese &
(upuiva) Adresa nekog podatka u memoriji moe da se dobije
pomou prefiksnog unarnog operatora &
Operator je prioriteta 16 i grupie se zdesna ulevo
Operand operatora & mora da bude lvrednost, tj.podatak koji se nalazi u memoriji
-
7/28/2019 Cpp Predavanja
97/334
193
Operator za dohvatanje podatka *
(pokaziva)
Podatak u memoriji se moe dohvatiti na osnovu njegoveadrese primenom prefiksnog unarnog operatora *
Operator je prioriteta 16 i grupie se zdesna ulevo
Operand operatora * mora da bude adresa nekogpodatka u memoriji i ne mora da bude lvrednost
Rezultat je podatak sa navedenom adresom i predstavljalvrednost
Dohvatanje podatka posredno, pomou adrese, nazivase indirektno adresiranje.
194
Definisanje pokazivaa
Opti oblik je:
tip * identifikator_pokazivaa
Tip je standardni tip ili tip definisan sa typedef
Primer:
int *p; int* p;
Jedno tumaenje: poto je *p tipa int, p jepokaziva na int
Definisanje vie pokazivaa istom naredbom
short *p1, *p2;
-
7/28/2019 Cpp Predavanja
98/334
195
Generiki pokaziva
Generiki pokazivaje pokaziva kod kojeg nije odreentip pokazivanog podatka
Definie se stavljanjem slubene rei void umesto tipa
Primer:
void* p;
196
Primeri
double a, *pa=&a;
double b, *pb;
pb = &b;
Nije bitno to a i b nisu dobili vrednosti
-
7/28/2019 Cpp Predavanja
99/334
197
Primeri
int x=1, y=2, z[7];
int *pi; // pi je pokaziva na int
void *pj; // pj je generiki pokaziva
pi = &x; // pi pokazuje na x
y = *pi; // y je sada 1
pj = pi; // pj pokazuje na x
*pi = 0; // x je sada 0
*pj = 3; // greka, pj je generiki pok.*(int*)pj = 3; // x je sada 3
pi = &z[0]; // pi sada pokazuje na z[0]
pj = &z[5]; // pj sada pokazuje na z[5]
198
Primeri
int x=1;
int *pi; // pi je pokaziva na int
void *pj; // pj je generiki pokaziva
pi = &x; // pi pokazuje na x
pj = pi; // pj pokazuje na x
*pj = 3; // greka u prevodjenju
*(int*)pj = 3; // x je sada 3
*(double*)pj = 1.5; // prevodi se
*(double*)pi = 2.5; // prevodi se
U zadnja dva primera pokaziva pokazuje na tip podatka
koji zauzima 4 bajta u memoriji, a upisuje se podatak kojizauzima 8 bajtova
-
7/28/2019 Cpp Predavanja
100/334
199
Nepromenljivi podaci i promenljivi pokazivai
Dosad su korieni promenljivi pokazivai napromenljive podatke
Definisanje promenljivog pokazivaa nanepromenljive podatke
const tip *p;
Tumaenje: p je pokaziva (*) na nepromenljive(const) podatke tipa tip
Vrednost pokazivaa se moe promeniti
Pomou pokazivaa se ne moe promeniti vrednostpodatka na koji pokazuje
200
Promenljivi podaci i nepromenljivi pokazivai
Definisanje nepromenljivog pokazivaa napromenljive podatke
tip *const p = &k;
Tumaenje: p je nepromenljivi (const) pokaziva (*)na podatke tipa tip
Vrednost pokazivaa se ne moe promeniti
Pomou pokazivaa se moe promeniti vrednostpodatka na koji pokazuje
-
7/28/2019 Cpp Predavanja
101/334
201
Nepromenljivi podaci i nepromenljivi pokazivai
Definisanje nepromenljivog pokazivaa nanepromenljive podatke
const tip *const p = &k;
Tumaenje: p je nepromenljivi (const) pokaziva (*)na nepromenljive (const) podatke tipa tip
Vrednost pokazivaa se ne moe promeniti
Pomou pokazivaa se ne moe promeniti vrednostpodatka na koji pokazuje
202
Pokazivai sa modifikatorom volatile
(nepostojani podaci) Mogunosti su:
volatile tip* (objekat je volatile)
tip *volatile (pointer je volatile)
volatile tip *volatile (oba volatile)
volatile tip *const (volatile objekat,
const pokaziva)
const tip *volatile
-
7/28/2019 Cpp Predavanja
102/334
203
Dodele vrednosti pokazivaima
Pokazivau na promenljive podatke mogu da se dodelesamo adrese promenljivih podataka
Pokazivau na nepromenljive podatke mogu da sedodele adrese nepromenljivih i promenljivih podataka
Pokazivau na nepostojane podatke mogu da se dodeleadrese nepostojanih i promenljivih podataka
Eksplicitnom konverzijom mogu da se prekre ovapravila, ali je u tom sluaju odgovoran programer
204
Primeri
int a=2,*pa=&a, *const kpa=&a;//pok.je const
const int b=5, *pkb=&b, *const kpkb=&b;
pkb = pa;
*pkb = 4; // greka
kpa = pa; // greka
pa = kpkb; // greka pravilo 1 sa// prethodne strane
pa = (int*)kpkb; // Ne preporuuje se
*pa = 4; // Menja se nepromenljivi
// podatak b
int c=1, *const kpc=&c;
pa = kpc;
-
7/28/2019 Cpp Predavanja
103/334
205
Prikazivanje vrednosti pokazivaa
Zavisi od jezika C na datom raunaru
U scanf i printf se koristi vrsta konverzije %p
Primer:#include
main ()
{
int x, *px;
px = &x;
printf("%p\n", px);
}
Rezultat je npr: 0x07ff35cd
206
Identifikatori pokazivakih tipova
Opti oblik je:
typedef tip * identifikator_tipa
Primer:typedef double* Pdouble;
double a, b;
Pdouble pa, pb, pc;
pa = &a;
pb = &b;
scanf("%lf%lf", pa, pb)
pc = (*pa < *pb) ? pa : pb;
printf("%g", *pc);
-
7/28/2019 Cpp Predavanja
104/334
207
Adresna aritmetika
Dozvoljene su operacije
dodela vrednosti jednog pokazivaa drugom
dodavanje celobrojnog podatka na vrednost pokazivaa i
oduzimanje celobrojnog podatka od vrednosti pokazivaa
oduzimanje i uporeivanje dva pokazivaa
uporeivanje pokazivaa i nule
208
Dodela vrednosti
Ako su razliiti tipovi pokazivaa obavezno je kastovanje
Kastovanje nije obavezno ako se dodeljuje vrednostpokazivau generikog tipa (void*)
Primer:
int a;
void* gp = &a;
int* pi = gp; // greka
int* pj = (int*)gp;
-
7/28/2019 Cpp Predavanja
105/334
209
Dodavanje celobrojnog podatka
Mogu se primeniti operatori: +, ++, +=, -, --, -=
Ne mogu se primeniti gornji operatori na pokazivagenerikog tipa (void*)
Jedinica mere pri sabiranju i oduzimanju je veliinapokazivanih podataka
Ako pokaziva p pokazuje na neki element niza, tada:
posle p+1 ili p++ pokaziva pokazuje na naredni
element niza
posle p-1 ili p-- pokaziva pokazuje na prethodni
element niza
210
Operacije izmeu dva pokazivaa
Za dva pokazivaa istog tipa (razliitog od void*) koji
pokazuju na elemente istog niza, dozvoljeno je:
oduzimanje operatorom
uporeivanje relacijskim operatorima =
Dozvoljeno je uporeivanje dva pokazivaa istog tipa
(ukljuujui i void*) relacijskim operatorima ==, != rezultat je da li pokazivai pokazuju na isti podatak
Dozvoljeno je uporeivanje dva pokazivaa istog tipa(ukljuujui i void*) sa nulom
rezultat je da li pokaziva pokazuju na neki podatak
moe se umesto nule koristiti simbolika konstanta NULL,
definisana u i
-
7/28/2019 Cpp Predavanja
106/334
211
Pokazivai i nizovi
Identifikator niza predstavlja poetnu adresu niza
Identifikator niza je nepromenljivi pokaziva na podatkeiji je tip jednak tipu elementa niza
Primer:
int a[10];
Moe se smatrati da je identifikator a tipaint* const, i da je inicijalizovan poetnom adresombloka memorije veliine 10 podataka tipa int
212
Pokazivai i nizovi
Ako su:a identifikator niza,i indeks,
prema adresnoj aritmetici, tj. na osnovu sabiranjapokazivaa i celih brojeva, sledee je ekvivalentno:
&a[i]
a + i
i + aa[i] *(a + i) *(i + a) i[a]
Izraz i[a] treba izbegavati
-
7/28/2019 Cpp Predavanja
107/334
213
Primer za pokazivae i nizove
int a[10], *pa, *pb, x, y;
pa = &a[4]; // pa pokazuje na a[4]
x = *(pa + 3); // x = a[7]*pa++; // *(pa++), poveava se pokaziva, pokazuje na a[5]
pa++; // poveava se pokaziva, pokazuje na a[6]
(*pa)++; // poveava se pokazivani podatak
pb = &a[2]; // pb pokazuje na a[2]
if (pb < pa) // uporeivanje pokazivaa, rezultat je "tano"
{
...
}
214
Primer: izraunavanje skalarnog proizvoda
double a[10], b[10], s=0;
...
// Prvi nain, pomou indeksa
for (int i=0; i
-
7/28/2019 Cpp Predavanja
108/334
215
Smetanje dvodimenzionalnih nizova u memoriju
Operativna memorija je jednodimenzionalnaenum{ m=3, n=4 };
int b[m][n];
Gornja matrica se u memoriju smeta na sledei nain
[0][3][0][2][0][1][0][0]
[1][3][1][2][1][1][1][0]
[2][3][2][2][2][1][2][0]
2,1 2,21,3 2,01,1 1,20,3 1,0 2,30,20,10,0
216
Adresna aritmetika za dvodimenzionalni niz
enum{ m=3, n=4 };
int b[m][n];
2,1 2,21,3 2,01,1 1,20,3 1,0 2,30,20,10,0
Tip identifikatora b je pokaziva na niz od etiri integer-a
b &b[0] je adresa poetka prve vrste matriceb+1 &b[1] je adresa poetka druge vrste matrice
Pristupanje elementu dvodimenzionalnog niza
b[i][j] *((int*)b + n*i + j)
b[i][j] *((int*)(b+i) + j)
U izraunavanju indeksa ne uestvuje prva dimenzija nizam
-
7/28/2019 Cpp Predavanja
109/334
217
Smetanje viedimenzionalnih nizova u memoriju
enum{ p=2, q=2, r=3 };
int c[p][q][r];
1,1,0 1,1,11,0,1 1,0,20,1,2 1,0,00,1,0 0,1,1 1,1,20,0,20,0,10,0,0
Gornji trodimenzionalni niz se u memoriju smeta nasledei nain
[1][0][2][1][0][1][1][0][0]
[1][1][2][1][1][1][1][1][0]
[0][0][2][0][0][1][0][0][0]
[0][1][2][0][1][1][0][1][0]
218
Adresna aritmetika za trodimenzionalni niz
enum{ p=2, q=2, r=3 };
int c[p][q][r];
1,1,0 1,1,11,0,1 1,0,20,1,2 1,0,00,1,0 0,1,1 1,1,20,0,20,0,10,0,0
Tip identifikatora c je pokaziva na matricu od dve vrste
i tri kolone iji su elementi integer-i
c &c[0] je adresa poetka prve matrice
c+1 &c[1] je adresa poetka druge matrice
Pristupanje elementu trodimenzionalnog niza
c[i][j][k] *((int*)c + q*r*i + r*j + k)
U izraunavanju indeksa ne uestvuje prva dimenzijaniza p
-
7/28/2019 Cpp Predavanja
110/334
219
Tipovi identifikatora nizova
// Definisane su konstante k, m, n, p, q, r
int a[k]; // a je tipa int*
int b[m][n]; // b je tipa int**
int c[p][q][r]; // c je tipa int***
220
Statika dodela memorije
Statika dodela memorije nizu
const int m = 100;
int a[m];
Deo memorije u koji se smetaju statiki definisanipodaci naziva se statika zona memorije
Za nizove se mora znati veliina niza
Ako se ne zna veliina niza mora se definisati niz sanajveom oekivanom duinom
Moe doi do nepotrebne potronje memorije
-
7/28/2019 Cpp Predavanja
111/334
221
Dinamika dodela memorije
Memorijski prostor se moe traiti od operativnogsistema u vreme izvravanja programa
Dinamika zona memorije je deo memorije koji sedinamiki dodeljuje u vreme izvravanja programa
Podaci u dinamikoj zoni memorije nemaju identifikatore,pristupa im se preko pokazivaa
Podaci u dinamikoj zoni memorije postoje sve dok ihprogramer ne uniti, ili se ne zavri program
Podaci u dinamikoj zoni memorije se nazivaju dinamikipodaci
222
Dodela memorije u dinamikoj zoni: operator new
Operator new slui za dodelu memorije u dinamikoj
zoni memorije, opti oblik je
new naziv_tipa (poetna_vrednost )
naziv_tipa je identifikator osnovnog ili izvedenog tipa
moe imati modifikator * ili [duina]
Za nizove prva dimenzija moe biti promenljiva, a sveostale moraju biti konstantni izrazi
poetna_vrednost je proizvoljan izraz odgovarajueg
tipa
inicijalizuju se samo pojedinani podaci, ne mogu nizovi
Operator new kao rezultat vraa pokaziva na dodeljeni
memorijski prostor
-
7/28/2019 Cpp Predavanja
112/334
223
Oslobaanje memorije u dinamikoj zoni: operatordelete
Opti oblik za pojedinane podatke je:
delete izraz
Opti oblik za nizove bez obzira na dimenziju je:
delete [] izraz
izraz je adresni izraz koji pokazuje na podatak u
dinamikoj zoni memorije kome je memorija dodeljenapomou operatora new, inae su posledice nepredvidive
Ako izraz ime vrednost nula (NULL) ne deava senita
Operator delete ne vraa rezultat (tip void)
224
Primeri
double* pd = new double(5.2);
delete pd;
int n = 10;
float* a = new float[n];
for(int i=0; i
-
7/28/2019 Cpp Predavanja
113/334
225
Alociranje dinamike memorije u jeziku C
Biblioteke funkcije iz
malloc(veliina) // tip void*
calloc(n, veliina) // tip void*
realloc(p, veliina) // tip void*
free(p)
Ne treba koristiti ove funkcije, treba uvek koristitioperatore new i delete
226
Reference (upuivai)
Referenca je alternativno ime za podatak
Ne zauzimaju prostor u memoriji
Ne postoje pokazivai na reference
Ne postoje nizovi referenci
Moraju da se inicijalizuju prilikom definisanja
Ne mogu da im se promene vrednosti (tj. adresa na kojuukazuju, za razliku od pokazivaa)
-
7/28/2019 Cpp Predavanja
114/334
227
Definisanje reference
Dodaje se modifikator & ispred identifikatora reference
Primeri:int k = 1;
int& r = k; // r i k predstavljaju isti int
int x = r; // x = 1
r = 2; // k = 2
r++; // poveava se k, k = 3
int* p = &r; // p pokazuje na k
int* p1 = &k;// p1 pokazuje na kint y = *p; // y = 3
*p = 5; // k = 5
p = 0; // p ne pokazuje na podatak
228
Reference i modifikatori const i volatile
Reference mogu da upuuju na
promenljive podatke
nepromenljive podatke (const)
nepostojane podatke (volatile)
Primer
int k = 1;
int& r = k; // r i k predstavljaju isti int
r = 2; // k = 2, pomou r se moe menjati k
const int& rc = k; // rc i k predstavljaju isti int
rc = 5; // greka, pomou rc ne moe se menjati k
-
7/28/2019 Cpp Predavanja
115/334
229
Definisanje tipova
Sa typedef se moe dodeliti ime tipu podatka koji je
referenca na neki tip
Primer
typedef double& Rdouble;
double a, b;
Rdouble ra = a, rb = b;
ra = rb = 5; // a = b = 5
Ekvivalentno sa:
double &ra = a, &rb = b;
230
Funkcije
-
7/28/2019 Cpp Predavanja
116/334
231
Funkcije
Rastavljanje sloenijih problema na vie jednostavnijihproblema
Funkcije su potprogrami koji na osnovu argumenata dajurezultat koji se naziva vrednost funkcije
Funkcija moe da daje i druge rezultate koji se nazivajuboni efekti
Funkcija ne mora da vraa kao rezultat vrednostfunkcije, moe da ima samo bone efekte
232
Definisanje funkcija
Naredba za definisanje funkcije ima opti oblik:
tip naziv (niz_argumenata) telo_funkcije
tip je tip rezultata koji vraa funkcija, tj. tip vrednosti
funkcije
naziv je identifikator funkcije
niz_argumenata predstavlja argumente funkcije
pomou kojih se unose poetne vrednosti
telo_funkcije je po formi blok
-
7/28/2019 Cpp Predavanja
117/334
233
Primer funkcije
long faktorijel(int n)
{
long rezultat = 1;
for(int i=n; i>1; i--)
rezultat *= i;
return rezultat;
}
234
Vrednost funkcije
Tip vrednosti funkcije je tip rezultata koji vraa funkcija
Ako funkcija ne vraa vrednost (ima samo bone efekte)tip vrednosti funkcije je void
Ako se izostavi tip vrednosti funkcije u definiciji funkcijepodrazumeva se tip int
Tip vrednosti funkcije moe da bude pokaziva na nekitip (modifikator *), a takoe i referenca (modifikator &)
Vrednost funkcije moe biti proizvoljnog skalarnog tipa
moe da bude jedan podatak
ne moe da bude niz
moe da bude pokaziva na element niza
-
7/28/2019 Cpp Predavanja
118/334
235
Argumenti funkcije
tip naziv(niz_argumenata) telo_funkcije
niz_argumenata ima oblik:argument, argument, ... , argument
Pojedinani argument se definie kao podatak:
tip naziv_argumenta
tip argumenta je proizvoljan standardni tip iliidentifikator tipa definisan naredbom typedef
moe da bude i pokaziva na neki tip ili referenca moe da bude i niz
oznaka tipa mora da se navede uz svaki argument
Argumentima se unose poetne vrednosti podataka ufunkciju
236
Niz argument funkcije
Za jednodimenzionalne nizove ne mora da se navodidimenzija niza
Primer:double srednjaVrednost(int niz[], int duzina_niza)
{...}
Za viedimenzionalne nizove ne mora da se navodi prvadimenzija, ostale moraju
Primer:int naziv_funkcije (int matrica[][10], int n) {...}
Viedimenzionalni nizovi se retko koriste kao argumenti
esto se smetaju u jednodimenzionalne, a u funkciji se
koristi adresna aritmetika za pristupanje elementima niza
-
7/28/2019 Cpp Predavanja
119/334
237
Niz - argument funkcije
Za jednodimenzionalni niz argument moe da bude niz ilipokaziva na poetak niza
Primer:double srednjaVrednost(int niz[], int duzina_niza)
{...}
ili:double srednjaVrednost(int *niz, int duzina_niza)
{...}
238
Formalni i stvarni argumenti
Formalni argumenti su argumenti koji se navode udefinisanju funkcije
Stvarni argumenti su argumenti koji se navode prilikompozivanja funkcije
Formalni argumenti prilikom pozivanja funkcije dobijaju
vrednosti od stvarnih argumenata
-
7/28/2019 Cpp Predavanja
120/334
239
Primer
long faktorijel(int n)
{
long rezultat = 1;
for(int i=n; i>1; i--)
rezultat *= i;
return rezultat;
}
void prikazFaktorijel(int a)
{
printf("faktorijel je %d\n", faktorijel(a));
}
240
Telo funkcije
Po formi je blok
Moe da sadri deklarativne i izvrne naredbe
Podaci definisani u telu funkcije su lokalni za tu funkciju
Formalni argumenti su lokalni za funkciju
moe se smatrati kao da su definisani na poetku bloka
pre prve naredbe bloka
inicijalizovani su vrednostima stvarnih argumenata
-
7/28/2019 Cpp Predavanja
121/334
241
Telo funkcije
Povratak iz funkcije u pozivajuu funkciju radi senaredbom return
Opti oblik je:
return izraz; // Kad funkcija vraa rezultat
return; // Kad je tip vrednosti funkcije void
Izraz predstavlja vrednost funkcije (vraeni rezultat)
mora po tipu da se slae sa predvienim tipom vrednostifunkcije
za numerike tipova radi se automatska konverzija upredvieni tip rezultata
Naredba return moe da se izostavi ako je toposlednja nareba u funkciji iji je rezultat tipa void
242
Naredba return
Unutar tela funkcije moe biti vie naredbi return u
razliitim selekcijama
Funkcija se zavrava kad se izvri prva naredba return
Primer:long faktorijel(int n)
{
if(n < 2)
return 1;
long rezultat = 1;
for(int i=n; i>1; i--)
rezultat *= i;
return rezultat;
}
-
7/28/2019 Cpp Predavanja
122/334
243
Vrednost funkcije je pokaziva ili referenca
Vrednost funkcije ne sme da bude pokaziva ilireferenca na lokalni prolazni podatak funkcije
Prolazni lokalni podatak se unitava pre nego topozivajua funkcija moe da mu pristupi
Moe da bude pokaziva ili referenca na lokalni trajnipodatak
Moe da bude pokaziva na dinamiki podataknapravljen u funkciji
244
Primer
Moe (vraanje vrednosti):int DoubleValue(int nX)
{
int nValue = nX * 2;
return nValue; // Ovde se vraa kopija od nValue
} // nValue izlazi iz dosega
Ne moe (vraanje reference):int& DoubleValue(int nX)
{
int nValue = nX * 2;
return nValue; // Ovde se vraa refer. od nValue
} // nValue izlazi iz dosega
-
7/28/2019 Cpp Predavanja
123/334
245
Primer
Ne moe (vraanje adrese):
int* DoubleValue(int nX)
{
int nValue = nX * 2;
return &nValue; // Ovde se vraa adresa nValue
} // nValue izlazi iz dosega
246
Biblioteke funkcije
U sastavu jezika je standardna biblioteka sa velikimbrojem standardnih funkcija
biblioteke funkcije su podeljene u nekoliko grupa naosnovu slinosti
deklaracije funkcija navedene su u *.h datotekama
(datoteke zaglavlja) Da bi se koristile standardne funkcije, na poetku
programa (tj. datoteke u kojoj se koriste funkcije) dodajese zaglavlje fajla u kojem su deklarisane standardnefunkcije:
#include
-
7/28/2019 Cpp Predavanja
124/334
247
Matematike funkcije,
th xtanh(x)
ch xcosh(x)
sh xsinh(x)
arctg x/y, rezultat [-, ], mora x ili y da bude 0atan2(x,y)
arctg x, rezultat [-/2, /2]atan(x)
arccos x, x[-1, 1]acos(x)
arcsin x, x[-1, 1]asin(x)
tg xtan(x)
cos xcos(x)
sin xsin(x)
Rezultat, x i y su tipa double, n je tipa int
248
Matematike funkcije,
x2nldexp(x,n)
|x|fabs(x)
najvei ceo broj xfloor(x)
najmanji ceo broj xceil(x)
x1/2, x0sqrt(x)
xy, za x=0 mora y>0; za x0log10(x)
logex, x>0log(x)
exexp(x)
Rezultat, x i y su tipa double, n je tipa int
-
7/28/2019 Cpp Predavanja
125/334
249
Matematike funkcije,
ostatak realnog deljanja x/y sa predznakom od x
standard ne precizira rezultat za y=0fmod(x,y)
vrednost funkcije je razlomljeni deo realnog broja x sapredznakom tog brojay je celobrojni deo broja x sa predznakom tog broja(boni efekat)
modf(x,&y)
vrednost funkcije je normalizovana mantisa realnog
broja x u opsegu [-1/2, 1]
n je eksponent (boni efekat)
frexp(x,&n)
Rezultat, x i y su tipa double, n je tipa int
250
Matematike funkcije,
|n|, n je tipa long int, rezultat je tipa long intlabs(n)
Postavljanje poetne vrednosti sekvencepseudosluajnih brojeva koju daje funkcija rand() na n.Podrazumevana poetna vrednost sekvence je 1.n je tipa unsigned int
srand(n)
Pseudosluajan broj tipa int sa uniformnomraspodelom u opsegu [0, RAND_MAX].
RAND_MAX je simbolika konstanta zavisna od
raunara, RAND_MAX 32767
rand()
|n|, n je tipa int, rezultat je tipa intabs(n)
Funkcije za celobrojne tipove
-
7/28/2019 Cpp Predavanja
126/334
251
Funkcije za rad sa znakovima,
Ispisuje znak c na glavnom izlazu raunara (ekranu)putchar(c)
Ispisuje sadraj znakovnog niza s (tipa char[] ilichar*) do zavrnog znaka '\0', dodajui znak '\n'
puts(s)
ita jedan red teksta sa glavnog ulaza raunara, doznaka '\n' koji se zamnenjuje '\0'.Rezultat je znakovni niz s tipa char[] ili char*
gets(s)
ita sledei znak sa glavnog ulaza raunara(tastature), ukljuujui bele znaka (Ctrl-Z za kraj)
getchar()
252
Funkcije za ispitivanje znakova,
Da li je c specijalni znak, tampajui nije slovo ni cifraispunct(c)
Da li je c upravljaki znakiscntrl(c)
Da li je c veliko slovoisupper(c)
Da li je c decimalna cifraisdigit(c)
Da li je c heksadecimalna cifraisxdigit(c)Da li je c beli znakisspace(c)
Da li je c tampajui znak, ali nije razmakisgraph(c)
Da li je c tampajui znak, ukljuujui i razmakisprint(c)
Da li je c malo slovoislower(c)
Da li je c slovoisalpha(c)
Kod odgovarajueg malog slova, inae ctoupper(c)Kod odgovaraju
eg velikog slova, ina
e ctolower(c)
Da li je c slovo ili cifraisalnum(c)
-
7/28/2019 Cpp Predavanja
127/334
253
Funkcije za rad sa stringovima,
indeks prvog elementa niza u koji sadri bilo kojiznak iz niza s
strcspn(u,s)
dopisivanje s na kraj t, najvie n znakovastrncat(t,s,n)
poreenje u i sstrcmp(u,s)
broj ynakova bez '\0'strlen(s)
pokaziva na prvi element niza u koji sadri znak cstrchr(u,c)
pokaziva na zadnji element niza u koji sadri znak cstrrchr(u,c)
pokaziva na prvi element niza u od kojeg poinjepodniz s
strstr(u,s)
dopisivanje s na kraj tstrcat(t,s)
kopiranje s -> t, najvie n znakovastrncpy(t,s,n)
indeks prvog elementa niza u koji sadri bilo kojiznak koji se ne pojavljuje u nizu s
strspn(u,s)
kopiranje s -> tstrcpy(t,s)
254
Konverzija u numerike tipove,
Konverzija celog broja iz stringa oblika cccc u
binarni ekvivalent, rezultat je tipa long intatol(s)
Konverzija celog broja iz stringa oblika cccc ubinarni ekvivalent, rezultat je tipa int
atoi(s)
Konverzija realnog broja iz stringa oblikaccc.cccEee u binarni ekvivalent, rezultat je tipadouble
atof(s)
-
7/28/2019 Cpp Predavanja
128/334
255
Pozivanje funkcije
Binarni operator sa operandima
prvi operand je funkcija koja se poziva
drugi operand je niz stvarnih argumenata
operator je prioriteta 18, grupie se sleva udesno
Opti oblik pozivanja funkcije je:
funkcija ( izraz, izraz, ... , izraz)
funkcija je funkcija koja se poziva i moe biti
identifikator funkcije adresni izraz ija je vrednost adresa eljene funkcije
izrazi su stvarni argumenti kojim se inicijalizuju
formalni argumenti pre izvravanja tela funkcije
256
Stvarni argumenti
Treba da se slau p