143
1 Programiranje 1.predavanje Predstavljanje brojeva u memoriji računara Da bi ukazali na razliku predstavljanja brojeva kao teksta i brojeva za računanje, uzećemo ya primer broj 1998 i ASCII kod (7-bitni;zapisuje se sa 8) Da bi se ovaj broj predstavio u ASCII kodu potrebna su nam 4 bajta: 1 00110001 2 31 16 9 00111001 2 39 16 9 00111001 2 39 16 8 00111000 2 38 16 Na ovaj način se predstavlja broj kada je deo teksta. Ali sa ovako predstavljenim brojevima ne može da se računa. Primer: Vlada Jugoslavije zvanićno je procenila da nemačka marka vredi 6,2 a ne 3,3 dinara na koliko je zakovana u novembru 1995 .godine. Za ovaj tekst ne nebitno da li piše 6,2 ili A,B. Ali, ako bi neko želeo da izračuna kolika je procentualna razlika , to ne bi moglo. Za računanje je potrebno da zapis izgleda drugačije tako da brojevi budu zapisani za računanje. Beleženje brojeva u memoriji računara i njihovo kodiranje Dekadni brojni sistem 0 1 2 3 4 5 6 7 8 9 Binarni brojni sistem 0 1 Kodiranje binarnim brojnim sistemom za potrebe računara koristi se potpuni kod (sve reči iste dužine), a ta dužina treba da bude 4. Zašto? Zato što je 2 4 =16 a 2 3 =8 (2 je 0,1), a eksponenti 3 i 4 pokazuju koliko različitih reči može da se napravi koji su dužine 3 tj 4. Nama je potrebno 10, a pošto je 2 3 =8 to nam nije dovoljno za kodiranje 10 simbola, zato 2 4 =16 jeste.

Programiranje - predavanja

Embed Size (px)

DESCRIPTION

Sva predavanja iz Programiranja tokom 2009/2010.godine

Citation preview

Page 1: Programiranje - predavanja

1

Programiranje 1.predavanje

Predstavljanje brojeva u memoriji računara

Da bi ukazali na razliku predstavljanja brojeva kao teksta i brojeva za računanje, uzećemo ya primer broj

1998

i ASCII kod (7-bitni;zapisuje se sa 8)

Da bi se ovaj broj predstavio u ASCII kodu potrebna su nam 4 bajta:

1 001100012 3116

9 001110012 3916

9 001110012 3916

8 001110002 3816

Na ovaj način se predstavlja broj kada je deo teksta. Ali sa ovako predstavljenim brojevima ne može da se računa.

Primer: Vlada Jugoslavije zvanićno je procenila da nemačka marka vredi 6,2 a ne 3,3 dinara na koliko je zakovana u novembru 1995.godine.

Za ovaj tekst ne nebitno da li piše 6,2 ili A,B. Ali, ako bi neko želeo da izračuna kolika je procentualna razlika , to ne bi moglo. Za računanje je potrebno da zapis izgleda drugačije tako da brojevi budu zapisani za računanje.

Beleženje brojeva u memoriji računara i njihovo kodiranje

Dekadni brojni sistem 0 1 2 3 4 5 6 7 8 9

Binarni brojni sistem 0 1

Kodiranje binarnim brojnim sistemom za potrebe računara koristi se potpuni kod (sve reči iste dužine), a ta dužina treba da bude 4. Zašto? Zato što je 24=16 a 23=8 (2 je 0,1), a eksponenti 3 i 4 pokazuju koliko različitih reči može da se napravi koji su dužine 3 tj 4. Nama je potrebno 10, a pošto je 23=8 to nam nije dovoljno za kodiranje 10 simbola, zato 24=16 jeste.

Page 2: Programiranje - predavanja

2

Još jedna osobina POTPUNOST koda. Pošto je 24=16, a 16-10=6 to 6 nam je višak i zato za ovaj kod kažemo da je nepotpun.

Ako imamo 16 reči a nama treba 10, kako ćemo znati da izaberemo tih 10 i dodelimo ih. To može da se uradi na 291010 načina. Samo neki od tih načina imaju smisla, pa od njih ne možemo da kažemo da je jedan najbolji, već ih ima nekoliko.

Osobine za dodeljivanje 16 kodnih reči za 10 simbola:

1. Da bi se obezbedila jednoznačnost koda, sve reči moraju biti različite da bi moglo da se dekodira i to je 1-1 preslikavanje. Svaka cifra se kodira različitom reči.

2. Najvećoj dekadnoj cifri pridruđuje se kodna reč koja ima najveću vrednost.

3. Potrebno je zadržati parnost i neparnost brojeva

4. Ako imamo 2 dekadne cifre p+q=9 (gde p ima binarne kodove y1,y2,y3,y4 a q z1,z2,z3,z4) tako da je njihov zbir najveća cifra dekadnog sistema tj 9, onda su ove binarne cifre (y i z) komplementarne. Kada je ovaj uslov ispunjen kod je komplementaran.

5. ako postoji mogućnost da se svakoj poziciji od ove 4 binarne pridruži pi tako da za svaku cifru dekadnog brojnog sistema ...

pi q←y3y2y1y0 q = p3y3 + p2y2 + p1y1 + p0y0

Kod 8421

0 0000 Koje osobine zadovoljava ovaj kod?

1 0001 1. zadovoljava

2 0010 2. zadovoljava

3 0011 3. zadovoljava

4 0100 4. 0+9=9 0000 i 1001 (prva 0 sa leve i prva 1 sa leve su komplementarne, ali zato druga 0 i drga 0 nisu)

5 0101 5. Ako postoje cifre pi p3p2p1p0 da zapravo predstavljaju težine i da

6 0110 cifra može da se prikaže težinski. Odatle i potiče naziv koda

7 0111 8421.

8 1000 p3=8 p2=4 p1=2 p0=1 Uzmemo npr 6→0110

9 1001 q = p3y3 + p2y2 + p1y1 + p0y0 0*8+1*4+1*2+0*1=6 (zadovoljava)

Page 3: Programiranje - predavanja

3

Ovaj kod 8421 je prirodni dekadni kod decimalnih cifara!

Kod 2421

0 → 0000 Osobine: 1. zadovoljena

1 → 0001 2. zadovoljena

2 → 0010 3. zadovoljena

3 → 0011 4. zadovoljena

4 → 0100 5. zadovoljena

5 → 1011

6 → 1100

7 → 1101

8 → 1110

9 → 1111

4.osobina (dokaz) 0+9=9 0000 1111 ok

1+8=9 0001 1110 ok

2+7=9 0010 1101 ok

3+6=9 0011 1100 ok

4+5=9 0100 1011 ok

5.osobina (dokaz) p3=2 p2=4 p1=2 p0=1 → to su težine

Uzmemo npr cifru 3 → 0*2+0*4+1*2+1*1=2+1=3 ok

7 → 1*2+1*4+0*2+1*1=2+4+1=7 ok

Page 4: Programiranje - predavanja

4

Kada nešto ima neku osobinu mora se pokazati da važi za sve slučajeve, a kada nešto ne važi dovoljan je jedan kontra primer!

Višak tri

0 → 0011 Osobine:

1 → 0100 1.ok

2 → 0101 2.ok

3 → 0110 3.ne

4 → 0111 4.ok

5 → 1000 5.ne

6 → 1001

7 → 1010

8 → 1011

9 → 1100

4. osobina (dokaz) 0+9=9 0011 1100

1+8=9 0100 1011

2+7=9 0101 1010 komplementarnost zadovoljena

3+6=9 0110 1001

4+5=9 0111 1000

5. osobina (dokaz) – ne mogu se naći cifre pi koje bi odgovarale težinama. Ovaj kod nije prirodni binarni kod. Svaka binarna vrednost je uvećana za tri u odnosu na svoju prirodnu vrednost. Najpogodniji je za računanje.

Page 5: Programiranje - predavanja

5

Ciklični kod

0 →0001

1 → 0101 Osobine: 1.ok

2 → 0111 2.ne

3 →1111 3.ne

4 →1110 4.ne

5 →1100 5.ne

6 →1000

7 →1001

8 →1011

9 →0011

4. osobina (dokaz) 0+9=9 0001 0011 (nisu komplementarni)

5. osobina (dokaz) ne postoji pi, nije težinski kod

Kod cikličnog koda cifre se razlikuju za samo jednu vrednost. Nepovoljan je za računanje, pa se koristi za kontrolne operacije.

Page 6: Programiranje - predavanja

6

Programiranje 2.predavanje 14. 10. 2009.

Predstavljanje brojeva za potrebe računanja

Postoje 3 osnovne mogućnosi kodiranja brojeva za potrebe računanja

1. broj se predstavlja u pozicionom binarnom brojnom sistemu 2. broj se predstavlja u pokretnom zarezu (za realne brojeve) 3. koristi se binarno kodiranje cifara

1. način

Prvi način koristimo samo za cele brojeve (nerazlomljene brojeve). Ovaj način koristimo kada imamo npr. broj 1998 i s njim želimo nešto da izračunamo. Imtersuje nas recimo da li je godina 1998. prestupna. To možemo da saznamo ako ovaj broj podelimo sa 4 i vidimo da li ima ostatak.. Ili ako želimo da utvrdimo koje godine je rođena osoba koja je 1998. imala 46 godina.

Da bi smo to uradili treba dekadni broj 1998 pretvoriti u binarni. Ovo ćemo lakše uraditi ako idemo postepeno. Prvo ćemo ga pretvoriti u heksadekadni tako što ćemo ga podeliti sa 16.

1998 : 16 14

124 : 16 12

7 : 16 7

0

Dobijeni rezultat zapisujemo na sledeći način: 7 = 7, 12 = C, 14 = E iz toga sledi da je broj 1998 predstavljen u heksadekadnom sistemu 7CE16. Zatim ćemo heksadekalnu vrednost da predbacimo u binarnu:

7CE16 = 0111 1100 11102

Page 7: Programiranje - predavanja

7

Kada cele brojeve beležimo na ovaj način obično se koriste 2 bajta (short integer) ili 4 bajta (long integer). Celi brojevi se uvek predstavljaju u tom ograničenom prostoru (2 il 4 bajta).

2 bajta = 16 bitova

4 bajta = 32 bita

Opgraničenost u bajtovima utiče i na veličinu broja koji se može zapisati. Ne mogu se zapisivati proizvoljno veliki brojevi jer je prostor za njihovo zapisivanje ograničen.

2 bajta = 16 bitova = E [0, 216 - 1] = [0, 65.535]

4 bajta = 32 bita = E [0, 232 - 1] = [0, 4.294.967.295]

Ovako se radi sa nenegativnim brojevima (0, 1, 2, 3, …)

Ako želimo da radimo sa celim brojevima mora postojati način da se zabeleže i negativni brojevi. To ćemo uraditi tako što će se za bit najveće težine odredi znak koji će ukazivati na to da li se radi o pozitivnom ili negativnom broju (1 – negativan broj, 0 – pozitivan broj)

Pozitivan broj

7710 = 100 11012

Broj 100 11012 možemo da napišemo i u dužini od 2 bajta pa će pre njega biti nule.

0000 0000 0100 11012

Negativan broj

Page 8: Programiranje - predavanja

8

-7710 prikazan binarnom vrednošću dužine 2 bajta na bitu najveće težine imaće 1.

7710

1000 0000 0100 11012 → ovo je negativan broj

Na ovaj način smanjili smo broj mogućnosti predstavljanja brojeva na pola.

[ 0, 215 - 1 ] = 32.767

[ 0, 231 - 1 ] = 2.147.483.647

Postoje 2 nedostatka ovakvog beleženja negativnih brojeva

1. Za 0 koja nije ni pozitivna ni negativna postojala bi dva načina predstavljanja:

0|000 0000 0000 0000 kao pozitivna 0

1|000 0000 0000 0000 kao negatvna 0

Ovakvo zapisivanje 0 je vrlo negativno sa stanovišta kodiranja, jer znamo da kodiranje treba da predstavlja preslikavnja 1 – 1, odnosno da se svakom broju dodeljuje samo jedna vrednost koda. U ovom slučaju ne postoji 1 – 1 preslikavanje jer 0 ima pridružene dve vrednosti

2. Sa ovakvim beleženjem brojeva operacija sabiranja je veoma složena na skupu celih brojeva. Za sabiranje 2 cela broja neophodno je ustanoviti da li su predznaci isti, jer

Page 9: Programiranje - predavanja

9

ako su predznaci isti i dobijena vrednost ima isti predznak.

(+77) + (+13) = +90 → sabiranjen apsolutnih vrednosti i dobijena vrednost 90 dobija isti predznak.

(-77) + (-13) = -90 → sabiranjen apsolutnih vrednosti i dobijena vrednost 90 dobija isti predznak

ako brojevi nemaju isti predznak onda od onog broja koji ima veću apsolutnu vrednost oduzmemo broj manje apsolutne vrednosti, a dobijena vrednost će dobiti predznak broja veće apsolutne vrednosti.

(+77) + (-13) = +64

(-77) + (+13) = -64

Ovakav načina rada nije prihvatljiv za rad u računarima. Iz tog razloga se za kodiranje negativnih celih brojeva koriste drugačiji zapisi. Pa ćemo npr. dekadne cifre zapisivati korišćenjem nepotpunog komplementa.

NEPOTPUNI KOMPLEMENT

Da bi se dobio nepotpuni komplement potrebno je da se broj dopuni do najveće cifre datog brojnaog sistema N-1. Zatim se ovako dobijeni nepotpuni komplement potom koristi za beleženje negativnog broja.

za dekadni brojni sistem

N = 10

N-1 = 9

Page 10: Programiranje - predavanja

10

357 dopunjavamo svaku cifru do 9

↓↓↓

642 i dobijamo nepotpuni komplement broja 357

za binarni brojni sistem

N = 2

N-1 = 1

010 0110 dopunjavamo svaku cifru do 1

↓↓↓ ↓↓↓↓

101 1001 i dobijamo nepotpuni komplement.

Ovo je u binarnom brojnom sistemu veoma jednostavno jer samo obrnemo cifre.

POTPUNI KOMPLEMENT

On se dobija isto kao i nepotpuni kompliment samo kada se sve cifre dopune do cifre najveće vrednosti u datom brojnom sistemu na kraju se još doda 1.

za dekadni brojni sistem

svaka se cifra dopuni do 9 i doda se 1.

Page 11: Programiranje - predavanja

11

N = 10

N-1 = 9

357 dopunjavamo svaku cifru do 9

↓↓↓

NK 642 + 1

PK 643 → potpuni komplement

za binarni brojni sistem

N = 2

N-1 = 1

010 0110 dopunjavamo svaku cifru do 1

↓↓↓ ↓↓↓↓

NK 101 1001 + 1

PK 101 1010 → potpuni komplement

SABIRANJE U NEPOTPUNOM KOMPLEMENTU

Sabiranje se vrši tako što se sabiraju dva broja uključujući i pozicioni znak, a ako je u međurezultatu bilo prenosa on se odbaci ali se zatim doda na poziciju najmanje težine.

1.PRIMER

276 + (-372) = -96

Page 12: Programiranje - predavanja

12

276 = 00276 → nule ukazuju na čunjenicu da se radi o pozitivnom broju

(-372) = 99627 → nepotpuni komplement (devetke ukazuju na čijenicu da se radi o negativnom broju)

00276

+ 99627 saberemo dva broja i utvrdimo da nemamo prenos

-----------

99903 devetke na početku dobijene vrednosti ukazuju na se radi o negativnom broju i

zatim njemu odredimo nepotpuni komplement i dobijemo rešenje.

-96

2. PRIMER

276 + (-92) = 184

00276 pozitivan broj 276

+ 99902 negativan broj -92 zapisan kao nepotpuni komplement

------------

(1)00183 = 184 prenos iz međuzbira se dodaje na poziciju najmanje težine.

SABIRANJE U POTPUNOM KOMPLEMENTU

Page 13: Programiranje - predavanja

13

Da bi smo dobili potpuni komplement negativnu vrednist prvo prebacimo u nepotpuni komplement i dodamo mu 1.

1. PRIMER

276 + (-372) = -96

276 = 00276 → nule ukazuju na čunjenicu da se radi o pozitivnom broju

(-372) = 99628 → 99627 +1 = 99628

dopunjavanjem svih cifara negativnog broja -372 do 9 dobili smo

99627, odnosno nepotpuni komplement i kada njemu dodamo 1

dobićemo 99628, odnosno potpuni komplement.

00276

+ 99628

-----------

99904 u toku sabiranja nije bilo prekoračenja (prenosa), ali se na osnovu devetki vidi da se

radi o negativnom broju. Zato za njega treba da odredimo nepotpuni komplement

kom cemo dodati 1 kako bi smo dobili potpuni komplement.

= -(00095 + 1) = -96

Page 14: Programiranje - predavanja

14

2. PRIMER

276 + (-92) = 184

00276

+ 99908 → nepotpuni implement broja -92 je 99907 i kada mu dodamo 1 dobijamo potpuni

------------ implement 99908

(1)00184 = 184 nule ispred broja ukazuju na to da se radi o pozitivnom broju.

ovde prenos jednostavno brišemo

i nigde ga ne dodajemo.

Celi brojevi predstavljaju se u pozicionom binarnom sistemu, s tim što se negativni predstavljaju

u potpunom komplementu.

Razlozi zašto se u računanju primrnjuje potpuni komplement su sledeći (3 razloga):

1. RAZLOG

- (-a) = +a

Page 15: Programiranje - predavanja

15

Negativna vrednost neke negativne vrednosti daje pozitivnu vrednost

Dva puta primenjena operacija vraća vrednost na početak

+ 77 0000 0000 0100 1101

NK 1111 1111 1011 0010 + 1

PK 1111 1111 1011 0011 = -77 ako bi hteli da promenimo znak primenjujemo

opet potpuni komplement.

↓↓↓↓↓↓↓↓↓↓↓

NK 0000 0000 0100 1100 + 1

PK 0000 0000 0100 1101 = +77

Kada smo dva puta primenili operaciju potpunog komplementa dobili smo početnu vrednost.

2. RAZLOG

Kada se radi sa potpunim komplementom ne postoje dva načina za prikazivanje nule.

Page 16: Programiranje - predavanja

16

0 → 0000 0000 0000 0000

-0 NK 1111 1111 1111 1111 + 1

PK (1)0000 0000 0000 0000 prenos odbacujemo

a potpunim komplementom dobijamo

početnu vrednost.

3. RAZLOG

Računanje korišćenjem potpunog komplementa je veoma jednostavno.

+77 → 0077

+13 → 0013

-77 → 9923 = 9922 +1 – nepotpuni komplement + 1

-13 → 9987 = 9986 +1 – nepotpuni komplement + 1

(+77) + (+13) = 0077 + 0013 = 0090 = +90

NK PK

(-77) + (-13) = 9923 + 9987 = (1)9910 = 0089 +1 = 0090 (= -90)

(+77) + (-13) = 0077 + 9987 = (1)0064 = +64

Page 17: Programiranje - predavanja

17

NK PK

(-77) + (+13) = 9923 + 0013 = 9936 = 0063 + 1 = 0064 (= -64)

Potrebno je samo prebaciti negativne brojeve u potpuni komplement i onda se operacija sabiranja lako izvršava.

Primeri sabiranja sa binarnim vrednostima

+77 0000 0000 0100 1101

+13 0000 0000 0000 1101

-77 NK 1111 1111 1011 0010 + 1

PK 1111 1111 1011 0011

-13 NK 1111 1111 1111 0010 + 1

PK 1111 1111 1111 0011

0000 0000 0000 0000 124 64 32 16 8 4 2 1

(+77) + (+13) 0000 0000 0100 1101

+ 0000 0000 0000 1101

---------------------------------

