53
Programski jezik C (glave 5 i 6 iz udžbenika)

Programski jezik Cpoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program...PJ C: opšte karakteristike C: programski jezik opšte namene, imperativan i proceduralan Razvijen 1972.g,

  • Upload
    others

  • View
    8

  • Download
    1

Embed Size (px)

Citation preview

  • Programski jezik C

    (glave 5 i 6 iz udžbenika)

  • PJ C: opšte karakteristike

    C: programski jezik opšte namene, imperativan i proceduralan

    Razvijen 1972.g, Denis Riči, programiranje aplikacija pod UNIX-om na DEC PDP-11

    Neformalna specifikacija: Brajan Kernigen i Denis Riči "The C Programming Language", 1978.

    1977. – prenosiva verzija C-a Standardi: 1989 (ANSI), 1990, 1999, 2011 (ISO)

    2/53

  • PJ C: opšte karakteristike

    Prethodnici BCPL i B – jezici za pisanje operativnih sistema i jezičkih procesora

    Efikasno korišćenje tehničkih svojstava računara Blizak operacijama mašinskog nivoa Rad sa pojedinačnim bitovima i memorijskim

    adresama Fleksibilan, bez restrikcija

    3/53

  • Primer programa-1

    #include

    int main()

    {

    printf("Ovo je moj prvi program\n");

    return 0;

    }

    4/53

  • Primer programa-2

    /* Program izracunava i stampa kvadrat unetog broja */

    #include

    int main() {

    int a;

    printf("Unesite ceo broj: ");

    scanf("%i", &a);

    printf("Kvadrat unetog broja je: %i", a*a);

    return 0;

    }

    5/53

  • Primer programa-3

    /* Program utvrdjuje da li je uneti broj paran*/

    #include

    int main() {

    int a;

    printf("Unesi broj: ");

    scanf("%d", &a);

    if (a % 2 == 0)

    printf("Broj %d je paran\n", a);

    else

    printf("Broj %d je neparan\n", a);

    return 0;

    }6/53

  • Primer programa-4

    /* Program izracunava i stampa kvadrate i korene prvih 100 prirodnih brojeva*/

    #include

    #include

    #define N 100

    int main() {

    int i;

    for (i = 1; i

  • Primer programa-5

    /* Program izracunava i stampa najmanji broj i takav da je zbir prvih i prirodnih brojeva jednak ili veci od 100*/

    #include

    #define N 100

    int main() {

    int i = 1;

    int s = 1;

    while(s

  • Primer programa-6

    /* Program prebacuje mala slova u velika*/

    #include

    #include

    int main() {

    int c;

    printf("Otkucaj recenicu (zavrsi je znakom .): ");

    do {

    c = getchar();

    putchar(toupper(c));

    } while (c != ’.’);

    putchar(’\n’);

    return 0;

    } 9/53

  • Izračunavanje: promenljive, tipovi; konstante; operacije, izrazi

    Promenljiva se deklariše pre korišćenja

    Promenljiva je objekat koji ima ime

    tip

    prostor u memoriji (veličina zavisi od tipa)

    Vrednost (opseg zavisi od veličine prostora tj. od tipa)

    10/53

  • Izračunavanje: promenljive

    Ime

    identifikator; slova, cifre, simbol _, ne počinje cifrom

    na primer a, A, broj_studenata, brojStudenata

    Tip: tip lista-promenljivih

    pimeri: int broj; /* deklaracija celog broja */

    int a, b; /* deklaracija vise celih brojeva */

    ne podrazumeva inicijalizaciju

    Inicijalizacija: int a = 5; ili

    int a = 5, b;

    nepromenljiva inicijalizacija: const double PI = 3.14;

    11/53

  • Izračunavanje: tipovi

    Tip: vrsta podataka koje opisuje,

    način reprezentacije,

    skup operacija koje se mogu primeniti nad podacima tog tipa,

    broj bitova koji se koriste za reprezentaciju

    Prosti tipovi: int, char, double, boolean, i varijante

    12/53

  • Izračunavanje: tipovi

    Tip int (integer): Označene vrednosti

    Potpuni komplement

    Aritmetičke operacije (+, -, *, /), relacijske operacije (, ==, ...)

    Broj bita zavisi od računara (min 16, obično 32 ili 64)

    funkcija sizeof( tip ) vraća koliko je bajtova potrebno za skladištenje tipa. Na primer sizeof( char ) je 1 sizeof( int ) je 2 4 ili 8

    13/53

  • Izračunavanje: tipovi

    Kvalifikatori short, long, long long

    signed i unsigned

    opseg: npr. 32 bita signed: -2 147 483 648 do 2 147 483 647

    unsigned: 0 do 4 294 967 295

    Specifikatori za upis i ispis: %i --- ceo broj

    %d --- ceo dekadni broj

    %u --- neoznacen dekadni broj

    %o --- neoznacen oktalni broj

    %x, %X --- neoznacen heksadekadni broj14/53

  • Izračunavanje: tipovi

    #include

    int main(){

    int dec, hex, okt;

    scanf("%i",&hex); //npr. hex = 0x27

    scanf("%d",&dec); //npr. dec = 27

    scanf("%i",&okt); //npr. okt = 027

    printf("Hex: %d\nDec: %d\nOkt:%d\n",hex,dec,okt);

    // outputs: Hex = 39, Dec = 27, Okt = 23

    printf("Hex: %i\nDec: %i\nOkt:%i\n",hex,dec,okt);

    // outputs: Hex = 39, Dec = 27, Okt = 23

    }

    15/53

  • Izračunavanje: tipovi

    Primeri:

    1234 – int

    1234l, 1234L, – long int

    123456 – (?long int)

    65000u, 65000U – unsigned int

    4000000000ul, 4000000000UL– unsigned long int

    16/53

  • Izračunavanje: tipovi

    Tip char (character):

    jedan bajt

    mali celi brojevi

    aritmetičke operacije i relacijske operacije

    označen / neoznačen

    unsigned char c /* vrednost od 0 do 255 */

    signed char c /*vrednost -128 do +127 */

    char: unsigned ili signed (zavisno od implementacije)

    primeri: 11111111, 00000000, 10000001, 10000000

    kodovi karaktera (ASCII)

    ispis i učitavanje %c

    funkcije za rad sa karakterskim tipom u datoteci zaglavlja

    primer isalpha, isdigit, toupper, tolower 17/53

  • Izračunavanje: tipovi

    Tip float (double, long double):

    Brojevi u pokretnom zarezu:

    float (osnovna tačnost)

    double (dvostruka tačnost)

    long double (proširena tačnost)

    Nije propisano standardom koliko ovi tipovi zauzimaju bitova

    Opseg i detalji:

    18/53

  • Izračunavanje: tipovi

    Tip float (double, long double):

    Uobičajene aritmetičke operacije (osim %) i relacijske operacije

    IEEE 754 (1985.g.) standard, ∞, - ∞, NaN (Not a Number) -0.0/0.0, koren iz negativnog broja i sl.

    1/ ∞ je 0, 1/0 je ∞

    C99: INFINITY, -INFINITY, NAN

    Matematičke funkcije

    Ispis i upis %f, %e, %g, (%lf, %le, %lg za upis double ...)

    19/53

  • Izračunavanje: tipovi

    float f=12.5;

    printf("%f\n",f);

    printf("%e\n",f);

    printf("%g\n",f);

    12.500000

    1.250000e+001

    12.5

    double d;

    scanf("%lf", &d);

    printf("%f", d);

    20/53

  • Izračunavanje: tipovi

    Tip bool (boolean, od standarda C99)

    false, true

    inače: 0 /≠0

    logičke operacije i, ili, ne

    21/53

  • Ključne reči

    int, float, char, void, long, ...

    struct, union, enum, ...

    while, if, for, break, continue, ...

    switch, default, goto, ...

    register, static, extern, ...

    NE MOGU da se koriste kao identifikatori

    22/53

  • Izrazi: konstante

    Konstante su fiksne vrednosti

    Primeri: 0, 2, 2007, 4000000000 – tip prema vrednosti

    3.5, 1.4e2, ’a’

    Tip se izvodi (prepoznaje) iz samog zapisa

    Tip int: unsigned / long (u, U, l, L, ul, UL) npr. 12345L

    oktalni (počinje cifrom 0) i heksadekadni (počinje simbolima 0x ili 0X)

    pimer: 037 (oktalni zapis), 0x1f (heksadekadni zapis)

    konstante su pozitivne; -123 je izraz!

    23/53

  • Izrazi: konstante

    Tipovi u pokretnom zarezu: Konstantni brojevi u pokretnom zarezu sadrže tačku ili

    eksponent, ili i jedno i drugo

    123.4 ili 1e-2 ili .4 ili 5. ili -123. ili -123.2e10

    Tipovi ovih konstanti su double, osim ukoliko se za float navede kvalifikator f ili F, npr 1.23f ili l/L što označava tiplong double

    24/53

  • Izrazi: konstante

    Tip char: Iako se tip char koristi i za predstavljanje malih celih

    brojeva, on se prevashodno koristi za predstavljanje kodova karaktera (najčešće ASCII kodova)

    Direktno specifikovanje karaktera korišćenjem numeričkihkodova nije preporučljivo

    Umesto toga, preporučuje se korišćenje karakterskih konstanti

    Karakterske konstante u programskom jeziku C se navodeizmeđu ’ ’ navodnika

    Vrednost date konstante je numerička vrednost datogkaraktera u korišćenoj karakterskoj tabeli (na primer, ASCII)

    25/53

  • Izrazi: konstante

    Konstanta znakovnog tipa – broj, zapisan ‘x’ Npr, ‘0’ je 48,

    Neki karakteri – kodna sekvenca: \n, \t, \b, \\ - izgledaju kaodva, ali predstavljaju 1 karakter

    ‘\0’ – karakter sa vrednošću 0, 0-karakter

    U obliku oktalnog broja, npr. ‘\011’, ‘\061’

    U obliku heksadekadnog broja, npr. ‘\x41’, ‘\x31’

    26/53

  • Izrazi: konstante

    Imenovanje znakovne konstante, npr.

    #define GRANICNIK ’$’

    Niska karaktera, literal, string:

    0 ili >0 karaktera, između dvostrukih navodnika,

    Npr. “Ovo je string”

    Nula-karakter na kraju

    - standardno zaglavlje

    Funkcija strlen(s) – bez nula-karaktera

    27/53

  • Izrazi: konstante

    int main() {

    char a, b;

    a = 'A'; b = 65;

    printf(" %ch! %ch! \n", a, b );

    printf(" %c %d\n", a, a );

    return 0;

    }

    rezultat: Ah! Ah!

    A 65

    28/53

  • Izrazi: konstante – specijalni karakteri - primeri

    \a alert (bell) character

    \b backspace

    \n newline

    \r carriage return

    \t horizontal tab

    \\ backslash

    \’ single quote

    \" double quote

    \0oo (npr. \012) octal number

    \xhh (npr. \x12) hexadecimal number

    29/53

  • Operatori i izrazi

    Unarni (prefiksni i postfiksni)

    Binarni (infiksni)

    Ternarni operatori ? :

    Prioriteti, zagrade; primeri

    Asocijativnost (pretežno leva)

    30/53

  • Operatori dodele

    Vrednost izraza dodele; x=50;

    (npr. (x=sledeci())! =KRAJ)

    Tip izraza dodele

    Sporedni efekat izraza dodele

    l-vrednost

    Višestruka dodela (desna asocijativnost!)

    Primer: x=y=z=0;

    Primeri:

    x=2 (vrednost x, vrednost izraza postaje 2)

    x=0; if( x = 1 ) printf("A"); else printf("B");

    31/53

  • Aritmetički operatori

    + (binarni)

    - (binarni)

    *

    / (nad celim brojevima daje celobrojni deo količnika)

    % (ostatak; samo na cele brojeve);

    - (unarni, promena znaka )

    + (unarni)

    svi levo asocijativni

    32/53

  • Aritmetički operatori - prioriteti

    +, - su istog prioriteta, (primena sleva na desno, levo asocijativni)

    Primer: a-b+c = (a-b)+c, a ne a-(b+c)

    *, /, % su istog prioriteta, koji je veći od prioriteta +, -(primena sleva na desno, levo asocijativni)

    Unarni operatori imaju veći prioritet od binarnih

    Zagradama se prioriteti menjaju

    Primer: C = (F-32) /9*5 ;

    (F-32) /9*5 = ((F-32)/9)*5 a ne (F-32)/(9*5)

    33/53

  • Aritmetički operatori uvećanja i umanjenja za 1

    ++, --

    Prefiksni i postfiksni

    x = n++;

    x = ++n;

    int a = 3, x = a++, y = a++;

    int b = 3, z = b++ + b++;

    printf("a = %d, x = %d, y = %d,\n", a, x, y);

    printf("b = %d, z = %d\n", b, z);

    34/53

  • Relacijski operatori

    ==

    ! =

    <

    >=

    Prioritet: ==, != manji od ostalih

    Levo asocijativni

    35/53

  • Relacijski operatori - primeri

    x < y dobija vrednost 0 ili 1 (i drugi rel. op.)

    3 > 5 - vrednost 0

    7 < 5 != 1 - vrednost 1

    Ako promenljiva x ima vrednost 2,

    3 < x < 5 - vrednost 1

    == i = sasvim različiti

    Primeri: x=2 (vrednost x, vrednost izraza postaje 2)

    x=0; if( x = 1 ) printf("A"); else printf("B");

    x=1; if( x != 1 ) printf("A"); else printf("B");

    x=0; if( x == 1 ) printf("A"); else printf("B");

    36/53

  • Operator kombinovanja izraza (,) i sizeof

    Operator , je najnižeg prioriteta

    Izračunavaju se oba operanda

    Vrednost izraza je vrednost desnog operanda

    Primer: x = 0, y = 1; (vrednost 1)

    Sizeof – veličina tipa u bajtovima

    Na primer sizeof(int) – najčešće 4

    37/53

  • Logički operatori

    Logička negacija !

    Logička konjunkcija &&

    Logička disjunkcija ||

    Rezultat tipa int

    Brojevna vrednost 0 – logička vrednost 0 (netačno)

    Brojevna vrednost ≠0 – logička vrednost 1 (tačno)

    p && q dobija vrednost 1 ako su i p i q ≠ 0, inače 0 na primer: 0.25 && (2

  • "Lenjo" izračunavanje

    Ako je p ≠ 0 (tačno), onda je p || q ≠ 0, pa se q ne izračunava;

    Ako je p =0 (netačno), onda je p && q =0, pa se q ne izračunava

    Primer:

    main() {

    int x, z, a = 1, b = 2, c = 3;

    /* Lenjo izracunavanje logickog izraza */

    x = a

  • Operatori ++, -- primeri “bočnog” efekta (lenjo izračunavanje)

    int main() {

    int i = 0, j = 0;

    /* Bocni efekti */

    z = i++ && j ++; // i = 1 j = 0

    printf( " %d %d %d\n", i, j, z ); // z = 0

    i = 0; j = 0;

    z = j++ && i ++; // i = 0 j = 1

    printf( " %d %d %d\n", i, j, z ); // z = 0

    z = j++ && i ++; // i = 1 j = 2

    printf( " %d %d %d\n", i, j, z ); // z = 0

    z = j++ && i ++; // i = 2 j = 3

    printf( " %d %d %d\n", i, j, z ); // z = 1

    } 40/53

  • Složeni operatori dodele

    i += 2; isto što i i = i + 2;

    x *= y+1; isto što i x = x * (y+1);

    Složeni operatori dodele: +=, -=, *=, /=, %=, &=, |=, itd.

    Niži prioritet od svih ostalih operatora (osim ,)

    Desno asocijativni

    41/53

  • Uslovni operator ?:

    p ? x : y; /* ako je p tačno, vrednost izraza je x, inače je vrednost izraza y */

    desno asocijativan:

    x > y ? x > z ? x : z : y > z ? y : z isto kao

    x > y ? (x > z ? x : z) : (y > z ? y : z); a ne kao

    (x > y ? (x > z ? x : z) : y > z) ? y : z;

    Na primer, maksimum tri broja

    max = x > y ? x > z ? x : z : y > z ? y : z;

    42/53

  • Operatori, prioritet i asocijativnost

    43/53

  • Izrazi

    Izraz kombinuje promenljive, konstante i operacije i tako proizvodi novi objekat sa novom vrednošću i pripadnim tipom.

    Izračunavanje:

    pravila o prioritetu i asocijativnosti operatora

    pravila koja definišu tip podizraza i izraza

    Primer. x=15; y = x/2;

    Ako su x, y int, y = 7;

    Ako su x,y float, y = 7.5

    44/53

  • Aritmetički izrazi – tip

    Primer:

    int i, j:

    float x, y;

    i - j je tipa int

    x * y je tipa float

    '2' < 'A' je neki ceo broj (1, tačno)

    45/53

  • Operatori i prioriteti - primeri

    x = y==z je x = (y==z)

    -a*b+c je ((-a)*b)+c

    a=b=c=d je a=(b=(c=d))

    Poređati prema opadajućem prioritetu operatore: && ++ * + (sabiranje)

    A == + (unarno) != % ?

    46/53

  • Konverzija tipa

    Pretvaranje vrednosti jednog tipa u vrednost drugog tipa

    Vrste konverzija: eksplicitne i implicitne

    konverzije bez gubitka informacija /konverzija sa gubitkom informacije

    C fleksibilan - elementarni tipovi (celobrojni, realni, karakterski) su saglasni

    U izrazu mogu da se nađu argumenti raznih tipova, bez eksplicitne naznake konverzije

    47/53

  • Konverzije tipova - 1

    1. +, -, *, /, %: operandi različitih tipova, bez unsigned - konverzija u “širi” tip, promocija (nema gubljenja informacije), primer:

    long double x;

    double y;

    float z;

    long int u;

    int i, j;

    short w;

    char c;

    x + z je tipa long double

    y + c je tipa double

    z + i, i*z su tipa float

    u + j je tipa long int

    i + c je tipa int - aritmetika bar na tipu int

    w + c je tipa int

    48/53

  • Konverzije tipova –1- primeri

    int x = 1; x ='1'+1; printf("%d", x );

    int x = 32; x ='A'+x; printf("%c", x );

    int x = 65; x =x+1; printf("%c", x );

    Konverzija unsigned tipova je kompleksnija

    49/53

  • Konverzije tipova - 22. Konverzuja tipa izraza kojom se gubi informacija –

    democija, primer: char c; long l;

    c = l; /* l se konvertuje u char i dodeljuje promenljivoj c */

    Primer promocija / democijac = c * l; c = 2.5 * l;

    U prvoj dodeli, c se konvertuje u long, a rezultat c*l se konvertuje u char i dodeljuje promenljivoj c.

    U drugoj dodeli, l se konvertuje u float u izračunavanju 2.5*l, a rezultat se konvertuje u char i dodeljuje promenljivoj c.

    50/53

  • Eksplicitna konverzija tipova

    Unarni operator podešavanja (cast)

    (ime-tipa) izraz

    Primeri:

    int i, j, n;

    float x;

    sqrt((double) n) (kvadratni koren celog broja

    x=(float) i /j; (razlomljeni količnik celih brojeva)

    51/53

  • Implicitna konverzija tipova

    Ako je bar jedan od operanada tipa long double, onda se drugi konvertuje u long double;

    inače, ako je jedan od operanada tipa double, onda se drugikonvertuje u double;

    inače, ako je jedan od operanada tipa float, onda se drugikonvertuje u float;

    inače, svi operandi tipa char i short promovišu se u int.

    Ako je jedan od operanada tipa long long, onda se drugikonvertuje u long long;

    inače, ako je jedan od operanada tipa long, onda se drugikonvertuje u long.

    52/53

  • Označeni i neoznačeni brojevi

    U slučaju mešanja označenih i neoznačenih operanada, pravila konverzije su nešto komplikovanija

    Ako je neki tip širi, onda se konverzija vrši u širi tip

    Ako su oba tipa iste širine, onda se konverzija vrši u neoznačeni tip

    Problemi pri poređenju označenih i neoznačanih tipova Primer: ne važi da je -1l < 1ul

    53/53