30
Uvod u C

Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

  • Upload
    ngodiep

  • View
    237

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Uvod u C

Page 2: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Uvod u C

Mikroprocesor razume samo binarnu informaciju i operi{e nad nizovima binarnih komandi koje nazivamo ma{inski kod. Me|utim, treba odmah naglasiti da je izuzetno te{ko pisati programe velikog obima na ma{inskom kodu. Zbog toga, najve}i broj programera danas koristi vi{e programske jezike (High Level Language -HLL). Vi{i programski jezici sa kojima se studenti naj~e{}e sre}u u toku studiranja su Fortran, Pascal, Basic, C i drugi, dok tipi~ni predstavnik jezika ni`eg nivoa je asemblerski jezik mikroprocesora 80x86 (80386, 80486, Pentium).

Za nas od interesa u ovom dodatku je savladavanje osnova koje programer treba da ima o C-u, kreiranje jednostavnih programa na ovom jeziku, i sagledavanje tehnika koje se koriste kod spajanja programa koji su delimi~no napisani na C-u a delimi~no na asemblerskom jeziku mikroprocesora 80x86.

Generisanje ma{inskog koda iz programa napisan na C-u Sekvenca dogadjaja koja je tipi~na za generisanje programa na ma{inskom kôdu, iz izvornog

programa napisanog na C-u, prikazana je na slici A1. Evidentna su tri procesa i odgovaraju}a softverska sredstva za njihovo izvr{avanje: Editor, Kompilator i Linker&loader.

Editor (kreiranje i

modifikacija kôda)

Kompilator (konverzija

izvornog kôda u ma{inski)

Linker&loader (dodaje ekstra informacije)

Bibliote~ki i drugi objektni

kôdovi

fajl izvornog kôda

PROG.C

fajl objektnog kôda

PROG.OBJ izvr{ni fajl

PROG.EXE

gre{ke i/ili upozorenja

Slika A1. Procesi editovanja, kompajliranja i linkovanja & loadovanja

Analizom Slike A1 zaklju~ujemo slede}e:

(a) Editor se koristi za uno{enje, odnosno kreiranje- i modifikovanje (ispravljanje gre{aka ili uno{enje nekih izmena u programu) fajla izvornog programa na C-u. U konkretnom slu~aju sa Slike A1 to je izvorna verzija programa (PROG.C) koju programer unosi u ma{inu, odnosno program koga je napisao programer.

(b) Kompilator konvertuje izvorni kôd u formu koju razume mikroprocesor, tj. vr{i konverziju u ma{inski kôd. Generisani fajl se naziva fajl objektnog kôda. Ovaj fajl nije direktno izvr{ni jer ne sadr`i sve potrebne informacije.

(c) Linker&loader preduzima poslednji korak. Ovaj korak podrazumeva umetanje dodatnog ma{inskog kôda u primarni prevedeni program, a to sa ciljem da se omogu}i kori{}enje uredjaja kakvi su tastatura, monitor, i drugi. Linkovanjem se vr{i povezivanje fajla izvornog programa tipa objektni kôd sa drugim fajlovima tipa objektni kod koji se uzimaju iz biblioteke. Rezultuju}i fajl se predaje loaderu koji generi{e izvr{ni program (PROG.EXE).

1

Page 3: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Ako se u toku procesa kompilacije ili linkovanja&loadovanja jave gre{ke ili upozorenja (errors / warnings), neophodno je ukloniti ih. To se posti`e modifikacijom izvornog kôda. Nakon izvr{ene modifikacije, procesi kompilacije-, odnosno, linkovanja&loadovanja moraju se ponovo sprovesti. Treba naglasiti da upozorenja (warnings) koja se jave u toku procesa kompilacije / linkovanja&loadoanja ne onemogu}avaju obavezno generisanje izlaza Kompilator-a i Linker&loader-a. Me|utim, nepravilnosti tipa gre{ka (error) zaustavljaju njihov rad. To zna~i da je u toku procesa kompilacije i linkovanja&loadovanja neophodno eliminisati sve gre{ke, ali takodje, sigurnosti radi, preporu~ljivo je odstraniti i sva upozorenja.

Pretprocesor Pretprocesor se isporu~uje kao sastavni deo C kompilatora. On prihvata posebne iskaze koji su

napisani zajedno sa C iskazima. Na~in kori{}enja pretprocesora prikazan je na Slici A2.

Pretprocesor

Kompilator Linker&loader fajl izvornog

kôda

procesirani fajl izvornog

kôda

izvr{ni fajl

zamenjuje makroe iz #define iskaza

fajl objektnog

kôda

uklju~uje fajlove iz #include direktiva

(stdio.h, math.h i dr.)

bibliote~ki i drugi objektni kôd

Slika A2 Operacije nad izvornim programom kod generisanja izvr{nog fajla

U su{tini, pretprocesorske naredbe ne predstavljaju deo programskog jezika C, ve} su date uz svaki C prevodilac kao dodatno programsko orudje.

Svaka pretprocesorska naredba po~inje znakom "#". Pre prevodjenja izvornog programa, prevodilac programskog jezika C poziva Pretprocesor koji pretra`uje izvorni program i, na osnovu pronadjenih pretprocesorskih naredbi, zamenjuje tekst u izvornom programu.

Pretprocesorske naredbe ne pripadaju direktno programskom jeziku C, njihova sintaksa se ne podudara sa sintaksnim pravilima koja va`e u C-u. Na primer, pretprocesorske naredbe se ne zavr{avaju znakom ";", kao {to je to slu~aj sa naredbama u C-u, a oblast va`enja ovih naredbi predstavlja samo izvorni program u kome su definisane.

Pretprocesorske naredbe mogu da stoje na bilo kom mestu u izvornom programu. Njihovo dejstvo se ne prote`e na ceo izvorni program, ve} samo na deo od njihovog pojavljivanja pa dalje do kraja programa.

Broj pretprocesorskih naredbi koje jedan C prevodilac podr`ava zavisi od specifi~ne implemenatacije. Najtipi~nije, predlog ANSI-standarda, su:

#define #include #if #if def #ifndef #elif #else #endif #endef

2

Page 4: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Naredba #define

Pretprocesorska naredba # define se koristi za definisanje simboli~kih konstanti i makro-a. Op{ti oblik pretprocesorske naredbe za definisanje simboli~kih konstanti je:

#define simb_konst zn_niz

gde je sim_konst simboli~ka konstanta, ~ije ime predstavlja neki identifikator, a zn_niz je znakovni niz. Simboli~ke konstante se obi~no pi{u velikim slovima abecede, da bi se razlikovale od promenljivih (izvorni program je lak{e razumljiv). Op{ti oblik # define naredbe za definisanje makro-a je dat sa:

#define ime (par_1, par_2,...) lista_znak_nizova

gde ime predstavlja ime makro-a; par_1, par_2,... su formalni parametri makro-a; a lista_znak_nizova predstavlja jedan ili vi{e znakovnih nizova, kojima se zamenjuje svako pojavljivanje imena makro-a u izvornom programu.

Primeri

# define PI 3.14 # define BEGIN # define END # define _SQR(x) ((x)*(x))

Naredba # include

Programi ve}eg obima ~esto sadr`e deklaracije i #define naredbe koje se istovremeno koriste u vi{e izvornih programa. Takve naredbe i deklaracije se naj~e{}e grupi{u u posebne fajlove, koje se zatim ume}u u izvorni program, pre njegovog kompajliranja. Umetanje fajlova u C-u se vr{i pomo}u pretprocesorske naredbe #include koja mo`e da ima slede}a dva oblika:

#include "ime fajla"

#include <ime fajla>

U prvom slu~aju pretprocesor pretra`uje direktorijum korisnika i zamenjuje naredbu sadr`ajem odgovaraju}eg fajla. Ukoliko se fajl sa datim imenom ne nalazi u direktorijumu korisnika, pretprocesor nastavlja pretra`ivanje unapred odredjenih sistemskih biblioteka.

Na primer, pretprocesorska direktiva

#include "main.h"

zameni}e naredbu #include sadr`ajem fajla main.h. Simboli invertovani navodnici ukazuju pretprocesoru da se fajl main.h nalazi u teku}em radnom direktorijumu. U drugom slu~aju pretprocesor pretra`uje samo unapred odredjene sistemske biblioteke i zamenjuje naredbu #include nadjenim fajlom datog imena.

Tipi~an primer je:

#include <stdio.h>

Smisao ove naredbe je slede}i: Svaki izvorni program koji koristi funkcije ulaza-izlaza, mora biti povezan sa standardnom programskom bibliotekom. Veza izmedju izvornog programa i standardne programske biblioteke se usprostavlja pomenutom pretprocesorskom naredbom. Fajl stdio.h predstavlja tipi~ni header fajl koji sadr`i deklaracije makroa i konstanti, potrebne kod ulaza, odnosno izlaza podataka. Pored toga, stdio.h sadr`i i definicije ve}ine standardnih ulazno/izlaznih funkcija. Prilikom izvr{enja nekog C-programa, operativni sistem vr{i automatsko otvaranje tri standardna fajla. To su: standardni ulazni fajl, standardni izlazni fajl, i standardni fajl za gre{ke.

Tipi~ni header fajlovi sa opisom njihove funkcionalnosti prikazani su na Slici A3.

3

Page 5: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

header fajl komentar ctype.h klasifikacija karaktera i konverzija math.h matemati~ke funkcije stddef.h defini{e nekoliko op{tih tipova podataka i makro-a stdio.h U/I rutine, kakve su ulaz sa tastature, izlaz na CRT displeju i manipulisanje fajlova

(stdio je skra}enica od standardni ula/izlaz)

stdlib.h ostale rutine string.h funkcije za manipulaciju sa nizovima time.h finkcije koje vode ra~un o vremenu

Slika A3 Tipi~ni header fajlovi

Struktura programa Uobi~ajeno, programi se dele na ve}i broj pod-zadataka, odnosno, nezavisnih celina koje

nazivamo funkcije. Funkcije predstavljaju jasno definisane delove kôda koji obavljaju pojedine operacije. Ove se celine ne mogu zasebno izvr{avati. Jezik C ne pravi razliku izmedju potprograma i funkcija kao {to je to slu~aj kod drugih programskih jezika.

Izvorni program napisan na C-u mo`e da sadr`i jednu ili vi{e funkcija. Svaka funkcija se sastoji od vi{e opisnih i izvr{nih naredbi. Na Slici A4, globalna funkcija main(), koja je zajedni~ka za sve izvorne programe, ozna~ava po~etak programa, a tako|e, poziva druge funkcije.

main( ) { }

func5 ( ) { }

func6 ( ) { }

func7 ( ) { }

func4 ( ) { }

func3 ( ) { }

func2 ( ) { }

func1( ) { }

Slika A4 Modularna struktura programa

Svaka funkcija programskog jezika C mora biti definisana. Definicija funkcije sadr`i slede}e elemente:

a) ime funkcije b) telo funkcije c) listu parametara d) deklaraciju parametara e) tip rezultata funkcije f) klasu memorije funkcije

