You are on page 1of 146

Uvod u programiranje

algoritam, program, programiranje

Algoritam
Pravilo (ili skup pravila) kojim se opisuje kako rijeiti neki problem i koje posjeduje sljedea svojstva: algoritam je precizan algoritam je jednoznaan algoritam obuhvaa konani broj koraka; svaki korak je opisan instrukcijom za algoritam su definirani poetni objekti (koji pripadaju nekoj klasi objekata) nad kojima se obavljaju operacije ishod obavljanja algoritma je skup zavrnih objekata (rezultat), tj. algoritam je djelotvoran (effective) Postupak obavljanja algoritma je algoritamski proces
2

Primjer algoritma kiseljenje krastavaca


Poetni objekti:
5 kg krastavaca, 1 l alkoholnog octa (9%), 30 dag eera, 10 dag soli, kopar, papar

Krastavce i kopar oprati i posloiti u iste staklenke U 2 l vode dodati ocat, eer, sol i papar Zakuhati uz mijeanje Vruu otopinu uliti u staklenke Staklenke zatvoriti celofanom i gumicom Sloiti staklenke u iroki lonac napunjen vodom do grla staklenki Zagrijati vodu do 80 stupnjeva. Ako toplomjer nije raspoloiv, zagrijavati dok se s dna ne ponu dizati mjehurii zraka Ostaviti stajati barem 24 sata prije uporabe. Zavrni objekti:
kiseli krastavci la FER
3

Algoritmi i programi
Program - opis algoritma koji u nekom programskom jeziku jednoznano odreuje to raunalo treba napraviti. Programiranje proces opisivanja algoritma nekim od programskih jezika Postupci izrade algoritama nisu jednoznani te zahtijevaju i kreativnost. Koristit e se programski jezik C. Za saeti opis sloenijih algoritama koristit e se pseudokod ili dijagram toka.

Primjer
Programski zadatak: s tipkovnice proitati dva cijela broja, na zaslon ispisati proitane brojeve i vei od proitana dva broja

Primjer - nastavak
Pseudokod koji koristi iskljuivo termine govornog jezika

proitaj dva cijela broja ispii proitane brojeve odredi vei broj ispii rezultat

Primjer - nastavak
Pseudokod koji koristi uobiajene simbole proitaj (m, n) ispii (m, n) {odredi vei broj} ako je m > n tada rez := m inae rez := n ispii (rez) kraj
7

Primjer - nastavak
Dijagram toka Poetak cijeli broj m, n, rez proitaj m, n
Da

m>n

Ne

rez = m

rez = n

rez Kraj
8

Primjer - nastavak
Kd u programskom jeziku C
#include <stdio.h> int main() { int m, n, rez; /* ucitaj i ispisi dva cijela broja */ scanf("%d %d", &m, &n); printf("Ucitani su %d i %d\n", m, n); /* odredi veci broj */ if ( m > n ) { rez = m; } else { rez = n; } /* ispisi rezultat */ printf("Veci broj je %d\n", rez); return 0; }

Objanjenje
#include #include <stdio.h> <stdio.h>

uputa pretprocesoru: ukljuuje u program prije prevoenja standardno zaglavlje <stdio.h> koje sadri definicije struktura, vrijednosti, makroinstrukcija i funkcija za standardne ulazno-izlazne jedinice ugraditi na poetak svakog programa koji koristi funkcije scanf ili printf

10

Objanjenje
int int main() main() { { ... ... ... ... return return 0; 0; } }

glavna funkcija koja predstavlja mjesto gdje poinje izvravanje programa. Svaki C program mora sadravati tono jednu main funkciju. int ispred main znai da funkcija u pozivajui program vraa cijeli broj funkcija zavrava naredbom return koja u pozivajui program vraa rezultat. Za sada, uvijek napisati return 0;

11

Objanjenje
int int m, m, n, n, rez; rez;

definicija varijabli. Varijabla je prostor u memoriji raunala, poznate veliine, kojemu je dodijeljeno ime i iji se sadraj moe mijenjati. Naredbom su definirane 3 cjelobrojne varijable u koje se mogu pohranjivati cijeli brojevi

float float x; x; float float y; y;

naredbama su definirane realne varijable x i y u koje se mogu pohranjivati realni brojevi

12

Objanjenje
/* /* ucitaj ucitaj dva dva cijela cijela broja broja */ */

komentar koji nema utjecaja na izvravanje programa

/* /* ucitaj ucitaj dva dva cijela cijela broja broja */ */

komentar se moe protezati kroz vie redaka programa

13

Objanjenje
scanf("%d scanf("%d %d", %d", &m, &m, &n); &n);

funkcija za uitavanje vrijednosti s tipkovnice. Kao argumenti se navode format (ovisi o tipovima varijabli u koje se uitavaju vrijednosti) koritenjem specifikacije %d uitavaju se cjelobrojne vrijednosti adrese varijabli u koje se uitavaju vrijednosti. Adrese varijabli se oznaavaju s &imeVarijable npr, preko tipkovnice je uneseno

3 5

nakon obavljanja naredbe scanf varijabla m ima vrijednost 3, varijabla n ima vrijednost 5 koritenjem specifikacije %f uitavaju se realne vrijednosti
float float x, x, y, y, z; z; scanf("%f scanf("%f %f %f %f", %f", &x, &x, &y, &y, &z); &z);

1.15 2 3.5
z 3.5
14

x 1.15

y 2.0

Objanjenje
printf("%d printf("%d %d\n", %d\n", m, m, n); n);

funkcija za ispisivanje na zaslon. Kao argumenti se navode


format (ovisi o tipovima vrijednosti koje se ispisuju) ako su vrijednosti cjelobrojne, koristi se specifikacija %d ako su vrijednosti realne, koristi se specifikacija %f vrijednosti koje se ispisuju. To (izmeu ostalog) mogu biti varijable i konstante

\n u formatu predstavlja uputu za skok u novi red uz pretpostavku da su vrijednosti varijabli m=156, n=20, na zaslon e se ispisati

156 20

15

Objanjenje
specifikacijom se moe utjecati na irinu ispisa, npr.
printf("%d,%5d,%2d", printf("%d,%5d,%2d", 10, 10, 20, 20, 30); 30);

10,

20,30

printf("%d,%d\novo printf("%d,%d\novo je je novi novi red%4d", red%4d", 10, 10, 20, 20, 30); 30);

10,20 ovo je novi red

30
16

Objanjenje
kad se ispisuju realne vrijednosti, koristi se specifikacija %f
printf("%f printf("%f %f", %f", 15.2, 15.2, -3.45); -3.45);

15.200000 -3.450000

ispisuje se 6 znamenki iza decimalne toke

specifikacijom se moe utjecati na irinu ispisa i broj decimala, npr.


printf("%6.2f,%10.4f", printf("%6.2f,%10.4f", 15.2, 15.2, -3.45); -3.45);

15.20,
%6.2f: %10.4f:

-3.4500

ispisuje ukupno 6 znakova, od toga dva iza decimalne toke ispisuje ukupno 10 znakova, od toga etiri iza decimalne toke
17

Objanjenje
rez rez = = m; m; naredba za pridruivanje vrijednosti u varijablu u varijablu rez pridrui vrijednost koja se nalazi u varijabli m

rez rez rez rez rez rez rez rez

= = = = = = = =

5; 5; 5 5 * * 3; 3; 12 12 / / 3; 3; m m + + 5 5 - 3; 3;

rez rez = = 3 3 / / 4; 4;

u rez pridrui u rez pridrui u rez pridrui u rez pridrui uveane za 2 u rez pridrui

5 15 4 vrijednost varijable m 0 !!!

float float x; x; x x = = 3. 3. / / 4; 4;

u x pridrui 0.75
18

