Lekcija 4. KODIRANJE I TIPOVI PODATAKA - FESB

Lekcija 4. KODIRANJE I TIPOVI PODATAKA - FESB Lekcija 4. KODIRANJE I TIPOVI PODATAKA - FESB

26.11.2014 Views

Lekcija 4. KODIRANJE I TIPOVI PODATAKA Standardno se kodiraju: kardinalni brojevi unsigned integer -1 0,1,2--- 2 n -1 cijeli brojevi integer 2 n-1 ,....-3,-2-1, 0, 1, 2,3, ... 2 n-1 -1 realni brojevi float, double 1.47, 4.78 x 10 -3 znakovi char a,b, 7, &, ), A, Z nizovi znakova string "Hello" Korisnik može provesti svoj način kodiranja u specijalnim slučajevima. ASCII KOD ZA TEKSTUALNE I KONTROLNE ZNAKOVE To je sedam bitni kôd (ukupno 128 različitih znakova), od čega se prva 32 znaka koriste kao kontrolni znakovi rezličite namjene, a ostali znakovi predstavljaju slova abecede, pravopisne i matematičke simbole. 000: (nul) 016: (dle) 032: (sp) 048: 0 064: @ 080: P 096: ž 112: p 001: (soh) 017: (dc1) 033: ! 049: 1 065: A 081: Q 097: a 113: q 002: (stx) 018: (dc2) 034: " 050: 2 066: B 082: R 098: b 114: r 003: (etx) 019: (dc3) 035: # 051: 3 067: C 083: S 099: c 115: s 004: (eot) 020: (dc4) 036: $ 052: 4 068: D 084: T 100: d 116: t 005: (enq) 021: (nak) 037: % 053: 5 069: E 085: U 101: e 117: u 006: (ack) 022: (syn) 038: & 054: 6 070: F 086: V 102: f 118: v 007: (bel) 023: (etb) 039: ' 055: 7 071: G 087: W 103: g 119: w 008: (bs) 024: (can) 040: ( 056: 8 072: H 088: X 104: h 120: x 009: (tab) 025: (em) 041: ) 057: 9 073: I 089: Y 105: i 121: y 010: (lf) 026: (eof) 042: * 058: : 074; J 090: Z 106: j 122: z 011: (vt) 027: (esc) 043: + 059: ; 075: K 091: [ 107: k 123: { 012: (np) 028: (fs) 044: , 060: < 076: L 092: \ 108: l 124: | 013: (cr) 029: (gs) 045: - 061: = 077: M 093: ] 109: m 125: } 014: (so) 030: (rs) 046: . 062: > 078: N 094: ^ 110: n 126: ~ 015: (si) 031: (us) 047: / 063: ? 079: O 095: _ 111: o 127: del 4.1

<strong>Lekcija</strong> <strong>4.</strong> <strong>KODIRANJE</strong> I <strong>TIPOVI</strong> <strong>PODATAKA</strong><br />

Standardno se kodiraju:<br />

kardinalni brojevi unsigned integer -1 0,1,2--- 2 n -1<br />

cijeli brojevi integer 2 n-1 ,....-3,-2-1, 0, 1, 2,3, ... 2 n-1 -1<br />

realni brojevi float, double 1.47, <strong>4.</strong>78 x 10 -3<br />

znakovi char a,b, 7, &, ), A, Z<br />

nizovi znakova string "Hello"<br />

Korisnik može provesti svoj način kodiranja u specijalnim slučajevima.<br />

ASCII KOD ZA TEKSTUALNE I KONTROLNE ZNAKOVE<br />

To je sedam bitni kôd (ukupno 128 različitih znakova), od čega se prva 32 znaka koriste kao kontrolni znakovi rezličite<br />

namjene, a ostali znakovi predstavljaju slova abecede, pravopisne i matematičke simbole.<br />

000: (nul) 016: (dle) 032: (sp) 048: 0 064: @ 080: P 096: ž 112: p<br />

001: (soh) 017: (dc1) 033: ! 049: 1 065: A 081: Q 097: a 113: q<br />

002: (stx) 018: (dc2) 034: " 050: 2 066: B 082: R 098: b 114: r<br />