Ime i telo funkcije su obavezni elementi definicije, dok se ostali elementi mogu izostaviti.

4

Page 6: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Format funkcije ima slede}i izgled:

[klasa memorije] [tip rezultata] ime funkcije ([lista parametara]) [deklaracije parametara] {

telo funkcije }

Svi elementi napisani u uglastim zagradama se mogu izostaviti.

Ime funkcije mo`e biti dugo do 312 karaktera (identifikatora, ili znakova). Iza svakog imena funkcije sledi skup malih zagrada. Funkcijama se ne smeju dodeljivati rezervisane re~i. Prvi karakter imena mora biti slovo ('a'-'z', 'A'-'Z') iza koga slede ostala slova, cifre, znak '_' ili '$'. Drugi znaci kakvi su blanko-znak ili tabulator, su neva`e}i. Sa ciljem da ime funkcije ima ~itljivu formu, praksa je da se koriste znaci '_'. Na Slici A5 prikazana su neka va`e}a i neva`e}a imena funkcija.

ime funkcije va`e}i napomene adr_imp_RC() da korektno imenovana funkcija jer obja{njava {ta ta funkcija obavlja odr sred vred() ne koriste se blanko znaci izmedju imena 3_tacke ne po~inje neva`e}im karakterom prik_mem ne nema male zagrade na kraju imena funkcije $znak() ne po~inje neva`e}im znakom izrsrnkor() da te{ko je pro~itati ime funkcije izr_srn_kor(n) da bolje u odnosu na prethodni slu~aj Izr_Srn_Kor(n) da alternativni stil za ozna~avanje po~etka novih re~i do() ne klju~na re~ u C-u

Slika A5 Imena u C-u

Telo funkcije predstavlja u stvari blok naredbi, i to skup programskih naredbi koje ~ine jednu celinu. U bloku naredbi mogu da se pojave kako izvr{ne, tako i opisne naredbe. Blok naredbi se ozna~ava parom viti~astih zagrada, pri ~emu znak { stoji na po~etku, a znak } na kraju bloka. Blok naredbi se interpretira kao jedna jedini~na naredba. Telo funkcije mo`e biti i prazno, tj. ne mora da sadr`i opisne niti izvr{ne naredbe.

Nakon imena funkcije sledi lista parametara funkcije i ona je uvek data unutar malih zagrada. U toku definicije funkcije ovi parametri se nazivaju formalni, a koriste se za rezervisanje mesta za prave parametre sa kojima funkcija operi{e nakon njenog pozivanja. Vrednosti koje se dodeljuju formalnim parametrima kod pozivanja jedne funkcije se nazivaju stvarni parametri. U zavisnosti od na~ina dodeljivanja vrednosti formalnim parametrima prilikom pozivanja jedne funkcije, razlikujemo pozivanje po vrednosti i pozivanje po referenci. Ukoliko je uz ime funkcije data i neprazna lista parametara, svakom od parametara u listi mora se dodeliti neki tip. Dodeljivanje tipova, tj. deklaracija parametara se uvek vr{i odmah posle navodjenje imena funkcije, a pre pojavljivanje znaka '{', koji ozna~ava po~etak tela funkcije.

Tip rezultata funkcije odredjuje interni oblik i veli~inu promenljive, ~iju vrednost pozvana funkcija vra}a. U cilju poja{njenja nekih do sada iznetih konstatacija analizira}emo strukturu jednostavnog programa prog1_1.c.

/*prog1_1.c # include <stdio.h> int main(void) { puts ("Ovo je primer"); return(0); }

5

Page 7: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Ovaj program koristi funkciju puts() za prikaz teksta "Ovo je primer". Funkcija puts() je standardna funkcija koja se koristi za prikaz teksta na displeju; header fajl koji se opisuje ovu funkciju je stdio.h, a njegovo uklju~ivanje se obavlja direktivom #include. Kada se na kraju jednog iskaza doda znak ";", dobija se elementarna naredba u C-u. Znak "{" ukazuje na po~etak, a "}" na kraj kôdnog bloka. Komentari u programu se nalaze izmedju po~etnog idetifikatora "/*" i identifikatora kraja komentara "*/". Svi programi napisani na C-u imaju funkciju main(), koja defini{e ulaz u program. Funkcija main() se mo`e locirati bilo gde u programu ali je uobi~ajeno da se nalazi na vrhu fajla, ako ni zbog ~ega drugog, ono da bi se lak{e uo~ila. Klju~na re~ int koja prethodi funkciji main() defini{e da program vra}a vrednost operativnom sistemu (ili pozivnom programu). U ovom slu~aju povratna vrednost je nula (return(0)). Saglasno standardu, ne-nulta povratna vrednost se koristi kada izvr{avanje programa treba prekinuti usled gre{ke. Povratna vrednost u ovom slu~aju ukazuje na razlog za{to je izvr{enje programa prekinuto. Specijalni tip podatka void koji se nalazi unutar zagrada funkcije main() defini{e da ne postoji komunikacija izmedju operativnog sistema i programa kada se on izvr{ava po prvi put (ne prenose se vrednosti u programu).

Na Slici A6 prikazano je kako se u okviru funkcije main() defini{e po~etak i kraj programa.

vrednost koja se predaje operativnom sistemu (ili pozivnom programu)

ne predaju se parametri od strane operativnog sistema (ili pozivnog programa)

po~etak programa

operativnom sistemu (ili pozivnomprogramu) se vra}a vrednost 0

kraj programa

int main (void) { return(0); }

Slika A6 Po~etna i krajnja ta~ka programa

Napomena: Klasa memorije jednog podatka odredjuje vreme njegovog postojanja u programu. Podaci kod C-a mogu da pripadaju jednoj od slede}e ~etiri klase:

• auto - ima lokalnu oblast va`enja i automatski ciklus trajanja • register - va`i isto kao i za auto samo {to C sme{ta promenljivu u jedan ili ve}i broj registara • static - podatak mo`e biti deklarisan unutar ili van funkcije • extern - podatak u okviru ove klase ima globalno neograni~enu oblast va`enja i

stati~ki ciklus va`enja

Oblast va`enja podatka je onaj deo programa, u kome ime tog podatka ozna~ava uvek istu veli~inu. Ciklus trajanja jednog podatka ozna~ava vremenski period postojanja memorije, u kojoj je taj podatak sme{ten.

Tip void se javlja samo kod funkcija. Za neku funkciju ka`emo da je tipa void ako ne vra}a nikakvu vrednost.

Konstante

Konstante predstavljaju veli~ine koje ne menjaju vrednost tokom izvr{enja programa. Kod C-a postoje slede}i tipovi konstanti:

1) celobrojne, 2) Konstante predstavljene u pokretnom zarezu, 3) znakovne, 4) literali,

6

Page 8: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

5) simboli~ke konstante.

Celobrojna konstanta predstavlja eksplicitnu datu celobrojnu vrednost, postoje tri vrste:

a) decimalne konstante primeri su: 14 413 1268

b) oktalne konstante se predstavljaju jednom ili vi{e cifara oktalnog brojnog sistema kojima prethodi nula.

Primeri su: 010 (odgovara decimalnom broju 8) 033 (odgovara decimalnom broju 27)

c) heksadecimalne konstante predstavljaju se jednom ili sa vi{e heksadecimalnih cifara kojima prethodi nula i malo slovo (mo`e i veliko) X.

Primeri su: 0xD (odgovara decimalnom broju 13) 0x11 (odgovara decimalnom broju 17)

Sva tri oblika celobrojnih konstanti predstavljaju uvek pozitivne vrednosti. Ukoliko se `eli predstaviti negativna celobrojna vrednost, ispred konstante se pi{e znak "-".

Konstantama predstavljenim u pokretnom zarezu mogu}e je dodeliti bilo koju vrednost iz skupa realnih brojeva, {to zavisi od mogu}nosti predstavljanja na datom ra~unaru.

Primeri su: 0.000 000 001 = 1E - 9 1 2324 320 = 1.23432E6 1. 000 000 000 000 = 1E12

Znakovna konstanta se predstavlja jednim jedinim znakom koji se pi{e izmedju dva apostrofa. Taj znak mo`e biti slovo, cifra, ili neki specijalni znak. Naj~e{}e se koriste ASCII kodirani znaci.

Primeri su: 'a' 'B'

Literali predstavljaju znakovne nizove ~ija je vrednost eksplicitno data. Primeri su: "AVION" "ELEF"

Simboli~ka konstanta je konstanta kojoj je dodeljeno neko ime. Simboli~ke konstante se defini{u pretprocesorkom naredbom #define.

#define SIMA 413

Promenljive

Promenljiva je predstavljena simboli~kim imenom neke memorijske lokacije ~iju je vrednost mogu}e menjati. Svaka promenljiva ima tri atributa: tip, oblast va`enja i ciklus va`enja. Ime svake promenljive predstavlja jedan identifikator. C-tip promenljive se mora deklarisati pre njenog prvog kori{}enja.

U C-u postoje slede}i osnovni tipovi podataka:

tip kori{}enje char jedan znak 'a', '1', itd. int ozna~ena celobrojna vrednost float FP broj u obi~noj preciznosti double FP broj u duploj preciznosti

Postoje tri osnovna pro{irenja za sva ~etiri tipa podataka a to su:

7

Page 9: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

• short • long • unsigned

Tipi~ni opsezi sa sve tipove podataka su:

tip bajtova u memoriji opseg char 1 -128 do 127 unsigned char 1 0 do 255 int 2

ili 4

-32768 do 32767 ili -2 147 483 648 do 2 147 483 647

unsigned integer 2 ili 4

0 do 64 535 0 do 4 294 967 295

short int 2 -32768 do 32767 long int 4 -2 147 483 648 do 2 147 483 647 float 4 (tipi~no) +3.4*10 -38 do + 3.4*10 38 double 8 (tipi~no) +1.7*10 -308 do + 1.7*10 308 long double 10 (tipi~no) +3.4*10 -4932 do + 1.1*10 4932

Kako smo ve} napomenuli, za memorisanje podataka program koristi promenljive. Pre nego

{to program mo`e da koristi promenljivu, njeno ime i tip moraju biti deklarisani. Tipi~ne deklaracije su oblika:

int br_koraka, bit_maska; float otpornik1, otpornik2; char znak1, znak2

Primer a kojim se odredjuje ekivalentna paralelna otpornost dva otpornika ~ije su vrednosti 1000 i 500 ohm ima slede}u formu:

#include <stdio.h> int main(void) {

float otpornik1, otpornik2, ekv_otpornik; otpornik1 = 1000,0; otpornik2 = 500,0; ekv_otpornik = 1.0/(1.0/otpornik1+1.0/otpornik2); printf("Evivalentna otpornost je %f n", ekv_otpornik); return(0);

}

Ovaj program sadr`i tri FP deklaracije promenljivih otpornik1, otpornik2, i ekv_otpornik. Takodje, mogu}e je dodeliti inicijalnu vrednost promenljivoj u ta~ki (mestu) programa gde se ona deklari{e, prethodni program bi}e sada oblika:

#include <stdio.h> int main(void) {

float otpornik1 = 1000,0, otpornik2 = 500,0, ekv_otpornik; ekv_otpornik = 1.0/(1.0/otpornik1+1.0/otpornik2); printf("Evivalentni otpornik je %f n", ekv_otpornik); return(0);

}

8

Page 10: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Operatori

Operatori predstavljaju simbole koji ozna~avaju odredjenu operaciju i koji povezuju jedan ili vi{e opernada u jedan izraz (aritmeti~ki, logi~ki, i td.). U zavisnosti od broja operanada koje jedan operator povezuje, razlikujemo unarne, binarne, ternarne i druge operatore. Osim broja operanada koje povezuje, svaki operand ima jo{ dva atributa: prioritet i asocijativnost.

^etiri glavna tipa operatora kod C-a su:

• aritmeti~kik • logi~ki • operatori za operacije nad bitovima (bitwise) • relacioni • operatori poredjenja.

Aritmeti~ki operatori

Aritmeti~ki operatori operi{u nad numeri~kim vrednostima. Osnovne aritmeti~ke operacije a shodno tome i odgovaraju}i operatori su sabiranje (+), oduzimanje (-), mno`enje (*), deljenje (/) i deljenje po modulu (%). Kod deljenja po modulu dobija se celobrojni ostatak deljenja.

Operatori dodeljivanja vrednosti

Svaka promenljiva, koja se koristi u nekom programu, mora biti eksplicitno ili implicitno deklarisana i mora joj se dodeliti neka vrednost.

U programskom jeziku C postoje dve grupe operatora dodeljivanja vrednosti:

(a) elementarni operator - predstavlja se simbolom "=" tipi~an primer: broj1 = 12; (b) slo`eni operatori - predstavljaju specifi~nost programskog jezika C. Postoje ukupno

deset slo`enih operatora dodeljivanja. Op{ti oblik slo`enog operatora je: op =

gde op mo`e biti jedan od slede}ih simbola:

+ - * / % << >> & | i ^.

Op{ti izraz je oblika:

a op = b

gde op predstavlja jedan od gore navedenih simbola.

Slede}i primeri prikazuju na~in kori{}enja ovih operatora:

iskaz ekvivalenat x +=3.0; x = x+3.0; b - =a; b = b-a proizvod * = a-5; proizvod = proizvod * (a-5) maska *=2; maska = maska*2 niz >>=3; niz = niz>>3; der |= 1234; der = der | 12324;

Operatori umanjivanja/pove}avanja vrednosti

Kod velikog broja aplikacija javlja se potreba za inkrementiranje ili dekrementiranje promenljive za 1. Kod C-a koriste se slede}a dva specijalna operatora:

-- operator za umanjivanje vrednosti za 1 – dekrementiranja, ++ kao operator za pove}anje vrednosti za 1 – inkrementiranja.

9

Page 11: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Oba operatora se mogu koristiti na dva na~ina: kao prefiksni (efekat je pre-inkrement/ dekrement) ili postfiksni (efekat je post-inkrement/dekrement) Slede}i primeri pokazuju na~in njihovog kori{}enja.

iskaz ekvivalent zbir ++; zbir = zbir +1 i --; i = i-1

Naredbi: alfa = alfa *--beta; odgovara niz naredbi:

beta = beta-1; alfa = alfa*beta;

Dok naredbi: alfa = ala*beta --; odgovara niz naredbi:

alfa = alfa*beta; beta = beta-1;

Primer

Nakon izvr{enja slede}eg koda, promenljive i, j, k i z primi}e vrednosti 10, 12, 13, 10 i 10, respektivno. Iskaz z = --i dekrementira i i dodeljuje ovu vrednost promenljivoj z (pre-inkrement), dok y = i++ dodeljuje vrednost i promenljivoj y a nakon toga inkrementgira i (post-inkrement).

i=10; j=11; k=12; y= i++; /* dodeljuje i promenljivoj y a zatim inkrement i */ z = --i; /* dekrementira i a zatim dodeljuje i promenljivoj z*/ j++; /* inkrementira i */ ++k; /* inkrementira k */

Primer

Tipi~ni primeri kori{}enja aritmeti~kih operatora su dati u slede}oj tabeli: operator operacija primer - oduzimanje ili minus 6-5 1 + sabiranje 4+2 6 * mno`enje 4*3 12 / deljenje 6/3 2 % moduo 7%2 1 += saberi izjewdna~i x+=3 +>x=x+3 -+ oduzmi izjedna~i x==2 +> x+x-2 /+ podeli izjedna~i x/=y => x=x/y *= pomno`i izjedna~i x*=12 => x=x*12 = dodela x=1 ++ inkrementiraj broj++=> broj+broj+1 -- dekrementiraj raz-- => raz+raz-1

Operatori poredjenja

Operatori poredjenja odredjuju da li je rezultat komparacije TRUE ili FALSE. U programskom jeziku C postoji {est razli~itih operatora poredjenja:

< (manje) <= (manje ili jednako) > (ve}e)

10

Page 12: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

>= (ve}e ili jednako) == (jednako) != (nije jednako).

Svaki operator poredjenja poredi dva operanda, pri ~emu operandi, mogu biti osnovnog tipa int ili float, odnosno, pokaziva~i koji pokazuju na objekte ovih osnovnih tipova. Primeri kori{}enja operatora poredjenja su:

Operator funkcija primer uslov TRUE

> ve}e od (b>a) kada je b be}e od a >= ve}i ili jednak (a>=4) kada je a ve}i od ili jednak 4 < manji od (a<b) kada je a manji od b

<= manji ili jednak (a<=4) kada je a manji od ili jednak b == jednak sa (a==2) kada je a jednako 2) != nije jednako sa (a!=b) kada a nije jednako sa b

Logi~ki operatori

U programskom jeziku C postoje tri logi~ka operatora:

! (negacija) && (logi~ka AND) || (logi~ko OR)

Operator negacije je unarni operator, dok su ostala dva operatora binarna. Vrednost jednog operanda u logi~koj operaciji, odnosno rezultata jedne logi~ke operacije mo`e biti TRUE ili FALSE. Ako je brojna vrednost jednog operanda jednaka 0, njegova logi~ka vrednost bi}e FALSE, ina~e je TRUE. Rezultat AND (&&) operatora za operaciju:

operand1 && operand2

je:

operand1 operand2 rezultat FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE TRUE

Logi~ki rezultat OR (||) operatora za izkaz:

operand1||operand2

daje:

operand1 operand2 rezultat FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE

Logi~ki rezultat NOT (!) operatora za iskaz:

!operand

daje:

11

Page 13: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

operand rezultat FALSE TRUE TRUE FALSE

Ilustracije radi, ako promenljiva a ima vrednost 1 a promenljiva b takodje vrednost 1 tada }emo imati:

iskaz rezultat (a==1)&&(b==1) TRUE (a>1)&&(b==1) FALSE (a==10) (b==1) TRUE !(a==12) TRUE

Sa ciljem da se ostvari `eljena funkcionalnost, ~esto se u programima javlja potreba za grupisanjem po nekoliko operatora. Tipi~ni primeri su slede}i:

operator/funkcija primer uslov TRUE && AND ((x==1)&&(y<2)) kada je x=1 AND y<2 OR ((a!=b) (z>0)) kada je a =b OR a>0 ! NOT (!(a>0)) kada a nije ve}e od 0

Operatori za operacije nad bitovima

Programski jezik C za razliku od ve}ine frugih vi{ih programskih jezika, poseduje operatore za operacije nad bitovima. Ovi opeatori su sli~ni logi~kim operatorima, sa tom razlikom {to operi{u direktno nad individualnim bitovima operanada, dok logi~ki operatori odredjuju da li je uslov TRUE ili FALSE. U C-u postoji {est operatora za operacije nad bitovima:

∼ (potpuni komplement) << (logi~ko pomeranje ulevo) >> (logi~ko pomeranje udesno) & (logi~ko AND za bitne nizove) ^ (logi~ko ExOR za bitne nizove) | (logi~ko OR za bitne nizove

U slede}oj tabeli prikazani su rezultati AND, OR, ExOR operacije nad bitovima nad dva bita Bit1 i Bit2.

Bit1 Bit2 rezultat rezultat rezultat AND OR ExOR 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0

Primer

Neka su date dve decimalne 8-bitne neozna~ene celobrojne vrednosti 58 i 41. Kakav }e se rezultat dobiti ako se nad njima primene AND, OR i ExOR operacije nad bitovima?

Odgovor: 58 & 41 = 40 (tj. 0010 1000 binarno) 58 1 41 = 59 (tj. 0011 1011 binarno) 58 41 = 19 (tj. 000 10011 binarno)

12

Page 14: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Primer Ako je y=59 (00111011), tada y>>3 da}e kao rezultata 7 (00000111, dok y<<2 da}e kao

rezultat 236 (11101100).

Pregled osnovnih operatora na bitovima prikazani su u slede}oj tabeli:

operator funkcija primer & AND c=A&B | OR f=Z|Y || ExOR h=5||f ∼ jedini~ni komplement x=∼y >> pomeranje udesno x=y>>1 << pomeranje ulevo y=y<<2

U slede}im primerima prikazane su skra}ene forme kori{}enja operacije nad bitovima:

i<<=2 ekvivalentno sa i=i<<2 pomera bitove promenljive i za dve bit pozicije ulevo; maska|= 26 ekvivalentno sa maska=maska|26 - OR bitova promenljive maska sa 265 decimalno; vrbit||= 22 ekvivalentno sa vrbit=vrbit||22 - ExOR bitova promenljive vrbit sa 22.

Prioriteti i asocijativnost operatora Postoje nekoliko pravila koja se ti~u operatora.

• Dva operatora, sa izuzetkom operatora dodele, ne treba nikad postaviti jedan pored drugog. Na primer, x*%3 je neva`e}e

• Grupisanja se formiraju pomo}u zagrada, tako da se, sve {to se nalazi unutar zagrade, izra~unava kao prvo. Za postavljanje skupa prioriteta mogu se koristiti ugne`djene zagrade

• Operatore karakteri{e nivo prioriteta ili prethodjenja. Prvo se procenjuju operatori najvi{eg prioriteta; Za slu~aj da dva operatora imaju isti prioritet tada se prvo procenjuje operator na levoj strani. Prioritet i asocijativnost operatora dati su u slede}oj tabeli.

prioritet operatori simboli asocijativnost 1 (najvi{i) funk.poziv/izbor ( ) . -> sleva nadesno 2 unarni *&- ++ -- sizeof sdesna nalevo 3 mno`enje/deljenje * / % sleva nadesno 4 sabiranje/oduzim. + - sleva nadesno 5 logi~ko pomeranje << >> sleva nadesno 6 op. poredjenja < > <= >= sleva nadesno 7 jednakost/nejedn. == / != sleva nadesno 8 log. i nad bitov. & sleva nadesno 9 isklj.logi~ko ili sleva nadesno 10 log. ili za bitove sleva nadesno 11 logi~ko i && sleva nadesno 12 logi~ko ili sleva nadesno 13 operator granjanja ?: zdesna nalevo 14 dodelj. vrednosti = op= zdesna nalevo 15 (najni`i) comma-operator ' sleva nadesno

13

Page 15: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Primer

Koriste}i operatore prethodjenja (), slede}i primer prikazuje kako se vr{i odredjivanje rezultata (koristi se simbol => radi obele`avanja koraka kod odredjivanja rezultata):

23 + 5 % 3 / 2 <<1 => 23 + 2 / 2 << 1 => 23 + 1 << 1 => 23 + 2 => 25 =>

Konverzija tipova podataka Kod dvo-operanskih operacija koje koriste razli~ite tipove podataka, va`e slede}a pravila koja

se odnose na to koji se tip podatka dodeli rezultatu:

(1) Bilo koji znakovni tip (kakav je char, unsigned char, signed char, i short int) konvertuje se u int

(2) Ina~e, kada je jedan od operanada tipa long double, drugi operand se takodje konvertuje u long double

(3) Ina~e, kada je jedan od operanada tipa double i drugi operand se konvertuje u double

(4) Ina~e, kada je jedan od operanada float i drugi operand se konvertuje u float

(5) Ina~e, kada je jedan od operanada unsigned long i drugi operand se konvertuje u unsigned long

(6) Ina~e, kada je jedan od operanada long int i drugi se konvertuje u long int

(7) Ina~e, kada je jedan od operanada unsigned int i drugi operand se konvertuje u unsigned int

(8) Ina~e, oba operanda su tipa int

Tip promenljive se mo`e privremeno promeniti koriste}i tehniku poznatu kao casting. Modifikator cast koji prethodi operandu i tipu podatka defini{e se u zagradama. Tipi~ni modifikatori su (float), (int), (char) i (double).

Slede}i program prikazuje kako se dele dve celobrojne vrednosti b i c, a rezultata sme{ta u a. S obzirom da su b i c celobrojne vrednosti primenjuje se pravilo 8. Rezultat }e biti 1, a obavi}e se deljenje celobrojnih vrednosti

# include <stdio.h> int main(void) { float a; int b,c; b=6; c=11; a=c/b; print f("a=%f", a); return(0)

}

Slede}i program obavlja FP deljenje jer je promenljiva c recast na float, s toga se primenjuje pravilo 4