Objanjenje
if if ( ( m m rez rez } } else else rez rez } } > > = = { { = = n n ) ) { { m; m; n; n;

naredba za kontrolu toka programa


ako se uvjet u zagradama iza if izrauna kao istina, obavljaju se naredbe unutar prvih vitiastih zagrada inae se obavljaju naredbe unutar vitiastih zagrada iza else

if ( m if ( m if ( m >=, <,

> n ) != n ) == n ) <=

ako je sadraj m vei od sadraja n ako je sadraj m razliit od sadraja n ako je sadraj m jednak sadraju n

19

Zadatak za vjebu
S tipkovnice uitati dva cijela broja. Na zaslon ispisati, ovisno o vrijednostima koje su uitane, jednu od sljedeih poruka:
brojevi su jednaki prvi broj je veci od drugog prvi broj je manji od drugog

20

Rjeenje (varijanta 1)
#include <stdio.h> int main() { int i, j; scanf("%d %d", &i, &j); if ( i > j ) { printf("prvi broj je veci od drugog"); } if ( i < j ) { printf("prvi broj je manji od drugog"); } if ( i == j ) { printf("brojevi su jednaki"); } return 0; }
21

Rjeenje (varijanta 2)
#include <stdio.h> int main() { int i, j; scanf("%d %d", &i, &j); if ( i > j ) { printf("prvi broj je veci od drugog"); } else { if ( i < j ) { printf("prvi broj je manji od drugog"); } else { printf("brojevi su jednaki"); } } return 0; } Koja je varijanta bolja? Zato?
22

Zadatak za vjebu
S tipkovnice uitati polumjer krunice (realni broj). Ukoliko je uitani broj vei od nule, izraunati opseg i povrinu krunice, te na zaslon ispisati: zadani polumjer je: xxxxxx.xx opseg kruznice je: xxxxxx.xx povrsina kruznice je: xxxxxx.xx inae ispisati polumjer kruznice je neispravno zadan: xxxxxx.xx

23

1. Domaa zadaa
Svaki student treba u CIP-u otvoriti korisniki raun za FERWeb (ukoliko ga ve nema otvorenog) S FERweba preuzeti i prouiti upute vezane za koritenje sustava Ahyco Provjeriti moete li se prijaviti na sustav Ahyco. U tu svrhu student se treba Internet explorerom prijaviti na sustav FER-a, pokrenuti Ahyco koristei istu pristupnu zaporku te se upoznati sa sustavom Kako bi se kasnije mogli bez problema sluiti istim u svrhu rjeavanja zadaa i automatskih testova. Ukoliko se prijava naini nekim dugim preglednikom, npr. Mozilla Firefoxom tada neke od funkcija sustava Ahyco nee raditi dobro ukoliko se prethodno ne poduzmu odreene prilagodbe preglednika (o tome ima dosta informacija u diskusijskim grupama prethodnih generacija)

24

2. Domaa zadaa
Preuzeti instalaciju MS Visual Studio .NET 2003, .NET 2005 ili najnoviju inaicu .NET 2008 sa stranica http://msdnaa.fer.hr/ i instalirati to razvojno okruenje na vlastito raunalo Eventualno, na raunalo se moe instalirati slian alat s kojim je mogue prevoditi C programe i pratiti njihovo izvravanje (debugging) uz napomenu da automatsko ocjenjivanje domaih zadaa uvaava specifinosti .NET okruenja i moe (vrlo rijetko) doi do situacije da inae ispravno rjeenje na testnom raunalu sustav automatskog ocjenjivanja ocijeni kao djelomino ispravno ili ak neispravno. Prikladan besplatni kompajler se moe preuzeti sa stranica http://www.cs.virginia.edu/~lcc-win32/ U laboratoriju ili na vlastitom raunalu testirati rad MS Visual Studio .NET 2003 ili .NET 2005 prema uputama za uporabu objavljenim na slubenoj stranici predmeta.
25

Vrste programske podrke


Sistemska programska podrka
Operacijski sustavi (MS-DOS, UNIX/Linux, Windows) Usluni (utility) programi (prevodioci, ureivai teksta): Servisi (Internet posluitelj, posluitelj baze podataka)

Aplikativna (namjenska, primijenjena) programska podrka


Rjeava probleme specifine za neku struku Tablini kalkulatori (npr. Excel), obraivai teksta (npr. Word), mreno planiranje (npr. Project)... IDE (Integrated Development Environment): sustav za podrku pri razvoju softvera. Uobiajeno, obuhvaa sintaksno osjetljivi editor, prevodioc, podsustav za testiranje, itd. Visual Studio .NET 2005
26

Redoslijed rjeavanja manjih programa


1. Uoavanje (identifikacija) problema i postavljanje programskog zadatka 2. Oblikovanje programa (razvoj algoritma) 3. Konverzija algoritma u logiku razumljivu raunalu 4. Kodiranje 5. Upis programskog kda u raunalo 6. Prevoenje (kompilacija) programa 7. Ispravljanje formalnih pogreaka 8. Kolekcija programa (stvaranje izvrnog programa) 9. Izvoenje programa s test podacima 10. Ispravljanje uoenih logikih pogreaka 11. Koritenje programa s aktuelnim podacima

27

Programiranje u uem smislu


pogreke (syntax errors)

Ureiva teksta (editor)


probni podaci

izvorni kd

Prevodilac biblioteka potprograma izvrni kd

objektni kd

(run-time errors)

pogreke

(linker errors)

pogreke

Izvravanje

Kolektor

rezultati

pogreke (logike pogreke)

28

Programiranje u uem smislu


Unos izvornog programa (source code)
ASCII ureiva teksta (EDIT, vi, ...) Ureiva teksta ugraen u radnu okolinu programera (MS Visual Studio)

Prevoenje izvornog programa u objektni program Poziv prevodioca (compiler)


Prevodilac otkriva sintaktike (pravopisne, formalne) pogreke programer ispravlja izvorni kd i ponovo pokree prevoenje

Kolekcija (povezivanje) prevedenog programa u izvrni (apsolutni) program Poziv kolektora (linker)
Povezuju se potrebne potprogramske biblioteke (stdio.h, math.h, ...) Kolektor otkriva pogreke programer ispravlja izvorni kd i ponovno pokree prevoenje
29

Programiranje u uem smislu


Izvoenje izvrnog programa
Definiranje skupova ulaznih probnih podataka i oekivanih rezultata Izvravanje programa na osnovi probnih podataka Pogreke koje se otkrivaju prilikom izvravanja (run-time errors)
- npr. Division by zero Logike pogreke - program "radi" (ne dojavljuje pogreke), ali daje pogrene rezultate programer ispravlja izvorni kd i ponovo pokree prevoenje/izvoenje

30

Primjer
Programski zadatak

pronai najvei od tri zadana broja


Pseudokod koji koristi iskljuivo termine govornog jezika

proitaj tri realna broja ispii proitane brojeve odredi najvei broj ispii naeni broj
31

Primjer - nastavak
Pseudokod koji koristi uobiajene simbole
proitaj (x,y,z) ispii (x,y,z) {odredi najvei broj} ako je x > y tada ako je x > z tada rez := x inae rez := z inae ako je y > z tada rez := y inae rez := z ispii (rez) kraj

32

Primjer - nastavak
Unapreenje prethodnog rjeenja proitaj (x,y,z) ispii (x,y,z) {odredi najvei broj} rez := z ako je x > y tada ako je x > z rez := inae ako je y > z rez := ispii (rez) kraj

tada x tada y

33

Primjer - nastavak
Kd u programskom jeziku C
#include <stdio.h> int main() { float x, y, z, rez; scanf("%f %f %f", &x, &y, &z); printf("%f %f %f \n", x, y, z); /* odredi najveci broj */ rez = z; if ( x > y ) { if ( x > z) rez = x; } else { if ( y > z) rez = y; } printf("%f \n", rez); return 0; }

34

Budite "kompajler" i komentirajte ponueno rjeenje


#include <stdio.h> int main() { float pi, triCetvrtPi; pi = 3.14159 triCetvrtPi = 3/4*pi; print("tri cetvrt pi = %f \n", triCetvrtPi); return 0; } sintaktika pogreka

pogreka povezivanja (linkanja)

logika pogreka
35

Zadatak za vjebu
Napisati pseudokod, nacrtati dijagram toka, te napisati C program za sljedei problem: Uitati koeficijente dvaju pravaca y = a1 x + b1 i y = a2 x + b2 Ovisno o vrijednostima koeficijenata, ispisati poruku da su pravci paralelni ili ispisati koordinate toke u kojoj se sijeku. Upisati, prevesti i testirati program pomou Visual Studio .NET

36

3. Domaa zadaa
Isprobati prevoenje programa i ispravljanje pogreaka u instaliranom razvojnom okruenju MS Visual Studio .NET Najprije je potrebno isprobati rjeavanje elementarnih programskih zadataka kako bi se podesili svi parametri razvojnog okruenja. Upute i prijedloge nekoliko jednostavnijih zadatka za 3. Domau zadau preuzeti sa slubenih stranica predmeta

37

opa pravila pisanja C-programa

Uvod u C-programiranje

38

Opa pravila pisanja C programa


C razlikuje velika i mala slova. Npr: sum Sum SUM C je jezik slobodnog formata (nema pravila koja propisuju stil pisanja) mjesto poetka naredbe u retku je proizvoljno doputeno je stavljanje vie naredbi u istom retku. Npr:
int i,n; printf("Unesite n: "); scanf("%d", &n);

poeljno je umetanje praznina i praznih redova


39

Primjer - to radi ovaj program?


#include <stdio.h> int main() {float x, y, z, rez;scanf("%f %f %f", &x, &y, &z); printf ("%f %f %f \n", x, y , z); rez = z ; if( x > y ) {if ( x>z) rez = x;} else{if ( y > z) rez= y ; }printf("%f \n" , rez); return 0;}
40

Primjer - to radi ovaj program?


#include <stdio.h> int main() { float x, y, z, rez; scanf("%f %f %f", &x, &y, &z); printf("%f %f %f \n", x, y, z); rez = z; if (x > y) { if (x > z) rez = x; } else { if (y > z) rez = y; } printf("%f \n", rez); Razliiti stilovi return 0; }
if (x > y) { rez = x; } if (x > y) { rez = x; } if (x > y) { rez = x; } if (x > y) { rez = x; }
41

Kljune rijei
predefinirani identifikatori koji za prevodioca imaju posebno znaenje kljune rijei se piu malim slovima Prema ANSI standardu C ima sljedee 32 kljune rijei: auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void volatile default goto sizeof do if static while http://refcards.com/refcard/ansi-c-silvermanj
42

ANSI - American National Standards Institute

Struktura C programa
C program se sastoji od imenovanih blokova, deklaracija/definicija varijabli, direktiva pretprocesoru
imenovani blokovi se nazivaju funkcije. Za nazive funkcija se ne smiju koristiti kljune rijei. deklaracija opisuje naziv i tip varijable. definicija je deklaracija kojom se osim opisa varijable, rezervira prostor u memoriji

blok zapoinje znakom { i zavrava znakom } blok obuhvaa deklaracije/definicije, naredbe (statement) i neimenovane blokove svaka naredba i deklaracija/definicija mora zavravati znakom ; blok NE zavrava znakom ; tj. iza znaka } ne stavlja se ;

43

Struktura C programa
int suma(int int k; { int m; { m = k = } } return k; } i, int j) {

i + j; m;

imenovani blok (funkcija) definicija varijable neimenovani blok definicija varijable neimenovani blok naredba naredba

int produkt(int i, int j) { ... }

imenovani blok (funkcija)

44

Struktura C programa
u C programu mora postojati glavna (main) funkcija koja predstavlja mjesto gdje poinje izvrenje programa:
int main() { programski blok return 0; } ISPRAVNO main() { programski blok return 0; }
ISPRAVNO ALI SE NE PREPORUA

ili
void main() { programski blok }

POGRENO!!!
45

Struktura C programa
#include <stdio.h> #define PI 3.14159 int main() { float r; float opseg; printf("Unesi polumjer"); scanf("%f", &r); opseg = 2 * r * PI; printf("%9.2f\n", opseg); return 0; }

direktive pretprocesoru funkcija main definicija varijabli tijelo funkcije main

kraj funkcije main

46

Komentari

mogu se protezati kroz vie linija izbjegavati komentar oblika: printf("Unesi n: ");/* Ispis na zaslonu */ zato to program postaje neitkiji nije doputeno koristiti komentar unutar komentara: /* definicija /* funkcije */ sume */

47

Pretprocesorske naredbe
#include <stdio.h> ukljuuje u program prije prevoenja standardno zaglavlje <stdio.h> koje sadri definicije struktura, vrijednosti, makroinstrukcija i funkcija za standardne ulazno-izlazne jedinice (na primjer printf, scanf i druge).

/*** *stdio.h - definitions/declarations for standard I/O routines * * Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: * This file defines the structures, values, macros, and functions * used by the level 2 I/O ("standard I/O") routines. * [ANSI/System V] * * [Public] * ****/

#define PI 3.14159 definira simboliku konstantu PI i pridjeljuje joj vrijednost. Simbolike konstante su naroito korisne za parametrizaciju programa.

48

Varijable
Openito: promjenljiv podatak (lat.variabilis-promjenljiv) U programiranju: varijabla je prostor u memoriji raunala, poznate veliine, kojemu je dodijeljeno ime i iji se sadraj moe mijenjati Simboliki se prikazuje pravokutnikom uz kojeg stoji ime

Smjetaj u memoriji raunala

...

...

49

Varijable
imena varijabli i funkcija su sastavljena od slova i brojki, a prvi znak mora biti slovo ili znak potcrtavanja _
suma god_rod 94god x1 pripremni_dio_studija x1.1 maticni broj float novi+datum

svaka varijabla se obavezno mora definirati/deklarirati prije koritenja

int i, n; float sum; char pocetno_slovo;


velika i mala slova se razlikuju (imena varijabli i funkcija se obino piu malim slovom, imena simbolikih konstanti velikim) duljina moe biti proizvoljna (znaajno prvih 31 znakova) kljune rijei se ne smiju koristiti za imena varijabli
50

Uvod u C-programiranje
osnovni tipovi podataka

51

Osnovni tipovi podataka


Osnovni tipovi podataka int float char - cjelobrojni tip - realni tip - znakovni tip (ili mali cijeli broj)

double - realni tip u dvostrukoj preciznosti

52

Binarni brojevni sustav

Pouzdano i neosjetljivo na manje promjene napona. Znamenke su 0 i 1, dakle baza brojanja B=2 to odreuje binarni brojevni sustav Iz engleskog BInary digiT nastalo je ime za najmanju koliinu informacije, znamenku binarnog brojevnog sustava BIT. Broj od n znamenki u brojevnom sustavu s bazom 2:
zn-1 2n-1 + zn-2 2n-2 + ... + z1 21 + z0 20, zi { 0, 1 }

53

Logic Threshold Voltage Levels

54

Pretvorba dekadskog broja u binarni


N = zn-1 2n-1 + zn-2 2n-2 + ... + z1 21 + z0 20
Izlui li se iz svih pribrojnika, osim posljednjeg, zajedniki faktor 2: N = 2 (zn-1 2n-2 + zn-2 2n-3 + ... + z1 20 )+ z0 N = 2 q1 + z0 moe se zakljuiti da je z0 ostatak dijeljenja N s 2 Pogledajmo sada kolinik q1 q1 = zn-1 2n-2 + zn-2 2n-3 + ... + z1 20 Izlui li se iz svih pribrojnika, osim posljednjeg, zajedniki faktor 2: q1 = 2 (zn-1 2n-3 + zn-2 2n-4 + ...) + z1 q1 = 2 q2 + z1 moe se zakljuiti da je z1 ostatak dijeljenja q1 s 2 itd .... sve dok se uzastopnim dijeljenjem s 2 ne postigne 0. Dakle, uzastopnim dijeljenjem cijelog broja N s 2 i zapisivanjem ostataka dijeljenja dobiju se znamenke ekvivalentnog binarnog broja.
55

Pretvorba dekadskog broja u binarni


1310 = ?2

N = 13 = 2 q1 + z0 20 = 2 6 + 1 20 q1 = 6 = 2 q2 + z1 20 = 2 3 + 0 20 q2 = 3 = 2 q3 + z2 20 = 2 1 + 1 20 q3 = 1 = 2 q4 + z3 20 = 2 0 + 1 20
1310 = 1 1 0 12

z0 = 1, q1 = 6 z1 = 0, q2 = 3 z2 = 1, q3 = 1 z3 = 1, q4 = 0

56

Binarni brojevni sustav


Openito: najvei dekadski broj s d znamenaka iznosi 10d-1
Primjer: d=2, najvei broj 99 = 102-1

Openito: najvei binarni broj s b znamenaka iznosi 2b-1


Primjer: b=4, najvei broj 1111 = 24-1

Koliko binarnih znamenaka treba za prikaz dekadskog broja?


10d -1 = 2b -1 10d = 2b d log10 = b log2 d = b log2 b = d : log2 b = d : 0,30102999566398119521373889472449 b d : 0,3 b d (1 : 0,3) b d 3,33 Primjer: ako treba prikazati broj 99, b 2 3,33 = 6,66
57

Binarni brojevni sustav


Koliki se najvei broj moe prikazati sa 6 binarnih znamenaka?
1111112 = 32+16+8+4+2+1 = 63 = 64-1 = 26-1

Koliki je najvei broj prikazan sa 7 binarnih znamenaka?


11111112 = 64+32+16+8+4+2+1 = 127 = 128-1 = 27-1

Oito, broj znamenaka iz prethodnog izraza treba zaokruiti na vii cijeli broj tj:
b d 3,33

58

Negativni binarni brojevi


Budui da se u registar moe pohraniti samo 0 ili 1, za pohranu negativnog predznaka je potreban dogovor (konvencija). Uobiajeno se negativni brojevi prikazuju tzv. tehnikom dvojnog komplementa, tj. nule pretvaramo u jedinice, jedinice u nule (komplement do baze - 1), a zatim se tom komplementu dodaje 1 (komplement do baze dvojni komplement). Primjer: -37 u registru s 8 bita

0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 + 1 -37 1 1 0 1 1 0 1 1 + 37 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
59

37

Primjer svih sadraja u registru od 3 bita


(ako je prvi bit predznak)
U registru s n=3 bita, ako je prvi bit predznak mogu se prikazati sljedei brojevi: Dekadski broj Binarni broj 0 000 1 001 2 010 3 011 -4 100 -3 101 -2 110 -1 111 Za n=3 dobije se interval [-22, 22 - 1], openito [-2n-1, 2n-1 - 1] Za n=8 dobije se interval [-27, 27 - 1], tj. [-128, 127]

60

Zadatak
Dekadski broj -11 prikazati u obliku binarnog broja, u tehnici dvojnog komplementa

61

Zadatak
Prethodni zadatak nije ispravno zadan jer nije navedeno pomou koliko bitova treba prikazati zadani broj Ispravno zadani zadatak glasi: Dekadski broj -11 prikazati u obliku binarnog broja, u tehnici dvojnog komplementa, u registru od 5 bitova

?
62

Oktalni brojevni sustav


Baza sustava je B=8 a znamenke su 0,1,2,3,4,5,6,7
Koristi se za skraeno zapisivanje binarnih sadraja kada je to spretno Zapis se moe dobiti iz dekadskog uzastopnim dijeljenjem s 8 i zapisivanjem ostataka s desna na lijevo, ali i izravno iz binarnog zapisa: N = z5 25 + z4 24 + z3 23 + z2 22 + z1 21 + z0 20 grupiramo li tri po tri pribrojnika i izluimo zajedniki faktor: N = (z5 22 + z4 21 + z3 20 ) 23 + (z2 22 + z1 21 + z0 20) 20 N = (z5 22 + z4 21 + z3 20 ) 81 + (z2 22 + z1 21 + z0 20) 80 o1 = (z5 22 + z4 21 + z3 20 ) , o0 = (z2 22 + z1 21 + z0 20)

Primjer: 36-bitni broj 001 110 000 101 111 001 010 011 111 000 100 0012 oktalni ekvivalent 1 6 0 5 7 1 2 3 7 0 4 1 8
63

Heksadekadski brojevni sustav


Baza sustava je B = 16, a znamenke su 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
Koristi se za skraeno zapisivanje binarnog sadraja. Zapis se moe dobiti iz dekadskog uzastopnim dijeljenjem sa 16 i zapisivanjemo ostataka s desna na lijevo, ali i izravno iz binarnog zapisa

Primjer: 16-bitni broj heksadekadski ekvivalent 0111 1011 0011 1110 2 7 B 3 E 16

64

Cjelobrojni tip podatka i prefiksi u jeziku C


int - cjelobrojni tip

Prefiksi (ili kvalifikatori) za cjelobrojni tip podatka


short long - smanjuje raspon cjelobrojnih vrijednosti koje varijabla moe sadravati - poveava raspon cjelobrojnih vrijednosti koje varijabla moe sadravati

unsigned - doputa pridruivanje samo pozitivnih vrijednosti signed - doputa pridruivanje pozitivnih i negativnih vrijednosti (zato doputa manji raspon brojeva od unsigned)

65

Formalna deklaracija cjelobrojnog tipa


int signed unsigned
int main() { signed int i; i = 123; return 0; }

short long short long

signed short int i; signed short i; short int i; short i; signed int i; int i; signed long int i; signed long i; long int i; long i; unsigned short int i; unsigned short i; unsigned int i; unsigned long int i; unsigned long i;

66

Cjelobrojni tip podatka i preciznost


Cjelobrojni tip podatka (integer), s obzirom na preciznost (broj binarnih znamenki), moe se deklarirati kao short ili long. U programskom jeziku C preciznost short i long tipova nije propisana, ali vrijede sljedea pravila:
short ne moe biti precizniji od int int ne moe biti precizniji od long odnosno za preciznost se moe napisati: short int long

U cjelobrojni tip podatka takoer pripada: char (kada se koristi kao brojevna, a ne znakovna vrijednost).
67

Cijeli broj s predznakom i bez predznaka


Kvalifikator signed (s predznakom) oznaava da se u varijabli moe pohraniti pozitivna i negativna vrijednost. Varijabla definirana kao unsigned (bez predznaka) moe pohraniti samo pozitivne vrijednosti, to udvostruuje maksimalnu pozitivnu vrijednost koja u njoj moe biti pohranjena u odnosu na signed.
Primjer: Najvei pozitivni broj prikazan u 16-bitnom registru (signed): 01111111111111112 = 3276710 Najvei pozitivni broj prikazan u 16-bitnom registru (unsigned): 1111111111111111 = 6553510
68

Cijeli broj s predznakom i bez predznaka


Primjer: Broj 5 prikazan u 16-bitnom registru: 0000000000000101 Broj 5 prikazan tehnikom dvojnog komplementa u 16bitnom registru: 1111111111111011
Isti niz binarnih znamenaka pohranjen u varijablu cjelobrojnog tipa bez predznaka, predstavlja broj 65531

69

Cijeli broj s predznakom i bez predznaka


Primjer u programskom jeziku C:
pretpostavka: short int koristi dva okteta int main () { short int i; unsigned short int j; i = -5; printf ("%d\n", i); j = i; printf ("%d\n", j); return 0; }
70

Pohrana: Ispis: Pohrana: Ispis:

1111111111111011 -5 1111111111111011 65531

Zato je to vano znati?


Primjer u programskom jeziku C:
pretpostavka: short int koristi dva okteta int main () { short int i; i = 31500; i = i + 1000; printf ("%d\n", i); i = i + 1000; printf ("%d\n", i); return 0; }

to se i zato dogodilo?
71

Koritenje char tipa podatka za pohranu cijelog broja


int main () { char i; i = -5; printf ("%d\n", i); i = 12; printf ("%d\n", i); return 0; } Pohrana: Ispis: Pohrana: Ispis: 11111011 -5 00001100 12

72

Upamtite
Kod rjeavanja zadataka, ukoliko u zadatku nije drugaije navedeno, podrazumijevat e se: za za za za tip tip tip tip podatka podatka podatka podatka char koristi se jedan oktet short int koristi se dva okteta int koristi se etiri okteta long koristi se etiri okteta

73

Cjelobrojne konstante u jeziku C


Konstante pisane u dekadskoj notaciji: 7 20 64 -110 8092 65535 34567821 34567821L -17698794l (pripaziti, 1l) Konstante pisane u oktalnoj notaciji: 07 024 0100 0156 017634 0177777 Konstante pisane u heksadekadskoj notaciji 0x7 0x14 0x40 0x6E 0x1F9C 0xFFFF 0xFFFFFFFF

74

Primjer: Zadavanje cjelobrojnih konstanti


#include <stdio.h> /* primjer zadavanja cjelobrojnih konstanti*/ int main ( ) { int x, y, rez; /* oktalno zadan cijeli broj */ x = 010; /* heksadekadski zadan cijeli broj */ y = 0xF; rez = 10 + y / x; printf("Rezultat = %d\n", rez); return 0; }
75

Cjelobrojne konstante bez predznaka u C-u


Konstante bez predznaka piu se s U ili u na kraju
u dekadskoj notaciji:

7U 20u 64u
u oktalnoj notaciji:

07u

024U

0100u

u heksadekadskoj notaciji

0x7u

0x14u

0xFFFFFFFFu

76

Decimalni brojevi u binarnom sustavu


Decimalni binarni brojevi sadre "binarnu toku", analogno decimalnom zarezu, odnosno toki u anglo-amerikoj notaciji. Primjer prikaza decimalnih brojeva u binarnom sustavu: 5.75 10 = 5 * 100 + 7 * 10-1 + 5 * 10-2 = = 1*22 + 0*21 + 1*20 + 1*2-1 + 1*2-2 = =101.112 Openito: R = zn-1 2n-1 + zn-2 2n-2 + ... + z1 21 + z0 20 -1 -2 ... +z n+1 2 + zn+2 2 +
77

Pretvaranje decimalnog broja iz dekadskog u binarni brojevni sustav


Cjelobrojni dio dekadskog broja pretvara se u binarni uzastopnim dijeljenjem, a decimalni uzastopnim mnoenjem s 2, gdje cjelobrojni dio dobivenih produkata tvori decimalne znamenke binarnog broja. 1.25 = 1 + .25 .25 * 2 0.50 .5 * 2 1.0
78

1.0 1

Pretvaranje decimalnog broja iz dekadskog u binarni brojevni sustav


13.3 = 13 + 0.3 .3 * 2 0.6 .6 * 2 1.2 .2 * 2 0.4 .4 * 2 0.8 .8 * 2 1.6 .6 * 2 1.2 .... . . 1 1 0 1 . 0 1 0 0 1 1 0 0 1 ...

Broj s konanim brojem decimala u dekadskom sustavu u binarnom sustavu moe imati beskonani periodiki niz binarnih znamenaka. Mnoenje se nastavlja sve dok se ne dobije cijeli broj 1 ili bude dosegnuta zadovoljavajua preciznost.
79

Mnoenje binarnog broja s 2n i 2-n


Binarni broj se mnoi s potencijama baze 2 tako da se binarna toka pomakne odgovarajui broj mjesta desno ili lijevo, ovisno o tome je li predznak potencije pozitivan ili negativan. Na primjer: 1 1 1 * 22 = 1 1 1 0 0 1 .1 1 * 2-2 = 0 . 0 1 1 1 Kako, meutim, u registar pohraniti toku?

80

Prikaz realnih brojeva u raunalu


to je realni broj?
7 2.5 -17.5 e 1000 0 871236173.8763723

0.333333333333333333333333333333333333333333
3.141592653589793238462643383279502884197169

ne postoji nain na koji bi se u raunalu mogao pohraniti svaki realni broj. Pohranjuju se pribline vrijednosti realnih brojeva.

81

Prikaz realnih brojeva u dekadskom obliku


Kako inenjeri i znanstvenici prikazuju vrlo velike i vrlo male brojeve? Znanstvena notacija: decimalni broj s jednom znamenkom ispred decimalne toke (zareza), pomnoen odgovarajuom potencijom broja 10 (baza brojanja = 10).
Kolika je prosjena udaljenost Neptuna i Sunca? 4503930000000 m 4.50393 1012 m

mantisa

eksponent

Koliko iznosi masa elektrona? 0.000000000000000000000000000000910938188 kg 9.10938188 10-31 kg

82

Prikaz realnih brojeva u binarnom obliku


Slino, realan broj u binarnom obliku, moe se prikazati kao binarni decimalni broj s jednom binarnom znamenkom ispred binarne toke, pomnoen odgovarajuom potencijom broja 2 (baza brojanja = 2). Za broj u takvom obliku kae se da je normaliziran. mantisa Na primjer: binarni eksponent

101.11 = 1.011122 0.000000000000010011 = 1.00112-14

Normalizacija omoguava prikaz vrlo velikih i vrlo malih brojeva, bez koritenja velikog broja nula.

83

Pohrana realnih brojeva u raunalu


Realni brojevi u raunalu se pohranjuju u normaliziranom obliku. Kako normalizirani broj pohraniti u registar? IEEE (Institute of Electrical and Electronics Engineers) standard 754 definira nain pohrane realnih brojeva

84

Realni tip podatka u jeziku C


Primjer definicije varijable:
float x;

Primjer realnih konstanti:


2.f 2.34F -1.34e5f

Primjer C programa:
int main () { float x; x = 2.f * 5.0f * 3.14159F; printf("Krug radijusa 5 ima opseg %f", x); return 0; }

Pored tipa float, u jeziku C postoje tipovi double i long double.


85

Realni brojevi jednostruke preciznosti


Najee prikazuje float tip podatka u jeziku C Koriste se 4 okteta (32 bita) Realni broj se pohranjuje u obliku:
31 30

Karakteristika Mantisa bez skrivenog bita

23 22

1 bit za pohranu predznaka 8 bitova za pohranu karakteristike 23 bita za pohranu mantise bez skrivenog bita

86

Realni brojevi jednostruke preciznosti


31 30

Karakteristika Mantisa bez skrivenog bita

23 22

P je oznaka za predznak
P = 1: negativan broj P = 0: pozitivan broj

BE je oznaka za binarni eksponent normaliziranog broja


raspon binarnog eksponenta BE [-126, 127]

karakteristika K
K = BE + 127 raspon karakteristike: K [0, 255] K = 0 i K = 255 se koriste za posebne sluajeve (objanjeno kasnije)

mantisa M
u registar se ne pohranjuje cijela mantisa M, ve mantisa iz koje je uklonjen skriveni bit
87

Skriveni bit mantise


U binarnom brojevnom sustavu, jedina znamenka koja se u normaliziranom broju (osim za broj 0) moe pojaviti u registru od 8 bitova, ispred binarne toke je 1 mogue je prikazati broj s 1.xxxxxxx ukupno 8 znamenaka Ta jedinica se ne pohranjuje i zato se naziva skrivenim bitom (hidden bit). Na taj se nain tedi jedan bit, a time poveava preciznost. u registru od 8 bitova, mogue je prikazati broj s 1.xxxxxxxx
ukupno 9 znamenaka 1 ispred toke se podrazumijeva, stoga ga ne treba pohraniti
88

Primjer: Prikazati broj 5.75 kao realni broj


1. Realni dekadski broj prikazati u obliku realnog binarnog broja 2. Odrediti predznak: broj je pozitivan, stoga je P = 0 M 3. Normalizirati binarni broj BE 4. Izraunati karakteristiku i izraziti ju u binarnom obliku 5. Izbaciti vodeu jedinicu iz mantise (skriveni bit) M (bez skrivenog bita i binarne toke) = 01112 6. Prepisati predznak, karakteristiku i mantisu bez skrivenog bita u registar

5.7510 = 101.112

101.11220 = 1.0111222

K = 210 + 12710 = 12910 = 1000 00012

0
P

10000001

01110000000000000000000

Karakteristika Mantisa bez skrivenog bita


89

0100 0000 1011 1000 0000 0000 0000 00002 4 0 B 8 0 0 0 0 16

Primjeri pohrane realnih brojeva


2 = 102 * 20 = 12 * 21 = 0100 0000 0000 0000 ... 0000 0000 = 4000 0000 16 P = 0, K = 1 + 127 = 128 (10000000), M = (1.) 000 0000 ... 0000 0000 -2 = -102 * 20 = -12 * 21 = 1100 0000 0000 0000 ... 0000 0000 = C000 0000 Jednako kao 2, ali P = 1 4 = 1002 * 20 = 12 * 22 = 0100 0000 1000 0000 ... 0000 0000 = 4080 0000 Jednaka mantisa, BE = 2, K = 2 + 127 = 129 (10000001) 6 = 1102 * 20 = 1.12 * 22 = 0100 0000 1100 0000 ... 0000 0000 = 40C0 0000 1 = 12 * 20 = 0011 1111 1000 0000 ... 0000 0000 = 3F80 0000 K = 0 + 127 (01111111).
16 16

16

16

.75 = 0.112 * 20 = 1.12 * 2-1 = 0011 1111 0100 0000...0000 0000 = 3F40 0000

16

90

Kalkulator za uvjebavanje
Internet stranica na kojoj se nalazi dobar kalkulator za uvjebavanje zadataka s prikazivanjem realnih brojeva http://babbage.cs.qc.edu/courses/cs341/IEEE-754.html

IEEE-754 Floating-Point Conversion from Floating-Point to Hexadecimal.htm

91

Posebni sluajevi: prikaz broja 0


Kada bi vodea znamenka normaliziranog broja uvijek bila 1, ne bi bilo mogue prikazati broj 0 Koristi se sljedei dogovor: kada je K=0 i svi bitovi mantise postavljeni na 0, radi se o prikazu realnog broja 0 U raunalu se mogu prikazati brojevi "+0" i "0" 0000 0000 0000 0000 0000 0000 0000 0000 +0 1000 0000 0000 0000 0000 0000 0000 0000 0 Meutim, pri usporedbi tih dviju vrijednosti, smatra se da su jednake.

92

Posebni sluajevi: denormalizirani broj


Kada je K=0 i postoje bitovi mantise koji nisu 0, radi se o "denormaliziranom broju". Ne podrazumijeva se skriveni bit, te se smatra da je vodei bit mantise 0. Vrijednost eksponenta je fiksirana na -126 (ne koristi se izraz K=binarni eksponent+127).

0000 0000 0110 0000 0000 0000 0000 0000 0.11 2-126 0000 0000 0000 0000 0000 0000 0000 1101 0.000 0000 0000 0000 0000 1101 2-126

93

Posebni sluajevi: prikaz + i


Kada je K=255 i svi bitovi mantise su postavljeni na 0, radi se o prikazu + ili . Takvi brojevi se dobiju npr. prilikom dijeljenja s nulom:
float x, y, z, w; x = 5.f; y = -5.f; z = x / 0.f; w = y / 0.f;

0111 1111 1000 0000 0000 0000 0000 0000 + 1111 1111 1000 0000 0000 0000 0000 0000
94

Posebni sluajevi: prikaz NaN


Ako je K=255 i postoje bitovi mantise koji nisu 0, radi se o NaN (not a number), tj. ne radi se o prikazu broja. NaN je posljedica obavljanja operacije iji je rezultat nedefiniran ili se prilikom obavljanja operacije dogodila pogreka, npr.
float x, y, z; x = 0.f; y = 0.f; z = x / y;

0111 1111 1100 0000 0000 0000 0000 0000 NaN


95

(za format IEEE 754 - jednostruka preciznost)


Najmanji pozitivni broj koji se moe prikazati je:

Raspon realnih brojeva

0.000000000000000000000012 2-126 1.4 10-45


Najvei pozitivni broj koji se moe prikazati je:

1.111111111111111111111112 2127 2128 3.4 1038


96

(za format IEEE 754 - jednostruka preciznost)

Raspon realnih brojeva

-3.4 1038

-1.4 10-45

+1.4 10-45

+3.4 1038

-1.17 10-38

+1.17 10-38

Prikaz nije mogu

Prikaz nije mogu

Prikaz nije mogu

Mogu prikaz brojeva

97

Prikaz cijelih brojeva u raunalu (podsjetnik)


U registru raunala s konanim brojem bitova mogue je prikazati konaan broj razliitih brojeva Koliko je razliitih cijelih brojeva mogue prikazati u registru od n bitova ? 2n razliitih cijelih brojeva Skup cijelih brojeva Z je beskonaan - nije mogue prikazati sve brojeve iz skupa, ali
za prikaz svih cijelih brojeva iz intervala [0, 2n-1] ili iz intervala [-2n-1, 2n-1-1] dovoljan je registar od n bitova

98

Prikaz realnih brojeva u raunalu


Koliko bitova bi trebao imati registar u kojem bi se mogli tono prikazati svi realni brojevi iz intervala [-1.0, 1.0] ? beskonano mnogo, jer [-1.0, 1.0] R Samo konaan podskup realnih brojeva iz nekog intervala [-a, a] mogue je tono (bez pogreke) prikazati u registru. Ostali realni brojevi iz tog intervala mogu se pohraniti samo kao njihove pribline vrijednosti

99

Prikaz realnih brojeva u raunalu


Zato se svi realni brojevi iz nekog intervala [-a, a] ne mogu u registru prikazati bez pogreke?
realni broj moe biti transcendentan - broj dekadskih znamenaka je beskonaan, stoga je i broj binarnih znamenaka beskonaan, npr. , ln 2 realni broj s konanim brojem dekadskih znamenaka moe imati mantisu s beskonanim periodikim nizom binarnih znamenaka, npr. 1.3 = 1.0100110011001100110011001100110011001 ... realni broj moe imati konaan, ali "prevelik" broj binarnih znamenaka mantise, npr. 4194304.125=1.0000000000000000000000001222
- previe znamenaka mantise da bi se mogao bez pogreke prikazati u IEEE 754 formatu jednostruke preciznosti - ovaj broj se moe bez pogreke prikazati u IEEE 754 formatu dvostruke preciznosti (objanjeno kasnije)

100

Koliko se razliitih realnih brojeva moe prikazati (za format IEEE 754 - jednostruka preciznost)
za svaki K[0, 254]
mogue su 223 razliite mantise mogua su dva predznaka ukupno 255 *223 * 2 = 4,278,190,080 razliitih realnih brojeva

uz K=255, mogue je prikazati +, i NaN


bez pogreke je mogue prikazati priblino 4.3109 razliitih realnih brojeva iz intervala [-3.41038, -1.410-45] [1.410-45, 3.41038] za ostale realne brojeve (njih beskonano mnogo) iz navedenih intervala mogue je prikazati samo pribline vrijednosti (uz veu ili manju pogreku) realni brojevi izvan navedenih intervala se uope ne mogu prikazati

101

Preciznost realnih brojeva


Preciznost je svojstvo koje ovisi o koliini informacije koritene za prikaz broja. Vea preciznost znai: mogue je prikazati vie razliitih brojeva brojevi su na brojevnom pravcu meusobno "blii" (vea rezolucija) veliina pogreke pri prikazu broja je manja

102

Pogreke pri prikazu realnih brojeva


x - realni broj kojeg treba pohraniti u registar x* - priblina vrijednost broja x koja je zaista pohranjena u registar Apsolutna pogreka = x* - x Relativna pogreka = / x Primjer: ako je u registru umjesto potrebne vrijednosti x = 1.57 pohranjena vrijednost x* = 1.625 = 1.625 - 1.57 = 0.055 = 0.055 / 1.57 = 0.035
103

Pogreke pri prikazu realnih brojeva


Najvea mogua relativna pogreka ovisi o broju bitova mantise. Za IEEE 754 jednostruke preciznosti: 2-24 6 10-8 Najvea mogua apsolutna pogreka ovisi o broju bitova mantise i konkretnom broju x koji se prikazuje. Za IEEE 754 jednostruke preciznosti: 2-24 x 6 10-8 x

104

Primjer: pogreke pri prikazu realnih brojeva


(za format IEEE 754 - jednostruka preciznost)
Najvea apsolutna pogreka koja se uz jednostruku preciznost moe oekivati pri pohrani realnog broja 332.3452: 6 10-8 332.3452 2 10-5
float f1; f1 = 332.3452f; oekuje se da e biti pohranjen broj 332.3452 2 10-5 printf("%19.15f", f1); 332.345214843750000

Zaista, apsolutna pogreka je 1.484375 10-5, to je po apsolutnoj vrijednosti manje od 2 10-5.


105

Primjer: pogreke pri prikazu realnih brojeva


(za format IEEE 754 - jednostruka preciznost)
Najvea apsolutna pogreka koja se uz jednostruku preciznost moe oekivati pri pohrani realnog broja 0.7: 6 10-8 0.7 4.2 10-8
float f2; f2 = 0.7f; oekuje se da e biti pohranjen broj 0.7 4.2 10-8 printf("%17.15f", f2); 0.699999988079071

Zaista, apsolutna pogreka je -1.1920929 10-8, to je po apsolutnoj vrijednosti manje od 4.2 10-8.
106

Numerike pogreke
Neki dekadski brojevi se ne mogu prikazati pomou konanog broja binarnih znamenaka. Primjer:
float f = 0.3f; printf("%17.16f ", f); 0.3000000119209290

Za prikaz nekih realnih brojeva potrebno je "previe" binarnih znamenaka. Primjer:


float f = 4194304.125f; 1.0000000000000000000000001222 printf("%14.6f ", f); 4194304.000000

107

Numerike pogreke
Raunanje s brojevima bitno razliitog reda veliine moe dovesti do numerike pogreke
Primjer (uz jednostruku preciznost): 1000000.010 : 0.01562510 : (1.) 11101000010010000000000 * 219 (1.) 00000000000000000000000 * 2-6

Kod zbrajanja, binarne toke moraju biti poravnate: 1.11101000010010000000000 * 219 + 0.00000000000000000000000 * 219 = 1.11101000010010000000000 * 219 = 1000000.010

108

Numerike pogreke
Raunanje s brojevima bitno razliitog reda veliine - primjer u programskom jeziku C:
float f = 6000000.0f; float malif = 0.25f; f = f + malif; f = f + malif; f = f + malif; f = f + malif; printf("%f ", f);

oekuje se ispis
6000001.000000

meutim, ispisat e se:


6000000.000000
109

Realni brojevi dvostruke preciznosti


Najee prikazuje double tip podatka u jeziku C Koristi se 8 okteta (64 bita) Realni broj se pohranjuje u obliku
63 62 52 51 P Karakteristika 0 Mantisa

P je predznak (P = 1: negativan broj; P = 0: pozitivan broj) (11 bita) K = BE + 1023


Raspon karakteristike: K [0,2047]. Raspon binarnog eksponenta BE [-1022,1023]

Mantisa (52+1 bit).


110

Realni brojevi dvostruke preciznosti


Posebni sluajevi
Kada je K = 0 i svi bitovi mantise su nula, radi se o broju nula Kada je K = 0 i postoje bitovi mantise koji nisu 0, tada se radi o denormaliziranom broju Kada je K = 2047 i svi bitovi mantise su 0, radi se o + ili - Kada je K = 2047 i postoje bitovi mantise koji nisu 0, tada se radi o prikazu broja (NaN)

111

(za format IEEE 754 - dvostruka preciznost)


Najmanji pozitivni broj koji se moe prikazati je:

Raspon realnih brojeva

0.00...0012 2-1022 4.9 * 10-324


Najvei pozitivni broj koji se moe prikazati je:

1.11...112 21023 21024 1.8 *10308


112

(za format IEEE 754 - dvostruka preciznost)

Raspon realnih brojeva

-1.8 10308

-4.9 10-324

+4.9 10-324

+1.8 10308

-2.2 10-308
Prikaz nije mogu Prikaz nije mogu

+2.2 10-308
Prikaz nije mogu

Mogu prikaz brojeva

113

(za format IEEE 754 - dvostruka preciznost)


Najvea mogua relativna pogreka ovisi o broju bitova mantise.Za IEEE 754 dvostruke preciznosti: 2-53 1.1 10-16 Najvea mogua apsolutna pogreka ovisi o broju bitova mantise i konkretnom broju x koji se prikazuje. Za IEEE 754 dvostruke preciznosti: 2-53 x 1.1 10-16 x

Pogreke pri prikazu realnih brojeva

114

Primjer: pogreke pri prikazu realnih brojeva


(za format IEEE 754 - dvostruka preciznost)
Najvea apsolutna pogreka koja se uz dvostruku preciznost moe oekivati pri pohrani realnog broja 0.7:

1.1 10-16 0.7 7.7 10-17


double f4; f4 = 0.7; oekuje se da e biti pohranjen broj 0.7 7.7 10-17 printf("%19.17f", f4); 0.69999999999999996

Zaista, apsolutna pogreka je -4.0 10-17, to je po apsolutnoj vrijednosti manje od 7.7 10-17.
115

Realni tip podatka u jeziku C


Primjer definicije varijabli u programskom jeziku C:
float x; double y; long double z; float double long

Programski jezik C ne propisuje preciznost tipova float, double i long double, ali vrijedi da float ne moe biti precizniji od double, te double ne moe biti precizniji od long double: float double long double

116

Tip long double


Prostor za pohranu ovisi o platformi, pa se tako mogu nai implementacije u kojima je njegova veliina 64, 80, 96 ili 128 bita. ANSI standard ne propisuje preciznost, ali zahtijeva da nije manje precizan od double tipa. Primjer raspodjele ako je njegova veliina 80 bita: Karakteristika: 15 bita Binarni eksponent: Karakteristika 16383

117

Realne konstante

Primjer realnih konstanti za razliite tipove realnih brojeva: 2.f 1. 1.L 2.34F -1.34e5f 2.34 9e-8 8.345e+25 float double long double

2.34L -2.5e-37L

118

Formatske specifikacije za scanf i printf


#include <stdio.h> int main () { float x; double y; scanf ("%f %lf", &x, &y); printf ("%f %f\n", x, y); return 0; }

119

Upamtite
Kod rjeavanja zadataka, ukoliko u zadatku nije drugaije navedeno, podrazumijevat e se:

za tip podatka float koristi se etiri okteta za tip podatka double koristi se osam okteta

120

Veliina osnovnih tipova podataka


Veliina osnovnih tipova podataka, odnosno koliina memorije koju zauzima jedna varijabla osnovnog tipa ovisi o konkretnoj implementaciji prevodioca.
Tip char, unsigned char, signed char short, unsigned short int, unsigned int long, unsigned long float double long double Veliina 1 oktet 2 okteta 4 okteta 4 okteta 4 okteta 8 okteta 8 (10, 12, 16) okteta

121

Osobitosti C prevodilaca
Veliina prostora za pohranu podatka odreenog tipa nije propisana standardom. Stoga je programeru na raspolaganju operator sizeof, koji za zadani operand izraunava veliinu prostora za pohranu izraenu u oktetima. Operand moe biti naziv tipa podatka ili naziv varijable Primjer:
int var; printf("%d", sizeof(char)); /* ispisuje 1 */ printf("%d", sizeof(var)); /* ispisuje 4 */
122

Rasponi razliitih tipova cijelih brojeva


Deklaracija int signed int short short int signed short int Broj bita 32 32 16 16 16 Interval brojeva [-2147483648, 2147483647] [-2147483648, 2147483647] [-32768, 32767] [-32768, 32767] [-32768, 32767] [0U, 4294967295U] [0U, 65535U] [-2147483648, 2147483647] [-2147483648, 2147483647] [-2147483648, 2147483647] [0U, 4294967295U]

unsigned int 32 unsigned short int 16 long long int signed long int unsigned long int 32 32 32 32

123

Operatori i izrazi

124

Izrazi
Izraz jest kombinacija operatora, operanada (konstante, varijable, ) i zagrada, koja po evaluaciji daje rezultat. Moe biti dio veeg izraza. Primjer:

a + 5

varijabla Primjer:

operator

konstanta

(b + c) / ((d + e) * 4)
125

Pridruivanje vrijednosti varijablama


Pridruivanje vrijednosti: varijabla = izraz;
simbol u pseudokodu u C-u := =

Na primjer:
k := 5 k = 5; 5 aritmetika naredba

to znai naredba ?

k = k + 1;

aritmetiki izraz

126

Primjer pridruivanja: Zadano je X=14.5 i Y= -9.9 . U programu treba ispisati vrijednosti X i Y, a zatim u X staviti vrijednost od Y, a u Y staviti vrijednost od X. Ispisati ponovno X i Y.
ZamjenaVarijabli

int main () { x y p float x, y, p; ??? ??? ??? x= 14.5f; 14.5 ??? ??? y= -9.9f; 14.5 -9.9 ??? printf ("x=%f, y=%f\n", x, y); /* zamijeniti vrijednosti x i y */ 14.5 -9.9 14.5 p=x; -9.9 -9.9 14.5 x=y; -9.9 14.5 14.5 y=p; printf ("Nakon zamjene: x=%f, y=%f\n", x, y); return 0; } x=14.500000, y=-9.900000 Nakon zamjene: x=-9.900000, y=14.500000

127

Osnovni aritmetiki operatori

Operator Znaenje

+ * / %

zbrajanje oduzimanje mnoenje dijeljenje ostatak kod cjelobrojnog dijeljenja (modulo, modulus)

128

Djelovanje aritmetikih operatora na cjelobrojne operande


int a, b; a = 10; b = 3;

Izraz
a a a a a + * / % b b b b b

Rezultat
13 7 30 3 1

129

Djelovanje aritmetikih operatora na realne operande


float a, b; a = 12.5f; b = 2.f;

Izraz
a + b a - b a * b a / b a % b a moe li:

Rezultat
14.5 10.5 25.0 6.25 pogreka 12. % 5
130

Aritmetika s razliitim tipovima operanada


int i; float f; i = 2; f = 2.99f;

to je rezultat operacije i + f 4 ili

4.99

Kada su operandi razliitog tipa, prije obavljanja operacije obavlja se implicitna (automatska) pretvorba tipa rezultata u "vei (vaniji)" od tipova operanada koji sudjeluju u operaciji. U prikazanom primjeru, prije nego se obavi operacija zbrajanja, vrijednost koja se nalazi u varijabli i pretvara se u 2.0 (pri tome sadraj varijable i ostaje nepromijenjen).
131

Implicitna (automatska) pretvorba tipova podataka


Pretvorba tipova podataka u izrazima obavlja se prema jednom od sljedeih 5 pravila. Treba iskoristiti prvo po redu pravilo koje se moe primijeniti na konkretan sluaj! 1. Ako je jedan od operanada tipa long double, preostali operand se pretvara u tip long double 2. Ako je jedan od operanada tipa double, preostali operand se pretvara u tip double 3. Ako je jedan od operanada tipa float, preostali operand se pretvara u tip float 4. Ako je jedan od operanada tipa long, preostali operand se pretvara u tip long 5. Operande tipa short i char pretvoriti u tip int Kada se u izrazima pojavljuju unsigned tipovi, pravila pretvorbe su sloenija i ovise o implementaciji. Zato se ovdje nee razmatrati.

132

Primjeri: implicitna pretvorba tipova podataka


char c; short s;
Operacija ld * i c % i s / f f - ld li % i i * f d + c s - c

int i; long li;

float f; double d;

long double ld;

Pretvorba tipa prije obavljanja operacije


sadraj od i long double sadraj od c int sadraj od s float sadraj od f long double sadraj od i long sadraj od i float sadraj od c double sadraj od s int sadraj od c int

Prema pravilu

1. 5. 3. 1. 4. 3. 2. 5.
133

Primjeri: implicitna pretvorba tipova podataka


float f1, f2; int i1, i2; /* pretpostavka int: 4 okteta */ char c1, c2; f1 = 32000.5f; f2 = 1.0f; i1 = 2147483647; i2 = 1; c1 = 127; c2 = 1;

Izraz
f1 f1 i1 i1 c1 + + + + + f2 i2 i2 f2 c2

Rezultat
32001.5 32001.5 -2147483648 2147483648.0 128

tip rezultata
float float int float int
134

Pretvorba tipova kod pridruivanja


Vrijednost s desne strane pretvara se u tip podatka varijable ili izraza s lijeve strane znaka za pridruivanje
Primjer: int i; float f; i = 2.75;

/* 2.75 se pretvara u int */

f = 2147483638;

Potrebno je obratiti pozornost da se pri promjeni tipa podatka moe "izgubiti" manji ili vei dio informacije. U gornjem primjeru:
"izgubljene" su decimale 0.75 kod prvog pridruivanja, tj. ispisom vrijednosti varijable i dobilo bi se 2 f sadri vrijednost za 10 veu od one koja je pridruena, tj. ispisom vrijednosti varijable f dobilo bi se 2147483648.

135

to kada varijabli pridruimo "prevelik" broj


char c1, c2, c3; unsigned char c4; float f1, f2; c1 = 80; c2 = 150; c3 = 300; c4 = 150; f1 = 332.345282347f; "previe binarnih znamenaka" f2 = 1.0e40f; izvan doputenog raspona 80 printf("%d\n", c1); printf("%d\n", c2); -106 printf("%d\n", c3); 44 printf("%d\n", c4); 150 printf("%20.15f\n", f1); 332.345275878906250 printf("%f\n", f2); 1.#INF00
136

Eksplicitna (zadana) pretvorba tipa podataka


Opi oblik zadane (eksplicitne) pretvorbe (eng. cast operator) glasi: (tip_podatka) operand Operand moe biti varijabla, konstanta ili izraz. Zadana pretvorba podataka ima vii prioritet od automatske. Primjer: int i = 2000000000; double d1, d2; d1 = 2 * i; d2 = 2 * (double)i;

-294967296.000000 4000000000.000000

137

Cjelobrojno dijeljenje
Potrebno je obratiti pozornost na "neeljene" rezultate kod cjelobrojnog dijeljenja. Ukoliko se na primjer u realnu varijablu a eli pridruiti vrijednost , sljedea naredba pridruivanja nee varijabli a pridruiti vrijednost 0.5: a = 1 / 2; U izrazu s desne strane jednakosti oba su operanda cjelobrojnog tipa, pa e se obaviti cjelobrojno dijeljenje. Rezultat tog izraza je 0 (uz ostatak 1). Za izbjegavanje cjelobrojnog dijeljenja potrebno je koristiti zadanu pretvorbu tipa (dovoljno samo na jednom operandu) ili zadati konstante tako da je barem jedna realna: a = (float) 1 / 2; ili a = 1. / 2; ili a = 1 / 2.; U prvom sluaju koritena je zadana pretvorba tipa Napomena: operanda (mogla se uporabiti i nad drugim operandom). U drugom i treem sluaju, dodavanjem toke, konstanta je postala realna te se dijeljenje obavlja u realnoj domeni.
138

Cjelobrojno dijeljenje

Primjer: Koliko iznosi: a) 9 / 4 Rjeenje: 2 (cjelobrojno dijeljenje)

