SlideShare ist ein Scribd-Unternehmen logo
1 von 395
Downloaden Sie, um offline zu lesen
PROGRAMIRANJE

C JEZIKOM


Nastavni materijal za studente FESB-a.




Split, 2005/2006

Autor: Ivo Mateljan




                                         1
Sadržaj
1 Uvod........................................................................................................................................... 5
2 Matematički i elektronički temelji računarstva ........................................................................ 13
   2.1 Izjavna i digitalna logika ................................................................................................... 13
   2.2 Brojevni sustavi i računska sposobnost računala .............................................................. 16
3 Izrada prvog C programa.......................................................................................................... 20
   3.1 Strojni, asemblerski i viši programski jezici ..................................................................... 20
   3.2 Prvi program u C jeziku .................................................................................................... 21
   3.3 Struktura i kompiliranje C programa ................................................................................ 25
   3.4 Integrirana razvojna okolina (IDE) ................................................................................... 27
   3.5 Usmjeravanje procesa kompiliranja programom nmake................................................... 32
4 Kodiranje i tipovi podataka ...................................................................................................... 33
   4.1 Kodiranje i zapis podataka ................................................................................................ 33
   4.2 Memorija ........................................................................................................................... 40
   4.3 Prosti tipovi podataka........................................................................................................ 42
   4.4 Direktiva #define............................................................................................................... 46
   4.5 Specifikatori printf funkcije .............................................................................................. 47
   4.6 Pristup podacima pomoću pokazivača .............................................................................. 49
   4.7 Unos podataka u memoriju računala ................................................................................. 52
   4.8 Inicijalizacija varijabli....................................................................................................... 54
5 Uvod u programiranje C jezikom............................................................................................. 55
   5.1 Postupak izrade programa ................................................................................................. 55
   5.2 Algoritamska struktura C programa? ............................................................................... 57
   5.3 Funkcije C jezika............................................................................................................... 63
   5.4 Zaključak........................................................................................................................... 70
6 Izrazi i sintaksa C jezika........................................................................................................... 71
   6.1 Izrazi.................................................................................................................................. 71
   6.2 Automatska i explicitna pretvorba tipova ......................................................................... 78
   6.3 Definiranje sinonima tipa pomoću typedef ....................................................................... 81
   6.4 Formalni zapis sintakse C-jezika....................................................................................... 81
7 Proste i strukturalne naredbe C jezika...................................................................................... 87
   7.1 Proste naredbe ................................................................................................................... 87
   7.2 Strukturalne naredbe ......................................................................................................... 89
8 Nizovi..................................................................................................................................... 102
   8.1 Jednodimenzionalni nizovi.............................................................................................. 102
   8.2 Prijenos nizova u funkciju............................................................................................... 107
   8.3 Višedimenzionalni nizovi................................................................................................ 110
9 Blokovi, moduli i dekompozicija programa........................................................................... 112
   9.1 Blokovska struktura programa ........................................................................................ 112
   9.2 Funkcionalna dekompozicija programa "od vrha prema dolje" ...................................... 120
   9.3 Zaključak......................................................................................................................... 128
10 Rad s pokazivačima.............................................................................................................. 129




                                                                                                                                                 2
10.1 Tip pokazivača .............................................................................................................. 129
   10.2 Operacije s pokazivačima.............................................................................................. 130
   10.3 Pokazivači kao argumenti funkcije ............................................................................... 131
   10.4 Pokazivači i nizovi ........................................................................................................ 132
   10.5 Pokazivači i argumenti funkcije tipa niza ..................................................................... 134
   10.6 Patrametri funkcije tipa void pokazivača ...................................................................... 136
   10.7 Pokazivači na funkcije .................................................................................................. 137
   10.8 Kompleksnost deklaracija ............................................................................................. 139
   10.9 Polimorfne funkcije....................................................................................................... 141
   10.10 Zaključak..................................................................................................................... 144
11 Nizovi znakova - string ........................................................................................................ 146
   11.1 Definicija stringa ........................................................................................................... 146
   11.2 Standardne funkcije za rad sa stringovima.................................................................... 148
   11.3 Ulazno-izlazne operacije sa stringovima....................................................................... 151
   11.4 Korisnički definirane ulazne operacije sa stringovima ................................................. 152
   11.5 Pretvorba stringa u numeričku vrijednost ..................................................................... 153
   11.6 Nizovi stringova ............................................................................................................ 155
   11.7 Generator slučajnih brojeva .......................................................................................... 157
   11.8 Argumenti komandne linije operativnog sustava.......................................................... 158
12 Dinamičko alociranje memorije ........................................................................................... 160
   12.1 Funkcije za dinamičko alociranje memorije ................................................................. 160
   12.2 Kako se vrši alociranje memorije.................................................................................. 163
   12.3 Alociranje višedimenzionalnih nizova .......................................................................... 165
   12.4 Standardne funkcije za brzi pristup memoriji ............................................................... 171
13 Korisnički definirane strukture podataka ............................................................................. 172
   13.1 Struktura (struct)...................................................................................................... 172
   13.2 Union – zajednički memorijski objekt za različite tipova podataka.............................. 180
   13.3 Bit-polja......................................................................................................................... 181
   13.4 Pobrojanji tip (enum).................................................................................................... 182
   13.5 Strukture i funkcije za očitanje vremena....................................................................... 183
14 Leksički pretprocesor ........................................................................................................... 188
   14.1 Direktiva #include ......................................................................................................... 188
   14.2 Direktiva #define za makro-supstitucije........................................................................ 188
   14.3 String operatori # i ##.................................................................................................. 190
   14.4 Direktiva #undef............................................................................................................ 191
   14.5 Direktive za uvjetno kompiliranje................................................................................. 192
15 Rad s datotekama i tokovima ............................................................................................... 194
   15.1 Ulazno-izlazni tokovi .................................................................................................... 194
   15.2 Binarne i tekstualne datoteke ........................................................................................ 195
   15.3 Pristup datotekama ........................................................................................................ 195
   15.4 Formatirano pisanje podataka u datoteku...................................................................... 197
   15.5 Formatirano čitanje podataka iz datoteke...................................................................... 199
   15.6 Znakovni ulaz/izlaz ....................................................................................................... 200
   15.7 Direktni ulaz/izlaz za memorijske objekte .................................................................... 203
   15.8 Sekvencijani i proizvoljni pristup datotekama .............................................................. 206
   15.9 Funkcije za održavanje datoteka ................................................................................... 208
16 Apstraktni tipovi podataka - ADT........................................................................................ 210




                                                                                                                                            3
16.1 Koncept apstraktnog dinamičkog tipa podataka ........................................................... 210
   16.2 Stog i STACK ADT ...................................................................................................... 215
   16.3 Primjena stoga za proračun izraza postfiksne notacije.................................................. 218
   16.4 Red i QUEUE ADT....................................................................................................... 221
   16.5 Zaključak....................................................................................................................... 224
17 Rekurzija i složenost algoritama .......................................................................................... 225
   17.1 Rekurzivne funkcije ...................................................................................................... 225
   17.2 Matematička indukcija .................................................................................................. 227
   17.3 Kule Hanoja .................................................................................................................. 227
   17.4 Metoda - podijeli pa vladaj (Divide and Conquer)........................................................ 230
   17.5 Pretvorba rekurzije u iteraciju ....................................................................................... 232
   17.6 Standardna bsearch() funkcija ....................................................................................... 234
   17.7 Složenost algoritama - "Veliki - O" notacija................................................................. 236
   17.8 Sortiranje ....................................................................................................................... 239
   17.9 Zaključak....................................................................................................................... 248
18 Samoreferentne strukture i liste............................................................................................ 249
   18.1 Samoreferentne strukture i lista..................................................................................... 249
   18.2 Operacije s vezanom listom .......................................................................................... 250
   18.3 Što može biti element liste ............................................................................................ 259
   18.4 Lista sa sortiranim redoslijedom elemenata .................................................................. 260
   18.5 Implementacija ADT STACK pomoću linearne liste ................................................... 265
   18.6 Implementacija ADT QUEUE pomoću vezane liste..................................................... 267
   18.7 Dvostruko vezana lista .................................................................................................. 269
   18.8 Generički dvostrani red - ADT DEQUEUE.................................................................. 271
   18.9 Zaključak....................................................................................................................... 280
19 Razgranate strukture - stabla ................................................................................................ 281
   19.1 Definicija stabla ............................................................................................................ 281
   19.2 Binarno stablo ............................................................................................................... 282
   19.3 Interpreter prefiksnih izraza .......................................................................................... 291
   19.4 Stabla s proizvoljnim brojem grana .............................................................................. 305
   19.5 Prioritetni redovi i hrpe ................................................................................................. 309
   19.6 Zaključak....................................................................................................................... 316
20 Strukture za brzo traženje podataka .................................................................................... 317
   20.1 Tablice simbola i rječnici .............................................................................................. 317
   20.2 Hash tablica ................................................................................................................... 318
   20.3 BST - binarno stablo traženja........................................................................................ 333
   20.4 Crveno-crna stabla......................................................................................................... 344
Literatura ................................................................................................................................... 354
Dodatak ..................................................................................................................................... 355
   Dodatak A - Elementi dijagrama toka................................................................................... 355
   Dodatak B - Gramatika C jezika ........................................................................................... 356
   Dodatak C - Standardna biblioteka C jezika ......................................................................... 361
Index.......................................................................................................................................... 392




                                                                                                                                                 4
1 Uvod




Naglasci:
   • Što je računalo ?
   • Što je program ?
   • Kako se rješavaju problemi pomoću računala?
   • Računarski procesi i memorijski objekti
   • Apstrakcija, algoritam, program


    Računalo ili kompjuter (eng. computer) je naziv za uređaje koji obavljaju radnje prema
programima koje izrađuje čovjek. Sastavni dijelovi računala nazivaju se hardver, a programi i
njihova dokumentacija nazivaju se softver. Prvotno su računala služila za obavljanje numeričkih
proračuna, odatle i potječe naziv računalo. Danas računala služe za obradu različitih problema.
    Korisnike računala zanima kako se koristi računalo, a one koji izučavaju računala zanima:
      •   kako se izrađuje računalo,
      •   kako se izrađuje program i
      •   kako se rješavaju problemi pomoću računala.
     Ovdje će biti pokazano kako se izrađuju programi i kako se programiranjem rješavaju
različiti problemi. Bit će opisana i unutarnja građa računala. Za pisanje programa koristit će se
programski jeziku C i asemblerski jezik.

Što je program?
     Program je zapis operacija koje računalo treba obaviti. Taj zapis može biti u obliku
izvršnog programa ili u obliku izvornog programa. Izvršni program sadrži kôd operacija koje
izvršava stroj računala, pa se naziva i strojni program. Izvorni program se zapisuje simboličkim
jezikom koji se naziva programski jezik. Prevođenje izvornog programa u strojni program vrši
se pomoću programa koji se nazivaju kompilatori (ili kompajleri).

Stroj računala
     Postoje dva tipa elektroničkih računala: analogna i digitalna. Analognim računalima se
obrađuju kontinuirani elektronički signali. Digitalnim računalom se obrađuju, prenose i pamte
diskretni elektronički signali koji u jednom trenutku mogu imati samo jedno od dva moguća
stanja. Ta stanja se označavaju znamenkama 0 i 1, odatle i naziv digitalna računala (eng. digit
znači znamenka). Programere i korisnike ne zanimaju elektronički signali u računalu, već
poruka koju oni prenose – digitalna informacija.
     Brojevni sustav, u kojem postoje samo dvije znamenke, naziva se binarni brojevni sustav.
U tom se sustavu može kodirati različite informacije koristeći više binarnih znamenki.
Znamenka binarnog brojevnog sustava se naziva bit (kratica od eng. binary digit), a može imati
samo dvije vrijednosti 0 ili 1. Niz od više bitova predstavlja kodiranu informaciju koja može




                                                                                               5
predstavljati operaciju koju računalo treba izvršiti ili neki smisleni podatak. Uobičajeno je za
nizove bitova koristiti nazive iz Tablice 1.1.
      U binarnom nizu često se označava redoslijed bitova. Kratica LSB označava bit najmanjeg
značaja (eng. least significant bit), a MSB označava bit najvećeg značaja (eng. most significant
bit). Primjer je dan na slici 1.1.


      Bit      je naziv za binarnu znamenku
      Nibl     je naziv za skupinu od četiri bita (eng. nibble) s kojom se operira kao s
                cjelinom.
      Bajt     ili oktet je naziv za skupinu od osam bita (eng. byte) s kojom se operira kao s
               cjelinom.
      Riječ     je naziv za skupinu od više bajta (eng. word) s kojom se operira kao s cjelinom.
                Kod mikro računala za riječ se uzima skupina od 2 bajta. Kod većih računala za
                riječ se uzima skupina od 4 ili 8 bajta.
                          Tablica 1.1 Nazivi temeljnih binarnih nizova


      MSB                                             LSB                  značaj bitova
      15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0                                položaj bita
       1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 1                                     binarni niz
        nibl 3        nibl 2      nibl 1       nibl 0                      niz nibla
               bajt 1                    bajt 0                            niz bajta
                             Riječ                                         riječ

                              Slika 1.1 Označavanje binarnog niza

Za označavanje većih nizova koriste se prefiksi:

      k   (kilo)    ⇔       × 1024
      M   (mega)    ⇔     k × 1024
      G   (giga)    ⇔     M × 1024
      T   (tera)    ⇔     G × 1024

Primjerice, 2 kB (kilobajta) = 2048 bajta, 3 Mb (megabita) = 3145728 bita.

     Digitalno računalo može pamtiti i izvršavati programe, te dobavljati, pamtiti i prikazivati
različite informacije. Te informacije, koje su na prikladan način pohranjene u računalu, su
programski podaci.


                               broj bita – n    broj kombinacija – 2n
                                           2                        4
                                           3                        8
                                           4                       16
                                           8                      256
                                          16                    65536
                                          32               4294967296
                              Tablica 1.2 Broj kombinacija s n bita

     Često se računala klasificiraju kao 8-bitna, 16-bitna, 32-bitna ili 64-bitna. Pod time se
podrazumijeva da n-bitno računalo može operirati s nizom od n bita kao s cjelinom. Broj bita
koji se koristi za opisivanje nekog podatka ovisi o veličini skupa kojem taj podatak pripada.




                                                                                                   6
Razmotrimo skup podataka kiji se kodira s tri bita. Taj skup može imati maksimalno 8
elemenata jer se s tri bita može kodirati maksimalno osam kombinacija: 000, 001, 010, 011,
100, 101, 110, 111. Lako je pokazati da se s n-bita može kodirati podatke iz skupa od
maksimalno 2n elemenata. Tablica 1.2 pokazuje da se udvostručenjem broja bitova značajno
povećava skup vrijednosti koje se mogu kodirati u računalu.
     Operacije se u računala nikada ne izvršavaju samo s jednim bitom, već se istovremeno
prenosi i obrađuje više bita. Kod svih računala usvojeno je da najmanja jedinica digitalne
informacije, koja se kao cjelina prenosi i pamti u računalu, sadrži 8 bita, tj. jedan bajt.
     Na slici 1.2 prikazani su sastavni dijelovi digitalnog računala. Centralna procesorska
jedinica (CPU – central processing unit) - kontrolira izvršenje programa i aritmetičko-logičkih
operacija. CPU je kod mikro i mini računala izveden kao jedinstveni integrirani elektronički
sklop (čip) i naziva se mikroprocesor. Uobičajeno je koristiti naziv procesor, bilo da se radi o
mikroprocesoru ili o skupini čipova koji obavljaju funkcije CPU, a programe koji se izvršavaju
u računalu naziva se procesima.




                           Slika 1.2. Opći prikaz digitalnog računala


     Radna memorija – pamti digitalne informacije za vrijeme dok je računalo u operativnom
stanju. U memoriji se nalazi programski kôd i podaci s kojima operira procesor na temelju
naredbi sadržanih u programskom kôdu. Memorija je napravljena od poluvodičkih elemenata u
koje procesor može upisati i iz kojih može čitati digitalne informacije. Ta memorija se naziva
RAM (eng. random access memory). Sa programerskog stajališta RAM predstavlja linearno
uređen prostor u kojem se istovremeno može pristupiti grupi od 8 bita digitalne informacije (1
bajt). Položaj ove temeljne memorijske ćelije se označava prirodnim brojem i naziva se adresa.
Jedan manji dio memorije je napravljen od poluvodičkih elemenata koji mogu trajno pamtiti
digitalnu informaciju, a naziva se ROM (eng. read-only memory). U ROM-u je upisan program
koji služi pokretanju osnovnih funkcija računala. U samom procesoru ugrađeno je nekoliko
manjih memorijskih jedinica koje se nazivaju registri. Registri služe za privremeni smještaj
programskog kôda i podataka iz radne memorije, te rezultata aritmetičko-logičkih operacije koje
se izvršavaju u samom procesoru. Broj bita koji može biti pohranjen u jednom registru naziva se
riječ procesora. Kod većine današnjih PC računala riječ procesora sadrži 32 bita (4 bajta), pa se
kaže da su to 32-bitna računala.
     Vanjska memorija - služi za trajnu pohranu podataka. U tu svrhu koriste se magnetski i
optički mediji (tvrdi disk, savitljive diskete, magnetske trake, optički diskovi,..). Podaci se na
njima pohranjuju u organiziranom i imenovanom skupu podataka koji se nazivaju datoteka.
     Ulazne jedinice - služe za unos podataka (tipkovnica, miš, svjetlosna olovka, mikrofon,..).
Standardna ulazna jedinica je tipkovnica.
     Izlazne jedinice - služe za prikaz informacija korisniku računala (video-monitor, pisač,
zvučnik,...). Standardna izlazna jedinica je video-monitor.




                                                                                                7
Računalo u operativnom stanju održava poseban program koji se naziva operativni sustav.
On vrši temeljne funkcija računala: inicijalizaciju računala i priključenih vanjskih jedinica pri
uključenju električnog napajanja, kontrolu i redoslijed izvođenja programa, kontrolu korištenja
memorije, pohranjivanje i obradu podataka, vremensku raspodjelu funkcija računala, itd.
Operativni sustav nije nužno jedinstven program, već se sastoji od više programskih cjelina. On
se, jednim dijelom, trajno nalazi u ROM memoriji računala. Programi s novakvim svojstvom
nazivaju se rezidentni programi. Svi ostali programi moraju se prije izvršenja upisati u
memoriju računala.
     Može se izvršiti funkcionalna podjela softvera na sistemski i aplikativni softver. U
sistemski softver spadaju programi operativnog sustava, razni jezični procesori (interpreteri,
kompilatori, emulatori itd.), programi za testiranje programa (debugger), servisni i uslužni
programi, te razni pomoćni programi (matematički, statistički, baze podataka i uređivači teksta).
Aplikativni softver predstavljaju različiti korisnički programi.

Kako se rješavaju problemi pomoću računala?
     Kada se rješava neki problem, do ideje za rješenje dolazi se analizom problema. Čovjeku je
često dovoljno da već iz idejnog rješenja, koristeći svoju inteligenciju i predznanje, brzo dođe
do potpunog rješenja problema. Računalo, samo po sebi, ne raspolaže s inteligencijom, već
jedino može izvršavati određen broj jednostavnih operacija. Zbog toga, upute za rješenje
problema pomoću računala moraju biti zapisane u obliku preciznog algoritma.
     Računarski algoritam je precizni opis postupka za rješenje nekog problema u konačnom
broju koraka i u konačnom vremenskom intervalu. Pravila kako se piše algoritam nisu strogo
određena. Algoritam se može definirati običnim govornim jezikom, tablicama i matematičkim
formulama koje opisuju problem, te usmjerenim grafovima koji opisuju tok izvršenja programa.

Primjer: Algoritam kojim se u pet koraka opisuje postupak zamjene točka na automobilu glasi:
      1. ispitaj ispravnost rezervnog točka,
      2. podigni auto,
      3. skini točak,
      4. postavi rezervni točak,
      5. spusti auto.

     Ovaj algoritam je jasan svakome tko je bar jednom mijenjao točak, međutim, računalo je
izvršitelj kojem upute, iskazane nizom naredbi, nisu dovoljno jasne, jer ono ne zna (1) gdje se
nalazi rezervni točak, (2) kako se provjerava njegova ispravnost, (3) kako i čime podignuti auto,
te (4) kojim alatom se skida i postavlja točak. Zbog toga se algoritam dorađuje preciziranjem
pojedinog koraka algoritma. Primjerice, u prvom koraku treba predvidjeti sljedeće naredbe:
    1. ispitaj ispravnost rezervnog točka,
               1.1. otvori prtljažnik
               1.2. izvadi rezervni točak
               1.3. uzmi mjerač tlaka iz kutije s alatom
               1.4. izmjeri razinu tlaka
               1.5. dok je razina tlaka manja 1,6 ponavljaj
                             pumpaj gumu 15 sekundi
                             izmjeri razinu tlaka


     Podrazumijeva se da je naredba označena s 1. zamijenjena s nizom naredbi koje su
označene s 1.1, 1.2,..1.5. Naredbe iskazane u koracima 1.1 do 1.4 su same po sebi jasne. Korak
1.5 treba dodatno pojasniti. Njime je opisan postupak pumpanja gume do neke razine tlaka.
Pošto nitko ne može unaprijed znati koliko vremena treba pumpati gumu, da bi se postigla
željena razina tlaka, predviđeno je da se dvije naredbe: "pumpaj gumu 15 sekundi" i "izmjeri
razinu tlaka", višekratno ponavljaju, sve dok je razina tlaka manja od 1,6. Obje ove naredbe su




                                                                                               8
zapisane uvlačenjem reda kako bi se točno znalo koje naredbe treba ponavljati. Ovaj se tip
naredbe naziva iteracija ili petlja. Uobičajeno se kaže da petlja ima zaglavlje, u kojem se
ispituje uvjet ponavljanja petlje (dok je razina tlaka manja od 1,6 ponavljaj), i tijelo petlje, koje
obuhvaća jednu ili više naredbi koje treba ponavljati. Naziv petlja podsjeća na činjenicu da se
uvijek nakon izvršenja posljednje naredbe tijela petlje proces vraća na izvršenje prve naredbe,
ali samo u slučaju ako je zadovoljen uvjet iskazan u zaglavlju petlje. Naredbe petlje nisu
posebno numerirane jer su one povezane uz zaglavlje petlje, a izvršavaju se u kao jedinstvena
složena naredba. Uobičajeno se niz naredbi koji predstavljaju jedinstvenu složenu naredbu
naziva i blok naredbi ili samo blok.
      Uvjet ponavljanja petlje je izjava: "razina tlaka manja od 1,6". Odgovor na ovu izjavu može
biti "Da" ili "Ne", ovisno o trenutno izmjerenoj razini tlaka. Ako je odgovor "Da", kažemo da je
ispunjen uvjet ponavljanja petlje. Računarska se znanost koristi znanjima matematičke logike. U
tom kontekstu ova izjava predstavlja tzv. predikatni izraz koji može imati samo dvije logičke
vrijednosti: "istina" ili "laž", pa se kaže da je uvjet održanja petlje ispunjen ako je predikatni
izraz istinit. Matematička logika je zapravo znanstveni temelj cijele računarske znanosti i o njoj
će biti više govora u sljedećem poglavlju.
      Pokušajte dalje sami precizirati korake 2, 3 , 4 i 5. Ali pazite, kad pomislite da je problem
