You are on page 1of 71

Programiranje

ETVRTO PREDAVANJE

ITERACIJA FOR, NAREDBE PRESKOKA,


ARITMETIKI I BITOVNI OPERATORI
Iteracije i naredbe preskoka
ULAZ: Prirodni broj N i N decimalnih
brojeva A1, ..., An
IZLAZ: Aritmetika sredina brojeva A1
do An

2
Iteracije i naredbe preskoka
ULAZ: Prirodni broj N i N decimalnih brojeva A1, ...,
An
IZLAZ: Aritmetika sredina brojeva A1 do An
1. Uitaj N.
2. S=0
3. I=1
4. Dok je IN radi
5. Uitaj Ai
6. S = S + Ai
7. I=I+1
8. Ispii S/N

3
Iteracije i naredbe preskoka
#include <iostream>
using namespace std;
int main () {
Uitaj N.
S=0
I=1
Dok je IN radi
Uitaj Ai
S = S + Ai
I=I+1
Ispii S/N
return 0;
}

4
Iteracije i naredbe preskoka
#include <iostream>
using namespace std;
int main () {
unsigned int N;
cout << "Upisite N: ";
cin >> N;
float A, S = 0;
3. I=1
4. Dok je IN radi
cout << "Upisite broj A_"
<< I << ": ";
cin >> A;
S = S + A;
7. I=I+1
cout << "Aritmeticka sredina je "
<< S/N << endl;
return 0;
}

5
Naredba preskoka goto
#include <iostream>
using namespace std;
int main () {
unsigned int N;
cout << "Upisite N: "; Oznake (labele) u
cin >> N; programu
float A, S = 0;
int I = 1;
jos: if (I > N) goto kraj;
cout << "Upisite broj A_"
<< I << ": ";
cin >> A; Preskok na navedenu
S = S + A; oznaku (labelu)
I = I + 1;
goto jos;
kraj:cout << "Aritmeticka sredina je "
<< S/N << endl;
return 0;
}

6
Naredbe preskoka
Naredbe preskoka, ma koje one bile,
treba izbjegavati u programiranju jer
smanjuju itljivost programa i
oteavaju njegovo odravanje.

7
Iteracije
U programskim jezicima postoje
programski konstrukti koji omoguuju
da se neki programski blok ponavlja
vie puta.
Takvi se programski konstrukti
nazivaju iteracije ili petlje.

8
Iteracija tipa for
Prva je iteracija u programskom
jeziku iteracija tipa for ili iteracija s
eksplicitnim brojaem.
Uz ovu se iteraciju vezuje jedna
cjelobrojna varijabla koja se u
svakom koraku iteracije automatski
mijenja. Ta se varijabla naziva broja
petlje.

9
Iteracija tipa for
Sintaksa

for (inicijalna vrijednost; uvjet zavrsetka; promjena)


blok naredbi

I = 1 I <= N I = I + 1

Logiki izraz koji Izraz prema kojem


Pridruivanje inicijalne treba biti ispunjen se u svakom
vrijednosti brojau kako bi se tijelo petlje sljedeem koraku
petlje (blok naredbi vezan uz mijenja broja petlje
petlju) izvrio
10
Iteracija tipa for
Kako radi iteracija tipa for?
Kada se prvi puta naie na glavu iteracije
Prema prvom izrazu se inicira broja petlje
Ako je drugi izraz zadovoljen, izvri se tijelo
petlje i vraa se na glavu petlje, a inae se
preskae tijelo petlje i ide se na prvu naredbu
iza tijela petlje
Prilikom povratka na glavu petlje
Promijeni se vrijednost brojaa prema treem
izrazu u glavi petlje
Ako je drugi izraz zadovoljen, izvri se tijelo
petlje i vraa se na glavu petlje, a inae se
preskae tijelo petlje i ide se na prvu naredbu
iza tijela petlje

11
Iteracija tipa for
#include <iostream>
using namespace std;
int main () {
unsigned int N;
cout << "Upisite N: ";
cin >> N;
float A, S = 0; Ovo se moe izvesti
int I; uinkovitije!
for (I = 1; I <= N; I = I + 1) {
cout << "Upisite broj A_"
<< I << ": ";
cin >> A;
S = S + A;
}
cout << "Aritmeticka sredina je "
<< S/N << endl;
return 0;
}