Page 18: Programiranje - predavanja

18

0000 0000 0101 1010

64 + 16 + 8 + 2 = 90

(-77) + (-13) 1111 1111 1011 0011

+ 1111 1111 1111 1111

----------------------------------

(1) 1111 1111 1010 0110

NK 0000 0000 0101 1001 + 1

PK 0000 0000 0101 1010

64 + 16 + 8 + 2 = -90

(+77) + (-13) 0000 0000 0100 1101

+ 1111 1111 1111 0011

---------------------------------

(1) 0000 0000 0100 0000

= 64

(-77) + (+13) 1111 1111 1011 0011

+ 0000 0000 0000 1101

---------------------------------

1111 1111 1100 0000

Page 19: Programiranje - predavanja

19

NK 0000 0000 0011 1111 + 1

PK 0000 0000 0100 0000

= - 64

Najznačajnija osobina je što se beleženje negativnih brojeva u računaru vrši u obliku potpunog komplementa. Tako da svi pozitivni brojevi u 16. bitu imaju 0, a svi negativni brojevi u 16. bitu imaju 1. Kada se negativni broj pretvori u potpuni komplement dalje sabiranje je potpuno uobičajeno binarno sabiranje, a eventualni prenos se odbacuje (briše).

Opseg brojeva u:

2 bajta = 16 bitova = [ -215, +215 - 1] = [ -32.768, +32.767]

4 bajta = 32 bita = [ -231, +231 - 11] = [-2.147.483.648, +2.147.483.647]

Postoje jedna dobra i jedna loša osobina ovakvog predstavljanja celih brojeva.

Dobra osobina – brzina (efikasnost) rada jako velika

Loša osovina – zato što je interval brojeva ograničen.

Page 20: Programiranje - predavanja

20

Programiranje 3.predavanje 21. 10. 2009.

Predstavljanje brojeva za potrebe kodiranja

(nastavak)

Postoje tri načina predstavljanja brojeva

1. predstavljanje celih brojeva u potpunom komplementu 2. predstavljanje realnih brojeva u pokretnom zarezu 3. binarno kodiranje dekadnih cifara

1. U POTPUNOM KOMPLEMENTU predstavljaju se celi brojevi kodnim rečima od 2 ili 4 bajta. To znači da na ovaj način mogu biti predstavljeni brojevi u određenom intervalu.

Opseg brojeva u:

2 bajta = 16 bitova = [ -215, +215 - 1] = [ -32 768, +32 767]

4 bajta = 32 bita = [ -231, +231 - 1] = [-2 147 483 648, +2 147 483 647]

Postoje jedna dobra i jedna loša osobina ovakvog predstavljanja celih brojeva.

Dobra osobina – brzina (efikasnost) rada jako velika

Loša osovina – interval brojeva je ograničen.

2. Realni brojevi imaju neke svoje principe predstavljanja. Beleže se u formatu POKRETNOG ZAREZA i to kodnim rečima od:

Page 21: Programiranje - predavanja

21

4 bajta = 32 bita

8 bajtova = 64 bita

Na engleskom se ovaj način beleženja zove Floating point notation (beleženje pokretnom tačkom)

Broj u pokretnom zarezu predstavlja se na sledeći način: ± m * Re

eksponent

± m * Re

predznak broja

osnova

mantisa

(normalizovana)

Koristimo normalizovanu mantisu: 0,1 < m < 1

Na primeru dekadnog brojnog sistema možemo videti predstavljanje brojeva u fiksnom (nepokretnom) i pokretnom zarezu.

Broj 12,045

Page 22: Programiranje - predavanja

22

Ako bi za predstavljanje broja 12,045 koristili beleženje nepokretnim zarezom morali bi da znamo koliko cifara imamo isp red, a ko liko iza zareza. U slu čaju da imamo 4 cifre pre i 6 cifara posle zareza predstavljanje broja bi izgledalo ovako:

+ 0012.045000

a prikazivanje istog broja u formatu pokretnog zareza izgledalo bi ovako

+ 0.12045 * 10+2 eksponent +2 stara se o veličini broja i ovde kaže da se zarez pomera

za dva mesta kako bi smo dobili tačnu vrednost broja

Broj – 0,000004

- 0000.000004 → fiksni zarez

- 0.4 * 10-5 → pokretni zarez

Zašto ovako zapisujemo?

Treba pre svega napomenuti da se za

beleženje broja uvek koristi fiksni memorijski prostor.

Pokretni zarez prilagođava broj onim potrebama koje trenutno imamo bilo da su u pitanju veliki, bilo da su u pitanju mali brojevi.

Page 23: Programiranje - predavanja

23

Ako posmatramo brojeve - 0,00000412 i - 0,00000498 vidimo da se radi o brojevima kod kojih su razlike u vrednostima izuzetno male. Ipak ako je postojala potreba da se u izračunavanju ide ovoliko daleko u detalje, gde su i ovako male razlike važne, verovatno je od velikog značaja da se one mogu i zabeležiti.

Ako bi smo koristili fiksni zarez sa 4 cifre ispred i 6 cifara iza zareza videli bi smo da ne postoji razlika koja je kod prethodnih vrednosti bila iskazana

- 0,00000412 → 0000,000004 fiksni zarez

- 0,00000498 → 0000,000004 fiksni zarez

Ako bi smo koristili pokretni zarez videli bi smo da se vidi razlika u vrednostima

- 0,00000412 → - 0.412 * 10 -5

- 0,00000498 → - 0.498 * 10 -5

Broj + 32 560 000

+ 0000.000000 fiksni (nepokretni) zarez

+ 0,3256 * 10+8 pokretni zarez

Page 24: Programiranje - predavanja

24

Ni u pokretnom zarezu mantisa ne može da ima neograničen broj cifara. Mantisa je uvek ograničena. U slučaju da mantisa ima pet cifara pogledajmo kako će biti predstavljeni brojevi:

32 560 001 → +0,32560 * 108

32 569 983 → +0,32569 * 108 (ovde bi po pravilu broj 69 trebalo

zaokružiti na 70)

Vidimo da neke cifre, očigledno, nisu predstavljene.

1. binarni broj

Pokretni zarez je sistem za beleženje realnih brojeva u memoriji računara.

Mantisa može da bude prikazana kao:

2. dekadni broj pa binarno kodiran 3. heksadekadni broj pa binarno kodiran

Mantisa može da bude različito predstavljena od ekponenta (jedno može da bude predstavljeno dekadno, a drugo binarno)

Eksponent pokazuje o kolikom broju je reč, odnosno ukazuje na dužinu broja.

Osnova je ono što je sistem odabrao, može da bude 2, 10 ili 16 (binarna, dekadna ili heksadekadna osnova)

Page 25: Programiranje - predavanja

25

Predznak se koristi da bi se utvrdilo da li je reč o pozitivnom ili negativnom broju.

Najčešći format predstavljanja pokretnog zareza je:

EEE format – u ovom formatu mantisa je zapisana u binarnom brojnom sistemu.

Ako za EEE format koristimo 4 bajta onda se:

• bit najveće težine koristi za predznak – bit 31 • sledećih 8 bitova koristi se za eksponent – bitovi od 23 do 30 • sledeća 23 bita se koriste za mantisu – bitovi od 0 do 22

• bit najveće težine koristi za predznak – bit 63

| ± | eksponent | mantisa |

31 30 23 22 0

Ako za EEE format koristimo 8 bajtova onda se:

• sledećih 11 bitova koristi se za eksponent – bitovi od 52 do 62 • sledeća 52 bita se koriste za mantisu – bitovi od 0 do 51

| ± | eksponent | mantisa |

63 62 52 51 0

Page 26: Programiranje - predavanja

26

Odgovor na pitanje koliki broj mesta je predviđen za cifre kod beleženja brojeva u pokretnom zarezu, odnosno koliko cifara može biti predstavljeno, odnosno koliko precizno broj može biti zabeležen možemo videti iz sledećeg primera:

Ako koristimo 4 bajta – opseg je {0,29 * 10-38, 0,17 * 10+39}

Ako koristimo 8 bajtova – opseg je {0,55 * 10-308, 0,2 * 10+309}

Za beleženje brojeva u potpunom komplementu:

u 4 bajta – opseg je {-2 147 483 648, +2 147 483 647} = 1010 (broj ukupno različitih reči)

Za beleženje brojeva u pokretnom zarezu u EEE formatu

• kod celih brojeva, svi brojevi u utvrđenom intervalu predstavljaju potpuno tačno (ovde se radi o konačno mnogo brojeva)

:

u 4 bajta – opseg je 1038 (broj ukupno različitih reči)

Ako u 4 bajta (32 bita) ima ukupno različitih reči 232 što je približno jednako 1010, postavlja se pitanje kako onda možemo nekada u tom ograničenom prostoru da predstavimo 1010 različitih reči, a nekada 1038

različitih reči. Razlog je taj što se:

• kod realnih brojeva beleže samo neki potpuno tačno, dok se ostali beleže približno tačno, odnosno beležimo 232 realna broja tačno, a ostale beležimo približno tačno. (ovde se radi o beskonačno mnogo brojeva)

Mantisa

• pri beleženju u 4 bajta tačno možemo da predstavimo 6 do 7 cifara od svakog realnog broja

je ta koja nam govori koje brojeve možemo potpuno tačno da predstavimo

Page 27: Programiranje - predavanja

27

• pri beleženju u 8 bajtova broj cifara će biti veći i potpuno tačno će moći da se beleži 15 cifara.

Najveći ceo broj tačno prikazan u potpunom komplementu, u 4 bajta, je + 2 147 438 647, taj isti broj predstavljen kao realni broj u pokretnom zarezu, u 4 bajta, je + 0,214743 * 1010. To znači da je u pokretnom zarezu tačno prikazano samo 6 cifara

Ovi realni brojevi 2 147 430 001

2 147 430 002

2 147 430 003 bili bi prikazani približno tačno i to u sledećem obliku:

+ 0,214743 * 1010

Prikazivanje brojeva u pokretnom zarezu ima svojih prednosti i nedostataka:

• Prednost je što možemo da beležimo brojeve iz većeg opsega • Mana je što ne možemo sve da ih beležimo potpuno tačno, već za neke možemo da odredimo

samo približnu vrednost.

Zapisivanje u potpunom komplementu i pokretnom zarezu su pogodna za razna inženjerska i naučna istraživanja jer ta izračunavanja moraju biti efikasna. Međutim postoje neka izračunavanja gde ova dva načina beleženja ne mogu da budu primenjena, kao što je slučaj sa finansijama, jer:

• Potpuni komplement ima ograničenje od 4 bajta pri čemu se vrednosti veće od 2 147 438 647 ne mogu beležiti, što za finansijske transakcije nije dobro.

• Pokretni zarez, s druge strane, omogućava beleženje brojeva iz većeg opsega, ali za mnoge od tih brojeva možemo da odredimo samo približnu vrednost, što je u radu sa finansijama nedopustivo.

Za rad sa finansijama efikasnost nije od presudnog značaja ali preciznost jeste, pa se realni i celi brojevi predstavljaju u obliku binarno kodiranih dekadnih cifara.

3. BINARNO KODIRANJE DEKADNIH CIFARA – BCD (Binary Coded Decimal)

Pri ovom beleženju svaka se cifra binarno kodira pa se simulira decimalno računanje na binarnim ciframa.

I ovde postoje prednosti i mane:

Page 28: Programiranje - predavanja

28

• Prednosti • mogu se predstaviti sve cifre nekog broja • pretvaranje iz dekadnih u binarne brojeve je vrlo jednostavno

• Mana • efikasnost je manja nego kod potpunog komplementa i pokretnog zareza.

Broj +498,12

0101 0100 | 0101 1001 | 0101 1000 | 0101 0001 | 1010 0010

zonski 4 zonski 9 zonski 8 zonski 1 + 2

deo deo deo deo

Ovako prikazan broj zauzima 5 bajtova i zove se neupakovani format, jer u svakom bajtu beležimo po jedan broj i to tako što u donjoj polovini bajta beležimo vrednost cifre koristeći kod 8421 odnosno prirodni binarni kod dekadnih cifara.

Gornja polovina bajta, zonski deo, je uvek isti, samo je u poslednjoj cifri gornji deo bajta promenjen i može biti:

• + (1010) za pozitivan broj • − (1011) za negativan broj

Ovaj način prikazivanja brojeva se zove neupakovani format, zato što po jedan polubajt kod svake cifre sem kod poslednje, ne služi ničemu. Za predstavljanje broja +489,12 u neupakovanom formatu potrebno je 5 bajtova.

Jednostavan je za korišćenje jer koristi ASCII kod

0011 0100 0011 1001 0011 1000 0011 0001 0011 0010

4 9 8 1 2

Da bi zapis bio upakovan zapisivaćemo samo polubajtove koji označavaju vrednosti broja i na kraju ćemo staviti oznaku za pozitivan, odnosno negativan broj. Za predstavljanje broja +489,12 u upakovanom formatu potrebna su 3 bajta. Podaci o decimalnom zarezu i broju cifara posebno se beleže.

Page 29: Programiranje - predavanja

29

+498,12

0100 | 1001 | 1000 | 0001 | 0010 | 1010

4 9 8 1 2 +

−498,12

0100 | 1001 | 1000 | 0001 | 0010 | 1011

4 9 8 1 2 −

Primer sabiranja kodom 8421 u binarno kodiranim dekadnim ciframa

389 + 129 = 518 Sabiramo binarno ali za svaku cifru

pojedinačno moramo ili ne moramo

0011 1000 1001 389 da vršimo korigovanje. Korigovanje

+ 0001 0010 1001 129 se vrši u slučaju da imamo prekora-

----------------------------- čenje dekadne cifre, tj. ako imamo

x 0100 x1011 (1)0010 heksadekadnu vrednost ili ako smo

+ 0110 0110 imali prenos. U oba ova slučaja takvoj

------------------------------ cifiri dodajemo vrednost 6.

Page 30: Programiranje - predavanja

30

0101 (1)0001 1000 518

Kod višak 3 je najpogodniji kod za računanje.

389 + 129 = 518 Heksadekadni prenos se poklapa

sa dekadnim prenosom.

0110 1011 1100 389

+ 0100 0101 1100 129 Gde imamo prenos dodajemo 3

--------------------------------

x 1011 (1) 0001 (1)1000 Gde nemamo prenos oduzimamo 3

- 11 + 11 + 11

---------------------------------

1000 0100 1011 518

5 1 8

2 + 5 = 7 2 = 0101 5 = 1000 7 = 1010

0101

+ 1000

-----------

1101 = ( 13 = 7 + 6 ) Pošto u zbiru imamo prekoračenje oduzimamo 3

– 11

-----------

1010 = ( 10 = 7 + 3 )

Page 31: Programiranje - predavanja

31

2 + 8 = 10 2 = 0101 8 = 1011

0101

+ 0101

-----------

(1)0000

+ 11

-----------

(1)0011

Za rad sa negativnim brojevima: dekadni komplement je isto što i binarni komplement

Dekadni Binarni

komplement komplement

+ 129 0100 0101 1100

870 NK 1011 1010 0011

+ 1

-------------------------

– 129 PK 1011 1010 0100

Page 32: Programiranje - predavanja

32

NK – nepotpuni komplement

PK – potpuni komplement

Programiranje 4.predavanje 28. 10. 2009.

Programski jezici i algoritmi

Programski jezici su tesno povezani sa algoritmima

Jezički prevodoci su primer opšteg softvera koji obezbeđuju da se neki jezici prevedu na mašinski jezik koji kao takav računar može da pročita.

Algoritmi su skup dobro definisanih pravila i instrukcija koji služe za rešenje problema u konačnom broju korka. Odnosna ta pravila i instrukcije služe da se posle konačnog broja koraka dođe do željenog rešenja.

Izražavanje algoritama moguće je iskazati potpuno običnim govorom u svakodnevnom životu (jedan primer algoritma iskazan običnim govorom su recepti, koji služe da neko od tačno utvrđenih sastojaka u tačno utvrđenom broju koraka pripremi određeno jelo, koje će biti ukusno samo ako su dobijene instrukcije tačne i ako se one u toku pripreme poštuju, u suprotnom takvo jelo neće valjati.) Ipak takvo izražavanje algoritma računar ne može da sledi, odnosno razume. Zato se za potrebe računara algoritam izražava nečim što je strože i formalnije utvrđeno i što računar može da sledi, tumači i prepozna.

Programski jezici služe kao nešto što postoji na pola puta između čoveka i računara. Programski jezici su čoveku prilagođeni, lako ih može savladati, a dovoljno su formalni i strogo zasnovani da ih računar može zapisati. Postoje razni nivoi programskih jezika.

Jezički procesori prevode ono što je čovek napisao u nekom višem programskom jeziku u instrukcije na mašinskom jeziku koje procesor može da razume.

Zapis prolazi kroz 2 faze:

1. Algoritam se prevodi u formalni zapis i taj deo uradi čovek 2. Taj formalno zapisan program prevodi se u mašinski čitljiv oblik i postaje predmet obrade

jezičkih procesora i na kraju obrade postaje izvršni program. (u obliku dokumenta koji se može pokrenuti i izvršiti ali se ne može čitati kao doc)

Page 33: Programiranje - predavanja

33

Programski jezici mogu biti različitog nivoa.

Postoje 4 različita nivoa programskih jezika:

MAŠINSKI JEZIK – jezik koji je jedini razumljiv računaru. Sastoji se od instrukcija tog konkretnog računara, uslovno rečeno od dva stanja. Odnosno sastoji se od jedinica i nula (1, 0), kojima se zapisuju instrukcije, kako bi ih računar raumeo. Ovaj jezik je veoma efikasan, ali i veoma težak da bi se njime pisalo. Ipak kada bi se koristio mašinski jezik za programiranje on ne bi zahtevao prevodioca.

ASEMBLERSKI JEZICI – bliski su mašinskom tipu jezika. Svaki procesor ima svoj jezik i oni se od tipa do tipa procesora razlikuju. Za pisanje instrukcija ne koriste se jedinice i nule (1, 0), već su instrukcije zamenjene nekim skraćenicama. Instrukciju sabiranja zapisujemo skraćenicom add, a za instrukciju premeštanja podataka sa memorijske lokacije u neki registar procesora koristimo skracenicu move, itd. Asemblerski jezici dozvoljavaju da se memorijskim adresama mogu dati imena. Programiranje ovim jezicima i dalje nije ni malo lako i on su namenjeni profesionalcima koji dobro poznaju jezik konkretnog procesora. Kada programer zapisuje program na samblerskom jeziku za potrebe računara, on mora da bude preveden na mašinski jezik. To se postiže posebnim programima koji se zovu asembleri. Asemblerima mogu na mašinski jezik da budu prevedeni samo oni programi koji su tačno i precizno napisani na asemblerskom jeziku. Asemblerski jezik formalno mora da bude zapisan kako treba i bez greške da bi bio preveden.

Specifičnost asemblerskih jezika je da su oni samo stepenicu iznad mašinskih. Jedna instrukcija napisana na asemblerskom jeziku odgovara jednoj instrukciji zapisanoj na mašinskom jeziku.

III GENERACIJA PROGRAMSKIH JEZIKA – početkom 60-tih godina 20. veka razvijaju se viši (razvijeniji) programski jezici. Ovi progrmi se ne vezuju za procesor. Standardizovani su na međunarodnom nivou (ISO standardi). Prvi jezik treće generacijee bio je FORTRAN.

Za ove programe postoje opšte prihvaćena pravila i ona mogu da se primene na svakom računaru. Ali za svaki konkretan procesor (tip računara) treba da postoji specifičan prevodilav, koji će da prevede opšte prihvaćen programski jezik (npr. FORTRAN). Efikasnost programskih jezika treće generacija je veća u odnosu na mašinski i asemblerski programski jezik, jer jedna naredba odnosno instrukcija u nekom od jezika treće generacije (npr. FORTRAN-u) može da zameni i do 100 instrukcija u mašinskom jeziku. I nije potrebno da progamer poseduje bilo kakvo znanje o procesoru.

