You are on page 1of 31

Sadržaj predavanja 02

• Cjelobrojni tip podataka


• Realni tip podataka
• Aritmetički operatori Obavezno čitanje literature:
• Izrazi
• Operatori inkrement i dekrement Skripta : strane: 16 - 26 + 96 - 106
• Kontrola toka programa
• Naredba za jednostruki izbor
• Naredba za dvostruki izbor Napomena: dio gore navedenih
• Naredba za višestruki izbor stranica iz skripte sadrži i koncepte
• Ponavljanje naredbi/petlja for koji neće biti obrađeni na ovom
predavanju. Studentima se savjetuje
da ipak pročitaju i taj dio.
+
• Primjeri koji ilustriraju sve uvedene
koncepte
Cjelobrojni tip podataka(1/3)

• Cjelobrojni tip podataka može imati slijedeće prefikse:

- signed omogućuje pridruživanje i pozitivnih i negativnih vrijednosti;

- unsigned omogućuje pridruživanje samo pozitivnih vrijednosti;

- long omogućuje da se proširi raspon cjelobrojnih vrijednosti koje

varijabla može poprimiti;

- short sužava raspon cjelobrojnih vrijednosti koje varijabla može

poprimiti.

• Cjelobrojni tip deklariran sa prefiksom long omogućuje veću preciznost u odnosu na


deklaraciju ka je korišten prefiks short.

• Pretpostavljeni prefiks cjelobrojnog tipa je signed.


Cjelobrojni tip podataka(2/3)

• Pretpostavim da int zauzima dva bajta.


• To znači da ta varijabla može poprimiti vrijednosti između:

-32768 i 32767
• Na primjer, neka je stanje u 16-bitnom registru:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

• Uz pretpostavku da je korišten zapis dvojnog komplementa vrijedi:

- ako je varijabla deklarirana kao signed int vrijednost varijable je -1.

- ako je varijabla deklarirana kao unsigned int vrijednost varijable

je 65535=216-1.
Cjelobrojni tip podataka(3/3)

• ANSI C ne postavlja ograničenja na preciznost prikaza varijabli koristeći


prefikse short i long, pri čemu ipak vrijedi:

prec(short)  prec(int)  prec(long)


gdje prec označava preciznost, odnosno broj cifri.
int

signed short precizan prikaz


deklaracije
unsigned long cjelobrojnih
varijabli
short
long
• Primjeri nekih ekvivalentnih deklaracija su grupirani zajedno:

signed long int a; unsigned short int a; signed int a;


long int a; unsigned short a; int a;
signed long a;
long a;
Primjer uticaja prefiksa na cjelobrojnu varijablu

#include <stdio.h>

int main()
{
int a;
unsigned int b;
a=-1;
b=a;
printf(“\n a=%d b=%u”,a,b);
return 0;
}
• Izvođenje ovog programa daje rezultat:
a = -1 b = 65535 (uz pretpostavku da tip int u konkretnoj implementaciji C-a
zauzima 16 bitova)

a = -1 b = 4294967295 (uz pretpostavku da tip int u konkretnoj implementaciji C-


a zauzima 32 bita)
Realni tip podataka(1/3)

• U programiranju često imamo potrebu deklarirati varijablu koja modelira neku


fizikalnu veličinu ili neku drugu vrstu podatka realnim brojem.

• Ti brojevi su često “vrlo mali” i “vrlo veliki”.

• Obično za prikaz velikih i malih brojeva koristimo slijedeću notaciju:


jedno decimalno mjesto isperd tačke
eksponent

34542000=3.4542·107

• Slično se mogu prikazati i binarni brojevi.


• Na primjer:

0.000000101=1.01·2-7

1010.11=1.01011 ·23
• Ovakav zapis brojeva nazivamo normalizirani zapis.
Realni tip podataka(2/3)

Na prvom mjestu
0.000000101=1.01·2 -7
je uvijek jedinica.

1010.11=1.01011 ·23
• Kod gore prikazanog načina zapisa binarnih brojeva, na prvom mjestu je
uvijek jedinica.

•To znači, da se ta jedinica ne mora niti zapisivati jer je možemo


podrazumijevati. Na taj način se štedi jedan bit, što doprinosi većoj
preciznosti.

•Taj bit se naziva skriveni bit (eng. hidden bit)


Realni tip podataka(3/3)

float
precizan prikaz
deklaracije varijabli
double realnog tipa

long

• Primjeri mogućih deklaracija:

- float a;
- double b;
- long double c;
IEEE standard zapisa realnih brojeva
(IEEE-Institute of Electrical and Electronics Engineers)

P K M
31 30 23 22 0

• P označava predznak (1 bit)

- 1 negativan broj

- 0 pozitivan broj

• K označava karakteristiku (8 bitova)

- binarni eksponent+127
- raspon binarnog eksponenta je -126 - 127
- raspon karakteristike je 0 - 255

• M označava mantisu, pri čemu se vodeća jedinica ne zapisuje (23 bita).


Primjer prikaza realnog broja tipa float

• Potrebno je odrediti prikaz broja 6.625 koji je pridru\en varijabli


deklariranoj kao float.
6.625(10) = 110.101(2)

•Binarni broj dalje možemo zapisati na slijedeći način:


110.101=1.10101•22

• Izračunajmo karakteristiku:
K= 2 + 127=129
129(10) =10000001(2)

• Nakon izbacivanja vodeće jedinice i tačke za mantisu dobivamo:10101


• Prema tome, broj 6.625 kao tip float će biti zapisan na slijedeći način:
0 10000001 10101000000000000000000
Šta je sa zapisom broja 0?

• Pošto je u normaliziranom zapisu vodeća uvijek jedinica, postavlja se pitanje


kako prikazati broj 0.
• Vrjedi slijedeći dogovor:

Kada su svi bitovi karakteristike i svi bitovi mantise jednaki nuli, onda se
radi o prikazu realnog broja 0.

• Gornji dogovor ima za posljedicu da postoje “pozitivna nula” i “negativna nula”, pri
čemu su oba prikaza ravnopravna. Dogovor je da se pri usporedbi ta dva prikaza
smatraju jednakim.

“pozitivna nula” 00000000000000000000000000000000


“negativna nula” 10000000000000000000000000000000

predznak
karakteristika mantisa
Zapis +, - i “not a number”

Prikaz “broja” + je:

0 11111111 00000000000000000000000
• Svi bitovi mantise su 0, karakteristika ima vrijednost 255, a bit predznaka je 0.
Prikaz “broja” - je:
1 11111111 00000000000000000000000

• Svi bitovi mantise su 0, karakteristika ima vrijednost 255, a bit predznaka je 1.

• Gore prikazani brojevi se najčešće dobiju zbog dijeljenja s nulom.


Neki specijalni slučajevi

• Ako karakteristika ima vrijednost 255, te postoje bitovi mantise koji nisu 0, onda se
zapis klasificira kao
not a number (nije broj)
• Ovakav zapis se može dobiti zbog toga što je prilikom izvođenja neke operacije
došlo do greške.

• Primjer zapisa klasificiranog kao not a number:

0 11111111 10000000000000000000001

• Postoje i specijalni slučajevi kada je vrijednost karakteristike 0, a postoje bitovi


mantise koji nisu nula.
• Takav zapis nazivamo “denormalizirani zapis”
• Ne podrazumijeva da je skriveni bit jednak 1 i smatra se da je vodeći bit mantise 0.
• Vrijednost eksponenta je -126 (ne koristi se formula K=binarni eksponent +127)
• Primjer: 0 00000000 01010000000000000000000 (=0.0101•2-126)
Aritmetički operatori

• Binarni operatori:

+ sabiranje
- oduzimanje
* množenje
/ dijeljenje
% modulo

• Operator modulo (%) daje ostatak cjelobrojnog dijeljenja.


• Može se primijeniti samo na cjelobrojne tipove podataka.
Izrazi

• Izrazi se sastoje od operatora, operanada i zagrada.


• Svaki izraz daje neki rezultat.
• Primjeri izraza:

2*x+5
(a+b)/2
• Brojevi 2 i 5 u gornjim izrazima su konstante.
• Znakovi {*, +, /} predstavljaju operatore
• Varijable x, a i b predstavlaju varijable,odnosno, operande.

Za pridruživanje vrijednosti varijablama koristi se znak =.

Na primjer, slijedeća naredba:


i=10;
varijabli i pridružuje vrijednost 10.
Šta radi naredba i=i+1; ?

• Naredba i=i+1; je jedna od najčešče korištenih naredbi u programiranju.

• Pošto kod početnika uperator pridruživanja unosi određene dileme jer ih podsjeća na
značenje znaka = u matematici, na ovom mjestu bi ta zabuna trebala da se ukloni.

• Značenje naredbe
i=i+1;
je:

“Pridružiti novu vrijednost varijabli i a ta nova vrijednost se dobije tako da se trenutna


