Successfully reported this slideshow.

Programiranje c jezikom

2,977 views

Published on

PROGRAMSKI JEZIK C

  • Be the first to comment

  • Be the first to like this

Programiranje c jezikom

  1. 1. PROGRAMIRANJEC JEZIKOMNastavni materijal za studente FESB-a.Split, 2005/2006Autor: Ivo Mateljan 1
  2. 2. Sadržaj1 Uvod........................................................................................................................................... 52 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 .............................................................. 163 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................................................... 324 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....................................................................................................... 545 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........................................................................................................................... 706 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....................................................................................... 817 Proste i strukturalne naredbe C jezika...................................................................................... 87 7.1 Proste naredbe ................................................................................................................... 87 7.2 Strukturalne naredbe ......................................................................................................... 898 Nizovi..................................................................................................................................... 102 8.1 Jednodimenzionalni nizovi.............................................................................................. 102 8.2 Prijenos nizova u funkciju............................................................................................... 107 8.3 Višedimenzionalni nizovi................................................................................................ 1109 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......................................................................................................................... 12810 Rad s pokazivačima.............................................................................................................. 129 2
  3. 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..................................................................................................................... 14411 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.......................................................... 15812 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 ............................................................... 17113 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....................................................................... 18314 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................................................................................. 19215 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 ................................................................................... 20816 Apstraktni tipovi podataka - ADT........................................................................................ 210 3
  4. 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....................................................................................................................... 22417 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....................................................................................................................... 24818 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....................................................................................................................... 28019 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....................................................................................................................... 31620 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......................................................................................................... 344Literatura ................................................................................................................................... 354Dodatak ..................................................................................................................................... 355 Dodatak A - Elementi dijagrama toka................................................................................... 355 Dodatak B - Gramatika C jezika ........................................................................................... 356 Dodatak C - Standardna biblioteka C jezika ......................................................................... 361Index.......................................................................................................................................... 392 4
  5. 5. 1 UvodNaglasci: • Š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 premaprogramima koje izrađuje čovjek. Sastavni dijelovi računala nazivaju se hardver, a programi injihova dokumentacija nazivaju se softver. Prvotno su računala služila za obavljanje numeričkihprorač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šavajurazličiti problemi. Bit će opisana i unutarnja građa računala. Za pisanje programa koristit će seprogramski jeziku C i asemblerski jezik.Što je program? Program je zapis operacija koje računalo treba obaviti. Taj zapis može biti u oblikuizvršnog programa ili u obliku izvornog programa. Izvršni program sadrži kôd operacija kojeizvršava stroj računala, pa se naziva i strojni program. Izvorni program se zapisuje simboličkimjezikom koji se naziva programski jezik. Prevođenje izvornog programa u strojni program vršise 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 seobrađuju kontinuirani elektronički signali. Digitalnim računalom se obrađuju, prenose i pamtediskretni elektronički signali koji u jednom trenutku mogu imati samo jedno od dva mogućastanja. Ta stanja se označavaju znamenkama 0 i 1, odatle i naziv digitalna računala (eng. digitznač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 imatisamo dvije vrijednosti 0 ili 1. Niz od više bitova predstavlja kodiranu informaciju koja može 5
  6. 6. predstavljati operaciju koju računalo treba izvršiti ili neki smisleni podatak. Uobičajeno je zanizove bitova koristiti nazive iz Tablice 1.1. U binarnom nizu često se označava redoslijed bitova. Kratica LSB označava bit najmanjegznačaja (eng. least significant bit), a MSB označava bit najvećeg značaja (eng. most significantbit). 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 nizaZa označavanje većih nizova koriste se prefiksi: k (kilo) ⇔ × 1024 M (mega) ⇔ k × 1024 G (giga) ⇔ M × 1024 T (tera) ⇔ G × 1024Primjerice, 2 kB (kilobajta) = 2048 bajta, 3 Mb (megabita) = 3145728 bita. Digitalno računalo može pamtiti i izvršavati programe, te dobavljati, pamtiti i prikazivatirazličite informacije. Te informacije, koje su na prikladan način pohranjene u računalu, suprogramski 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 sepodrazumijeva da n-bitno računalo može operirati s nizom od n bita kao s cjelinom. Broj bitakoji se koristi za opisivanje nekog podatka ovisi o veličini skupa kojem taj podatak pripada. 6
  7. 7. Razmotrimo skup podataka kiji se kodira s tri bita. Taj skup može imati maksimalno 8elemenata 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 odmaksimalno 2n elemenata. Tablica 1.2 pokazuje da se udvostručenjem broja bitova značajnopoveć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 istovremenoprenosi i obrađuje više bita. Kod svih računala usvojeno je da najmanja jedinica digitalneinformacije, 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 procesorskajedinica (CPU – central processing unit) - kontrolira izvršenje programa i aritmetičko-logičkihoperacija. CPU je kod mikro i mini računala izveden kao jedinstveni integrirani elektroničkisklop (čip) i naziva se mikroprocesor. Uobičajeno je koristiti naziv procesor, bilo da se radi omikroprocesoru ili o skupini čipova koji obavljaju funkcije CPU, a programe koji se izvršavajuu 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 operativnomstanju. U memoriji se nalazi programski kôd i podaci s kojima operira procesor na temeljunaredbi sadržanih u programskom kôdu. Memorija je napravljena od poluvodičkih elemenata ukoje procesor može upisati i iz kojih može čitati digitalne informacije. Ta memorija se nazivaRAM (eng. random access memory). Sa programerskog stajališta RAM predstavlja linearnouređen prostor u kojem se istovremeno može pristupiti grupi od 8 bita digitalne informacije (1bajt). 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 pamtitidigitalnu informaciju, a naziva se ROM (eng. read-only memory). U ROM-u je upisan programkoji služi pokretanju osnovnih funkcija računala. U samom procesoru ugrađeno je nekolikomanjih memorijskih jedinica koje se nazivaju registri. Registri služe za privremeni smještajprogramskog kôda i podataka iz radne memorije, te rezultata aritmetičko-logičkih operacije kojese izvršavaju u samom procesoru. Broj bita koji može biti pohranjen u jednom registru naziva seriječ procesora. Kod većine današnjih PC računala riječ procesora sadrži 32 bita (4 bajta), pa sekaže da su to 32-bitna računala. Vanjska memorija - služi za trajnu pohranu podataka. U tu svrhu koriste se magnetski ioptički mediji (tvrdi disk, savitljive diskete, magnetske trake, optički diskovi,..). Podaci se nanjima 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. 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 priuključenju električnog napajanja, kontrolu i redoslijed izvođenja programa, kontrolu korištenjamemorije, 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. Onse, jednim dijelom, trajno nalazi u ROM memoriji računala. Programi s novakvim svojstvomnazivaju se rezidentni programi. Svi ostali programi moraju se prije izvršenja upisati umemoriju računala. Može se izvršiti funkcionalna podjela softvera na sistemski i aplikativni softver. Usistemski softver spadaju programi operativnog sustava, razni jezični procesori (interpreteri,kompilatori, emulatori itd.), programi za testiranje programa (debugger), servisni i uslužniprogrami, 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đedo 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šenjeproblema 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čnombroju koraka i u konačnom vremenskom intervalu. Pravila kako se piše algoritam nisu strogoodređena. Algoritam se može definirati običnim govornim jezikom, tablicama i matematičkimformulama 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 jeizvršitelj kojem upute, iskazane nizom naredbi, nisu dovoljno jasne, jer ono ne zna (1) gdje senalazi 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 preciziranjempojedinog 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 suoznačene s 1.1, 1.2,..1.5. Naredbe iskazane u koracima 1.1 do 1.4 su same po sebi jasne. Korak1.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 "izmjerirazinu tlaka", višekratno ponavljaju, sve dok je razina tlaka manja od 1,6. Obje ove naredbe su 8
  9. 9. zapisane uvlačenjem reda kako bi se točno znalo koje naredbe treba ponavljati. Ovaj se tipnaredbe naziva iteracija ili petlja. Uobičajeno se kaže da petlja ima zaglavlje, u kojem seispituje uvjet ponavljanja petlje (dok je razina tlaka manja od 1,6 ponavljaj), i tijelo petlje, kojeobuhvaća jednu ili više naredbi koje treba ponavljati. Naziv petlja podsjeća na činjenicu da seuvijek 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 nisuposebno numerirane jer su one povezane uz zaglavlje petlje, a izvršavaju se u kao jedinstvenasložena naredba. Uobičajeno se niz naredbi koji predstavljaju jedinstvenu složenu naredbunaziva i blok naredbi ili samo blok. Uvjet ponavljanja petlje je izjava: "razina tlaka manja od 1,6". Odgovor na ovu izjavu možebiti "Da" ili "Ne", ovisno o trenutno izmjerenoj razini tlaka. Ako je odgovor "Da", kažemo da jeispunjen uvjet ponavljanja petlje. Računarska se znanost koristi znanjima matematičke logike. Utom kontekstu ova izjava predstavlja tzv. predikatni izraz koji može imati samo dvije logičkevrijednosti: "istina" ili "laž", pa se kaže da je uvjet održanja petlje ispunjen ako je predikatniizraz 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 problemispravno riješen, moguće je da se opet potkrade neka greška. To se obično događa kada se nepredvide sve moguće situacije, odnosno stanja u koja se može doći. Primjerice, gornji algoritamnije predvidio slučaj da je guma probušena. Kakav bi razvoj događaja tada bio, ako bi sedosljedno poštovao postupak iz koraka 1.5? Pošto je kod probušene gume razina tlaka uvijekmanja od 1,6, ispada da bi tada izvršitelj naredbi ponavljao postupak pumpanja gumebeskonač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 tlakaU 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 naredbiOvaj se tip naredbe zove uvjetna selekcija ili grananje, jer se nakon ispitivanja logičkog uvjetavrš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 naredbuNjome 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. 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 tlakaOč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 izvornogprograma. Kako se to radi bit će objašnjeno u sljedećim poglavljima. Važno je uočiti da su uzapisu 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 objektiSvaki proces rezultira promjenom stanja ili atributa objekata na koje procesi djeluju. Uobičajenose stanje nekog promjenljivog objekta označava kao varijabla koja ima neko ime. U računalu sestanje objekta pamti u memoriji računala pa se algoritamske varijable mora tretirati kaomemorijske 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 paknapiše iskaz: x = 2*x +5;on predstavlja proces u kojem se najprije iz memorije očitava vrijednost memorijskog objekta xzapisanog na desnoj strani znaka =. Zatim se ta vrijednost množi s 2 i pribraja joj se numeričkavrijednost konstante 5. Time je dobivena numerička vrijednost izraza s desne strane znaka =. Tase vrijednost zatim pridjeljuje memorijskom objektu s lijeve strane znaka =. Konačni je rezultatovog procesa da je varijabli x pridijeljena vrijednost 15. Ako bi prethodni iskaz tretirali kaomatematički iskaz, on bi predstavljao jednadžbu s jednom varijablom, koja uvjetuje da jevrijednost varijable x jednaka 5. 10
  11. 11. Znak = u C jeziku ne predstavlja znak jednakosti, kao u matematici već operator pridjelevrijednosti. Njegova upotreba označava naredbu da se vrijednost memorijskog objekta s lijevestrane znaka = postavi na vrijednost izraza koji je zapisan s desne strane znaka =. Takovenaredbe se zovu naredbe pridjele vrijednosti. Zbog ove nekonzistentnosti upotrebe znaka = umatematici u odnosu na upotrebu u nekim programskim jezicima (C, Basic, Fortan, Java) čestose 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 uračunalu. Naime, procesor može vršiti operacije samo nad podacima koji se nalaze u registrimaprocesora, pa je prije svake operacije s memorijskim objektima prethodno potrebno njihovsadržaj (vrijednost) prenijeti u registre procesora, a nakon obavljene operacije se sadržaj izregistra, koji sadrži rezultat operacije, prebacuje u memorijski objekt označen s lijeve straneoperatora 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 vrloneefikasna i skupa upotreba računala. Međutim, malo iskusniji programer bi prema gornjemalgoritmu mogao lako napraviti program kojim se animirano simulira proces zamjene točka. Toje moguće jer, iako je prethodni algoritam apstraktan, on specificira procese u obliku koji semože ostvariti računarskim programom. Apstrakcija je temeljna mentalna aktivnost programiranja. U računarskoj se terminologijipod pojmom apstrakcije podrazumijeva prikladan način zapisa o objektima i procesima koje seobrađuje pomoću računala, a da se pri tome ne vodi računa o tome kako je izvršena stvarnaračunarska implementacija, niti objekta niti procesa. Važna je samo ona pojavnost koja jeodređena apstrakcijom. Algoritam zapisan programskim jezikom predstavlja apstrakcijustrojnog koda, a algoritam zapisan prirodnim jezikom predstavlja apstrakciju programskogjezika. Programski jezik služi da se formalnim jezikom zapiše procese i stanje memorijskihobjekata 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 utoku izvršenja programa moguće je daljnje usložnjavanje apstrakcije. Primjerice, korisnik CADprograma 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šitisljedeć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 sunaredbe pridjele vrijednosti, aritmetičko-logičke operacije, uvjetni i bezuvjetni skokovi te poziv 11
  12. 12. potprograma). Kod objektno orijentiranih jezika naglasak je na tome da varijable predstavljajuatribute nekog objekta, a funkcije predstavljaju metode pomoću kojih objekt komunicira sdrugim objektima. Specifikacije atributa i metoda određuju klase objekata. Kod funkcionalnihse jezika ne koristi temeljna imperativna naredba pridjele vrijednosti, već se svameđ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 predikatnimlogičkim izrazima i funkcijama. Naglasak je na zapisu onoga “što program treba izvršiti”, zarazliku 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 sedobro poznaje programski jezik i programske algoritme za efikasno korištenje računarskihresursa.O tome će biti riječi u sljedećim poglavljima. 12
  13. 13. 2 Matematički i elektronički temeljiračunarstvaNaglasci: • Izjavna logika • Logičke funkcije i predikati • Booleova logika • Temeljni digitalni sklopovi • Brojevni sustavi2.1 Izjavna i digitalna logika Bit će navedeni osnovni pojmovi potrebni za razumijevanje izjavne logike (ili propozicijskelogike), koji se intenzivno koristi u programiranju, i digitalne logike koja je temelj izgradnjedigitalnog računala. Osnovni objekt kojeg proučava izjavna logika je elementarna izjava. Ona može imati samojedno svojstvo - njome se izriče "laž" ili "istina". Primjerice, izjava "osam je veće od sedam" je istinita, a izjava "broj sto je djeljiv sasedam" je laž. Pri označavanju izjava koristit će se slovo T (true) za istinitu izjavu i F (false) zalažnu izjavu. Rečenica "broj x je veći od broja y" ne predstavlja izjavu jer njena istinitost ovisi o veličinibrojeva x i y. Ako se umjesto x i y uvrste brojevi dobije se izjava. Ovakve rečenice se nazivajuizjavne funkcije, a za x i y se kaže da su (predmetne) varijable. Odnos među varijablama, kojegizjavna funkcija izriče, naziva se predikat. Označi li se u prethodnom primjeru predikat " ... jeveć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 seuz izjavne funkcije primijene neodređene zamjenice svaki (oznaka ∀ koja se naziva univerzalnikvantifikator) ili neki (oznaka ∃ koja se naziva egzistencijalni kvantifikator). ∃x se čita i "postojix". 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čkuvrijednost nazivaju se logičke varijable. U programiranju se često koriste izjavne funkcije iskazane tzv. relacijskim izrazimaprimjerice 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. 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 bje 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 raznilogič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 moguiskazati Booleovom algebrom jer se djelovanje operatora implikacije i ekvivalencije možeizraziti 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 & x2. Zakon asocijacije 14
  15. 15. x ∨ (y ∨ z) ≡ (x ∨ y) ∨ z x & (y & z) ≡ (x & y) & z3. Zakon idempotentnosti x ∨ x ≡ x x & x ≡ x4. 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 ∨ ¬z6. Zakon dvostruke negacije ¬¬x ≡ x Booleova logika ima veliku primjenu u programiranju i posebno pri projektiranju sklopovadigitalnog računala, jer se gotovo svi potrebni sklopovi digitalnog računala mogu realiziratipomoć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 naponomi 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 kojimaizlaz 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žeopisati strujnim krugom u kojem su serijski spojene žarulja, sklopka A i sklopka B. Žarulja ćezasvijetliti kada proteče struja, a to je moguće samo ako ako su obje sklopke uključene, odnosnoizlaz je 1 samo ako su varijable A i B jednake 1. Kod sklopa ILI dovoljno je uključiti jednusklopku da bi zasvijetlila žarulja. Očito sklop I obavlja logičku funkciju konjunkcije, a sklop ILIobavlja logičku funkciju disjunkcije. U digitalnom se računalu pomoću navedenih sklopovaobrađ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 dase digitalnim signalom prenosi poruka o vrijednosti binarne znamenke koja u jednom trenutku 15
  16. 16. može imati iznos nula ili jedinica. Iz tog se razloga umjesto pojma Booleova algebra ilimatematička logika često koristi pojam digitalna logika. U digitalnoj je tehnici uobičajena primjena logičkih operatora na nizove bitova. Tada sepodrazumijeva da se logičke operacije provode nad bitovima jednake značajnosti. Takvelogič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 = CU 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 seznakom ⊕ ili XOR. Ima značaj zbrajanja po modulu 2, a njeno korištenje u programiranju bit ćepojaš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-sklopa2.2 Brojevni sustavi i računska sposobnost računala U programskim jezicima operacije s brojevima se najčešće zapisuju u decimalnombrojevnom sustavu, jer je čovjek naviknut na rad s decimalnim brojevima. U računalu se pakračunske operacije vrše u binarnom brojevnom sustavu.2.2.1 Binarni brojevni sustavSasvim općenito, numerička vrijednost broja Z, koji je u pozicionoj notaciji zapisanznamenkama: zn-1....z1z0, u brojevnom sustavu baze x, računa se prema izrazu: n −1 Z = ( zn −1 .... z1z0 ) x = ∑ zi ⋅ x i i =0Decimalni 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. 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 brojmaksimalnog iznosa 2n -1, što odgovara broju različitih kombinacija binarnog niza duljine numanjenom za jedan (i nula je broj!). Za pozitivne cijele brojeve koristi se i nazivi kardinalnibrojevi i nepredznačeni cijeli brojevi. U binarnom brojevnom sustavu se mogu izvoditi osnovne računske operacije kao i udecimalnom 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. Ulogičkom smislu ta operacija je ekvivalentna ekskluzivnoj disjunkciji (XOR). Operacijuzbrajanja 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 naslici 2.3(a). Pri zbrajanju ostalih bitove treba pribrojiti i bit donosa kao u tablici 2.3. Digitalnisklop koji realizira ovu funkciju naziva se potpuno zbrajalo (full-adder). Prikazan je na slici2.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 zbrajalobitova većeg značaja. 17
  18. 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 oveoperacije je da ako se na neki binarni niz A dva puta uzastopno primjeni bit-značajnaekskluzivna 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 = ADakle, prvo djelovanje je šifriranje, a drugo djelovanje je dešifriranje originalnog niza. Oduzimanje broja se može izvesti kao zbrajanje negativne vrijednosti broja. Kako sekodiraju negativni brojevi bit će pokazano kasnije. Binarno množenja se vrši tako da se djelomičan umnožak pomiče za jedno mjesto ulijevopri svakom uzimanju idućeg množitelja. Ako je množitelj 0, djelomični umnožak je 0, a ako jemnož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 istinačin kao i kod decimalnih brojeva. Navedene operacije su ugrađene u skup naredbi većinedanašnjih procesora. 18
  19. 19. Još dvije operacije su specifične za rad s nizovima bitova. To su operacije logičkogposmaka bitova u lijevo ili u desno (podrazumijeva se LSB na desnoj strani niza), a označavajuse 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 posmakbitova jedno mjesto udesno odgovara dijeljenju kardinalnih brojeva s 2. Na prazna mjesta sepostavljaju 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 = 72.2.2 Oktalni i heksadecimalni brojevni sustavi U višim programskim se jezicima rijetko koristi zapis broja u binarnom obliku jer čovjekteško pamti veće nizove "nula i jedinica". Radije se koristi oktalni ili heksadecimalni brojevnisustav. U oktalnom brojevnom sustavu koristi se 8 znamenki: 01234567, a baza brojevnog sustavaje x=23=8. Oktalnim brojem jednostavno se označava niz od 3 bita, jer je s binarnim nizom od 3bita 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 sustavaTo 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, abaza brojevnog sustava iznosi x=16. Za kombinacije od 10 do 15 upotrebljena su prva slovaabecede, 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 od4 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 znamenkeTo 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 pojedinombrojevnom sustavu. Ta pravila će biti opisana u četvrtom poglavlju. 19
  20. 20. 3 Izrada prvog C programaNaglasci: • 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 • MakefileU ovom poglavlju opisani su programi koji se koriste u razvoju programa. Njihova upotreba sedemonstrira 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, kojedobavlja iz memorije računala. Skup svih strojnih naredbi procesora naziva se strojni jezik, askup naredbi kojima se neposredno izvršava neka zadana operacija u računalu naziva se strojniprogram. Strojne naredbe je veoma teško pamtiti. Zbog toga se koristi simboličko zapisivanje naredbiasemblerskim 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. Zaprevođenje asemblerskog zapisa u strojni program koristi se program koji se naziva asembler. Viši programski jezici omogućuju jednostavnije programiranje uvođenjem simboličkihnaredbi 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 funkcijesin(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 tekstakoji se nazivaju editori. Izvorni program u C jeziku se obično pohranjuje kao datoteka simenom koje završava znakovima “.c” Programi za prevođenje izvornog programa u izvršni program mogu biti realizirani kaointerpreteri ili kao kompilatori (eng. compiler), a razlika među njima je u načinu kako se izvorniprogram prevodi u izvršni program. Kompilator analizira izvorni program i stvara strojni kôd, koji pohranjuje u tzv. objektnudatoteku (eng. object file). Kod MS-DOS računala ime objektne datoteke završava s “.obj”, akod Unix računala s “.o”. Iako objektna datoteka sadrži strojni kôd, on još nije pogodan zaizvođenje u računala, naime za izvođenje programa potrebno je odrediti veze s operativnim 20
  21. 21. sustavom i memorijske lokacije programskih objekata. To se vrši programom koji se zovepovezivač 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, MicrosoftVisual 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 programatako 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 operativnisustav. Programi se mogu izvršavati i pomoću specijalnih programa koji služe za testiranjeizvrš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 ponaredbu, i nakon svakog koraka moguće je pratiti stanje varijabli (memorije) i registaraprocesora. Kod naprednijih dibagera moguće je pratiti izvršenje programa na razini izvornogkoda, dok se kod jednostavnijih dibagera i monitora izvršenje programa može pratiti na razinistrojnog koda. Interpreter prevodi izvorni kod u niz izvršnih naredbi koje se obično izvršavaju unutarsamog programa interpretera. Skup izvršnih naredbi interpretera obično se naziva "virtuelnistroj" (primjerice Java VM ili Microsoft CLR). Program za "interpretiranje", pomoću virtuelnogstroja, može biti i odvojeni program. U tom slučaju interpreter ima funkciju kompilatora kojigenerira datoteke s nizom naredbi virtuelnog stroja. U razvoju programa koristi se veliki broj programa, tzv. softverskih alata, koji olakšavajurazvoj programa i pisanja dokumentacije. Primjerice, na Unix-u se koriste: make - program zakontrolu procesa kompiliranja, grep - program za pretraživanje datoteka, profiler - program zaanalizu izvršenja programa, diff – program za utvrđivanje razlika među izvornim datotekama,patch – program za automatsko unošenje izmjena u izvorne datoteke. Kod Windowsoperativnog sustava više su u upotrebi programi koji se nazivaju integrirana razvojna okolina(eng. IDE – integrated developement environment) kod kojih se pod jedinstvenim grafičkimsučeljem koordinira rad svih faza razvoja programa – editiranje izvornog koda, kompiliranje,dibagiranje i profiliranje koda. U okviru IDE-a integriran je i pristup kompletnoj dokumentacijikompilatora i programskih biblioteka. Bez sumnje, najpopularniji program ovog tipa jeMicrosoft Visual Studio.3.2 Prvi program u C jezikuGotovo 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. 22. Na slici 3.1 prikazan je Windows komandni prozor. On se još naziva MS-DOS prozor ilijoš jednostavnije komandna konzola. Karakteristika ispisa u konzoli je da se može jedino vršitiispis teksta, i to u po principu da se ispisuje redak po redak, od vrha konzole na dolje. U konzolise mogu zadavati komande operativnom sustavu u retku koji uobičajeno započinje s oznakomtekuć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 trikoraka: 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.cc:> cl hello.c ↵ - poziv kompilatora (Microsoft-program cl.exe) koji stvara izvršnu datoteku hello.exec:> hello ↵ - komanda za izvršenje programa hello.exeHello world! - rezultat izvršenja programa Slika 3.1 Izgled komandnog prozora u Windows operativnom sustavuPrimjer 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 helloHello world! - rezultat izvršenja programa 22
  23. 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 usvakom C programu, jer predstavlja mjesto početka izvršenja programa. Programer možedefinirati nove funkcije, svaku s jedinstvenim imenom, a mogu se koristiti i prethodnodefinirane funkcije iz standardne biblioteke funkcija C jezika. Radnje koje obavlja neka funkcija zapisuju se unutar tijela funkcije. Tijelo funkcije jeomeđeno vitičastim zagradama. U ovom je slučaju u tijelu funkcije je iskaz koji predstavljanaredbu 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, standardnabiblioteka, 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 programsintaktički pogrešan. Primjerice, ukoliko u prethodnom programu nije otkucana točka-zarez izanaredbe printf("Hello world!n"), kao u programu "hello2.c", 23
  24. 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škau sljedećem obliku: C:>cl hello.cMicrosoft (R) 32-bit C/C Optimizing Compiler Ver.12.00.8168 for 80x86Copyright (C) Microsoft Corp 1984-1998. All rights reserved.hello.chello.c(5) : error C2143: syntax error : missing ; before returnPoruka 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 napisananaredba u četvrtom retku. Razlog tome je pravilo C jezika po kojem se naredba može pisati uviše redaka, a stvarni kraj naredbe predstavlja znak točka-zarez. Pošto kompilator nije pronašaotočku-zarez u četvrtom retku, kompiliranje je nastavljeno s petim retkom i tek tada je utvrđenoda 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. 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 kaoposebna funkcija s prikladnim imenom. Primjerice, prethodni program se može napisati pomoćudvije 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 pozivanjefunkcija. Funkcija se definira zaglavljem i tijelom funkcije. Zaglavlje funkcije se zapisuje na sljedeći način: ime funkcije se zapisuje nizom znakovakoji sadrži slova, znamenke i znak _, ali uz uvjet da je prvi znak niza slovo ili _. Ispred imenafunkcije se navodi vrijednost koju funkcija vraća. Ako funkcija ne vraća nikakovu vrijednosttada se ispred imena piše riječ void, koja znači “ništa ili nevažno je”. Ovakve funkcije senazivaju procedure. U njima se ne mora koristiti naredba return, već one završavaju kada seizvrši posljednje definirana naredba. Iza imena funkcije se, u zagradama, navode formalniargumenti funkcije, ako ih ima. Kasnije će biti objašnjeno kako se definiraju i koriste argumentifunkcije. 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 definiraneunutar funkcije). Zapisuje se na način da se prvo napiše ime funkcije, a zatim obvezno zagrade iargumenti funkcije, ako su prethodno definirani. Primjerice, u funkciji main() iskazHello(); predstavlja poziv funkcije Hello(). Poziv funkcije pokreće izvršenje naredbi kojesu 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() naizvršenje prve naredbe koja je napisana iza poziva funkcije Hello(). Funkcija iz koje sepokreće izvršenje pozvane funkcije naziva se pozivna funkcija. U prethodnom primjeru funkcija Hello() je definirana prije funkcije main(). Tajredoslijed 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 deklaracijefunkcija). 25
  26. 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 uprogramu iza mjesta njenog poziva ili u drugoj datoteci. U skladu s ovim pravilom dozvoljenoje 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 programse 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 komandnompreklopkom /Fe zapisano da izvršnu datoteku treba formirati pod imenom "hello.exe". 26
  27. 27. Slika 3.2 Proces formiranja izvršnog programa Proces formiranja izvršnog programa je prikazan na slici 3.2. Najprije leksički pretprocesorkompilatora unosi sve deklaracije iz datoteke "stdio.h" u datoteku "hellosub.c". Zatimkompilator 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 strojnijezik 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 programlink.exe, kojeg skriveno poziva program cl.exe. Dobra strana odvajanja programa u više datoteka je da se ne mora uvijek kompilirati svedatoteke, 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šiprijevod u objektne datoteke, tj. c:> cl /c hellomain.c c:> cl /c hellosub.cTime se dobiju dvije objektne datoteke: "hellomain.obj" i "hellosub.obj". Povezivanje ovihdatoteka 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žeubrzati 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 formiranjaizvrš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" dokumentacijeo programskom jeziku, standardnim bibliotekama i programskom sučelju prema operativnomsustavu (Win32 API). Pomoću njega se mogu izrađivati programi s grafičkim korisničkimsučeljem i programi za konzolni rad.Nakon poziva programa dobije se IDE Visual Studio prikazan na slici 3.3. 27
  28. 28. Slika 3.3 Izgled Visual Studio pri pokretanju programa Najprije će biti opisano kako se formira projekt za konzolni tip programa. Prije pokretanjaprograma, neka se u direktoriju c:My DocumentsC2002pog2 nalaze izvorne datotekehellomain.c i hellosub.c. Pokretanjem komande menija: File-New-Project, dobije dijalog za postavljanje novogprojekta. 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 ihello.sln (datoteka ekstenzije .sln sadrži opis radne okoline, a datoteka ekstenzije .vcproj sadržiopis 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 zarad 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.9odabiremo 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. Akose izvrši bez greške, nastaje izvršni program imena hello.exe. Program hello.exe se možepokrenuti pozivom komande Build – Execute hello.exe (ili pritiskom tipki Ctrl+F5). 28
  29. 29. Slika 3.4 Dijalog za postavljanje novog projektaSlika 3.5 Dijalog za postavljanje tipa Win32-Console projekta 29
  30. 30. Slika 3.6 Dijalog koji izvještava o postavkama novog projektaSlika 3.7 Izgled radne okoline nakon formiranja novog projekta “hello” 30
  31. 31. Slika 3.9 Dijalog za umetanja datoteka u projekt Slika 3.10 Izgled IDE s aktivnim editorom 31
  32. 32. 3.5 Usmjeravanje procesa kompiliranja programom nmake Kada se program sastoji od velikog broja datoteka, procesom kompiliranja se možeupravljati pomoću program imena nmake (make na UNIX-u) i specifikacije koja se zapisuje udatoteci koji se obično naziva makefile. Za prethodni primjer datoteka makefile može bitinapisana 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.cAko se ovu datoteku spremi pod imenom makefile, dovoljno je u komandnoj liniji otkucati: c:> nmakei biti će izvršen cijeli postupak kompiliranja i linkanja izvršnog programa. Ako se pak ovadatoteka zapiše pod nekim drugim imenom, primjerice "hello.mak", u komandnoj liniji, izapreklopke –f treba zadati i ime datoteke, tj. c:>nmake –fhello.makKako 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 promijenisadržaj "hellosub.c", dolazi do razlike u vremenu nastanka međuovisnih datoteka, pa programnmake pokreće program za kompiliranje koji je specificiran u drugom retku. Korištenje makefile je vrlo popularno, posebno na Unix sustavima i kod profesionalnihprogramera, jer se pomoću simboličkih definicija lako može definirati proces kompiliranja narazličitim operativnim sustavima. 32
  33. 33. 4 Kodiranje i tipovi podatakaNaglasci: • 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 podatakaU ovom se poglavlju se opisuje kako se u računalu kodiraju brojevi i znakovi, objašnjava sekoncept 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 tipovimapodataka pridjeljuje dogovorom utvrđena kombinacija binarnih znamenki. Ovdje će biti opisanokodiranje koje se koristi u C jeziku. S programerskog stajališta, važnije od samog načina kodiranja je veličina zauzećamemorije i interval vrijednosti koji se postiže kodiranjem. Također, važno je upoznati leksičkapravila 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 skupakojeg čine prirodni brojevi i nula. Način njihovog kodiranja je opisan u poglavlju 2. U C jezikuse 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 0x1B4.1.2 Kodiranje cijelih brojeva (eng. integers) Cijeli brojevi (eng. integers) su brojevi iz skupa kojeg čine prirodni brojevi, negativniprirodni 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. 34. brojevni sustav. Puni komplement n-znamenkastog broja Nx, u brojevnom sustavu baze xmatematič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 jednakonuli. 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, komplementdvojke 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 prethodnomprimjeru, 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 brojeviimaju MSB=1. Što se događa ako se zbroje dva pozitivna broja koji imaju bitove ispod MSB jednakejedinici. Primjerice, ako zbrojimo 4+5 ( u 4-bitnom sustavu) 0100 +0101 ----- 1001dobije se rezultat koji predstavlja negativan broj u sustavu komplementa dvojke. Do prijelaza upodruč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 operacijazbrajanja ima smisla samo ako je zbroj operanada manji od 2n-1-1. Zbog toga, najvećipozitivni 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 zamjenomsvih jedinica s nulom i obratno. Iznos broja. koji se dobije na ovaj način, računa se premaizrazu: N 2 = 2n − N 2 − 1 Obični komplement nije pogodan za izražavanje prirodnih brojeva jer nije jednoznačnoodređena vrijednost nule, naime obični komplement od 0000 iznosi 1111. On služi zajednostavno izračunavanje punog komplementa, jer vrijedi: N2 = N2 + 1 ′ 34
  35. 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 predstavljanulu. Komplement dvojke omogućuje jednoznačno određivanje nule, pa je podesan za kodiranjecijelih brojeva.4.1.3. Kodiranje realnih brojeva Realni brojevi se u matematici zapisuju na način da se cijeli i decimalni dio odvojedecimalnim 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 Ckoristi 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 brojevaEksponentni 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 kaocijeli broj. Prednost korištenja eksponentnog formata je u lakšem zapisu vrlo velikih i vrlo malihbrojeva. 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 zapisivanjarealnog broja s fiksnim položajem binarne točke, u slučaju da se N znamenki koristi za 35
  36. 36. označavanje cijelih vrijednosti, a n znamenki za označavanje razlomljenih vrijednosti (po bazi2: 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 nakonizvršenih aritmetičkih operacija rezultat se skalira za iznos 2-n. Ovaj oblik kodiranja ima brojnenedostatke, 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 binarnombrojevnom sustavu. Kodiranje se vrši prema izrazu F = ( − 1) m 2 e sgdje 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 cijelibroj, 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 fiksnimpoložajem binarne točke. Primjerice, neka je broj kodiran u obliku: 0.00001xxxxxxxxx 2egdje 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 eksponentasmanjuje za 5. Ovakav kodni zapis, u kojem je uvijek jedinica na prvom mjestu, naziva senormalizirani zapis. Značaj normaliziranog zapisa je u činjenici što se njime iskorištavaju svibitovi mantise za kodiranje vrijednosti, dakle osigurava se veća točnost zapisa. Normaliziranimse oblikom ipak ne može kodirati veoma male vrijednosti, pa je tada pogodniji nenormaliziranizapis broja. Treba pojasniti i kako je kodirana vrijednost nula. Pogodno bi bilo da sva bitnapolja pri kodiranju vrijednosti nula budu jednaka nuli (zbog logičkih operacija), ali pošto se zakodiranje eksponenta također koristi binarni zapis, vrijednost eksponenta nula se matematičkikoristi za označavanje brojeva većih od jedinice. Da bi se zadovoljilo zahtjevu kodiranja nule snultim zapisom eksponenta uobičajeno je da se umjesto stvarne vrijednosti eksponenta kodiravrijednost: E = e + pomak,gdje je pomak neka konstantna vrijednost, a odabire se na način da je jednak najnižoj vrijednostieksponenta e, koji je negativna vrijednost Ovako zapisani eksponent naziva se pomaknutieksponent. Značaj pomaka pokazuje sljedeći primjer. Neka je eksponent opisan s 8 bita. Tada seE kreće u rasponu od 0 do 255. Ako se uzme da je pomak=127, i da je E=0 rezervirano zakodiranje nule, onda se vrijednost binarnog eksponenta kreće u rasponu od -126 do +127. 36

×