Postoji veliki broj jezika treće generacije

1. FORTRAN – programski jezik namenjen samo profesionalcima – za naučno-tehničke programe.

:

2. COBOL (COmmon Business-Oriented Language) (kobol)– programski jezik za poslovne programe.

Page 34: Programiranje - predavanja

34

3. BASIC (Beginner's All Purpose Symbolic Instruction Code) (bejzik) – programski jezik namenjen personalnim računarima. Ovo je 1. programski jezik namenjen neprofesionalcima. Mogu ga koristiti čak i deca.

4. PASCAL (paskal) – 1. školski programski jezik, nije namenjen za neko veliko programiranje, ali je formalno zasnovan i izuzetno precizan

5. PROGRAMSKI JEZIK C – pravi je jezik profesionalaca. Programski jezik C je u osnovi svih programskih jezika koji se danas koriste.

1. KOMPILATORI – ovi prevodioci se vezuju za Pascal, Fortran programski jezik C. Kompilatori uzimaju program koji je napisao programer i ceo prevodi na mašinski jezik. Tako preveden program tada može da se izvrši. Kada programer želi da dopuni program on taj deo ubaci u kompjuter i onda se ceo program opet prevodi. Nedostatak tog programa je upravo u tome što taj proces dugo traje, ali je dobra strana što na ovaj način dobijamo program u izvršnom obliku.

Postoje 2 osnovne vrste programskih prevodilaca za programske jezike III generacije:

2. INTERPRETATORI – vezuje se za Basic. Ovde se prevodi isnstrukcija po instrukcija, počev od prve instrukcije, koja se posle prevođenja odmah i izvršava. Zatim se prevodi druga instrukcija koja se potom odmah izvršava i tako redom. To znači da se linija po linija prevode i potom izvršavaju. Interpretatori su zgodniji u fazi testiranja jer se rano uočava greška, koja se odmah popravlja i zatim tako popravljena odmah prevodi i izvršava. Ali je ovakav način prevođenja manje efikasan.

Jezici III generacije su proceduralni jezici i zapisuju se algoritmima.

IV GENERACIJA PROGRAMSKIH JEZIKA – su neproceduralni jezici. Što znači da programer ne opisuje postupak rešavanja problema, već specifikuje izlazni rezultat. Odnosno on specifikuje ono što želi da dobije kao izlazne rezultate i kako da ti rezultati budu prikazani na osnovu ulaznih podataka. Jednostavno rečeno programer daje ulaz, specifikuje šta želi kao izlaz i kao taj izlaz da bude prikazan.

Algoritmi su specifikovani koraci koje treba slediti da bi se dobilo rešenje i to u konačnom broju koraka. Danas su algoritmi sinonim za programiranje ali postoji suštinska razlika između algoritama i programa. Postoje algoritmi koji se koriste u svakodnevnom životu, a nemaju veze sa računarima. Od algoritama se očekuje da tačno specifikuju korake koji slede da bi se dobio rezultat u konačnom broju koraka. Tipičan primer algoritama u svakodnevnom zivotu su kuvarski recepti, koji se kao i svaki drugi algoritmi sastoje od

Ulaznih podataka – neophodni sastojci Obrade – precizno utvrđen redosled upotrebe sastojaka Izlaz – parametri koji nam ukazuju na to kada je to što kuvamo gotovo.

Mnogi algoritmi koji se danas prevode u računarske jezike nastali su mnogo ranije za potrebe čoveka. Jedan od njih je i Euklidov1

1 EUKLID

Euklid je živeo u periodu od 330 - 275.god. p.n.e.

Bio je poznati grcki matematičar iz Atine kao i Platonov učenik.

Živeo je i radio u Aleksandriji gde je stvorio matematičku školu.

algoritam iz 4. veka pre nove ere. Ovo je algoritam kojim se na efikasan način

Page 35: Programiranje - predavanja

35

izračunava (određuje) najveći zajednički delilac (NZD) dva broja. NZD je broj, koji može biti jednak ili manji od onog manjeg od dva broja za koje se najveći zajednički delilac traži. To znači da je potrebno da nađemo broj koji deli oba broja i to najveći od takvih brojeva.

m = m1 * k

n = n1 * k

k = je delilac, broj koji deli brojeve m i n

r = je ostatak pri deljenju m i n

Q= celobrojni deo količnika

------------------------------------------

m = Q * n + r

m1 * k = Q * n1 * k + r

r = k* (m1 - Q * n1 )

Postoje dva načina, kojima se može dođi do utvrđivanja NZD dva broja, duži i kraći.

Napisao je brojna dela, od kojih neka nisu sačuvana i poznata su samo po naslovu. Sačuvana dela su:

"Elementi" ( geometrija kao nauka o prostoru) u 13 knjiga

"Data" ( o uslovima zadavanja nekog matematičkog objekta)

"Optika" ( sa teorijom perspektive), i dr.

U odnosu na druge naučne oblasti, geometrija je dostigla zavidan nivo oko 300.god. p.n.e. pojavom dela "Elementi".

Page 36: Programiranje - predavanja

36

I NAČIN (duži)

Duži način podrazumeva da se svaki od dva broja dele, počev sa brojem koji je jednak manjem od ta dva broja tražeći da ostatak pri deljenju kod oba broja bude 0 (nula). Svaki sledeći broj kojim delimo sve dok nedođemo do željenog rezultata je za 1 manji od prethodnog.

Na ovaj način smo do utvrđivanja NZD došli u 11 koraka.

m = 25

n = 15

Q = celobrojni deo količnika

delilac → 15 14 13 12 11 10 9 8 7 6 5

Q/m 1 1 1 2 2 2 2 3 3 4 5

ostatak m/NZD → 10 11 12 1 3 5 7 1 4 1 0

ostatak n/NZD → 0 1 2 3 4 5 6 7 1 3 0

Q/n 1 1 1 1 1 1 1 1 2 2 3

II NAČIN (kraći) – Euklidov algoritam

U ovom slučaju za utvrđivanje NZD nam je potrebno svega 3 koraka.

Page 37: Programiranje - predavanja

37

m = 25

n = 15

r = 10

Delimo m sa n a sa r zapisujemo ostatak deljenja. Postupak ponavljamo sa brojevima n i r, ono što je bilo n postaje m, a ono što je bilo r postaje n.

m 25 m←n 15 10 Kada je r jednako 0 onda dobijamo konačno

rešenje, a najveći zajednički delilac je n.

n 15 n ← r 10 5

r 10 5 0

Q 1 1 2

Rezapt za kolač

pripremi materija

izaberi voće

poređaj voće u posudu prethodno posutu kristal šećerom

umutiti jaja i so

dodati vanilin šećer i umutiti

dodati brašno i umutiti

dodati mleko i umutiti

Page 38: Programiranje - predavanja

38

dodati pavlaku i umutiti

otopiti puter, dodati i umutiti

preliti preko voća

Ponavljaj:

peći u rerni na 180- 200 stepeni

Sve dok:

ne požuti i

ne stegne se i

ne zarumeni se

kada je r nula (0) dobijamo konačno rešenje, a najveći zajednički delilac n.

Završni korak:

vadi kolač iz rerne

Svi algoritmi sa upotrebnom vrednošću se ponavljaju. Da bi ponavljanje prestalo treba da se postavi uslov koji treba da se zadovoljen.

Predstavljanje Euklidovog algoritma korišćenjem pseudo formalnog jezika

m i n su celi brojevi

r je ostatak pri deljenju m sa n.

sve dok je r različito od 0 ponavljaj

Odavde

m dobija vrednost od n

n dobija vrednost od r

r je ostatak pri deljenju m sa n

Dovde

Page 39: Programiranje - predavanja

39

--------------------------------------------------------------------------------------------------------------------

m = 328152 n = 12737

m 328152 12737 9727 3010 697 222 31 5

n 12737 9727 3010 697 222 31 5 1

r 9729 3010 697 222 31 5 1 0

Q 25 1 3 4 3 7 6 5 NZD ova dva broja je 1

Page 40: Programiranje - predavanja

40

Programiranje 5.predavanje 28. 10. 2009.

Razlika između algoritma i programa:

algoritmi su se koristili i pre nastanka računara algoritam je opštiji pojam od pojme program

Čemu služi algoritam NZD (najveći zajednički delilac) ?

1. PRIMER UPOTREBE NZD-a

Ovaj algoritam služi da bi smo izračunali NZS (najmanji zajednički sadržilac). Najmanji zajednički sadržilac dva broja je najmanji broj, koji je bez ostatka deljiv sa ta dva broja. NZS omogućava sabiranje razlomka sa različitim imeniocima. Npr. najmanji zajednički sadržilac za brojeve 3 i 5 jeste 15.

Kako se izračunava NZS ?

m n ako imamo neka dva broja m i n

NZD = (m,n) odredimo njihov najveći zajednički delilac

NZS = m * n

a zatim, na osnovu podataka (m, n, NZD) izračunamo NZS

NZD(m,n)

Ovaj proces računanja možemo zapisati i nekim pseudo jezikom

:

Page 41: Programiranje - predavanja

41

Prvi broj je b1

Drugi broj je b2

m dobija vrednost b1

n dobija vrednost b2

r je ostatak pri deljenju m sa n

sve dok je r različito od 0 (r ≠ 0) ponavljaj

m dobija vrednost n

n dobija vrednost r

r je ostatak pri deljenju m sa n

do ovde

NZD je broj r

NZS je b1 * b2 ∕ NZD b1 * b2 - su početne vrednosti m i n

2. PRIMER UPOTREBE NZD-a

NZD, takođe možemo upotrebiti ako želimo da utvrdimo da li je neki broj prost. Prost broj je svaki onaj broj koji nema druge delioce sem broja 1 i samog sebe. (takvi su npr. brojevi 1, 3, 5, 7, 11...). Treba istaći da ne postoji najveći prost broj, kao šro ne postoji ni najveći prirodni broj, posle kog opet ne bi bio neki drugi veći prost, odnosno prirodni broj.

Uzajamno prosti brojevi su oni čiji je jedini zajednički delilac broj 1. Jednostavno rečeno NZD za dva uzajamno prosta broja je 1. Npr. brojevi 9 i 10 nisu prosti brojevi zato što devet sem sa 1 i 9 može da se dali još i sa 3, a 10 sem sa 1 i 10 može da se deli i sa 2 i 5 ali je njihov NZD 1 i zato su oni uzajamno prosti brojevi.

Kako da ustanovimo da je neki broj prost broj ?

Page 42: Programiranje - predavanja

42

Kod utvrđivanja da li je neki broj prost (npr. broj 11) krenemo sa proveravanjem od najmanjeg broja , a to je broj 2, pa nastavimo sa proveravanjem sa većim brojevima. Odnosno pokušavamo da podelimo broj 11 sa brojem 2 i sa proveravanjem nastavljamo ili dok ne pronađemo neki broj s kojim možemo da podelimo broj 11 ili ako takav broj ne pronađemo proveravmo sve dok nedođemo do samog broja 11. U ovom slučaju smo konstatovali da je broj jedanaest prost broj.

Ipak za neki veći broj ovakva procedura proveravanja bila bi isuviše dugačka i komplikovana pa iz tog razloga treba znati da:

ako neki broj nije deljiv sa 2 on nije deljiv ni sa 4 ni sa 6, ni sa 8 i iz tog razloga je nepotrebno proveravati da li je taj broj deljiv sa bilo kojim parnim broj. Jer ako on nije deljiv sa 2 nije deljiv ni sa jednim parnim brojem

slično pravilo postoji i za neparne brojeve, ako npr. broj 22 nije deljiv sa 3 on nije deljiv ni sa 5 ni sa 7

ne treba proveravati ni jedan broj koji je veći od korena broja za koji utvrđujemo da li je prost. (preko korena broja koji delimo ne treba više ni proveravat)

e je polazni broj koji ispitujemo

∫ dobija vrednost 2 ( ∫ je broj kojim krećemo da ispitujemo brojeve)

Ako je

NZD brojeva (e, ∫ ) različit od 1

Onda e nije prost broj i kraj Ovde je u pitanju konjukcija

Inače uradi odavde i zato oba uslova moraju biti

∫ je broj 3 zadovoljena da bi iskaz bio tačan.

sve dok je ∫ manji od √e i NZD (e, ∫ ) jednako 1 U suprotnom ako jedan uslov nije

∫ je broj za dva veći tačan prekidamo.

Do ovde

Ako je NZD (e, ∫ ) različit od 1 onda e nije prost broj

inače e jeste prost broj

Page 43: Programiranje - predavanja

43

Prethodno tekstualno objašnjenje primenjeno na konkretan primer:

1. PRIMER

e = 41

∫ za brojeve e i ∫ sada treba izračunati NZD

-------------------------------------------------------------------------------------

∫ dobija vrednost 2

∫ 2 m = 41 n = 2 r ← 1 ≠ 0

m = 2 n = 1 r ← 0 kraj

NZD (41, 2) 1 NZD 1

-------------------------------------------------------------------------------------

∫ dobija vrednost 3

∫ 3 m = 41 n = 3 r ← 2 ≠ 0 zadovoljena su oba uslova

√41 = 6.4 m = 3 n = 2 r ← 1 ≠ 0

3 ≤ 6.4 m = 2 n = 1 r ← 0 kraj

NZD (41, 3) 1 NZD 1

Page 44: Programiranje - predavanja

44

-------------------------------------------------------------------------------------

∫ dobija vrednost 5

∫ 5 m = 41 n = 5 r ← 1 ≠ 0 zadovoljena su oba uslova

√41 = 6.4 m = 5 n = 1 r ← 0 kraj

5 ≤ 6.4

NZD (41, 5) 1 NZD 1

--------------------------------------------------------------------------------------

∫ dobija vrednost 7

∫ 7 m = 41 n = 7 r ← 6 ≠ 0 nije zadovoljen 1. uslov

√41 = 6.4 m = 7 n = 6 r ← 1 ≠ 0 7 nije manji od korena

7 > 6.4 m = 6 n = 1 r ← 0 kraj broja 41

NZD (41, 7) 1 NZD 1

Broj 41 je prost broj.

2. PRIMER

Page 45: Programiranje - predavanja

45

e = 45

f za brojeve e i ∫ sada treba izračunati NZD

------------------------------------------------------------------------------------

∫ dobija vrednost 2

∫ 2 m = 45 n = 2 r ← 1 ≠ 0

m = 2 n = 1 r ← 0 kraj

NZD (45, 2) 1 NZD 1

------------------------------------------------------------------------------------

∫ dobija vrednost 3

zadovoljen je prvi

√45 = 6.708 ∫ 3 m = 45 n = 3 r ← 0 ≠ kraj uslov. Broj 3 je manji

3 ≤ 6.4 od korena broja 45 ali

ali drugi uslov nije zado-

NZD (45, 3) 3 NZD 3 voljen jer je NZD (45, 3)

broj 3.

Broj 45 nije prost broj.

Page 46: Programiranje - predavanja

46

Kako algoritam pretočiti u program ?

Algoritam prvo treba da se koncipira, a zatim p retoči u p ro gram. Nisu sv i alg oritmi p rimen jiv i za računarske programe. Takav jedan algoritam je recept. Nasuprot njemu Euklidov algoritam je vrlo efikasan i može se predstaviti u vidu programa.

Kako se zapisuje algoritam

1. osnovne tipove podataka

?

Programski jezik mora da obezbedi:

2. strukturne podatke 3. kontrolne strukture

1. OSNOVNI TIPOVI PODATAKA

Osnovni tipovi podataka su:

• celobrojni tip podataka • realni tip podataka • logički tip podataka • karakterski tip podataka

Page 47: Programiranje - predavanja

47

Celobrojni tip podataka vezuje se za predstavljanje brojeva u obliku potpunog komplementa. To znači da ne radimo sa celim skupom celih brojeva, već radimo sa njegovim konačnim podskupom čiji raspon brojeva zavisi od memoriskog prostora (2 ili 4 bajta).

Realni tip podataka vezuje se za predstavljanje brojeva u obliku pokretnog zareza.. To znači da ne radimo sa celim skupom realnih brojeva, već sa konačnim podskupom realnih brojeva, ali se brojevi upisuju sa određenom tačnošću. Ako je memoriski prostor od 4 bajta ta tačnost se odnosi na 6 do 7 cifar, a ako je memoriski prostor od 8 bajtova tačnost se odnosi na 15 cifara.

Logički tip podataka odnosi se na dve vrednosti tačno i netačno (engleski: true, false). 0 bitova je netačno, a sve što nije 0 je tačno.

Karakterski tip podataka. Za svaki karakter u karakterskom tipu podataka koristi se jedan bajt

Većina programskih jezika spada u tipizirane jezike. Određenoj memorijskoj lokaciji se pridružuju neki podaci ali se mora tačno navesti koji se tip podataka za tu lokaciju uzima. Programer može da uvede neku promenljivu koja u programiranju predstavlja neku njegovu memorijsku lokaciju kojoj može, npr. dati ime f i svaki faktor deljenja biće smešten na tu lokaciju. Te promenljive mogu dobiti i drugačije nazive (NZD, NZS itd). Svaka ta memorijska lokacija je sekvencija 0 i 1. Kako se u prethodno navedenoj memorijskoj lokaciji pod nazivom f, nalaze celi brojevi oni će tu biti predstavljeni u obliku potpunog komplementa.

VBA deklarisanje promenljivih Osim promenljivih koriste se i

celobrojni tip (2 bajta) Dim x As Integer 3 - 5 +3256 (2 bajta)

konstantne vrednosti određenog tipa

Celobrojni tip podataka Celobrojne konstante

promenljiva ceo broj u 2 bajta

celobrojni tip (4 bajta) Dim y As Long 3 - 5 +2 117 500 000 (4 bajta)

Page 48: Programiranje - predavanja

48

promenljiva dugačak ceo broj

sa memorijskom

lokacijom od

4 bajta

Brojevi su predstavljeni u obliku potpunog komplementa.

Realni tip podataka Realni tip ima zapis konstante na

memorijski prostor od 4 bajta dva načina

broj zapisan u obliku pokretnog zareza

realni tip (jednostruka Dim z As Single 1) 50.3

tačnost) 2) 3.14E-4 → obična mantisa

puta eksponent

(3.14 * 10-4) decimalni

eksponent

realni tip (dvostruka Dim w As Double 2.1E +79 → samo za realni tip

tačnost) dvostruka tačnost

memorijski prostor od 8 bajtova (2.1 * 10+79 )

broj zapisan u obliku pokretnog zareza

Page 49: Programiranje - predavanja

49

Logički tip podataka Logičke konstante

Dim e As Boolean True

False

1 karakter 1 bajt

Karakterski tip podataka Karakterska konstanta

(tekstualni)

Dim s As String ‘’ Pera’’

mora da ide pod navodnike

Ovi podaci se nazivaju osnovni tipski podaci jer se na njima mogu primeniti osnovne računske operacije. Za svaki tip nisu iste računske operacije

• za promenljive celobrojnog tipa A i B moguće su sledeće operacije: sabiranje, oduzimanje, množenje, celobrojno deljenje, ostatak pri deljenju, promena znaka

• za promenljive realnog tipa koriste se operacije: sabiranje, oduzimanje, množenje, deljenje, i promena znaka

realni, celi – (promena znaka) – A

realni, celi +, –, * A + B, A – B, A * B

Page 50: Programiranje - predavanja

50

celi \ celobrojni deo A \ B ( 7 \ 3 → 2 )

količnika