vrijednost te varijable uveća za 1”.

……. …….
i 8 9
….. …..
Primjer (operator modulo)

#include <stdio.h>

int main()
{
int a,b,o;
a=7;
b=3;
o=a%b;
printf(“\n Ostatak dijeljenja %d i %d je %d.“,a,b,o);
return 0;
}
Izvođenjem programa dobit će se:

Ostatak dijeljenja 7 i 3 je 1.
Prioritet operatora

• Prioritet operatora *, / i % je viši od operatora + i -.


• Na primjer, u izrazu:

x=a/b+c*d

prvo će se izvesti operacije dijeljenja i množenja, a nakon toga i operacija


sabiranja.

• Kod operatora s istim prioritetom, izvršavanje operacija ide od lijeve strane


prema desnoj.

• Prioritet izvođenja operacija se može mijenjati upotrebom zagrada.

• Na primjer, u izrazu:

s=(x*(a-b)+1)/2

operacija dijeljenja će biti izvedena posljedna.


Operatori inkrement i dekrement

• Unarni opertori.

++ operator inkrement - uvećaj za jedan;


-- operator dekrement- umanji za jedan.

• Mogu se pisati iza ili ispred varijable.

x=x+1; x++;

x=x-1; x--;

• Na primjer, iza odsječka programa:


….
x=15;
x++;

vrijednost varijable x je 16.
•Isto vrijedi i u slučaju da je umjesto x++ napisano ++x.
Operatori inkrement i dekrement u izrazima

U izrazima nije svejedno da li operatori ++ i -- stoje ispred ili iza varijable.

• O položaju operatora u odnosu na varijablu ovisi kada će se vrijednost varijable


povećati(++) ili smanjiti(- -).

• Ako operator stoji ispred varijable, onda se vrijednost varijable prvo promijeni a
zatim se promijenjena vrijednost koristi u izrazu.

• Ako operator stoji iza varijable, onda se u izrazu uzima trenutna vrijednost
varijable, a tek nakon izračunavanja izraya se promijeni vrijednost varijable.

• Na primjer, neka je x=100. Izračunavanjem izraza:

y=++x;

vrijednost varijable x će se prvo povećati za 1, a zatim će se ta vrijednost pridružiti


varijabli y.

• Dakle, varijabla y će poprimiti vrijednost 101.


Operatori inkrement i dekrement u izrazima(2/2)

• Suprotno, izračunavanjem izraza:

y=x++;
varijabli y će se pridružiti vrijednost varijable x (a to je 100), a zatim će se povećati za
1 vrijednost varijable x.

• Vrijednost varijable y nakon izračunavanja gornjeg izraza je 100, dok je vrijednost


varijable x tada 101.
• Prikladnim odabirom operatora inkrement i dekrement može se povećati
razumljivost programskog koda.
• Operatori ++ i -- se ne mogu primijeniti na konstante i na aritmetičke izraze.

• To znači da su slijedeći izrazi pogrešni:

(2*x+y)++

5.672++
Kontrola toka programa

………….
• Kod proceduralnih programskih jezika naredbe se
izvršavaju sekvencijalno, a to znači redoslijedom
kojim su napisane. Naredba n

• Naredbe za kontrolu toka programa omogućuju:


- ponavljanje jedne ili više naredbi; Naredba n+1
- preusmjeravanje toka programa.

Naredba +2

…………..
Naredba za jednostruki izbor

• Opći oblik naredbe za jednostruki izbor je: ………….

if (uvjet)
{ NE
blok naredbi; uvjet
}

DA
• Uvjet može biti bilo koji aritmetički ili logički izraz.
• Blok naredbi može imati jednu ili više naredbi. blok narebi
• Uvjet je istinit ako je rezultat izraza različit od nule.
• Ako je uvjet istinit, blok naredbi se izvršava.
• U suprotnom, naredbe koje se nalaze u bloku se preskaču.
………….
Primjer(naredba za jednostruki izbor)

#include <stdio.h>
int main()
{
int a,b;
printf(“\n Unesite prvi cijeli broj”);
scanf(“%d”,&a);
printf(“\n Unesite drugi cijeli broj”);
scanf(“%d”,&b);
if (a==b)
{
printf(“\n Unijeli ste iste brojeve”);
}
}

Šta bi bilo kad bi uvjet glasio a=b, a za unos u program je:


1. a=10, b=3
2. a=0, b=0
Naredba za dvostruki izbor

………….
• Opći oblik naredbe za jednostruki izbor je:

if (uvjet) DA NE
uvjet
{
blok naredbi1;
}
blok narebi 1 blok narebi 2
else
{
blok naredbi2;
}
………….
• Uvjet može biti bilo koji aritmetički ili logički izraz.
• Ako je uvjet ispunjen (vrijednost izraza je različita od 0, izvršava se blok naredbi1 i
preskače blok naredbi2.
• U suprotnom(uvjet nije ispunjen, tj. izraz ima vrijednost 0), izvršava se blok narebi2,
a preskače se blok naredbi1.
Primjer (naredba za dvostruki izbor)

#include <stdio.h>
int main()
{
int br;
printf(“\n Unesite cijeli broj”);
scanf(“%d”,&br);
if (br%2)
{
printf(“\n Unijeli ste neparan broj”);
}
else
{
printf(“\n Unijeli ste paran broj”);
}
return 0;
}
Višestruki izbor
(if-else if-else)

Opći oblik pisanja naredbi za višestruki izbor je:

if (uvjet 1)
{
• Ovakav oblik naredbi if-else if-else
blok naredbi 1;
} omogućava uzastopno ispitivanje niza
else if (uvjet 2) uvjeta.
{
blok naredbi 2; • Ako je bilo koji uvjet istinit (različit od nule)
} izvršava se blok naredbi pridružen tom
……………..
else if (uvjet n-1) uvjetu, dok se svi ostali blokovi naredbi
{ preskaču
blok naredbi n-1;
} • Broj uvjeta nije ograničen
else
• Uvjet može biti logički ili aritmetički izraz
{
blok naredbi n;
}
Primjer (program za rješavanje kvadratne jednadžbe)

#include <stdio.h> Uključuje se datoteka math.h u kojoj


je definicija funkcije pow() koja je
#include <math.h>
korištena u programu.

int main()
{
float a, b, c, x1, x2, x1Re, x2Re, x1Im, x2Im, t, D;

printf(”\n Unesite koeficijente kvadratne jednadzbe a,b,c:");


scanf("%f %f %f", &a,&b,&c);
D=b*b -4.0*a*c; /* diskriminanta */
if (D > 0)
{
t = sqrt(D); Blok naredbi koji će
x1 = (-b + t)/(2*a); se izvršiti ako je
x2 = (-b - t)/(2*a); diskriminanta D
printf (”\n Rjesenja su: x1=%f pozitivna
x2=%f\n", x1, x2);
}
Nastavak primjera programa za rješavanje kvadratne jednadžbe

else if (D == 0)
{
x1 = -b/(2*a);
printf (”\n Rjesenja su: x1=x2=%f\n", x1);
}
else Blok naredbi koji će
{ se izvršiti ako je
diskriminanta D
t = sqrt(-D);
jednaka nuli
x1Re = -b/(2*a);
x2Re = x1Re;
x1Im = t/(2*a);
x2Im = -x1Im;
printf (”\n Rjesenja su: x1 = (%f,%f)\n", x1Re, x1Im);
printf (” x2 = (%f,%f)\n", x2Re, x2Im);
Blok naredbi koji će
}
se izvršiti ako je
return 0; diskriminanta D
} negativna
Programska petlja for

Opći oblik programske petlje for:


for (izraz1;izraz2;izraz3)
{
blok naredbi;
}
• Ispitivanje uvjeta izlaza iz petlje se ispituje na početku.

•To znači da postoji mogućnost da se blok naredbi ne izvede niti jednom.

• izraz1 pridružuje kontrolnoj varijabli petlje početnu vrijednost. Ovaj izraz se izvršava
samo jednom. Ako trebamo všše naredbi u izrazu, onda ih odvajamo zarezom

• izraz2 predstavlja izraz kojim se provjerava da li kontrolna varijabla petlje ispunjava


uvjet izlazka iz petlje. Provjera se vrši prije svake iteracije.

• izraz3 definira na koji način se mijenja kontrolna varijabla. Izraz se izvršava nakon
svakog prolaska kroz petlju. Ako trebamo više naredbi u izrazu, odvajamo ih zarezom.
Primjer
• Ispis na monitoru niza brojeva od 1 do 10

#include <stdio.h>

int main()
{
int broj;
for(broj=1; broj<=10; broj++)
printf(“%d”, broj);
return 0;
}

• Iza naredbe for nema oznake početka bloka naredbi, jer se blok naredbi u ovom
primjeru sastoji od samo jedne naredbe, pa tada oznake početka i kraja bloka
naredbi nisu potrebne.

You might also like