ispravno riješen, moguće je da se opet potkrade neka greška. To se obično događa kada se ne
predvide sve moguće situacije, odnosno stanja u koja se može doći. Primjerice, gornji algoritam
nije predvidio slučaj da je guma probušena. Kakav bi razvoj događaja tada bio, ako bi se
dosljedno poštovao postupak iz koraka 1.5? Pošto je kod probušene gume razina tlaka uvijek
manja od 1,6, ispada da bi tada izvršitelj naredbi ponavljao postupak pumpanja gume
beskonačan broj puta.
Algoritam se može popraviti tako da korak 1.5 glasi:
1.5.   ako je tlak manji od 0.1 tada
                     ako je guma probušena onda
                            odnesi točak na popravak
                     inače dok je tlak manji od 1.6 ponavljaj
                            pumpaj gumu 15 sekundi
                            izmjeri razinu tlaka

U ovom se zapisu koriste tzv. naredbe selekcije, prema sljedećoj logici izvršenja:
              ako je ispunjen uvjet tada
                      izvrši prvi niz naredbi
              inače
                      izvrši alternativni niz naredbi

Ovaj se tip naredbe zove uvjetna selekcija ili grananje, jer se nakon ispitivanja logičkog uvjeta
vrši selekcija jednog od dva moguća niza naredbi, odnosno program se grana u dva smjera.

Specijalni oblik selekcije je uvjetna naredba tipa:
              ako je ispunjen uvjet tada
                      izvrši naredbu

Njome se određuje izvršenje neke naredbe samo ako je ispunjen neki uvjet.

Koristeći naredbe selekcije, algoritam se može zapisati u obliku:
       1. ispitaj ispravnost rezervnog točka,
               1.1 otvori prtljažnik
                       1.1.1. uzmi najmanji od tri ključa
                       1.1.2. gurni ključ u bravu i lagano ga okreni na desno
                       1.1.3. podigni vrata prtljažnika




                                                                                                   9
1.2. izvadi rezervni točak
                     1.2.1. podigni tapetu
                     1.2.2.ako je točak pričvršćen vijkom onda odvij vijak
                     1.2 .2. izvadi točak
             1.3. uzmi kutiju s alatom
             1.4. ispitaj razinu tlaka
                     1.4.1. izvadi mjerač tlaka iz kutije alata
                     1.4.2. postavi ga na zračnicu točka
                     1.4.3. očitaj razinu tlaka

             1.5. ako je tlak manji od 0,1 onda
                    1.5.1. provjeri da li je guma probušena
                    1.5.2. ako je guma probušena onda
                                    odnesi točak na popravak
                            inače, ako je tlak manji od 1,6 onda
                    1.5.3. otvori prednji poklopac motora
                    1.5.4. uzmi zračnu pumpu
                    1.5.5. dok je tlak < 1,6 ponavljaj
                                    postavi crijevo pumpe na zračnicu
                                    dvadeset puta pritisni pumpu
                                    na zračnicu postavi mjerač tlaka
                                    ispitaj razinu tlaka

Očito da je potrebno dosta raditi i dosta razmišljati da bi se napisao kvalitetan algoritam.
    Nakon što je napisan precizan algoritam rješenja problema, pristupa se pisanju izvornog
programa. Kako se to radi bit će objašnjeno u sljedećim poglavljima. Važno je uočiti da su u
zapisu algoritma korištena četiri tipa iskaza:
    1. proste ili primitivne naredbe – iskazi koji označavaju jednu operaciju
    2. blok naredbi – iskazi koji opisuju niz naredbi koje se sekvencijalno izvršavaju jedna za
       drugom, a tretiramo ih kao jedinstvenu složenu operaciju.
    3. naredbe selekcije – iskazi kojima se logički uvjetuje izvršenje bloka naredbi.
    4. iterativne naredbe ili petlje – iskazi kojima se logički kontrolira ponovljeno izvršenje
       bloka naredbi.
Računarski procesi i memorijski objekti
Svaki proces rezultira promjenom stanja ili atributa objekata na koje procesi djeluju. Uobičajeno
se stanje nekog promjenljivog objekta označava kao varijabla koja ima neko ime. U računalu se
stanje objekta pamti u memoriji računala pa se algoritamske varijable mora tretirati kao
memorijske objekte.
Kada se u C jeziku napiše iskaz

      x = 5;

on predstavlja naredbu da se memorijskom objektu, imena x, pridijeli vrijednost 5. Ako se pak
napiše iskaz:

      x = 2*x +5;

on predstavlja proces u kojem se najprije iz memorije očitava vrijednost memorijskog objekta x
zapisanog na desnoj strani znaka =. Zatim se ta vrijednost množi s 2 i pribraja joj se numerička
vrijednost konstante 5. Time je dobivena numerička vrijednost izraza s desne strane znaka =. Ta
se vrijednost zatim pridjeljuje memorijskom objektu s lijeve strane znaka =. Konačni je rezultat
ovog procesa da je varijabli x pridijeljena vrijednost 15. Ako bi prethodni iskaz tretirali kao
matematički iskaz, on bi predstavljao jednadžbu s jednom varijablom, koja uvjetuje da je
vrijednost varijable x jednaka 5.




                                                                                               10
Znak = u C jeziku ne predstavlja znak jednakosti, kao u matematici već operator pridjele
vrijednosti. Njegova upotreba označava naredbu da se vrijednost memorijskog objekta s lijeve
strane znaka = postavi na vrijednost izraza koji je zapisan s desne strane znaka =. Takove
naredbe se zovu naredbe pridjele vrijednosti. Zbog ove nekonzistentnosti upotrebe znaka = u
matematici u odnosu na upotrebu u nekim programskim jezicima (C, Basic, Fortan, Java) često
se u općim algoritamskim zapisima operator pridjele vrijednosti zapisuje znakom ←,
primjerice:
      x ← 5
      x ← 2*x +5

     Operacija pridjele vrijednosti posljedica je načina kako procesor obrađuje podatke u
računalu. Naime, procesor može vršiti operacije samo nad podacima koji se nalaze u registrima
procesora, pa je prije svake operacije s memorijskim objektima prethodno potrebno njihov
sadržaj (vrijednost) prenijeti u registre procesora, a nakon obavljene operacije se sadržaj iz
registra, koji sadrži rezultat operacije, prebacuje u memorijski objekt označen s lijeve strane
operatora pridjele vrijednosti. Kaže se da procesor funkcionira po principu: dobavi-izvrši-spremi
(eng. fetch-execute-store).

Što je to apstrakcija?
     Netko može primijetiti da je opisani proces zamjene točka loš primjer primjene računala.
To je točno, jer ako bi se napravio robot, koji bi obavljao navedenu funkciju, onda bi to bila vrlo
neefikasna i skupa upotreba računala. Međutim, malo iskusniji programer bi prema gornjem
algoritmu mogao lako napraviti program kojim se animirano simulira proces zamjene točka. To
je moguće jer, iako je prethodni algoritam apstraktan, on specificira procese u obliku koji se
može ostvariti računarskim programom.
     Apstrakcija je temeljna mentalna aktivnost programiranja. U računarskoj se terminologiji
pod pojmom apstrakcije podrazumijeva prikladan način zapisa o objektima i procesima koje se
obrađuje pomoću računala, a da se pri tome ne vodi računa o tome kako je izvršena stvarna
računarska implementacija, niti objekta niti procesa. Važna je samo ona pojavnost koja je
određena apstrakcijom. Algoritam zapisan programskim jezikom predstavlja apstrakciju
strojnog koda, a algoritam zapisan prirodnim jezikom predstavlja apstrakciju programskog
jezika.
     Programski jezik služi da se formalnim jezikom zapiše procese i stanje memorijskih
objekata u računalu, pa on predstavlja apstrakciju računarskih procesa i stanja memorije.
Pomoću programskih jezika se piše program koji ponovo predstavlja neku novu apstrakciju, a u
toku izvršenja programa moguće je daljnje usložnjavanje apstrakcije. Primjerice, korisnik CAD
programa pokretima miša zadaje program za crtanje nekog geometrijskog oblika.
     S obzirom na način kako je izvršena apstrakcija računarskog procesa, može se izvršiti
sljedeća klasifikacija programskih jezika:

      1. Imperativni (proceduralni) programski jezici (C, Pascal, Modula-2, Basic, Fortran,..)
      2. Objektno orijentirani programski jezici (C++, Java, C#, Eiffel, Objective C, Smaltalk,
         Modula-3, ..)
      3. Funkcionalni programski jezici (Lisp, Sheme, ML, Haskel..)
      4. Logički programski jezici (Prolog)
      5. Jezici specijalne namjene: pretraživanje baza podataka (SQL), vizuelno programiranje
         (Delphi, Visual Basic), uređivanje teksta (Perl, TeX, HTML), matematički proračuni
         (Matlab).

    Imperativni programski jezici koriste iskaze koji su bliski naredbama procesora (to su
naredbe pridjele vrijednosti, aritmetičko-logičke operacije, uvjetni i bezuvjetni skokovi te poziv




                                                                                                11
potprograma). Kod objektno orijentiranih jezika naglasak je na tome da varijable predstavljaju
atribute nekog objekta, a funkcije predstavljaju metode pomoću kojih objekt komunicira s
drugim objektima. Specifikacije atributa i metoda određuju klase objekata. Kod funkcionalnih
se jezika ne koristi        temeljna imperativna naredba pridjele vrijednosti, već se sva
međudjelovanja u programu opisuju funkcijama. Teorijska podloga ovih jezika je u tzv. λ-
računu. Kod logičkih programskih jezika međudjelovanja se u programu opisuju predikatnim
logičkim izrazima i funkcijama. Naglasak je na zapisu onoga “što program treba izvršiti”, za
razliku od imperativnih jezika pomoću kojih se zapisuje “kako nešto izvršiti”.
     Apstrakcija je dakle, temeljna mentalna aktivnost programera. Ona je moguća samo ako se
dobro poznaje programski jezik i programske algoritme za efikasno korištenje računarskih
resursa.
O tome će biti riječi u sljedećim poglavljima.




                                                                                           12
2 Matematički i elektronički temelji
računarstva


Naglasci:
   • Izjavna logika
   • Logičke funkcije i predikati
   • Booleova logika
   • Temeljni digitalni sklopovi
   • Brojevni sustavi


2.1 Izjavna i digitalna logika
     Bit će navedeni osnovni pojmovi potrebni za razumijevanje izjavne logike (ili propozicijske
logike), koji se intenzivno koristi u programiranju, i digitalne logike koja je temelj izgradnje
digitalnog računala.
     Osnovni objekt kojeg proučava izjavna logika je elementarna izjava. Ona može imati samo
jedno svojstvo - njome se izriče

     "laž" ili "istina".

      Primjerice, izjava "osam je veće od sedam" je istinita, a izjava "broj sto je djeljiv sa
sedam" je laž. Pri označavanju izjava koristit će se slovo T (true) za istinitu izjavu i F (false) za
lažnu izjavu.
     Rečenica "broj x je veći od broja y" ne predstavlja izjavu jer njena istinitost ovisi o veličini
brojeva x i y. Ako se umjesto x i y uvrste brojevi dobije se izjava. Ovakve rečenice se nazivaju
izjavne funkcije, a za x i y se kaže da su (predmetne) varijable. Odnos među varijablama, kojeg
izjavna funkcija izriče, naziva se predikat. Označi li se u prethodnom primjeru predikat " ... je
veći od.... " sa P, navedena izjavna funkcija se može zapisati u obliku P(x,y).
     Izjavne funkcije se prevode u izjave kada se uvrsti vrijednost predmetnih varijabli ili ako se
uz izjavne funkcije primijene neodređene zamjenice svaki (oznaka ∀ koja se naziva univerzalni
kvantifikator) ili neki (oznaka ∃ koja se naziva egzistencijalni kvantifikator). ∃x se čita i "postoji
x". Primjerice, prethodna izjavna funkcija primjenom kvantifikatora u predikatnom izrazu (∀
y)(∃x)P(x,y) postaje izjava koja znači: "za svaki broj y postoji broj x takav da je x veći od y".
     Rezultat izjavne funkcije je logička vrijednost T ili F. Varijable koje sadrže logičku
vrijednost nazivaju se logičke varijable.
     U programiranju se često koriste izjavne funkcije iskazane tzv. relacijskim izrazima
primjerice
      a ← (x<z)

označava da se logičkoj varijabli a pridijeli logička vrijednost određena izjavnom funkcijom
(x<z). Kada je x manje od z logička varijabla poprima logičku vrijednost T inače je F.
Standardno se koriste relacijski operatori: < (veće), > (manje), ≠ (različito ili nije jednako), ≥
(veće ili jednako), ≤ (manje ili jednako).




                                                                                                   13
Složene logičke izjave nastaju korištenjem sljedećih logičkih operacija:

Konjunkcija, a & b, (ili a ∧ b) dviju izjava a i b je je složena izjava, nastala povezivanjem
               izjava a i b veznikom i za kojeg se upotrebljava simbol ∧ ili &. Složena izjava
               je istinita samo ako su obje izjave istinite. Izjava a & b čita se "a i b".
Disjunkcija, a ∨ b, je složena izjava, koja je lažna onda i samo onda kada su obje izjave
               lažne; a ∨ b čita se "a ili b".
Implikacija, a ⇒ b, je složena izjava koja je lažna onda i samo onda ako je a istinito i b
               lažno; čita se " a povlači b" ili " a implicira b". Za izjavu b ⇒ a kaže se da je
               obrat izjave a ⇒ b. Vrijedi i sljedeće tumačenje implikacije: ako je izjava a ⇒
               b istinita onda je a dovoljan uvjet za b, ili b je nuždan uvjet za a.
Ekvivalencija, a ⇔ b, je složena izjava koja je istinita onda i samo onda kada su obje izjave
               istinite, ili kada su obje lažne: čita se " a je ekvivalentno sa b".
Negacija,      ¬a, je izjava koja je istinita onda i samo onda kada je izjava a lažna.

     Simboli: ¬, &, ∨, ⇔ i ⇒ su logički operatori. Njihovo djelovanje na logičke varijable a i b
je prikazano tzv. tablicom istinitosti (tablica 2.1).

                 A           b          ¬a         a & b       a ∨ b       a ⇒ b      a ⇔ b
                 T           T           F           T            T           T           T
                 T           F           F           F            T           F           F
                 F           T           T           F            T           T           F
                 F           F           T           F            F           T           T

                        Tablica 2.1. Tablica istinitosti logičkih operacija

     Upotrebom logičkih operatora i uvođenjem zagrada mogu se, kao i u algebri, graditi razni
logički izrazi, primjerice

      ¬a ∨ (b & d) ⇒ c.

Redoslijed izvršavanja operacija je sljedeći: (1) izraz u zagradi, (2) negacija, (3) disjunkcija, (4)
konjunkcija, (5) implikacija i ekvivalencija. Logički izrazi koji sadrže samo operacije negacije,
konjunkcije i disjunkcije, te zagrade, određuju Booleovu algebru. Svi se logički izrazi mogu
iskazati Booleovom algebrom jer se djelovanje operatora implikacije i ekvivalencije može
izraziti pomoću Booleovih izraza. Vrijedi:

      x ⇒ y      = ¬x ∨ y
      x ⇔ y      = ¬((¬x & y) ∨ (¬y & x))

Zadatak: Provjerite prethodne izraze tablicom istinitosti.

U Booleovoj algebri vrijede slijedeće zakonitosti:

1. Zakon komutacije

      x ∨ y ≡ y ∨ x
      x & y ≡ y & x

2. Zakon asocijacije




                                                                                                  14
x ∨ (y ∨ z) ≡ (x ∨ y) ∨ z
      x & (y & z) ≡ (x & y) & z

3. Zakon idempotentnosti

      x ∨ x ≡ x
      x & x ≡ x

4. Zakon distribucije

      x ∨ (y & z) ≡ (x ∨ y) & (x ∨ z)
      x & (y ∨ z) ≡ (x & y) ∨ (x & z)

5. De Morganov teorem

      ¬(x ∨ y) ≡ ¬x & ¬y
      ¬(x & y) ≡ ¬x ∨ ¬z

6. Zakon dvostruke negacije

      ¬¬x ≡ x

     Booleova logika ima veliku primjenu u programiranju i posebno pri projektiranju sklopova
digitalnog računala, jer se gotovo svi potrebni sklopovi digitalnog računala mogu realizirati
pomoću tri temeljna elektronička sklopa: invertor, sklop-I (eng. AND gate) i sklop-ILI (eng.
OR gate).




                              Slika 2.1. Temeljni digitalni sklopovi

     Ovi se sklopovi upravljaju naponom (ili strujom) tako da reagiraju na stanje pod naponom
i stanje bez napona, dakle oni raspoznaju samo dvije naponske razine: nisku i visoku.
Uobičajeno se ta dva stanja označavaju s "1" i "0" umjesto s true i false. To su sklopovi kojima
izlaz odgovara operacijama negacije, disjunkcije i konjunkcije ulaznih logičkih stanja "0" i "1".
Funkcija ovih sklopova se može prikazati pomoću preklopki. Primjerice, rad sklopa I se može
opisati strujnim krugom u kojem su serijski spojene žarulja, sklopka A i sklopka B. Žarulja će
zasvijetliti kada proteče struja, a to je moguće samo ako ako su obje sklopke uključene, odnosno
izlaz je 1 samo ako su varijable A i B jednake 1. Kod sklopa ILI dovoljno je uključiti jednu
sklopku da bi zasvijetlila žarulja. Očito sklop I obavlja logičku funkciju konjunkcije, a sklop ILI
obavlja logičku funkciju disjunkcije. U digitalnom se računalu pomoću navedenih sklopova
obrađuje i prenosi mnoštvo digitalnih signala.
     Pošto je uvedeno označavanje stanja digitalnog signala znamenkama 0 i 1, može se reći da
se digitalnim signalom prenosi poruka o vrijednosti binarne znamenke koja u jednom trenutku




                                                                                                15
može imati iznos nula ili jedinica. Iz tog se razloga umjesto pojma Booleova algebra ili
matematička logika često koristi pojam digitalna logika.
     U digitalnoj je tehnici uobičajena primjena logičkih operatora na nizove bitova. Tada se
podrazumijeva da se logičke operacije provode nad bitovima jednake značajnosti. Takve
logičke operacije se nazivaju bit-značajne operacije.
Primjer: bit značajnom konjunkcijom dva binarna niza A i B dobije se niz C:

              7 6 5 4 3 2 1 0    bit
              -----------------------
              1 1 0 0 1 1 1 1 = A
              0 0 0 0 0 1 0 0 = B
                ----------------------
      A & B = 0 0 0 0 0 1 0 0 = C

U nizu C jedino bit 2 može biti jednak 1 i to samo ako je i u nizu A taj bit jednak 1. Ovo je
često korišten postupak da se ispita da li je neki bit u nizu jednak 1 ili 0. Obično se niz B naziva
"maska" za ispitivanje bitova u nizu A.
    Pored prije navedenih Booleovih logičkih operacija u digitalnoj se tehnici često koristi bit-
značajna operacija koja se naziva ekskluzivna disjunkcija ili ekskluzivno ILI. Označava se
znakom ⊕ ili XOR. Ima značaj zbrajanja po modulu 2, a njeno korištenje u programiranju bit će
pojašnjeno kasnije.

      A XOR B = A ⊕ B = (¬A & B) ∨ (A & ¬B)




             A        B      A ⊕ B
             0        0        0
             0        1        1               A ⊕ B   = (¬A & B) ∨ (A & ¬B)
             1        0        1
             1        1        0


      Slika 2.2 Definicijska tablica ekskluzivne disjunkcije i simbol digitalnog XOR-sklopa


2.2 Brojevni sustavi i računska sposobnost računala
      U programskim jezicima operacije s brojevima se najčešće zapisuju u decimalnom
brojevnom sustavu, jer je čovjek naviknut na rad s decimalnim brojevima. U računalu se pak
računske operacije vrše u binarnom brojevnom sustavu.

2.2.1 Binarni brojevni sustav
Sasvim općenito, numerička vrijednost broja Z, koji je u pozicionoj notaciji zapisan
znamenkama: zn-1....z1z0, u brojevnom sustavu baze x, računa se prema izrazu:
                                        n −1
             Z = ( zn −1 .... z1z0 ) x = ∑ zi ⋅ x i
                                        i =0
Decimalni brojevni sustav je definiran bazom x=10 i znamenkama zi ε{0,1,2,3,4,5,6,7,8,9},
primjerice iznos broja 765 je jednak 7⋅102 + 6⋅101 + 5⋅100 .




                                                                                                 16
Binarni brojevni sustav    je definiran bazom x=2 i binarnim znamenkama zi ∈
{0,1}.Primjerice, iznos binarnog broja 1011 odgovara iznosu broja 11 u decimalnom sustavu,
jer je
             (1011)2 = 1⋅23 + 0⋅22 + 1⋅21 +1⋅20 = 8 + 0 + 2 + 1 = (11)10.
     Općenito vrijedi da se s binarnim nizom od n bita može kodirati pozitivni cijeli broj
maksimalnog iznosa 2n -1, što odgovara broju različitih kombinacija binarnog niza duljine n
umanjenom za jedan (i nula je broj!). Za pozitivne cijele brojeve koristi se i nazivi kardinalni
brojevi i nepredznačeni cijeli brojevi.
     U binarnom brojevnom sustavu se mogu izvoditi osnovne računske operacije kao i u
decimalnom brojevnom sustavu. Binarno zbrajanje se obavlja kao i decimalno zbrajanje, osim
što se prijenos na slijedeće značajnije mjesto ne obavlja nakon zbroja 10, već nakon 2 (1+1).
Primjer:

                                                        1 1      ← prijenos
           1 0 1   = 510                               1 1 1   = 710
         + 0 1 0   = 210                             + 1 0 1   = 510
         -----------------                             ----------------------
           1 1 1   = 710                             1 1 0 0   = 1210


     Ukoliko se zbrajanje izvodi bez prijenosa ta operacija se naziva zbrajanje po modulu 2. U
logičkom smislu ta operacija je ekvivalentna ekskluzivnoj disjunkciji (XOR). Operaciju
zbrajanja LSB bitova može se prikazati tablicom istinitosti 2.2:


                     A        B       zbroj = A ⊕ B          prijenos = A & B
                     0        0             0                        0
                     0        1             1                        0
                     1        0             1                        0
                     1        1             0                        1

                           Tablica 2.2. Tablica istinitosti za polu-zbrajalo

                      A           B        Donos          Zbroj        prijenos
                      0           0          0              0              0
                      0           0          1              1              0
                      0           1          0              1              0
                      0           1          1              0              1
                      1           0          0              1              0
                      1           0          1              0              1
                      1           1          0              0              1
                      1           1          1              1              1

                          Tablica 2.3. Tablica istinitosti za potpuno zbrajalo

     Digitalni sklop koji realizira ovu funciju naziva se poluzbrajalo (half-adder) i prikazan je na
slici 2.3(a). Pri zbrajanju ostalih bitove treba pribrojiti i bit donosa kao u tablici 2.3. Digitalni
sklop koji realizira ovu funkciju naziva se potpuno zbrajalo (full-adder). Prikazan je na slici
2.3(b).
     Očito je da se upotrebom više ovakvih sklopova može "izračunati" zbroj dva binarna niza,
na način da se "prijenos" s zbrajala bitova manjeg značaja prenosi kao "donos" u zbrajalo
bitova većeg značaja.




                                                                                                  17
Slika 2.3 Sklopovska izvedba 1-bitnog zbrajala

      Operacija ekskluzivne disjunkcije (XOR) se često koristi u bit-značajnim operacijama pri
šifriranju i u programima s bit-mapiranim grafičkim algoritmima. Interesantno svojstvo ove
operacije je da ako se na neki binarni niz A dva puta uzastopno primjeni bit-značajna
ekskluzivna disjunkcija s nizom B rezultatni niz je jednak nizu A. Primjerice, neka je niz A=
1010, a niz B=0110. Tada je:

       A ⊕ B = 1100
      (A ⊕ B) ⊕ B = 1010 = A