celi Mod – ostatak pri A Mod B ( 7 Mod 3 → 1 )

deljenju

realni / deljenje A / B ( 7 / 3 → 2,333)

realni, celi ^ operacija A ^ B ( 2 ^ 4 → 16 )

stepenovanje 2 na 4. stepen → 24

OPIS ALGORITAMA PRIRODNIM JEZIKOM

Opisati prirodnim jezikom detaljno, precizno i nedvosmisleno korake pri resavanju problema, vodeci racuna o redosledu operacija koji se izvrsavaju.

OPIS ALGORITAMA PSEUDO JEZIKOM

Pseudo jezik je neformalna kombinacija prirodnog jezika i nekog programskog jezika. Pri upotrebi pseudo jezika mora se voditi racuna da se jezicke konstrukcije koriste uvek na isti nacin i da budu pracene objasnjenjima (ako je potebno).

OPISIVANJE ALGORITAMA BLOK SEMOM

Za ovaj oblik opisa koriste se graficki simboli ciji je opis propisan ISO standardom. Tekst koji opisuje obradu se zapisuje unutar grafickih simbola. Tok rada algoritma se opisuju linijama koje povezuju graficke simbole koji reprezentuju obradu.

Page 51: Programiranje - predavanja

51

Programiranje 6.predavanje 11. 11. 2009.

Slično kao u VBA i u drugim programskim jezicima postoje osnovni tipovi podataka povezani odgovarajućom reprezentacijom. Da bi ti tipovi podataka imali nekog smisla postoje i operacije koje su omogućene odgovarajućim operatorima.

Operatori mogu biti:

• aritmetički • logički • relacijski • konkatenacija

Operacije za logičke podatke vezuju se logičkim operatorima:

• And → konjukcija • Or → disjunkcija • Not → negacija

Konkatenacija – dopisivanje. To znači da se na neku nisku dopisuju druge konstante niske

''Pera '' & '' i '' & '' Mika''

''Pera i Mika''

Tip podataka je taj koji određuje koji će se tip operatora koristiti

Page 52: Programiranje - predavanja

52

Relacijski operatori koji porede dve vrednosti i kao rezultat poređenja daju dve vrednosti True (tačno) i False (netačno). Realcijski operatori realizuju relaciju koja ima vrednost bulovskog tipa, nešto ili jeste ili nije u relaciji. Ako jeste u relaciji onda je True, ako nije onda je False.

Za relacijske operacije koriste se operatori poređenja (relacijski operatori):

= porede se dve vrednosti. rezultat je ili True ili False

<> nejednakost

< manje

> veće

<= manje ili jednako

>= veće ili jednako

Relacijske operacije se povezuju bulovskim operatorima.

Primer relacijsk operacije imamo kod utvrđivnja da li je neka godina prestupna.

(godina Mod 4 = 0) And (godina Mod 100 <> 0)

relacijski izraz relacijski izraz

logički operator

Ovo je primer relacijske operacije koji kaže da je prestupna godina svaka godina koja je deljiva sa 4 ali samo ako nije deljiva i sa 100.

(1904 Mod 4 = 0) And (1904 Mod 100 <> 0)

↓ ↓

Page 53: Programiranje - predavanja

53

True True

True

Ovo je bilo okvirno utvrđivanje prestupne godine, dok se prezizno utvrđivanje vrši na sledeći način:

Ovo je primer jednog složenog izraza

(godina Mod 400 = 0) or (( godina Mod 4 = 0) And (godina Mod 100 <> 0))

(2000 Mod 400 = 0) or (( 2000 Mod 4 = 0) And (2000 Mod 100 <> 0))

↓ ↓

↓ True False

True

False

True

Ako je u pitanju konjukcija (And) oba izraza moraju biti tačna da bi rezultat bio True.

Ako je u pitanju disjunkcija (Or) dovoljno je da je jedan iskaz tačan da bi rezultat bio True.

Page 54: Programiranje - predavanja

54

Jedan izraz može da sadrži mnogo operacija, zato je jako važno voditi računa o prioritetu vršenja određenih operacija u odnosu na druge. Kako je prioritet bitan i da bi se on podržao uvedene su konvencije koje tačno propisuju kojim se redom izvršavaju operacije.

Dve su stvari bitne:

• prioritet operacija • korišćenje zagrada (ono što je unutar zagrada prvo se izvršava u odnosu na ono što je van njih)

Prioritet operatora – od najvećeg ka najmanjem

1. ^ stepenovanje

2. − promena znaka (negacija)

3. * / množenje i deljenje

4. \ celobrojno deljenje

5. Mod ostatak pri deljenju (Modul)

6. + − sabiranje i oduzimanje

7. & konkatenacija

8. = <> <= >= < > relacijski operatori

9. And Or Not logički operatori

Page 55: Programiranje - predavanja

55

Kako se sad taj prioritet koristi ?

Ako imamo izraz koji ima više operatora izvršavaju se sleva udesno i to prvo operatori višeg prioriteta pa oni nižeg. Ako ima više operatora istog prioriteta izvršavaju se redom sleva udesno.

7 * 3 – 6 \ 2 + 4

21 – 6 \ 2 + 4

21 – 3 + 4

18 + 4

22

Mnogi programski jezici dozvoljavaju mešanje različitih tipova podataka, pre svega celobrojnih i realnih tipova, a VBA dozvoljava mešanje i niskovnog tipa sa realnim i celobrojnim. Kada imamo mešanje tipova mora da postoji i njihovo prilagođavanje. Skup realnih brojeva obuhvata i cele brojeve, pa iz toga sledi da je skup celih brojeva podskup skupa realnih brojeva. A kako se prilagođavanje vrši od užek ka širem, onda se celobrojni tip prilagođava realnom tipu.

Dim ix As Integer

Dim ry As Double

ix = 5 Oba zapisa su potpuno različita i ne mogu se međusobno množiti

ry = 4.3 već prvo mora da dođe do prilagođavanja.

----------------------------

ix * ry → 5 * 4.3 → 5.0 * 4.3 → 21.5 Celobrojni tip se prilagodio realnom i izvršeno je

realno računanje

Page 56: Programiranje - predavanja

56

Do prilagođavanja mora da dođe i ako imamo mešanje brojnog sa niskovnim tipom

Dim ix As Integer

Dim s As String

ix = 5

s = ''123''

--------------------------------------

s & ix & – konkatenacija je definisana samo u niskovnom tipu i zato ona sada određuje

prilagođavanje. Pa u ovom slučaju celobrojni tip mora da se prilagodi

niskovnom tipu.

s & ix → ''123'' & 5 → ''123'' & ''5'' → ''1235''

s + ix + – ovde se radi o operaciji sabiranja i zato prilagođavanje mora da bude u drugom

pravcu, odnosno niskovni tip mora da se prilagodi celobrojnom tipu.

s + ix → ''123'' + 5 → 123 + 5 → 128

Page 57: Programiranje - predavanja

57

Dosta je opasno mešanje niskovnog i brojevnog tipa, jer je pretvaranje niskovnog u brojevno moguće jedino ako niskovni sadrži same brojeve u suprotno to je nemoguće kao što se može videti iz sledećg primera:

s = ''a123''

ix = 5

-------------------

s + ix → ''a123'' + 5 dalje je nemoguće vršiti operaciju množenja jer niskovni tip podataka

''a123'' nije zapisan broj već kombinacija slova i brojeva

Page 58: Programiranje - predavanja

58

Programiranje 7.predavanje 18. 11. 2009.

Prioritet operacija i konverzija tipova

Operacije se obavljaju sleva udesno i to prvo one najvišeg prioriteta

1.2 + 17 Mod 6 \ 2 + 3 1. prvo se izvršava celobrojno deljenje

1.2 + 17 Mod 3 + 3 2. zatim se računa ostatak pri celobrojnom deljenju

1.2 + 2 + 3 3. zatim vršimo konverziju ka opštijem tipu podataka

(Cele brojeve pretvaramo u realne)

1.2 + 2.0 + 3 4. vršimo sabiranje sleva udesno dva realna broja

3.2 + 3 5. vršimo pretvaranje celog broja u realni

3.2 + 3.0 6. vršimo sabiranje dva realna broja

6.2

Važno je zapamtiti da se ne vrši odjednom pretvaranje svih tipova, već konverziju vršimo samo za one tipove koji su u neposrednoj kombinaciji za računanje.

Page 59: Programiranje - predavanja

59

Postoje:

1. aritmetiči izrazi 2. relacijski izrazi 3. logički izrazi

ARITMETIČKI IZRAZI SU:

celobrojne i realne konstante sve celobrojne i realne promenljive (sve promenljive deklarisane kao Integer, Long, Single, Double)

pozivi delobrojnih i realnih funkcija sve što se dobija spajanjem aritmetičkih izraza odgovarajućim operacijama

Ako su E1 i E2 aritmetički izrazi

onda su i

E1 + E2

E1 – E2

E1 * E2

E1 \ E2

E1 Mod E2

E1 / E2

E1 ^ E2

( E1 )

+ E1

Page 60: Programiranje - predavanja

60

– E2

aritmetički izrazi

RELACIJSKI IZRAZI SU:

Relacijski izrazi se dobijaju spajanjem aritmetičkih izraza relacijskim operacijama.

Ako su E1 i E2 aritmetički izraz

onda su relacijaski izrazi

E1 = E2

E1 <> E2

E1 < E2

E1 > E2

E1 <= E2

E1 >= E2

Relacijski izrazi korise operatore poređenja i izrazu. Kao rezultat relacijskih izraza možemo dobiti dve logičke vrednosti True ili False

LOGIČKI ISKAZI SU:

Konstante True i False Logičke promenljive (to su one koje su deklarisane da budu tipa Boolean) Relacijski izrazi

Page 61: Programiranje - predavanja

61

Pozivi logičkih funkcija

Ako su L1 i L2 logički izrazi

onda su logički izrazi i

L1 And L2

L1 Or L2

Not L2

(god Mod 4 = 0) And (god Mod 100 <> 0 )

Ovo sve je logički izraz, koji se sastoji od dva relacijska izraza povezana logičkim operatorom And

god Mod 4 = 0

Ovo je jedan relacijski izraz koji se sastoji od aritmetičkog izraza god Mod 4 i konstante 0 povezanih relacijskim operatorom =

god Mod 4

Ovo je jedan aritmetički izraz koji se satoji od dva aritmetička izraza povezana aritmetičkim operatorom Mod

NAREDBA DODELE

Naredba dodele je ključna naredba u programiranju. Sa leve strane nalazi se promnljiva, zatim operator dodele, a sa desne je izraz.

Promenljiva = Izraz

Page 62: Programiranje - predavanja

62

U matematici znakom jednakosti utvrđujemo jedankost leve i desne strane: Levo = Desno

U programiranju je smisao naredbe dodele drugačiji. U programiranju se promenljiva uvek nalazi sa leve strane, a sa desne se nalazi izraz koji može biti i konstanta i promenljiva.. Smisao naredbe dodele je da se izračuna vrednost izraza sa desne strane i sada ta dobijena (izračunata) vrednsot postaje vrednost promenljive sa leve strane. Odnosno vrednost izraza se računa s tekućom vrednošću izraza i tako dobijena vrednost postaje nova vrednost promenljive.

Npr. n = n + 1 n dobija vrednoast n + 1, izračunavamo vrednost tog izraza tako što n

uvećamo za 1 i ta nova vrednost postaje nova vrednost promenjive n.

n = 5 + 1

n = 6

Kod naredbe dodele mora da se vodi računa o konverziji tipova podataka. Važno je da izraz s desne strane mora da bude istog tipa kao promenljiva s leve strane. Ako to nije slučaj potrebno je da se izvrši konverzija izraza u tip promenljive s leve strane, odnosno ako je izraz s desne strane operatora dodele jednog a promenljiva s leve strane drugog tipa onda izraz mora da se konverutje u tip promenljive s leve strane

Bulovski tip ne može da se prebaci u realan tip, dok niskovni tip pod određenim uslovima (ako se sastoji od brojeva, (''1234'') može da se prevede u realan ili celobrojan tip podataka.

Dim iv As Integer celobrojni tip

Dim s1 i s2 As String niskovni tip

s1 = ''12''

s2 = ''34''

Page 63: Programiranje - predavanja

63

iv = '' s1'' & ''s2 ''

--------------------------------

''12'' & ''34'' izračunava se izraz s desne strane

''1234'' dobijena niska sada treba da se dodeli promenljivoj celobrojnog tipa

1234 izvršava se konverzija iz niskovnog u celobrojni tip

1234 → iv i tek sada dobijena vrednost može da se dodeli promenljivoj iv

-------------------------------------------------------------------------------------------------------------------------

s1 = ''12''

s2 = ''3.4''

iv = '' s1 '' & '' s2''

-------------------------------

''12'' & ''3.4''

''123.4'' dobijena vrednost je realan broj i da bi se dodelila promenljivoj celobrojnog tipa

↓ mora da se izvrši konertovanje i to odbacivanjem razlomljenog dela

Page 64: Programiranje - predavanja

64

''123''

iv = 123

Još jedan primeri koji objašnjava operator dodele

Dim n As integer

n = 2 promenljivoj n dodeljen je celobrojni tip, vrednost 2

---------------------------

n = n + n * n Mod 3 + n \ (n – 1) * (n * n) promenljivu n zamenićemo vrednošću 2

2 + 2 * 2 Mod 3 + 2 \ (2 – 1) * (2 * 2) zatim se prvo računa ono što je u zagradama, odnosno

ono što je najdublje ugnježdeno

2 + 2 * 2 Mod 3 + 2 \ 1 * 4 od dva množenja prvo se radi ono koje je s leve strane

Page 65: Programiranje - predavanja

65

2 + 4 Mod 3 + 2 \ 1 * 4 zatim se obavlja i preostalo množenje

2 + 4 Mod 3 + 2 \ 4 sledi celobrojno deljenje

2 + 4 Mod 3 + 0 zatim izračunavamo ostatak pri celobrojnom deljenju

2 + 1 + 0 zatim prvo sabiranje

3 + 0 i poslednje sabiranje

3

Sve radimo postepeno sleva udesno pri čemu računanje izvršavamo od operacija višeg ka operacijama nižeg prioriteta.. Naravno prvo se izračunava ono što je u zagradama, a ako postoje dve ili više operacije istog prioriteta prvo izvršavamo one sleva.

Problem koji se javlja kod naredbe dodele (trik na kom svi početnici padaju) je razmena vrednosti kod promenljivih.

Dim a, b As Integer

a = 5

b = 7

Ako program nekim slučajem ima potrebu da razmeni ove dve vrednosti, da promenljivoj a dodeli vrednost promenljive b i obrnuto, svaki početnik će to uraditi na sledeći način:

a = b

b = a

Page 66: Programiranje - predavanja

66

ovo deluje najprirodniji način da se tako nešto uradi ali to nije tačan način jer će se naredbom dodele dobiti sledeće:

a = b ' a ← 7 promenljiovoj a će biti dodeljena vrednost promenljive b i ona će biti 7, ali će

sada promenljiva b dobiti novu vrednost promenljive a, a ta vrednost je sada 7 i

dobićemo dve promenljive sa istom vrednošću

b = a ' b ← 7 što naravno nije ono što smo mi želeli.

Razmena vrednosti promenljivih se za potrebe računara vrši na sledeći način:

Dim a, b, p As Integer (Uvodi se pomoćna promenljiva koja će da čuva početnu vrednost

promenljive b)

a = 5

b = 7

p = b ' p = 7 p čuva staru vrednost promenljive b

b = a ' b = 5 b dobija vrednost promenljive a

a = p ' a = 7 a dobija vrednost promenljive p odnosno početnu vrednost promenljive b

Ako u programu postoji četvorocifren broj iz kog treba da se izvuče 2. cifra (cifre se broje sdesna ulevo) to će se raditi na sledeći način:

Dim x, x1, x2, c1, y As Integer

x = 2731 ' cifra koju želimo da izvučemo je broj 3

Page 67: Programiranje - predavanja

67

x1 = x \ 10 ' 2731 \ 10 = 273 celobrojnim deljenjem izdvajamo prve tri cifre

c1 = x Mod 10 ' 2731 Mod 10 = 1 od osnovnog broja dobijanjem ostatka pri deljenju

i tako izdvajamo prvu cifru

x2 = x1 \ 10 ' 273 \ 10 = 27 celobrojnim deljenjem x1 sa 10 izdvajamo prve dve cifre

y = x2 * 10 + 1 ' 27 * 10 + 1 = 270 + 1 = 271 na kraju dobijamo željeni rezultat

----------------------------------------------------------------------------------------------------------------------------

Ako u istom tom četvorocifrenom broju želimo da zamenimo mesta 2. i 3. cifri to ćemo uraditi na sledeći način.

Dim x, x1, x2, x3, c1, c2, c3, y As Integer

x = 2731 ' da bi smo zamenili mesta ciframa moramo da izdvojimo sve četiri cifre

x1 = x \ 10 ' 2731 \ 10 = 273

c1 = x Mod 10 ' 2731 Mod 10 = 1

x2 = x1 \ 10 ' 273 \ 10 = 27

c2 = x1 Mod 10 ' 273 Mod 10 = 3

x3 = x2 \ 10 ' 27 \ 10 = 2

c3 = x2 Mod 10 ' 27 Mod 10 = 7

y = x3 * 1000 + c2 * 100 + c3 * 10 + c1

Page 68: Programiranje - predavanja

68

y = 2 * 1000 + 3 * 100 + 7 * 10 + 1

y = 2371

Sve je ovo do sada imalo linijsku strukturu, ređali su se iskazi jedan za drugim i tako se izvršavali. Ali postoji i mogućnost grananja puteva i ona su omogućena kontrolnim strukturama

KONTROLNE STRUKTURE

Kontrolne strukture nude grananje puteva tako što se prva linijska struktura grana u dva ili više puteva u zavisnosti od vrednosti promenljive.

Kada se program izvršava ?

To se postiže korišćenjem strukture If...Then...Else. Ako se kao vrednost izraza dobije True onda se izvršava grana programa posle ključne reči Then u suprotnom se izvršava ona grana koja dolazi posle ključne reči Else.

U VBA razgranata struktura se piše na sledeći način:

If uslov Then Treba znati da se uvek izvršava samo jedna od ovih

iskaz grupa iskaza. Ako je prvi uslov tačan izvršavaju se

Page 69: Programiranje - predavanja

69

iskaz... samo iskazi posle prvog Then. Ako prvi uslov nije tačan

Else If uslov 2 Then prva grupa iskaza se preskače i proverava se sledeći

iskaz uslov i ako je on tačan izvršavaju se iskazi koji slede

iskaz... U slučaju da ni jedan uslov nije tačan onda se izvršava

Else If uslov 3 Then Else bez uslova. A zatim se prelazi na iskaz iza End If.

iskaz

iskaz...

Else

iskaz

iskaz...

End If

iskaz

Imamo tri celobrojne vrednosti i treba da ih poređamo od najmane ka najvećoj. Na prvu poziciju se postavlja najmanja, na sledeću srednja a na treću poziciju se postavlja najveća vrednost. To ćemo postići na sledeći način:

Dim a, b, c, p As Integer

a = 9

b = 6

c = 8

Page 70: Programiranje - predavanja

70

If b < a Then ' uslov je tačan a i b menjaju vrednost ako je b < a

p = b ' p ← 6

b = a ' b ← 9 b = 9

a = p ' a ← 6 a = 6

End If

If c < a Then ' c = 8, a = 6 (a više nema početnu vrednost, već vrednost iz prethodnog If)

p = c ' Uslov nije ispunjen i nećemo ga izvršavati

c = a

a = p

End If

' Posle prva dva iskaza smo utvrdili koja je vrednost najmanja

If c < b Then ' c = 8, b = 9 (b ima vrednost koju je dobio posle zamene vrednosti sa a)

p = c ' p ← 8

c = b ' c ← 9 c = 9

b = p ' b ← 8 b = 8

End If

Ovde smo imali primer tri nezavisna If strukture i zato se one u svakom slučaju sve moraju proveriti i kod svih onih kod kojih je uslov ispinjen moraju se izvršiti iskazi.

Page 71: Programiranje - predavanja

71

Programiranje 8.predavanje 25. 11. 2009.

KONTROLNE STRUKTURE u programskom jeziku (nastavak sa prethodnog časa)

If ...Then... Else struktura služi za odabir alternativnih puteva. U zavisnosti od rezultata može se izabrati koja će se grupa iskaza izvršavati.

Sem ove kontrolne strukture postoje i takozvani ponavljačke – repetativne kontrolne strukture. Ove strukture dozvoljavaju ponavljaju alo ono mora bit konačno i zato mora da postoji neki uslov kako bi to ponavljanje prestalo. Ovakava kontrolna strukktura se naziva još i petlja. Jedna od tih petlji je

While...Do petlja. Kod ove petlje je uslov tako zadat da predstavlja uslov daljeg ponavljanja. Kada je uslov ispunjen (tačan) onda se dalje izvršava telo petlje. Telo petlje čine instrukcije kojih može biti više ili može biti samo jedna instrukcija. U ovakvoj petlji uslov je logički uslov koji ili jeste ili nije zadovoljen. While...Do petlja realizovana je u većini programskih jezika. Naziva se još i nulta petlja jer može da se dogodi da se telo petlje nikada ne izvrši. To može da se dogodi onda kada kod prvog provrevanja uslov nije ispunjen.

Kako se While...Do petlja realizuje u programu VBA ?

Ova petlja se još zove i Radi sve dok

While uslov

instrukcije ili naredbe

Wend

Ova petlja počinje sa While iza kog stoji uslov. Uslov se proverava i u slučaju da je on ispunjen ide se na izvršavanje tela petlje. Zatim se vraća na početak i ponovo se proverava uslov. Ovo ponavljenje se vrši sve dok uslov u jednom momentu ne postane netačan. Uslov koji stoji posle While je logički uslov. On može biti logički izraz ili logička promenljiva ili relacijski izraz jer svi oni vraćaju bulovsku vrednost koja može biti True ili False. Tokom izvršavanja ove petlje menja se vrednost poromenljive u uslovu i zato uslov u jenom momentu postaje netačan.

Page 72: Programiranje - predavanja

72

To možemo videti na primeru izračunavanja Euklidovog algoritma (NZD) pomoću While Do petlje.

Dim m, n, r As Integer

r = m Mod n

While r > 0

m = n

n = r

r = m Mod n

Wend

U ovom primeru nastavljamo sa izvršavanjem petlje sve dok je r veće od 0. Kako se uslov nalazi na samom početku petlje mi moramo pre te petlje imati izračunato r. Zato se pre While petlje nalazi neki računski iskaz koji će na osnovu novo dobijenih vrednosti m i n izračunavati i novu vrednost r. Ta nova vrednost koja je dodeljena promenljivoj r proveravaće se postojećim uslovom i sve dok je vrednost veća od 0 telo petlje će se izvršavati.

Drugi primer ponavljačke petlje je Do...Loop...Until petlja (repeat-until, ponavljaj sve dok ne bude). Ovde se uslov nalazi na kraju petlje i ova pelja nije nulta jer uvek bar jednom mora da se izvrši telo petlje kako bi se došlo do posojećeg uslova i izvršila provera. U slučaju d uslov nije zadovoljen dolazi do ponavljanja,a onog momenta kada uslov bude zadovoljen ponavljenje se prekida.

Kako se realizuje Do...Loop...Until petlja u programu VBA

Petlje počinje ključnom reči Do. Slede instrukcije koje treba izvršiti, a zatim na kraju sledi uslov za prekidanje izvrševanja.

?

Do

instrukcije

Loop Until uslov

Page 73: Programiranje - predavanja

73

Rad ove petlje možemo takođe videti na primeru Euklidovog algoritma (NZD)

Dim m, n, r As Integer

Do

r = m Mod n

m = n

n = r

Loop Until r = 0

Možemo da vidimo da se:

• u While...Do petlji uslov nalazi na početku, dok se u Do...Loop...Until petlji uslov nalazi na kraju • u While...Do petlji računski iskaz se nalazi pre petlje, dok se u Do...Loop...Until petlji računski iskaz

nalazi u samoj petlji • u While...Do petlji uslov je r > 0 (uslov za nastavak izvršavanja), dok je u Do...Loop...Until petlji

uslov r = 0 (uslov za prekid izvršavanja)

Page 74: Programiranje - predavanja

74

Primer izračunavanja NZD (najvećeg zajedničkog delioca) u While...Do petlji

Dim m, n, r As Integer

r = m Mod n

While r > 0

m = n

n = r

r = m Mod n

Wend

m = 32 n = 24

1. izračunavamo ostatak pri deljenju m sa n pre ulaska u petlju

r 8 0

m 32 24

n 24 8

DA NE 2. proveravamo uslov na samom početku petlje:

a) ako je uslov tačan

