C Operatori Kontrolne Strukture

download C Operatori Kontrolne Strukture

of 33

description

Programki jezik C i C++

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