12
Operatori pridruivanja
Kako bi se poveala uinkovitost promjene
vrijednosti varijable koja ovisi o staroj
vrijednosti u programskom jeziku C++
dodani su operatori pridruivanja koji ne
pridruuju vrijednost desne strane izraza
lijevoj, ve novu vrijednost izraunavaju
tako da izvedu aritmetiku operaciju kojoj
je jedan operand lijeva, a drugi desna
strana izraza

13
Operatori pridruivanja
S = S + A S += A
S = S - A S -= A
S 12 S = SA * A 5
17 S 17
12 A
S *= A 5
S = S / A S /= A
S = S % A S %= A
Mem 17

Nastavlja se...
14
Iteracija tipa for
#include <iostream>
using namespace std;
int main () {
unsigned int N;
cout << "Upisite N: ";
cin >> N;
float A, S = 0;
int I;
for (I = 1; I <= N; I = I + 1) {
cout << "Upisite broj A_"
<< I << ": ";
cin >> A;
S = S + A;
}
cout << "Aritmeticka sredina je "
<< S/N << endl;
return 0;
}

15
Iteracija tipa for
#include <iostream>
using namespace std;
int main () {
unsigned int N;
cout << "Upisite N: ";
cin >> N;
float A, S = 0; Ovo se moe izvesti
int I; jo uinkovitije!
for (I = 1; I <= N; I += 1) {
cout << "Upisite broj A_"
<< I << ": ";
cin >> A;
S += A;
}
cout << "Aritmeticka sredina je "
<< S/N << endl;
return 0;
}

16
Aritmetiki operatori
C += 1 C++
++C

C C13
-= 1
12 C C-- 13
12
--C

Mem 1

17
Aritmetiki operatori
Ovi su operatori izmeu aritmetikih i
operatora pridruivanja
Svrstavamo ih u aritmetike
operatore jer se mogu koristiti unutar
aritmetikih izraza.

18
Aritmetiki operatori
#include <iostream> #include <iostream>
using namespace std; using namespace std;
16 main () {
int 19 main () {
int
6 6
int C = 5; int C = 5;
int D = 3 * C++ + 1; int D = 3 * ++C + 1;
cout << D << endl; cout << D << endl;
cout << C << endl; cout << C << endl;
return 0; return 0;
} Prvo izraunaj cijeli } Prvo poveaj varijablu
izraz sa starom C za 1, a onda izraunaj
vrijednou varijable izraz
C i onda je poveaj
Za 1
19
Iteracija tipa for
#include <iostream>
using namespace std;
int main () {
unsigned int N;
cout << "Upisite N: ";
cin >> N;
float A, S = 0;
int I;
for (I = 1; I <= N; I += 1) {
cout << "Upisite broj A_"
<< I << ": ";
cin >> A;
S += A;
}
cout << "Aritmeticka sredina je "
<< S/N << endl;
return 0;
}

20
Iteracija tipa for
#include <iostream>
using namespace std;
int main () {
unsigned int N;
cout << "Upisite N: ";
cin >> N;
float A, S = 0;
int I;
for (I = 1; I <= N; I++) {
cout << "Upisite broj A_"
<< I << ": ";
cin >> A;
S += A;
}
cout << "Aritmeticka sredina je "
<< S/N << endl;
return 0;
}

21
Iteracija tipa for
#include <iostream>
using namespace std;
int main () {
unsigned int N;
cout << "Upisite N: ";
cin >> N;
float A, S = 0;
int I;
for (I = 1; I <= N; I++) { to e ispisati ova
cout << "Upisite broj A_" cout naredba?
<< I << ": ";
cin >> A;
S += A;
}
cout << I << endl;
cout << "Aritmeticka sredina je "
<< S/N << endl;
return 0;
}

22
Iteracija tipa for
#include <iostream>
using namespace std;
int main () {
unsigned int N;
cout << "Upisite N: ";
cin >> N;
float A, S = 0;
for (int I = 1; I <= N; I++) {
Ako se broja petlje
cout << "Upisite broj A_" ne koristi izvan petlje
<< I << ": "; nije ga potrebno
cin >> A; definirati izvan
S += A; petlje
}
cout << "Aritmeticka sredina je "
<< S/N << endl;
return 0;
}