003: (etx) 019: (dc3) 035: # 051: 3 067: C 083: S 099: c 115: s<br />

004: (eot) 020: (dc4) 036: $ 052: 4 068: D 084: T 100: d 116: t<br />

005: (enq) 021: (nak) 037: % 053: 5 069: E 085: U 101: e 117: u<br />

006: (ack) 022: (syn) 038: & 054: 6 070: F 086: V 102: f 118: v<br />

007: (bel) 023: (etb) 039: ' 055: 7 071: G 087: W 103: g 119: w<br />

008: (bs) 024: (can) 040: ( 056: 8 072: H 088: X 104: h 120: x<br />

009: (tab) 025: (em) 041: ) 057: 9 073: I 089: Y 105: i 121: y<br />

010: (lf) 026: (eof) 042: * 058: : 074; J 090: Z 106: j 122: z<br />

011: (vt) 027: (esc) 043: + 059: ; 075: K 091: [ 107: k 123: {<br />

012: (np) 028: (fs) 044: , 060: < 076: L 092: \ 108: l 124: |<br />

013: (cr) 029: (gs) 045: - 061: = 077: M 093: ] 109: m 125: }<br />

014: (so) 030: (rs) 046: . 062: > 078: N 094: ^ 110: n 126: ~<br />

015: (si) 031: (us) 047: / 063: ? 079: O 095: _ 111: o 127: del<br />

<strong>4.</strong>1


U C jeziku se imena varijabli i funkcija označavaju nizom znakova, stoga se za označavanje znakovne konstante<br />

koriste jednostruki navodnici, primjerice u C iskazu:<br />

a = ’a’;<br />

Važno je razlikovati slijedeće iskaze:<br />

1) a = 8;<br />

2) a = ’8’;<br />

Neki znakovi iz ASCII skupa se ne mogu zapisati u izvornom kodu, jer za njih ne postoji oznaka na standardnoj<br />

tipkovnici.<br />

\b oznaka za povrat unatrag - backspace BS<br />

\f oznaka za stranicu unaprijed - form feed FF<br />

\n oznaka nove linije - new line NL<br />

\r oznaka za povrat na početak reda CR<br />

\t oznaka za horizontalni tab HT<br />

\v oznaka za vertikalni tab<br />

\” uznaka za dvostruki navodnik<br />

\‘ oznaka za jednostruki navodnik<br />

\\ oznaka za znak \ - backslash<br />

‘\ooo‘ znak kojem je ASCII kod zapisan oktalnim znamenkama ooo.<br />

‘\0xhh‘ znak kojem je ASCII kod zapisan heksadecimalnim znamenkama hh.<br />

Primjerice, ekvivalentna su tri zapisa znaka A:<br />

‘A‘ ‘\0x41‘ ‘\101‘<br />

Zapamtimo: u C jeziku se znakovne konstante zapisuju unutar jednostrukih zagrada znakovima iz ASCII<br />

skupa (ili kontrolnom sekvencom). Može ih se tretirati i kao numeričke vrijednosti cjelobrojnog tipa na način<br />

da je vrijednost znakovne konstante jednaka ASCII kodu znaka.<br />

<strong>4.</strong>2


String<br />

Kada se u C jeziku koriste literalne konstante koje predstavljaju string (niz znakova) one se zapisuju unutar dvostrukih<br />

navodnika, primjerice<br />

"Hello World!\n".<br />

Unutar stringa kontrolne znakove se zapisuje bez navodnika. U ovom primjeru na kraju stringa je zapisan znak za<br />

prijelaz u novu liniju.<br />

Kodiranje logičkih vrijednosti<br />

Vrijedi pravilo: svaka numerička vrijednost može se tretirati kao logička vrijednost “istina” ako je različita od<br />

nule, odnosno “laž” ako je jednaka nuli.<br />

Primjerice, u izrazu<br />

a = x > y;<br />

varijabli a se pridjeljuje vrijednost 1 ako je izraz na desnoj strani istinit (ako je x veće od y), u suprotnome, pridjeljuje<br />

se vrijednost 0.<br />

Ako je x == y x != y x > y x < y x = y<br />

x-y > 0 0 1 1 0 0 1<br />