Dakle, prvo djelovanje je šifriranje, a drugo djelovanje je dešifriranje originalnog niza.
     Oduzimanje broja se može izvesti kao zbrajanje negativne vrijednosti broja. Kako se
kodiraju negativni brojevi bit će pokazano kasnije.
     Binarno množenja se vrši tako da se djelomičan umnožak pomiče za jedno mjesto ulijevo
pri svakom uzimanju idućeg množitelja. Ako je množitelj 0, djelomični umnožak je 0, a ako je
množitelj 1, djelomični umnožak jednak je množeniku. Primjer:

      5 x 5 = 25                                   5 x 10 = 50

          101   (5)                                101     (5)
          101   (5)                               1010    (10)
      ------------                             ---------------
          101                                      000
         000                                      101
        101                                      000
      ------------                              101
        11001 (25)                             ----------------
                                                110010    (50)

    Binarno dijeljenje se u računalu izvodi primjenom binarnog množenja i oduzimanja, na isti
način kao i kod decimalnih brojeva. Navedene operacije su ugrađene u skup naredbi većine
današnjih procesora.




                                                                                             18
Još dvije operacije su specifične za rad s nizovima bitova. To su operacije logičkog
posmaka bitova u lijevo ili u desno (podrazumijeva se LSB na desnoj strani niza), a označavaju
se sa SHL (eng. shift left - posmak u lijevo) i SHR (shift right - posmak u desno).
     Posmak od jednog mjesta u lijevo odgovara množnju kardinalnih brojeva s 2, a posmak
bitova jedno mjesto udesno odgovara dijeljenju kardinalnih brojeva s 2. Na prazna mjesta se
postavljaju nule.
Primjer:

      0011 SHL 1 ≡ 0110               odgovara        3 * 2 = 6
      0011 SHL 2 ≡ 1100               odgovara        3 * 4 = 12
      1110 SHR 1 ≡ 0111               odgovara       14 / 2 = 7

2.2.2 Oktalni i heksadecimalni brojevni sustavi
     U višim programskim se jezicima rijetko koristi zapis broja u binarnom obliku jer čovjek
teško pamti veće nizove "nula i jedinica". Radije se koristi oktalni ili heksadecimalni brojevni
sustav.
     U oktalnom brojevnom sustavu koristi se 8 znamenki: 01234567, a baza brojevnog sustava
je x=23=8. Oktalnim brojem jednostavno se označava niz od 3 bita, jer je s binarnim nizom od 3
bita moguće kodirati 8 znamenki oktalnog brojevnog sustava:

      bit 0   0 1 0 1 0 1 0 1
      bit 1   0 0 1 1 0 0 1 1
      bit 2   0 0 0 0 1 1 1 1
      -----------------------
              0 1 2 3 4 5 6 7             znamenke oktalnog brojevnog sustava

To omogućuje pregledniji zapis većih binarnih nizova, primjerice

      1001000101112 = 44278,

a koristi se pravilo grupiranja po 3 bita: 100=4, 100=4, 010=2, 111=7.
    U heksadecimalnom brojevnom sustavu koristi se 16 znamenki: 0123456789ABCDEF, a
baza brojevnog sustava iznosi x=16. Za kombinacije od 10 do 15 upotrebljena su prva slova
abecede, kojima numerička vrijednost u decimalnom brojevom sustavu iznosi:

      A=10, B=11, C=12, D=13, E=14 i F=15.

     Heksadecimalnim se brojem jednostavno označava niz od 4 bita, jer se binarnim nizom od
4 bita može kodirati 16 znamenki heksadecimalnog brojevnog sustava:

      bit 0   0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
      bit 1   0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
      bit 2   0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
      bit 3   0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
      ---------------------------------------
              0 1 2 3 4 5 6 7 8 9 A B C D E F                heksadecimalne znamenke

To omogućava pregledniji zapis većih binarnih nizova, primjerice:

      10010001011111102 = 917E16,

a koristi se pravilo grupiranja po 4 bita: 1001=9, 0001=1, 0111=7, 1110=E.
    U programskim jezicima se uvode posebna leksička pravila za zapis konstanti u pojedinom
brojevnom sustavu. Ta pravila će biti opisana u četvrtom poglavlju.




                                                                                             19
3 Izrada prvog C programa


Naglasci:
   • Izvorni program i izvršni program
   • Prvi program u C jeziku – hello.c
   • Kompiliranje programa koji je napisan u više datoteka
   • Integrirana programska okolina
   • Makefile

U ovom poglavlju opisani su programi koji se koriste u razvoju programa. Njihova upotreba se
demonstrira s nekoliko jednostavnih programa u C jeziku.


3.1 Strojni, asemblerski i viši programski jezici
     Procesor izvršava radnje u računalu na temelju binarno kodiranih strojnih naredbi, koje
dobavlja iz memorije računala. Skup svih strojnih naredbi procesora naziva se strojni jezik, a
skup naredbi kojima se neposredno izvršava neka zadana operacija u računalu naziva se strojni
program.
     Strojne naredbe je veoma teško pamtiti. Zbog toga se koristi simboličko zapisivanje naredbi
asemblerskim jezikom, u kojem se naredbe zapisuju s kraticama riječi iz engleskog jezika.
Primjerice, naredba da se broj, koji se nalazi u registru ax procesora Intel 8086, uveća za jedan,
glasi:

      strojni jezik                   01000000
      asemblerski jezik                 inc ax        (inc je kratica od increment)

Dakle, binarni strojni kôd je zamijenjen simboličkim zapisom koje procesor ne razumije. Za
prevođenje asemblerskog zapisa u strojni program koristi se program koji se naziva asembler.
    Viši programski jezici omogućuju jednostavnije programiranje uvođenjem simboličkih
naredbi koje zamjenjuju više naredbi strojnog jezika. Primjerice, iskaz C jezika

      x = sin(3.14) + 7;

znači naredbu da se varijabli x pridijeli vrijednost koja se dobije zbrojem vrijednosti funkcije
sin(3.14) i konstante 7.
     Zapis programa asemblerskim ili višim programskim jezikom naziva se izvorni program
(eng. source program). Za pisanje izvornog programa koriste se programi za uređivanje teksta
koji se nazivaju editori. Izvorni program u C jeziku se obično pohranjuje kao datoteka s
imenom koje završava znakovima “.c”
     Programi za prevođenje izvornog programa u izvršni program mogu biti realizirani kao
interpreteri ili kao kompilatori (eng. compiler), a razlika među njima je u načinu kako se izvorni
program prevodi u izvršni program.
     Kompilator analizira izvorni program i stvara strojni kôd, koji pohranjuje u tzv. objektnu
datoteku (eng. object file). Kod MS-DOS računala ime objektne datoteke završava s “.obj”, a
kod Unix računala s “.o”. Iako objektna datoteka sadrži strojni kôd, on još nije pogodan za
izvođenje u računala, naime za izvođenje programa potrebno je odrediti veze s operativnim




                                                                                               20
sustavom i memorijske lokacije programskih objekata. To se vrši programom koji se zove
povezivač ili linker. Nakon obrade s linkerom dobije izvršni ili izvedivi program (eng.
executive program), a ako se pohrani kao datoteka onda se ta datoteka naziva izvršna datoteka
(eng. executive file). Kod MS-DOS računala ime izvršne datoteke završava slovima “.exe”.
Postoje programi u kojima je integrirana funkcija kompilatora i linkera. Primjerice, Microsoft
Visual C sadrži program "cl.exe", a na Unix-u se koriste "cc" ili "gcc" programi.
     Učitavanje izvršne datoteke u memoriju računala vrši program koji se naziva punjač (eng.
loader). On je sastavni dio operativnog sustava računala. Korisnik pokreće izvršenje programa
tako da otkuca ime programa u komandnoj liniji ili se služi programima s grafičkim sučeljem
(primjerice, program Explorer kod Windows-a). Ostale radnje punjača obavlja operativni
sustav.
     Programi se mogu izvršavati i pomoću specijalnih programa koji služe za testiranje
izvršenja procesa. Tu spadaju programi koji se nazivaju dibageri (eng. debugger) i monitori.
Pomoću njih je moguće izvršavati program u konačno zadanom broju koraka, naredbu po
naredbu, i nakon svakog koraka moguće je pratiti stanje varijabli (memorije) i registara
procesora. Kod naprednijih dibagera moguće je pratiti izvršenje programa na razini izvornog
koda, dok se kod jednostavnijih dibagera i monitora izvršenje programa može pratiti na razini
strojnog koda.
     Interpreter prevodi izvorni kod u niz izvršnih naredbi koje se obično izvršavaju unutar
samog programa interpretera. Skup izvršnih naredbi interpretera obično se naziva "virtuelni
stroj" (primjerice Java VM ili Microsoft CLR). Program za "interpretiranje", pomoću virtuelnog
stroja, može biti i odvojeni program. U tom slučaju interpreter ima funkciju kompilatora koji
generira datoteke s nizom naredbi virtuelnog stroja.
     U razvoju programa koristi se veliki broj programa, tzv. softverskih alata, koji olakšavaju
razvoj programa i pisanja dokumentacije. Primjerice, na Unix-u se koriste: make - program za
kontrolu procesa kompiliranja, grep - program za pretraživanje datoteka, profiler - program za
analizu izvršenja programa, diff – program za utvrđivanje razlika među izvornim datotekama,
patch – program za automatsko unošenje izmjena u izvorne datoteke. Kod Windows
operativnog sustava više su u upotrebi programi koji se nazivaju integrirana razvojna okolina
(eng. IDE – integrated developement environment) kod kojih se pod jedinstvenim grafičkim
sučeljem koordinira rad svih faza razvoja programa – editiranje izvornog koda, kompiliranje,
dibagiranje i profiliranje koda. U okviru IDE-a integriran je i pristup kompletnoj dokumentaciji
kompilatora i programskih biblioteka. Bez sumnje, najpopularniji program ovog tipa je
Microsoft Visual Studio.


3.2 Prvi program u C jeziku
Gotovo sve knjige o C jeziku kao prvi primjer C-programa uzimaju program:

      /* Datoteka: hello.c */
      /* Prvi C program. */

      #include <stdio.h>

      int main()
      {
        printf("Hello world!n");
        return 0;
      }


Ovaj program vrši samo jednu radnju; na standardnom izlaznom uređaju ispisuje poruku:

      Hello World!.




                                                                                             21
Na slici 3.1 prikazan je Windows komandni prozor. On se još naziva MS-DOS prozor ili
još jednostavnije komandna konzola. Karakteristika ispisa u konzoli je da se može jedino vršiti
ispis teksta, i to u po principu da se ispisuje redak po redak, od vrha konzole na dolje. U konzoli
se mogu zadavati komande operativnom sustavu u retku koji uobičajeno započinje s oznakom
tekućeg direktorija. Taj redak se naziva komandna linija operativnog sustava.
     Najprije će biti pokazano kako se može editirati, kompilirati i izvršiti ovaj program,
koristeći komandnu liniju operativnog sustava u MSDOS-prozoru (sl. 3.1). To se vrši u tri
koraka:
    1. Pomoću editora stvara se tekstualna datoteka, imena "hello1.c", koja sadrži prikazani
       izvorni kôd programa.
    2. Pomoću kompilatora se izvorni kôd programa prevodi u objektni, a zatim i u izvršni
       kôd. Ako kompilator dojavi da u izvornom kôdu postoje leksičke ili sintaktičke
       pogreške, ponavlja se korak 1 i ispravljaju pogreške.
    3. Izvršenje programa se zadaje u komandnoj liniji.

Primjer za OS Windows:
c:> edit hello.c ↵               - poziv editora edit (↵ je tipka enter)
                                   i unos izvornog programa u datoteku hello.c
c:> cl hello.c ↵                 - poziv kompilatora (Microsoft-program cl.exe)
                                   koji stvara izvršnu datoteku hello.exe
c:> hello ↵                      - komanda za izvršenje programa hello.exe
Hello world!                     - rezultat izvršenja programa




                Slika 3.1 Izgled komandnog prozora u Windows operativnom sustavu

Primjer za OS Linux:
$ vi hello.c ↵                          - poziv editora vi
                                          i unos datoteke hello.c
$ gcc hello.c –o hello ↵                - poziv kompilatora gcc,
                                          koji stvara izvršnu datoteku hello
$ hello ↵                               - komanda za izvršenje programa hello
Hello world!                            - rezultat izvršenja programa




                                                                                                22
Analiza programa "hello1.c":
     C programi se sastoje od niza potprograma koji se zovu funkcije C-jezika. U programu
"hello1.c" definirana je samo jedna funkcija, nazvana main(). Ona mora biti definirana u
svakom C programu, jer predstavlja mjesto početka izvršenja programa. Programer može
definirati nove funkcije, svaku s jedinstvenim imenom, a mogu se koristiti i prethodno
definirane funkcije iz standardne biblioteke funkcija C jezika.
     Radnje koje obavlja neka funkcija zapisuju se unutar tijela funkcije. Tijelo funkcije je
omeđeno vitičastim zagradama. U ovom je slučaju u tijelu funkcije je iskaz koji predstavlja
naredbu da se pomoću standardne C funkcije printf(), na standardnoj izlaznoj jedinici,
ispiše poruka "Hello World!".

    Pojedini dijelovi programa "hello1.c" imaju sljedeći značaj:

    /* Prvi C program. */                 Tekst omeđen znakovima /* i */ predstavlja
                                          komentar. Kompilator ne analizira komentare,
                                          već ih tretira kao umetnuto "prazno" mjesto.
    #include <stdio.h>                    #include         predstavlja      pretprocesorsku
                                          direktivu. Ona označava da u proces
                                          kompiliranja treba uključiti sadržaj datoteke
                                          imena "stdio.h". Ta datoteka sadrži deklaracije
                                          funkcija iz standardne biblioteke C-jezika.
    int main()                            Ovo je zaglavlje funkcije imena main.
                                          int označava tip vrijednosti (cijeli broj) koji
                                          vraća funkcija na kraju svog izvršenja (u ovom
                                          programu to nema nikakvi značaj).
    {                                     { označava početak tijela funkcije main.
    printf("Hello world!n");             Ovo je naredba za poziv standardne funkcije
                                          printf(), kojom se ispisuje niz znakova
                                          (string) koji je argument ove funkcije.
                                          n predstavlja oznaku za prijelaz u novi red
                                          ispisa.
                                          Znak točka-zarez označava kraj naredbe.
    Return 0;                             main() "vraća" vrijednost 0, što se uobičajeno
                                          koristi kao oznaka      uspješnog završetka
                                          programa.
    }                                     } označava kraja tijela funkcije main.


     U objašnjenju programskih iskaza korišteni su neki novi pojmovi (deklaracija, standardna
biblioteka, pretprocesorska direktiva). Oni će biti objašnjeni u sljedećim poglavljima.

     Ako program nije napisan u skladu s pravilima jezika, tada kažemo da je program
sintaktički pogrešan. Primjerice, ukoliko u prethodnom programu nije otkucana točka-zarez iza
naredbe printf("Hello world!n"), kao u programu "hello2.c",




                                                                                              23
/* Datoteka: hello2.c */
      /* Hello s greškom   */

      #include <stdio. h>

      int main()
      {
        printf("Hello world!n")              /* greška: nema ; */
        return 0;
      }


tada kompilator, u ovom slučaju program cl.exe, ispisuje poruku da postoji sintaktička pogreška
u sljedećem obliku:


      C:>cl hello.c

Microsoft (R) 32-bit C/C Optimizing Compiler Ver.12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

hello.c
hello.c(5) : error C2143: syntax error : missing ';' before 'return'

Poruka o greški ima sljedeće elemente:

      hello.c(5) – obavijest da je greška u retku 5 datoteke "hello.c",
      error C2143: syntax error - kôd i tip greške,
      missing ';' before 'return' – kratki opis mogućeg uzroka greške.

Na temelju dojave greške često je lako izvršiti potrebne ispravke u programu.
     Važno je uočiti da je kompilator pronašao grešku u petom retku, iako je pogrešno napisana
naredba u četvrtom retku. Razlog tome je pravilo C jezika po kojem se naredba može pisati u
više redaka, a stvarni kraj naredbe predstavlja znak točka-zarez. Pošto kompilator nije pronašao
točku-zarez u četvrtom retku, kompiliranje je nastavljeno s petim retkom i tek tada je utvrđeno
da postoji pogreška.
Zadatak: Provjerite da li je sintaktički ispravno napisan sljedeći program:

      /* Datoteka: hello3.c
       * Zapis naredbe u više redaka
       */
      #include <stdio. h>

      int
      main()
      {
        printf
        (
        "Hello world!n"
        );
        return
        0;
      }




                                                                                             24
3.3 Struktura i kompiliranje C programa
     Na sličan način, kao u funkciji main(), može se neka druga grupa naredbi definirati kao
posebna funkcija s prikladnim imenom. Primjerice, prethodni program se može napisati pomoću
dvije funkcije Hello() i main() na sljedeći način:

      /* Datoteka: hello4.c
       * Program s korisnički definiranom funkcijom Hello()
       */

      #include <stdio.h>

      void Hello()
      {
         printf("Hello worldn");
      }

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



    Za razumijevanje ovog programa potrebno je upoznati pravila za definiranje i pozivanje
funkcija.

    Funkcija se definira zaglavljem i tijelom funkcije.

     Zaglavlje funkcije se zapisuje na sljedeći način: ime funkcije se zapisuje nizom znakova
koji sadrži slova, znamenke i znak '_', ali uz uvjet da je prvi znak niza slovo ili '_'. Ispred imena
funkcije se navodi vrijednost koju funkcija vraća. Ako funkcija ne vraća nikakovu vrijednost
tada se ispred imena piše riječ void, koja znači “ništa ili nevažno je”. Ovakve funkcije se
nazivaju procedure. U njima se ne mora koristiti naredba return, već one završavaju kada se
izvrši posljednje definirana naredba. Iza imena funkcije se, u zagradama, navode formalni
argumenti funkcije, ako ih ima. Kasnije će biti objašnjeno kako se definiraju i koriste argumenti
funkcije.

    Tijelo funkcije se zapisuje unutar vitičastih zagrada, a sadrži niz naredbi i deklaracija.

     Poziv funkcije je naredba za izvršenje funkcije, (tj. za izvršenje naredbi koje su definirane
unutar funkcije). Zapisuje se na način da se prvo napiše ime funkcije, a zatim obvezno zagrade i
argumenti funkcije, ako su prethodno definirani. Primjerice, u funkciji main() iskaz
Hello(); predstavlja poziv funkcije Hello(). Poziv funkcije pokreće izvršenje naredbi koje
su definirane u tijelu funkcije Hello(), tj. poziva se funkcija printf() s argumentom
"Hello Worldn". Nakon izvršenja te naredbe program se vraća, u funkciju main() na
izvršenje prve naredbe koja je napisana iza poziva funkcije Hello(). Funkcija iz koje se
pokreće izvršenje pozvane funkcije naziva se pozivna funkcija.
     U prethodnom primjeru funkcija Hello() je definirana prije funkcije main(). Taj
redoslijed je određen pravilom da se funkcija može pozivati samo ako je prethodno definirana.
Iznimka od ovog pravila je ako se koriste tzv. prototipovi funkcija (ili unaprijedne deklaracije
funkcija).




                                                                                                  25
Prototip ili deklaracija funkcije je zapis u koji sadrži zaglavlje funkcije i znak točka-zarez.
On služi kao najava da je funkcija definirana negdje drugdje; u standardnoj biblioteci ili u
programu iza mjesta njenog poziva ili u drugoj datoteci. U skladu s ovim pravilom dozvoljeno
je prethodni program pisati u obliku:

      /* Datoteka: hello5.c:
       * C program s korisnički definiranom funkcijom Hello()
       * i prototipom funkcije Hello()
       */
      #include <stdio.h>

      void Hello();        /* prototip ili deklaracija funkcije Hello()*/

      int main()                           /* definicija funkcije main()                 */
      {
         Hello();
         return 0;
      }

      void Hello()                /* definicija funkcije Hello()                           */
      {
          printf("Hello worldn");
      }


U C jeziku se programi mogu zapisati u više odvojenih datoteka. Primjerice, prethodni program
se može zapisati u dvije datoteke "hellomain.c" i "hellosub.c". U datoteci "hellomain.c"
definirana je funkcija main() i deklarirana je funkcija Hello(). Definicija funkcije Hello()
zapisana je u datoteci "hellosub.c".


      /* Datoteka: hellomain.c */                  /* Datoteka: hellosub.c */

      void Hello();                                #include <stdio.h>

      int main()                                     void Hello()
      {                                              {
         Hello();                                       printf("Hello worldn");
         return 0;                                   }
      }


Izvršni program se može dobiti komandom:

      c:> cl     hellomain.c hellosub.c /Fe"hello.exe"

U komandnoj liniji su zapisana imena datoteka koje treba kompilirati. Zatim je komandnom
preklopkom /Fe zapisano da izvršnu datoteku treba formirati pod imenom "hello.exe".




                                                                                                 26
Slika 3.2 Proces formiranja izvršnog programa

     Proces formiranja izvršnog programa je prikazan na slici 3.2. Najprije leksički pretprocesor
kompilatora unosi sve deklaracije iz datoteke "stdio.h" u datoteku "hellosub.c". Zatim
kompilator prevodi izvorne datoteke "hellomain.c" i "hellosub.c" u objektne datoteke
"hellomain.obj" i "hellosub.obj". U ovim datotekama se uz prijevod izvornog koda u strojni
jezik nalaze i podaci o tome kako izvršiti poziv funkcija koje su definirane u drugoj datoteci.
Povezivanje strojnog kôda, iz obje datoteke, u zajednički izvršni program obavlja program
link.exe, kojeg skriveno poziva program cl.exe.
     Dobra strana odvajanja programa u više datoteka je da se ne mora uvijek kompilirati sve
datoteke, već samo one koje su mijenjane. To se može ostvariti na sljedeći način:
Prvo se pomoću preklopke /c kompilatorskom pogonskom programu cl.exe zadaje da izvrši
prijevod u objektne datoteke, tj.

      c:> cl /c hellomain.c
      c:> cl /c hellosub.c

Time se dobiju dvije objektne datoteke: "hellomain.obj" i "hellosub.obj". Povezivanje ovih
datoteka u izvršnu datoteku vrši se komandom:

      c:> cl hellomain.obj hellosub.obj /Fe"hello.exe"

Ako se kasnije promijeni izvorni kôd u datoteci "hellomain.c", proces kompiliranja se može
ubrzati komandnom:

      c:> cl hellomain.c hellosub.obj /Fe"hello.exe"

jer se na ovaj način prevodi u strojni kôd samo datoteka "hellomain.c", a u procesu formiranja
izvršne datoteke koristi se prethodno formirana objektna datoteka "hellosub.obj".


3.4 Integrirana razvojna okolina (IDE)
     Integrirana razvojna okolina Visual Studio omogućuje editiranje izvornog koda,
kompiliranje, linkanje, izvršenje i dibagiranje programa. Sadrži sustav "on-line" dokumentacije
o programskom jeziku, standardnim bibliotekama i programskom sučelju prema operativnom
sustavu (Win32 API). Pomoću njega se mogu izrađivati programi s grafičkim korisničkim
sučeljem i programi za konzolni rad.
Nakon poziva programa dobije se IDE Visual Studio prikazan na slici 3.3.




                                                                                              27
Slika 3.3 Izgled Visual Studio pri pokretanju programa


    Najprije će biti opisano kako se formira projekt za konzolni tip programa. Prije pokretanja
programa, neka se u direktoriju c:My DocumentsC2002pog2 nalaze izvorne datoteke
hellomain.c i hellosub.c.
    Pokretanjem komande menija: File-New-Project, dobije dijalog za postavljanje novog