nastavljamo sa

Page 75: Programiranje - predavanja

75

izvršavanjem

tela petlje

b) ako uslov nije ispunjen prekidamo

r = 0

n = NZD

NZD = 8

Primer izračunavanja NZD (najvećeg zajedničkog delioca) u Do...Loop...Until petlji

Dim m, n, r As Integer

Do

Page 76: Programiranje - predavanja

76

r = m Mod n

m = n

n = r

Loop Until r = 0

m = 32 n = 24

1. izračunavamo ostatak pri deljenju m sa n u samoj petlji sa početnim vrednostima m i n, r = 8

r 8 0 2. m dobija vrednost n m = 24

m 32 24 8 3. n dobija vrednost r n = 8

n 24 8 0

NE DA 4. na kraju proveravamo uslov:

a) Ako uslov nije tačan b) ako je uslov ispunjen

r ≠ 0 prekidamo izvršavanje

idemo na novo r = 0

izvršavanje tela m = NZD

petlje NZD = 8

Page 77: Programiranje - predavanja

77

Primer:

Dat je ceo broj za koji ne znamo koliko ima cifara, a naš zadatak je da izdvojimo sve cifre datog broja.

To ćemo uraditi na sledeći način

Dim m, c, d As Long ' zapis je u 4 bajta, m može da ima od 1 do 10 cifara

' m je dati broj

' d je pomoćna promenljiva – njoj će biti dodeljena vrednost količnika pri celobrojnom deljenju

' c je izdvojena cifra – ostatak pri deljenju m sa 10

c = m Mod 10

d = m \ 10

Page 78: Programiranje - predavanja

78

' ispiši cifru c najmanje težine

While d <> 0

c = d Mod 10

d = d \ 10

' ispiši sledeću cifru c

Wend

Pre ulaska u While petlju, vrši se računanje celobrojnog količnika i ostatka pri deljenju kako bismo mogli da proverimo uslov na početku petlje. Ako je d različito od 0 izvršavaju se instrukcije iz tela petlje. c dobija vrednost ostatka pri deljenju (c = d Mod 10), zatim i d dobija novu vrednost (d = d \ 10). Ponovo se vraćamo na uslov koji se nalazi na početku petlje i ukoliko je uslov ispunjen telo petlje se ponovo izvrpava. Ukoliko uslov nije ispunjen prekida se sa izvršavanjem tela petlje.

m ← 2732 pratimo promenu vrednosti promenljivih d i c

d 273 27 2 0

c 2 3 7 2

uslov DA DA DA Ne

d<>0

1. c se izračunava po tekućoj vrednosti m

2. pre ulaska u petlju d dobija vrednost celobrojnog količnika (d = m \ 10)

3. proverava se uslov – da li je d<>0

4. c se izračunava po tekućoj vrednosti d

5. zatim se ponovo izračunava vrednost d

Page 79: Programiranje - predavanja

79

6. proverava se uslov – da li je d<>0 − sve dok je uslov ispunjen izvršava se telo petlje.

Izdvajanje cifara vrši se od cifre najmanje težine do cifre najveće težine.

2732 4. 3. 2. 1

Sem do sada navedenih postoji još jedna vrsta kontrolnih srtuktura. To je brojačka kontrolna struktura – For petlja. Ona se izvršava odbrojavanjem, odnosno ona odbrojava koliko puta će se telo petlje izvršiti u zavisnosti od nekih promenljivih ili iskaza koji predstavljaju broj potrebnih izvršavanja neke petlje. Svaka brojačka kontrolna struktura može se iskazati i sa While..Do ili Do...Loop...Until kontorlnom strukturom.

For brojač = početak To kraj {Step korak} ' Ova zagrada se ne zapisuje već ukazuje na to da

ono što stoji između nje nije uvek neophodan

instrukcije argument i da se unosi u zavisnosti od situacije.

Ako se pomeranje brojača uvećava za jedan onda ga Next je nepotrebno pisati, ali ako želimo neki drugačiji

oblik pomeranja brojača neophodno je da to i

navedemo sa komandom Step i to bez zagrada.

Brojač je celobrojna pomoćna promenljiva koja odbrojava koliko puta će se izvršiti telo petlje. Brojač automatski dobija vrednost celobrojne promenljive koja se u svakom koraku menja za 1 sve dok se ne dođe do krajnje vrednosti. Instrukcije koje se nalaze u telu petlje izvršavaju se do Next, zatim se vrednost brojača povećava za jedan i ovo se ponavlja sve dok brojač ne dobije krajnju vrednost.

To ćemo videti na sledećem primeru: Izračunavanje faktorijala za neki ceo broj n.

n! = 1 * 2 * 3 * n ' faktorijal nekog broja dobija se tako što se pomnože svi brojevi od 1 do zadatog broja, npr. faktorijal broja 11 je 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 = 39 916 800

Page 80: Programiranje - predavanja

80

Dim i, n, f As Long 'zapis je u 4 bajta, n može da ima od 1 do 10 cifara

' n je dat ceo broj (n < 13)

' i je pomoćna promenljiva, brojač

' f je izračunati faktorijal

f = 1 ' f dobija vrednost 1

For i = 1 To n

f = f * i ' f sadrži i

Next

n = 13

• Pratimo promenu vrednosti promenljive i i f. • Na početku f dobija vrednost 1 i i dobija vrednost 1. Množimo dobijene vrednosti i i f (1 * 1) i

dobijamo da je f 1. • Zatim i dobija vrednost 2 i množi se sa tekućom vrednošću f (koja je u tom momentu 1) i

dobijamo da je nova vrednost f 2. • Zatim i dobija vrednost 3 i množi se sa tekućom vrednošću f (koja je u tom momentu 2) i

dobijamo da je nova vrednost f 6.

i f 1

1 1

2 2

3 6

4 24

5 120

Page 81: Programiranje - predavanja

81

6 720

7 5040

8 40320

9 362880

10 3628800

11 39916800

12 479001600 .

13 6227020800 → 13! ne može da stane u 4 bajta

Primer brojača u If...Then...Else petlji Izračunavanje n-tog Fibonačijevog broja

n-ti Fibonačijev broj

1. Fibonačijev broj je 1 f1 = 1

2. Fibonačijev broj je 1 f2 = 1

fn = fn-1 + fn-2, n > 2

Prva dva broja su uvek jedan a svaki sledeći broj predstavlja zbir prethodna dva broja

Dim n, i, f, f1, f2 As Integer

' n je dati ceo broj n > 0

' i je brojač petlje

' f je izračunati Fibonačijev broj

' f1 je prethodni Fibonačijev broj

Page 82: Programiranje - predavanja

82

' f2 je prethodni od prethodnog Fibonačijevog broja

If n <= 2 Then

f = 1

Else

f1 = 1

f2 = 1

For i = 3 To n

f = f1 + f2 ' f sadrži i-ti Fibonačijev broj

f2 = f1

f1 = f

Next i

End If

n = 8

n <= 2 ' Proverava se da li je n manje ili jednako 2, ako nije onda se izvršava Else deo petlje.

i 3 4 5 6 7 8 ' vrednost brojača

f 2 3 5 8 13 21 ' f je zbir prethodna dva broja (f1 i f2 )

f1 1 2 3 5 8 13 21 ' f1 dobija vrednost f

f2 1 1 2 3 5 8 13 ' f2 dobuja vrednost f1

Page 83: Programiranje - predavanja

83

Fibonačijev broj služi za izračunavanje zlatnog preseka.

Select...End Select kontrolna struktura

Poslednja kontrolna struktura nije alternativna već otvara dve ili više mogućnosti. Ovde postoji više mogućih vrednosti Test izraza. Kada se Test izraz poklopi sa nekom Case listom onda se izračunava grupa iskaza koja se načazi između tog Case i sledećeg Case. Na kraju se nalazi Case Else sa iskazom koji se izvršava za sve one slučajeve koji nisu predviđeni dotadašnjim Test izrazom.

Select Case Test izraz

Case lista slučajeva 1

iskazi

Case lista slučajeva 2

iskazi

Case lista slučajeva 3

iskazi

Case Else

iskazi

End Select

Primer: Treba odrediti broj dana u zadatom mesecu, zadate godine

Dim m, g, BrDana As Integer

Page 84: Programiranje - predavanja

84

' m zadati mesec

' g zadata godina

' BrDana je broj dana u mesecu m godine g

Select Case n

Case 1, 3, 5, 7, 8, 10, 12

BrDana = 31

Case 4, 6, 9, 11

BrDana = 30

Case 2

If (g Mod 400 = 0) Or ((g Mod 4 = 0) And (g Mod 100 <> 0))

Then

BrDana = 29

Else

BrDana = 28

End If

Case Else

Page 85: Programiranje - predavanja

85

BrDana = 0

MsgBox '' Nepostojeći mesec '' & m

End Select

Page 86: Programiranje - predavanja

86

Programiranje 9.predavanje 07. 12. 2009.

Kako se program organizuje u Module?

U nekoj fazi izrade algoritma često se razvijaju mnoge komponente nezavisno od glavnog algoritma. Odnosno mogu se uočiti neke komponente koje će biti potrebne tokom izrade nekog programa i zato se one razvijaju kao poseban Modul s ciljem da se uključuje u druge programe po potrebi.

Tako npr. možemo da izdvojimo funkciju izračunavanja NZD u zaseban Modul i da se ne zna unapred zašta će se on koristiti, već će se on po potrebi pozivati u neki program u kom je potrebna ta vrsta izračunavanja. Zato kažemo da jedan takav razvijeni Modul postaje neki opšti Modul koji će drugi programi koristiti. Isti Modul se takođe može koristiti i više puta u toku jednog programa.

Euklidov algoritam služi za izračunavanje NZD (najveći zajednički delilac) dva broja. Ali se pomoću Euklidovog algoritma ne može izračunati NZD 3 broja. Izračunavanje NZD za tri broja moralo bi da se vrši postepeno. Prvo bi smo izračunali pomoću Euklidovog algoritma NZD za 1. i 2. broj, a zatim bi smo pomoću istog algoritma izračunali NZD prethodno dobijene vrednosti i 3. broja. Ovakav postupak bi se pokazao kao veoma neefikasan kada bi smo pristupili izračunavanju NZD za više brojeva. To je razlog zašto se neki algoritam koji se često koristi izdvaja u poseban Modul, a zatim se prema potrebi uključuje u konkretan program.

VBA programski jezik podržava dve vrste ovakvih Modula:

1. funkciju 2. proceduru

Funkcije – 1. vrsta Modula

Funkcija se deklariše na sledeći način:

Function ImeFunkcije(deklaracija argumenata) As Tip Funkcije ' ime funkcije zadaje

programer

iskazi

...

ImeFunkcije = vrednost ' pre kraja funkcije treba da stoji

Page 87: Programiranje - predavanja

87

iskaz dodele kojim ImeFunkcije

End Function dobija vrednost

Na ovaj način se iskazi izdvajaju u zasebnu celinu, odnosno Modul ali se oni neće izvršavati ako se ta funkcija ne pozove.

Deklaracija argumenata – deklarišemo elemente s kojima funkcija radi. Euklidov algoritam radi samo sa dve vrednosti, a koje će to vrednosti biti zavisi od programa.

As Tip funkcije – kako svaka funkcija vraća vrednost programer mora da navede kog je tipa ta vrednost. On može biti:

• As Integer, As Long → celobrojni tip • As Single, As Double → realni tip • As Boolean → logički tip

Primer funkcije

Function Kvadrat(n As Integer) As Integer ' ova funkcija ima samo jedan argument n i on je

fiktivni argument koji se konkretizuje kada se

Kvadrat = n * n funkcija pozove za neku konkretnu vrednost

.

End Function

Negde u programu kada se za tim ukaže potreba ova funkcija će biti pozvana.

f = 2 * Kvadrat(5) + 7

Kvadrat(5) (5)

je isto što i 5 * 5. je stvarni argument s kojim

Page 88: Programiranje - predavanja

88

Tako da je potpuno želimo da izračunamo kvadrat.

svejedno šta ćemo na n ovde dobija vrednost 5

tom mestu da napišemo

Sub ImeProcedure(deklaracija argumenata) ' procedura

Procedure – 2. vrsta Modula

Procedure se deklarišu na sledeći način

2 ne vraća konkretnu vrednost i zato

iskaz nema As Tip

End Sub ' procedura nema naredbu dodele

Primer

2 Procedura nešto radi ali ne vraća jednu konkretnu vrednost. Ona vraća više vrednosti ali na drugi način.

: Postupak izračunavanja NZD za tri broja

Function Euklid (ByVal m As Integer, ByVal n As Integer) As Integer

Dim r As integer ' funkcija za izračunavanje NZD(u našem slučaju funkcija Euklid)

r = m Mod n operiše sa dva broja i zato su u okviru deklaracije funkcije dekla-

risane samo promenljive m i n, dok se pomoćna promenljiva r

While r > 0 deklariše naknadno.

m = n

n = r

r = m Mod n

Wend

Page 89: Programiranje - predavanja

89

Euklid = n

End Function

Dim a As Integer, b As Integer, c As Integer ' negde u programu deklarisane su vrednosti a, b, c

Dim NZD As Integer

.... ovde se nalaze iskazi kojima su a, b, c dobili konkretnu vrednost

NZD = Euklid (a,b) ' pozvali smo funkciju Euklid sa stvarnim vrednostima a i b

NZD = Euklid (NZD,c) ' pozvali smo funkciju Euklid sa stvarnim vrednostima NZD(a,b) i c

MsgBox ''Najveći zajednički delilac je '' + NZD

ByVal predstavlja poziv argumenata po vrednosti. m i n postoje u funkciji kao promenljive koje dobijaju vrednost koju im propisuje poziv. U trenutku poziva m dobija vrednost a, a n dobija vrednost b.

U delu programa gde su deklarisane vrednosti a, b, c

a ← 44

b ← 66

c ← 55

Funkcija Euklid se prvi put poziva za vrednosti a i b i tada m dobija vrednos a, n dobija vrednost b

Euklid (a, b) m ← 44 66 44

n ← 66 44 22

r ← 44 22 0 ' r = m Mod n

r > 0 DA DA NE Euklid ← 22 ' Euklid dobija vrednost 22

NZD ← 22

Page 90: Programiranje - predavanja

90

m i n su argumenti funkcije, a r je lokalna promenljiva koja predstavlja ostatak pri deljenju m sa n. Sve dok je r veće od 0 izvršava se While iskaz, a kada r više nije veće od 0 telo While petlje prestaje da se izvršava i funkcija Euklid dobija vrednost n i ta vrednost je NZD(a,b)