x-y = 0 1 0 0 0 1 1<br />

x-y < 0 0 1 0 1 1 0<br />

Tablica <strong>4.</strong>5 Izvršavanje relacijskih operacija C jezika<br />

<strong>4.</strong>3


Memorija i podaci<br />

1. Podaci, koji se nalaze na nekoj adresi u memoriji, nazivaju se memorijski objekti.<br />

2. Adresa se opisuje kardinalnim brojem koji opisuje položaj temeljne memorijske čelije, veličine 8 bita, u linearno<br />

uređenom prostoru memorije.<br />

3. Podaci su najčešće kodirani tako da pripadaju skupu numeričkih vrijednosti ili skupu znakova koji su kodirani<br />

prema ASCII standardu, ili pak skupu logičkih vrijednosti ({true, false} odnosno {1,0}).<br />

<strong>4.</strong> Memorijskim objektima procesor može mijenjati sadržaj i s njima obavljati aritmetičko-logičke operacije.<br />

5. Memorijske objekte s kojima procesor operira kao s cjelinom nazivamo varijablama.<br />

<strong>4.</strong>3 Prosti tipovi podataka<br />

U programskim se jezicima pripadnost skupu koji ima zajedničke karakteristike naziva tipom. Tip varijable određuje<br />

način njenog kodiranja, način kako ona zauzima memoriju računala i operacije koje su nad tom varijablom dozvoljene.<br />

Tipovi varijabli (ili konstanti) koji se koriste u izrazima određuju tip kojim rezultira taj izraz.<br />

U većini programskih jezika standardni su tipovi podataka:<br />

• numerički (cjelobrojni ili realni)<br />

• logički<br />

• znakovni<br />

a nazivaju se i primitivni ili prosti tipovi jer predstavljaju nedjeljive cjeline i imaju izravan prikaz u memoriji<br />

računala.<br />

<strong>4.</strong>4


tip<br />

znakovni tip<br />

cjelobrojni tip<br />

kardinalni tip<br />

realni tip<br />

(jednostruki<br />

format)<br />

realni tip<br />

(dvostruki<br />

format)<br />

logički tip<br />

(samo u C++)<br />

Oznaka u<br />

C i C++ jeziku<br />

[signed] char<br />

unsigned char<br />

[signed] int<br />

[signed] short<br />

[signed] long<br />

unsigned [int]<br />

unsigned short<br />

unsigned long<br />

float<br />

interval<br />

vrijednosti<br />

-127 .. 128<br />

0 .. 255<br />

-2147483648.. 2147483647<br />

-32768 .. 32767<br />

-2147483648.. 2147483647<br />

0 .. 4294967295<br />

0 .. 65535<br />

0 .. 4294967295<br />

min ± 1.175494351e-38<br />

maks ± 3.402823466e+38<br />

zauzeće<br />

memorije<br />

1 bajt<br />

1 bajt<br />

4 bajta<br />

2 bajta<br />

4 bajta<br />

4 bajta<br />

2 bajta<br />

4 bajta<br />

4 bajta<br />

double<br />

min<br />

± 2.2250738585072014e-308<br />

maks.<br />

± 1.7976931348623158e+308<br />

8 bajta<br />

bool false ..true 1<br />

Uz pojam varijable uvijek su vezani pojmovi: tip i ime.<br />

Ime predstavlja oznaku adrese varijable u memoriji, pa se zove i referenca varijable, ili referenca<br />

memorijskog objekta. Tip označava skup vijednosti varijable, veličinu zauzeća memorije, način kodiranja i<br />

operacije koje se mogu primijeniti.<br />

<strong>4.</strong>5


Deklaracije i definicije<br />

Pridjeljivanje oznake tipa nekoj varijabli naziva se deklaracija varijable, a ako se pod tom deklaracijom<br />

podrazumijeva i rezerviranje memorijskog prostora u kojem će biti smještena kodirana vrijedanost varijable,<br />

onda se kaže da je deklaracijom izvršena i definicija varijable. U C i C++ jeziku uvijek mora biti deklariran tip<br />

varijable prije nego sa ona upotrijebi u programskim iskazima.<br />