projekta. U dijalogu prikazanom na slici 3.4 označeno je
    1. da će projekt biti klase: Win32 Console Application,
    2. upisano je ime direktorija d:src
    3. gdje će biti zapisana dokumentacija projekta imena hello.
     U ovom slučaju Visual Studio zapisuje dokumentaciju projekta u datotekama hello.vsproj i
hello.sln (datoteka ekstenzije .sln sadrži opis radne okoline, a datoteka ekstenzije .vcproj sadrži
opis projekta). Visual Studio također automatski formira dva poddirektorija: .Release i
.Debug, u kojima će se nalaziti objektne i izvršne datoteke. (Debug direktorij je predviđen za
rad kompilatora u obliku koji je prikladan za pronalaženje grešaka u programu)
     Pokretanjem komande: Project - Add to project – File, u dijalogu prikazanom na slici 3.9
odabiremo datoteke "hellomain.c" i "hellosub.c", iz direktorija c:My Documentscpp-
2001pog3. Dobije se izgled radne okoline kao na slici 3.10.

     Pokretanjem komande: Build – Build hello.exe vrši se proces kompiliranja i linkanja. Ako
se izvrši bez greške, nastaje izvršni program imena hello.exe. Program hello.exe se može
pokrenuti pozivom komande Build – Execute hello.exe (ili pritiskom tipki Ctrl+F5).




                                                                                                28
Slika 3.4 Dijalog za postavljanje novog projekta




Slika 3.5 Dijalog za postavljanje tipa Win32-Console projekta




                                                                29
Slika 3.6 Dijalog koji izvještava o postavkama novog projekta




Slika 3.7 Izgled radne okoline nakon formiranja novog projekta “hello”




                                                                         30
Slika 3.9 Dijalog za umetanja datoteka u projekt




  Slika 3.10 Izgled IDE s aktivnim editorom




                                                   31
3.5 Usmjeravanje procesa kompiliranja programom nmake
    Kada se program sastoji od velikog broja datoteka, procesom kompiliranja se može
upravljati pomoću program imena nmake (make na UNIX-u) i specifikacije koja se zapisuje u
datoteci koji se obično naziva makefile. Za prethodni primjer datoteka makefile može biti
napisana na sljedeći način:

       # datoteka: makefile
       #Simbolička definicija za spisak objektnih datoteka
       OBJS = hellomain.obj hellosub.obj

       #progam se formira povezivanjem objektnih datoteka:
       hello.exe : $(OBJS)
            cl $(OBJS) /Fe"hello.exe"

       # $(...) znači umetanje prethodnih makro definicija

       # ovisnost objektnih datoteka o izvornim datotekama
       # i komanda za stvaranje objektne datoteke
       hellomain.obj : hellomain.c
            cl -c hellomain.c
       hellosub.obj : hellosub.c
            cl -c hellosub.c

Ako se ovu datoteku spremi pod imenom makefile, dovoljno je u komandnoj liniji otkucati:

       c:> nmake

i biti će izvršen cijeli postupak kompiliranja i linkanja izvršnog programa. Ako se pak ova
datoteka zapiše pod nekim drugim imenom, primjerice "hello.mak", u komandnoj liniji, iza
preklopke –f treba zadati i ime datoteke, tj.

       c:>nmake –fhello.mak

Kako se formira makefile.
Temeljna pravila formiranja makefile datoteke su:
   • Komentari se u makefile zapisuju tako da redak započne znakom #.
   • Mogu se navesti različite simboličke definicije oblika: IME = text, što omogućuje da
       na mjestu gdje se piše $(IME) bude supstituiran text.
   • U makefile se zatim navodi niz definicija koje se sastoje od dva dijela: prvi dio opisuje
       ovisnost datoteka, a drugi opisuje kao se ta ovisnost realizira. Primjerice, u zapisu

       hellosub.obj : hellosub.c
           cl –c hellosub.c

   •    U prvom retku je označena ovisnost sadržaja "hellosub.obj" o sadržaju "hellosub.c".
   •    U drugom retku je specificirana komanda koja se primjenjuje na datoteku "hellosub.c"
   •    Redak u kojem se specificira komanda mora započeti znakom tabulatora
     Program nmake uspoređuje vrijeme kada su nastale međuovisne datoteke. Čim se promijeni
sadržaj "hellosub.c", dolazi do razlike u vremenu nastanka međuovisnih datoteka, pa program
nmake pokreće program za kompiliranje koji je specificiran u drugom retku.
     Korištenje makefile je vrlo popularno, posebno na Unix sustavima i kod profesionalnih
programera, jer se pomoću simboličkih definicija lako može definirati proces kompiliranja na
različitim operativnim sustavima.




                                                                                           32
4 Kodiranje i tipovi podataka


Naglasci:
   • kodiranje brojeva
   • kodiranje znakova
   • kodiranje logičkih vrijednosti
   • pojam tipa podataka
   • tipovi konstanti i varijabli u C jeziku
   • adrese i pokazivači
   • ispis i unos podataka

U ovom se poglavlju se opisuje kako se u računalu kodiraju brojevi i znakovi, objašnjava se
koncept tipa podataka i pokazuje karakteristike tipova u C jeziku.


4.1 Kodiranje i zapis podataka
    Kodiranje je postupak kojim se znakovima, numeričkim vrijednostima i drugim tipovima
podataka pridjeljuje dogovorom utvrđena kombinacija binarnih znamenki. Ovdje će biti opisano
kodiranje koje se koristi u C jeziku.
    S programerskog stajališta, važnije od samog načina kodiranja je veličina zauzeća
memorije i interval vrijednosti koji se postiže kodiranjem. Također, važno je upoznati leksička
pravila po kojima se zapisuju znakovne i numeričke konstante u "literalnom" obliku.

4.1.1 Kodiranje pozitivnih cijelih brojeva (eng. unsigned integers)
     Pozitivni cijeli brojevi (eng. unsigned integers), ili kardinalni brojevi, su brojevi iz skupa
kojeg čine prirodni brojevi i nula. Način njihovog kodiranja je opisan u poglavlju 2. U C jeziku
se literalne konstante, koje predstavljaju pozitivne cijele brojeve, mogu zapisati u decimalnom,
heksadecimalnom i oktalnom brojevnom sustavu, prema slijedećem leksičkom pravilu:
    •    niz decimalnih znamenki označava decimalnu konstantu ukoliko prva znamenka nije
         nula.
    •    niz oktalnih znamenki označava oktalnu konstantu ako je prva znamenka jednaka nuli.
    •    niz heksadecimalnih znamenki, kojem prethodi prefix 0x ili 0X, označava
         heksadecimalnu konstantu.

Primjer: tri ekvivalentna literalna zapisa vrijednosti binarnog niza 011011 u C jeziku su:

        decimalna konstanta                 27
        oktalna konstanta                  033
        heksadecimalna konstanta          0x1B

4.1.2 Kodiranje cijelih brojeva (eng. integers)
     Cijeli brojevi (eng. integers) su brojevi iz skupa kojeg čine prirodni brojevi, negativni
prirodni brojevi i nula, ili drukčije kazano, to su brojevi s predznakom (eng. signed integers).
Većina današnjih procesora za kodiranje cijelih brojeva s predznakom koristi tzv. komplementni




                                                                                                33
brojevni sustav. Puni komplement n-znamenkastog broja Nx, u brojevnom sustavu baze x
matematički se definira izrazom:
              N x = xn − N x
                ′
primjerice, u decimalnom sustavu komplement troznamenkastog broja 733 je 103-733= 277.
Ako se n-znamenkasti broj i njegov komplement zbroje vrijedi da će n znamenki biti jednako
nuli. U prijašnjem primjeru 733+277=1000, dakle tri znamenke su jednake nuli.
    U binarnom se sustavu puni komplement naziva komplement dvojke i vrijedi:
              N 2 = 2n − N 2
                ′
Komplement dvojke se koristi za označavanje negativnih brojeva. Primjerice, komplement
dvojke broja +1 za n=4 iznosi:
                ′
              N 2 = 2 4 − 1 = 10000 − 0001 = 1111 .
     Ako se broj i njegov komplement zbroje, rezultat treba biti nula. To vrijedi, u prethodnom
primjeru, jer su prva četiri bita zbroja jednaka nuli. Peti bit je jednak jedinici, ali on se u 4-
bitnom sustavu odbacuje.
     U sustavu komplementa dvojke pozitivni brojevi uvijek imaju MSB=0, a negativni brojevi
imaju MSB=1.
     Što se događa ako se zbroje dva pozitivna broja koji imaju bitove ispod MSB jednake
jedinici. Primjerice, ako zbrojimo 4+5 ( u 4-bitnom sustavu)

       0100
      +0101
      -----
       1001

dobije se rezultat koji predstavlja negativan broj u sustavu komplementa dvojke. Do prijelaza u
područje komplementa ne bi došlo da je rezultat zbrajanja bio manji od 7, odnosno 24-1-1.
    Poopći li se prethodno zapažanje na brojeve od n-bita, može se zaključiti da operacija
zbrajanja ima smisla samo ako je zbroj operanada manji od 2n-1-1. Zbog toga, najveći
pozitivni broj koji se može predstaviti u sustavu komplementa dvojke iznosi:

      max_int = (0111...111) = 2n-1-1,

a najveći iznos negativnog broja iznosi:

      min_int = (1000...000) = -2n-1.

Uočite da postoji za jedan više negativnih brojeva od pozitivnih brojeva.
     Obični komplement binarnog broja (naziva se i komplement jedinice) dobije se zamjenom
svih jedinica s nulom i obratno. Iznos broja. koji se dobije na ovaj način, računa se prema
izrazu:
              N 2 = 2n − N 2 − 1
    Obični komplement nije pogodan za izražavanje prirodnih brojeva jer nije jednoznačno
određena vrijednost nule, naime obični komplement od 0000 iznosi 1111. On služi za
jednostavno izračunavanje punog komplementa, jer vrijedi:
              N2 = N2 + 1
               ′




                                                                                               34
Puni komplement se izračunava tako da se običnom komplementu pribroji jedinica, primjerice,
komplement dvojke broja 6 u 8-bitnoj notaciji iznosi:

      00000110       (+6)
      --------
      11111001       (obični komplement od +6)
             1       (dodaj 1)
      --------
      11111010       (-6 u komplementu dvojke)

Izračunajmo puni komplement od 0:

       00000000        (0)
       --------
       11111111        (komplement od 0)
              1        (dodaj 1)
       --------
      100000000        (-0 u komplementu dvojke)

Jedinica predstavlja deveti bit. Ona se u 8-bitnom sustavu odbacuje pa rezultat opet predstavlja
nulu. Komplement dvojke omogućuje jednoznačno određivanje nule, pa je podesan za kodiranje
cijelih brojeva.

4.1.3. Kodiranje realnih brojeva
    Realni brojevi se u matematici zapisuju na način da se cijeli i decimalni dio odvoje
decimalnim zarezom (pr. 67,098), a koristi se i ekponentni format (eng. scientific format).
Primjerice, prethodni se broj može zapisati u obliku 0,67089⋅102. U programskom jeziku C
koristi se sličan zapis kao u matematici, s razlikom da se umjesto decimalnog zareza koristi
"decimalna točka", a potencija broja 10 se označava velikim ili malim slovom E.


              matematički zapis           ekvivalentni zapis u C-jeziku
              1,789                       1.789
              0,789                       0.789              ili
                                           .789
              -178,9⋅10-2                 -178.9e-2          ili
                                          -178.9E-2
              -0,01789⋅102                -0.01789e2         ili
                                          -0.01789E2         ili
                                          -0.01789e+2
                  Tablica 4.1. Matematički i programski zapis realnih brojeva

Eksponentni format se sastoji od dva dijela: mantise i eksponenta

      eksponentni decimalni format = mantisa 10eksponent
     Mantisa se zapisuje kao obični decimalni broj s predznakom, a eksponent se zapisuje kao
cijeli broj. Prednost korištenja eksponentnog formata je u lakšem zapisu vrlo velikih i vrlo malih
brojeva. Uočite da se promjenom vrijednosti eksponenta pomiče položaj decimalnog zareza.
Kodiranje s fiksnim položajem binarne točke (eng. fixed point numbers)
     Umjesto pojma decimalnog zareza uvodi se pojam binarne točke. Opći oblik zapisivanja
realnog broja s fiksnim položajem binarne točke, u slučaju da se N znamenki koristi za




                                                                                               35
označavanje cijelih vrijednosti, a n znamenki za označavanje razlomljenih vrijednosti (po bazi
2: 1/2, 1/4, 1/8 itd.) glasi:


             bN −1bN − 2 ...b0 • b−1b− 2 ...b− n ,

a iznos mu se računa prema izrazu:


             N .n2 = bN −1 2 N −1 + ... + b0 2 0 + b−1 2 −1 + b− 2 2 −2 + ... + b− n 2 − n ,   bi ∈ (0,1)


     Ako se ovaj broj pomnoži s 2n može ga se u operacijama smatrati cijelim brojem, a nakon
izvršenih aritmetičkih operacija rezultat se skalira za iznos 2-n. Ovaj oblik kodiranja ima brojne
nedostatke, i koristi se samo u izuzetnim slučajevima.
Kodiranje s pomičnim položajem binarne točke (eng. floating point numbers)
    Ideja eksponentnog formata uzeta je kao temelj za kodiranje realnih brojeva i u binarnom
brojevnom sustavu. Kodiranje se vrši prema izrazu

             F = ( − 1) m 2 e
                          s



gdje m predstavlja mantisu, e je eksponent dvojke, a s∈(0,1) određuje predznak broja.
Eksponent i mantisa se kodiraju u binarnom brojevnom sustavu. Eksponent se kodira kao cijeli
broj, a mantisa kao binarni broj s fiksnim položajem binarne točke. Ideja je jednostavna:
promjenom eksponenta pomiče se i položaj binarne točke iako se mantisa zapisuje s fiksnim
položajem binarne točke. Primjerice, neka je broj kodiran u obliku:

      0.00001xxxxxxxxx 2e

gdje x može biti 0 ili 1. Ovaj oblik zapisa realnog broja naziva se nenormalizirani zapis.
Pomakne li se položaj binarne točke za 5 mjesta ulijevo dobije se ekvivalentni zapis

      1.xxxxxxxxx00000 2e-5,

     Posmak bitova ulijevo ekvivalentan je dijeljenju s dva, stoga se vrijednost eksponenta
smanjuje za 5. Ovakav kodni zapis, u kojem je uvijek jedinica na prvom mjestu, naziva se
normalizirani zapis. Značaj normaliziranog zapisa je u činjenici što se njime iskorištavaju svi
bitovi mantise za kodiranje vrijednosti, dakle osigurava se veća točnost zapisa. Normaliziranim
se oblikom ipak ne može kodirati veoma male vrijednosti, pa je tada pogodniji nenormalizirani
zapis broja. Treba pojasniti i kako je kodirana vrijednost nula. Pogodno bi bilo da sva bitna
polja pri kodiranju vrijednosti nula budu jednaka nuli (zbog logičkih operacija), ali pošto se za
kodiranje eksponenta također koristi binarni zapis, vrijednost eksponenta nula se matematički
koristi za označavanje brojeva većih od jedinice. Da bi se zadovoljilo zahtjevu kodiranja nule s
nultim zapisom eksponenta uobičajeno je da se umjesto stvarne vrijednosti eksponenta kodira
vrijednost:

      E = e + pomak,

gdje je pomak neka konstantna vrijednost, a odabire se na način da je jednak najnižoj vrijednosti
eksponenta e, koji je negativna vrijednost Ovako zapisani eksponent naziva se pomaknuti
eksponent. Značaj pomaka pokazuje sljedeći primjer. Neka je eksponent opisan s 8 bita. Tada se
E kreće u rasponu od 0 do 255. Ako se uzme da je pomak=127, i da je E=0 rezervirano za
kodiranje nule, onda se vrijednost binarnog eksponenta kreće u rasponu od -126 do +127.




                                                                                                            36
Postoji više različitih formata zapisa mantise i eksponenta u binarnom kodu. Danas se
gotovo isključivo koristi format koji je određen ANSI/IEEE standardom br.745 iz 1985. godine.
Prema tom standardu koriste se dva tipa kodiranja: jednostruki format (32 bita) i dvostruki
format (64 bita).




            Slika 4.1 Format kodiranja realnih brojeva prema IEEE/ANSI standardu

                     STANDARDNI IEEE/ANSI FORMAT REALNIH                  BROJEVA
  parametar                   Jednostruki (SINGLE)                        dvostruki (DOUBLE)
  ukupan broj bita            32 (+1)                                     64 (+1)
  broj bita eksponenta        8                                           11
  broj bita za predznak       1                                           1
  broj bita mantise           23 (+1)                                     52 (+1)
  pomak                       +127                                        +1023
  Emax                        255                                         2047
  Emin                        0                                           0
  minreal (za nenorm.)        (-1)s⋅1.4⋅10-45                             (-1)s⋅2.225⋅10-324
  minreal (za norm.)          (-1)s⋅1.175⋅10-38                           (-1)s⋅2.225⋅10-308
  maxreal                     (-1)s⋅3.4028⋅10+38                          (-1)s⋅1.797⋅10+308

                    Tablica 4.2. Standardni IEEE/ANSI format realnih brojeva

     Bitna karakteristika ovog standarda je da je u format za kodiranje realnog broja moguće
upisati i šifru o ispravno obavljenoj matematičkoj operaciji (pr. dijeljenje s nulom dalo bi
beskonačnu vrijednost, koju je nemoguće kodirati, pa se ta operacija izvještava kao greška).
Binarno kodirani signal greške koristi format binarno kodiranih realnih brojeva, ali kako to nije
broj, u standardu se opisuje pod nazivom NaN (Not a Number). Kodiranje s normaliziranim
zapisom mantise je izvršeno na način da se ne upisuje prva jedinica, čime se podrazumjeva da je
mantisa kodirana s jednim bitom više nego je to predviđeno u binarnom zapisu. Vrijednost
pomaka i raspona eksponenta dana je tablicom 3.2. Vrijednost eksponenta Emin je iskorištena za
kodiranje nule, a vrijednost Emax za kodiranje NaN-a i beskonačnosti.
Zapis formata se interpretira na sljedeći način:
    1.   Ako je E=Emax i m≠0 kodna riječ predstavlja NaN, bez obzira na vrijedost predznaka s.
    2.   Ako je E=Emax i m=0 kodna riječ predstavlja (-1)s (∝).
    3.   Ako je Emin<E<Emax kodna riječ predstavlja broj (-1)s2e-127(1.m), tj. predstavlja
         normalizirani realni broj.
    4.   Ako je E=0 i m=0 kodna riječ predstavlja broj (-1)s(0).
    5.   Ako je E=0 i m≠0 kodna riječ predstavlja broj (-1)s2ee-127(0.m) tj. predstavlja nenormalizirani
         realni broj (vodeća nula se ne zapisuje). Opis nenormaliziranim brojevima ne osigurava točnost
         za sve brojeve pa se ovo kodiranje u nekim implementacija ne koristi. Vrijednosti za minimalnu
         i maksimalnu vrijednost realnog broja u tablici 3.2. dani su za normalizirani i nenormalizirani
         format realnog broja.




                                                                                                     37
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom
Programiranje c jezikom

Weitere ähnliche Inhalte

Andere mochten auch

Kuhar pizza na 260 nacina
Kuhar   pizza na 260 nacinaKuhar   pizza na 260 nacina
Kuhar pizza na 260 nacinadzada123
 
Baze podataka - Stefan Nikolić - Silvana Ivković
Baze podataka - Stefan Nikolić - Silvana IvkovićBaze podataka - Stefan Nikolić - Silvana Ivković
Baze podataka - Stefan Nikolić - Silvana IvkovićNašaŠkola.Net
 
Introduction to c programming
Introduction to c programmingIntroduction to c programming
Introduction to c programmingAMAN ANAND
 
Uputstvo za popravke lok 461
Uputstvo za popravke lok 461Uputstvo za popravke lok 461
Uputstvo za popravke lok 461milorad lucic
 
'Documents.tips elektricne lokomotive-serije-441-2-deo
'Documents.tips elektricne lokomotive-serije-441-2-deo'Documents.tips elektricne lokomotive-serije-441-2-deo
'Documents.tips elektricne lokomotive-serije-441-2-deomilorad lucic
 
'Documents.tips elektricne lokomotive-serije-441-1-deo
'Documents.tips elektricne lokomotive-serije-441-1-deo'Documents.tips elektricne lokomotive-serije-441-1-deo
'Documents.tips elektricne lokomotive-serije-441-1-deomilorad lucic
 
Grafici trigonometrijskih funkcija_i_deo
Grafici trigonometrijskih funkcija_i_deoGrafici trigonometrijskih funkcija_i_deo
Grafici trigonometrijskih funkcija_i_deoJelena Dobrivojevic
 
Grafici trigonometrijskih funkcija_ii_deo
Grafici trigonometrijskih funkcija_ii_deoGrafici trigonometrijskih funkcija_ii_deo
Grafici trigonometrijskih funkcija_ii_deoJelena Dobrivojevic
 
Engineering mechanics-question-and-answers-for-gate-ias
Engineering mechanics-question-and-answers-for-gate-iasEngineering mechanics-question-and-answers-for-gate-ias
Engineering mechanics-question-and-answers-for-gate-iashitusp
 
C Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpointC Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpointJavaTpoint.Com
 
Basics of C programming
Basics of C programmingBasics of C programming
Basics of C programmingavikdhupar
 

Andere mochten auch (17)

Kuhar pizza na 260 nacina
Kuhar   pizza na 260 nacinaKuhar   pizza na 260 nacina
Kuhar pizza na 260 nacina
 
Baze podataka - Stefan Nikolić - Silvana Ivković
Baze podataka - Stefan Nikolić - Silvana IvkovićBaze podataka - Stefan Nikolić - Silvana Ivković
Baze podataka - Stefan Nikolić - Silvana Ivković
 
Introduction to c programming
Introduction to c programmingIntroduction to c programming
Introduction to c programming
 
Na peronu 53
Na peronu  53Na peronu  53
Na peronu 53
 
246408936 elektrostatika1.pdf
246408936 elektrostatika1.pdf246408936 elektrostatika1.pdf
246408936 elektrostatika1.pdf
 
Uputstvo za popravke lok 461
Uputstvo za popravke lok 461Uputstvo za popravke lok 461
Uputstvo za popravke lok 461
 
461 020 013
461 020 013461 020 013
461 020 013
 
'Documents.tips elektricne lokomotive-serije-441-2-deo
'Documents.tips elektricne lokomotive-serije-441-2-deo'Documents.tips elektricne lokomotive-serije-441-2-deo
'Documents.tips elektricne lokomotive-serije-441-2-deo
 
'Documents.tips elektricne lokomotive-serije-441-1-deo
'Documents.tips elektricne lokomotive-serije-441-1-deo'Documents.tips elektricne lokomotive-serije-441-1-deo
'Documents.tips elektricne lokomotive-serije-441-1-deo
 
The diesel locomotive
The diesel locomotiveThe diesel locomotive
The diesel locomotive
 
Grafici trigonometrijskih funkcija_i_deo
Grafici trigonometrijskih funkcija_i_deoGrafici trigonometrijskih funkcija_i_deo
Grafici trigonometrijskih funkcija_i_deo
 
Grafici trigonometrijskih funkcija_ii_deo
Grafici trigonometrijskih funkcija_ii_deoGrafici trigonometrijskih funkcija_ii_deo
Grafici trigonometrijskih funkcija_ii_deo
 
Basic SQL
Basic SQLBasic SQL
Basic SQL
 