U nastavku pozivamo funkciju Euklid za prethodno dobijenu vrednost (NZD) i za vrednost c. m dobija vrednost NZD, a n dobija vrednost c, a zatim ponavljamo kompletan postupak.

Euklid (NZD, c) m ← 22 55 22

n ← 55 22 11

r ← 22 11 0 ' r = m Mod n

r > 0 DA DA NE Euklid ← 11

Kada je r jednako 0 telo While iskaza se više ne izračunava funkcija Euklid dobija vrednost 11 što predstavlja vrednost NZD(NZD, c)

MsgBox ''Najveći zajednički delilac je 11

---------------------------------------------------------------------------------------------------------------------------

Primer: Postupak izračunavanja NZS (najmanji zajednički sadržilac) pomoću funkcije Euklid:

NZS = a * b \ Euklid (a, b)

---------------------------------------------------------------------------------------------------------------------------

Treba da sastavimo podprogram (proceduru) koji od zadatog datuma pravi datum sledećeg dana.

Ovaj program koristi funkciju BrDanaUMesecu

Function BrDanaUMesecu (ByVal m As Integer, ByVal b As Integer) As Integer

Select Case m

Page 91: Programiranje - predavanja

91

Case 1, 3, 5, 7, 8, 10, 12

BrDanaUMesecu = 31

Case 4, 6, 9, 11

BrDanaUMesecu = 30

Case 2

If ( g Mod 400 = 0 ) Or (( g Mod 4 = 0 ) And ( g Mod 100 <> 0)) Then

BrDanaUMesecu = 29

Else

BrDanaUMesecu = 28

End If

Case Else

BrDanaUMesecu = 0

MsgBox ''Nepostojeći mesec '' & m

End Select

End Function

Funkcija BrDanaUMesecu ima dva celobrojan argumenta m (mesec) i g (godina) i vraća vrednost koja je takođe ceo boj.

Podprogram SledeciDatum deklarišemo sa Sub

Sub SledećiDatum (d As Integer, mes As Integer, god As Integer)

Dim n As Integer

n = BrDanaUMesecu (mes, god) 'pozivamo funkciju BrDanaUMesecu sa konkrektnim mesecom i

Page 92: Programiranje - predavanja

92

godinom

If d = n Then ' provravamo da li je d poslednji dan u mesecu

d = 1 ' ako jeste onda je d prvi dan u mesecu,

If mes = 12 Then ' proveravamo da li je mes poslednji mesec u godini

mes = 1 ' ako jeste onda je mes prvi mesec u godini

god = g + 1 ' a godina je sledeća,

Else

mes = mes + 1 ' u suprotnom mes je sledeći mesec u godini

End If

Else

d = d + 1 ' ako d nije poslednji dan u mesecu onda je d sledeći dan u mesecu

End If

End Sub

Za današnji datum

d ← 7

mes ← 12

god ← 2009

n ← 7 .

d ← 8

Datum 30. 11. 1009.

d ← 30

mes ← 11

god ← 2009

n ← 30 .

d ← 1

Page 93: Programiranje - predavanja

93

mes ← 12

Datum 31. 12. 2009.

d ← 31

mes ← 12

god ← 2009

imati vrednost 12, a godina vrednost 2009

n ← 31 .

d ← 1

mes ← 1

god ← 2010

ByVal predstavlja poziv argumenata po vrednosti. m i n postoje u funkciji kao promenljive koje dobijaju vrednost koju im propisuje poziv. U trenutku poziva m dobija vrednost a, a n dobija vrednost b.

ByRef je podrazumevana vrednost, argumenti se povezuju po referenci.

U sledećoj proceduri koju pozivamo imamo:

Dim dan As Integer, mesec As Integer, godina As Integer

dan = 7

mesec = 12

godina = 2009

SledećiDatum (dan, mesec, godina) ' posle poziva po referenci dan će imati vrednost 7. mesec će

Page 94: Programiranje - predavanja

94

Kada se koristi procedura, a ne funkcija podrazumevana vrednost je ByRef

Sledeći slučaj je funkcija koja se specifično definiše jer poziva samu sebe. To je funkcija Faktorijal

n! = n * (n-1) * (n-2) * (n-3) *...* 3 * 2 * 1

n! = n * (n-1)! ' svaki faktorijal može da se izrazi i na oaj način. Ovo je primer rekurzivne

definicije (definiše se preko same sebe, odnosno to je funkcija koja poziva

samu sebe)

U pseudo jeziku to izgleda ovako:

Modul faktorijal(n)

ako je n = 1 onda

faktorijal = 1

inače

faktorijal = n * faktorijal(n-1)

Kraj Modula

Page 95: Programiranje - predavanja

95

Programiranje 10.predavanje 09. 12. 2009.

U VBA kao mogući moduli postoje procedure i funkcije.

Odlika rekurzivnih funkcija je da pozivaju same sebe (npr. fatorijal funkcija, NZD…)

Funkcij za izračunavanje faktorijala u VBA izgleda ovako:

Function Faktorijal (ByVal n As Integer) As Integer

If n = 1 Then

Faktorijal = 1

Else

Faktorijal = n * faktorijal (n – 1)

End If

End Function

Ovde smo imali primer da funkcija za potrebe izračunavanja poziva samu sebe. Ipak to pozivanje funkcije u jednom momentu mora da se prekine. U slučaju izračunavanja faktorijala do prekida dolazi kada je n = 1.

Karakteristično za rekurzivne funkcije je da se one slažu jedna na drugu. Svaka od njih ima svoje okruženje koje mora da se sačuva. Svaki poziv koji zove sledeći ostaje u hibernaciji sve dok poslednji poziv na vrati vrednost 1 koji omogućava povratno izvršavanje.

Procedura koja poziva funkciju za izračunavanje faktorijala izgledaće ovako:

Dim a As Integer, F As Integer

F = Faktorijal(a)

Page 96: Programiranje - predavanja

96

MsgBox ''Faktorijal '' & a & '' je '' & F

Kako izgleda izračunavanje ?

a = 3

I Poziv Faktorijal (3)

n ← 3 ' u prvom pozivu n dobija vrednost 3

n = 1 Ne ' postavlja se pitanje da li je n = 1, pošto nije

izvršava se Else deo

Faktorijal = 3 * Faktorijal (2) ' (2) je faktorijal n – 1, u ovom slučaju to je 3 – 1

II Poziv Faktorijal (2)

n ← 2 'u drugom pozivu n dobija vrednost 2

n = 1 NE ' n ≠ 1, izvršava se Else deo

Faktorijal = 2 * Faktorijal (1) ' (1) je faktorijal n – 1, odnosno 2 – 1

III Poziv Faktorijal (1)

n ←1 ' u trećem pozivu n dobija vrednos 1

n = 1 DA ' n = 1

Faktorijal = 1 ' faktorijal dobija vrednost 1 i vraća se u

funkciju koja ga je pozvala.

Else ' u suprotnom se izračunava deo iza else

Kako NZD po Euklidovom algoritmu može da se zapiše kao rekurzivna funkcija?

Function EuklidRekurz (ByVal a As Intrger, _ 'imamo 2 formalna parametra koji su

ByVal b As Integer) As Ineger celi brojevi, a vrednost će im se do-

deliti po pozivu funkcije

If a Mod b = 0 Then ' ako b može da podeli a bez ostatka

EuklidRekurz = b onda je b EuklidRekurz

Page 97: Programiranje - predavanja

97

EuklidRekuez = EuklidRekurz (b, a Mod b) ' a Mod b mora da bude nešto što je

manje od b

End If

End Function

Kako bi izgledalo izračunavanje NZD po ovoj funkciji kada je pozovemo u procrduri?

NZD EuklidRekurz (25, 15) ' formalni argumenti a i b dobijaju vrednosti 25 i 15

I Poziv II Poziv III Poziv

a ← 25 a ← 15 a ← 10

b ← 15 b ← 10 b ← 5

(a Mod b = 0) ? NE (a Mod b = 0) ? NE (a Mod b = 0) ? DA

[25 Mod 15 = 0] NE [15 Mod 10 = 0] NE [10 Mod 5 = 0] DA

Pošto je a Mod b = 0 izvršavaće se iskaz posle Then i nećemo

imati nov poziv, A EuklidRekurz dobija vrednost 5,

EuklidRekurz = 5

NZD = 5

I faktorijal i NZD mogu se izračunavati pomoću rekurzivni funkcija, mada postoje i drugi algoritmi koji se mogu izračunavati pomoću rekurzivne funkcije .

Page 98: Programiranje - predavanja

98

NIZOVI

Postoje specijalne vrste funkcija koje se zovu sekvence, a čiji je domen skup prirodnih brojeva ili neki njegov podskup. Takvu sekvencu obeležavamo kao funkciju na sledeći način:

a1 ' ovako se inače obeležava funkcija f (x) , a sa a1 obeležavamo sekvencu

' sekvenca na skupu prirodnih brojeva je beskonačna

' sekvenca na podskupu prirodnih brojeva je konačna

a1 a2 a3 ... ' neograničen skup prirodnih brojeva [1 – n] CN

a1 a2 a3 ... an ' ograničen skup prirodnih brojeva V

Sekvence u programiranju zovu se nizovi i uvek su ograničeni jer je i memorija računara ograničena.

Osnovni algoritmi za rad sa nizovima su:

Recimo da imamo neki niz vrednosti i da želimo da utvrdimo da li taj niz sadrži neku konkretnu vrednost. Pretpostavimo da se radi o uređenom nizu.

a1 a2 a3 ... an

a1 ≤ a2 ≤ a3 ... ≤ an

x – treba utvrditi da li vrednost x postoji ili ne postoji u nizu

Imamo listu imena ljudi poređanu po abecednom poretku, a naš zadatak je da utvrdimo da li ona sadrži neko ime. To ćemo utvrditi korišćenjem algoritma grube sile. Kroz listu ćemo prolaziti redom:

Page 99: Programiranje - predavanja

99

1. sve dok ne nađemo ime 2. sve dok ne dođemo do pozicije gde bi to ime u uređenoj abecednoj listi trebalo da bude ali

nije pronađeno (npr. tražimo prezime Stanković, stigli smo u proveri do prezimena koji po azbučnom redu stoji iza prezimena Stanković, npr. Stančić)

3. sve dok ne dođemo do kraja listi, a da pri tom u njoj nismo našli traženo ime

x nije pronađen

i ← 1 ' promenljiva koja odbrojava elemente niza od 1 pa na dalje

sve dok i ≤ n i x ≥ ai i x nije pronađen ' ovde se radi u While petlji koja ima tri uslova

povezana konjukcijom

ako ai = x onda

x je pronađen

i ← i + 1

do ovde

PRIMER:

1 < 2 < 3 < 5 < 7 < 11 < 13 < 17 < 19 < 23 < 29 < 31 < 37 < 41 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14

niz je uređen

x = 32 ' ovo je vrednost koju tražimo

i ← 1 ' i dobija vrednost 1 [ai = 1]

Page 100: Programiranje - predavanja

100

x nije složeni uslov da li je

i ≤ n x ≥ ai pronađen U ai = x i ai

丅 丅 丅 丅 丄 2 2

丅 丅 丅 丅 丄 3 3

丅 丅 丅 丅 丄 4 5

丅 丅 丅 丅 丄 5 7

丅 丅 丅 丅 丄 6 11

丅 丅 丅 丅 丄 7 13

Page 101: Programiranje - predavanja

101

丅 丅 丅 丅 丄 8 17

丅 丅 丅 丅 丄 9 19

丅 丅 丅 丅 丄 10 23

丅 丅 丅 丅 丄 11 29

丅 丅 丅 丅 丄 12 31

丅 丅 丅 丅 丄 13 37

丅 丄 丅 丄

37 nije manje složeni uslov

od 32 je netačan

x nije pronađeno

Page 102: Programiranje - predavanja

102

ako je vrednost koju tražimo manja od najmanjeg elementa niza ne bi se uopšte izvršavala provera, a ako je vrednost promnljive veća od najvećeg elementa niza---------------------

Mada smo i na ovaj način došli do rešenja ipak za ovakvo izračunavanje postoji efikasniji način, a to je metod binarnog pretraživanja. Ovaj metod se svodi na to da u svakom koraku na pola smanjimo niz u kom tražimo zadati element. Ovaj metod je primenljiv samo u nizovima koji su uređeni. U prvom koraku izračunamo srednji element niza i proveravamo da li upravo on ima vrednost koju tražimo. Ako nema biramo samo levu odnosno desnu polovinu niza u zavisnosti da li zadata vrednost u onoj polovini ispod ili iznad sredine. Na taj način smo smanjili niz na pola. I u svakom sledećem koraku već prepolovljeni niz smanjujemo opet za pola.

a1 a2 a3 ... an

a1 ≤ a2 ≤ a3 ... ≤ an

x nije pronađen

poč ← 1

kraj ← n

Sve dok je poč ≤ kraj i x nije pronađen

i ← (poč + kraj) \ 2 ' izvršavamo celobrojno deljenje jer mora da se dobije

konkretna vrednost

ako je a1 = x onda

x nije pronađen

inače ako je a1 < x onda poč ← i + 1

inače kraj ← i – 1

do ovde

Page 103: Programiranje - predavanja

103

x= 32

x nije pronađen

poč ← 1

kraj ← 14

složeni

x nije uslov da li je da li je

poč ≤ kraj pronađen U i ai ai = x ai < x poč kraj

丅 丅 丅 7 13 丄 丅 8 [14]

丅 丅 丅 11 29 丄 丅 12 [14]

丅 丅 丅 13 37 丄 丄 [12] 12

丅 丅 丅 12 31 丄 丅 13 [12]

丄 丅 丄 → složeni uslov nije tačan x nije pronađen

1 < 2 < 3 < 5 < 7 < 11 < 13 < 17 < 19 < 23 < 29 < 31 < 37 < 41 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14

Page 104: Programiranje - predavanja

104

niz je uređen

x= 11

x nije pronađen

poč ← 1

kraj ← 14

složeni

x nije uslov da li je da li je

poč ≤ kraj pronađen U i ai ai = x ai < x poč kraj

丅 丅 丅 7 13 丄 丄 [1] 6

丅 丅 丅 3 3 丄 丅 4 [6]

丅 丅 丅 5 7 丄 丅 6 [6]

丅 丅 丅 6 11 丅 ? [6] [6]

Page 105: Programiranje - predavanja

105

丅 丄

x je pronađen

x je pronađen na poziciji i = 6

x = 11

Page 106: Programiranje - predavanja

106

Programiranje 11.predavanje 16. 12. 2009.

NIZOVI – nastavak

Kako se nizovi realizuju u programskom jeziku ?

Nizovi su konstrukcije koje dozvoljavaju da se pomoću postojećeg tipa konstruiše sopstveni niz koji se sastoji od konačne sekvencije istog tipa. Te vrednosti istog tipa se pišu u susednim memorijskim lokacijama. Prvi element niza počinje na nekoj lokaciji a preostali se u susednim lokacijama jedan za drugim. Svakom elementu niza može se direktno pristupiti ako se zna:

• adresa 1. elementa niza • koliki je memorijski prostor svakog elementa • i koji broj elementa niza nam je potreban

Nizovi uvek imaju ograničen broj elemenata u programiranju jer je i memorija računara ograničena.

VBA nudi dve mogućnosti, dve vrste nizova:

Statički niz

Za ovaj niz je neophodno da se unapred odredi memorija niza i da se unapred odredi koliko će maksimalno elemenata neki niz da ima. Npr. ako želimo da neki niz ima najviše 20 elemenata to ćemo zapisati na sledeći način:

Const MAXDIM As Ineger = 20 ' Određeno je da niz ima 20 elemenata

Dim niz (MAXDIM) As Integer ' na ovaj način se deklariše niz celobrojnog tipa koji će u

sebi da sadrži MAXDIM elemenata čime se u memeoriji

računara odvaja 20 memorijskih jedinica celobrojnog tipa

koje će pripadati nizu koji smo ovom deklaracijom i

nazvali niz

Dinamički niz

Page 107: Programiranje - predavanja

107

Ovi nizovi su takodje ograničeni ali ne moraju da budu poznati unapred, dinamički nizovi se deklarišu bez navođenja veličine, a tokom izvršavanja programa se može zadati njihova veličina primenom naredbe ReDim:

Dim n As Integer ' n je zelobrojna promenljiva koja u izvršavanja programa dobija neku

vrednost

Dim niz ( ) As Ineger ' ( ) zagrada označava da se radi o nizu ali da se ne zna unapred koliko

će elemenata taj niz imati

n = InputBox (''Unesi broj elemenata niza: '' ) ' n dobija neku vrednost, odnosno uneta

vrednost će biti dodeljena promenljivoj n

ReDim niz (n) '

For i = 1 To n 'Pri radu sa nizovima najčešće se

niz (i) = ImputBox (''Element niz ('' & i '') = '') koriste petlje pošto je to najefikasniji

Next i način da se nad svakim elementom

niza obavi isti niz radnji

Svaki element niza se pomaša kao zasebna promenljiva.

Elementi niza su u susednim memorijskim lokacijama

| 1 | 2 | 3 | 4 | | | | n |

Kako se izračunava adresa i-tog elementa niza ?

adresa niza + i * dužina tipa ' u našem slučaju memorijski prostor je 2 bajta

Page 108: Programiranje - predavanja

108

Adr (niz) + i * Duž (Tip)

Na osnovu ovoga možemo da napišemo funkciju za binarno pretraživanje koje smo videli na prethodnom času:

Function BinarnaPretraga (ByRef niz( ) As Integer, ByVal n As Integer, _

ByVal x As Ineger) As Boolean

' Funkcija vraća vrednost bulovskog tipa (da li je element nađen ili nije nađen)

niz se uvek prenosi po referenci

( ) zagrade označavaju da se radi o nizu

n je broj elemenata niza

x je trazeni element

Dim poc As Ineger, kraj As Ineger, srednji As Integer

' Dodatne promenljive za pocetak, sredinu i kraj

Dim nađen As Boolean

' Promenljiva koja ima vrednosti True ili False (da li je traženi element

pronađen ili nije)

nađen = False ' početak izvršavanja

Page 109: Programiranje - predavanja

109

---------------------------------------------------------------------------------------------------------------------

Function BinarnaPretraga (ByRef niz( ) As Integer, ByVal n As Integer, _

ByVal x As Ineger) As Boolean

Dim poc As Ineger, kraj As Ineger, srednji As Integer

Dim nadjen As Boolean

nadjen = False

poc = 1

kraj = n

While (poc<=kraj) And (not nadjen)

Page 110: Programiranje - predavanja

110

srednji = (poc + kraj) \ 2

If niz (srednji) = x Then

srednji = True

Else If niz(srednji) <= x Then

poc = srednji + 1

Else

kraj = srednji – 1

End If

Wend

BinarnaPretraga = nadjen ' na kraju funkcija Binarna Pretraga vraca vrednost

End Function

Binarna procedura je efikasna procedura za pronalaženje traženog elementa niza.

Sada se postavlja se pitanje kako da dobijemo jedan takav uređeni niz, ako ga kao takvog već nismo sami uneli što obično i nije slučaj, odnosno retko ćemo imati tako uređen niz na samom početku, već cemo u više slučajeva morati da ga uredimo. To je moguće da se postigne sa mnogo procedura i algoritama koji su manje ili više efikasni. Jedan od algoritama za uređenje niza je sledeći:

Selection sort (uređenje niza)

On funkcioniše po sledećem principu: Imamo jedan niz i u 1. koraku prođemo kroz sve elemente niza i kada utvrdimo u tom prolazu koji je najmanji element postavljamo ga na 1. mest. Zatim u 2. koraku

Page 111: Programiranje - predavanja

111