#include <stdio.h> int main(void) { float a; b=6; c=11;

14

Page 16: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

a=(float) c/b' print f("a=%f", a); return(0)

}

Klju~ne re~i ANSI-C koristi ve}i broj klju~nih re~i (ima ih 32). Ove re~i se ne mogu koristiti kao

programski identifikatori i pi{u se malim slovima abecede. Lista klju~nih re~i je slede}a:

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

15

Page 17: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Ulaz i izlaz Programski jezik C ne predvi|a specijalne iskaze za obavljanje ulazno-izlazne aktivnosti. Za

razliku od FORTRAN-a, na primer, koji ima komande READ i WRITE definisane kao deo jezika, sve ulazno-izlazne operacije u jeziku C se obavljaju kori{}enjem posebnih funkcija iz sistemske biblioteke. Po{to ove funkcije nisu deo C-a, mogu se razlikovati od sistema do sistema, kako po imenu, tako i po na~inu funkcionisanja. Medjutim, neke funkcije, kao printf i scanf, su manje-vi{e standardizovane i postoje (sa istim imenom i na~inom funkcionisanja) u svim C prevodiocima. Pored ove dve funkcije, i mnoge druge su deo standardne sistemske biblioteke C prevodilaca. Fajl stdio.h sadr`i definisane makroe, strukture, promenljive i konstante, koje su neophodne za funkcionisanje ulazno-izlaznih funkcija. Zato se fajl stdio.h mora uklju~iti u program iskazom:

#include <stdio.h>

U daljem tekstu ukaza}emo na neke standardne ulazno-izlazne funkcije prisutne u najve}em broju C sistema.

Izlazne funkcije Postoje tri osnovne izlazne funkcije:

• printf ("format", arg1, arg2,..., argn)

generi{e se ({tampa/prikazuje) na izlazu formatirani tekstualni niz definisan od strane "format" koriste}i argumente arg1,...,argn;

• puts ("niz")

na standardnom izlazu generi{e se tekstualni niz koji se pridru`uje novoj liniji

• putchar (ch)

na standardnom izlazu generi{e se jedinstveni karakter (ch)

Funkcijom printf(),standardnom izlazu (displeju) predaje se formatirani niz. Niz mo`e da sadr`i formatirane promenljive i specijalne upravlja~ke znake, kao {to je nova linija ('n'), blanko znak ('b'), tabulator ('t'), i druge kako je to dato u slede}oj tabeli:

znak funkcija \" dvostruki navodnici (") \' jednostruki navodnici (') \\ kosa crta (\) \nnn ASCII znak u oktalnom kodu, tj. 041 daje na prikazu '!" \0xnn ASCII znak u heksadecimalnom kodu, tj. 0x41 daje na prikazu 'A' \a generi{e se zvuk zvona \b blanko (blanko prostor odjednog mesta) \f form-feed (ASCII upravlja~ki karakter) \n nova linija (upravlja~ki karakter line-feed) \r carriage return (upravlja~ki karakter) \t horizontalna tabulacija

Slika A5 Specijalni upravlja~ki znaci (ili escape sekvenca)

Parametri koji se predaju funkciji printf() nazivaju se argumenti, a izdvajaju se zarezima. Na standardnom izlazu funkcija puts() ispisuje tekstualni niz i ne koristi formatirane promenljive. Na kraju teksta automatski se pridodaje nova linija.

16

Page 18: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Specijalni znaci

U programskom jeziku C uobi~ajeno je (videti Sliku A5) da specijalni upravlja~ki znaci koriste kosu crtu (backslash) kako bi informisali program o izla`enju iz okvira (escape) u odnosu na na~in kako te znake treba normalno interpretirati.

Na primer, carriage return ('\r') se koristi da postavi pokaziva~ prikaza teku}eg karaktera na po~etak linije (kod najve}eg broja displeja to je krajnja leva pozicija na ekranu). Upravlja~ki karakter horizontalni tab ('\t') pomera teku}u poziciju znaka unapred za jedan tabulatorski korak, itd.

Upravlja~ki znaci za konverziju

Upravlja~ki znaci (karakteri) za konverziju opisuju format kojim se ukazuje kako nizovna poruka koristi druge argumente. Kako printf() sadr`i vi{e od jednog argumenta, tada se format izlaza defini{e znaka tipa procenat (%) iza koga sledi formalni opis znaka.

Ozna~ena celobrojna vrednost koristi konverziono upravlja~ki znak %d, neozna~ena celobrojna vrednost %u, FP vrednost koristi %f, a kod nau~ne notacije se koristi %e. Na Slici A6 prikazani su konverziono-upravlja~ki znaci koji su naj~e{}e u upotrebi.

operator format %c jedan znak %d ozna~ena decimalna celobrojna vrednost %e na~ni FP (floating point) %f FP %u neozna~ena decimalna celobrojna vrednost %s niz znakova (karaktera) %o neozna~ena oktalna celobrojna vrednost %% {tampaj znak% %x neozna~ena heksadecimalna celobrojna vrednost %g mo`e biti FP ili nau~na notacija

Slika A6 Upravlja~ki znaci za konverziju

Na Slici A7 prikazan je primer iskaza printf() sa ~etiri argumenta. Prvi argument je niz-poruka iza koga slede parametri koje treba {tampati. U konkretnom slu~aju, parametri su vred1, vred2, i kar, pri ~emu je vred1 formatiran kao FP (%f), vred2 kao celobrojna vrednost (%d), a kar kao znak (%c). Na kraju se koristi znak nova-linija ('n') kako bi se postavio izlaz na novu liniju.

printf (" Vrednosti su %f%d%c\n", vred1, vred2, kar);

FP

celobrojna vrednost

znak

Slika A7 Primer printf() iskaza

Numeri~ke vrednosti se prikazuju u odredjenim formatima koriste}i pri tome odgovaraju}e specifikatore preciznosti. Pomo}u specifikatora se odredjuje broj znakova koji se koristi za prikaz vrednosti i broj mesta nakon decimalne ta~ke. Op{ti oblik specifikatora za FP vrednost je :

17

Page 19: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

%m.nX

gde je m ukupan broj cifara broja uklju~uju}i i decimalnu ta~ku, n broj cifara koji sledi nakon decimalne ta~ke, a X je tip formata (f za FP format).

Op{ti format za nizove ili celobrojne vrednosti je:

%mX

gde je X tip formata (c za znake, s za niz, d za celoborojnu vrednost), a m je obim izlaza . Na slici A8 dati su neki tipi~ni primeri. format funkcija %.3f FP format sa 3 decimalna mesta, default vrednost %.8.3f FP format sa 8 dekadnih mesta i tri mesta nakon decimalne ta~ke, kao na primer 32.453%.10d Format integer sa 10 rezervisanih mesta kao {to je 23 %3.o Format oktalnog integer-a sa 3 heksadecimalna znaka % 10.6e FP format tipa eksponent sa 6 decimalna mesta

Slika A8 Primeri modifikatora za upravljanje konverzijom

Ulazne funkcije Postoje tri glavne ulazne funkcije, a to su:

• scanf ("format", &arg1, &arg2,...,&argn)

- ~ita formatirane vrednosti sa tastature u formatu definisanom od strane format i puni ih u argumente arg1, arg2, itd.

• gets (string)

- ~ita niz teksta sa tastature i sme{ta ga u string (sve do nailaska nove linije)

• ch=getchar()

- ~ita jedan znak sa tastature i sme{ta ga u ch

Za slu~aj da se kod scanf() funkcije koristi numeri~ka vredost ili karakter-promenljiva, tada svakom parametru u argumentu prethodi znak & (ampersand). Ovaj prefiks uzrokuje da se memorijska adresa promenljive koristi kao parametar a ne kao vrednost. Na ovaj na~in obezbedjuje se da scan () promeni vrednost promenljive. Op{ti format funkcije scanf() je:

scanf (format, &arg1, arg2,...)

Prvi argument format predstavlja niz koji defini{e format svih unetih vrednosti. Na primer, %f%d specificira da arg1 je unet kao FP a arg2 kao integer. Ovaj niz treba da sadr`i samo konverziono upravlja~ke znake kakvi su %d, %f, %c, %s, itd., koje su medjusobno izdvojene blanko znakom. Na Slici A9 prikazan je primer funkcije scanf() koji ~ita FP, integer i znak u promenljive vred1, vred2, i kar.

18

Page 20: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

scanf ("%f %d %c", &vred1, &vred2, &kar);

FP

celobrojna vrednost

znak

Slika A9 Primer iskaza scanf ( )

Funkcija gets(niz) ~ita broj znakova u promenljivu (u ovom slu~aju niz). Ovi karakteri se ~itaju sve dok se ne pritisne dirka ENTER. Funkcija getchar() ~ita sa ulaza samo jedan karakter (znak).

Niz (string) je polje (array) znakova koje se postavlja kori{}enjem deklaracije:

char strnname SIZE

gde SIZE predstavlja maksimalan broj karaktera u polju, a strnname je ime tog niza.

19

Page 21: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Vrste programskih naredbi Svaki program, napisan na nekom programskom jeziku, sastavljen je od niza pojedina~nih

naredbi. Poredak izvr{enja programskih naredbi je obi~no sekvencijalan, dok se izmena redosleda izvr{enja vr{i pomo}u upravlja~kih naredbi. U upravlja~ke naredbe spadaju naredbe iteracije i naredbe grananja. Iterativne naredbe omogu}avaju da se odredjeni delovi programa izvr{e vi{e puta, dok naredbe grananja omogu}avaju izvr{enje odredjenih naredbi u zavisnosti od ispunjenja, odnosno neispunjenja datog uslova.

U programskom jeziku postoje slede}e vrste programskih naredbi:

1) elementarna programska naredba, 2) blok naredbi 3) naredbe iteracije, u koje spadaju:

• while - petlja • for - petlja • do while - petlja

4) naredbe kontrolisanog skoka, u koje spadaju: • break • continue

5) naredba goto 6) naredbe grananja, u koje spadaju