Engineering mechanics-question-and-answers-for-gate-ias
Engineering mechanics-question-and-answers-for-gate-iasEngineering mechanics-question-and-answers-for-gate-ias
Engineering mechanics-question-and-answers-for-gate-ias
 
C Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpointC Programming Language Tutorial for beginners - JavaTpoint
C Programming Language Tutorial for beginners - JavaTpoint
 
Nasa skripta
Nasa skriptaNasa skripta
Nasa skripta
 
Basics of C programming
Basics of C programmingBasics of C programming
Basics of C programming
 

Ähnlich wie Programiranje c jezikom

Predavanja
PredavanjaPredavanja
Predavanjaroracro
 
PROGRAMSKI ALAT ZA ADMINISTRIRANJE MREŽNIH USLUGA OGLAŠAVANJA U OBLAČNOM RAČU...
PROGRAMSKI ALAT ZA ADMINISTRIRANJE MREŽNIH USLUGA OGLAŠAVANJA U OBLAČNOM RAČU...PROGRAMSKI ALAT ZA ADMINISTRIRANJE MREŽNIH USLUGA OGLAŠAVANJA U OBLAČNOM RAČU...
PROGRAMSKI ALAT ZA ADMINISTRIRANJE MREŽNIH USLUGA OGLAŠAVANJA U OBLAČNOM RAČU...Kresimir Popovic
 
MyJob ISPRAVAK.pdf
MyJob ISPRAVAK.pdfMyJob ISPRAVAK.pdf
MyJob ISPRAVAK.pdfElaMaloa
 
Aplikacija za vlasnike kućnih ljubimaca PetVet.hr.pdf
Aplikacija za vlasnike kućnih ljubimaca PetVet.hr.pdfAplikacija za vlasnike kućnih ljubimaca PetVet.hr.pdf
Aplikacija za vlasnike kućnih ljubimaca PetVet.hr.pdfTamara673454
 
ProcFPGA_sklop_dzurovec
ProcFPGA_sklop_dzurovecProcFPGA_sklop_dzurovec
ProcFPGA_sklop_dzurovecDario Zurovec
 
Matematicka fizika
Matematicka fizikaMatematicka fizika
Matematicka fizikadiinggdoongg
 
Z_Armina Fehrić_TACT_Skripta_KONAČNA.docx
Z_Armina Fehrić_TACT_Skripta_KONAČNA.docxZ_Armina Fehrić_TACT_Skripta_KONAČNA.docx
Z_Armina Fehrić_TACT_Skripta_KONAČNA.docxArminaFehric
 
[Ramón campayo] superčitanje - superučenje - superpamćenje
[Ramón campayo]   superčitanje - superučenje - superpamćenje[Ramón campayo]   superčitanje - superučenje - superpamćenje
[Ramón campayo] superčitanje - superučenje - superpamćenjekore_st
 
Kratka priča o mrežama - preklopnici i usmjerivači
Kratka priča o mrežama - preklopnici i usmjerivačiKratka priča o mrežama - preklopnici i usmjerivači
Kratka priča o mrežama - preklopnici i usmjerivačiHrvoje Horvat
 
Marko Ivančić - diplomski rad - Web
Marko Ivančić - diplomski rad - WebMarko Ivančić - diplomski rad - Web
Marko Ivančić - diplomski rad - WebMarko Ivančić
 
Komparativna analiza antivirusnih alata operativnih sustava Android i iOS
Komparativna analiza antivirusnih alata operativnih sustava Android i iOSKomparativna analiza antivirusnih alata operativnih sustava Android i iOS
Komparativna analiza antivirusnih alata operativnih sustava Android i iOSTomislav Pejić
 
13415866 vodic-kroz-access-2000
13415866 vodic-kroz-access-200013415866 vodic-kroz-access-2000
13415866 vodic-kroz-access-2000Branka Stosic
 
Virtualna informacijsko - uslužna tvrtka Smart Ground
Virtualna informacijsko - uslužna tvrtka Smart GroundVirtualna informacijsko - uslužna tvrtka Smart Ground
Virtualna informacijsko - uslužna tvrtka Smart GroundRobert Povijač
 
Značaj uvoza i izvoza za poslovanje savremenih preduzeća
Značaj uvoza i izvoza za poslovanje savremenih preduzećaZnačaj uvoza i izvoza za poslovanje savremenih preduzeća
Značaj uvoza i izvoza za poslovanje savremenih preduzećaPositive
 
Molnar_Nikic_Vidas_www.onlineplac.hr
Molnar_Nikic_Vidas_www.onlineplac.hrMolnar_Nikic_Vidas_www.onlineplac.hr
Molnar_Nikic_Vidas_www.onlineplac.hrAnelkoNiki
 
Molnar nikic vidas_www.onlineplac.hr
Molnar nikic vidas_www.onlineplac.hrMolnar nikic vidas_www.onlineplac.hr
Molnar nikic vidas_www.onlineplac.hrAnelkoNiki
 
5-matematika-radni-listovi.pdf
5-matematika-radni-listovi.pdf5-matematika-radni-listovi.pdf
5-matematika-radni-listovi.pdfKatarina Vucen
 
Skripta beton
Skripta   betonSkripta   beton
Skripta betonErminHodi
 

Ähnlich wie Programiranje c jezikom (20)

Predavanja
PredavanjaPredavanja
Predavanja
 
PROGRAMSKI ALAT ZA ADMINISTRIRANJE MREŽNIH USLUGA OGLAŠAVANJA U OBLAČNOM RAČU...
PROGRAMSKI ALAT ZA ADMINISTRIRANJE MREŽNIH USLUGA OGLAŠAVANJA U OBLAČNOM RAČU...PROGRAMSKI ALAT ZA ADMINISTRIRANJE MREŽNIH USLUGA OGLAŠAVANJA U OBLAČNOM RAČU...
PROGRAMSKI ALAT ZA ADMINISTRIRANJE MREŽNIH USLUGA OGLAŠAVANJA U OBLAČNOM RAČU...
 
MyJob ISPRAVAK.pdf
MyJob ISPRAVAK.pdfMyJob ISPRAVAK.pdf
MyJob ISPRAVAK.pdf
 
Aplikacija za vlasnike kućnih ljubimaca PetVet.hr.pdf
Aplikacija za vlasnike kućnih ljubimaca PetVet.hr.pdfAplikacija za vlasnike kućnih ljubimaca PetVet.hr.pdf
Aplikacija za vlasnike kućnih ljubimaca PetVet.hr.pdf
 
Doktorat
DoktoratDoktorat
Doktorat
 
ProcFPGA_sklop_dzurovec
ProcFPGA_sklop_dzurovecProcFPGA_sklop_dzurovec
ProcFPGA_sklop_dzurovec
 
Predavanja beton
Predavanja betonPredavanja beton
Predavanja beton
 
Matematicka fizika
Matematicka fizikaMatematicka fizika
Matematicka fizika
 
Z_Armina Fehrić_TACT_Skripta_KONAČNA.docx
Z_Armina Fehrić_TACT_Skripta_KONAČNA.docxZ_Armina Fehrić_TACT_Skripta_KONAČNA.docx
Z_Armina Fehrić_TACT_Skripta_KONAČNA.docx
 
[Ramón campayo] superčitanje - superučenje - superpamćenje
[Ramón campayo]   superčitanje - superučenje - superpamćenje[Ramón campayo]   superčitanje - superučenje - superpamćenje
[Ramón campayo] superčitanje - superučenje - superpamćenje
 
Kratka priča o mrežama - preklopnici i usmjerivači
Kratka priča o mrežama - preklopnici i usmjerivačiKratka priča o mrežama - preklopnici i usmjerivači
Kratka priča o mrežama - preklopnici i usmjerivači
 
Marko Ivančić - diplomski rad - Web
Marko Ivančić - diplomski rad - WebMarko Ivančić - diplomski rad - Web
Marko Ivančić - diplomski rad - Web
 
Komparativna analiza antivirusnih alata operativnih sustava Android i iOS
Komparativna analiza antivirusnih alata operativnih sustava Android i iOSKomparativna analiza antivirusnih alata operativnih sustava Android i iOS
Komparativna analiza antivirusnih alata operativnih sustava Android i iOS
 
13415866 vodic-kroz-access-2000
13415866 vodic-kroz-access-200013415866 vodic-kroz-access-2000
13415866 vodic-kroz-access-2000
 
Virtualna informacijsko - uslužna tvrtka Smart Ground
Virtualna informacijsko - uslužna tvrtka Smart GroundVirtualna informacijsko - uslužna tvrtka Smart Ground
Virtualna informacijsko - uslužna tvrtka Smart Ground
 
Značaj uvoza i izvoza za poslovanje savremenih preduzeća
Značaj uvoza i izvoza za poslovanje savremenih preduzećaZnačaj uvoza i izvoza za poslovanje savremenih preduzeća
Značaj uvoza i izvoza za poslovanje savremenih preduzeća
 
Molnar_Nikic_Vidas_www.onlineplac.hr
Molnar_Nikic_Vidas_www.onlineplac.hrMolnar_Nikic_Vidas_www.onlineplac.hr
Molnar_Nikic_Vidas_www.onlineplac.hr
 
Molnar nikic vidas_www.onlineplac.hr
Molnar nikic vidas_www.onlineplac.hrMolnar nikic vidas_www.onlineplac.hr
Molnar nikic vidas_www.onlineplac.hr
 
5-matematika-radni-listovi.pdf
5-matematika-radni-listovi.pdf5-matematika-radni-listovi.pdf
5-matematika-radni-listovi.pdf
 
Skripta beton
Skripta   betonSkripta   beton
Skripta beton
 