radimo sve to ali samo sa preostalim elementima niza. Ovaj prolaz kroz niz ponavljamo sve dok ne i poslednji element ne postavimo na odgovarajuću poziciju.

a1, a2, ... an

za i od 1 do n – 1 'imamo 2 petlje brojačkog tipa umetnute jednu u drugu

j od i +1 do n

ako ai > aj onda

ai ↔ aj ' ai i aj menjanju mesto

do ovde i

PRIMER:

3 7 2 5 1 4 → elementi u nizu

1 2 3 4 5 6 → pozicije koje elementi zauzimaju u nizu

n = 6

koraci izvršavanja

1. korak

i (i dobija vrednost 1) j (dobija vrednost i +1) ai > aj ai ↔ aj a1, a2, ... an

1 2 3 > 7 ne

3 3 > 2 da a1←2 a3←3 2 7 3 5 1 4

4 2 > 5 ne

Page 112: Programiranje - predavanja

112

5 2 > 1 da a1←1 a5←2 17 3 5 2 4

6 1 > 4 ne

' j je došlo do kraja (n). Unutrašnja petlja se završila ali se nije završila

spoljašnja petlja pa u sledećem koraku i dobija vrednost 2. Odredili

smo mesto 1. elementa u nizu

2. korak

i (i dobija vrednost 2) j (dobija vrednost i +1) ai > aj ai ↔ aj a1, a2, ... an

2 3 7 > 3 da a2←3 a3←7 1 3 7 5 2 4

4 3 > 5 ne

5 3 > 2 da a2←2 a5←3 1 2 7 5 3 4

6 2 > 4 ne

' j je došlo do kraja (n). Unutrašnja petlja je završila s radom ali se

nije završila spoljašnja petlja pa se u sledećem koraku i opet uvećava i

dobija vrednost 3. Odredili smo mesto 1. i 2. elementa u nizu

3. korak

i (i dobija vrednost 3) j (dobija vrednost i +1) ai > aj ai ↔ aj a1, a2, ... an

Page 113: Programiranje - predavanja

113

3 4 7 > 5 da a3←5 a4←7 1 2 5 7 3 4

5 5 > 3 da a3←3 a5←5 1 2 3 7 5 4

6 3 > 4 ne

' j je došlo do kraja (n). Unutrašnja petlja je završila s radom ali se

nije završila spoljašnja petlja pa se u sledećem koraku i opet uvećava

i dobija vrednost 4. Odredili smo mesto 1, 2. i 3. elementa u nizu.

4. korak

i (i dobija vrednost 4) j (dobija vrednost i +1) ai > aj ai ↔ aj a1, a2, ... an

4 5 7 > 5 da a4←5 a5←7 1 2 3 5 7 4

6 5 > 4 da a4←4 a5←5 1 2 3 4 7 5

' j je došlo do kraja (n). Unutrašnja petlja je završila s radom ali se

nije završila spoljašnja petlja pa se u sledećem koraku i opet uvećava

i dobija vrednost 5. Odredili smo mesto 1, 2, 3. i 4. elementa u nizu

5. korak

i (i dobija vrednost 5) j (dobija vrednost i +1) ai > aj ai ↔ aj a1, a2, ... an

5 6 7 > 5 da a5←5 a6←7 1 2 3 4 5 7

'unutrašnja petlja je došla do kraja i prestaje da radi, prelazi se na

Page 114: Programiranje - predavanja

114

spoljašnju petlju ali je i ona dostigla poslednju vrednost što znači da

smo dobili uređen niz

Ovaj postupak je dosta neefikasan jer zahteva jer je broj poređenja približno jednak kvadratu elemenata

niza, ( ≈ n2) puta poređenja

Selection sort je algoritam selekcije (izbora) najmanjeg elementa u nizu.

Sledeći algoritam sortiranja je:

Bubble sort (mehurići)

Niz se posmatra kao čaša gazirane vode čiji mehurići predstavljaju elemente niza. Najveći element u vidu mehurića izlazi na vrh. Bubble sort takođe zahteva dvostruku petlju. U svakom koraku prolazi se kroz do tada nesređeni niz i porede se susedni elementi da bi se na kraju na poslednjoj poziciji postavio najveći element.

za i od n – 1 do 1 po korak – 1

za j od 1 do i

ako aj > aj +1 onda

aj ↔ aj + 1

do ovde j

do ovde i

Page 115: Programiranje - predavanja

115

PRIMER:

3 7 2 5 1 4 → elementi u nizu

1 2 3 4 5 6 → pozicije koje elementi zauzimaju u nizu

1. korak

i (i dobija vrednost 5) j (ide od 1 do i) aj > aj +1 aj ↔ aj+1 a1, a2, ... an

5 1 3 > 7 ne

2 7 > 2 da a2←2 a3←7 3 2 7 5 1 4

3 7 > 5 da a3←5 a4←7 3 2 5 7 1 4

4 7 > 1 da a4←1 a5←7 3 2 5 1 7 4

5 7 > 4 da a5←4 a6←7 3 2 5 1 4 7

' stigli smo do poslednjeg j u unutrašnjoj petlji koji ije jednak i, a i ima

vrednost 5. Dobili smo poslednji element u nizu.

2. korak

Page 116: Programiranje - predavanja

116

i (i dobija vrednost 4) j (ide od 1 do i) aj > aj +1 aj ↔ aj+1 a1, a2, ... an

4 1 3 > 2 da a1←2 a2←3 2 3 5 1 4 7

2 3 > 5 ne

3 5 > 1 da a3←1 a4←5 2 3 1 5 4 7

4 5 > 4 da a4←4 a5←5 2 3 1 4 5 7

' stigli smo do poslednjeg j u unutrašnjoj petlji koji ije jednak i, a i ima

vrednost 4. Dobili smo poslednja 2 elementa u nizu.

3. korak

i (i dobija vrednost 3) j (ide od 1 do i) aj > aj +1 aj ↔ aj+1 a1, a2, ... an

3 1 3 > 3 ne

2 3 > 1 da a2←1 a3←3 2 1 3 4 5 7

3 3 > 4 ne

'stigli smo do poslednjeg j u unutrašnjoj petlji koji ije jednak i, a i ima

vrednost 3. Dobili smo poslednja 3 elementa u nizu.

4. korak

Page 117: Programiranje - predavanja

117

i (i dobija vrednost 2) j (ide od 1 do i) aj > aj +1 aj ↔ aj+1 a1, a2, ... an

2 1 2 > 1 da a1←1 a2←2 1 2 3 4 5 7

2 2 > 3 ne

'stigli smo do poslednjeg j u unutrašnjoj petlji koji ije jednak i, a i ima

vrednost 2. Dobili smo poslednja 4 elementa u nizu.

5. korak

i (i dobija vrednost 2) j (ide od 1 do i) aj > aj +1 aj ↔ aj+1 a1, a2, ... an

1 1 1 > 2 ne 1 2 3 4 5 7

Efikasnost Bubble sort je slična kao i kod Selection sort i iznosi ≈ n2 ustvari je n*n /2

Procedura za ovaj algoritam izgleda ovako:

Sub bubblSort (ByRef niz( ) As Integer, BzVal n As Ineger)

Dim i As Integer, j As Integer, pom As Integer

Page 118: Programiranje - predavanja

118

For i = n – 1 To 1 Step -1

For j = 1 To i

If niz (j) > niz (j+n) Then

pom = niz (j)

niz(j) = niz (j+1)

niz(j+1) = pom

End If

Next j

Next i

End Sub

Page 119: Programiranje - predavanja

119

Programiranje 12.predavanje 21. 12. 2009.

Šta je osnovni nedostatak rada sa nizovima ?

Pretpostavimo da imamo neki niz od n elemenata a1, a2, a3,... an i da hoćemo iz njega da izvučemo sve elemente koji imaju vrednost x. U novodobijenom nizu, posle izbacivanja željenih elemenata, ne možemo da imamo rupe. Već novi niz mora da ostane niz sukcesivnih vrednosti. To ćemo postići tako što ćemo izvršiti pomeranje svih elemenata ulevo.

j ← 0 ' ovde imamo 2 brojača j i i

za i od 1 do n i – brojač koji prolazi kroz sve elemente početnog niza

ako ai <> x onda j – počinje sa odbrojavanjem od 1 i broji sve pozicije

j → j + 1 novog niza koji nastaje izbacivanjem elemenata.

aj ← ai To je brojač za sve pozicije različite od x

do ovde ako ' nema Else dela

do ovde i

n ← j

x = 2 ' x je tražena vrednost koju želimo da izbacimo

n = 8 ' n označava niz od 8 elemenat

3 7 2 5 1 2 8 3 → elemnti niza

a1 a2 a3 a4 a5 a6 a7 a8 → pozicija elemenata u nizu

j ← 0

Page 120: Programiranje - predavanja

120

i ai <> x j aj ← ai a1, a2, a3,... an

(na početku i (na početku j (izgled niza posle

ima vrednost 1) dobija vrednost 1) svakog koraka)

1 3 <> 2 da 1 a1 ← 3 3 7 2 5 1 2 8 3

2 7 <> 2 da 2 a2 ← 7 3 7 2 5 1 2 8 3

3 2 <> 2 ne 3 7 2 5 1 2 8 3

4 5 <> 2 da 3 a3 ← 5 3 7 5 5 1 2 8 3

5 1 <> 2 da 4 a4 ← 1 3 7 5 1 1 2 8 3

6 2 <> 2 ne 3 7 5 1 1 2 8 3

7 8 <> 2 da 5 a5 ← 8 3 7 5 1 8 2 8 3

8 3 <> 2 da 6 a6 ← 3 3 7 5 1 8 3 8 3

n ← j = 6 ' n dobija vrednost j, a to je 6. Novi niz ima 6 elemenata od a1 do a6

Kada bi smo sada hteli da ubacimo neki element u već postojeći niz morali bismo da vršimo pomeranje elemenata udesno i na taj način obezbedimo mesto za nove elemente niza.

Page 121: Programiranje - predavanja

121

SEKVENCIJALNE LISTE

Sekvencijalne liste predstavljaju niz elemenata određenog (istog) tipa ali se njima može pridružiti srogo (samo) sekvencijalno. To su jednostruke ili linearne liste. Ne deklarišemo ih kao elemente niza.

e1, e2, e3, ... en T

L = (e1, e2, e3, ... en) ' Lista predstavlja n-torke elemenata

bitan je redosled n-toriki u nizu

n – dužina liste

ako je n = 0 lista je prazna

Obilazak liste podrazumeva da znamo gde lista počinje.

Glava liste je početak liste. A to je njen prvi element.

Funkcija naslednik određuje šta će biti sledeći element list.

GlavaListe (L) → e1, e2, e3, ... en

Poslednji element liste ne pokazuje ni na jedan sledeći element i taj element označava kraj liste. Nema direktnog pristupanja elementima kao kod nizova, već se kreće od glave odakle se traži sledeći element liste.

Svaki element se sastoji od 2 dela. Element e1 ima dva dela:

• prvi deo je sadržaj tog elementa Є T ' odgovara tipu T • drugi deo elementa pokazuje koji je sledeći element

e1 ' element e

e1.sadržaj = x ' prvi deo je sadržaj elementa e

Page 122: Programiranje - predavanja

122

e1.sledeći = e2 ' drugi deo pokazuje koji je sledeći element

' u slučaju da je drugi deo elementa nil on u VBA označava

nothing odnosno kraj liste nil = nothing u VBA

Lista od 4 elementa jeste sekvencijalna ali njeni elementi ne moraju da budu na susednim memorijskim lokacijama. U liste je mnogo lakše ubacivati i iz njih izbacivati elemente nego u nizove. Ovo je primer sekvencijalne liste:

-----------------------------

SLIKA LISTE

glava (L) = p1 'ovde bi tip bio integer

p1.sadržaj = 2

p1.sledeći = p2

-----------------------------

p2.sadržaj = 5

p2.sledeći = p3

-----------------------------

p3.sadržaj = 8

p3.sledeći = p4

Page 123: Programiranje - predavanja

123

p4.sadržaj = 11

p4.sledeći = nil

Ako zelimo da ubacimo neki element koji ima vrednost 7 između elemenata koji imaju vrednost 5 i 8 to ćemo uraditi na sledeći način:

Lista koju imamo 2, 5, 8, 11 predstavlja jednu uređenu listu. Da bi smo sada na odgovarajući način ubacili element koji ima vrednost 7 krećemo od glave i tražimo poziciju na koju bi željeni element trebalo ubaciti. Ta pozicija je između elementa manjeg od 7 i elementa većeg od 7. Prema tome na novi element p5 koji ima vrednost 7 pokazivaće sada element p2, dok će novi element p5 pokazivati na element p3.

Na ovaj način smo ubacili novi element, a da pri tom ništa nismo pomerali što predstavlja prednost u odnosu na ubacivanje elemenata u nizu. Ovakav način ubacivanja elemenata u liste je zato mnogo efikasniji nego kod nizova. Zato je on efikasan kod dinamičkih podataka

Ako sada iz tog niza koji imamo želimo da izbacimo neki element, npr. element koji ima vrednost 8 to ćemo uraditi na sledeći:

I kod izbacivanja elemenata krećemo od glave, prolazimo elemente p1, p2 i p5 koji imaju vrednosti 2, 5 i

7 i njih ne izbacujemo. Kada dođemo do elementa p3 koji sadrži vrednost 8 njega ćemo da izbacimo tako

što će sada elementa p5 pokazivati na element p4 što će biti omogućeno uvođenjem novog pokazivača. I ovaj put smo prekopčali elemente u listi a da ništa nismo pomerali.

PRIMER

Imamo Listu elemenata iz koje treba da izbacimo svako pojavljivanje vrednosti x. To ćemo učiniti pomoću programa koji izbacuje vrednost x sa liste:

Dim e As ElementListe

Dim stari As ElementListe

...

Page 124: Programiranje - predavanja

124

Set e = pokGlave ' e je tekući element liste

Set stari = pokGlave ' stari je prethodni element liste

i oni (e i stari) moraju da idu u paru

While Not (e is Nothing)

If e.sadrzaj = x Then

Sel stari.sledeci = e.sledeci ' pokazivač prethodnog elementa treba da se postavi na

novi element

Else

Set stari = e

End If

Set e = e. sledeci

Wend

Uvek radimo sa 2 elementa liste:

• sa tekućim elementom liste • i sa prethodnim elementom liste ' u njemu menjamo pokazivač

Page 125: Programiranje - predavanja

125

Na početku rada su e i stari 1. element liste.

SLIKA LISTE

Na početku 2 5 8 11

p1 p2 p3 p4

x = 8

e ← p1

stari ← p1

┐→ negacija netačnog je tačno

negacija tačnog je netačno

┐(e is Nothing) e.sadrži = x stari e ( da li je e.sadržaj jednako x ) (prethodni (tekuću

element liste) element liste)

T 2 | p1 p2

T 5 | p2 p3

T 8 T p2 p4

T 11 | p4 Nothing

Page 126: Programiranje - predavanja

126

1. LIFO – Last In Frst Out

|

u slučaju da menjamo prvi element liste onda mora da se promeni i glava liste

Specijalni oblici liste su:

2. FIFO – Frst In Frst Out

LIFO – Last In First Out3

- prvi oblik specijalne liste

LIFO lista se na specifičan način puni i prazni, a ne na proizvoljan način kao obične liste. U LIFO listi se uvek na jednom kraju dodaju elementi i samo se sa tog kraja i skidaju.

Glava LIFO liste nam pokazuje gde možemo da dodajemo elemente i ujedno pokazuje da odatle samo možemo i da ih skidamo. Ono što smo poslednje dodali prvo ćemo morati i da skinemo.

U programu Word kada nešto kucamo mi unosimo određenim redosledom neke elemente, ako na kraju nešto pogrešimo upotrebicemo komandu undo kojom ćemo izbrisati upravo poslednji element unet kucanjem. Ako bi smo nastavili sa komandom undo obrasali bi smo posle poslednjeg pretposlednje zatim onaj pre njega i tako redom. Ovo je primer jedne LIFO liste.

Kako izgleda ta LIFO lista ?

SLIKA LISTE LIFO

3 LIFO Last-in, First-out

Protokol za strukture podataka koje se zovu stek i u koje

se elementi dodaju ili uzimaju sa jednog kraja (vrha).

Dakle, element uklonjen iz steka je onaj koji je proveo u

njemu najkraće vreme (uporediti sa FIFO).

Page 127: Programiranje - predavanja

127

Aktiviranjem komande undo poništava se ona situacija koja je poslednja bila urađena. Elementi se dodaju na jednom jedinom kraju a kada se elementi skidaju isključivo se skidaju sa istog tog kraja i to počev od poslednjeg unetog elementa.

PUSH – dodavanje elemenata

POP – izbacivanje elemenata

Primer LIFO liste je ređanje opranih i suvih tanjira iz mašine za pranje sudova. Kada vadimo tanjire jedan po jedan slažemo na onaj prethodno izvađeni tanjir. Kada želimo da ih upotrebimo prvo uzimamo tanjir sa vrha gomile koji smo poslednji postavili.

Kako izgleda funkcija POP – skidanje elemenata

Set pom = m_pokGlave ' pom je novi (poslednji) element koji pokazuje pokazivač

glave – to je element brisanja

pop = pom.sadržaj ' pop je funkcija koja treba d vrati na prethodnu vrednost –

Page 128: Programiranje - predavanja

128

funkcija brisanja

Set m_pokGlave = pom.sledeći ' pokazivač glave će sada pokazivati sledeći element

pom je onaj element koji pokazuje pokazivač glave, u našem slučaju to je element-brisanje

FIFO – First In First Out

Kako izgleda funkcija PUSH – dodavanje elemenata liste

Set element = New ElementListe ' u memoriji se otvara prostor za novi element liste

element.sadržaj = novi_sadržaj ' popunjava se sadržaj novog elementa. (npr. novi ele-

ment je promenljiva FONT koja dobija neki sadržaj)

Set element.sledeći = m_pokGlave ' zatim se u novom elementu popunjava podatak o

sledećem elementu liste onom koji je ranije bio na vrhu

Set m_pokGlave = element ' sada pokazivač glave pokazuje na novi, dodati element

4

4 FIFO First-In, First-Out

Poznata struktura podataka, linearna lista, kod koje se

unošenje vrši na jednom kraju, a pristup i brisanje na

drugom kraju liste.

- drugi oblik specijalne liste

Page 129: Programiranje - predavanja

129

U njoj se na jednom kraju liste dodaju elementi a sa drugog kraja liste se elementi skidaju. Prvo koristimo onaj element koji je prvi i stavljen u listu

Najbolji primer iz života je red kod lekara u čekaonici. Osoba koja je prva došla biže i prva na redu da uđe. dok će novo pridođli da se dopunjuju na kraju reda.

SLIKA LISTE FIFO

Kod ove liste imamo 2 pokazivače:

• pokazivač glave • pokazivač repa

Kako izgleda preuzimanje elemenata ?

dodavanje

Dim element As ElementListe

Page 130: Programiranje - predavanja

130

Set element = New ElementListe 'novi element liste

element.sadržaj = Lice.(Laza) ' osoba koja je došla

If JePrazno( ) Then ' Bulovska funkcija izvršava proveru da li je

čekaonica prazna

Set m_pokGlave = element 'u slučaju da je čekaonica prazna i pokazivač repa

Set m_pokRep = element i pokazivač glave pokazuju na isti element

Else

Set m_pokRep.sledeći = element

Set m_pokRep = element

End If

Na postojeću listu se popunjavaju stalno novi elementi.

Page 131: Programiranje - predavanja

131

Programiranje 13.predavanje 28. 12. 2009.

Fifo lista - Skidanje elemenata sa liste