23
Iteracija tipa for
ULAZ: Niz decimalnih brojeva A1, ...,
An. Upis brojeva se zaustavlja kada
se upie 0. Sam broj 0 ne ulazi u niz.
IZLAZ: Ispisati maksimalni i
minimalni uneseni broj, kao i koji je
maksimalni i minimalni broj bio
upisan po redu.

24
Iteracija tipa for
ULAZ: Niz decimalnih brojeva A1, ..., An. Upis brojeva se
zaustavlja kada se upie 0. Sam broj 0 ne ulazi u niz
IZLAZ: Ispisati maksimalni i minimalni uneseni broj, kao i
koji je maksimalni i minimalni broj bio upisan po redu.

Dakle, mora se uvati minimalna i maksimalna vrijednost,


ali i vrijednost koju je pri uitavanju te vrijednosti imao
broja.
Svaka e se sljedea uitana vrijednost usporediti s dotad
najveom i najmanjom upisanom te ako je vea od
najvee, ona postaje najvea, a ako je manja od najmanje,
postaje najmanja.
Kako inicirati maksimalnu i minimalnu vrijednost na
poetku petlje?

25
Iteracija tipa for
ULAZ: Niz decimalnih brojeva A1, ..., An. Upis brojeva se
zaustavlja kada se upie 0. Sam broj 0 ne ulazi u niz
IZLAZ: Ispisati maksimalni i minimalni uneseni broj, kao i
koji je maksimalni i minimalni broj bio upisan po redu.

Dakle, mora se uvati minimalna i maksimalna vrijednost,


ali i vrijednost koju je pri uitavanju te vrijednosti imao
broja.
Svaka e se sljedea uitana vrijednost usporediti s dotad
najveom i najmanjom upisanom te ako je vea od
najvee, ona postaje najvea, a ako je manja od najmanje,
postaje najmanja.
Kako inicirati maksimalnu i minimalnu vrijednost na
poetku petlje?
Prva se vrijednost u nizu mora uitati izvan petlje kako bi
se inicirala maksimalna i minimalna vrijednost

26
Iteracija tipa for
ULAZ: Niz cijelih brojeva A1, ..., An. Upis
brojeva se zaustavlja kada se upie 0. Sam
broj 0 ne ulazi u niz.
IZLAZ: Ispisati maksimalni i minimalni
uneseni broj, kao i koji je maksimalni i
minimalni broj bio upisan po redu.
1. Uitaj A
2. IMax = 1
3. IMin = 1
4. Max = A
5. Min = A

27
Iteracija tipa for
6. I = 1
7. Radi
8. Uitaj A
9. Ako je A == 0 idi na 17
10. Ako je (A<Min)
11. Min = A
12. IMin = I
13. Ako je (A>Max)
14. Max = A
15. IMax = I
16. I=I+1

28
Iteracija tipa for
6. I = 1
7. Radi
8. Uitaj A
9. Ako je A == 0 idi na 17
10. Ako je (A<Min)
11. Min = A
12. IMin = I
13. Ako je (A>Max)
14. Max = A
15. IMax = I
16. I=I+1
17. Ispii Min, IMin, Max, IMax