• if • switch

7) naredba return

Elementarna programska naredba

Ako se na kraju jednog iskaza doda znak ";" dobija se elementarna naredba programskog jezika C. Primer

broj_a=12; broj_b--; Specijalan slu~aj elementalne programske naredbe predstavlja prazna naredba: ;

Blok naredbi Blok naredbi predstavlja skup programskih naredbi koje ~ine jednu celinu. U bloku naredbi

mogu da se pojave kako izvr{ne, tako i opisne naredbe.

U programskom jeziku C svaki blok naredbi se ozna~ava parom viti~astih zagrada, pri ~emu znak { stoji na po~etku, a znak } na kraju bloka. Blok naredbi se interpretira kao jedna jedina naredba.

{ broj_a=12; broj_b=4; proizvod=broj_a*broj_b; printf("%d", proizvod);

}

Iteracije

Iteracije, ili petlje (loops), omogu}uju vi{estruko ponavljanje jednog dela programa. U programskom jeziku C, kako smo ve} naglasili, postoje slede}e tri vrste iterativnih naredbi:

20

Page 22: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

• while - petlja • for - petlja • do while - petlja

For-petlja

Veliki broj zadataka u okviru programa je repetitivnog tipa. Tipi~an primer je brojanje neke vrednosti. Za zadatu upravlja~ku funkciju for-petlja obezbedjuje izvr{enje bloka naredbi. Slede}i primer ilustruje format for-petlje:

for(pocetni-uslov; test-uslov; operacija) blok-iskaza

gde je:

po~etni-uslov - po~etna vrednost za petlju; test-uslov - if test-uslov TRUE petlja produ`ava sa izvr{enjem; operacija - operacija koja se izvr{ava na kraju petlje.

Ako blok-iskaza ~ini samo jedan iskaz, tada se viti~aste zagrade izostavljaju.

Na slici A10 prikazan je dijagram toka for-petlje

Tipi~an primer kori{}enja for iskaza bio bi:

for (i=1; i<=100; ++i) alfa = alfa*i;

po~etni uslov

operacija

blok-iskaza

uslov TRUE?

da

ne

Slika A10 Dijagram toka iskaza for

While-petlja

Iskaz while() omogu}ava izvr{enje bloka naredbi sve dok je specificirani uslov TRUE. Provera uslova se vr{i na po~etku bloka, ako je uslov TRUE, blok se izvr{ava, ina~e se izlazi iz petlje. Sintaksa ovog iskaza je oblika:

while (uslov) blok-iskaza

Ako blok-iskaza sadr`i samo jedan iskaz, tada se viti~aste zagrade izostavljaju. Tipi~an primer while-petlje je:

while (alfa >0)

21

Page 23: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

suma=alfa+suma;