Programiranje c jezikom

  • 1. PROGRAMIRANJE C JEZIKOM Nastavni materijal za studente FESB-a. Split, 2005/2006 Autor: Ivo Mateljan 1
  • 2. Sadržaj 1 Uvod........................................................................................................................................... 5 2 Matematički i elektronički temelji računarstva ........................................................................ 13 2.1 Izjavna i digitalna logika ................................................................................................... 13 2.2 Brojevni sustavi i računska sposobnost računala .............................................................. 16 3 Izrada prvog C programa.......................................................................................................... 20 3.1 Strojni, asemblerski i viši programski jezici ..................................................................... 20 3.2 Prvi program u C jeziku .................................................................................................... 21 3.3 Struktura i kompiliranje C programa ................................................................................ 25 3.4 Integrirana razvojna okolina (IDE) ................................................................................... 27 3.5 Usmjeravanje procesa kompiliranja programom nmake................................................... 32 4 Kodiranje i tipovi podataka ...................................................................................................... 33 4.1 Kodiranje i zapis podataka ................................................................................................ 33 4.2 Memorija ........................................................................................................................... 40 4.3 Prosti tipovi podataka........................................................................................................ 42 4.4 Direktiva #define............................................................................................................... 46 4.5 Specifikatori printf funkcije .............................................................................................. 47 4.6 Pristup podacima pomoću pokazivača .............................................................................. 49 4.7 Unos podataka u memoriju računala ................................................................................. 52 4.8 Inicijalizacija varijabli....................................................................................................... 54 5 Uvod u programiranje C jezikom............................................................................................. 55 5.1 Postupak izrade programa ................................................................................................. 55 5.2 Algoritamska struktura C programa? ............................................................................... 57 5.3 Funkcije C jezika............................................................................................................... 63 5.4 Zaključak........................................................................................................................... 70 6 Izrazi i sintaksa C jezika........................................................................................................... 71 6.1 Izrazi.................................................................................................................................. 71 6.2 Automatska i explicitna pretvorba tipova ......................................................................... 78 6.3 Definiranje sinonima tipa pomoću typedef ....................................................................... 81 6.4 Formalni zapis sintakse C-jezika....................................................................................... 81 7 Proste i strukturalne naredbe C jezika...................................................................................... 87 7.1 Proste naredbe ................................................................................................................... 87 7.2 Strukturalne naredbe ......................................................................................................... 89 8 Nizovi..................................................................................................................................... 102 8.1 Jednodimenzionalni nizovi.............................................................................................. 102 8.2 Prijenos nizova u funkciju............................................................................................... 107 8.3 Višedimenzionalni nizovi................................................................................................ 110 9 Blokovi, moduli i dekompozicija programa........................................................................... 112 9.1 Blokovska struktura programa ........................................................................................ 112 9.2 Funkcionalna dekompozicija programa "od vrha prema dolje" ...................................... 120 9.3 Zaključak......................................................................................................................... 128 10 Rad s pokazivačima.............................................................................................................. 129 2
  • 3. 10.1 Tip pokazivača .............................................................................................................. 129 10.2 Operacije s pokazivačima.............................................................................................. 130 10.3 Pokazivači kao argumenti funkcije ............................................................................... 131 10.4 Pokazivači i nizovi ........................................................................................................ 132 10.5 Pokazivači i argumenti funkcije tipa niza ..................................................................... 134 10.6 Patrametri funkcije tipa void pokazivača ...................................................................... 136 10.7 Pokazivači na funkcije .................................................................................................. 137 10.8 Kompleksnost deklaracija ............................................................................................. 139 10.9 Polimorfne funkcije....................................................................................................... 141 10.10 Zaključak..................................................................................................................... 144 11 Nizovi znakova - string ........................................................................................................ 146 11.1 Definicija stringa ........................................................................................................... 146 11.2 Standardne funkcije za rad sa stringovima.................................................................... 148 11.3 Ulazno-izlazne operacije sa stringovima....................................................................... 151 11.4 Korisnički definirane ulazne operacije sa stringovima ................................................. 152 11.5 Pretvorba stringa u numeričku vrijednost ..................................................................... 153 11.6 Nizovi stringova ............................................................................................................ 155 11.7 Generator slučajnih brojeva .......................................................................................... 157 11.8 Argumenti komandne linije operativnog sustava.......................................................... 158 12 Dinamičko alociranje memorije ........................................................................................... 160 12.1 Funkcije za dinamičko alociranje memorije ................................................................. 160 12.2 Kako se vrši alociranje memorije.................................................................................. 163 12.3 Alociranje višedimenzionalnih nizova .......................................................................... 165 12.4 Standardne funkcije za brzi pristup memoriji ............................................................... 171 13 Korisnički definirane strukture podataka ............................................................................. 172 13.1 Struktura (struct)...................................................................................................... 172 13.2 Union – zajednički memorijski objekt za različite tipova podataka.............................. 180 13.3 Bit-polja......................................................................................................................... 181 13.4 Pobrojanji tip (enum).................................................................................................... 182 13.5 Strukture i funkcije za očitanje vremena....................................................................... 183 14 Leksički pretprocesor ........................................................................................................... 188 14.1 Direktiva #include ......................................................................................................... 188 14.2 Direktiva #define za makro-supstitucije........................................................................ 188 14.3 String operatori # i ##.................................................................................................. 190 14.4 Direktiva #undef............................................................................................................ 191 14.5 Direktive za uvjetno kompiliranje................................................................................. 192 15 Rad s datotekama i tokovima ............................................................................................... 194 15.1 Ulazno-izlazni tokovi .................................................................................................... 194 15.2 Binarne i tekstualne datoteke ........................................................................................ 195 15.3 Pristup datotekama ........................................................................................................ 195 15.4 Formatirano pisanje podataka u datoteku...................................................................... 197 15.5 Formatirano čitanje podataka iz datoteke...................................................................... 199 15.6 Znakovni ulaz/izlaz ....................................................................................................... 200 15.7 Direktni ulaz/izlaz za memorijske objekte .................................................................... 203 15.8 Sekvencijani i proizvoljni pristup datotekama .............................................................. 206 15.9 Funkcije za održavanje datoteka ................................................................................... 208 16 Apstraktni tipovi podataka - ADT........................................................................................ 210 3
  • 4. 16.1 Koncept apstraktnog dinamičkog tipa podataka ........................................................... 210 16.2 Stog i STACK ADT ...................................................................................................... 215 16.3 Primjena stoga za proračun izraza postfiksne notacije.................................................. 218 16.4 Red i QUEUE ADT....................................................................................................... 221 16.5 Zaključak....................................................................................................................... 224 17 Rekurzija i složenost algoritama .......................................................................................... 225 17.1 Rekurzivne funkcije ...................................................................................................... 225 17.2 Matematička indukcija .................................................................................................. 227 17.3 Kule Hanoja .................................................................................................................. 227 17.4 Metoda - podijeli pa vladaj (Divide and Conquer)........................................................ 230 17.5 Pretvorba rekurzije u iteraciju ....................................................................................... 232 17.6 Standardna bsearch() funkcija ....................................................................................... 234 17.7 Složenost algoritama - "Veliki - O" notacija................................................................. 236 17.8 Sortiranje ....................................................................................................................... 239 17.9 Zaključak....................................................................................................................... 248 18 Samoreferentne strukture i liste............................................................................................ 249 18.1 Samoreferentne strukture i lista..................................................................................... 249 18.2 Operacije s vezanom listom .......................................................................................... 250 18.3 Što može biti element liste ............................................................................................ 259 18.4 Lista sa sortiranim redoslijedom elemenata .................................................................. 260 18.5 Implementacija ADT STACK pomoću linearne liste ................................................... 265 18.6 Implementacija ADT QUEUE pomoću vezane liste..................................................... 267 18.7 Dvostruko vezana lista .................................................................................................. 269 18.8 Generički dvostrani red - ADT DEQUEUE.................................................................. 271 18.9 Zaključak....................................................................................................................... 280 19 Razgranate strukture - stabla ................................................................................................ 281 19.1 Definicija stabla ............................................................................................................ 281 19.2 Binarno stablo ............................................................................................................... 282 19.3 Interpreter prefiksnih izraza .......................................................................................... 291 19.4 Stabla s proizvoljnim brojem grana .............................................................................. 305 19.5 Prioritetni redovi i hrpe ................................................................................................. 309 19.6 Zaključak....................................................................................................................... 316 20 Strukture za brzo traženje podataka .................................................................................... 317 20.1 Tablice simbola i rječnici .............................................................................................. 317 20.2 Hash tablica ................................................................................................................... 318 20.3 BST - binarno stablo traženja........................................................................................ 333 20.4 Crveno-crna stabla......................................................................................................... 344 Literatura ................................................................................................................................... 354 Dodatak ..................................................................................................................................... 355 Dodatak A - Elementi dijagrama toka................................................................................... 355 Dodatak B - Gramatika C jezika ........................................................................................... 356 Dodatak C - Standardna biblioteka C jezika ......................................................................... 361 Index.......................................................................................................................................... 392 4
  • 5. 1 Uvod Naglasci: • Što je računalo ? • Što je program ? • Kako se rješavaju problemi pomoću računala? • Računarski procesi i memorijski objekti • Apstrakcija, algoritam, program Računalo ili kompjuter (eng. computer) je naziv za uređaje koji obavljaju radnje prema programima koje izrađuje čovjek. Sastavni dijelovi računala nazivaju se hardver, a programi i njihova dokumentacija nazivaju se softver. Prvotno su računala služila za obavljanje numeričkih proračuna, odatle i potječe naziv računalo. Danas računala služe za obradu različitih problema. Korisnike računala zanima kako se koristi računalo, a one koji izučavaju računala zanima: • kako se izrađuje računalo, • kako se izrađuje program i • kako se rješavaju problemi pomoću računala. Ovdje će biti pokazano kako se izrađuju programi i kako se programiranjem rješavaju različiti problemi. Bit će opisana i unutarnja građa računala. Za pisanje programa koristit će se programski jeziku C i asemblerski jezik. Što je program? Program je zapis operacija koje računalo treba obaviti. Taj zapis može biti u obliku izvršnog programa ili u obliku izvornog programa. Izvršni program sadrži kôd operacija koje izvršava stroj računala, pa se naziva i strojni program. Izvorni program se zapisuje simboličkim jezikom koji se naziva programski jezik. Prevođenje izvornog programa u strojni program vrši se pomoću programa koji se nazivaju kompilatori (ili kompajleri). Stroj računala Postoje dva tipa elektroničkih računala: analogna i digitalna. Analognim računalima se obrađuju kontinuirani elektronički signali. Digitalnim računalom se obrađuju, prenose i pamte diskretni elektronički signali koji u jednom trenutku mogu imati samo jedno od dva moguća stanja. Ta stanja se označavaju znamenkama 0 i 1, odatle i naziv digitalna računala (eng. digit znači znamenka). Programere i korisnike ne zanimaju elektronički signali u računalu, već poruka koju oni prenose – digitalna informacija. Brojevni sustav, u kojem postoje samo dvije znamenke, naziva se binarni brojevni sustav. U tom se sustavu može kodirati različite informacije koristeći više binarnih znamenki. Znamenka binarnog brojevnog sustava se naziva bit (kratica od eng. binary digit), a može imati samo dvije vrijednosti 0 ili 1. Niz od više bitova predstavlja kodiranu informaciju koja može 5
  • 6. predstavljati operaciju koju računalo treba izvršiti ili neki smisleni podatak. Uobičajeno je za nizove bitova koristiti nazive iz Tablice 1.1. U binarnom nizu često se označava redoslijed bitova. Kratica LSB označava bit najmanjeg značaja (eng. least significant bit), a MSB označava bit najvećeg značaja (eng. most significant bit). Primjer je dan na slici 1.1. Bit je naziv za binarnu znamenku Nibl je naziv za skupinu od četiri bita (eng. nibble) s kojom se operira kao s cjelinom. Bajt ili oktet je naziv za skupinu od osam bita (eng. byte) s kojom se operira kao s cjelinom. Riječ je naziv za skupinu od više bajta (eng. word) s kojom se operira kao s cjelinom. Kod mikro računala za riječ se uzima skupina od 2 bajta. Kod većih računala za riječ se uzima skupina od 4 ili 8 bajta. Tablica 1.1 Nazivi temeljnih binarnih nizova MSB LSB značaj bitova 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 položaj bita 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 1 binarni niz nibl 3 nibl 2 nibl 1 nibl 0 niz nibla bajt 1 bajt 0 niz bajta Riječ riječ Slika 1.1 Označavanje binarnog niza Za označavanje većih nizova koriste se prefiksi: k (kilo) ⇔ × 1024 M (mega) ⇔ k × 1024 G (giga) ⇔ M × 1024 T (tera) ⇔ G × 1024 Primjerice, 2 kB (kilobajta) = 2048 bajta, 3 Mb (megabita) = 3145728 bita. Digitalno računalo može pamtiti i izvršavati programe, te dobavljati, pamtiti i prikazivati različite informacije. Te informacije, koje su na prikladan način pohranjene u računalu, su programski podaci. broj bita – n broj kombinacija – 2n 2 4 3 8 4 16 8 256 16 65536 32 4294967296 Tablica 1.2 Broj kombinacija s n bita Često se računala klasificiraju kao 8-bitna, 16-bitna, 32-bitna ili 64-bitna. Pod time se podrazumijeva da n-bitno računalo može operirati s nizom od n bita kao s cjelinom. Broj bita koji se koristi za opisivanje nekog podatka ovisi o veličini skupa kojem taj podatak pripada. 6
  • 7. Razmotrimo skup podataka kiji se kodira s tri bita. Taj skup može imati maksimalno 8 elemenata jer se s tri bita može kodirati maksimalno osam kombinacija: 000, 001, 010, 011, 100, 101, 110, 111. Lako je pokazati da se s n-bita može kodirati podatke iz skupa od maksimalno 2n elemenata. Tablica 1.2 pokazuje da se udvostručenjem broja bitova značajno povećava skup vrijednosti koje se mogu kodirati u računalu. Operacije se u računala nikada ne izvršavaju samo s jednim bitom, već se istovremeno prenosi i obrađuje više bita. Kod svih računala usvojeno je da najmanja jedinica digitalne informacije, koja se kao cjelina prenosi i pamti u računalu, sadrži 8 bita, tj. jedan bajt. Na slici 1.2 prikazani su sastavni dijelovi digitalnog računala. Centralna procesorska jedinica (CPU – central processing unit) - kontrolira izvršenje programa i aritmetičko-logičkih operacija. CPU je kod mikro i mini računala izveden kao jedinstveni integrirani elektronički sklop (čip) i naziva se mikroprocesor. Uobičajeno je koristiti naziv procesor, bilo da se radi o mikroprocesoru ili o skupini čipova koji obavljaju funkcije CPU, a programe koji se izvršavaju u računalu naziva se procesima. Slika 1.2. Opći prikaz digitalnog računala Radna memorija – pamti digitalne informacije za vrijeme dok je računalo u operativnom stanju. U memoriji se nalazi programski kôd i podaci s kojima operira procesor na temelju naredbi sadržanih u programskom kôdu. Memorija je napravljena od poluvodičkih elemenata u koje procesor može upisati i iz kojih može čitati digitalne informacije. Ta memorija se naziva RAM (eng. random access memory). Sa programerskog stajališta RAM predstavlja linearno uređen prostor u kojem se istovremeno može pristupiti grupi od 8 bita digitalne informacije (1 bajt). Položaj ove temeljne memorijske ćelije se označava prirodnim brojem i naziva se adresa. Jedan manji dio memorije je napravljen od poluvodičkih elemenata koji mogu trajno pamtiti digitalnu informaciju, a naziva se ROM (eng. read-only memory). U ROM-u je upisan program koji služi pokretanju osnovnih funkcija računala. U samom procesoru ugrađeno je nekoliko manjih memorijskih jedinica koje se nazivaju registri. Registri služe za privremeni smještaj programskog kôda i podataka iz radne memorije, te rezultata aritmetičko-logičkih operacije koje se izvršavaju u samom procesoru. Broj bita koji može biti pohranjen u jednom registru naziva se riječ procesora. Kod većine današnjih PC računala riječ procesora sadrži 32 bita (4 bajta), pa se kaže da su to 32-bitna računala. Vanjska memorija - služi za trajnu pohranu podataka. U tu svrhu koriste se magnetski i optički mediji (tvrdi disk, savitljive diskete, magnetske trake, optički diskovi,..). Podaci se na njima pohranjuju u organiziranom i imenovanom skupu podataka koji se nazivaju datoteka. Ulazne jedinice - služe za unos podataka (tipkovnica, miš, svjetlosna olovka, mikrofon,..). Standardna ulazna jedinica je tipkovnica. Izlazne jedinice - služe za prikaz informacija korisniku računala (video-monitor, pisač, zvučnik,...). Standardna izlazna jedinica je video-monitor. 7
  • 8. Računalo u operativnom stanju održava poseban program koji se naziva operativni sustav. On vrši temeljne funkcija računala: inicijalizaciju računala i priključenih vanjskih jedinica pri uključenju električnog napajanja, kontrolu i redoslijed izvođenja programa, kontrolu korištenja memorije, pohranjivanje i obradu podataka, vremensku raspodjelu funkcija računala, itd. Operativni sustav nije nužno jedinstven program, već se sastoji od više programskih cjelina. On se, jednim dijelom, trajno nalazi u ROM memoriji računala. Programi s novakvim svojstvom nazivaju se rezidentni programi. Svi ostali programi moraju se prije izvršenja upisati u memoriju računala. Može se izvršiti funkcionalna podjela softvera na sistemski i aplikativni softver. U sistemski softver spadaju programi operativnog sustava, razni jezični procesori (interpreteri, kompilatori, emulatori itd.), programi za testiranje programa (debugger), servisni i uslužni programi, te razni pomoćni programi (matematički, statistički, baze podataka i uređivači teksta). Aplikativni softver predstavljaju različiti korisnički programi. Kako se rješavaju problemi pomoću računala? Kada se rješava neki problem, do ideje za rješenje dolazi se analizom problema. Čovjeku je često dovoljno da već iz idejnog rješenja, koristeći svoju inteligenciju i predznanje, brzo dođe do potpunog rješenja problema. Računalo, samo po sebi, ne raspolaže s inteligencijom, već jedino može izvršavati određen broj jednostavnih operacija. Zbog toga, upute za rješenje problema pomoću računala moraju biti zapisane u obliku preciznog algoritma. Računarski algoritam je precizni opis postupka za rješenje nekog problema u konačnom broju koraka i u konačnom vremenskom intervalu. Pravila kako se piše algoritam nisu strogo određena. Algoritam se može definirati običnim govornim jezikom, tablicama i matematičkim formulama koje opisuju problem, te usmjerenim grafovima koji opisuju tok izvršenja programa. Primjer: Algoritam kojim se u pet koraka opisuje postupak zamjene točka na automobilu glasi: 1. ispitaj ispravnost rezervnog točka, 2. podigni auto, 3. skini točak, 4. postavi rezervni točak, 5. spusti auto. Ovaj algoritam je jasan svakome tko je bar jednom mijenjao točak, međutim, računalo je izvršitelj kojem upute, iskazane nizom naredbi, nisu dovoljno jasne, jer ono ne zna (1) gdje se nalazi rezervni točak, (2) kako se provjerava njegova ispravnost, (3) kako i čime podignuti auto, te (4) kojim alatom se skida i postavlja točak. Zbog toga se algoritam dorađuje preciziranjem pojedinog koraka algoritma. Primjerice, u prvom koraku treba predvidjeti sljedeće naredbe: 1. ispitaj ispravnost rezervnog točka, 1.1. otvori prtljažnik 1.2. izvadi rezervni točak 1.3. uzmi mjerač tlaka iz kutije s alatom 1.4. izmjeri razinu tlaka 1.5. dok je razina tlaka manja 1,6 ponavljaj pumpaj gumu 15 sekundi izmjeri razinu tlaka Podrazumijeva se da je naredba označena s 1. zamijenjena s nizom naredbi koje su označene s 1.1, 1.2,..1.5. Naredbe iskazane u koracima 1.1 do 1.4 su same po sebi jasne. Korak 1.5 treba dodatno pojasniti. Njime je opisan postupak pumpanja gume do neke razine tlaka. Pošto nitko ne može unaprijed znati koliko vremena treba pumpati gumu, da bi se postigla željena razina tlaka, predviđeno je da se dvije naredbe: "pumpaj gumu 15 sekundi" i "izmjeri razinu tlaka", višekratno ponavljaju, sve dok je razina tlaka manja od 1,6. Obje ove naredbe su 8
  • 9. zapisane uvlačenjem reda kako bi se točno znalo koje naredbe treba ponavljati. Ovaj se tip naredbe naziva iteracija ili petlja. Uobičajeno se kaže da petlja ima zaglavlje, u kojem se ispituje uvjet ponavljanja petlje (dok je razina tlaka manja od 1,6 ponavljaj), i tijelo petlje, koje obuhvaća jednu ili više naredbi koje treba ponavljati. Naziv petlja podsjeća na činjenicu da se uvijek nakon izvršenja posljednje naredbe tijela petlje proces vraća na izvršenje prve naredbe, ali samo u slučaju ako je zadovoljen uvjet iskazan u zaglavlju petlje. Naredbe petlje nisu posebno numerirane jer su one povezane uz zaglavlje petlje, a izvršavaju se u kao jedinstvena složena naredba. Uobičajeno se niz naredbi koji predstavljaju jedinstvenu složenu naredbu naziva i blok naredbi ili samo blok. Uvjet ponavljanja petlje je izjava: "razina tlaka manja od 1,6". Odgovor na ovu izjavu može biti "Da" ili "Ne", ovisno o trenutno izmjerenoj razini tlaka. Ako je odgovor "Da", kažemo da je ispunjen uvjet ponavljanja petlje. Računarska se znanost koristi znanjima matematičke logike. U tom kontekstu ova izjava predstavlja tzv. predikatni izraz koji može imati samo dvije logičke vrijednosti: "istina" ili "laž", pa se kaže da je uvjet održanja petlje ispunjen ako je predikatni izraz istinit. Matematička logika je zapravo znanstveni temelj cijele računarske znanosti i o njoj će biti više govora u sljedećem poglavlju. Pokušajte dalje sami precizirati korake 2, 3 , 4 i 5. Ali pazite, kad pomislite da je problem ispravno riješen, moguće je da se opet potkrade neka greška. To se obično događa kada se ne predvide sve moguće situacije, odnosno stanja u koja se može doći. Primjerice, gornji algoritam nije predvidio slučaj da je guma probušena. Kakav bi razvoj događaja tada bio, ako bi se dosljedno poštovao postupak iz koraka 1.5? Pošto je kod probušene gume razina tlaka uvijek manja od 1,6, ispada da bi tada izvršitelj naredbi ponavljao postupak pumpanja gume beskonačan broj puta. Algoritam se može popraviti tako da korak 1.5 glasi: 1.5. ako je tlak manji od 0.1 tada ako je guma probušena onda odnesi točak na popravak inače dok je tlak manji od 1.6 ponavljaj pumpaj gumu 15 sekundi izmjeri razinu tlaka U ovom se zapisu koriste tzv. naredbe selekcije, prema sljedećoj logici izvršenja: ako je ispunjen uvjet tada izvrši prvi niz naredbi inače izvrši alternativni niz naredbi Ovaj se tip naredbe zove uvjetna selekcija ili grananje, jer se nakon ispitivanja logičkog uvjeta vrši selekcija jednog od dva moguća niza naredbi, odnosno program se grana u dva smjera. Specijalni oblik selekcije je uvjetna naredba tipa: ako je ispunjen uvjet tada izvrši naredbu Njome se određuje izvršenje neke naredbe samo ako je ispunjen neki uvjet. Koristeći naredbe selekcije, algoritam se može zapisati u obliku: 1. ispitaj ispravnost rezervnog točka, 1.1 otvori prtljažnik 1.1.1. uzmi najmanji od tri ključa 1.1.2. gurni ključ u bravu i lagano ga okreni na desno 1.1.3. podigni vrata prtljažnika 9
  • 10. 1.2. izvadi rezervni točak 1.2.1. podigni tapetu 1.2.2.ako je točak pričvršćen vijkom onda odvij vijak 1.2 .2. izvadi točak 1.3. uzmi kutiju s alatom 1.4. ispitaj razinu tlaka 1.4.1. izvadi mjerač tlaka iz kutije alata 1.4.2. postavi ga na zračnicu točka 1.4.3. očitaj razinu tlaka 1.5. ako je tlak manji od 0,1 onda 1.5.1. provjeri da li je guma probušena 1.5.2. ako je guma probušena onda odnesi točak na popravak inače, ako je tlak manji od 1,6 onda 1.5.3. otvori prednji poklopac motora 1.5.4. uzmi zračnu pumpu 1.5.5. dok je tlak < 1,6 ponavljaj postavi crijevo pumpe na zračnicu dvadeset puta pritisni pumpu na zračnicu postavi mjerač tlaka ispitaj razinu tlaka Očito da je potrebno dosta raditi i dosta razmišljati da bi se napisao kvalitetan algoritam. Nakon što je napisan precizan algoritam rješenja problema, pristupa se pisanju izvornog programa. Kako se to radi bit će objašnjeno u sljedećim poglavljima. Važno je uočiti da su u zapisu algoritma korištena četiri tipa iskaza: 1. proste ili primitivne naredbe – iskazi koji označavaju jednu operaciju 2. blok naredbi – iskazi koji opisuju niz naredbi koje se sekvencijalno izvršavaju jedna za drugom, a tretiramo ih kao jedinstvenu složenu operaciju. 3. naredbe selekcije – iskazi kojima se logički uvjetuje izvršenje bloka naredbi. 4. iterativne naredbe ili petlje – iskazi kojima se logički kontrolira ponovljeno izvršenje bloka naredbi. Računarski procesi i memorijski objekti Svaki proces rezultira promjenom stanja ili atributa objekata na koje procesi djeluju. Uobičajeno se stanje nekog promjenljivog objekta označava kao varijabla koja ima neko ime. U računalu se stanje objekta pamti u memoriji računala pa se algoritamske varijable mora tretirati kao memorijske objekte. Kada se u C jeziku napiše iskaz x = 5; on predstavlja naredbu da se memorijskom objektu, imena x, pridijeli vrijednost 5. Ako se pak napiše iskaz: x = 2*x +5; on predstavlja proces u kojem se najprije iz memorije očitava vrijednost memorijskog objekta x zapisanog na desnoj strani znaka =. Zatim se ta vrijednost množi s 2 i pribraja joj se numerička vrijednost konstante 5. Time je dobivena numerička vrijednost izraza s desne strane znaka =. Ta se vrijednost zatim pridjeljuje memorijskom objektu s lijeve strane znaka =. Konačni je rezultat ovog procesa da je varijabli x pridijeljena vrijednost 15. Ako bi prethodni iskaz tretirali kao matematički iskaz, on bi predstavljao jednadžbu s jednom varijablom, koja uvjetuje da je vrijednost varijable x jednaka 5. 10
  • 11. Znak = u C jeziku ne predstavlja znak jednakosti, kao u matematici već operator pridjele vrijednosti. Njegova upotreba označava naredbu da se vrijednost memorijskog objekta s lijeve strane znaka = postavi na vrijednost izraza koji je zapisan s desne strane znaka =. Takove naredbe se zovu naredbe pridjele vrijednosti. Zbog ove nekonzistentnosti upotrebe znaka = u matematici u odnosu na upotrebu u nekim programskim jezicima (C, Basic, Fortan, Java) često se u općim algoritamskim zapisima operator pridjele vrijednosti zapisuje znakom ←, primjerice: x ← 5 x ← 2*x +5 Operacija pridjele vrijednosti posljedica je načina kako procesor obrađuje podatke u računalu. Naime, procesor može vršiti operacije samo nad podacima koji se nalaze u registrima procesora, pa je prije svake operacije s memorijskim objektima prethodno potrebno njihov sadržaj (vrijednost) prenijeti u registre procesora, a nakon obavljene operacije se sadržaj iz registra, koji sadrži rezultat operacije, prebacuje u memorijski objekt označen s lijeve strane operatora pridjele vrijednosti. Kaže se da procesor funkcionira po principu: dobavi-izvrši-spremi (eng. fetch-execute-store). Što je to apstrakcija? Netko može primijetiti da je opisani proces zamjene točka loš primjer primjene računala. To je točno, jer ako bi se napravio robot, koji bi obavljao navedenu funkciju, onda bi to bila vrlo neefikasna i skupa upotreba računala. Međutim, malo iskusniji programer bi prema gornjem algoritmu mogao lako napraviti program kojim se animirano simulira proces zamjene točka. To je moguće jer, iako je prethodni algoritam apstraktan, on specificira procese u obliku koji se može ostvariti računarskim programom. Apstrakcija je temeljna mentalna aktivnost programiranja. U računarskoj se terminologiji pod pojmom apstrakcije podrazumijeva prikladan način zapisa o objektima i procesima koje se obrađuje pomoću računala, a da se pri tome ne vodi računa o tome kako je izvršena stvarna računarska implementacija, niti objekta niti procesa. Važna je samo ona pojavnost koja je određena apstrakcijom. Algoritam zapisan programskim jezikom predstavlja apstrakciju strojnog koda, a algoritam zapisan prirodnim jezikom predstavlja apstrakciju programskog jezika. Programski jezik služi da se formalnim jezikom zapiše procese i stanje memorijskih objekata u računalu, pa on predstavlja apstrakciju računarskih procesa i stanja memorije. Pomoću programskih jezika se piše program koji ponovo predstavlja neku novu apstrakciju, a u toku izvršenja programa moguće je daljnje usložnjavanje apstrakcije. Primjerice, korisnik CAD programa pokretima miša zadaje program za crtanje nekog geometrijskog oblika. S obzirom na način kako je izvršena apstrakcija računarskog procesa, može se izvršiti sljedeća klasifikacija programskih jezika: 1. Imperativni (proceduralni) programski jezici (C, Pascal, Modula-2, Basic, Fortran,..) 2. Objektno orijentirani programski jezici (C++, Java, C#, Eiffel, Objective C, Smaltalk, Modula-3, ..) 3. Funkcionalni programski jezici (Lisp, Sheme, ML, Haskel..) 4. Logički programski jezici (Prolog) 5. Jezici specijalne namjene: pretraživanje baza podataka (SQL), vizuelno programiranje (Delphi, Visual Basic), uređivanje teksta (Perl, TeX, HTML), matematički proračuni (Matlab). Imperativni programski jezici koriste iskaze koji su bliski naredbama procesora (to su naredbe pridjele vrijednosti, aritmetičko-logičke operacije, uvjetni i bezuvjetni skokovi te poziv 11
  • 12. potprograma). Kod objektno orijentiranih jezika naglasak je na tome da varijable predstavljaju atribute nekog objekta, a funkcije predstavljaju metode pomoću kojih objekt komunicira s drugim objektima. Specifikacije atributa i metoda određuju klase objekata. Kod funkcionalnih se jezika ne koristi temeljna imperativna naredba pridjele vrijednosti, već se sva međudjelovanja u programu opisuju funkcijama. Teorijska podloga ovih jezika je u tzv. λ- računu. Kod logičkih programskih jezika međudjelovanja se u programu opisuju predikatnim logičkim izrazima i funkcijama. Naglasak je na zapisu onoga “što program treba izvršiti”, za razliku od imperativnih jezika pomoću kojih se zapisuje “kako nešto izvršiti”. Apstrakcija je dakle, temeljna mentalna aktivnost programera. Ona je moguća samo ako se dobro poznaje programski jezik i programske algoritme za efikasno korištenje računarskih resursa. O tome će biti riječi u sljedećim poglavljima. 12
  • 13. 2 Matematički i elektronički temelji računarstva Naglasci: • Izjavna logika • Logičke funkcije i predikati • Booleova logika • Temeljni digitalni sklopovi • Brojevni sustavi 2.1 Izjavna i digitalna logika Bit će navedeni osnovni pojmovi potrebni za razumijevanje izjavne logike (ili propozicijske logike), koji se intenzivno koristi u programiranju, i digitalne logike koja je temelj izgradnje digitalnog računala. Osnovni objekt kojeg proučava izjavna logika je elementarna izjava. Ona može imati samo jedno svojstvo - njome se izriče "laž" ili "istina". Primjerice, izjava "osam je veće od sedam" je istinita, a izjava "broj sto je djeljiv sa sedam" je laž. Pri označavanju izjava koristit će se slovo T (true) za istinitu izjavu i F (false) za lažnu izjavu. Rečenica "broj x je veći od broja y" ne predstavlja izjavu jer njena istinitost ovisi o veličini brojeva x i y. Ako se umjesto x i y uvrste brojevi dobije se izjava. Ovakve rečenice se nazivaju izjavne funkcije, a za x i y se kaže da su (predmetne) varijable. Odnos među varijablama, kojeg izjavna funkcija izriče, naziva se predikat. Označi li se u prethodnom primjeru predikat " ... je veći od.... " sa P, navedena izjavna funkcija se može zapisati u obliku P(x,y). Izjavne funkcije se prevode u izjave kada se uvrsti vrijednost predmetnih varijabli ili ako se uz izjavne funkcije primijene neodređene zamjenice svaki (oznaka ∀ koja se naziva univerzalni kvantifikator) ili neki (oznaka ∃ koja se naziva egzistencijalni kvantifikator). ∃x se čita i "postoji x". Primjerice, prethodna izjavna funkcija primjenom kvantifikatora u predikatnom izrazu (∀ y)(∃x)P(x,y) postaje izjava koja znači: "za svaki broj y postoji broj x takav da je x veći od y". Rezultat izjavne funkcije je logička vrijednost T ili F. Varijable koje sadrže logičku vrijednost nazivaju se logičke varijable. U programiranju se često koriste izjavne funkcije iskazane tzv. relacijskim izrazima primjerice a ← (x<z) označava da se logičkoj varijabli a pridijeli logička vrijednost određena izjavnom funkcijom (x<z). Kada je x manje od z logička varijabla poprima logičku vrijednost T inače je F. Standardno se koriste relacijski operatori: < (veće), > (manje), ≠ (različito ili nije jednako), ≥ (veće ili jednako), ≤ (manje ili jednako). 13
  • 14. Složene logičke izjave nastaju korištenjem sljedećih logičkih operacija: Konjunkcija, a & b, (ili a ∧ b) dviju izjava a i b je je složena izjava, nastala povezivanjem izjava a i b veznikom i za kojeg se upotrebljava simbol ∧ ili &. Složena izjava je istinita samo ako su obje izjave istinite. Izjava a & b čita se "a i b". Disjunkcija, a ∨ b, je složena izjava, koja je lažna onda i samo onda kada su obje izjave lažne; a ∨ b čita se "a ili b". Implikacija, a ⇒ b, je složena izjava koja je lažna onda i samo onda ako je a istinito i b lažno; čita se " a povlači b" ili " a implicira b". Za izjavu b ⇒ a kaže se da je obrat izjave a ⇒ b. Vrijedi i sljedeće tumačenje implikacije: ako je izjava a ⇒ b istinita onda je a dovoljan uvjet za b, ili b je nuždan uvjet za a. Ekvivalencija, a ⇔ b, je složena izjava koja je istinita onda i samo onda kada su obje izjave istinite, ili kada su obje lažne: čita se " a je ekvivalentno sa b". Negacija, ¬a, je izjava koja je istinita onda i samo onda kada je izjava a lažna. Simboli: ¬, &, ∨, ⇔ i ⇒ su logički operatori. Njihovo djelovanje na logičke varijable a i b je prikazano tzv. tablicom istinitosti (tablica 2.1). A b ¬a a & b a ∨ b a ⇒ b a ⇔ b T T F T T T T T F F F T F F F T T F T T F F F T F F T T Tablica 2.1. Tablica istinitosti logičkih operacija Upotrebom logičkih operatora i uvođenjem zagrada mogu se, kao i u algebri, graditi razni logički izrazi, primjerice ¬a ∨ (b & d) ⇒ c. Redoslijed izvršavanja operacija je sljedeći: (1) izraz u zagradi, (2) negacija, (3) disjunkcija, (4) konjunkcija, (5) implikacija i ekvivalencija. Logički izrazi koji sadrže samo operacije negacije, konjunkcije i disjunkcije, te zagrade, određuju Booleovu algebru. Svi se logički izrazi mogu iskazati Booleovom algebrom jer se djelovanje operatora implikacije i ekvivalencije može izraziti pomoću Booleovih izraza. Vrijedi: x ⇒ y = ¬x ∨ y x ⇔ y = ¬((¬x & y) ∨ (¬y & x)) Zadatak: Provjerite prethodne izraze tablicom istinitosti. U Booleovoj algebri vrijede slijedeće zakonitosti: 1. Zakon komutacije x ∨ y ≡ y ∨ x x & y ≡ y & x 2. Zakon asocijacije 14
  • 15. x ∨ (y ∨ z) ≡ (x ∨ y) ∨ z x & (y & z) ≡ (x & y) & z 3. Zakon idempotentnosti x ∨ x ≡ x x & x ≡ x 4. Zakon distribucije x ∨ (y & z) ≡ (x ∨ y) & (x ∨ z) x & (y ∨ z) ≡ (x & y) ∨ (x & z) 5. De Morganov teorem ¬(x ∨ y) ≡ ¬x & ¬y ¬(x & y) ≡ ¬x ∨ ¬z 6. Zakon dvostruke negacije ¬¬x ≡ x Booleova logika ima veliku primjenu u programiranju i posebno pri projektiranju sklopova digitalnog računala, jer se gotovo svi potrebni sklopovi digitalnog računala mogu realizirati pomoću tri temeljna elektronička sklopa: invertor, sklop-I (eng. AND gate) i sklop-ILI (eng. OR gate). Slika 2.1. Temeljni digitalni sklopovi Ovi se sklopovi upravljaju naponom (ili strujom) tako da reagiraju na stanje pod naponom i stanje bez napona, dakle oni raspoznaju samo dvije naponske razine: nisku i visoku. Uobičajeno se ta dva stanja označavaju s "1" i "0" umjesto s true i false. To su sklopovi kojima izlaz odgovara operacijama negacije, disjunkcije i konjunkcije ulaznih logičkih stanja "0" i "1". Funkcija ovih sklopova se može prikazati pomoću preklopki. Primjerice, rad sklopa I se može opisati strujnim krugom u kojem su serijski spojene žarulja, sklopka A i sklopka B. Žarulja će zasvijetliti kada proteče struja, a to je moguće samo ako ako su obje sklopke uključene, odnosno izlaz je 1 samo ako su varijable A i B jednake 1. Kod sklopa ILI dovoljno je uključiti jednu sklopku da bi zasvijetlila žarulja. Očito sklop I obavlja logičku funkciju konjunkcije, a sklop ILI obavlja logičku funkciju disjunkcije. U digitalnom se računalu pomoću navedenih sklopova obrađuje i prenosi mnoštvo digitalnih signala. Pošto je uvedeno označavanje stanja digitalnog signala znamenkama 0 i 1, može se reći da se digitalnim signalom prenosi poruka o vrijednosti binarne znamenke koja u jednom trenutku 15
  • 16. može imati iznos nula ili jedinica. Iz tog se razloga umjesto pojma Booleova algebra ili matematička logika često koristi pojam digitalna logika. U digitalnoj je tehnici uobičajena primjena logičkih operatora na nizove bitova. Tada se podrazumijeva da se logičke operacije provode nad bitovima jednake značajnosti. Takve logičke operacije se nazivaju bit-značajne operacije. Primjer: bit značajnom konjunkcijom dva binarna niza A i B dobije se niz C: 7 6 5 4 3 2 1 0 bit ----------------------- 1 1 0 0 1 1 1 1 = A 0 0 0 0 0 1 0 0 = B ---------------------- A & B = 0 0 0 0 0 1 0 0 = C U nizu C jedino bit 2 može biti jednak 1 i to samo ako je i u nizu A taj bit jednak 1. Ovo je često korišten postupak da se ispita da li je neki bit u nizu jednak 1 ili 0. Obično se niz B naziva "maska" za ispitivanje bitova u nizu A. Pored prije navedenih Booleovih logičkih operacija u digitalnoj se tehnici često koristi bit- značajna operacija koja se naziva ekskluzivna disjunkcija ili ekskluzivno ILI. Označava se znakom ⊕ ili XOR. Ima značaj zbrajanja po modulu 2, a njeno korištenje u programiranju bit će pojašnjeno kasnije. A XOR B = A ⊕ B = (¬A & B) ∨ (A & ¬B) A B A ⊕ B 0 0 0 0 1 1 A ⊕ B = (¬A & B) ∨ (A & ¬B) 1 0 1 1 1 0 Slika 2.2 Definicijska tablica ekskluzivne disjunkcije i simbol digitalnog XOR-sklopa 2.2 Brojevni sustavi i računska sposobnost računala U programskim jezicima operacije s brojevima se najčešće zapisuju u decimalnom brojevnom sustavu, jer je čovjek naviknut na rad s decimalnim brojevima. U računalu se pak računske operacije vrše u binarnom brojevnom sustavu. 2.2.1 Binarni brojevni sustav Sasvim općenito, numerička vrijednost broja Z, koji je u pozicionoj notaciji zapisan znamenkama: zn-1....z1z0, u brojevnom sustavu baze x, računa se prema izrazu: n −1 Z = ( zn −1 .... z1z0 ) x = ∑ zi ⋅ x i i =0 Decimalni brojevni sustav je definiran bazom x=10 i znamenkama zi ε{0,1,2,3,4,5,6,7,8,9}, primjerice iznos broja 765 je jednak 7⋅102 + 6⋅101 + 5⋅100 . 16
  • 17. Binarni brojevni sustav je definiran bazom x=2 i binarnim znamenkama zi ∈ {0,1}.Primjerice, iznos binarnog broja 1011 odgovara iznosu broja 11 u decimalnom sustavu, jer je (1011)2 = 1⋅23 + 0⋅22 + 1⋅21 +1⋅20 = 8 + 0 + 2 + 1 = (11)10. Općenito vrijedi da se s binarnim nizom od n bita može kodirati pozitivni cijeli broj maksimalnog iznosa 2n -1, što odgovara broju različitih kombinacija binarnog niza duljine n umanjenom za jedan (i nula je broj!). Za pozitivne cijele brojeve koristi se i nazivi kardinalni brojevi i nepredznačeni cijeli brojevi. U binarnom brojevnom sustavu se mogu izvoditi osnovne računske operacije kao i u decimalnom brojevnom sustavu. Binarno zbrajanje se obavlja kao i decimalno zbrajanje, osim što se prijenos na slijedeće značajnije mjesto ne obavlja nakon zbroja 10, već nakon 2 (1+1). Primjer: 1 1 ← prijenos 1 0 1 = 510 1 1 1 = 710 + 0 1 0 = 210 + 1 0 1 = 510 ----------------- ---------------------- 1 1 1 = 710 1 1 0 0 = 1210 Ukoliko se zbrajanje izvodi bez prijenosa ta operacija se naziva zbrajanje po modulu 2. U logičkom smislu ta operacija je ekvivalentna ekskluzivnoj disjunkciji (XOR). Operaciju zbrajanja LSB bitova može se prikazati tablicom istinitosti 2.2: A B zbroj = A ⊕ B prijenos = A & B 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 Tablica 2.2. Tablica istinitosti za polu-zbrajalo A B Donos Zbroj prijenos 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 Tablica 2.3. Tablica istinitosti za potpuno zbrajalo Digitalni sklop koji realizira ovu funciju naziva se poluzbrajalo (half-adder) i prikazan je na slici 2.3(a). Pri zbrajanju ostalih bitove treba pribrojiti i bit donosa kao u tablici 2.3. Digitalni sklop koji realizira ovu funkciju naziva se potpuno zbrajalo (full-adder). Prikazan je na slici 2.3(b). Očito je da se upotrebom više ovakvih sklopova može "izračunati" zbroj dva binarna niza, na način da se "prijenos" s zbrajala bitova manjeg značaja prenosi kao "donos" u zbrajalo bitova većeg značaja. 17
  • 18. Slika 2.3 Sklopovska izvedba 1-bitnog zbrajala Operacija ekskluzivne disjunkcije (XOR) se često koristi u bit-značajnim operacijama pri šifriranju i u programima s bit-mapiranim grafičkim algoritmima. Interesantno svojstvo ove operacije je da ako se na neki binarni niz A dva puta uzastopno primjeni bit-značajna ekskluzivna disjunkcija s nizom B rezultatni niz je jednak nizu A. Primjerice, neka je niz A= 1010, a niz B=0110. Tada je: A ⊕ B = 1100 (A ⊕ B) ⊕ B = 1010 = A Dakle, prvo djelovanje je šifriranje, a drugo djelovanje je dešifriranje originalnog niza. Oduzimanje broja se može izvesti kao zbrajanje negativne vrijednosti broja. Kako se kodiraju negativni brojevi bit će pokazano kasnije. Binarno množenja se vrši tako da se djelomičan umnožak pomiče za jedno mjesto ulijevo pri svakom uzimanju idućeg množitelja. Ako je množitelj 0, djelomični umnožak je 0, a ako je množitelj 1, djelomični umnožak jednak je množeniku. Primjer: 5 x 5 = 25 5 x 10 = 50 101 (5) 101 (5) 101 (5) 1010 (10) ------------ --------------- 101 000 000 101 101 000 ------------ 101 11001 (25) ---------------- 110010 (50) Binarno dijeljenje se u računalu izvodi primjenom binarnog množenja i oduzimanja, na isti način kao i kod decimalnih brojeva. Navedene operacije su ugrađene u skup naredbi većine današnjih procesora. 18
  • 19. Još dvije operacije su specifične za rad s nizovima bitova. To su operacije logičkog posmaka bitova u lijevo ili u desno (podrazumijeva se LSB na desnoj strani niza), a označavaju se sa SHL (eng. shift left - posmak u lijevo) i SHR (shift right - posmak u desno). Posmak od jednog mjesta u lijevo odgovara množnju kardinalnih brojeva s 2, a posmak bitova jedno mjesto udesno odgovara dijeljenju kardinalnih brojeva s 2. Na prazna mjesta se postavljaju nule. Primjer: 0011 SHL 1 ≡ 0110 odgovara 3 * 2 = 6 0011 SHL 2 ≡ 1100 odgovara 3 * 4 = 12 1110 SHR 1 ≡ 0111 odgovara 14 / 2 = 7 2.2.2 Oktalni i heksadecimalni brojevni sustavi U višim programskim se jezicima rijetko koristi zapis broja u binarnom obliku jer čovjek teško pamti veće nizove "nula i jedinica". Radije se koristi oktalni ili heksadecimalni brojevni sustav. U oktalnom brojevnom sustavu koristi se 8 znamenki: 01234567, a baza brojevnog sustava je x=23=8. Oktalnim brojem jednostavno se označava niz od 3 bita, jer je s binarnim nizom od 3 bita moguće kodirati 8 znamenki oktalnog brojevnog sustava: bit 0 0 1 0 1 0 1 0 1 bit 1 0 0 1 1 0 0 1 1 bit 2 0 0 0 0 1 1 1 1 ----------------------- 0 1 2 3 4 5 6 7 znamenke oktalnog brojevnog sustava To omogućuje pregledniji zapis većih binarnih nizova, primjerice 1001000101112 = 44278, a koristi se pravilo grupiranja po 3 bita: 100=4, 100=4, 010=2, 111=7. U heksadecimalnom brojevnom sustavu koristi se 16 znamenki: 0123456789ABCDEF, a baza brojevnog sustava iznosi x=16. Za kombinacije od 10 do 15 upotrebljena su prva slova abecede, kojima numerička vrijednost u decimalnom brojevom sustavu iznosi: A=10, B=11, C=12, D=13, E=14 i F=15. Heksadecimalnim se brojem jednostavno označava niz od 4 bita, jer se binarnim nizom od 4 bita može kodirati 16 znamenki heksadecimalnog brojevnog sustava: bit 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 bit 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 bit 2 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 bit 3 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 --------------------------------------- 0 1 2 3 4 5 6 7 8 9 A B C D E F heksadecimalne znamenke To omogućava pregledniji zapis većih binarnih nizova, primjerice: 10010001011111102 = 917E16, a koristi se pravilo grupiranja po 4 bita: 1001=9, 0001=1, 0111=7, 1110=E. U programskim jezicima se uvode posebna leksička pravila za zapis konstanti u pojedinom brojevnom sustavu. Ta pravila će biti opisana u četvrtom poglavlju. 19
  • 20. 3 Izrada prvog C programa Naglasci: • Izvorni program i izvršni program • Prvi program u C jeziku – hello.c • Kompiliranje programa koji je napisan u više datoteka • Integrirana programska okolina • Makefile U ovom poglavlju opisani su programi koji se koriste u razvoju programa. Njihova upotreba se demonstrira s nekoliko jednostavnih programa u C jeziku. 3.1 Strojni, asemblerski i viši programski jezici Procesor izvršava radnje u računalu na temelju binarno kodiranih strojnih naredbi, koje dobavlja iz memorije računala. Skup svih strojnih naredbi procesora naziva se strojni jezik, a skup naredbi kojima se neposredno izvršava neka zadana operacija u računalu naziva se strojni program. Strojne naredbe je veoma teško pamtiti. Zbog toga se koristi simboličko zapisivanje naredbi asemblerskim jezikom, u kojem se naredbe zapisuju s kraticama riječi iz engleskog jezika. Primjerice, naredba da se broj, koji se nalazi u registru ax procesora Intel 8086, uveća za jedan, glasi: strojni jezik 01000000 asemblerski jezik inc ax (inc je kratica od increment) Dakle, binarni strojni kôd je zamijenjen simboličkim zapisom koje procesor ne razumije. Za prevođenje asemblerskog zapisa u strojni program koristi se program koji se naziva asembler. Viši programski jezici omogućuju jednostavnije programiranje uvođenjem simboličkih naredbi koje zamjenjuju više naredbi strojnog jezika. Primjerice, iskaz C jezika x = sin(3.14) + 7; znači naredbu da se varijabli x pridijeli vrijednost koja se dobije zbrojem vrijednosti funkcije sin(3.14) i konstante 7. Zapis programa asemblerskim ili višim programskim jezikom naziva se izvorni program (eng. source program). Za pisanje izvornog programa koriste se programi za uređivanje teksta koji se nazivaju editori. Izvorni program u C jeziku se obično pohranjuje kao datoteka s imenom koje završava znakovima “.c” Programi za prevođenje izvornog programa u izvršni program mogu biti realizirani kao interpreteri ili kao kompilatori (eng. compiler), a razlika među njima je u načinu kako se izvorni program prevodi u izvršni program. Kompilator analizira izvorni program i stvara strojni kôd, koji pohranjuje u tzv. objektnu datoteku (eng. object file). Kod MS-DOS računala ime objektne datoteke završava s “.obj”, a kod Unix računala s “.o”. Iako objektna datoteka sadrži strojni kôd, on još nije pogodan za izvođenje u računala, naime za izvođenje programa potrebno je odrediti veze s operativnim 20
  • 21. sustavom i memorijske lokacije programskih objekata. To se vrši programom koji se zove povezivač ili linker. Nakon obrade s linkerom dobije izvršni ili izvedivi program (eng. executive program), a ako se pohrani kao datoteka onda se ta datoteka naziva izvršna datoteka (eng. executive file). Kod MS-DOS računala ime izvršne datoteke završava slovima “.exe”. Postoje programi u kojima je integrirana funkcija kompilatora i linkera. Primjerice, Microsoft Visual C sadrži program "cl.exe", a na Unix-u se koriste "cc" ili "gcc" programi. Učitavanje izvršne datoteke u memoriju računala vrši program koji se naziva punjač (eng. loader). On je sastavni dio operativnog sustava računala. Korisnik pokreće izvršenje programa tako da otkuca ime programa u komandnoj liniji ili se služi programima s grafičkim sučeljem (primjerice, program Explorer kod Windows-a). Ostale radnje punjača obavlja operativni sustav. Programi se mogu izvršavati i pomoću specijalnih programa koji služe za testiranje izvršenja procesa. Tu spadaju programi koji se nazivaju dibageri (eng. debugger) i monitori. Pomoću njih je moguće izvršavati program u konačno zadanom broju koraka, naredbu po naredbu, i nakon svakog koraka moguće je pratiti stanje varijabli (memorije) i registara procesora. Kod naprednijih dibagera moguće je pratiti izvršenje programa na razini izvornog koda, dok se kod jednostavnijih dibagera i monitora izvršenje programa može pratiti na razini strojnog koda. Interpreter prevodi izvorni kod u niz izvršnih naredbi koje se obično izvršavaju unutar samog programa interpretera. Skup izvršnih naredbi interpretera obično se naziva "virtuelni stroj" (primjerice Java VM ili Microsoft CLR). Program za "interpretiranje", pomoću virtuelnog stroja, može biti i odvojeni program. U tom slučaju interpreter ima funkciju kompilatora koji generira datoteke s nizom naredbi virtuelnog stroja. U razvoju programa koristi se veliki broj programa, tzv. softverskih alata, koji olakšavaju razvoj programa i pisanja dokumentacije. Primjerice, na Unix-u se koriste: make - program za kontrolu procesa kompiliranja, grep - program za pretraživanje datoteka, profiler - program za analizu izvršenja programa, diff – program za utvrđivanje razlika među izvornim datotekama, patch – program za automatsko unošenje izmjena u izvorne datoteke. Kod Windows operativnog sustava više su u upotrebi programi koji se nazivaju integrirana razvojna okolina (eng. IDE – integrated developement environment) kod kojih se pod jedinstvenim grafičkim sučeljem koordinira rad svih faza razvoja programa – editiranje izvornog koda, kompiliranje, dibagiranje i profiliranje koda. U okviru IDE-a integriran je i pristup kompletnoj dokumentaciji kompilatora i programskih biblioteka. Bez sumnje, najpopularniji program ovog tipa je Microsoft Visual Studio. 3.2 Prvi program u C jeziku Gotovo sve knjige o C jeziku kao prvi primjer C-programa uzimaju program: /* Datoteka: hello.c */ /* Prvi C program. */ #include <stdio.h> int main() { printf("Hello world!n"); return 0; } Ovaj program vrši samo jednu radnju; na standardnom izlaznom uređaju ispisuje poruku: Hello World!. 21
  • 22. Na slici 3.1 prikazan je Windows komandni prozor. On se još naziva MS-DOS prozor ili još jednostavnije komandna konzola. Karakteristika ispisa u konzoli je da se može jedino vršiti ispis teksta, i to u po principu da se ispisuje redak po redak, od vrha konzole na dolje. U konzoli se mogu zadavati komande operativnom sustavu u retku koji uobičajeno započinje s oznakom tekućeg direktorija. Taj redak se naziva komandna linija operativnog sustava. Najprije će biti pokazano kako se može editirati, kompilirati i izvršiti ovaj program, koristeći komandnu liniju operativnog sustava u MSDOS-prozoru (sl. 3.1). To se vrši u tri koraka: 1. Pomoću editora stvara se tekstualna datoteka, imena "hello1.c", koja sadrži prikazani izvorni kôd programa. 2. Pomoću kompilatora se izvorni kôd programa prevodi u objektni, a zatim i u izvršni kôd. Ako kompilator dojavi da u izvornom kôdu postoje leksičke ili sintaktičke pogreške, ponavlja se korak 1 i ispravljaju pogreške. 3. Izvršenje programa se zadaje u komandnoj liniji. Primjer za OS Windows: c:> edit hello.c ↵ - poziv editora edit (↵ je tipka enter) i unos izvornog programa u datoteku hello.c c:> cl hello.c ↵ - poziv kompilatora (Microsoft-program cl.exe) koji stvara izvršnu datoteku hello.exe c:> hello ↵ - komanda za izvršenje programa hello.exe Hello world! - rezultat izvršenja programa Slika 3.1 Izgled komandnog prozora u Windows operativnom sustavu Primjer za OS Linux: $ vi hello.c ↵ - poziv editora vi i unos datoteke hello.c $ gcc hello.c –o hello ↵ - poziv kompilatora gcc, koji stvara izvršnu datoteku hello $ hello ↵ - komanda za izvršenje programa hello Hello world! - rezultat izvršenja programa 22
  • 23. Analiza programa "hello1.c": C programi se sastoje od niza potprograma koji se zovu funkcije C-jezika. U programu "hello1.c" definirana je samo jedna funkcija, nazvana main(). Ona mora biti definirana u svakom C programu, jer predstavlja mjesto početka izvršenja programa. Programer može definirati nove funkcije, svaku s jedinstvenim imenom, a mogu se koristiti i prethodno definirane funkcije iz standardne biblioteke funkcija C jezika. Radnje koje obavlja neka funkcija zapisuju se unutar tijela funkcije. Tijelo funkcije je omeđeno vitičastim zagradama. U ovom je slučaju u tijelu funkcije je iskaz koji predstavlja naredbu da se pomoću standardne C funkcije printf(), na standardnoj izlaznoj jedinici, ispiše poruka "Hello World!". Pojedini dijelovi programa "hello1.c" imaju sljedeći značaj: /* Prvi C program. */ Tekst omeđen znakovima /* i */ predstavlja komentar. Kompilator ne analizira komentare, već ih tretira kao umetnuto "prazno" mjesto. #include <stdio.h> #include predstavlja pretprocesorsku direktivu. Ona označava da u proces kompiliranja treba uključiti sadržaj datoteke imena "stdio.h". Ta datoteka sadrži deklaracije funkcija iz standardne biblioteke C-jezika. int main() Ovo je zaglavlje funkcije imena main. int označava tip vrijednosti (cijeli broj) koji vraća funkcija na kraju svog izvršenja (u ovom programu to nema nikakvi značaj). { { označava početak tijela funkcije main. printf("Hello world!n"); Ovo je naredba za poziv standardne funkcije printf(), kojom se ispisuje niz znakova (string) koji je argument ove funkcije. n predstavlja oznaku za prijelaz u novi red ispisa. Znak točka-zarez označava kraj naredbe. Return 0; main() "vraća" vrijednost 0, što se uobičajeno koristi kao oznaka uspješnog završetka programa. } } označava kraja tijela funkcije main. U objašnjenju programskih iskaza korišteni su neki novi pojmovi (deklaracija, standardna biblioteka, pretprocesorska direktiva). Oni će biti objašnjeni u sljedećim poglavljima. Ako program nije napisan u skladu s pravilima jezika, tada kažemo da je program sintaktički pogrešan. Primjerice, ukoliko u prethodnom programu nije otkucana točka-zarez iza naredbe printf("Hello world!n"), kao u programu "hello2.c", 23
  • 24. /* Datoteka: hello2.c */ /* Hello s greškom */ #include <stdio. h> int main() { printf("Hello world!n") /* greška: nema ; */ return 0; } tada kompilator, u ovom slučaju program cl.exe, ispisuje poruku da postoji sintaktička pogreška u sljedećem obliku: C:>cl hello.c Microsoft (R) 32-bit C/C Optimizing Compiler Ver.12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. hello.c hello.c(5) : error C2143: syntax error : missing ';' before 'return' Poruka o greški ima sljedeće elemente: hello.c(5) – obavijest da je greška u retku 5 datoteke "hello.c", error C2143: syntax error - kôd i tip greške, missing ';' before 'return' – kratki opis mogućeg uzroka greške. Na temelju dojave greške često je lako izvršiti potrebne ispravke u programu. Važno je uočiti da je kompilator pronašao grešku u petom retku, iako je pogrešno napisana naredba u četvrtom retku. Razlog tome je pravilo C jezika po kojem se naredba može pisati u više redaka, a stvarni kraj naredbe predstavlja znak točka-zarez. Pošto kompilator nije pronašao točku-zarez u četvrtom retku, kompiliranje je nastavljeno s petim retkom i tek tada je utvrđeno da postoji pogreška. Zadatak: Provjerite da li je sintaktički ispravno napisan sljedeći program: /* Datoteka: hello3.c * Zapis naredbe u više redaka */ #include <stdio. h> int main() { printf ( "Hello world!n" ); return 0; } 24
  • 25. 3.3 Struktura i kompiliranje C programa Na sličan način, kao u funkciji main(), može se neka druga grupa naredbi definirati kao posebna funkcija s prikladnim imenom. Primjerice, prethodni program se može napisati pomoću dvije funkcije Hello() i main() na sljedeći način: /* Datoteka: hello4.c * Program s korisnički definiranom funkcijom Hello() */ #include <stdio.h> void Hello() { printf("Hello worldn"); } int main() { Hello(); return 0; } Za razumijevanje ovog programa potrebno je upoznati pravila za definiranje i pozivanje funkcija. Funkcija se definira zaglavljem i tijelom funkcije. Zaglavlje funkcije se zapisuje na sljedeći način: ime funkcije se zapisuje nizom znakova koji sadrži slova, znamenke i znak '_', ali uz uvjet da je prvi znak niza slovo ili '_'. Ispred imena funkcije se navodi vrijednost koju funkcija vraća. Ako funkcija ne vraća nikakovu vrijednost tada se ispred imena piše riječ void, koja znači “ništa ili nevažno je”. Ovakve funkcije se nazivaju procedure. U njima se ne mora koristiti naredba return, već one završavaju kada se izvrši posljednje definirana naredba. Iza imena funkcije se, u zagradama, navode formalni argumenti funkcije, ako ih ima. Kasnije će biti objašnjeno kako se definiraju i koriste argumenti funkcije. Tijelo funkcije se zapisuje unutar vitičastih zagrada, a sadrži niz naredbi i deklaracija. Poziv funkcije je naredba za izvršenje funkcije, (tj. za izvršenje naredbi koje su definirane unutar funkcije). Zapisuje se na način da se prvo napiše ime funkcije, a zatim obvezno zagrade i argumenti funkcije, ako su prethodno definirani. Primjerice, u funkciji main() iskaz Hello(); predstavlja poziv funkcije Hello(). Poziv funkcije pokreće izvršenje naredbi koje su definirane u tijelu funkcije Hello(), tj. poziva se funkcija printf() s argumentom "Hello Worldn". Nakon izvršenja te naredbe program se vraća, u funkciju main() na izvršenje prve naredbe koja je napisana iza poziva funkcije Hello(). Funkcija iz koje se pokreće izvršenje pozvane funkcije naziva se pozivna funkcija. U prethodnom primjeru funkcija Hello() je definirana prije funkcije main(). Taj redoslijed je određen pravilom da se funkcija može pozivati samo ako je prethodno definirana. Iznimka od ovog pravila je ako se koriste tzv. prototipovi funkcija (ili unaprijedne deklaracije funkcija). 25
  • 26. Prototip ili deklaracija funkcije je zapis u koji sadrži zaglavlje funkcije i znak točka-zarez. On služi kao najava da je funkcija definirana negdje drugdje; u standardnoj biblioteci ili u programu iza mjesta njenog poziva ili u drugoj datoteci. U skladu s ovim pravilom dozvoljeno je prethodni program pisati u obliku: /* Datoteka: hello5.c: * C program s korisnički definiranom funkcijom Hello() * i prototipom funkcije Hello() */ #include <stdio.h> void Hello(); /* prototip ili deklaracija funkcije Hello()*/ int main() /* definicija funkcije main() */ { Hello(); return 0; } void Hello() /* definicija funkcije Hello() */ { printf("Hello worldn"); } U C jeziku se programi mogu zapisati u više odvojenih datoteka. Primjerice, prethodni program se može zapisati u dvije datoteke "hellomain.c" i "hellosub.c". U datoteci "hellomain.c" definirana je funkcija main() i deklarirana je funkcija Hello(). Definicija funkcije Hello() zapisana je u datoteci "hellosub.c". /* Datoteka: hellomain.c */ /* Datoteka: hellosub.c */ void Hello(); #include <stdio.h> int main() void Hello() { { Hello(); printf("Hello worldn"); return 0; } } Izvršni program se može dobiti komandom: c:> cl hellomain.c hellosub.c /Fe"hello.exe" U komandnoj liniji su zapisana imena datoteka koje treba kompilirati. Zatim je komandnom preklopkom /Fe zapisano da izvršnu datoteku treba formirati pod imenom "hello.exe". 26
  • 27. Slika 3.2 Proces formiranja izvršnog programa Proces formiranja izvršnog programa je prikazan na slici 3.2. Najprije leksički pretprocesor kompilatora unosi sve deklaracije iz datoteke "stdio.h" u datoteku "hellosub.c". Zatim kompilator prevodi izvorne datoteke "hellomain.c" i "hellosub.c" u objektne datoteke "hellomain.obj" i "hellosub.obj". U ovim datotekama se uz prijevod izvornog koda u strojni jezik nalaze i podaci o tome kako izvršiti poziv funkcija koje su definirane u drugoj datoteci. Povezivanje strojnog kôda, iz obje datoteke, u zajednički izvršni program obavlja program link.exe, kojeg skriveno poziva program cl.exe. Dobra strana odvajanja programa u više datoteka je da se ne mora uvijek kompilirati sve datoteke, već samo one koje su mijenjane. To se može ostvariti na sljedeći način: Prvo se pomoću preklopke /c kompilatorskom pogonskom programu cl.exe zadaje da izvrši prijevod u objektne datoteke, tj. c:> cl /c hellomain.c c:> cl /c hellosub.c Time se dobiju dvije objektne datoteke: "hellomain.obj" i "hellosub.obj". Povezivanje ovih datoteka u izvršnu datoteku vrši se komandom: c:> cl hellomain.obj hellosub.obj /Fe"hello.exe" Ako se kasnije promijeni izvorni kôd u datoteci "hellomain.c", proces kompiliranja se može ubrzati komandnom: c:> cl hellomain.c hellosub.obj /Fe"hello.exe" jer se na ovaj način prevodi u strojni kôd samo datoteka "hellomain.c", a u procesu formiranja izvršne datoteke koristi se prethodno formirana objektna datoteka "hellosub.obj". 3.4 Integrirana razvojna okolina (IDE) Integrirana razvojna okolina Visual Studio omogućuje editiranje izvornog koda, kompiliranje, linkanje, izvršenje i dibagiranje programa. Sadrži sustav "on-line" dokumentacije o programskom jeziku, standardnim bibliotekama i programskom sučelju prema operativnom sustavu (Win32 API). Pomoću njega se mogu izrađivati programi s grafičkim korisničkim sučeljem i programi za konzolni rad. Nakon poziva programa dobije se IDE Visual Studio prikazan na slici 3.3. 27
  • 28. Slika 3.3 Izgled Visual Studio pri pokretanju programa Najprije će biti opisano kako se formira projekt za konzolni tip programa. Prije pokretanja programa, neka se u direktoriju c:My DocumentsC2002pog2 nalaze izvorne datoteke hellomain.c i hellosub.c. Pokretanjem komande menija: File-New-Project, dobije dijalog za postavljanje novog projekta. U dijalogu prikazanom na slici 3.4 označeno je 1. da će projekt biti klase: Win32 Console Application, 2. upisano je ime direktorija d:src 3. gdje će biti zapisana dokumentacija projekta imena hello. U ovom slučaju Visual Studio zapisuje dokumentaciju projekta u datotekama hello.vsproj i hello.sln (datoteka ekstenzije .sln sadrži opis radne okoline, a datoteka ekstenzije .vcproj sadrži opis projekta). Visual Studio također automatski formira dva poddirektorija: .Release i .Debug, u kojima će se nalaziti objektne i izvršne datoteke. (Debug direktorij je predviđen za rad kompilatora u obliku koji je prikladan za pronalaženje grešaka u programu) Pokretanjem komande: Project - Add to project – File, u dijalogu prikazanom na slici 3.9 odabiremo datoteke "hellomain.c" i "hellosub.c", iz direktorija c:My Documentscpp- 2001pog3. Dobije se izgled radne okoline kao na slici 3.10. Pokretanjem komande: Build – Build hello.exe vrši se proces kompiliranja i linkanja. Ako se izvrši bez greške, nastaje izvršni program imena hello.exe. Program hello.exe se može pokrenuti pozivom komande Build – Execute hello.exe (ili pritiskom tipki Ctrl+F5). 28
  • 29. Slika 3.4 Dijalog za postavljanje novog projekta Slika 3.5 Dijalog za postavljanje tipa Win32-Console projekta 29
  • 30. Slika 3.6 Dijalog koji izvještava o postavkama novog projekta Slika 3.7 Izgled radne okoline nakon formiranja novog projekta “hello” 30
  • 31. Slika 3.9 Dijalog za umetanja datoteka u projekt Slika 3.10 Izgled IDE s aktivnim editorom 31
  • 32. 3.5 Usmjeravanje procesa kompiliranja programom nmake Kada se program sastoji od velikog broja datoteka, procesom kompiliranja se može upravljati pomoću program imena nmake (make na UNIX-u) i specifikacije koja se zapisuje u datoteci koji se obično naziva makefile. Za prethodni primjer datoteka makefile može biti napisana na sljedeći način: # datoteka: makefile #Simbolička definicija za spisak objektnih datoteka OBJS = hellomain.obj hellosub.obj #progam se formira povezivanjem objektnih datoteka: hello.exe : $(OBJS) cl $(OBJS) /Fe"hello.exe" # $(...) znači umetanje prethodnih makro definicija # ovisnost objektnih datoteka o izvornim datotekama # i komanda za stvaranje objektne datoteke hellomain.obj : hellomain.c cl -c hellomain.c hellosub.obj : hellosub.c cl -c hellosub.c Ako se ovu datoteku spremi pod imenom makefile, dovoljno je u komandnoj liniji otkucati: c:> nmake i biti će izvršen cijeli postupak kompiliranja i linkanja izvršnog programa. Ako se pak ova datoteka zapiše pod nekim drugim imenom, primjerice "hello.mak", u komandnoj liniji, iza preklopke –f treba zadati i ime datoteke, tj. c:>nmake –fhello.mak Kako se formira makefile. Temeljna pravila formiranja makefile datoteke su: • Komentari se u makefile zapisuju tako da redak započne znakom #. • Mogu se navesti različite simboličke definicije oblika: IME = text, što omogućuje da na mjestu gdje se piše $(IME) bude supstituiran text. • U makefile se zatim navodi niz definicija koje se sastoje od dva dijela: prvi dio opisuje ovisnost datoteka, a drugi opisuje kao se ta ovisnost realizira. Primjerice, u zapisu hellosub.obj : hellosub.c cl –c hellosub.c • U prvom retku je označena ovisnost sadržaja "hellosub.obj" o sadržaju "hellosub.c". • U drugom retku je specificirana komanda koja se primjenjuje na datoteku "hellosub.c" • Redak u kojem se specificira komanda mora započeti znakom tabulatora Program nmake uspoređuje vrijeme kada su nastale međuovisne datoteke. Čim se promijeni sadržaj "hellosub.c", dolazi do razlike u vremenu nastanka međuovisnih datoteka, pa program nmake pokreće program za kompiliranje koji je specificiran u drugom retku. Korištenje makefile je vrlo popularno, posebno na Unix sustavima i kod profesionalnih programera, jer se pomoću simboličkih definicija lako može definirati proces kompiliranja na različitim operativnim sustavima. 32
  • 33. 4 Kodiranje i tipovi podataka Naglasci: • kodiranje brojeva • kodiranje znakova • kodiranje logičkih vrijednosti • pojam tipa podataka • tipovi konstanti i varijabli u C jeziku • adrese i pokazivači • ispis i unos podataka U ovom se poglavlju se opisuje kako se u računalu kodiraju brojevi i znakovi, objašnjava se koncept tipa podataka i pokazuje karakteristike tipova u C jeziku. 4.1 Kodiranje i zapis podataka Kodiranje je postupak kojim se znakovima, numeričkim vrijednostima i drugim tipovima podataka pridjeljuje dogovorom utvrđena kombinacija binarnih znamenki. Ovdje će biti opisano kodiranje koje se koristi u C jeziku. S programerskog stajališta, važnije od samog načina kodiranja je veličina zauzeća memorije i interval vrijednosti koji se postiže kodiranjem. Također, važno je upoznati leksička pravila po kojima se zapisuju znakovne i numeričke konstante u "literalnom" obliku. 4.1.1 Kodiranje pozitivnih cijelih brojeva (eng. unsigned integers) Pozitivni cijeli brojevi (eng. unsigned integers), ili kardinalni brojevi, su brojevi iz skupa kojeg čine prirodni brojevi i nula. Način njihovog kodiranja je opisan u poglavlju 2. U C jeziku se literalne konstante, koje predstavljaju pozitivne cijele brojeve, mogu zapisati u decimalnom, heksadecimalnom i oktalnom brojevnom sustavu, prema slijedećem leksičkom pravilu: • niz decimalnih znamenki označava decimalnu konstantu ukoliko prva znamenka nije nula. • niz oktalnih znamenki označava oktalnu konstantu ako je prva znamenka jednaka nuli. • niz heksadecimalnih znamenki, kojem prethodi prefix 0x ili 0X, označava heksadecimalnu konstantu. Primjer: tri ekvivalentna literalna zapisa vrijednosti binarnog niza 011011 u C jeziku su: decimalna konstanta 27 oktalna konstanta 033 heksadecimalna konstanta 0x1B 4.1.2 Kodiranje cijelih brojeva (eng. integers) Cijeli brojevi (eng. integers) su brojevi iz skupa kojeg čine prirodni brojevi, negativni prirodni brojevi i nula, ili drukčije kazano, to su brojevi s predznakom (eng. signed integers). Većina današnjih procesora za kodiranje cijelih brojeva s predznakom koristi tzv. komplementni 33
  • 34. brojevni sustav. Puni komplement n-znamenkastog broja Nx, u brojevnom sustavu baze x matematički se definira izrazom: N x = xn − N x ′ primjerice, u decimalnom sustavu komplement troznamenkastog broja 733 je 103-733= 277. Ako se n-znamenkasti broj i njegov komplement zbroje vrijedi da će n znamenki biti jednako nuli. U prijašnjem primjeru 733+277=1000, dakle tri znamenke su jednake nuli. U binarnom se sustavu puni komplement naziva komplement dvojke i vrijedi: N 2 = 2n − N 2 ′ Komplement dvojke se koristi za označavanje negativnih brojeva. Primjerice, komplement dvojke broja +1 za n=4 iznosi: ′ N 2 = 2 4 − 1 = 10000 − 0001 = 1111 . Ako se broj i njegov komplement zbroje, rezultat treba biti nula. To vrijedi, u prethodnom primjeru, jer su prva četiri bita zbroja jednaka nuli. Peti bit je jednak jedinici, ali on se u 4- bitnom sustavu odbacuje. U sustavu komplementa dvojke pozitivni brojevi uvijek imaju MSB=0, a negativni brojevi imaju MSB=1. Što se događa ako se zbroje dva pozitivna broja koji imaju bitove ispod MSB jednake jedinici. Primjerice, ako zbrojimo 4+5 ( u 4-bitnom sustavu) 0100 +0101 ----- 1001 dobije se rezultat koji predstavlja negativan broj u sustavu komplementa dvojke. Do prijelaza u područje komplementa ne bi došlo da je rezultat zbrajanja bio manji od 7, odnosno 24-1-1. Poopći li se prethodno zapažanje na brojeve od n-bita, može se zaključiti da operacija zbrajanja ima smisla samo ako je zbroj operanada manji od 2n-1-1. Zbog toga, najveći pozitivni broj koji se može predstaviti u sustavu komplementa dvojke iznosi: max_int = (0111...111) = 2n-1-1, a najveći iznos negativnog broja iznosi: min_int = (1000...000) = -2n-1. Uočite da postoji za jedan više negativnih brojeva od pozitivnih brojeva. Obični komplement binarnog broja (naziva se i komplement jedinice) dobije se zamjenom svih jedinica s nulom i obratno. Iznos broja. koji se dobije na ovaj način, računa se prema izrazu: N 2 = 2n − N 2 − 1 Obični komplement nije pogodan za izražavanje prirodnih brojeva jer nije jednoznačno određena vrijednost nule, naime obični komplement od 0000 iznosi 1111. On služi za jednostavno izračunavanje punog komplementa, jer vrijedi: N2 = N2 + 1 ′ 34
  • 35. Puni komplement se izračunava tako da se običnom komplementu pribroji jedinica, primjerice, komplement dvojke broja 6 u 8-bitnoj notaciji iznosi: 00000110 (+6) -------- 11111001 (obični komplement od +6) 1 (dodaj 1) -------- 11111010 (-6 u komplementu dvojke) Izračunajmo puni komplement od 0: 00000000 (0) -------- 11111111 (komplement od 0) 1 (dodaj 1) -------- 100000000 (-0 u komplementu dvojke) Jedinica predstavlja deveti bit. Ona se u 8-bitnom sustavu odbacuje pa rezultat opet predstavlja nulu. Komplement dvojke omogućuje jednoznačno određivanje nule, pa je podesan za kodiranje cijelih brojeva. 4.1.3. Kodiranje realnih brojeva Realni brojevi se u matematici zapisuju na način da se cijeli i decimalni dio odvoje decimalnim zarezom (pr. 67,098), a koristi se i ekponentni format (eng. scientific format). Primjerice, prethodni se broj može zapisati u obliku 0,67089⋅102. U programskom jeziku C koristi se sličan zapis kao u matematici, s razlikom da se umjesto decimalnog zareza koristi "decimalna točka", a potencija broja 10 se označava velikim ili malim slovom E. matematički zapis ekvivalentni zapis u C-jeziku 1,789 1.789 0,789 0.789 ili .789 -178,9⋅10-2 -178.9e-2 ili -178.9E-2 -0,01789⋅102 -0.01789e2 ili -0.01789E2 ili -0.01789e+2 Tablica 4.1. Matematički i programski zapis realnih brojeva Eksponentni format se sastoji od dva dijela: mantise i eksponenta eksponentni decimalni format = mantisa 10eksponent Mantisa se zapisuje kao obični decimalni broj s predznakom, a eksponent se zapisuje kao cijeli broj. Prednost korištenja eksponentnog formata je u lakšem zapisu vrlo velikih i vrlo malih brojeva. Uočite da se promjenom vrijednosti eksponenta pomiče položaj decimalnog zareza. Kodiranje s fiksnim položajem binarne točke (eng. fixed point numbers) Umjesto pojma decimalnog zareza uvodi se pojam binarne točke. Opći oblik zapisivanja realnog broja s fiksnim položajem binarne točke, u slučaju da se N znamenki koristi za 35
  • 36. označavanje cijelih vrijednosti, a n znamenki za označavanje razlomljenih vrijednosti (po bazi 2: 1/2, 1/4, 1/8 itd.) glasi: bN −1bN − 2 ...b0 • b−1b− 2 ...b− n , a iznos mu se računa prema izrazu: N .n2 = bN −1 2 N −1 + ... + b0 2 0 + b−1 2 −1 + b− 2 2 −2 + ... + b− n 2 − n , bi ∈ (0,1) Ako se ovaj broj pomnoži s 2n može ga se u operacijama smatrati cijelim brojem, a nakon izvršenih aritmetičkih operacija rezultat se skalira za iznos 2-n. Ovaj oblik kodiranja ima brojne nedostatke, i koristi se samo u izuzetnim slučajevima. Kodiranje s pomičnim položajem binarne točke (eng. floating point numbers) Ideja eksponentnog formata uzeta je kao temelj za kodiranje realnih brojeva i u binarnom brojevnom sustavu. Kodiranje se vrši prema izrazu F = ( − 1) m 2 e s gdje m predstavlja mantisu, e je eksponent dvojke, a s∈(0,1) određuje predznak broja. Eksponent i mantisa se kodiraju u binarnom brojevnom sustavu. Eksponent se kodira kao cijeli broj, a mantisa kao binarni broj s fiksnim položajem binarne točke. Ideja je jednostavna: promjenom eksponenta pomiče se i položaj binarne točke iako se mantisa zapisuje s fiksnim položajem binarne točke. Primjerice, neka je broj kodiran u obliku: 0.00001xxxxxxxxx 2e gdje x može biti 0 ili 1. Ovaj oblik zapisa realnog broja naziva se nenormalizirani zapis. Pomakne li se položaj binarne točke za 5 mjesta ulijevo dobije se ekvivalentni zapis 1.xxxxxxxxx00000 2e-5, Posmak bitova ulijevo ekvivalentan je dijeljenju s dva, stoga se vrijednost eksponenta smanjuje za 5. Ovakav kodni zapis, u kojem je uvijek jedinica na prvom mjestu, naziva se normalizirani zapis. Značaj normaliziranog zapisa je u činjenici što se njime iskorištavaju svi bitovi mantise za kodiranje vrijednosti, dakle osigurava se veća točnost zapisa. Normaliziranim se oblikom ipak ne može kodirati veoma male vrijednosti, pa je tada pogodniji nenormalizirani zapis broja. Treba pojasniti i kako je kodirana vrijednost nula. Pogodno bi bilo da sva bitna polja pri kodiranju vrijednosti nula budu jednaka nuli (zbog logičkih operacija), ali pošto se za kodiranje eksponenta također koristi binarni zapis, vrijednost eksponenta nula se matematički koristi za označavanje brojeva većih od jedinice. Da bi se zadovoljilo zahtjevu kodiranja nule s nultim zapisom eksponenta uobičajeno je da se umjesto stvarne vrijednosti eksponenta kodira vrijednost: E = e + pomak, gdje je pomak neka konstantna vrijednost, a odabire se na način da je jednak najnižoj vrijednosti eksponenta e, koji je negativna vrijednost Ovako zapisani eksponent naziva se pomaknuti eksponent. Značaj pomaka pokazuje sljedeći primjer. Neka je eksponent opisan s 8 bita. Tada se E kreće u rasponu od 0 do 255. Ako se uzme da je pomak=127, i da je E=0 rezervirano za kodiranje nule, onda se vrijednost binarnog eksponenta kreće u rasponu od -126 do +127. 36
  • 37. Postoji više različitih formata zapisa mantise i eksponenta u binarnom kodu. Danas se gotovo isključivo koristi format koji je određen ANSI/IEEE standardom br.745 iz 1985. godine. Prema tom standardu koriste se dva tipa kodiranja: jednostruki format (32 bita) i dvostruki format (64 bita). Slika 4.1 Format kodiranja realnih brojeva prema IEEE/ANSI standardu STANDARDNI IEEE/ANSI FORMAT REALNIH BROJEVA parametar Jednostruki (SINGLE) dvostruki (DOUBLE) ukupan broj bita 32 (+1) 64 (+1) broj bita eksponenta 8 11 broj bita za predznak 1 1 broj bita mantise 23 (+1) 52 (+1) pomak +127 +1023 Emax 255 2047 Emin 0 0 minreal (za nenorm.) (-1)s⋅1.4⋅10-45 (-1)s⋅2.225⋅10-324 minreal (za norm.) (-1)s⋅1.175⋅10-38 (-1)s⋅2.225⋅10-308 maxreal (-1)s⋅3.4028⋅10+38 (-1)s⋅1.797⋅10+308 Tablica 4.2. Standardni IEEE/ANSI format realnih brojeva Bitna karakteristika ovog standarda je da je u format za kodiranje realnog broja moguće upisati i šifru o ispravno obavljenoj matematičkoj operaciji (pr. dijeljenje s nulom dalo bi beskonačnu vrijednost, koju je nemoguće kodirati, pa se ta operacija izvještava kao greška). Binarno kodirani signal greške koristi format binarno kodiranih realnih brojeva, ali kako to nije broj, u standardu se opisuje pod nazivom NaN (Not a Number). Kodiranje s normaliziranim zapisom mantise je izvršeno na način da se ne upisuje prva jedinica, čime se podrazumjeva da je mantisa kodirana s jednim bitom više nego je to predviđeno u binarnom zapisu. Vrijednost pomaka i raspona eksponenta dana je tablicom 3.2. Vrijednost eksponenta Emin je iskorištena za kodiranje nule, a vrijednost Emax za kodiranje NaN-a i beskonačnosti. Zapis formata se interpretira na sljedeći način: 1. Ako je E=Emax i m≠0 kodna riječ predstavlja NaN, bez obzira na vrijedost predznaka s. 2. Ako je E=Emax i m=0 kodna riječ predstavlja (-1)s (∝). 3. Ako je Emin<E<Emax kodna riječ predstavlja broj (-1)s2e-127(1.m), tj. predstavlja normalizirani realni broj. 4. Ako je E=0 i m=0 kodna riječ predstavlja broj (-1)s(0). 5. Ako je E=0 i m≠0 kodna riječ predstavlja broj (-1)s2ee-127(0.m) tj. predstavlja nenormalizirani realni broj (vodeća nula se ne zapisuje). Opis nenormaliziranim brojevima ne osigurava točnost za sve brojeve pa se ovo kodiranje u nekim implementacija ne koristi. Vrijednosti za minimalnu i maksimalnu vrijednost realnog broja u tablici 3.2. dani su za normalizirani i nenormalizirani format realnog broja. 37