U programu, imena area1.c, izvršit ćemo jednostavni proračun površine kruga. Upotrijebit ćemo dvije varijable tipa<br />

double: s r ćemo označiti radijus, a s area ćemo označiti površinu. Uzet ćemo da je radijus poznat i da iznosi 2.1 m.<br />

Rezultat proračuna ćemo ispisati pomoću printf funkcije. Evo kako se može napisati taj program<br />

/* area1.c - Program koji računa površinu kruga radijusa 2.1 m */<br />

#include <br />

int main()<br />

{<br />

double r, area; /* deklaracija varijabli r i area */<br />

r = 2.1; /* zadana vrijednost radijusa 2.1m*/<br />

area = r*r*3.14; /* proračun površine kruga */<br />

printf( "\n Povrsina kruga = %f m", area);<br />

return 0;<br />

}<br />

Kada se program kompajlira i izvrši dobije se ispis:<br />

Povrsina kruga = 13.847400 m<br />

• Deklaraciju varijabli se uvijek zapisuje na način da se oznaka tipa napiše ispred imena varijabli.<br />

• Ako se istovremeno deklarira više varijabli istoga tipa, njihova se imena odvajaju zarezom. Zapis deklaracije<br />

završava znakom točka-zarez.<br />

<strong>4.</strong>6


* sizeof.c-ispisuje zauzeće memorije za proste tipove C jezika */<br />

#include <br />

int main()<br />

{<br />

printf( "\nSizeof(char) = %d", sizeof( char ));<br />

printf( "\nSizeof(int) = %d", sizeof( int ));<br />

printf( "\nSizeof(short) = %d", sizeof( short ));<br />

printf( "\nSizeof(long) = %d", sizeof( long ));<br />

printf( "\nSizeof(float) = %d", sizeof( float ));<br />

printf( "\nSizeof(double) = %d", sizeof( double ));<br />

printf( "\nSizeof(unsigned char) = %d",sizeof( unsigned char ));<br />

printf( "\nSizeof(unsigned int) = %d",sizeof( unsigned int ));<br />

printf( "\nSizeof(unsigned short) = %d",sizeof( unsigned short ));<br />

printf( "\nSizeof(unsigned long) = %d\n",sizeof( unsigned long ));<br />

return 0;<br />

}<br />

Kada se kompajlira i izvrši, program daje ispis:<br />

Sizeof(char) = 1<br />

Sizeof(int) = 4<br />

Sizeof(short) = 2<br />

Sizeof(long) = 4<br />

Sizeof(float) = 4<br />

Sizeof(double) = 8<br />

Sizeof(unsigned char) = 1<br />

Sizeof(unsigned int) = 4<br />

Sizeof(unsigned short) = 2<br />

Sizeof(unsigned long) = 4<br />

<strong>4.</strong>7


I konstante C jezika indirektno u svom zapisu sadrže oznaku tipa. Evo primjera:<br />

char ’A’<br />

’a’<br />

ili ’\035’<br />

’\x29’<br />

int ’\n’<br />

int 156<br />

0234<br />

0x9c<br />

unsigned 156U<br />

0234U<br />

0x9cU<br />

float 15.6F<br />

1.5e1F<br />

double 15.6L<br />

1.5E1L<br />

znakovna konstanata a<br />

znakovna konstanata A<br />

znakovna konstanata 35 oktalno,<br />

znakovna konstanata 29 heksadecimalno,<br />

nova linija<br />

decimalna notacija<br />

oktalna notacija cjelobrojne konstante<br />

heksadecimalna notacija<br />

Decimalno<br />

oktalno (prefiks U određuje kardinalni broj)<br />

heksadecimalno<br />

realni broj – jednostruki format<br />

određen primjenom sufiksa F ili f<br />

konstante su tipa "double" ukoliko se ne<br />

koristi prefiks F. Nije nužno pisati sufiks<br />

L.<br />

<strong>4.</strong>8


Znakovne konstante su kompatibilne i s znakovnim i s cjelobrojnim tipom.<br />

/* CHARSIZE.C-Program kojim se ispituje tip znakovne konstante */<br />

#include <br />

int main()<br />