do while petlja

Iskaz do...while() sli~an je iskazu while() sa izuzetkom {to se uslov testira na kraju petlje. Ovim se obezbedjuje da se blok-iskaza izvr{i najmanje jedan put. Sinteksa ovog izraza je oblika:

do blok - iskaza while (uslov); Viti~aste zagrade i u ovom slu~aju su opcione. Petlja do while() zahteva ";" na kraju petlje, dok

while() ne zahteva. Na Slici A11 prikazani su dijagrami toka za do...while ( ) i while ( ) petlje. Kod obe petlje uslov TRUE uzorkuje da se blok-iskaza ponovi.

blok-iskaza blok-iskaza

uslov TRUE?

da

ne

uslov TRUE?

da

ne

a) while () b) do...while

Slika A11 while() i do.. while() petlje

Tipi~an primer kori{}enja do...while ( ) petlje je slede}i:

do {

suma+=i; i++; while (i<=100);

} Naredbe grananja

U programskom jeziku C postoje dve vrste naredbi grananja:

• if - naredba • switch - naredba

if - naredba

Op{ti oblik if naredbe je slede}i: if (izraz) blok iskaza1

else blok-iskaza2

Izraz u maloj zagradi mo`e biti neka logi~na relacija ili promenljiva, a blok-iskaza1 i blok-iskaza2, u viti~astim zagradama, mogu biti elementarne programske narebe ili blok naredbi.

Tipi~an primer je slede}i:

if (broj_a<0) printf ("Broj je negativan");

22

Page 24: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

else printf("Broj je pozitivan");

Programska struktura if mo`e da ima i slede}u formu:

if (izraz) blok-iskaza sledeci-iskaz; Semantika ove konstrukcije je slede}a: Ako je vrednost izraz razli~ita od nule (TRUE),

izvr{ava se blok-iskaza, a zatim slede}i-iskaz. U protivnom, ako je vrednost izraz jednaka nuli (FALSE), blok-iskaza se ne izvr{ava i kontrola se direktno prenosi na slede}i-iskaz. To zna~i da if iskaz obezbedjuje jednostruko grananje ili odlu~ivanje. Na primer, u slede}em fragmentu programa:

if (test==FALSE) printf("Uredjaj je neispravan"); ----