Kod fifo liste elementi su povezani na takav način, što dva dodatna pokazivača omogućavaju da se na jedan kraj liste dodaju elementi, a sa drugog kraja skidaju. Glava je onaj pokazivač koji pokazuje elemente koji se skidaju, a rep pokazuje tamo gde treba dodavati nove elemente. Taj deo programa koji bi tako nešto radio, izgledao bi ovako:

Set pom = m_pokGlava

Podatak = pom. Sadržaj

If m_pokGlava = m_pokRep Then

Set m_pokGlava = Nothing

Set m_pokRep = Nothing

Else

m_pokGlava = pom.Sledeći

End If

Set pom = Nothing

To je sad deo programa kojim se realizuje skidanje elemenata liste, naravno ide na onom kraju liste koji pokazuje specijalni pokazivač glave. Na početku pom postaje promenljiva koja pokazuje taj element koji se nalazi na tom kraju liste koji nazivamo glava, i ta vrednost koja je zapisana u čvoru koji pokazuje glava i u nju smeštamo pom.Sadržaj (bilo koji da je to podatak). Imamo specijalni slučaj, šta se dešava u slučaju da pokazivači repa pokazuju isti element, to znači da lista sadrži samo jedan element, jer ako Glava pokazuje one koji se nalaze na vrhu, a Rep one koji se nalaze na kraju ako su oni jednaki znači da imamo samo jedan elemen t, sad i ako n jega sk inemo onda više neće ostati n išta u listi, a jedan i drug i pokazivač treba da pokažu ništa, što će ukazivati na to da je lista u tom trenutku prazna. Ali ako nije taj slučaj, pokazivač glave i repa nisu isti dakle pokazuju različite elemente, onda pokazivač glave u tom slučaju mora da se pomeri i da pokaže onaj element koji je pokazivao element na vrhu, što bi bio sledeći element u listi (znači pokazivač glave se pomera da pokaže taj sledeći element), i tačno se pom postavlja na Nothing što znači da taj element koji smo skinuli s liste više ne zauzima prostor, tj. u listi ga više nema.

Na prošlom času smo rekli da kada se koriste liste, bilo da je obična povezana lista ili lista tipa LIFO ili FIFO, liste služe da se na neki način obradjuju podaci koji su dinamičke prirode, znači podaci koji se u

Page 132: Programiranje - predavanja

132

toku rada programa na neki način menjaju, nisu fiksni (učitavaju se na početku programa i da oni staju takvi kakvi su i obradjuju se) nego se tokom rada programa menjaju. Tj. na onome kako smo ilustrovali kad se koriste jedna ili druga lista je jasno, npr. lista last in first out koju smo ilustrovali sa undo operacijom u wordu jasno je da to realizuje situaciju koja se menja u svakom trenutku dok kucamo i radimo ta se lista stalno puni i prazni u zavisnosti od toga šta radimo, a kod frst in first out npr. ako ilustrujemo red ljudi kod lekara koji se puni s jedne strane a s druge strane prazni, i ako zamislimo situaciju da lekar radi 6h to je nešto što se menja, kad dodje on na posao u situaciju optimalnu za njega lista je prazna, i onda počinje da se puni pa kako on počinje da prima pacijente ona se prazni, ali stižu novi ona se puni itd, znači stalno se ta situacija menja.

Drvo struktura

(takođe služi za rad sa dinamičkim podacima)

(A,R)

K A

x A

K R y1, y1 R y 2, … y n R x

K nema pretke

x ≠K

Pod drvetom (stablom) podrazumeva se jedan par (A,R) koji se označava sa: A je skup nekih elemenata (čvorova), R je binarna relacija koju nazivamo otac od ili neposredni predak od

Drvo je jedan ovakav par koji se sastoji od skupa čvorova i relacija otac od, odnosno neposredni predak od. U ovom skupu elemenata koje nazivamo čvorovi, postoji jedan istaknuti element koji se naziva koren drveta K i za njega važi sledeće: za svaki drugi element iz ovog skupa čvorova postoji tačno jedan put koji vodi od korena do tog elementa prateći relaciju otac od.

K R y1 → Koren je u relaciji sa elementom y1, y1 R y 2 → y1 je u relaciji sa elementom y 2 itd do y n R x → y n je u relaciji sa x – to je taj put koji vodi od korena do tog čvora x, što znači da je x otac ili neposredni predak od y1, y1 neposredni predak od y2 itd. Ali tu nam put postoji tačno jedan. I ovakva osobina ove relacije R ima za posledicu sledeće: da koren K nema pretke i da za svako x koje pripada A postoji tačno jedno y tako da je y u relaciji sa x, pošto koren nema pretke x je različito od K, i za svako drugo x koje nije koren postoji tačno jedno y koje je njegov neposredni predak tj. otac.

Page 133: Programiranje - predavanja

133

Primer: A = { x | 1 ≤ x ≤ 10} A je neki skup elemenata x takvih da su x neki čvorovi od 1

do 10

R = {(1,2), (1,3), (1,4), (2,5), (2,6), (3,7), (4,8), (7,9), (7,10)} prvi element svakog

uređenog para je otac od

drugog tog uređenog para

K = 1 Gledajući ovu relaciju lako se vidi da je koren drveta zapravo

element 1 zato što on nema pretke, zato što se 1 ne javlja ni u

jednom ovom uredjenom paru na drugom mestu

x=10 Kako izgleda put koji vodi od čvora do korena? Ako uzmemo

npr. element x=10, da bismo utvrdili koji je njegov put od

korena do 10 to možemo da utvrdimo idući unazad

1R3, 3R7, 7R10 x=10 Šta je njegov neposredni predak? Vidimo da je 10 na drugom mestu, njegov neposredni predak je 7 (7R10), sad gledamo gde je 7 na drugom mestu da bi našli njegovog neposrednog pretka i to je 3 (3R7), zatim gledamo gde je 3 na drugom mestu i njegov neposredni predak je 1(1R3) i tako smo došli do tog jednstvenog puta koji vodi od korena što je 1, do tog čvora koji nas je ovde interesovao a to je 10.

Kada nacrtamo ovo drvo onda postaje jasno zašto ga zovemo drvo.

1

2 3 4

Page 134: Programiranje - predavanja

134

5 6 7 8

9 10

1 je na vrhu pošto je to koren i on ima 3

nposredna naslednika 2 3 4

2 ima dva neposredna naslednika to su 5 i 6

3 ima samo jednog to je 7

4 ima isto samo jednog i to je 8

7 ima dva naslednika to su 9 i 10

Listovi su čvorovi koji nemaju naslednike 5 6 9 10 8

Unutrašnji čvorovi su 1 2 3 4 7

Grana bi bio jedan put od korena do lista, ovde npr. 1→2→5, ili 1→3→7→9

Svi čvorovi do kojih se dolazi putem jednake dužine nalaze se na istom nivou.

Isti nivo: npr. putevi 1→2→5 i 1→2→6 su putevi iste dužine, u ovom slučaju putevi dužine 2, prema tome 5 i 6 su na istom nivou, ali su na istom nivou i čvorovi 7 i 8 jer se do svih njih dolazi putem iste dužine.

Visina drveta: ona odredjuje najduži put, što je u ovom slučaju dužina 3 (1 3|3 7|7 10) ili

(1 3|3 7|7 9)

Često se kaže da je 2 otac od 5 i 6 (ili neposredni predak), a 5 i 6 su njegova deca. Može se reći da su 5 i 6 potomci čvora 1; 9 i 10 su potomci čvora 3 ali su deca čvora 7. Čvorovi koji su deca istog čvora oni su braća npr 5 i 6 su braća jer su deca čvora 2, isto tako 2 3 i 4 su braća jer su deca čvora 1.

Čemu služi ovakva jedna struktura? Kad imamo jednu strukturu koja je drvo za čvorove drveta se vezuju nekakve informacije, u ovom slučaju su te informacije ovi brojevi.

Kako se mogu pronaći informacije koje su zapisane u drvetu, kako se dodaje novi podatak u drvetu?

Page 135: Programiranje - predavanja

135

Postupak obilaženja drveta: krene se od korena i ide se nalevo do čvora do god se može, kada smo došli do te grane koja vodi sve ulevo do lista i tu ne možemo ništa da kažemo, vraćamo se do oca i onda gledamo šta se dešava udesno, kada više udesno ničeg nema onda se moramo vratiti do oca i ići do njegovog oca (jer smo iscrpeli sve mogućnosti), pa se onda ide opet ide udesno.

Kako bi izgledao postupak obilaženja ovog drveta?

Krenemo od čvora 1 i idemo ulevo do lista, stalno ulevo – imamo čvor 2 pa čvor 5, pošto je 5 list nemamo gde dalje da idemo ulevo, vraćamo se do njegovog oca i tražimo da li imamo nešto udesno, imamo čvor 6 i to je opet list, vraćamo se do oca 2, ali pošto udesno ničeg nema vraćamo se do njegovog oca a to je 1 itd.

1 2 5 2 6 2 1 3 7 9 7 10 7 3 1 4 8 4 1 → obilazak drveta na prethodno objašnjen način

Kad se obilazi drvo postavlja se pitanje kada se informacije koje postoje u drvetu čitaju?

Tu postoje 3 mogućnosti čitanja informacija:

Prefiksni obilazak drveta - čita se informacija kada se na nju naiđe prvi put

Infiksni obilazak drveta - čita se informacija kada se na nju naiđe drugi put

Sufiksni obilazak drveta - čita se informacija kada se na nju naiđe poslednji put

Jer kao što vidimo iz ovog obilaska čvorova neki čvorovi se obiđu više puta, ovde smo 4 puta bili u korenu, 3 puta u čvoru 2.

Prefiksni obilazak: 1 2 5 6 3 7 9 10 4 8

Sufiksni obilazak: 5 6 2 9 10 7 3 8 4 1

Infiksni obilazak: 5 2 6 1 9 7 10 3 8 4

Vidimo da čitanje informacija u sva tri slučaja izgleda potpuno drugačije.

Page 136: Programiranje - predavanja

136

Sadržaj

m_pokLevo

m_pokDesno

Funkcija ispisivanja sadržaja drveta u infiksnom obilasku

Ovde su nam potrebna dva podatka osim Sadržaja, to su podaci Levo i Desno. Ta dva podatka su potrebna kada radimo sa tzv binarnim drvetima (kod kojih svaki čvor ima najviše 2 naslednika). Sa takvim strukturama se u programiranju najviše radi. Ovaj prošli primer nije binarno drvo jer u njemu neki čvorovi imali i po 3 naslednika. A

Page 137: Programiranje - predavanja

137

Function infiksniObilazak()As String ‘ova funkcija treba da izlista sve lemente drveta

infiksniObilazak = “ ” ‘na početku je niska prazna

If Not LevoPoddrvo Is Nothing Then

infiksniObilazak = LevoPoddrvo.infiksniObilazak()

End If

infiksniObilazak = InfiksniObilazak & “ ” & “Sadržaj”

If Not DesnoPoddrvo Is Nothing Then

infiksniObilazak = infiksniObilazak & “ ” & DesnoPoddrvo.infiksniObilazak()

End If

End Function

Radi se o tome da ova funkcija nazvana infiksni obilazak, koja je tipa niska, znači da treba da proizvede neku nisku na kraju u koju će biti sakupljeni svi podaci koji se nalaze u svim čvorovima drveta. Na početku dobija praznu nisku, i sada (ovo je rekurzivna funkcija i sve funkcije koje rade sa drvetima su rekurzivne funkcije) pošto želimo da imamo infiksni obilazak onda se obilazi levo poddrvo sve dok ono nije prazno, a piše ništa kada smo došli do poslednjeg čvora i u svakom tom slučaju infiksni obilazak postaje infiksni obilazak levog poddrveta, a onda se kada je levo poddrvo obradjeno, onda se na infiksni obilazak doda čvor postojećeg korena – u njega se dodaje njegov saržaj, i onda se ide na obradu desnog poddrveta ako ono nije prazno. Lako se mogu dobiti prefiksni i sufiksni, radi se o tome da se ova instrukcija pomeri pre levog poddrveta za prefiksni odnosno posle desnog poddrveta za sufiksni obilazak.

infiksniObilazak = InfiksniObilazak & “ ” & “Sadržaj”

Za prefiksni obilazak drveta funkcija izgleda ovako:

Function infiksniObilazak()As String ‘ova funkcija treba da izlista sve lemente drveta

infiksniObilazak = “ ” ‘na početku je niska prazna

Page 138: Programiranje - predavanja

138

If Not LevoPoddrvo Is Nothing Then

infiksniObilazak = LevoPoddrvo.infiksniObilazak()

End If

If Not DesnoPoddrvo Is Nothing Then

infiksniObilazak = infiksniObilazak & “ ” & DesnoPoddrvo.infiksniObilazak()

End If

End Function

Za sufiksni obilazak drveta funkcija izgleda ovako:

Function infiksniObilazak()As String ‘ova funkcija treba da izlista sve lemente drveta

infiksniObilazak = “ ” ‘na početku je niska prazna

If Not LevoPoddrvo Is Nothing Then

infiksniObilazak = LevoPoddrvo.infiksniObilazak()

End If

If Not DesnoPoddrvo Is Nothing Then

infiksniObilazak = infiksniObilazak & “ ” & DesnoPoddrvo.infiksniObilazak()

End If

Page 139: Programiranje - predavanja

139

infiksniObilazak = InfiksniObilazak & “ ” & “Sadržaj”

End Function

Primena: Ako imamo neke podatke koji su nam potrebni u uredjenom poretku. Tu imamo dve situacije:

1) da nam je na početku rada programa pozanta ta lista, da možemo da je učitamo i da se ona u toku rada programa neće menjati

2) da nam je potrebna lista uredjenih imena ali ona nije unapred poznata, nego se menja, stalno se dodaju neka imena, a lista nam je potrebna uredjena. Ako bismo imali strukturu niza to znači da bi mi morali stalno taj niz da sortiramo i pomeramo članove niza što je neefikasno. U tom slučaju struktura drveta je idealna.

Primer 1. Ovde su nam podaci potrebni uredjeni u azbučnom poretku. Ako je podatak koji stiže u azbučnom redosledu pre datog podatka onda ćemo popuniti levi čvor, a ako je posle u abecednom poretku popunjavamo desni čvor. Npr. pošto je tata u abecednom poretku posle mame popunjavamo ga sa desne strane, i sve tako radimo do kraja...

mama mama

tata

brat

strina

ujak

ujna brat tata

sestra

stric

Page 140: Programiranje - predavanja

140

baka baka deka strina ujak

deka___

jetrva jetrva sestra stric ø ujna

Pošto je program čitao podatke formirao je ovo drvo. Svi čvorovi osim listova imaju dva naslednika, osim ujaka – taj čvor je prazan ali je bitan za obilazak. Ako obidjemo ovo drvo i pročitamo informacije u infiksnom poretku vidimo da tu nema redosleda.

Infiksni poredak: baka, brat, (jetrva),deka, mama, sestra, strina, stric, tata, ujak, ujna

Kada se drvo formira na ovaj način u njega se stalno mogu dodavati novi čvorovi, možemo da imamo rodjaka koga ćemo ubaciti u listu npr posle svih ovih stiže jetrva i ona će se smestiti u ovo drvo – pre mame dolazi u azbučnom poretku, posle brata se nalazi deka, prema tome ona se nalazi posle deke i stajaće desno.

Primer 2. Drvo kao struktura koristi se za predstavljanje i izračunavanje aritmetčkih izraza.

Operatori će biti čvorovi, listovi će biti operandi (brojevi), a koren će biti onaj operator koji se poslednji izvršava u aritmetičkom izrazu.

2*3+(4+3)*3

Page 141: Programiranje - predavanja

141

+ (=27)

* (=21)

* (=6) + (=7) 3

2 3 4 3

Kad bismo obišli ovo drvo u infiksnoj notaciji mi bismo dobili tačan aritmetički izraz s tim što bi nam nedostajale zagrade. Ovako nam je omogućeno izračunavanje izraza. Ako krenemo u obilazak drveta i stignemo do leve podgrane pokupimo jedan operand a to je 2, onda se vratimo pokupimo operator množenje, idemo desno pokupimo drugi operand 3 i kada se sledeći put vratimo možemo na mestu ovog čvora da zapišemo rezultat a to je 6. kada smo pokupili taj jedan operand stigli smo do operacije + i idemo desno do operanda levo 4 i pokupimo ga, vraćamo se pokupimo operaciju +, idemo desno pokupimo operand 3, vraćamo se poslednji put zapisujemo rezultat što je 7, vraćamo se i uzimamo operaciju * ovde je drugi operand 3, kad se vratimo zapisujemo rezultat što je 21, sad imamo jedan izračunati operand što je 6, kad smo se vratili uzeli smo + a sa desne strane 21, i rezultat je 27.

Šta dobijamo ako drvo pročitamo u sufiksnom obilasku?

Sufiksni obilazak 23*43+3*+

Kad dobijemo nešto ovako to nam ni najmanje ne liči na neki poznat aritmetički izraz. Ovo je isključivo notacija koja se koristi u programiranju. Taj način zapisivanja je poznat i koristi se u programiranju a naziva se postfiksna (zato što je operator uvek na kraju) ili obrnuta poljska notacija. Ovakvu vrstu obrnute notacije zamislio je poljski matematičar Jan Lukašijevič, ali njemu operanti nisu bili na kraju nego na početku pa se zato naziva obrnuta.

Kada imamo neki aritmetički izraz koji je programer zadao u programskom jeziku, prvo ga prevodimo (transformišemo) u strukturu drveta, a iz tog drveta se sufiksnim čitanjem dobija ova notacija (23*43+3*+). Izvršavanje u programu dalje ide isključivo sa ovom notacijom na sledeći način: ovu notaciju 23*43+3*+ tretiramo kao FIFO listu, što znači da FIFO lista predstavlja samo aritmetički izraz napisan u obliku 23*43+3*+, dok jednu LIFO listu koristimo za rad..

Kako se koristi lifo lista? Fifo lista je glava i odatle se skidaju elementi, skidajući prebacuju se na lifo listu sve dok ne dodje do operanda. Pretpostavka ovde je da su svi operandi binarni. Kad se dodje do operanda izračunava se operacija i rezultat računanja ostaje na lifo listi i dalje se dodaju novi elementi.

Page 142: Programiranje - predavanja

142

ovu notaciju 23*43+3*+ tretiramo kao FIFO listu, što znači da FIFO lista predstavlja samo aritmetički izraz napisan u obliku 23*43+3*+. Dok LIFO listu koristimo za rad.

FIFO lista LIFO lista

2 3 * 4 3 + 3 * + ε → LIFO lista je prazna na početku

3 * 4 3 + 3 * + 2 → skida se prvi element sa FIFO liste i prebacuje u

LIFO listu

* 4 3 + 3 * + 3 2 → skida se sledeći element sa FIFO lise i prebacuje u

LIFO listu

4 3 + 3 * + * 3 2 => 6 → zračunavamo operaciju i rezultat zadržavamo na

LIFO listi

3 + 3 * + 4 6 → na dobijeni rezultat dopisujemo dopisujemo

sledeći element koji smo skinuli sa FIFO list

+ 3 * + 3 4 6 → i sve tako do kraja, dok ne ispraznimo FIFO listu.

i ne dobijemo krajnji rezultat u LIFO listi

3 * + + 3 4 6 => 7 6

* + 3 7 6

+ * 3 7 6 => 21 6

Page 143: Programiranje - predavanja

143

ε → FIFO lista je + 21 6 => 27

prazna na kraju

Ako je aritmetički izraz ispravno zapisan (da mu ne fali neki operand ili bilo šta) posle ovakvog jednog postupka u ovoj pomoćnoj lifo listi na kraju će se nalaziti samo jedan element i to će biti rezultat izračunavanja matematičke operacije.