{<br />

char c; /* deklaracija varijable c tipa char */<br />

int x; /* deklaracija varijable x tipa int */<br />

}<br />

c = 'A'; /* varijablama može se pridijeliti */<br />

x = 'A'; /* vrijednost znakovne konstante 'A' */<br />

printf( "\n c = %c", c);<br />

printf( "\n Sizeof c = %d", sizeof (c) );<br />

printf( "\n x = %d", x);<br />

printf( "\n Sizeof x = %d", sizeof(x));<br />

printf( "\n Sizeof 'A' = %d", sizeof('A'));<br />

return 0;<br />

koji daje ispis:<br />

c = A<br />

Sizeof c = 1<br />

x = 65<br />

Sizeof x = 4<br />

Sizeof 'A' = 4<br />

<strong>4.</strong>9


<strong>4.</strong>4 #define - direktiva<br />

Leksička se vrijednost numeričkih, znakovnih i literalnih konstanti, pa i samog programskog teksta, može pridijeliti<br />

nekom simboličkom imenu pomoću pretprocesorske direktive #define. Primjerice ako se zapiše:<br />

#define PI 3.141592653589793<br />

to ima efekt da kada se u tekstu programa, koji slijedi iza ove direktive, zapiše PI, vrijedi kao da smo zapisali<br />

3.141592653589793.<br />

Općenito #define direktiva ima oblik:<br />

#define IME supstitucijski_tekst<br />

gdje IME predstavlja proizvoljan naziv zapisan neprekinutim nizom znakova (obično se zapisuje velikim slovima i<br />

podvlakom), a supstitucijski_tekst može sadržavati i isprekidani niz znakova.<br />

<strong>4.</strong>10


Primjerice,<br />

#include <br />

#define MESSAGE "Vrijednost broja pi = "<br />

#define PI 3.141592653589793<br />

#define PR_NL printf("\n")<br />

int main( void)<br />

{<br />

printf(MESSAGE);<br />

printf("%f" ,PI);<br />

PR_NL;<br />

return 0;<br />

}<br />

Nakon izvršenja dobije se ispis<br />

Vrijednost broja pi = 3.141592653589793<br />

Kasnije će biti detaljnije pojašnjen rad s pretprocesorskim direktivama.<br />

Iza direktive se ne piše znak točka-zarez.<br />

<strong>4.</strong>11


<strong>4.</strong>5 Specifikatori printf funkcije<br />

Kada se ispis vrši po unaprijed određenom obliku i rasporedu kažemo da se vrši formatirani ispis. Sada ćemo pokazati<br />

kako se zadaje format ispisa pomoću printf() funkcije.<br />

Općenito format se zadaje pomoću šest polja:<br />

%[prefiks][širina_ispisa][. preciznost][veličina_tipa]tip_argumenta<br />

Format mora započeti s znakom % i završiti s oznakom tipa argumenta. Sva ostala polja su opciona (zbog toga su<br />

napisana unutar uglatih zagrada).<br />

Polje prefiks može sadržavati jedan znak koji ima slijedeće značenje:<br />

- Ispis se poravnava prema lijevoj granici ispisa<br />

+ Pozitivnim se vrijednostima ispisuje i ‘+’ predznak.<br />

razmak Ako je vrijednost positivna, dodaje se razmak prije ispisa<br />

0 Mjesta razmaka ispunjuju se znakom 0.<br />

# Alternativni stil formatiranja<br />

Polje .preciznost određuje broj decimalnih znamenki iza decimalne točke ispisa realnog broja, minimalni broj<br />

znamenki cijelog broja, maksimalni broj znakova stringa.<br />

<strong>4.</strong>12


%[prefiks][širina_ispisa][. preciznost][veličina_tipa]tip_argumenta<br />

Polje tip_argumenta može sadržavati samo jedan od slijedećih znakova znakova:<br />

c Argument se tretira kao int koji se ispisuje kao znak iz ASCII skupa.<br />

d, i Argument se tretira kao int, a ispisuje se decimalnim znamenkama.<br />

e, E Argument je float ili double, a ispis je u eksponentnom formatu.<br />

f Argument je float ili double, a ispis je prostom decimalnom formatu. Ako je prefiks<br />