Ako je uslov test==FALSE istinit, izvr{ava se funkcija printf i {tampa se poruka da je uredjaj neispravan. Ako je test==FALSE neistinit, funkcija printf se ne izvr{ava, poruka se ne {tampa, a kontrola programa predaje se iskazu neposredno nakon if iskaza.

^esto, u situaciji kada se zahteva ve}a funkcionalnost mogu}e je vr{iti gne`djenje if...else iskaza. U narednom primeru, izvr{ava se blok-iskaza1 ako je izraz1 TRUE. Ako je on FALSE, tada program proverava naredni izraz. Ako je ovaj TRUE program izvr{ava blok-iskaza2, ako nije proverava naredni izraz, itd. Ako su svi izrazi FALSE tada program izvr{ava kona~ni else iskazni-blok, u konkretnom primeru, blok-iskaza4.

if (izraz1) blok iskaza1

else if (izraz2) blok-iskaza2 else if (izraz3) blok iskaza3

else blok-iskaza4

Na slici A12 data je grafi~ka predstava slo`enog if iskaza

blok-iskaza1

iskaz1 TRUE?

ne

da

blok-iskaza2

iskaz2 TRUE?

ne

da

blok-iskaza3

iskaz3 TRUE?

ne

da blok-iskaza

Slika A12 Struktura slo`enog if iskaza

23

Page 25: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Jedan tipi~an primer kori{}enja else-if iskaza je oblika: /*program za odredjivanje da li je znak malo ili veliko slovo, /* cifra ili specijalni znak pomocu iskaza else-if */ #include <stdio.h> main() { char c; printf ("Ukucajte znak?"); scanf ("%C", &c); if (c>='a'&&c<='z')

printf ("Znak %c je malo slovo n", c); else if (c>='A'&&c<='Z')

printf ("Znak %c je velikao slovo n", c); else if (c>='0'&&c<='9') printf ("Znak %c je cifra n", c);

else pritf ("Znak %c je specijalan znak nD", c);

}

Switch - naredba

Naredba switch predstavlja uop{tenje naredbe if, tj. ona omogu}ava izbor izmedju vi{e alternativa (a ne samo dve kao kod if). Sintaksa naredbe switch je slede}a:

switch (izraz) case konst1:naredba_1:break; case konst2:naredba_2:break; default: naredba_n:break;

gde konst1, konst2,...,konstn mogu bitri konstante osnovnog tipa int ili char.

U naredbi switch prvo se izra~unava izraz. Izra~unata vrednost se poredi sa konst1, konst2, ...,konstn sve dok se ne pronadje ekvivalntna vrednost ili se ustanovi da takva vrednost ne postoji ni u jednom od case delova.

Ukoliko je ekvivalentna vrednost pronadjena, bi}e izvr{ene sve naredbe koje se nalaze izmedju case-dela i kraja break-naredbe.

Ukoliko ekvivalentna vrednost izraza u case-delovima nije pronadjena, program }e nastaviti sa izvr{enjem naredbe koja se nalazi u default delu. U slu~aju da default-deo ne postoji, naredba switch se preska~e i program izvr{ava prvu naredbu, koja sledi switch-naredbi.

Funkcije Slo`eniji problemi re{avaju se dekompozicijom u ve}i broj manjih problema. Funkcije su jasno

definisani delovi programa koji imaju definisani interfejs. One se mogu pozivati iz bilo kog dela programa i omogu}avaju, kako smo ve} naglasili, da se veliki programi podele na manje lak{e upravljive zadatke, od kojih se svaki mo`e nezavisno testirati. Funkcija se mo`e zamisliti kao "crna kutija" koja ima skup ulaza i izlaza. Ona procesira ulaze na na~in odredjen od strane svoje funkcije i generi{e odgovaraju}i izlaz. Modularni programi se sastoje od ve}eg broja 'crnih kutija', od kojih jedna u odnosu na drugu radi nezavisno. Treba pri ovome ista}i da svaka funkcija koristi promenljive deklarisane u okviru same sebe (lokalne promenljive) kao i parametre koji joj se predaju.

24

Page 26: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Prenos parametara

Tipovi podataka i imena parametara koji se prenose funkciji deklari{u se zaglavljem funkcije (tj. njegovim interfejsom), dok se stvarne vrednosti koje se predaju funkciji nazivaju argumenti. One se mogu prenositi funkciji kao vrednosti (ovaj tip predaja argumenata naziva se "passing by value") ili kao pokaziva~i (ovaj na~in prenosa naziva se "passing by reference"). Prenos vrednosti podrazumeva slanje kopije te vrednosti funkciji. Koriste}i ovaj metod, nemogu}e je promeniti vrednost promenljive. Nasuprot tome, vrednost promenljive se mo`e promeniti ako se ona prenosi po referenciranju .

Na slici A13 prikazan je program koga ~ine dve funkcije, main() i funkcija1(). Funkcija main( ) poziva funkcija1() i predaje joj tri parametra koji se prenose po vrednosti. Kopija sadr`aja d se ~uva u g, kopija e u h, a kopija f u i.