b) 9 % 4

Rjeenje: 1 (ostatak cjelobrojnog dijeljenja 9 : 4 = 2 i ostatak 1)

139

Prioritet osnovnih aritmetikih operatora

1. * / % 2. + Ako u izrazu ima vie operatora jednakog prioriteta, izraunavaju se slijeva nadesno. Na primjer: 2 + 3 / 2 * 4 - 5 * 6 % 8 2 + 2 + 6 0 1 * 4 4 30 % 8 6 6
140

Koritenje okruglih zagrada

Kada treba koristiti okrugle zagrade ? a) ako se eli promijeniti ugraeni redoslijed izvoenja operacija b) u sluaju vlastite nesigurnosti c) radi bolje itljivosti programa 2 + 3 / (2 * 4) - 5 * (6 % 8) -28

141

Primjeri

Koliki je rezultat sljedeeg izraza: 5 + 5 + 5 + 5 + 11 10 / 3 * ( 8 6 ) 10 / 3 * 2 3 * 2 6

142

Primjeri
Koju e vrijednost poprimiti varijable i, x, c int i; double x, c, d; nakon naredbi: d = 6.0; i = (int)(d + 1.73); x = i / 2; c = (double)i / 2; Rjeenje: i = 7, x = 3.0, c = 3.5
143

Primjeri
Koje su vrijednosti i tipovi izraza nakon evaluacije:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

3 / 2 * 2 3 / 2 * 2. 3 / 2. * 2 3 / (float)2 * 2 (double)3 / 2 (double)(3 / 2) 2+0.5 * 4 (2 + 0.5) * 4 (int)(0.5 + 2) * 4 (int)1.6 + (int)1.6 (int)(1.6 + 1.6)

144

Primjer: Uitati vrijednosti za cjelobrojne varijable i, j i k te ispisati njihove vrijednosti i aritmetiku sredinu.
#include <stdio.h> int main () { int i, j, k; float sredin; scanf ("%d %d %d", &i, &j, &k); sredin = (i + j + k) / 3.f; printf ("Aritm. sredina je %f", sredin); return 0; }

145

Rezultat izvoenja programa


Ulazni podaci: 1 2 4 Ispis na zaslonu:

Aritm. sredina je 2.333333

146