# i preciznost .0, tada se ne ispisuje decimalna točka.<br />

g, G Argument je float ili double, a ispis je prostom ili u eksponencijalnom formatu<br />

o Argument je unsigned int, a ispisuje se oktalnim znamenkama.<br />

p Argument se tretira kao pokazivač tipa void *<br />

s Argument mora biti literalni string odnosno pokazivač tipa char *.<br />

u Argument je unsigned int, a ispisuje se decimalnim znamenkama.<br />

x, X Argument je unsigned int, a ispisuje se heksadecimalnim znamenkama. Ako se<br />

zada prefiks # , ispred heksadecimalnih znamenki se ispisuje 0x ili 0X.<br />

Polje veličina_tipa može sadržavati samo jedan znak neposredno ispred oznake tipa.<br />

h<br />

l<br />

L<br />

Pripadni argument tipa int tretira se kao short int ili unsigned short int.<br />

Pripadni argument je long int ili unsigned long int.<br />

Pripadni argument realnog tipa je long double.<br />

<strong>4.</strong>13


Primjeri korištenja printf funkcije:<br />

/* printf.c - primjer korištenja printf funkcije */<br />

#include<br />

int main()<br />

{<br />

printf("%d, %5d, %-5d, %05d, %5.5d\n", 1, 2, 3, 4, 5);<br />

printf("%o %x %X %#o %#x\n", 171, 171, 171, 171, 171);<br />

printf("%f %e %g\n", 3.14, 3.14, 3.14);<br />

printf("%s, %.5s!\n", "Hello", "worldly");<br />

printf("%0*d, %.*f, %*.*s\n", 2, 3, 4, 5.6, 7, 3, abcdef");<br />

return 0;<br />

}<br />

Ovaj pogram daje ispis:<br />

1, 2, 3 , 00004, 00005<br />

253 ab AB 0253 0xab<br />

3.140000 3.140000e+000 3.14<br />

Hello, world!<br />

03, 5.6000, abc<br />

U prethodnim tablicama za oznake tipa argumenata ‘p’ i ‘s’ naglašeno je da su argumenti funkcije pokazivači. Što je to<br />

pokazivač, bit će objašnjeno u slijedećem odjeljku.<br />

<strong>4.</strong>14


<strong>4.</strong>6 Pristup podacima pomoću pokazivača<br />

C jezik omogućuje korištenje numeričke vrijednosti adresa varijabli i funkcija za indirektno manipuliranje s podacima i<br />

izvršenjem programa. Koriste se operatori :<br />

& - adresni operator<br />

* - operator indirekcije<br />

te specijalni tip varijabli koje se nazivaju pokazivači ili pointeri.<br />

Adresni operator & se koristi kao unarni operator tako da se zapisuje ispred imena varijable. Takofvi izraz<br />

daje vrijednost jednaku adresi varijable:<br />

int main()<br />

{<br />

int y;<br />

y = 777;<br />

printf("\n Vrijednost varijable je %d", y);<br />

printf("\n Adresa varijable je %#p", &y);<br />

return 0;<br />

}<br />

Ispis is programa može izgledati ovako:<br />

Vrijednost varijable y je 777<br />

Adresa varijable y je 0x0063FDF4<br />

Operator indirekcije * daje vrijednost koja se nalazi na nekoj adresi<br />

ako je y jednako 777<br />

onda je *(&y) također jednako 777<br />

<strong>4.</strong>15


Pokazivači<br />

Varijable kojima je vrijednost adresa neke druge varijable ili funkcije nazivaju se pokazivači ili pointeri. Pokazivači<br />

moraju biti deklarirani, jer C kompajler mora znati kakovi će tip podatka biti na adresi koju oni sadrže, ili kako se češće<br />

kaže, mora biti poznat tip objekta na kojeg oni pokazuju.<br />

int *p; /* p je pokazivač na objekt tipa int */<br />

unsigned *q; /* q je pokazivač na objekt tipa unsigned */<br />

Pokazivače prije upotrebe treba inicijalizirati, odnosno mora im se pridjeliti vrijednost adrese postojećeg<br />

memorijskog objekta. Pri tome, tip pokazivača mora biti jednak tipu memorijskog objekta. To se ostvaruje<br />

adresnim operatorom '&'.<br />

int suma; /* deklaracija varijable suma */<br />

int *p; /* deklaracija pokazivača na objekt tipa int */<br />

sum = 777; /* inicijaliziranje varijable suma */<br />

p = &suma; /* p inicijaliziran na adresu varijable suma */<br />

Ako bi dalje koristili naredbi<br />

printf ("%d", suma);<br />

printf ("%d", *p);<br />

dobili bi isti ispis, jer se indirekcijom pokazivača dobiva vrijednost na koju on pokazuje, a to je vrijednost varijable<br />

suma (*p ⇔*&suma).<br />

<strong>4.</strong>16


U skladu s ovakovom simbolikom prije opisane operacije se mogu predstaviti slijedećom slikom:<br />

Slika <strong>4.</strong><strong>4.</strong> Prikaz operacija s pokazivačem na varijablu<br />

Operacija<br />

int suma;<br />

int *p;<br />

suma = 777;<br />

Stanje<br />

suma p<br />

? ?<br />

suma p<br />

777 ?<br />

p = &suma;<br />

suma p<br />

777<br />

memorijska<br />

adresa<br />

0x09A8<br />

0x09AC<br />

0x09B0<br />

......<br />

......<br />

......<br />

0x1000<br />

0x1004<br />

sadržaj<br />

memorije<br />

......<br />

777<br />

......<br />

......<br />

......<br />

......<br />

0x09AC<br />

......<br />

ime<br />

varijable<br />

......<br />

suma<br />

......<br />

......<br />

......<br />

......<br />

p<br />

......<br />

Slika <strong>4.</strong>3. Prikaz memorijskog sadržaja i adresa varijabki i pokazivača<br />

<strong>4.</strong>17


Važna osobina indirekcije pokazivača je da se može koristiti u svim izrazima u kojima se koriste i obične varijable.<br />

Primjerice, ekvivalentne su naredbe<br />

p = &suma;<br />

*p = 678; je isto suma = 678;<br />

U slučaju kada se pokazivač koristi samo za bilježenje adresa i kad nije predviđeno da se koristi u izrazima on se može<br />

deklarirati posebnom oznakom tipa<br />

void *p;<br />

što znači da je deklariran pokazivač koji pokazuje na “bilo što”, ili da je deklariran “netipski” pokazivač.<br />

Koristiti se i naziv nul pokazivač za pokazivače kojima je vrijednost jednaka nuli.<br />

Upamti: Imena označavaju fiksni položaj u memorija i često se za njih kaže da predstavljaju referencu memorijskog<br />

objekta ili referencu. U skladu s ovim nazivom, kada se ispred pokazivača primijeni operator indirekcije, kaže se da je<br />

to dereferencirani pokazivač.<br />

Rad s pokazivačima predstavlja važan element programiranja C jezikom. Slučajevi kada se oni koriste i zašto se koriste<br />

biti će objašnjeni tek kada se upoznaju ostali temeljni elementi programiranja C jezikom.<br />

<strong>4.</strong>18


<strong>4.</strong>7 Unos podataka u memoriju računala<br />

Postoje razni načini unosa podataka: pomoću tipkovnice, pomoću miša, očitanjem sadržaja datoteka koje su spremljene<br />

na optičkim i magnetskim medijima ili iz mrežnih resursa. Sada ćemo upoznati funkciju C jezika imena scanf koja<br />

omogućuje da se dobave podaci koje korisnik programa unosi pomoću tipkovnice.<br />

Najčešći oblik korištenja scanf funkcije je:<br />

scanf(format_unosa, lista_adresnih_izraza);<br />

gdje:<br />

format_unosa je literalni string u kojem se zadaju specifikatori tipa objekta čija se vrijednost unosi. Oni su gotovo<br />

identični specifikatorima ispisa kod printf().<br />

lista_adresnih_izraza je niz izraza odvojenih zarezom, čija vrijednost predstavlja adresu postojećeg memorijskog<br />

objekta. Tip objekta mora odgovarati specifikaciji tipa prethodno zapisanog u formatu_unosa.<br />

<strong>4.</strong>19


Jednostavni programi u kojima ćemo koristiti funkciju scanf imat će slijedeći oblik:<br />

/* scanf1.c – obrazac unosa podataka pomoću scanf*/<br />

#include <br />

int main(void)<br />

{<br />

/* 1. definiraj varijablu čija vrijednost se unosi*/<br />

int unos;<br />

/* 2. ispiši poruku korisniku: */<br />

printf("Molim otipkajte jedan cijeli broj >");<br />

/* 3. Pozovi funkciju scan s agumentom: adresa varijabe */<br />

scanf("%d", &unos);<br />

/* <strong>4.</strong> obavi radnje s tom varijablom ......*/<br />

/* 5. ispiši rezultat obrada*/<br />

printf("\nOtkucali ste broj %d.\n", unos);<br />

}<br />

return 0;<br />

Kada pokrene ovaj program, na monitoru se ispisuje poruka:<br />

c:> Molim otipkajte jedan cijeli broj >_<br />

i program čeka da korisnik otkuca jedan broj. Unos završava kada korisnik pritisne tipku . Primjerice, ako<br />

korisnik otipka 12345, program će završiti s porukom:<br />

Otkucali ste broj 12345.<br />

<strong>4.</strong>20


Obično se u format_unosa ne upisuje nikakovi dodatni tekst, kao što je to bio slučaj kod printf funkcije, iako je to<br />

dozvoljeno. Primjerice, ako bi koristili naredbu<br />

scanf("Broj=%d", &unos);<br />

i ako korisnik želi unijeti brijednost 25, onda bi on morao otipkati “Broj=25”. Ako bi otkucao samo broj<br />

25, funkcija scanf() ne bi dala ispravan rezultat.<br />

Pomoću scanf funkcije može se odjednom unijeti više vrijednosti, primjerice unos jednog cijelog broja, jednog realnog<br />

broja i jednog znaka, može se ostvariti samo s jednim pozivom funkcije scanf;<br />

int i;<br />

double x;<br />

char c;<br />

....<br />

scanf("%d%f %c", &i, &x, &c);<br />

Pri unosu cjelih i realnih brojeva, scanf funkcija podrazumjeva da unos pojedinog broja završava tzv. “bijelim”<br />

znakovima (razmak, tab, nova linija). Svi bijeli znakovi uneseni ispred broja se odbacuju. To nije slučaj kada se unosi<br />

znak, jer i bijeli znakovi predstavljaju znak. Stoga se pri unosu znaka treba eksplicitno u formatu zapisa zadati razmak<br />

od prethodnog unosa.<br />

Navedeni problemi su razlogom da programeri rijetko koriste scanf funkciju za komuniciranje s korisnikom. Kasnije<br />

ćemo pokazati da je za unos znakova pogodnije koristiti neke druge funkcije. Također, pokazat ćemo kako<br />

dijagnosticirati da li je izvršen unos koji odgovara zadanom tipu varijable.<br />

<strong>4.</strong>21


<strong>4.</strong>8 Inicijalizacija varijabli<br />

Temeljni uvjet korištenja neke varijable je da ona prethodno mora biti deklarirana. Samom deklaracijom nije određeno<br />

kakova će biti početna (inicijalna) vrijednost varijable.<br />

int main()<br />

{<br />

int y, x; /* deklaracija varijabli x i y */<br />

x = 77; /* početna vrijednost varijable x */<br />

y = x + 7; /* početna vrijednost varijable y */<br />

...<br />

Kada ne bi bila određena vrijednost od x, program bi se kompajlirao bez dojave pogreške, ali tada bi pri izvršenju<br />

programa bila neodređena vrijednost varijable y.<br />

U C jeziku se početna vrijednost varijable može odrediti i u samoj deklaraciji. Primjerice, prethodni program se može<br />

napisati u obliku:<br />

int main()<br />

{<br />

int y, x = 77; /* deklaracija varijabli x i y */<br />

/* i inicijalizacija x na vrijednost 77 */<br />

y = x + 7; /* početna vrijednost varijable y */<br />

Zapamti: Inicijalizacija varijable je deklaracija u kojoj se određuje početna vrijednost varijable.<br />

<strong>4.</strong>22

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!