Promenljive deklarisane u okviru funkcije opisane su kao lokalne promenljive. Na slici A13 prikazano je da su d, e i f lokalne promenljive u okviru main(), dok su g, h, i, j i k lokalne u okviru funkcija1. One ne}e imati vezu sa promenljivima istog imena deklarisanim u drugim funkcijama. Lokalne promenljive egzistiraju samo u okviru funkcije u kojoj deklarisane i ne postoje nakon {to program napusti tu funkciju. Promenljive deklarisane na vrhu izvornog fajla (ne u okviru funkcije) definisane su kao globalne promenljive. Na ovaj na~in omogu}eno je pristupanje funkcijama u okviru izvornog fajla. Ipak, kada se koriste globalne promenljive mora da se vodi ra~una iz vi{e razloga, jedan od glavnih je taj {to kori{}enje globalnih promenljivih ~ini da programi budu nestrukturni i te{ki za odr`avanje. Na slici A13 funkcija funkcija1 koristi promenljivu a kao globalnu promenljivu. Ova funkcija se ne mo`e modelirati kao 'crna kutija' na na~in kako ona mo`e modifikovati promenljivu koja joj se prenosi. Kod relativno kratkih programa, prenos, modifikacija, i predaja parametara, verovatno i ne predstavljaju neki ozbiljan problem (dok programer sve "dr`u u glavi"), al,i kako se obim programa pove}ava, kontrola nad promenljivima postaje izuzetno te`ak posao.

int a, b, c; /*GLOBALNE PROMENLJIVE-ove promenljive mogu*/

/*se koristiti od bilo koje fincije u okviru ovog*/ /*fajla*/

int main(void) {

int d,e,f;/*LOKALNE PROMENLJIVE ove promenljive mogu se */ /*koristiti u okviru funkcije main( ) */

funkcija1 (d, e, f);/*PRENOS PARAMETARA od d, e i f u g, h i i }

funkcija1 (int g, int h, int i) {

int j, k; /*LOKALNE PROMENLJIVE-ove promenljive mogu se /* koristiti samo u okviru funkcija1()

j = a+h; }

Slika A13 Lokalne i globalne promenljive

Povratne vrednosti Iskazom return pozvana funkcija vra}a jedinstvenu vrednost pozivnom programu (videti Sliku

A14). Kada iskaz return u okviru funkcije ne postoji, tada se izvr{enje automatkski vra}a pozivnom programu odmah nakon izvr{enja zatvaraju}e viti~aste zagrade (krajnji iskaz u okviru funkcije).

25

Page 27: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Funkcija mo`e da ima po nekoliko povratnih (return) ta~aka, mada, preporu~uje se da zbog preglednosti, funkcija ima samo jednu povratnu ta~ku. Ovo se posti`e preuredjenjem kôda. Jedan primer funkcije koja ima dva return-a je dat slede}om kôdnom sekvencom. U ovom primeru, donosi se odluka da li je vrednost koja se predaje funkciji pozitivna ili negativna. Ako je ve}a ili jednaka nuli, vra}a se ista vrednost, ina~e se vra}a negativna vrednost (return (_vrednost)).

int moduo (int _vrednost) if (_vrednost >=0) return (_vrednost); else

return (_vrednost);

Slika A14 Prezentacija funkcije tipa 'crna-kutija' i povratne vrednosti

Prototip funkcije Mogu}e je uz return vratiti bilo koji tip podatka koji podr`ava jezik C uklju~uju}i tu i float,

double i char. Tip podatka se navodi pre imena funkcije. Ako se ne defini{e tip podatka, tada je default povratna vrednost za tip int. Slede}i iskaz daje op{tu sintaksu funkcije:

definicija_tipa ime_funkcije (lista parametara)

Sa aspekta strukture, programski jezik C je fleksibilan. On dozvoljava proizvoljno uredjenje funkcije ~ak i u okviru razli~itih fajlova. Ako kompilator pronadje funkciju koja nije bila definisana, tada on usvaja da povratni (return) tip podatka bude int. Takodje, on usvaja da }e u toku povezivanja programa linker biti u stanju da pronadje zahtevanu funkciju bilo u teku}e kompajliranom programu, bilo u bibliote~nim programima, ili ~ak u drugim objektnim kôdovima. Zbog ovoga je va`no da funkcija vra}a onaj tip podatka koji je bio definisan kada je kompilator prevodio funkciju, u protivnom kompilator usvaja da je povratna vrednost tipa int. Deklaracije funkcija, odnosno prototipovi, se uobi~ajeno insertuju bilo na po~etku svakog fajla, lokalno u okviru funkcije, ili u posebnom header fajlu (fajlovima sa ekstenzijom .h). Ove deklaracije pru`aju mogu}nost kompilatoru da odredi return tip kao i tipove podataka svih parametara koji se predaju funkciji. Na ovaj na~in kompilator mo`e da testira nelegalan prenos parematara funkciji, tj. da detektuje pogre{nu predaju. Na primer, slede}i slu~ajevi se odnose na nekorektno kori{}enje funkcija printf(), sqrt() i scanf(). Za printf() imamo nekorektnu sintaksu jer prvi argument mora da se odnosi na format iskaza (t. niz) funkciji sqrt() treba da se preda FP vrednost, a funkcija scanf() format niza kao prvi argument. Naime, korektno bi bili slede}i primeri:

scanf ("%d:%d:%d", &sat, &minut, &sekunda); printf (" n%d %c n", ceo_broj, znak1); double sqrt(x);

Pokaziva~i Program koristi podatke koji se pamte kao promenljive. Da bi se promenljiva sa~uvala,

dodeljuje joj se jedinstveni memorijski prostor. Broj bajt lokacija koje se koriste za ~uvanje promeljive zavisi od tipa podatka. Ilustracije radi, char koristi samo jednu bajt-lokaciju, int mo`e da koristi dve ili ~etiri bajt lokacije, a float ~etiri ili osam bajt-lokacija. Svakoj memorijskoj lokaciji se dodeljuje po jedan bajt, a svakoj lokaciji se pridru`uje jedinstvena adresa (tj. svaka ima svoju sopstvenu binarnu adresu). Adresa se uobi~ajeno specificira kao heksadecimalna vrednost koja se lako mo`e konvertovati u stvarnu binarnu vrednost. Sadr`aj memorijskog elementa je mogu}e u~itati odnosno promeniti navodjenjem njegove adrese. U programskom jeziku C postoji poseban operator, koji odredjuje adresu neke promenljive. To je unarni adresni operator i on se ozna~ava znakom ampersand (&).

26

Page 28: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Tipi~an primer je:

&suma

Izkaz &suma odredjuje adresu gde je sme{tena vrednost promenljive suma.

Adresni operator se mo`e primenjivati samo na jednu vrednost, to zna~i da slede}i izraz nije dozvoljen:

&(suma+200)

Pored adresnog, u programskom jeziku C se koristi i indirektni operator koji se ozna~ava znakom zvezdica (*) i on se uvek pi{e kao prefiks, uz ime promenljive. Dodavanjem indirektnog operatora nekoj promenljivoj, dobija se podatak, koji predstavlja pokaziva~. Tipi~an primer deklaracije pokaziva~a je:

int *ptr

Ovaj iskaz deklari{e promenljivu ptr kao pokaziva~. Podatak ptr pokazuje na adresu u memoriji, u kojoj je sme{tena neka promenljiva tipa int. Prema tome, pokaziva~ ptr predstavlja jednu adresu.

Pokaziva~ ptr je sme{ten u memoriji na adresi 413. Na toj adresi se kao podatak nalazi druga adresa 2640. Adresa 2640 sadr`i vrednost promenljive a tipa int. Treba naglasiti da pokaziva~ uvek pokazuje na podatak odredjenog tipa (int, char, i dr), tj. za svaki tip podatka potrebno je deklarisati poseban pokaziva~. Na Slici A15 prikazan je primer funkcije koja medjusobno menja sadr`aje dve promenljive, a i b. Ovaj primer takodje pokazuje kako kompilator proverava parametre koji se prenose funkciji kao i povratni (return) tip. Deklaracija funkcije (ili tzv. funkcijski prototip) specificirana je tako da se parametri predaju kao pokaziva~i na celobrojne vrednosti, a da povratni tip bude void. Kompilator proverava da li su parametri koji se predaju funkciji pokaziva~i tipa integer i da li se ni{ta ne vra}a od strane funkcije pozivnom programu.

void swap(int *ptr1, int *ptr2); //proverava povratni tip

void main (oid) //proverava parametre koji se predaju int a, b; swap (&a, *|&b); //proverava parametre koji se predaju // proverava povratni tip

void swap (int *ptr1, int *ptr2); int priv; priv = * ptr1 *ptr1 = *ptr2

*ptr2 = priv

Slika A15 Provera koju vr{i kompilator

Primer

Analizirati efekat slede}eg programa i objasniti programske naredbe u kojima se pojavljuju pokaziva~i.

main() {

int broj_a, *point_br; char slovo1, slovo2, *point_sl; broj_a=4; slovo_1='c'; point_br=&broj_a; broj_a+=*point_br+1;

27

Page 29: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

printf (" %d n", broj_a); point_sl=&slovo_1; slovo_2=*point_sl; printf ("%c n", slovo_2);

}

Rezultat datog programa }e biti ispisan u slede}em obliku:

9 C . Da bismo shvatili program, potrebno je objasniti ~etiri programske naredbe, u kojima se

pojavljuju pokaziva~i.

Posle izvr{enja naredbe:

point_br=&broj_a;

pokaziva~ point_br pokazuje na adresu, gde je sme{tena promenljiva broj_a. Naredbom:

broj_a+=dS*point_br+1; promenljiva broj_a dobija vrednost 4+4+1=9. Naime, vrenosti promenljive broj_a (4) se dodaje jedinica i promenljiva tipa int na koju pokazuje pokaziva~ point_br. Kako point_br pokazuje na istu promenljivu broj_a, rezultat naredbe }e biti 9.

Posle izvr{enja naredbe:

point_sl=&slovo_1;

pokaziva~ point_sl pokazuje na adresu, gde je sme{tena promenljiva slovo_1, koja je tipa char. Naredbom:

slovo_2=*point_sl;

promenljivoj slovo_2 se dodeljuje vrednost promenljive tipa char, na koju pokazuje pokaziva~ point_sl, a to je vrednost slovo_1 (C).

Polja

Polje (array) predstavlja slo`enu strukturu podataka ~iji svi elementi poseduju isti tip. Polja mogu biti jednodimenzionalna ili vi{edimenzionalna. Jednodimenzionalna polja se obi~no nazivaju vektori, a vi{edimenzionalna polja matrice.

Jednodimenzionalna polja

Da bi neki podatak bio deklarisan kao jednodimenzionalno polje, potrebno je navesti njegovo ime, broj elemenata koje sadr`i, kao i tip elemenata. Op{ti tip deklaracije vektora je:

tip ime n

gde je ime neki identifikator, koji defini{e ime vektora, n predstavlja broj elemenata vektora, a tip odredjuje tip svakog pojedina~nog elementa.

Tipi~an primer je:

int Vektor_a 100 ;

jednodimenzionalno polje Vektor_a ~ine 100 elemenata tipa int.

Elementi jednodimenzionalnog polja (vektora) se uvek sme{taju u memoriju ra~unara neposredno jedan za drugim, pri ~emu po~etni elemenat vektora ima najmanju, a poslednji najve}u adresu. Prvi elemenat vektora ima uvek indeks 0, drugi indeks 1,.... k. Treba naglasiti da ozna~avanje po~etnog indeksa nulom nije tipi~no za sve programske jezike.

28

Page 30: Uvod u C - es.elfak.ni.ac.rses.elfak.ni.ac.rs/es/Materijal/Pog.9-Uvod_u_C.pdf · Uvod u C Mikroprocesor razume ... {i programski jezici sa kojima se studenti

Vi{edimenzionalna polja

U programskom jeziku C svaka dimenzija vi{edimenzionalnog polja se pi{e unutar jednog para uglastih zagrada.

Na primer, dvodimenzionalno polje obima 8x8 se mo`e deklarisati na slede}i na~in

char dva_de [8] [8]

pri ~emu prva dimenzija ozna~ava vrste, a druga kolone dvodimenzionalnog polja.

Elementi vi{edimenzionalnog polja se u memoriju sme{taju kao jednodimenzionalna polja, pri ~emu se memorisanje vr{i u poretku po va`nosti vrste k (row major ordering). To zna~i da poslednji indeks vi{edimenzionalnog polja prvo menja svoju vrednost, zatim pretposlednji, itd.

Literatura koju preporu~ujemo za programski jezik C 1. Du{an Petkovi} Programski jezik C Nau~na knjiga Beograd 1988. 2. Vladan Vuji~i} Uvod u C jezik Institut "Boris Kidri~" Vin~a, 1988 3. William Buchanan Applied PC interfacing, graphics and interrupts Addison Wesley, Harlow, 1996.

29