Cjezikjasno Prez

96
4/3/2013 1 Why Use C? In today's world of computer programming, there are many high- level languages to choose from, such as C, Pascal, BASIC, and Java. These are all excellent languages suited for most programming tasks. Even so, there are several reasons why many computer professionals feel that C is at the top of the list:

description

CJezikProgramiranje

Transcript of Cjezikjasno Prez

  • 4/3/2013

    1

    Why Use C? In today's world of computer

    programming, there are many high-level languages to choose from, such as C, Pascal, BASIC, and Java. These are all excellent languages suited for most programming tasks. Even so, there are several reasons why many computer professionals feel that C is at the top of the list:

  • 4/3/2013

    2

    Why Use C?

    C is a powerful and flexible language. What you can accomplish with C is limited only by your imagination. The language itself places no constraints on you. C is used for projects as diverse as operating systems, word processors, graphics, spreadsheets, and even compilers for other languages.

    Why Use C?

    C is a popular language preferred by professional programmers. As a result, a wide variety of C compilers and helpful accessories are available.

  • 4/3/2013

    3

    Why Use C?

    C is a portable language. Portable means that a C program written for one computer system (an IBM PC, for example) can be compiled and run on another system (a DEC VAX system, perhaps) with little or no modification. Portability is enhanced by the ANSI standard for C, the set of rules for C compilers.

    Why Use C?

    C is a language of few words, containing only a handful of terms, called keywords, which serve as the base on which the language's functionality is built. You might think that a language with more keywords (sometimes called reserved words) would be more powerful. This isn't true. As you program with C, you will find that it can be programmed to do any task.

  • 4/3/2013

    4

    Why Use C?

    C is modular. C code can (and should) be written in routines called functions. These functions can be reused in other applications or programs. By passing pieces of information to the functions, you can create useful, reusable code.

    Why Use C? What about C++?

    You might have heard about C++ and the programming technique called object-oriented programming. Perhaps you're wondering what the differences are between C and C++ and whether you should be teaching yourself C++ instead of C.

  • 4/3/2013

    5

    Why Use C?

    Not to worry! C++ is a superset of C, which means that C++ contains everything C does, plus new additions for object-oriented programming. If you do go on to learn C++, almost everything you learn about C will still apply to the C++ superset.

    Why Use C?

    In learning C, you are not only learning one of today's most powerful and popular programming languages, but you are also preparing yourself for object-oriented programming.

    Another language that has gotten lots of attention is Java. Java, like C++, is based on C. If later you decide to learn Java, you will find that almost everything you learned about C can be applied.

  • 4/3/2013

    6

    Prednosti C jezika

    Jednostavnost

    Univerzalnost i slobodne forme programiranja, ine ga jezikom opte namene i primene

    Razvijena sredstva za prikazivanje strukture podataka

    Projektovanje programa metodom odozgo na dole

    Optimizovani C prevodioci za kreiranje efikasnih programa za sistemsko programiranje

    Uvod u jezik C++ u kome su uspeno zaivele ideje objektno orjentisanog programiranja

    Tradicionalni, klasini, algoritamski nain programiranja je u osnovi proceduralan, zasnovan na funkcionalnoj dekompoziciji korisnikog, a zatim i programskog zahteva.

    (tipicno unos, obrada prikaz)

    Pri tome, podaci (atributi) koji se obrauju i operacije nad njima nisu grupisani zajedno u objektima kao to je to sluaj kod OBJEKTNO ORJENTISANOG PROGRAMIRANJA, ved su razbacani po programu.

  • 4/3/2013

    7

    Procesi u izvravanju programa

    Tekst editor. Pisanje izvornog koda programa

    Pretprocesor. Transformie izvorni kod prema direktivama koji se u njemu nalaze

    Kompajler. Transformie izvorni kod u kod na asemblerskom jeziku

    Asembler. Asemblerski kod translira u objektni kod.

    Linker. Od formiranog koda i modula iz biblioteke C jezika kreira izvriv file

    Lets go ! Example 1. Linear function

    #include main () { int a,b,x,y; a=2; b=4; x=1; y=a*x+b; printf("%10d\n",y); }

  • 4/3/2013

    8

    Osnovni elementi C jezika

    Identifikator je sekvenca velikih i malih slova, cifara, i karaktera _. Koristi se za dodeljivanje imena objektima u programu (funkcije, promenljive...)

    printf("%10d\n",y); je iskaz C jezika i predstavlja elementarnu obradu koju program treba da obavi. Mora se zavriti karakterom ;

    { i - su karakteri koji objedinjuju vie pojedinanih iskaza u jednu programsku celinu, analogno komandama BEGIN i END u Pascalu.

    Osnovni elementi C jezika, nastavak

    main, printf i scanf su identifikatori sistemskih funkcija

    Funkcija main informie program gde treba poeti izvravanje programa, a ( ); oznaava da sistemska funkcija main nema argumenata.

    #include Sve pretprocesorske direktive poinju znakom # i ne

    pripadaju C jeziku. #include je instrukcija prevodiocu da

    upotrebi standardne ulazno izlazne funkcije koje su definisane u file-u

  • 4/3/2013

    9

    Funkcije za realizaciju ulazne i izlazne aktivnosti

    Funkcije printf i scanf obavljaju formatizovanu ulazno izlaznu aktivnost.

    Argumenti obe funkcije podeljeni su u dva dela:

    A) Kontrolni ili konverzioni niz

    B) Lista argumenata

    Razlika funkcija scanf i printf je u u listi argumenata. Argumenti funkcije printf se prenose vrednodu, dok se argumenti funkcije scanf prenose svojom adresom, jer se uitana vrednost mora vratiti u pozivajudi program. To se postie navoenjem karaktera & ( operator indirekcije ) ispred liste argumenata.

    Izlazna funkcija printf() Sintaksa

    printf (Upravljaki string *Arg1,Arg2,+)

    Upravljaki string

    A) printf ( Ispis izlaznih izvestaja)

    Konstantni tekst

    Ispis izlaznih izvestaja

    B) Sadri specifikaciju konverzije

    printf ( Broj Pi ima vrednost %f\n, Pi)

    Karakter % f odreuje na kom mestu i u kom formatu de se tampati vrednost odgovarajudeg argumenta iz liste.

    \n Jedan karakter. Nekim karakterima se moe promeniti uobiajeno znaenje ako im prethodi karakter \ , tzv. Escape karakteri.

  • 4/3/2013

    10

    Opti oblik specifikacije konverzije

    %[-][ irina_polja][. Tanost][1] konverzioni_karakter

    [-] Argument se poravnava na levoj strani zadane irine

    irina_polja Zadaje maksimalnu irinu polja. Mesto na kome se tampa argument naziva se polje, a broj karaktera u polju je irina polja.

    Tanost Definie se za realne brojeve, koliko se cifara ispisuje desno od decimalne take

    Konverzioni_karakter definie konverziju (iz tabele)

    Simboli specifikacije konverzije

    Simbol konverzije

    Tip argumenta Osobina izlazne funkcije

    c char Jedan znak

    d int Ceo dekadni broj

    u int Ceo dek. br.bez znaka

    o int Ceo okt. br. bez znaka

    x, X int Ceo hksdek. br. bez znaka

    s string String

    f float double Dekadni zapis real. broja

    e, E float double Eksponencijalni zapis

    g,G float double Kradi zapis izmeu %f i %e

  • 4/3/2013

    11

    Example No 2

    main()

    {

    printf("karakteri:\n%3c\n%5c\n%7c\n",'A','B','C');

    }

    Izlaz programa

    Karakteri:

    A

    B

    C

    Ulazna funkcija scanf()

    Sintaksa scanf (Upravljaki string *Arg1,Arg2,+)

    Upravljaki string sadri niz konverzionih specifikacija

    Lista argumenata sadri adrese promenljivih.

    Ispred imena promenljive obavezan je znak &, osim kod string promenljive. scanf(%d%d%d,,&i,&j,&k);

  • 4/3/2013

    12

    Opti oblik konverzione specifikacije

    %**+ irina_polja] konverzioni_znak

    * Odgovarajude ulazno polje se ignorie i ne dodeljuje promenljivoj

    irina_polja - Predstavlja maksimalnu irinu ulaznog polja

    konverzioni_znak Definie konverziju (data tabelom)

    Tabela konverzionih znakova

    Simbol konverzije Tip argumenta

    c char

    d int

    ld ili D long

    h short

    o int

    lx, X long

    s string

    f float

    le, lE double

    g,G float double

  • 4/3/2013

    13

    Example No 3 main() { int x; printf( Upotreba f. scanf:\n Ukucajte broj\n:) ; scanf ( %d\n, &x); printf(Ukucali ste\n%d\n, x); }

    Izlaz programa Upotreba f. scanf: Ukucajte broj 23 Ukucali ste 23

    Example No 4 main() { int i,j,k; scanf("%2d%3d%2d",&i,&j,&k); printf("/%d/%d/%d%\n",i,j,k); scanf("%d%d%d",&i,&j,&k); printf("/%d/%d/%d%\n",i,j,k); } Za ulazne vrednosti

    123 456 789 12 34 56

    Ispisuje se /12/3 /45/ /6//789/12/

  • 4/3/2013

    14

    Osnovni tipovi podataka

    Promenljive i konstante su objekti u okviru programa koji se karakteriu svojim: Imenom,

    tipom podataka koji se moe dodeliti promenljivoj,

    Skupom operatora koji se moe primeniti nad tim vrednostima

    Memorijskim prostorom za smetaj podataka

    Osnovni tipovi podataka su:

    int, float, double i char

    Tipovi podataka

    Osnovni Celobrojni (int)

    Realni (float)

    Znakovni (char)

    Nabrojivi (enum)

    Prazan (void)

    Slozeni ili Struktuirani Nizovi

    Strukture

    Unije

  • 4/3/2013

    15

    Promenljive tipa Int

    U ovu kategoriju podataka ubrajaju se konstante, promenljive, izrazi i funkcije.

    Tri notacije za predstavljanje celobrojnih vrednosti dekadna, oktalna i heksadecimalna.

    Pri deklarisanju promenljivih i konstanti moe se vriti i inicijalizacija promenljivih, npr. program Example No5

    Opseg celobrojnih vrednosti je razliit i moe se menjati primenom kvalifikatora Long i Short

    Unsigned deklarie promenljivu za memorisanje + vrednosti

    long int x;

    short int y;

    unsigned int z;

    Example No 5

    main()

    {

    int x =11,y =22,z =33;

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

    }

    Izlaz programa x = 11

    y = 22

    z = 33

  • 4/3/2013

    16

    Promenljive tipa float i double

    Promenljive tipa float i double memoriu vrednosti realnih brojeva i vrednosti sa decimalnim zarezom.

    Razlika izmeu tipa float i double je u tanosti predstavljanja realnih vrednosti( brojem decimalnih cifara koje se mogu memorisati).

    Konstante sa pokretnim zarezom se u C jeziku se mogu predstaviti u obinoj i naunoj konotaciji.

    Ne postoji razlika izmeu konstanti tipa float i double C prevodilac sve konstante sa pokretnim zarezom predstavlja kao tip double

    Promenljive tipa double mogu memorisati grubo dvaput vie decimalnih cifara od promenljivih tipa float

    Example No 6 main()

    {

    float pi = 3.14159265358979323845;

    double sqrt_3 = 1.732050875687729356;

    printf(pi = %20f\n sqrt_3 = %20f\n\n, pi,sqrt_3);

    }

    Izlaz programa:

    pi = 3.14159274101257320000

    sqrt_3 = 1.73205087568877260000

  • 4/3/2013

    17

    Promenljive tipa char

    Promenljive i konstante tipa char memoriu karaktere.

    Promenljive i konstante tipa char uestvuju u izrazima svojom kodnom vrednodu u kome je svaki karakter kodiran svojom. 7-bitnom vrednodu ASCII koda. Poto su karakteri kodirani celobrojnim vrednostima (leksikografsko ureenje ), mogude je sortiranje karaktera rei i linija.

    Promenljive i konstante tipa char uestvuju u izrazima svojom kodnom vrednodu koja se tretira kao celobrojna vrednost. Promenljiva car sadri karakter a . Sukcesivnim inkrementiranjem promenljive kar dobijaju se karakteri b i c, program example No 7

    Example No 7 main()

    {

    char car = 'a';

    printf("karakter je %c\n",car);

    printf("karakter je %c\n",car+1);

    printf("karakter je %c\n",car+2);

    printf("Kodna vrednost je %d\n",car+3);

    }

    Izlaz programa

    Karakter je a

    Karakter je b

    Karakter je c

    Kodna vrednost je 100

  • 4/3/2013

    18

    Example No 8

    main()

    {

    char c = 'A';

    printf("/ %c / %d / %o / %x \n",c,c,c,c);

    }

    Izvrsavanjem programa dobija se:

    /A/65//101/41

    65- ASCII dekadna vrednost

    101- ASCII oktalna vrednost

    41- ASCII heksadekadna vrednost

    Operacije, izrazi i operatori

    Operaciju predstavlja simbol koji oznaava odreenu akciju nad odreenim podatkom koji se naziva operand.

    Izraz se sastoji od jednog ili vie operanada i simbola operacija.

    Operacija operira nad operandom

    Aritmetike operacije * - mnoenje

    / - deljenje

    % - izdvaja ostatak pri deljenju celih brojeva

    + - sabiranje

    - - oduzimanje

  • 4/3/2013

    19

    Operacije, izrazi i operatori

    Operacije poreenja

    > - vede

    >= - vede ili jednako

    < - manje

    = , izvrava se tako to se vrednost desnog operanda, (izraz) dodeljuje levom operandu (promenljiva), koji predstavlja vrednost izraza sa operacijom dodeljivanja.

    Operator

    X = Y = Z = 1;

    Se izvrava tako to izraz Z = 1 dobije vrednost 1 koja je dodeljena promenljivoj Z, izraunata vrednost izraza 1 se dodeljuje promenljivoj y i postaje vrednost izraza y = 1, i na kraju se vrednost izraza dodeljuje promenljivoj x

  • 4/3/2013

    20

    Operacije, izrazi i operatori

    Pojam operatora

    Operatori su sastavni delovi programa koji predstavljaju potpunu instrukciju raunaru.

    X = 2 je samo izraz, dok je X = 2; operator.

    Operacije uvedavanja i umanjivanja

    Izraz ++ x uvedava vrednost promenljive x za 1, a izraz - - x umanjuje vrednost promenljive x za 1.

    Prefiksni oblik ++x, promenljiva se najpre uvedava pa tek onda koristi u izrazu

    Postfiksni oblik x++ promenljiva se najpre koristi u izrazu pa tek onda uvedava.

    Grananje u programu

    Uslovni operator se pojavljuje u slededim oblicima: If (izraz) operator1

    If (izraz) operator1 else operator2

    Ako su operator1 i operator2 prosti operatori

    if (izraz) operator1

    else operator2

  • 4/3/2013

    21

    Ako su operator1 i operator2 sloeni operatori

    if (izraz)

    {

    operator11

    operator12

    operator1k

    }

    else

    {

    operator21

    operator22

    operator2k

    }

    Operator viestrukog izbora SWITCH

    Omogudava grananje u programu izborom jednog izmeu vie operatora

    switch (izraz)

    {

    case konstanta1:

    operator1

    break;

    case konstanta2:

    operator2

    break;

    case konstantan:

    operator n

    break;

    default :

    operator0

    break;

    }

  • 4/3/2013

    22

    Operator viestrukog izbora SWITCH

    Iza slubene rei switch navodi se izraz (selektor) ija je vrednost celobrojna, ili znakovna koja se automatski konvertuje u celobrojnu.

    Operatorom viestrukog grananja izvrava se ona grupa operatora ispred koje se nalazi konstanta koja je jednaka vrednosti selektora. Ako nije jednaka nijednoj od konstanti izvrava se grupa operatora koja se nalazi iza default alternative.

    Operator switch na osnovu brojnih ocena 5,4,3,2,1 ispisuje ocene odlian, vrlo dobar, dobar, dovoljan, nedovoljan u example No 8

    Example No 8 switch (ocena)

    {

    case 5: printf (odlian\n); break; case 4: printf (vrlo dobar\n); break; case 3: printf (dobar\n); break; case 2: printf (dovoljan\n); break; case 1: printf (nedovoljan\n); break;

    default: printf (nekorektna ocena\n); }

    Break operator se koristi u switch operatoru da bi se obezbedio izlaz neposredno iza njega. Ako se iza neke grupe operatora u switch- u ispusti break, tada de se u sluaju izbora te grupe izvravati sve preostale alternative do pojave break- a ili kraja switch.-a.

  • 4/3/2013

    23

    Organizacija ciklusa

    Niz operatora koji se moe izvravati vie puta naziva se ciklus.

    Telo ciklusa - Niz operatora koji obrazuju ciklus

    Izlazni kriterijum Uslov koji odreuje da li de se telo ciklusa ponovo izvravati.

    U zavisnosti od poloaja izlaznog kriterijuma u odnosu na telo ciklusa, ciklusi mogu biti sa:

    Preduslovom (while), skradeno varijanta sa (for)

    Postuslovom (do while)

    Ciklus while

    Operator ciklusa sa preduslovom while omogudava organizovanje ciklusa sa nepoznatim brojem ponavljanja koji zavisi od izraunavanja u telu ciklusa.

    Opti oblik operatora while je: while (izraz)

    operator

    Ako je vrednost izraza tano , izvride se operator koji ini telo ciklusa. Operator se izvrava dok god izraz ima vrednost tano. Svaki takav korak naziva se iteracija.

  • 4/3/2013

    24

    Example No 9

    /* Stepen celog broja*/

    main()

    {

    int a,n, i=1,stepen=1;

    printf("Ucitaj a i n:\n");

    scanf("%d%d",&a,&n);

    while (i++

  • 4/3/2013

    25

    Example No 10 /* Faktorijel*/

    main()

    {

    long i,n,fakt;

    scanf("%ld",&n);

    for (fakt=1,i= 1; i

  • 4/3/2013

    26

    Example No 11 /* Stepeni dvojke*/

    main()

    {

    int stepen,granica;

    printf("Uneti granicu\n");

    scanf("%d",&granica);

    stepen=2;

    do{

    printf("%d\n",granica);

    stepen*=2;

    }

    while (stepen

  • 4/3/2013

    27

    Definicija funkcije

    Funkcije se dele na dve osnovne kategorije:

    Funkcije koje vradaju vrednost (rezultat) pozivajudoj funkciji (main ili neka druga)

    Funkcije koje ne vradaju vrednost pozivajudoj funkciji (main ili neka druga).

    Kod funkcija koje ne vradaju vrednost kao tip rezultata navodi se void.

    Sintaksa Funkcije ima slededi oblik:

    Tip_rezultata ime_funkcije(formalni parametri)

    Opis formalnih parametara

    {

    Definicije i deklaracije

    Operator1

    ....

    OperatorN

    }

    Example No 12 a

    /* Funkcija izraunava sumu kvadrata celih brojeva od m do n*/

    long suma_kvadrata(m,n){

    int i;

    long s=0;

    for(i=m;i

  • 4/3/2013

    28

    Example No 12

    /* main funkcija ilustruje koridenje funkcije suma_kvadrata */ main() { int m,n,k,l; long p; long suma_kvadrata(); p=suma_kvadrata(2,4); printf("%ld %ld\n",p,suma_kvadrata(-1,3)); scanf("%d%d%d%d",&m,&n,&k,&l); p=suma_kvadrata(m,n)+suma_kvadrata(k,l); printf("%ld %ld\n",p,suma_kvadrata(m+k,n+l)); } /* Funkcija izracunava sumu kvadrata celih brojeva od m do n*/ long suma_kvadrata (int m,int n) { int i; long s=0; for(i=m;i

  • 4/3/2013

    29

    Podela memorije izmeu promenljivih koje koriste funkcije main () i suma_kvadrata()

    main()

    m

    n

    k

    l

    p

    P = suma_kvadrata (2,4)

    suma_kvadrata()

    m

    n

    s

    i

    Pokazivake promenljive (Pointeri)

    Pokazivaka promenljiva je promenljiva koja pokazuje na drugu promenljivu, odnosno sadri adresu memorijske lokacije u kojoj se uva ta promenljiva

    Deklarie se tako to se u specifikaciji zada tip promenljive na koju ukazuje pokazivaka promenljiva. Ispred imena promenljive pie se * int *pi /*pokaziva na celobrojnu promenljivu */

    char *pc /*pokaziva na znakovnu promenljivu */

    float *pf1, *pf2 /*pokaziva na float promenljive */

    j = *pi //dodeljuje promenljivoj j celobrojnu vrednost koja se nalazi na adresi sadranoj u promenljivoj pi.

  • 4/3/2013

    30

    Pretpostavimo da postoji slededa deklaracija i inicijalizacija promenljive prom:

    int prom= 0 ;

    Deklaracija int * ukaz_prom; nam omogudava da indirektno pristupimo vrednosti promenljive prom.

    Za promenljive prom i ukaz_prom moemo pisati iskaz:

    ukaz_prom = &prom;

    koji promenljivoj ukaz_prom dodeljuje adresu promenljive prom.

    Ako je promenljiva x deklarisana kao int, tada se iskazom

    x = *ukaz_prom;

    dodeljuje vrednost promenljive na koju pointer ukaz_prom ukazuje. Poto je promenljiva ukaz_prom

    u ranijem iskazu postavljena na vrednost &prom efekat prethodnog iskaza dodeljivanje promenljivoj x vrednost promenljive prom.

    Operatori & i * su unarni istog prioriteta i inverzni su meusobno.

    Pointeri

    Pretpostavimo da imamo deklaraciju int x,y,*u Tada su iskazi u = &x y= *u; Ekvivalentni iskazu y = *&x Koji je opet ekvivalentan iskazu y = x Operatori dodeljivanja

    pi = &i j = *pi

    Imaju isti efekat kao j = i

    Pointeri

  • 4/3/2013

    31

    Pokazivai

    Int x=1, y=2;

    Int *ip

    ip=&x x y ip 100 200 1000

    y= *ip x y ip 100 200 1000

    x=ip x x y ip 100 200 1000

    *ip=3 x y ip 100 200 1000

    1 2 100

    3 2 100

    100 2 100

    1 1 100

    Pointeri, opet, ali malo drugaije

    Pokaziva se definie kao i ostale promenljive. Razlika je to se nazivu promenljive dodaje unarni operator simbol (*) ispred identifikatora odreene promenljive. Zvezdica (*) je simbol za indirektno adresiranje pa se zato i sam operator (*) naziva i operatorom indirektnog adresiranja.

    Kada se operator indirekcije (*) primeni na neki pokaziva, njime se pristupa objektu na koji pokaziva pokazuje.

    int *p1; /* pokaziva na integer promenljivu

    char *p2; /* pokaziva na char promenljivu

    long double *p4; /* pokaziva na long double prom.

  • 4/3/2013

    32

    Pointeri

    Pokaziva je dakle promenljiva koja sadri adresu objekta tj. neke promenljive na koji pokazuje. Kada je sadraj pokazivaa adresa nekog objekta tada je pokaziva inicijalizovan.

    Adresa nekog objekta u memoriji koji je predstavljen svojim identifikatorom, moe da se dobije pomou prefiksnog unarnog operator (&), odnosno adresa neke promenljive dobija se koridenjem ovog adresnog operatora.

    Jedan pouan primer

    int broj; /* promenljiva tipa int

    int *pok; /* pokaziva na int tip

    broj = 10; /* inicijalizacija promenljive broj na 10

    pok = &broj; /* inicijalizacija pokazivaa tako da pokazuje na promenljivu broj

    *pok = 100; /* promena sadraja promenljive broj na 100 preko pokazivaa .

    broj = 100;

  • 4/3/2013

    33

    DEKLARACIJA POKAZIVAA

    Pokaziva omogudava indirektan nain pristupa vrednosti odreenog podatka, i to pomodu adresa podatka u memoriji raunara. Kako to funkcionie na najjednostavnem primeru:

    int broj = 10, *pok;

    Da bi se uspostavila veza izmeu promenljivih broj i pok, koristi se operator (&) koji daje adresu odgovarajude promenljive.

    pok = &broj

    Ovim je pridruena memorijska adresa promenljive broj pokazivau pok, tj. sadraj promenljive pok je adresa promenljive broj

  • 4/3/2013

    34

    Vrednost promenljive broj pridruuje se nekoj drugoj promenljivoj npr x upotrebom promenljive pok, koristedi operator (*). x = *pok;

    ima isto znaenje kao i: x = broj;

    tj. u jednom i drugom sluaju vrednost promenljive x je 10.

    Veza izmeu funkcija koridenjem pokazivaa

    Funkcija kvadrat_kub () koja je definisana iza glavne funkcije main() u primeru No14 ima etiri parametra m, n, kv i kub. Prva dva parametra su ulazni podaci koje ne elimo menjati u toku izvretka funkcije i nazivaju se vrednosni parametri. Pre izvravanja funkcije tim parametrima se dodeljuju vrednosti stvarnih parametara.

    Pri pozivu funkcije kvadrat_kub(2,4 ,&p&q); predaju se adrese promenljivih p i q to znai da de formalni parametri kv i kub

    koji su definisani u zaglavlju funkcije kvadrat_kub (m, n, kv, kub) biti opisani kao pokazivai.

    Poto su p i q celobrojne promenljive promenljive kv , kub treba da budu opisane kao pokazivai na celobrojne promenljive, pa se deklariu na slededi nain

    int m, int n, int *kv, int *kub Ovi parametri se nazivaju adresni parametri, i koriste se za odreivanje izlaznih

    vrednosti funkcije ili promenu vrednosti odgovarajudih stvarnih parametara. Na mestu programa na kome se funkcija izvrava prvi put promenljivim p i q se

    dodeljuju vrednosti stvarnih parametara 2 i 4. Pokazivake promenljive *kv, i *kub

    dobijaju adrese stvarnih parametara &p i &q tako da se sve operacije koje se u funkciji realizuju nad *kv, i *kub su operacije koje se realizuju nad stvarnim parametrima p i q

  • 4/3/2013

    35

    Example No 14 main()

    {

    int m,n,k,l,p,q,r;

    void kvadrat_kub();

    kvadrat_kub(2,4,&p,&q); printf("p = %d q =%d\n",p,q);

    scanf("%d%d%d%d",&m,&n,&k,&l);

    kvadrat_kub(m,n,&p,&q);

    printf("p = %d q =%d\n",p,q);

    kvadrat_kub(m-k,n+l,&p,&r);

    printf("p = %d q =%d\n",p,r);

    }

    void kvadrat_kub(int m, int n, int *kv, int *kub) {

    int i;

    *kv = *kub =0;

    for(i=m;i

  • 4/3/2013

    36

    Prosleivanje argumenata funkciji upotrebom pokazivaa

    U nekim sluajevima nije dovoljno da funkcija vrada samo jednu vrednost. Naredbom return mogude je vratiti samo jednu vrednost. U cilju reavanja ovog problema, potrebno je razmotriti osobine koje imaju parametri funkcije. U trenutku prenosa promenljive kao parametra funkcije, u okviru funkcije se automatski kreira lokalna kopija promenljive. Ukoliko funkcija menja vrednost parametara (dodeljuje mu vrednost i sl.), promena je ''vidljiva'' samo u okviru funkcije, jer se menja samo vrednost lokalne kopije promenljive, a ne i ''originala''. Da bi promena vrednosti parametara bila vidljiva i van okvira funkcije, tj. u okviru programa koji je funkciju pozvao, potrebno je funkciji preneti ne promenljivu, ved adresu promenljive. U tom sluaju se ne kreira kopija promenljive.).

    Prosleivanje argumenata funkciji upotrebom pokazivaa

    Prenos promenljive na nain na koji se kreira lokalna kopija promenljive se naziva prenos po vrednosti, a prenos promenljive na nain na koji se koristi ''zajednika' promenljiva se naziva prenos po referenci. Prenos po vrednosti i prenos po referenci su ilustrovani na slededem primeru:

  • 4/3/2013

    37

    Prenos parametara po vrednosti

    void f_ja(int x) { x = x + 3; } void main() { int param = 5; f_ja(param); } Nakon poziva funkcije f_ja vrednost promenljive param je 5 (nepromenjena).

    Prenos parametara po referenci

    void f_ja(int *x) { *x = *x + 3; } void main() { int param = 5; f_ja(&param); } Nakon poziva funkcije f_ja vrednost promenljive param je 8 (promenjena)

  • 4/3/2013

    38

    Memorijske klase

    Pored pripadnosti odredjenom tipu promenjlive imaju i svoju memorijsku klasu.

    Memorijska klasa daje mogudnost da se odredi sa kojim funkcijama je povezana promenljiva ili koje funkcije imaju pristup promenljivoj.

    Pri opisu memorijske klase koriste se sledede rezervisane rei: auto static register extern

    Automatske promenljive

    Automatske promenljive se deklariu rezervisanom rei auto ispred specifikacije tipa kao u slededem primeru:

    {

    auto int a;

    auto int b=777;

    auto double d;

    }

    Oblast u kojoj deluje automatska promenljiva ograniena je blokom (u granicama definisanim zagradama { } u kome je deklarisana). Dok god se blok koji je sadri izvrava ona ivi , kada program napusti taj blok promenljiva iezava. Ona je dostupna i u svakom podbloku bloka u kome je deklarisana. Primer No 15 ilustruje oblast delovanja automatskih promenljivih.

  • 4/3/2013

    39

    Example No 15

    main()

    {

    /*spoljasnji blok*/

    auto int x=1;

    {

    /*podblok #1 */

    auto int y=2;

    printf(%d%d\n,x,y);

    }

    {

    /*podblok #2*/

    printf(%d%d\n,x,y);/*linija 12 */

    }

    printf(%d%d\n,x,y);/*linija 14*/

    }

    Statike promenljive

    Kao i automatske, statike promenljive su lokalne u funkciji odnosno bloku u kome su deklarisane. Razlika je u tome to statike promenljive ne iezavaju kada funkcija koja ih sadri prekine izvravanje. Ako program ponovo pree na izvravanje funkcije koja sadri statiku promenljivu ona de imati vrednost sa kojom je prekinuta funkcija u prethodnom izvravanju. Primer deklaracije i inicijalizacije:

    {

    static int a = 1;

    float c = 0,0;

    ...

    }

    U slededem primeru Example No 16 funkcija uvedaj () se poziva tri puta. Inicijalna vrednost promenljive x je 0. U slededim pozivima funkcije koristi se vrednost sauvana iz prethodnog izvravanja.

  • 4/3/2013

    40

    Example No 16 main()

    {

    void uvecaj();

    uvecaj();

    uvecaj();

    uvecaj();

    }

    void uvecaj() {

    static int x=0;

    x++;

    printf(%d\n,x);

    }

    Ispisuje se

    1

    2

    3

    Spoljanje promenljive

    Promenljiva deklarisana van funkcije naziva se spoljanja promenljiva. Ona se moe deklarisati i u funkciji koja je koristi navoenjem rezervisane rei extern. Na primer:

    int x; /*deklaracija spoljasnje promenljive x */

    char c;

    double x;

    main()

    {

    extern int a;

    extern char c ;

    extern double x ;

    ..

    }

    Navoenjem rezervisane rei extern spoljanja promenljiva postaje dostupna funkciji definisanoj bilo gde u tom i u bilo kom file-u

  • 4/3/2013

    41

    Primeri deklarisanja spoljanjih promenljivih

    int x = 707; /* globalna deklaracija promenljive x */

    main()

    {

    printf(%d/n, x);

    }

    Poto je promenljiva x definisana van funkcije main() ona je globalna I funkcija joj moe pristupiti. Izvravanjem programa dobija se 707

    A izvrenjem programa

    int x = 707; /* globalna deklaracija promenljive x */

    main()

    {

    int x = 101; /* lokalna deklaracija promenljive x */

    printf(%d/n, x);

    }

    dobija se 101

    U toku izvravanja funkcije vaeda je vrednost lokalne promenljive

    Example No17

    int x; /*deklaracija spoljasnje promenljive x */ main() { printf("Pocetna vrednost od x je%d\n",x); dodaj(); oduzmi(); dodaj(); oduzmi(); printf("krajnja vrednost od x je %d\n",x); } /*uvecava spoljasnju promenjivu x*/ dodaj() { x++; printf("dodavanjem 1 dobija se %d\n",x); } /*umanjuje spoljasnju promenjivu x*/ oduzmi() { x--; printf("oduzimanjem 1 dobija se %d\n",x); }

  • 4/3/2013

    42

    Kreiranje projekta

    U okruenju C jezika programi koji se formiraju iz vie file-ova nazivaju se projekti. Svaki projekat je povezan sa projektnim file-om koji treba kreirati i u kome se nalazi opis projekta, ili spisak file-ova koji obrazuju projekat. Projektni file-ovi moraju imati ekstenziju PRJ. Na primer ako treba napraviti program iz file-ova

    PRVI. C

    main()

    {

    printf(Ovo je iz file-a1.\n);

    pisi() /*U File-u DRUGI.C */

    }

    i DRUGI. C

    pisi()

    {

    printf(Ovo je iz file-a2.\n);

    }

    Treba kreirati projektni file npr. PRVIPROJ. PRJ:

    PRVI

    DRUGI

    U podmeniju Project u opciji Project Name navede se ime projekta PRVIPROJ. Opcijom RUN zadaje se kompilacija i izvravanje projekta. U podmeniju Compile opcija Make kreira se EXE verzija projekta.

    Nizovi Niz je ogranien ureen skup promenljivih istog tipa, koje se nazivaju

    komponente. Tip komponenti se naziva bazni tip. Vrednostima pojedinih komponenti moe se pristupiti pomodu indeksa, koji ukazuje koju komponentu treba obraivati.Pri definisanju nizova treba voditi rauna o dve stvari:

    Treba ukazati na broj komponenti i nain referisanja na komponente. Treba ukazati na tip vrednosti koje se u njemu uvaju.

    Opis niza Niz se opisuje kao i ostali podaci, samo to se dodaju kvadratne zagrade iza

    imena niza. Unutar zagrada se navodi broj koji pokazuje broj elemenata u nizu.

    Int broj [1000] ; Ovom deklaracijom se uvodi niz broj koji se sastoji iz 1000 celobrojnih

    promenljivih sa imenima broj [0], broj [1] ... broj [999]. Indeksiranje elemenata niza je od 0. Svaka promenljiva poto je celobrojna zauzima dva bajta.

  • 4/3/2013

    43

    Example No 18

    //Izracunati srednju vrednost niza od n elemenata(n

  • 4/3/2013

    44

    Example No 20 //Izracunati indeks najveceg elemenata niza x od n elemenata (n

  • 4/3/2013

    45

    Inicijalizacija Nizova Nizovima je u C jeziku moguce dodeljivati pocetne vrednosti. Ako se

    inicijalizacija ne zadaje eksplicitno niz se inicijalizuje nulom, Medjutim ako je potrebno da se niz inicijalizuje vrednostima razlicitim od nule potrebno je da se pri deklaraciji niza izmedju viticastih zagrada navedu zeljene vrednosti razdvijene zarezom.

    Int dani [12]= {31,28,31,30,31,30,31,31,30,31,30,31}

    main() { int i; extern int dani[ ]; /*neobavezna deklaracija*/ for (i=0; i

  • 4/3/2013

    46

    Nizovi i pokazivai

    Oba dela jednakosti X= &x[0] definiu adresu nultog elementa niza. Obe oznake su konstante pokazivakog tipa i ne mogu se menjati. Prema tome njih moemo dodeljivati pokazivakim promenljivim.

    x+2 ==&x[2] /*jer su im iste adrese*/

    *(x+2) == x[2] /*jer su im iste vrednosti*/

    Odavde se vidi da se pokazivai mogu koristiti za adresiranje elemenata niza , kao i za dobijanje njihove vrednosti.

    Nizovi i pokazivai

    Kada se navede X+2 to kompajler tretira kao adresu koja se dobija dodavanjem na adresu X ne 2, ved 2 puta broj baytova koje zauzimaju komponente niza X.

    U sutini se radi o razliitim oznakama za jedno te isto, jer kompajler pretvara oznake niza u pokazivae , pa je brzine radi, preporuljivo koristiti pokazivae.

  • 4/3/2013

    47

    Ilustracija pokazivaa i adresa na koje ukazuju

    pti pti+1 pti+2 pti+3 Adresa: 56006 56007 56008 56009 56010 56011 56012 56013

    Pokazivaci pti, pti+1, pti+2 i pti+3

    redom pokazuju na adrese: 56006, 56008, 56010 i 56012

    i elemente niza: x[0], x[1], x[2] i x[3],

    X[0]

    X[0] X[1] X[2] X[3]

    POKAZIVAI NA NIZOVE

    1004 v[0]

    1008 v[1]

    1012 v[2 ]

    1016 v[3]

    1020 \0

    .....

    2010

    int v[ ] = {1, 2, 3,4}; /*niz */ int* p1 = v;

    /*pokaziva na niz odnosno uvek na prvi element niza tj. p1=&v[0] */

    int* p2 = &v[1]; /*pokaziva na prvi element niza */ int* p3 = &v[4]; /*pokaziva na poslednji element niza */

    1004 p1

    1

    2

    3

    4

    1004 p2 1020 p3 for (i = 0; i

  • 4/3/2013

    48

    Funkcije, nizovi, pokazivai, parametri, prenoenje argumenata ...

    Prenoenja nizova kao argumenata moe se analizirati na problemu odreivanja broja studenata koji su imali natprosene rezultate na proveri znanja iz osnova programskog jezika C.

    Algoritam ovog problema se moe razloiti na sledede module

    Uitavanje vrednosti elemenata niza

    Izraunavanje prosenog rezultata

    Prebrojavanje natprosenih rezultata

    Ispis izlaznog izvetaja

    Example No .

    main(){ int n,i,broj,ocena[50]; /*niz od 50 elemenata*/ float prosek(); printf('\n Unesi broj takmicara:'); scanf(%d',&n); /*ucitavanje elemenata niza*/ printf('\n Unesi rezultate:\n'); for (i:=0;i

  • 4/3/2013

    49

    Contnue.

    /*prebrojavanje natprosecnih rezultata*/

    broj=0

    for(i=0;iprosek(ocena,n))

    broj++;

    printf(''prosecan rezultat je:%f.\n'',prosek(ocena,n));

    printf (''natprosecne rezultate je imalo:%d takmicara.\n'',broj);

    }

    float prosek(int x [],int n){

    int i,suma;

    suma=0;

    for(i=0;i

  • 4/3/2013

    50

    Funkcije, nizovi, pokazivai, parametri, prenoenje argumenata ...

    Poziv funkcije

    prosek (ocena,n) sadri ime ocena koje predstavlja adresu nultog elementa od najvie 50 elemenata.

    Time se pri pozivu funkcije predaje pokazivaka konstanta (adresa nultog elementa niza)

    ocena = &ocena[0]

    To znai da je formalni parametar funkcije pokazivakog tipa pa se u funkciji prosek() moe izvriti deklaracija na slededi nain

    prosek(int *x,int n)

    Funkcije, nizovi, pokazivai, parametri, prenoenje argumenata ...

    Operatori int x []; int*x;

    Su ekvivalentni jer oba deklariu promenljivu x kao pokaziva na niz celih brojeva

    ... Operatori koji u funkciji prosek () koriste pokaziva *X rade sa nizom ocena koji se nalazi u telu funkcije main() Poziv funkcije inicijalizuje pokaziva X tako da pokazuje na ocena [0] Kada index i u funkciji prosek () uzme vrednost 4 tada je izraz x [4] ekvivalentan sa *(x+4).

  • 4/3/2013

    51

    Funkcije, nizovi, pokazivai, parametri, prenoenje argumenata ...

    Znai poto (x+0) pokazuje na ocena[0] to x+4 pokazuje na ocena[4].

    Prenos jednodimenzionalnih nizova se ostvaruje navoenjem imena niza u pozivu funkcije bez ikakvog indeksa. Na ovaj nain u funkciju se prenosi informacija (adresa) o lokaciji niza u pozivajudoj funkciji.

    Funkcije, nizovi, pokazivai, parametri, prenoenje argumenata ...

    ak i deklaracija x [100] ima isto znaenje kao i x [] jer C kompajler generie kod koji funkciji predaje pokaziva tako da je beznaajna specificirana duina niza.

    X== &x[0]

    X +0== &x[0]

    X+2 ==&x[2] /*jer su im iste adrese*/

    *(x+2) == x[2] /*jer su im iste vrednosti*/

    *(x+i) == x[i]

    Prema tome jednodimenzionalni nizovi se prenose iskljuivo po adresi

  • 4/3/2013

    52

    Sortiranje nizova Program kojim se koridenjem odgovarajude funkcije uitani niz sortira u monotono neopadajudi poredak

    Example No 21 main() { int float a[50]; void citaj(); void pisi(); void sort1(); printf(\nUneti broj elemenata niza:); scanf(%d,&n); printf(\nUnesi elemente niza:\n); citaj(a,n); sort1 (a,n); printf(Niz posle sortiranja je:\n); pisi(a,n);

    }

    Example No 21 void citaj(float x[],int n)

    {

    int i;

    for(i=0;i

  • 4/3/2013

    53

    Example No 21

    void razmeni(float*a,float*b) { float pom; pom=*a;*a=*b;*b=pom; } void sort(float a[],int n) { int i,j; for(i=0;i

  • 4/3/2013

    54

    Viedimenzionalni nizovi

    Prema navedenoj deklaraciji vai:

    poki =& a [0][0]

    Poki+1 =& a [0][1]

    Poki+2 =& a [1][0]

    Poki+3 =& a [1][1]

    Poki+4 =& a [2][0]

    Poki+5 =& a [2][1]

    U ovom primeru a je ime dvodimenzionalnog niza a, a [0], a [1], a [2]

    su imena jednodimenzionalnih nizova koje predstavljaju vrste matrice.

    Ime niza je pokaziva na taj niz jer pokazuje na njegov prvi element, tako da vai:

    a [0] =& a [0][0]

    a [1] =& a [1][0]

    a [2] =& a [2][0]

    Ova osobina nam koristi da funkciju namenjenu za obradu jednodimenzionalnog niza koristimo pri obradi vrsta dvodimenzionalnog niza.

    Example No 22 main()

    {

    static float a[3][4]={

    {1.0,2.0,3.0,4.0},

    {11.5,22.4,33.3,44.2},

    {10.1,20.2,30.3,40.4}

    };

    int i;

    float sredina();

    for (i=0;i 3;i++)

    printf(srednja vrednost vrste %d je %f\n,i,sredina(a*i+,4));

    /*a[i] je jednodimenzionalni niz od etirielementa*/

    }

    float sredina(float x[],int n)

    {

    int i;

    float suma=0;

    for (i=0;i

  • 4/3/2013

    55

    Example No 23

    main()

    {

    int i,n;

    int x[10][10]

    void citaj();

    void pisi();

    void sort1();

    printf(\nUneti broj vrsta matrice:);

    scanf(%d,&n);

    printf(\nUnesi elemente matrice po vrstama :\n);

    citaj(x,n);

    sort1(x[i],n);

    printf(matrica posle sortiranja je:\n);

    pisi(x,n);

    }

    Example No 23

    /*funkcija koja ucitava elemente matrice*/

    void citaj(int x[][10],int n) {

    int i,j;

    for(i=0;i

  • 4/3/2013

    56

    Example No 23

    void razmeni(int*a,int*b)

    {

    float pom;

    pom=*a;*a=*b;*b=pom;

    }

    void sort_po_vrstama(int a[][10],int n)

    {

    int i,j,k;

    for(i=0;i

  • 4/3/2013

    57

    (Malo podsedanja)

    main() { char c = A; printf(/ %c / %d / %o / %x \n,c,c,c,c); } Izvrsavanjem programa dobija se: /A/65//101/41 65- ASCII dekadna vrednost 101- ASCII oktalna vrednost 41- ASCII heksadekadna vrednost

    Da sumiramo

    Znai, izraz A je znakovna konstanta

    a, A je prikriven, skradeni, prikaz konstantnog znakovnog niza sastavljenog iz dve znakovne konstante A i \0 .

  • 4/3/2013

    58

    Inicijalizacija znakovnih nizova

    Rekli smo da je nizovima u C jeziku mogude dodeljivati poetne vrednosti. Ako se inicijalizacija ne zadaje eksplicitno niz se inicijalizuje nulom, meutim, ako je potrebno da se niz inicijalizuje vrednostima razliitim od nule potrebno je da se pri deklaraciji niza izmedju vitiastih zagrada navedu eljene vrednosti razdvijene zarezom.

    Inicijalizacija znakovnih nizova

    Nizovi se mogu inicijalizovati koridenjem string konstanti. Na primer, operator static char tekst * +=,F,e,s,t,i,n,a,t,a,m, s,e,m,e,n,t,e,m, s,a,e,p,e, d,e,c,i,p,e,r,e,, s,e,r,o,t,i,n,a,m,s,e,m,p,e,r,\0 -;

    inicijalizuje statiki niz tekst datom string konstantom ili skradeni oblik inicijalizacije izgleda ovako: static char tekst [ ]={ Festinatam sementem saepe decipere, serotinam semper };

  • 4/3/2013

    59

    Nizovi karaktera i pokazivai Poto je ime niza ekvivalentno adresi njegovog nultog

    elementa ( predstavlja pokaziva na nulti element) tako je i string konstanta pokaziva na nulti element niza u kome je registrovan string.

    Operator static char s[ ] = IBM PC ; inicijlizije statiki niz s

    datom string konstantom On predstavlja skradeni oblik inicijalizacije

    static char s[ ] = ,I,B,M, P,C, \0-; Ako bi se izostavio zavrni znak to vie ne bi bio string

    ved samo niz znakova. Kao i kod drugih nizova ime s predstavlja pokaziva na

    nulti element.

    s =& s[0], *s = I , *(s +1) = s[1] = B ,

    Nizovi karaktera i pokazivai

    Za kreiranje stringa moe se koristiti i pokaziva. Na primer deklaracijom: char *pok = Festinatam sementem saepe decipere, serotinam semper ;

    pokaziva pok je inicijalizovan adresom nultog znaka stringa

    Ekvivalentna inicijalizacija se moe realizovati slededim operatorima: char *pok; pok = Festinatam sementem saepe decipere, serotinam semper ;

    Za razne operacije nad ovim stringom dovoljno je da znamo adresu njegovog nultog znaka.

  • 4/3/2013

    60

    Example N0 .... koji ispisuje string u direktnom i inverznom poretku.

    main()

    {

    static char s[ ]={ Festinatam sementem saepe decipere, serotinam semper };

    char *pok;

    pok = s;

    while (*pok) /*ili while (*pok!= \0 ) */

    putchar (*pok++);

    while (--pok >=s)

    putchar (*pok);

    putchar (\n );

    }

    Inicijalizacija stringova

    Opisom stringa pomodu niza u statikoj memoriji se kreira niz. Svaki element niza se inicijalizuje odgovarajudim znakom a ime niza postaje sinonim adrese nultog elementa. Ime niza je konstanta pokazivakog tipa koja se ne moe menjati.

    Opisom stringa pomodu pokazivaa takoe se u statikoj memoriji kreira niz ali i rezervie memorijski prostor za pokazivaku promenljivu koja pokazuje na poetak stringa. Njena vrednost se moe menjati na primer sa ++ pok da bi se definisao pokaziva na slededi znak stringa.

  • 4/3/2013

    61

    Pokazivai na stringove

    Primer funkcije kojom se na osnovu parametara koji je

    POKAZIVA NA STRING

    ispituje da li je dati string palindrom

    Funkcija palindrom

    int palindrom (char * strpok)

    {

    char *strpok1 = strpok;

    while (*strpok1)

    ++strpok;

    --strpok1; /* povratak unazad za jedan znak */

    while (strpok

  • 4/3/2013

    62

    Testiranje funkcije palindrom

    main()

    {

    if (palindrom(ANAVOLIMILOVANA))

    printf(string 1 je palindrom\n);

    if (palindrom(ASTERIX))

    printf(string 2 je palindrom\n);

    }

    Example No 25

    char veliko (char c)

    {

    if (c=a)

    return (A+c-a);

    else return (c)

    }

  • 4/3/2013

    63

    Nizovi pokazivaa na stringova

    Koristedi niz stringova Stringu se moe pristupiti preko indexa. Deklaracijom:

    static char *jezici [4] = ,PASCAL,MODULA,C++, ADA-;

    Definisan je niz pokazivaa jezici na stringove

    Nulti pokaziva jezici [0] pokazuje na nulti string, prvi pokaziva jezici [1] pokazuje na prvi string , tako da vai :

    *jezici *0+=P, *jezici *1+=M, *jezici *2+=C, *jezici *3+=A

    jezici [0] PASCAL

    MODULA

    C++

    ADA

    jezici [1]

    jezici [2]

    jezici [3]

    NIZOVI POKAZIVAA

    #include

    main()

    {

    static char *dani[] = {"Nedelja", "Ponedeljak",

    "Utorak", "Sreda", "Cetvrtak", "Petak", "Subota"};

    int i;

    for( i = 0; i < 6; ++i );

    printf( "%s\n", dani[i]);

    }

    1004 1036 Dan[0]

    1008 1044 Dan[1]

    ....

    1032 1077 Dan[6]

    1036 N

    1037 e

    1038 d

    1039 l

    1040 j

    1041 a

    1042 k

    1043 \0

    1044 P

    1045 o

    ..... ..

    1052 \0

    1053 U

    .... ..

    1081 t

    1082 a

    1083 \0

    .....

    Adr. Vred. Naziv

    Rezultat

    Nedelja

    Ponedeljak

    Subota

    \0

    0

    1

    \0

  • 4/3/2013

    64

    Nizovi pokazivaa

    Ime niza je dani. Veliina niza nije specificirana. Prevodilac, onaj bistrooki, de izraunati veliinu niza.

    Svaki element niza je pokaziva na znak. Zbog prisustva konstantnih znakovnih nizova u inicijalizatorskoj listi nizovi se smetaju negde u memoriji, a njihove adrese u NIZ DANI. U elementu 0 nalazi se adresa konstantnog znakovnog niza Nedelja a, u elementu 1 adresa niza Ponedeljak....

    Strukture

    Struktura predstavlja skup podataka kojim se opisuju svojstva objekta ili, strukture predstavljaju sloene objekte koji se sastoje od komponenti raznih tipova

    Komponente koje obrazuju strukturu nazivaju se elementi strukture

    Opis strukture: struct oznaka_str

    {

    Tip ime _elementa1

    Tip ime _elementa2

    };

  • 4/3/2013

    65

    Deklaracija strukturnih promenljivih

    Ako definiemo model strukture oznaene sa linost ispred funkcije main () #define MAXIME 31

    #define MAXADRESA 41

    struct licnost

    {

    char ime [MAXIME];

    char adresa [MAXADRESA];

    unsigned starost;

    };

    Tada u funkciji moemo opisati strukturne promenljive koridenjem oznake strukture

    struct licnost osoba 1, osoba2;

    Strukture koje sadre pokazivae

    Dva niza znakova u ovoj strukturi zauzimaju prostor fiksne veliine . Poto su lanovi strukture ime i adresa nizovi oni zauzimaju podjednako veliki memorijski prostor bez obzira ta je u njih upisano.

    Efikasniji nain organizovanja podataka je koridenje POKAZIVAA kao lanova strukture i njihovo usmeravanje na efikasnije i ekonominije smetanje znakovnih nizova.

  • 4/3/2013

    66

    Strukture koje sadre pokazivae

    Nova deklaracija ablona strukture

    struct licnost

    {

    char *ime;

    char *adresa ;

    unsigned starost;

    };

    Dva niza znakova zamenjena su pokazivaima na znak pri emu svaki zauzima onoliko mesta koliko je potrebno za pokaziva

    Deklaracija strukturnih promenljivih

    Pri opisu strukturnog modela dozvoljeno je da se definiu i promenljive, tako da je:

    struct licnost osoba 1, osoba2;

    skradeni zapis struct licnost { char ime [MAXIME]; char adresa [MAADRESA]; unsigned starost; }osoba1, osoba2;

  • 4/3/2013

    67

    Inicijalizacija i dodela vrednosti strukturnim promenljivim

    Elementima strukturne promenljive mogud je direktan pristup ( bez nabrajanja elemenata koji mu prethode.

    Pristup elementima ime, adresa, starost promenljive osoba1 moe se ostvariti pomodu sloenih imena

    osoba1. ime

    osoba1.adresa

    osoba1.starost

    Inicijalizacija i dodela vrednosti strukturnim promenljivim

    Elementima strukture mogu se uitavati vrednosti koridenjem funkcija gets() i scanf()

    gets(osoba1.ime);

    gets(osoba1.adresa);

    scanf(%d,&osoba1.starost);

  • 4/3/2013

    68

    Inicijalizacija i dodela vrednosti strukturnim promenljivim

    Za uitavanje stringova jednostavnije je koristiti funkciju gets() od scanf().

    Funkcija gets() prihvata znake sa tastature dok ne naie na

    znak za novu lininju (\n) koji se proizvodi pritiskom na taster ENTER. Funkcija predaje uitane znake pozivajudoj funkciji ignoriudi znak za novu liniju i dodajudi zavrni ili nulti znak (\0)

    Funkcija scanf() omogudava uitavanje meovitih podataka u standardnoj formi. o poinje znakom koji nije praznina, o ako je specifikacija %s uitava se do prvog praznog znaka, ali ignoriudi ga

    Strukturne promenljive i pokazivai

    Ako je definisana pokazivaka promenljive osoba: struct linost*osoba;

    Elementima strukture na koju ova promenljiva pokazuje moe se pristupiti koridenjem operatora taka (*osoba).ime (*osoba).adresa (*osoba).starost

    Radi jednostavnijeg pristupa elementima strukturne promenljive na koju pokazuje pokazivaka promenljiva uveden je operator strelica u desno (->) osoba->ime osoba->adresa osoba->starost

  • 4/3/2013

    69

    Example No .

    Napisati program kojim se uitavaju podaci za dve osobe i ispisuju podaci o starijoj

    #include

    #define MAXIME 31

    #define MAXADRESA 41

    struct licnost

    {

    char ime[MAXIME];

    char adresa[MAXADRESA];

    unsigned starost;

    };

    Example No .

    void citaj(struct licnost * osoba)

    {

    printf(Unesite ime osobe:);

    gets(osoba->ime);

    printf(Unesite adresu osobe:);

    gets(osoba->sdresa);

    printf(Unesite starost osobe:);

    scanf(%u,&osoba->starost);

    while(getchar()!=\n);

    /*ocistiti ulazni string iz scanf jer je nova linijaseparator */

    }

  • 4/3/2013

    70

    Example No .

    main() { struct licnost osoba 1,osoba2,*stariji; printf(Unesi poidatke za prvu osobu:\n); citaj(&osoba 1); printf(Unesi podatkke za drugu osobu:\n); citaj(&osoba2); if (osoba1.starost>osoba2.starost) stariji=&osoba1; else stariji=&osoba2; printf(Stariji je:); printf(%s,%s,star:%ug.\n,stariji->adresa,stariji->starost); }

    Nizovi struktura

    Niz struktura se opisuje kao i svaki drugi niz deklaracijom

    struct licnost osoba[MAXOS]

    Ovom deklaracijom opisuje se struktura od MAXOS elemenata. Svaki element predstavlja strukturu tipa linost.

    Ako deklariemo pokaziva na strukturu licnost

    struct licnost osoba[MAXOS], *pok_lic;

    Otada su inicijalizacije pokazivake promenljive

    pok_lic=osoba;

    pok_lic=&osoba [0]; ekvivalentne

    Poto pok_lic pokazuje na osoba [0], to pok_lic +1 pokazuje na osoba [1].

    osoba [0].starost == (*pok_lic) starost== pok_lic-> starost

  • 4/3/2013

    71

    Example No .

    Napisati program kojim se itaju broj fudbalskih ekipa, za svaku ekipu: naziv, broj osvojenih bodova i gol razlika , a zatim ispisuje tabela sa gol razlikom.

    # define MAXIME 30

    #define MAXEKIPA 20

    struct tabela

    {

    char ime [maxekipa];

    unsigned bodovi;

    int razlika;

    };

    main() { int n; struct tabela ekipa[MAXEKIPA]; void citaj(); void pisi(); void sort(); printf(''\n Unesi broj ekipa:''); scanf(''%d'',&n); printf(''\n Unesi ime,bodove I gol-razliku svake ekipe:\n''); citaj(ekipa,n); sort(ekipa,n); printf(''Niz posle sortiranja je :\n''); pisi(ekipa,n); }

  • 4/3/2013

    72

    void citaj(struct tabela x[],int n) { int i; for(i=0;

  • 4/3/2013

    73

    void razmeni(struct tabela *a, struct tabela *b)

    {

    struct tabela pom;

    pom=*a;*a=b;*b=pom;

    }

    void sort (struct tabela a[],int n) { int I,j; for(i=0;i

  • 4/3/2013

    74

    DINAMIKO DODELJIVANJE MEMORIJE

    U programskom jeziku C mogude je izvriti dinamiku dodelu memorijskog prostora, tako da se u toku izvrenja programa koristi samo potreban memorijski prostor. Statika dodela je neracionalna. Dinamikim zauzimanjem memorijskog prostora, koje se obavlja tokom izvrenja programa, postie se racionalno koridenje memorije. U toku programa mogude je dodeljivanje i otkazivanje "rezervacije" memorijskog prostora.

    DINAMIKO DODELJIVANJE MEMORIJE

    Za razliku od statike dodele memorije gde se podacima pristupa preko imena promenljivih, dinamiki pristup podacima vri se uglavnom preko pokazivaa. Sama dodela memorije obavlja se uz pomod bibliotenih funkcija koje se nalaze u kao to su:

    malloc(n) - funkcija dodeljuje memoriju od n bajtova;

    calloc(x,n) - dodeljuje memorijski prostor za x komponenti niza od n bajtova.

    free(p) - oslobaa prostor.

  • 4/3/2013

    75

    malloc

    char *malloc( unssigned n)

    gde n predstavlja broj bajtova koje izdvaja funkcija.

    Vreednost funkcije je znakovni pokaziva na prvi bajt izdvojene oblasti.

    Slededi operatori funkcijom malloc izdvajaju 200 bajta

    int *pint

    pint = (int*) malloc(200)

    sizeof

    sizeof (izraz) - Vrada memorijski prostor neophodan za uvanje izraza

    sizeof (T) - Vrada memorijski prostor neophodan za uvanje vrednosti tipa T

  • 4/3/2013

    76

    Statika dodela memorije

    Prilikom definicije niza od n lanova u pokazivau niz poinje sa adresom u memoriji prvog elementa niza.

    int *niz;

    niz=calloc(n,sizeof(int));

    Na ovaj nain dodeljivanja memorijskog prostora unapred je definisan broj lanova niza n, tj veliina memorije na poetku izvrenja program. Ovako se rezervie n puta 2 (4) bajta jer je sizeof(int) 2 ili 4 u zavisnosti od raunara.

    Dinamika dodela memorije

    Kada je potrebno rezervisati prostor za pokaziva p sa jo nedefinisanim sadrzajem treba napisati sledede: p=(int*)malloc(sizeof(int);

  • 4/3/2013

    77

    Dinamika dodela memorije

    Rezervisanom prostoru se moe pristupiti samo preko pokazivaa p naredbom:

    *p=5;

    na adresi 1253 dolazi vrednost 5.

    Dinamika dodela memorije

    Funkcija free oslobaa prostor u memoriji koji je prethodno rezervisan preko funkce malloc, a ija se adresa nalazila u pokazivau p.

    free(p)

    Vrednost koja se nalazi na toj adresi na koju je upudivao pokaziva p ostaje, ali joj se vie ne moe pristupiti

  • 4/3/2013

    78

    Dinamika dodela memorije

    Vrednost koja se nalazi na toj adresi na koju je upudivao pokaziva p ostaje, ali joj se vie ne moe pristupiti

    Example N

    #include /* Neophodno je ukljuciti stdlib.h */ #include main() { int n; /* Deklaracija int a[n]; nije dozvoljena, jer kompajler ne moze u vreme prevodjenja da odredi potrebnu kolicinu memorije. Umesto ovoga, vri se dinamika alokacijai memorije tj. rezervacija memorije u fazi izvrsavanja rograma kada bude poznata vrednost broja n. Zbog toga je potrebno upamtiti samo adresu pocetka alociranog bloka sto se postize koriscenjem sledeceg pokazivaca: */

  • 4/3/2013

    79

    Example N

    int* a;

    int i, max;

    printf("Unesi dimenziju niza : ");

    scanf("%d", &n);

    /* U ovom treunutku se zna koliko je memorije potrebno i poziva se funkcija malloc za dinamicku alokaciju. */

    Example N

    a = (int*) malloc(n*sizeof(int));

    /* U slucaju da nema dovoljno memorije malloc vraca NULL */

    if (a == NULL)

    {

    printf("Greska : Nema dovoljno memorije!\n");

    return 1;

    }

  • 4/3/2013

    80

    /* Kao obican niz */ for (i = 0; i

  • 4/3/2013

    81

    heap

    memory manager

    user code

    Potreban je memorijski blok veliine n malloc(n) ili calloc(x,n)

    DINAMIKA ALOKACIJA MEMORIJE

    Ovde je pokaziva bloka Nije vie potreban memorijski blok

    free(p)

    Rezervacija i oslobadjanje

    malloc(n) - funkcija dodeljuje memoriju od n bajtova; calloc(x,n) - dodeljuje memorijski prostor za x komponenti niza od n bajtova. free(p) - oslobaa prostor.

    */#include /* Neophodno je ukljuciti stdlib.h */ #include int main(){ int n; int* a; int i, max; printf("Unesi dimenziju niza : "); scanf("%d", &n); a = (int*) malloc(n*sizeof(int)); /* U slucaju da nema dovoljno memorije malloc vraca NULL */ if (a == NULL) { printf("Greska : Nema dovoljno memorije!\n"); return 1; } /* Nadalje a koristimo kao obican niz */

    for (i = 0; i

  • 4/3/2013

    82

    POKAZIVAI NA MATRICE

    U memoriji su smetene u jednodimenzionalni niz tako to se prvo smeta prvi red matrice a zatim redom i ostali stoga pokaziva ukazuju na niz pokazivaa koji ukazuju na niz(red) podataka.

    Matrica je po definiciji

    dvodimenzionalni niz.

    Matrica predstavlja niz

    jednodimenzionalnih

    nizova.

    int i, j, n; /*i, j indeksi matrice; n veliina*/

    double **a;

    a = (double **) calloc(n, sizeof(double *));

    for (i = 0; i < n; ++i)

    a[i] = (double *) calloc(n, sizeof(double));

    DINAMIKA ALOKACIJA MATRICE

    a[n-1] 0 1 2 3 ... n-1

    .... ....

    a[1] 0 1 2 3 ... n-1

    a a[0] 0 1 2 3 ... n-1

    Alociranje memorije za redove matrice

    (n elementa-double)

    Alociranje memorije za n elemenata double pokazivaa

  • 4/3/2013

    83

    FORMIRANJE I BRISANJE MARTICE

    I polu dinamiko II dinamiko #include #include main () { int *a[5]; /* Niz pokazivaca na int. */ int m, n, i, j; /* Broj vrsta i kolona: */ printf ("m,n? "); scanf ("%d%d", &m, &n); /* Stvaranje matrice: */ for (i=0; i

  • 4/3/2013

    84

    Jednostruko povezane liste

    Jednostruko povezana lista je skup vorova povezanih pokazivaima u jednom smeru.

    Svaki vor je strukturna promenljiva koja ima najmanje dva elementa:

    jedan za uvanje informacija, i

    drugi koji se koristi za uvanje pokazivaa na slededi vor liste

    Deklaracija jednostruko povezane liste vezane liste

    typedef char TIP

    typedef struct cvor_st

    {

    TIP inf;

    struct cvor_st *sledeci ;

    } LCVOR;

    LCVOR *pocetak_liste;

    Na poetak liste pokazuje pokazivaka promenljiva pocetak_liste. Krajnji vor liste u elementu za vezu (sledeci) sadri vrednost NULL.

  • 4/3/2013

    85

    Kreiranje vora

    Da bi se kreirao prvi dinamiki objekat ( vor liste ) mora mu se dodeliti neophodan memorijski prostor.

    novi = (LCVOR*)malloc(sizeof (LCVOR));

    Gde je novi pokazivac na LCVOR

    Dinamikom objektu (voru liste ) mogu se dodeliti vrednosti

    novi->inf = A;

    novi->sledeci = pocetak_liste ;

    Da bi se promenljiva pocetak_liste pokazivala na poetak treba joj dodeliti vrednost promenljive novi

    pocetak_liste = novi

    Novi vor liste

    novi = (LCVOR*)malloc(sizeof (LCVOR));

    Gde je novi pokazivac na LCVOR

    Dinamikom objektu (voru liste ) mogu se dodeliti vrednosti

    novi->inf = B;

    novi->sledeci = pocetak_liste ;

    Da bi promenljiva pocetak_liste zaista pokazivala na poetak ponavlja se dodela

    pocetak_liste = novi

  • 4/3/2013

    86

    Dvostruko povezane liste

    Dvostruko povezane liste se prepoznaju po paru lanova pokazivaa na vor kojima se vorovi mogu povezati u oba smera.

    Deklaracija tipa DCVOR formira novo ime za tip strukture dcvor_st. Pokazivaci unapred ( sledeci) i unazad ( prethodni) pokazuju na tip DCVOR

    Deklaracija vora dvostruko povezane liste

    typedef struct dcvor_st

    {

    TIP inf;

    struct dcvor_st *sledeci, *prethodni ;

    } DCVOR;

    LCVOR *pocetak_liste*pocetak, *tekuci;

  • 4/3/2013

    87

    Rezime

    Algoritmi, struktura podataka, kontrola toka programa, funkcije i pokazivai predstavljaju sr programiranja. Programerska vetina podrazumeva poznavanje ovih pojmova i daje solidnu osnovu za osedaj trenutka kada i kako ih treba primeniti.

    Osobine jezika C++

    Tradicionalni nain programiranja je u osnovi proceduralan, zasnovan na funkcionalnoj dekompoziciji korisnikog, a zatim i programskog zahteva.

    Pri tome, podaci (atributi) koji se obrauju i operacije nad njima nisu grupisani zajedno u objektima kao to je to sluaj kod OBJEKTNO ORJENTISANOG PROGRAMIRANJA, ved su razbacani po programu.

  • 4/3/2013

    88

    Osobine jezika C++

    Osnovna ideja objektno orjentisanog programiranja je da sve te podatke (atribute ) izvuemo iz navedenih struktura i grupiemo po klasama zajedno sa relevantnim operacijama (funkcijama). Klase zatim struktuiramo hijerarhijski, formirajudi hijerarhijsko stablo klasa, vodedi rauna da atributi i operacije koji su zajedniki za sve klase budu na viim hijerarhijama, kako bi ih nie hijerarhije mogle koristiti preko mehanizma nasleivanja

    Osobine jezika C++

    Time se izbegava redundansa podataka i operacija. Tako uaurenim podacima i operacijama definiemo interface prema korisniku tih klasa a takoe i interface izmeu pojedinih klasa u hijerarhiji klasa, sakrivajudi kao implementacione detalje sve ono to nije bitno za njihovo koridenje. Na taj naiin stvaramo softverske komponente ( softverske ipove ) koje moemo nasleivati novim klasama i na taj nain iste ugraujemo u nove softverske proizvode.

  • 4/3/2013

    89

    Objektno Orijentisano Programiranje osnovni koncept

    apstrakcija (abstraction)

    nasleivanje (inheritance)

    polimorfizam (polymorphism)

    Klase su :

    Prototipski mehanizam za stvaranje objekta, omogudavajudi njihovu klasifikaciju po grupama sa istim osobinama

    Model za sve objekte koji se grade, Agregacija podataka (atributa) obino razliitog tipa i

    operacija, realizovanim funkcijama, nazvanim metodama koje obrauju te atribute

    Kolekcija vie objekata koji imaju istu strukturu Prototipski mehanizam stvaranja objekata,

    omogudavajudi njihovu klasifikaciju po grupama sa slinim osobinama

    Korisniki izveden tip podataka,

  • 4/3/2013

    90

    Objekti su:

    Nezavisne programske celine koje sadre metode (funkcije) i podatke

    Razliita pojavljivanja iste klase

    Promenljive koje se kreiraju iz struktura tipa klase

    Individualna realizacija klasa

    Klasi su pridodata svojstva:

    Enkapsulacije (sakrivanje, uaurenje) podataka (atributa i operacija nad njima)

    Metode (operacije nad atributima klase)

    Nasleivanje ( osobina da klase sa niih hijerarhijskih nivoa mogu naslediti atribute i metode klasa sa viih hijerarhijskh nivoa

  • 4/3/2013

    91

    Enkapsulacija, sakrivanje ili uaurenje podataka

    Klasa omogudava zatvaranje i sakrivanje podataka (atributa i metoda ) unutar klase.

    C++ omogudava tri nivoa zatite podataka.

    Public

    Private

    Protected

    Public:

    Kada je mogud m pristup svim lanicama objekta klase iz:

    bilo koje lanice te iste klase,ili bilo koje druge klase, ili bilo koje predefinisane funkcije (definisane u heder

    datotekama), ili bilo koje nae (sopstvene )funkcije, ili bilo kog izraza u glavnom programu ili izvan njega pod uslovom da je taj objekat u svom opsegu

    vaenja (scope)

  • 4/3/2013

    92

    Private:

    pristup podacima klase je dozvoljen samo lanicama klase tj metodama koje pripadaju toj klasi .

    Izuzetno, prisatup je dozvoljen specijalnim metodama ispred ijeg naziva se stavlja re FRIEND

    Protected:

    kada je mogud pristup svim podacima objekta bazne klase od strane bilo koje lanice izvedene klase ( klase koja nasleuje baznu klasu)

  • 4/3/2013

    93

    Metode

    Funkcije koje su uaurene sa podacima (atributima) unutar jedne klase nazivaju se metode. Iste su obino public, ali mogu biti i private i protected. Dve specijalne metode koje slue za inicijalizaciju i unitavanje objekata su:

    konstruktor i destruktor.

    Konstruktor

    Objekti mogu imati jednu ili vie specijalnih metoda koje se nazivaju konstruktorima, i koje se koriste za inicijalizaciju objekata prilikom njihovog deklarisanja kao pojavljivanja neke klase. Ime konstruktora nosi ime svoje klase.

  • 4/3/2013

    94

    Primer.......

    class AutomatNovca // Definisanje klase { double trezor; .................. // clan klase (podatak

    atribut) public : //Kontrola pristupa

    podacima automatNovca (double p) {trezor=p;} // Kada se neka

    metoda implementira u okviru same klase za istu se kaze da je inline Ista se tada ponasa kao makro.

    Void ulaganje (double); // clan klase (metoda) Double podizanje (double); // clan klase (metoda) };

    Destruktor

    Specijalna metoda destruktor koristi se za brisanje ( unitavanje ) objekata. Nosi ime svoje klase sa znakom ~ ispred imena.

    Destruktor se automatski poziva uvek kada objekat napusta svoj opseg scope vazenja

  • 4/3/2013

    95

    Ilustracija...

    class AutomatNovca // Definisanje klase { double trezor; .................. // clan klase (podatak atribut) public : //Kontrola pristupa podacima AutomatNovca (double p) {trezor=p;} // Kada se neka metoda

    implementira u okviru same klase za istu se kaze da je inline Ista se tada ponasa kao makro.

    ~AutomatNovca(void ) {cout'' destruktor se obavezno koristi kod dinamickih

  • 4/3/2013

    96

    Nasleivanje

    Nasleivanje se moe koristiti i viestruko po dubini

    Nasleivanje je kljuni deo objektno orjentisanog programiranja i omogudava dve vane prednosti kod programiranja:

    Visok stepen ponovnog koridenja istog koda reuseability

    Polimorfizam, koridenje istog naziva za funkcije koje rade sline stvari.