C Operatori Kontrolne Strukture
-
Upload
nenad-radukin -
Category
Documents
-
view
47 -
download
0
description
Transcript of C Operatori Kontrolne Strukture
-
1Operatori i izrazi
Izraz =operatori + operanadi
operatori - definiu radnje koje se izvravaju nad podacima dajui odreeni rezultat
operandi - konstante, promenljive i rezultati podizraza
Operatori i izrazi
Operatori:unarnipostfiksniprefiksni
binarni (infiksni) ternarni (uslovni izraz)n-arni (funkcije)
Operatori i izrazi
Grupe operatora:adresniaritmetiki relacioniza rad sa bitovima logikiza dodelu vrednostioperator reanja ,
Operatori i izrazi
Adresni mehanizam pristupanjaobjektima u memoriji preko adrese (specifinost C-a)
Operator zarez formiranje niza meusobno nezavisnih izraza (formalno jedan izraz)
a=b, b=3*c, c=x;
-
2Operatori i izrazi
Grupisanje operanada uz operatore:zagrade (mogu biti ugnedene)prioritet (15 nivoa)asocijativnost (smer grupisanja)na istom prioritetu, grupisanje svih
operatora u istom smeru
Aritmetiki operatori
numeriki operandi (i char!) numeriki rezultati unarni i binarni operatori poredak izvravanja za asocijativne
i komutativne operatore (npr. +,*) nije garantovan, prevodilac moe da preuredi izraz
Aritmetiki operatori
binarni operatori:* proizvod (13)/ kolinik (13)% ostatak (13)+ zbir (12)- razlika (12)
asocijativnost LD
Aritmetiki operatori
a+b-ca+b*ca/b*c7/4*3 = 37*3/4 = 57./4.*3. = 5.257*3./4. = 5.257%3 = 19%3 = 0G-A+a = g
-
3Aritmetiki operatori
Unarni operatori:- promena predznaka (14)+ bez uticaja (14)-- dekrementiranje (14)++ inkrementiranje (14)
asocijativnost DL
Aritmetiki operatori:Unarni operatori
-- i ++ operandi samo promenljive
(ne i rezultati drugih izraza) postfiksni: i++ vraa staro i,
pa uveava ( postinkrement) prefiksni ++i uveava, pa vraa
novo i (preinkrement)
Aritmetiki operatori
j=i++ j=i, i=i+1j=++i i=i+1, j=i
primer bonih efekata rezultati koji se dobijaju pored vrednosti izraza
Relacioni operatori
binarni operatori>,>=,
-
4Relacioni operatori
Primeri:
5>7 0105 014>5D|| logiko ILI (4) L->D
unarni operator! negacija (14) D->L
Logiki operatori
kod uzastopnih && ili ||
prvo se izraunava levi operand izraunavanje se prekida
kada se utvrdi konaan rezultat mogu da izostanu boni efekti
Logiki operatori
a && b || c && da == b && c >= da + 1 != b || ! f(x)c >= 0 && c = A && a
-
5Operatori sa bitovima
specifinost C-a (kao u simbolikom mainskom jeziku)
operandi i rezultat su celobrojni operacije nad parovima bitova
& logiko I (8) L->D| logiko ILI (6) L->D^ iskljuivo ILI (7) L->D~ komplementiranje (14) D->L (unarni)
Operatori sa bitovima
pomeranje levog operandaza broj mesta ukazan desnim (mora biti >=0)
D mnoenje sa 2n>> udesno (11) L->D deljenje sa 2n
logiko za neoznaene,aritmetiko za oznaene
Operatori sa bitovima
0x1234 & 0x00f0 = 0x00300x1234 | 0x60f0 = 0x72f40x1234 ^ 0xe20f = 0xf03b~0x1234 = 0xedcb!0x1234 = 0022222 & 055555 = 000000022222 && 055555 = 100001 > 4 = 0xfff50xff56u >> 4 = 0x0ff5
Uslovni izraz
ternarni operator (operandi - tri izraza)
izraz1?izraz2:izraz3 (3) D->L
-
6Uslovni izraz
izraz1?izraz2:izraz3 ako je izraz1 istinit (!=0)
rezultat je vrednost izraz2,inae je izraz3
izraunava se samo jedan od izraza(izraz2 ili izraz3)
ako su 2 i 3 razliitog tipa=> konverzija tipa
Uslovni izraz
Primeri:
maksimum:z=a>b?a:b
konverzija u veliko slovo(c>=a&&c0)?1:(xL
izraz1 = izraz2izraz1 op= izraz2 (izraz1 = izraz1 op izraz2)
Dodela vrednosti
izraz1 = izraz2 izraz1 skalarna promenljiva
ili komponenta niza(indeksiranje je isto operator)
izraz2 proizvoljan numeriki izraz
izraz1 op= izraz2 op: + - * / % > & | ^
-
7Dodela vrednosti
ako su razliitog tipa, konverzija u tip izraz1
bolje odgovara nainu na koji programer razmilja
konciznost(vana pogotovo za komplikovane indeksirane promenljive)
Dodela vrednosti
Primer:
y=a*x+bd*=e+f d=d*(e+f)d=d*e+fa=b=c=d+5a=b+++3*(c=d
-
8Konverzija tipa
ako je jedan unsigned long, pretvori i drugog unsigned long
inae, ako je jedan long, pretvori i drugog u long
inae, ako je jedan unsigned, pretvori i drugog u unsigned
Konverzija tipa
kod dodele vrednosti uvek se pretvarau tip odredinog operanda
float u int odsecanjem razlomljenog dela dui float u krai zaokruivanjem mantise krai int u dui proiruje znak za oznaene,
ubacuje nule za neoznaene char u int zavisi od implementacije
(da li se char smatra oznaenim) za int operande iste duine
neoznaena varijanta je sloeniji tip od oznaene
Konverzija tipa
eksplicitno pretvaranje u eljeni tip(cast prefiksni unarni operator)
(ime_tipa) (14) D->L
Konverzija tipa
5/4*3. 3.3.*5/4 3.75-1L < 1U 1-1L < 1UL 0 !!!(double) a(unsigned int) a+b
-
9Konverzija tipa
-1L < 1U0xffffffffL < 0x0001U0xffffffffL < 0x00000001L => 1
-1L < 1UL0xffffffffL < 0x00000001UL0xffffffffUL < 0x00000001UL => 0
Niz izraza
vie izraza ini jedan izraz(izraz1, izraz2, ..., izrazN)
operator zarez (1) L->D
Niz izraza
prvo levi, pa desni
najnii prioritet(nisu potrebne zagrade)
vrednost i tip izraza odreuje izrazN (poslednji u nizu)
Niz izraza
a+5, b+=13, c++(nezavisni)
x=132, z*=x+3, x--, z-=x*3---y(zavisni)
-
10
Veliina podataka
sizeofprefiksni unarniprioritet 14, D->L
operand izraz ili identifikator tipa vraa veliinu alociranog
memorijskog prostora u bajtovima izraz se ne izraunava
Veliina podataka
tip rezultata size_t(neki celobrojni iz )
sizeof(char) = 1sizeof(niz) = veliina itavog niza
(N*jedna komponenta)
Veliina podataka
po standardu je garantovano samo:
1=sizeof(char)
-
11
Prioritet i poredakizraunavanja operatora
Standard uglavnom ne nalaeporedak izraunavanja operanadakod operatora
npr. a = b*c + d/e zavisno od prevodioca
izraunava se prvo L ili D operand poredak izraunavanja
argumenata funkcije proizvoljan omoguava optimizacije
Prioritet i poredakizraunavanja operatora
izuzeci
logiki operatori && i || (prvo levi izraz)
operator zarez(prvo levi izraz)
uslovni izraz(prvo izraz1, pa ondasamo jedan od preostala dva)
Prioritet i poredakizraunavanja operatora
loa programerska praksaako rezultat zavisiod poretka izraunavanja
bitno je za operatore sa bonim efektima (++, --, dodela vrednosti, funkcije)
Prioritet i poredakizraunavanja operatora
Primeri dvoznanosti: a=b*c+b++ a=b*c+(b=d/e) a[i]=++i y=f(a+1, a--) y=f(a/b,a*=c) y=f(x)+g(x)
-
12
Tabela operatora
->>211
->+ -212
->* / %213
[] () . ->215
asoc.operator#oppri.
Tabela operatora
->|26
->^27
->&28
->== !=29
->< >=210
asoc.operator#oppri.
Tabela operatora
->,21
&&25
asoc.operator#oppri.
Upravljake strukture
Naredbe osnovne jedinice obrade proste (izraz;)
specijalni sluaj prazna naredba
sloene (upravljake strukture)sekvencaselekcijeciklusiskokovi
-
13
Sekvenca
niz naredbi koje se izvravaju po poretku u kojem su napisane
ograniavai {} slobodan format pisanja,
preporuke:uvlaenje blokova zagrade u posebnim redovimaobino - jedna naredba, jedan red
Sekvenca
ima status bloka: na poetku svake sekvence
mogu stajati definicije promenljivih promenljive su lokalne za blok oblast vaenja
od mesta definicije do kraja bloka ugnedavanje blokova
pravila vidljivosti
Sekvenca
razlika sekvence i niza izraza: niz izraza je isto izraz,
vraa vrednost, moe biti operandt=a, a=b, b=t;
sekvenca niz naredbi{int t=a; a=b; b=t;}
Selekcije
uslovno izvravanje naredbi
biraju jednu ili vie naredbi (prostih ili sloenih)
-
14
if else
izbor jedne od dve naredbe
if (izraz) naredba1 [else naredba2] izraz 0 naredba1 izraz = 0 naredba2
bez else uslovni preskoknaini pisanja
Primeri if else
if (a>b) {t=a; a=b; b=t;}
if (mesec == 12){
mesec=1;++godina;
}else
++mesec;
if else
naredbe u if-u mogu biti i sloene upravljake naredbe
odsustvo zavrne rei problem kod ugnedenih if sa jednim else
else tada pripada najbliem ranije neuparenom if-u
if else
if (izraz1)if (izraz2)
naredba1;else
naredba2;if (izraz1) {
if (izraz2)naredba1;
} elsenaredba2;
-
15
if else if else
if (izraz1)naredba1;
else if (izraz2)naredba2;
else if ()
else if (izrazN)naredbaN;
elsenaredba0;
Generalisana selekcijaif else if else
izbor jedne od vie naredbi
prvi izraz 0 odreuje naredbu koja se izvrava
ako su svi izrazi =0izvrava se naredba u else-u
if else if else
poredak pisanja je vaan!
izvrava se samo jedna naredba ako je zadovoljno vie uslova
kao i zbog eventualnih bonih efekata
ugnedavanje osnovnih selekcija
if else if else
if (bodovi>90)ocena=10;
else if (bodovi>80)ocena=9;
else if (bodovi>50)
ocena=6;else
ocena=5;
-
16
Selekcija sa skretnicomswitch
niz naredbi u {}(sastoji se iz podnizova naredbiza pojedine opcije bez {})
selektorski celobrojni izraz u ()odreuje ulaz odakle poinje izvravanje
switch
switch (izraz) {
case v1: niz_naredbi_1;case v2: niz_naredbi_2;default: niz_naredbi_0; case vN: niz_naredbi_N;
}
switch
moe isti ulaz za vie vrednosti
default (kad vrednost izraza nije nijedna od zadatih)
default samo jedan, a moe i da izostane
switch
poredak je vrlo vaan (za razliku od Pascal-a)
ako se na kraju svakog podniza ubaci break ekvivalentno sa Pascal case
-
17
switch
switch (i+j*k){case 1: printf (Unesite i, j: );
scanf (%d%d, &i, &j);case 2: case 3: case 4:
k=i++*j; break;case A: case O:
j=k/--i; break;default:
printf (Neispravni podaci!\n);}
Ciklusi
kontrolisano ponavljanje proste ili sloene naredbe u zavisnosti od uslova
postoji i nain eksplicitnog zavravanja ciklusa
Ciklusi
kontrolisano ponavljanje prosteili sloene naredbe zavisno od uslova
while - osnovni ciklus sa izlaskom na vrhu
for - generalisani ciklus sa izlaskom na vrhu
do - ciklus sa izlaskom na dnu
while
osnovni ciklus sa izlaskom na vrhu
while (uslov) naredba
uslov ostanka (pre naredbe): ako je 0 izvrava se naredba ako je =0 naputa se petlja
0, 1 ili vie iteracija
-
18
while
Primer:
s=0; i=0;while (i
-
19
for
for (izraz1; izraz2; izraz3) {}
izraz1;while (izraz2) {
izraz3;
}
for
centralizovan kontrolni mehanizam dobra preglednost (pogotovo vano u ugnedenim petljama)
sva tri izraza opciono (ali ; moraju ostati)
ako nema izraz2 uslov ispunjen
for
for ( ; ; ) ;beskonana petlja
for ( ; ; ) {}moe se izai forsirano iz bloka
mogua greka: ; iza zagrade prazno telo
for
pogodan za brojake cikluse, mada je optiji
for (i=pocetak; i0)
for (i=pocetak; i>kraj; i += korak) {}(korak
-
20
for
univerzalno reenje
for (i=poc; k>0?ikraj; i+=k){}
kao broja moe se koristiti i znakovna promenljiva
for
skalarni proizvod:
for (s=0, i=0; i
-
21
break
izlaz iz upravljake strukture
izlazak iz ciklusa (while, for, do) na prvu narebu iza ciklusa
preskok preostalih naredbi u selekciji switch
break
for (i=0; i=3000) break;
}
break
while (a>b) {y=f(a, b, x);if (y>=5*x) break;x=f(b,a,y);if (x>=5*y) break;a=x/2;b=y/2;
}
-
22
continue
skok na kraj ciklusa
preskok preostalih naredbitekue iteracije ciklusa
zatim se izvrava opsluivanje ciklusa
continue
za ugnjedene cikluse preskae se samo u najdubljem ciklusu
ako je continue u switchunutar ciklusa isto skok na kraj ciklusa
continue
a=0;while (a
-
23
goto
moe se iskakati iz proizvoljne dubine ugnedenih struktura
nije potrebna, sve moe bez nje
ne preporuuje se
goto
for () {for () {
if () goto greska;
}
}greska: /* obrada greske */
Pokazivai
Operativna memorija niz lokacija sa pridruenim
adresama najmanja adresibilna jedinica
bajt pristup na nivou mainske rei podatak u uzastopnim bajtovima
Pokazivai
Pokaziva promenljiva koja sadri
adresu objekta u memoriji (ukazuje na najnii bajt)
obino 2 ili 4 bajta (zavisi od adresnog prostora, a ne od veliine objekta)
-
24
Pokazivai
definicija pokazivaa
tip *ime ;
tip pokazivanog objekta ime pokazivake promenljive
int *pa, a;double *px, *py;
Pokazivai
& - adresni operator(samo za promenljive)
pa = &a;
daje adresu objekta zadatogidentifikatorom (ne moe izraz)
Pokazivai
* operator indirektnog adresiranja
*pa = 5;
posredni pristup podatkupreko adreseu pokazivakoj promenljivoj
Pokazivai
oba operatora (& *)
prefiksni unarni prioritet 14 asocijativnost D->L
-
25
Pokazivai
generiki pokazivai
void *pv;
nije definisan tippokazanog objekta
void umesto oznake tipa objekta ne moe pristup objektu
preko generikog pokazivaa
Pokazivai
Primer:int x=1, y=2, z[7];int *pi;void *pj;pi = &x;y = *pi;pj = pi;*pi = 0;*pj = 3; /*Greka*/*(int*) pj = 3;ip = &z[0];jp = &z[5];
Pokazivai
konstantni pokazivai i podaciPrimer:
int a=2, *pa=&a, *const kpa=&a;const int b=5, *pkb=&b, *const kpkb=&b;pkb = pa;*pkb = 4; /*Greka*/kpa = pa; /*Greka*/pa = kpkb; /*Greka*/pa = (int*) kpkb;*pa =4 ;
Pokazivai
Primer:
typedef double *P_double;double a, b;P_double pa=&a, pb=&b, pc;scanf (%lf%lf, pa, pb);pc=(*pa
-
26
Pokazivai
Moe i pokaziva na pokaziva
tip **ime
Primer:
int a;int *pa = &a ;int **ppa = &pa;
Pokazivai
int *a[5]a - niz pokazivaa na int
int (*a)[5]a - pokaziva na niz celih brojeva
int *f()f - funkcija koja vraa pokaziva na int
int (*f)();f - pokaziva na funkciju koja vraa int
Operacije sa pokazivaima
dodela vrednostijednog pokazivaa drugom
dodela vrednosti izmeu pokazivaa istog tipa
ako ukazuju na razliite tipove mora cast(osim ako je jedan generiki void*)
Operacije sa pokazivaima
sabiranje i oduzimanje celobrojnogpodatka vrednosti pokazivaa
+ - ++ -- += -= kvant promene pokazivaa
je veliina pokazivanog objekta
-
27
Operacije sa pokazivaima
oduzimanje dva pokazivaa uporeivanje dva pokazivaa ima smisla za pokazivae na
elemente istog niza rezultati su isti kao da su operatori
primenjivani na indekse nepredvidljivi rezultati ako su
pokazivai na nezavisne objekte
Operacije sa pokazivaima
uporeivanje pokazivaa sa nulom
provera da li pokaziva uopte pokazuje na neki objekat
NULL iz - pokaziva koji ne pokazuje ni na koji objekat
Pokazivai i nizovi
ime niza konstantni pokaziva na poetak niza
&a[0] a&a[i] a+ia[i] *(a+i)
Operacije sa pokazivaima
Primer:pa = &a[4];x = *(pa+3); x=a[7]y = *pa+3; y=a[4]+3*pa++ poveava se pokaziva(*pa)++ poveava se objekatpb = &a[2];if (pa
-
28
Pokazivai i nizovi
Primer za skalarni proizvod:
int i, n;double a[100], b[100], *pa, *pb, s=0;for (pa=a, pb=b;
pa
-
29
Dinamika dodela memorije
dinamiko alociranje memorije(u vreme izvravanja)
za podatke iji se broj i veliina ne znaju pri prevoenju
smetanje u dinamikoj zoni pristup objektima u dinamikoj zoni
preko pokazivaa
Dinamika dodela memorije
statiki definisani pokazivamoe ukazati na dinamiki objekat, a on zatim moe imati i druge dinamike pokazivae
jedino ogranienje za broj dinamikih objekata veliina slobodnog prostorau operativnoj memoriji
Dinamika dodela memorije
biblioteke funkcijeza upravljanje memorijom (u ) malloc calloc realloc free
Dinamika dodela memorije
malloc (broj_bajtova)
dodeljuje memoriju zaobjekat zadate veliine(sadraj nedefinisan)
vrednost funkcije je generiki pokaziva na taj prostor (ili NULL ako alokacija nije uspela)
-
30
Dinamika dodela memorije
calloc (n, broj_bajtova)
dodeljuje memoriju za niz od n elemenataod kojih je svaki zadate veliine
vrednost funkcije je generikipokaziva na taj prostor (ili NULL ako alokacija nije uspela)
inicijalizacija nulama
Dinamika dodela memorije
realloc (p, broj_bajtova)
menja veliinu objektapokazanog sa p na zadatu vrednost
smanjuje se od kraja (uva se prethodni sadraj)
dodavanje na kraj (nedefinisanih vrednosti)
Dinamika dodela memorije
realloc (p, broj_bajtova)
vrednost funkcije je generiki pokaziva na taj prostor (ili NULL ako alokacija nije uspela)
ako ne uspe, mesto i sadraj objekta ostanu ouvani
Dinamika dodela memorije
free (p)
oslobaa prostor na koji pokazuje p
p mora biti ranije dobijeno sa malloc, calloc, realloc
-
31
Dinamika dodela memorije
Primer:
long double *p;p = malloc (sizeof (long double));*p=free (p);
Viedimenzionalni nizovi i pokazivai
n-dimenzionalni niz jeniz ije su komponente n-1 dimenzionalni nizovi
matrica je niz vektora, 3D niz je niz matrica, ...
smetanje po vrstama
enum {m=3, n=5};int a[m][n] ;
Viedimenzionalni nizovi i pokazivai
zbog toga je indeksiranjeekvivalentno adresnoj aritmetici
a[i][j] *((int*)a + n*i + j)
nema duine po prvoj dimenziji niza! a pokaziva na nizove od 5 int-ova
(a+1 pokaziva na narednu vrstu)
Viedimenzionalni nizovi i pokazivai
dinamiki nizint *a = malloc (m*n*sizeof (int));a[i*n+j] =
uz pomo pokazivaa moe se smestiti matrica kaonezavisni komponentni nizovi
primer celobrojne matrice od 5 vrsta i 10 kolona
-
32
Viedimenzionalni nizovi i pokazivai
#include #include main () {
int *a[5], i, j;for (i=0; i
-
33
Viedimenzionalni nizovi i pokazivai
#include #include main () {
int **a, i, j, m, n;printf(m,n? ); scanf(%d%d, &m, &n);a=calloc(m, sizeof(int*));for (i=0; i