29
Iteracija tipa for
#include <iostream>
using namespace std;
int main () {
int A;
cout << "Upisite A_1: "
<< endl;
cin >> A;
int IMin = 1, IMax = 1,
Min = A, Max = A;

30
Iteracija tipa for
6. I = 1
7. Radi
8. Uitaj A
9. Ako je A == 0 idi na 17
10. Ako je (A<Min)
11. Min = A
12. IMin = I
13. Ako je (A>Max)
14. Max = A
15. IMax = I
16. I=I+1
17. Ispii Min, IMin, Max, IMax

31
Iteracija tipa for
6. I=1
7. Radi
cout << "Upiite A_" <<
<< i << ": ";
cin >> A;
8. Ako je A == 0 idi na 17
if (A < Min) {
Min = A;
IMin = i;
if (A > Max) {
Max = A;
IMax = i;
16. I=I+1

32
Iteracija tipa for
cout << "Min = "
<< Min
<< " na poziciji "
<< IMin << endl;
cout << "Min = "
<< Min
<< " na poziciji "
<< IMin << endl;
return 0;
}

33
Naredba preskoka break
6. I=1
7. Radi
cout << "Upiite A_" <<
Ovdje nam, zapravo,
<< i << ": ";
treba naredba za
cin >> A;
izlaz iz kontrolne
8. Ako je A == 0 idi na 17 strukture tj. naredba
if (A < Min) { break koju smo
Min = A; spominjali proli
IMin = i; puta
if (A > Max) {
Max = A;
IMax = i;
16. I=I+1

34
Naredba preskoka break
6. I=1
7. Radi
cout << "Upiite A_" <<
<< i << ": ";
cin >> A; Ovo je skoro for
if (A == 0) break; petlja, osim to nam
if (A < Min) { nije potreban uvjet
zavretka, ve se petlja
Min = A;
mora izvravati sve
IMin = i;
dok je ne zaustavi
if (A > Max) { break naredba
Max = A;
IMax = i;
16. I=I+1

35
Naredba preskoka break
for (int i = 1; true; i++) {
cout << "Upiite A_" <<
<< i << ": ";
cin >> A;
if (A == 0) break;
Izrazi u glavi for petlje
if (A < Min) {
koji nisu potrebni mogu
Min = A; se izostaviti. Ako se
IMin = i; izostavi logiki izraz,
if (A > Max) { smatra se da je uvijek
Max = A; true
IMax = i;
}

36
Naredba preskoka break
for (int i = 1;; i++) {
cout << "Upiite A_" <<
<< i << ": ";
cin >> A;
if (A == 0) break;
if (A < Min) {
Min = A;
IMin = i;
}
if (A > Max) {
Max = A;
IMax = i;
}
}

37
Naredba preskoka break
Skokovi se u programima trebaju
izbjegavati jer smanjuju itljivost
programa
U switch selekciji se ne moe izbjei
break skok, no u petljama moe.

38
Iteracija tipa for
for (int i = 1; A != 0; i++) {
cout << "Upiite A_" <<
<< i << ": ";
cin >> A;
if (A != 0) {
if (A < Min) {
Min = A;
IMin = i;
}
if (A > Max) {
Max = A;
IMax = i;
}
}
}

39
Iteracija tipa for
ULAZ: Pozitivni cijeli broj N
IZLAZ: Ispisati true ako je N prost
broj, odnosno false ako nije.

40
Iteracija tipa for
ULAZ: Pozitivni cijeli broj N
IZLAZ: Ispisati true ako je N prost
broj, odnosno false ako nije.

Broj je prost ako je djeljiv samo sa 1 i


sa samim sobom
Dakle, treba provjeriti djeljivost broja
sa cijelim brojevima...
Do kojeg broja?
41
Iteracija tipa for
ULAZ: Pozitivni cijeli broj N
IZLAZ: Ispisati true ako je N prost
broj, odnosno false ako nije.

kl = N, l k k sqrt(N)!

42
Naredba preskoka continue
#include <iostream>
#include <cmath>
using namespace std;
int main () {
int N; Jo jedna naredba preskoka
bool prost = true; koja preskae ostatak tijela
cout << "Upisite N: ";
petlje do zavretka petlje.
cin >> N;
for (int k = 2; k <= sqrt(N); k++) { Ona odmah zapoinje novi
if (N%k) continue; korak petlje.
prost = false;
break;
}
if (prost)
cout << "Broj " << N
<< " je prost broj.";
else
cout << "Broj " << N
<< " nije prost broj.";
return 0;
}

43
Naredba preskoka continue
Jedino se kod switch selekcije ne
mogu izbjei naredbe preskoka.
Prema tome, u ovom se primjeru
naredba preskoka moe izbjei.

44
Naredba preskoka continue
#include <iostream>
#include <cmath>
using namespace std;
int main () {
int N;
bool prost = true;
cout << "Upisite N: ";
cin >> N;
for (int k = 2; k <= sqrt(N); k++) {
if (N%k) continue;
prost = false;
break;
}
if (prost)
cout << "Broj " << N
<< " je prost broj.";
else
cout << "Broj " << N
<< " nije prost broj.";
return 0;
}

45
Iteracija tipa for
#include <iostream>
#include <cmath>
using namespace std;
int main () {
int N;
bool prost = true;
cout << "Upisite N: ";
cin >> N;
for (int k = 2; k <= sqrt(N); k++) {
if (N%k == 0) {
prost = false;
}
}
if (prost)
cout << "Broj " << N
<< " je prost broj.";
else
cout << "Broj " << N
<< " nije prost broj.";
return 0;
}

46
Primjer 1 - Igra
Napravimo igru u kojoj e raunalo zamisliti
jedan cijeli broj od 1 100 i dozvoliti igrau da
10 puta pogaa koji je broj zamiljen.
Ako igra unese preveliki broj, raunalo vraa poruku
"Broj je prevelik"
Ako igra unese premalen broj, raunalo mora vratiti
poruku "Broj je premalen"
Ako igra unese toan broj, raunalo vraa poruku
"Pogodili ste u I pokusaja! Bravo!"
U sluaju da igra ne pogodi toni broj u 10
pokuaja, treba vratiti poruku "Nazalost niste pogodili
u 10 pokusaja. Broj je bio B"

47
Primjer 1 - Igra
1. Zamisli B
2. Radi za (i=1..10)
3. Uitaj A
4. Ako je A>B ispii "Broj je prevelik"
5. Ako je A<B ispii "Broj je premalen"
6. Ako je A=B
7. ispii "Pogodili se u " I " pokusaja! Bravo!"
8. prekini rad programa
9. Ispii "Nazalost, niste pogodili u 10 pokusaja. Broj
je bio " B

48
Primjer 1 Igra
#include <iostream>
#include <cstdlib>
using namespace std;
int main () {
Zamisli B
Radi za (i=1..10)
Uitaj A
Ako je A>B ispii "Broj je prevelik"
Ako je A<B ispii "Broj je premalen"
Ako je A=B
ispii "Pogodili se u " I " pokusaja! Bravo!"
prekini rad programa
Ispii "Nazalost, niste pogodili u 10 pokusaja. Broj je bio " B
system("pause");
return 0;
}
49
Primjer 1 Igra
#include <iostream>
#include <cstdlib>
using namespace std;
int main () {
unsigned short A,B;
Zamisli B
for (int i = 1; i <= 10; i++) {
cout << "Upisite broj: ";
cin >> A;
if (A > B) cout << "Broj je prevelik" << endl;
if (A < B) cout << "Broj je premalen" << endl;
if (A == B) {
cout << "Pogodili ste u " << i
<< " pokusaja! Bravo!" << endl;
8. prekini rad programa
}
cout << "Nazalost, niste pogodili u 10 pokusaja. Broj je bio "
<< B << "." << endl;
system("pause");
return 0;}

50
Primjer 1 Igra
#include <iostream>
#include <cstdlib>
using namespace std;
int main () {
unsigned short A,B;
Zamisli B
for (int i = 1; i <= 10; i++) {
cout << "Upisite broj: ";
cin >> A;
if (A > B) cout << "Broj je prevelik" << endl;
if (A < B) cout << "Broj je premalen" << endl;
if (A == B) {
cout << "Pogodili ste u " << i
<< " pokusaja! Bravo!" << endl;
system("pause");
return 0;
}
}
cout << "Nazalost, niste pogodili u 10 pokusaja. Broj je bio "
<< B << "." << endl;
system("pause");
return 0;
}

51
Primjer 1 Igra
Funkcija rand() vraa sluajni cijeli broj izmeu 0 i
RAND_MAX.
rand() je dio cstdlib biblioteke.
RAND_MAX je najee jednak INT_MAX, tj. 32767, no to
moe biti i razliito, ovisno o C++ prevodiocu i raunalu.
Kako dobiti brojeve izmeu 0 i 100?
Moglo bi se jednostavno izraunati ostatak od dijeljenja
broja sa 100 i dodati 1.
Meutim, kako broj 32767 nije djeljiv s 100, time bismo
dobili malo eu pojavu manjih brojeva.
Najuniformniju razdiobu dobit emo ako dijelimo cjelobrojno
rand() s RAND_MAX / 99, no onda emo dobiti brojeve od 0
do 99, pa dobivenom broju treba dodati 1.

52
Primjer 1 Igra
#include <iostream>
#include <cstdlib>
using namespace std;
int main () {
unsigned short A,B;
B = rand()/(RAND_MAX / 99) + 1;
for (int i = 1; i <= 10; i++) {
cout << "Upisite broj: ";
cin >> A;
if (A > B) cout << "Broj je prevelik" << endl;
if (A < B) cout << "Broj je premalen" << endl;
if (A == B) {
cout << "Pogodili ste u " << i
<< " pokusaja! Bravo!" << endl;
system("pause");
return 0;
}
}
cout << "Nazalost, niste pogodili u 10 pokusaja. Broj je bio "
<< B << "." << endl;
system("pause");
return 0;
}

53
Primjer 1 Igra
Funkcija rand() vraa pseudosluajne brojeve.
Pseudosluajni brojevi nisu brojevi koji se odabiru nasumce, ve se
svaki sljedei izraunava iz prethodnoga tako da brojevi izgledaju
sluajni.
Zato je vano da se pseudosluajnom nizu na neki nain odredi
promjenjivi prvi element, koji se naziva sjeme (seed) pseudosluajnog
niza.
Postoji procedura srand(unsigned int) koja odreuje sjeme
pseudosluajnog niza.
No, kako odrediti promjenjivo sjeme?
Kao sjeme moemo staviti vrijednost sistemskog brojaa (iako to i nije
najbolji nain... kada je Netscape napravio isto to za svoj algoritam
kriptiranja, razbijen je 12 min nakon to je doao na trite)
Funkcija time(*t_time) vraa broj sekundi koje su protekle od
1.1.1970. po UTC (po Greenwichu).
Funkciju emo koristiti s argumentom 0.
time je dio ctime biblioteke.
Problem je to prvi broj kojeg vraa rand() funkcija direktno ovisi o
unesenom sjemenu, pa e se vrlo malo mijenjati kroz vrijeme.
Potrebno je uzeti drugu po redu vrijednost koju vraa rand() funkcija.
54
Primjer 1 Igra
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main () {
unsigned short A,B;
srand(time(0));
rand(); Prvi broj u nizu
B = rand()/(RAND_MAX / 99) + 1; pseudosluajnih
for (int i = 1; i <= 10; i++) {
cout << "Upisite broj: "; brojeva izraunava
cin >> A;
if (A > B) cout << "Broj je prevelik" << endl;
se izravno iz
if (A < B) cout << "Broj je premalen" << endl; sistemskog vremena
if (A == B) {
cout << "Pogodili ste u " << i pa e se mijenjati
<< " pokusaja! Bravo!" << endl;
system("pause");
vrlo malo prilikom
return 0; opetovanog poziva
}
} programa.
cout << "Nazalost, niste pogodili u 10 pokusaja. Broj je bio "
<< B << "." << endl;
system("pause");
return 0;
}

55
Primjer 2 Fibbonaccijev niz
ULAZ: Prirodni broj N
IZLAZ: Ispisati FN koji je definiran kao

F0 = F1 = 1
Fk = Fk-1 + Fk-2, za k>1

56
Primjer 2 Fibbonaccijev niz
ULAZ: Prirodni broj N
IZLAZ: Ispisati FN koji je definiran kao

F0 = F1 = 1
Fk = Fk-1 + Fk-2, za k>1

F2 = 2, F3 = 3, F4 = 5, F5 = 8, ...
F0 5
8 F1 13
8 F 13

57
Primjer 2 Fibbonaccijev niz
Trebat e nam dvije pomone
varijable u kojima emo uvati
prethodne dvije vrijednosti iz
Fibbonaccijevog niza.
Kada se izrauna nova vrijednost,
onda se posljednja mora upisati u
pretposljednju, a novoizrraunata u
posljednju.

58
Primjer 2 Fibbonaccijev niz
#include <iostream>
using namespace std;
int main() {
unsigned short N;
unsigned int F0 = 1, F1 = 1, F;
cout << "Unesite N: ";
cin >> N;
for (int i = 2; i <= N; i++) {
F = F0 + F1;
F0 = F1;
F1 = F;
}
cout << "F_" << N << " = " << F1 << endl;
system("pause");
return 0;
}
59
Primjer 3 Ispis broja u
binarnom sustavu
ULAZ: Broj B tipa unsigned short
IZLAZ: Broj B u binarnom zapisu

60
Primjer 3 Ispis broja u
binarnom sustavu
Standardni postupak pretvaranja broja u binarni sustav:
567
283 1
141 1
70 1
35 0
17 1
8 1
4 0
2 0
1 0
0 1
56710 = 10001101112

61
Primjer 3 Ispis broja u
binarnom sustavu
Problem - kako ispisivati ono to izraunavamo naopako?
To jo ne znamo, no to nam ni ne treba!
Ne elimo koristiti standardni postupak koji je ionako
neuinkovit!
Obzirom da je broj u raunalu zapisan u binarnom obliku,
elimo to iskoristiti.
Kako nai prvu znamenku binarnog broja?
Ako je 2kN<2k+1 onda trebamo broj podijeliti s 2k i dobit emo
je.
Kako nai k?
Neemo se ni truditi nai pravi k! Znamo koliko je podatak
velik pa emo krenuti od vodeeg bita podatka.
Npr. kako je unsigned short velik 2 bajta, krenut emo dijeliti
od 215.
62
Primjer 3 Ispis broja u
binarnom sustavu
A kako nai broj 215?
Mogli bismo pomou funkcije pow, no to ne bi bilo
efikasno.
Postoji procesorska instrukcija u svakom procesoru
kojom se to moe efikasno uiniti.
Broj 21510 = 10000000000000002
Dakle, ako broj 110 = 00000000000000012
"pomaknemo" 15 mjesta u lijevo, dobit emo 215.
U C++ se to moe napraviti bitovnim operatorom <<

1 << 15

63
Primjer 3 Ispis broja u
binarnom sustavu
Podijelimo li sada broj s 215 dobit emo njegovu vodeu
binarnu znamenku.
No ni dijeljenje nije uinkovito!
elimo samo provjeriti je li vodea znamenka 0 ili 1.
To moemo provjeriti tako da bitovno konjugiramo
zadani broj s 215.
Ako je vodea znamenka 1, onda emo time dobiti 215, a
ako je 0, dobit emo 0.

1xxxxxxxxxxxxxxx 0xxxxxxxxxxxxxxx
& 1000000000000000 & 1000000000000000
1000000000000000 0000000000000000

64
Primjer 3 Ispis broja u
binarnom sustavu
C++ ima bitovni operator & koji upravo radi ono to je
nama potrebno:
A&B
Dakle ako bitovno konjugiramo broj s 215 i dobijemo bilo
to razliito od 0, znai da taj broj ima vodeu znamenku
1, a inae ima vodeu znamenku 0.
U sljedeem koraku je na isti nain potrebno promatrati
drugu najznaajniju znamenku.
Nju moemo pretvoriti u prvu najznaajniju tako da
pomaknemo bitove upisanog broja za jedno mjesto u
lijevo. Time se najznaajnija znamenka gubi, a druga
najznaajnija postaje vodea.

65
Bitovni operatori u C++
Operator Znaenje Primjer
<< Pomicanje bitova za N mjesta u lijevo A << N
>> Pomicane bitova za N mjesta u desno A >> N
& Bitovna konjunkcija A&B
| Bitovna disjunkcija A|B
~ Bitovna negacija (inverzija bitova) ~A
^ Bitovna ekskluzivna disjunkcija A^B
A B A&B A B A|B A B A^B A ~A
0 0 0 0 0 0 0 0 0 0 1
0 1 0 0 1 1 0 1 1 1 0
1 0 0 1 0 1 1 0 1
1 1 1 1 1 1 1 1 0

66
Primjer 4 Pronalaenje negativne
vrijednosti broja u binarnom zapisu
ULAZ: Broj B tipa unsigned short
IZLAZ: Suprotna vrijednost broja B u binarnom
zapisu

67
Primjer 4 Pronalaenje negativne
vrijednosti broja u binarnom zapisu
ULAZ: Broj B tipa unsigned short
IZLAZ: Suprotna vrijednost broja B u binarnom
zapisu

Ovo se takoer moe napraviti pomou


bitovnih operatora.
Prvo to je potrebno uiniti jest invertirati sve
bitove
Nakon toga je potrebno dodati 1
I na kraju ispisati broj (vidi prethodni zadatak)

68
Primjer 4 Pronalaenje negativne
vrijednosti broja u binarnom zapisu
#include <iostream>
#include <cstdlib>
using namespace std;
int main () {
unsigned short A;
cout << "Upisite B: ";
cin >> A;
A = ~A + 1;
unsigned short B = 1 << 15;
for (short i = 0; i < 16; i++) {
if (A & B)
cout << 1;
else
cout << 0;
A <<= 1;
}
cout << endl;
system("pause");
return 0;
}

69
70
71

You might also like