52
Programski jezici http://www.programskijezici.matf.bg.ac.rs/

Programski · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a) (b)

Embed Size (px)

Citation preview

Page 1: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

Programski jezicihttp://www.programskijezici.matf.bg.ac.rs/

Page 2: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

Univerzitet u BeograduMatematički fakultet

Dizajn programskih jezikaMaterijali za vežbe

Nastavnik: Milena Vujošević JaničićAsistent: Marjana Šolajić

Beograd2017.

Page 3: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

Priprema materijala:dr Milena Vujošević Janičić, docent na Matematičkom fakultetu u BeograduMarjana Šolajić, asistent na Matematičkom fakultetu u BeograduBranislava Živković, asistent na Matematičkom fakultetu u Beogradu

Page 4: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)
Page 5: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

Sadržaj

1 Skript programiranje 31.1 Uvod, kolekcije, matematičke funkcije . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.1.1 Uvodni primeri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.2 Zadaci za samostalni rad sa rešenjima . . . . . . . . . . . . . . . . . . . . . 91.1.3 Zadaci za vežbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.2 Datoteke, niske, JSON format, datum . . . . . . . . . . . . . . . . . . . . . . . . . 101.2.1 Uvodni primeri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.2.2 Zadaci za samostalni rad sa rešenjima . . . . . . . . . . . . . . . . . . . . . 121.2.3 Zadaci za vežbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.3 Argumenti komandne linije, obilazak direktorijuma, sortiranje . . . . . . . . . . . . 141.3.1 Uvodni primeri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.3.2 Zadaci za samostalni rad sa rešenjima . . . . . . . . . . . . . . . . . . . . . 161.3.3 Zadaci za vežbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

1.4 Rešenja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2 Programiranje ograničenja - Python 232.1 Programiranje ograničenja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.1.1 Zadaci za samostalni rad sa rešenjima . . . . . . . . . . . . . . . . . . . . . 242.1.2 Zadaci za vežbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3 Komponentno programiranje 293.1 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.1.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.1.2 Zadaci za samostalni rad . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

4 Konkurentno programiranje 314.1 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.1.1 Uvod, kreiranje niti, prioritet, sinhronizacija. . . . . . . . . . . . . . . . . . 314.1.2 Zaključavanje, java katanci i uslovni redovi čekanja. . . . . . . . . . . . . . 374.1.3 Grafički korisnički interfejs . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

5 Generičko programiranje 415.1 Osnove programskog jezika C++, šabloni funkcija . . . . . . . . . . . . . . . . . . 41

5.1.1 Uvodni primeri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415.1.2 Zadaci za vežbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

5.2 Šabloni klasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.2.1 Uvodni primeri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.2.2 Zadaci za vežbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

5.3 STL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.3.1 Uvodni primeri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.3.2 Zadaci za vežbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

1

Page 6: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

2

Page 7: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1

Skript programiranje

Potrebno je imati instaliran Python 2.7 na računaru.Literatura:

(a) https://www.python.org/

(b) http://www.tutorialspoint.com/python

(c) https://wiki.python.org/moin/

1.1 Uvod, kolekcije, matematičke funkcije1.1.1 Uvodni primeri

Zadatak 1.1 Ispisivanje pozdravne poruke, komentari.1 # Ovako se pisu komentari

#3 # Pokretanje programa iz terminala:

# $python hello.py5 #

print "Hello world! :)"

Zadatak 1.2 Promenljive, niske, formatiran ispis, učitavanje sa standardnog ulaza, aritmetičkei logičke operacije, naredbe grananja.

2 # Promenljive se dinamicki tipizirajua = 45

4 b = 67.45istina = True

6 # Niske su konstantne tj. nisu promenljive.# To znaci da se menjanjem nekog karaktera u niski

8 # pravi nova niska u memoriji.niska = "I believe i can fly!"

10

# Ispis na standardni izlaz12 print a

print b14 print a, b, istina

16 # Formatiran ispisprint "\n------Formatiran ispis ------\n"

18 print "Ceo broj: {0:d} \nBroj u pokretnom zarezu {1:f}\nBulovska vrednost: {2:b}\nNiska: {3:s}\n".format(a,b,istina,niska)

20

# Ucitavanje niske sa standardnog ulaza22 print "\n------Ucitavanje sa standardnog ulaza ------\n"

string_broj = raw_input("Unesite ceo broj: ")24 broj = int(string_broj) # vrsi se konverzija stringa u ceo broj, slicno: float, str

3

Page 8: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1 Skript programiranje

26 # Osnovne aritmeticke operacije:# +, -, *, /, %, ** (stepenovanje)

28 print "\n------Osnovne aritmeticke operacije ------\n"print broj+4

30

# Osnovne logicke operacije:32 # not, and, or

print "\n------Osnovne logicke operacije ------\n"34 print istina or False

36 # Blokovi se ne ogranicavaju viticastim zagradama kao sto je u C-u# vec moraju biti uvuceni tabulatorom.

38

# Naredba grananja40 print "\n------Naredba granjanja ------\n"

if broj%2 == 0:42 print "Unet je paran broj \n"

elif broj%3 == 0:44 print "Unet je broj deljiv sa 3\n"

# Naredbi <<elif>> moze biti vise46 else:

print "Unet je broj koji nije ni paran ni deljiv sa 3\n"48

# Naredba <<switch>> ne postoji50

# Petlja52 print "\n------Petlja <<while >>------\n"

i=154 while i<=10:

print i56 i=i+1 # i++ ne postoji, moze ili ovako ili i+=1

58 # Naredba <<break>> iskace iz bloka, isto kao i u C-u# Naredba <<pass>> je ista kao naredba <<continue>> u C-u

60

# Funkcije62 #

# def ime_funkcije(argumenti):64 # telo funkcije

#66

def f1(x,y):68 return x+y

70 print f1(2,2)

72 def f2(a):return [a,2*a,3*a]

74

print f2(11.1)

Zadatak 1.3 Moduli math i random.1 # Matematicke funkcije

3 # Ukljucujemo modul <<math>>import math

5

# U ovom moduli se nalaze brojne funkcije kao sto su:7 #

# math.sqrt(broj)9 # math.log(broj, osnova)

# math.sin(ugao_u_radijanima), math.cos(), ...11 # math.exp(stepen)

# math.factorial(broj)13 # i druge...

print "\n------Matematicke funkcije ------\n"15 print math.factorial(6)

print math.log(125, 5)17

# Pseudo slucajni brojevi19

# Ukljucujemo modul <<random>>

4

Page 9: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1.1 Uvod, kolekcije, matematičke funkcije

21 import random

23 # Funkcija random() vraca pseudo slucajan broj tipa float iz opsega [0.0, 1.0)print "\n------Pseudo slucajni brojevi ------\n"

25 print "Pseudo slucajan broj iz opsega [0.0,1.0)\n"print random.random()

27

# Korisne funkcije:29 #

# randint(a,b) - vraca pseudo slucajan ceo broj n iz opsega [a,b]31 # choice(lista) - vraca pseudo slucajan element iz liste

#

Zadatak 1.4 Liste.# LISTA

2 ## Notacija: [element1, element2, ...]

4 ## Liste mogu sadrzati razlicite tipove podataka

6 lista = [1,2,3.4,"Another brick in the wall",True,[5,False,4.4,'Layla']]

8 print "\n------Lista ------\n"print lista

10

# Prazna lista12 prazna = []

14 # Pristupanje elementima listeprint "\n------Pristupanje elementima liste ------\n"

16 # Indeksiranje elemenata listeprint lista[0]

18 print lista[3][1]print lista[0:3]

20 # Mozemo indeksirati liste unazad, pozicija -1 odgovara poslednjem elementuprint lista[-1]

22 # Ukoliko pokusama da pristupimo elementu liste# koji se nalazi na poziciji van opsega interpreter ce nam prijaviti gresku

24 # IndexError: list index out of range# print lista[100]

26

print "\n------Provera da li se element nalazi u listi -----\n"28 if 1 in lista:

print "1 se nalazi u listi\n"30

print "\n------Korisne funkcije za rad sa listama ------\n"32 # Ubacivanje elementa na kraj

print "Ubacivanje elementa na kraj liste\n"34 lista.append(3.14)

print lista36 # Lista kao stek

# pop skida poslednji dodat element38 print lista.pop()

# Ubacivanje elementa na odredjenu poziciju u listi40 print "\nUbacivanje elementa na odredjenu poziciju u listi\n"

# list.insert(pozicija, element)42 lista.insert(2, "Jana")

print lista44

#46 # Korisne funkcije:

#48 # list.remove(x) - izbacuje prvo pojavljivanje elementa x iz liste

# list.count(x) - vraca broj koliko puta se element x nalazi u listi50 # list.index(x) - vraca indeks prvog pojavljivanja elementa x u listi

# len(lista) - vraca broj elemenata liste52 # del lista[a:b] - brise elemente liste od pozicije a do b

#54 # Nadovezvivanje dve liste

print "\n------Nadovezvivanje dve liste ------\n"56 lista = lista+["Plava", "Zuta", "Crna"]

print lista58

5

Page 10: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1 Skript programiranje

60 # Prolazak kroz listuprint "\n------Prolazak kroz listu petljom <<for>>------\n"

62 for i in lista:print i

1 # LISTA#

3 # Notacija: [element1, element2, ...]#

5 # Liste mogu sadrzati razlicite tipove podatakalista = [1,2,3.4,"Another brick in the wall",True,[5,False,4.4,'Layla']]

7

print "\n------Lista ------\n"9 print lista

11 # Prazna listaprazna = []

13

# Pristupanje elementima liste15 print "\n------Pristupanje elementima liste ------\n"

# Indeksiranje elemenata liste17 print lista[0]

print lista[3][1]19 print lista[0:3]

# Mozemo indeksirati liste unazad, pozicija -1 odgovara poslednjem elementu21 print lista[-1]

# Ukoliko pokusama da pristupimo elementu liste23 # koji se nalazi na poziciji van opsega interpreter ce nam prijaviti gresku

# IndexError: list index out of range25 # print lista[100]

27 print "\n------Provera da li se element nalazi u listi -----\n"if 1 in lista:

29 print "1 se nalazi u listi\n"

31 print "\n------Korisne funkcije za rad sa listama ------\n"# Ubacivanje elementa na kraj

33 print "Ubacivanje elementa na kraj liste\n"lista.append(3.14)

35 print lista

37 # Ubacivanje elementa na odredjenu poziciju u listiprint "\nUbacivanje elementa na odredjenu poziciju u listi\n"

39 # list.insert(pozicija, element)lista.insert(2, "Jana")

41 print lista

43 ## Korisne funkcije:

45 ## list.remove(x) - izbacuje prvo pojavljivanje elementa x iz liste

47 # list.count(x) - vraca broj koliko puta se element x nalazi u listi# list.index(x) - vraca indeks prvog pojavljivanja elementa x u listi

49 # len(lista) - vraca broj elemenata liste# del lista[a:b] - brise elemente liste od pozicije a do b

51 ## Nadovezvivanje dve liste

53 print "\n------Nadovezvivanje dve liste ------\n"lista = lista+["Plava", "Zuta", "Crna"]

55 print lista

57

# Prolazak kroz listu59 print "\n------Prolazak kroz listu petljom <<for>>------\n"

for i in lista:61 print i

63 # Poredjenje listi#

65 # Dve liste se porede tako sto se njihovi elementi porede redom leksikografskiprint "\n------Poredjenje listi ------\n"

67 print "[1,2,3] < [1,2,5]"

6

Page 11: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1.1 Uvod, kolekcije, matematičke funkcije

print [1,2,3] < [1,2,5]69 print "\n['abc','abc','abc'] < ['abc', 'ab', 'abcd']"

print ['abc','abc','abc'] < ['abc', 'ab', 'abcd']71 print "\n['a','b','c'] > ['a', 'b']"

print ['a','b','c'] > ['a', 'b']73

75 # Koriscenje liste kao stek strukture podatakastek = [9,8,7]

77 # Operacija push je implementirana funkcijom appendstek.append(6)

79 stek.append(5)print "\n------Ispisujemo stek ------\n"

81 print stek# Operacija pop je implementirana funkcijom pop

83 print "\n------Ispisujemo element dobijem funkcijom pop------\n"print stek.pop()

85 print "\n------Ispisujemo znanje nakon pozivanja funkcije pop------\n"print stek

Zadatak 1.5 Skup, katalog, uređene n-torke.

2 # SKUP#

4 # Pravljenje skupa od listeprint "\n------Pravljenje skupa od liste ------\n"

6 lista1 = [4,56,34,2,5,6,4,4,6]skup = set(lista1)

8

for i in skup:10 print i

12

# Funkcija <<range>>14 #

# range(kraj)16 # range(pocetak, kraj[, korak])

# korak moze biti i pozitivan i negativan broj, podrazumevano je jednak jedan18 print "\n------Funkcija <<range >>------\n"

brojevi = range(10)20 for i in brojevi:

print i22

# KATALOG24 #

# Katalog je kolekcija uredjenih parova oblika (kljuc, vrednost)26 #

# Notacija: {kljuc:vrednost, kljuc:vrednost, ...}28 print "\n------Katalog ------\n"

prazna_mapa = {} # prazna mapa30

mapa1 = {'a' : 3, 'b' : 4, 'c' : 5}32

print mapa134

mapa = {"kljuc1":67.7, 6:"Vrednost 2"}36

# Pristupanje elementima u mapi38 print "\n------Pristupanje elementima u katalogu ------\n"

print mapa['kljuc1']40

# Prolazak kroz mapu42 print "\n------Prolazak kroz katalog ------\n"

for kljuc in mapa:44 print "'{0:s}' => {1:s}\n".format(str(kljuc),str(mapa[kljuc]))

46 # Korisne funkcije#

48 # map.keys() - vraca listu kljuceva iz kataloga# map.values() - vraca listu vrednosti iz kataloga

50 # map.has_key(kljuc) - vraca True/False u zavisnosti od toga da li se element# sa kljucem kljuc nalazi u katalogu

7

Page 12: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1 Skript programiranje

52

# Uredjene N-TORKE54 print "\n------Torke ------\n"

torka = ("Daffy","Duck",11)56

# Pristupanje elementima u torki58 print "\n------Pristupanje elementima u torki ------\n"

print torka[1]60

print "\n------Ispisivanje torke ------\n"62 print torka

2 # SKUP#

4 # Pravljenje skupa od listeprint "\n------Pravljenje skupa od liste ------\n"

6 lista1 = [4,56,34,2,5,6,4,4,6]skup = set(lista1)

8

for i in skup:10 print i

12

# Funkcija <<range>>14 #

# range(kraj)16 # range(pocetak, kraj[, korak])

print "\n------Funkcija <<range >>------\n"18 brojevi = range(10)

for i in brojevi:20 print i

22 # KATALOG#

24 # Katalog je kolekcija uredjenih parova oblika (kljuc, vrednost)#

26 # Notacija: {kljuc:vrednost, kljuc:vrednost, ...}print "\n------Katalog ------\n"

28 prazna_mapa = {} # prazna mapa

30 mapa1 = {'a' : 3, 'b' : 4, 'c' : 5}

32 print mapa1

34 mapa = {"kljuc1":67.7, 6:"Vrednost 2"}

36 # Pristupanje elementima u mapiprint "\n------Pristupanje elementima u katalogu ------\n"

38 print mapa['kljuc1']

40 # Prolazak kroz mapuprint "\n------Prolazak kroz katalog ------\n"

42 for kljuc in mapa:print "'{0:s}' => {1:s}\n".format(str(kljuc),str(mapa[kljuc]))

44

# Korisne funkcije46 #

# map.keys() - vraca listu kljuceva iz kataloga48 # map.values() - vraca listu vrednosti iz kataloga

# map.has_key(kljuc) - vraca True/False u zavisnosti od toga da li se element50 # sa kljucem kljuc nalazi u katalogu

52 # Uredjene N-TORKEprint "\n------Torke ------\n"

54 torka = ("Daffy","Duck",11)

56 # Pristupanje elementima u torkiprint "\n------Pristupanje elementima u torki ------\n"

58 print torka[1]

60 print "\n------Ispisivanje torke ------\n"print torka

8

Page 13: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1.1 Uvod, kolekcije, matematičke funkcije

62

# Poredjenje torki64 #

# Dve torke se porede tako sto se njihovi elementi porede redom leksikografski66 print "\n------Poredjenje torki ------\n"

print "(1,2,'a') < (1,2,'b')"68 print (1,2,'a') < (1,2,'b')

print "\n([1,2,3], 'Bugs', 4) < ([1,1,1], 'Bunny', 6)"70 print ([1,2,3], 'Bugs', 4) < ([1,1,1], 'Bunny', 6)

# Ukoliko torke ne sadrze elemente istog tipa na istim pozicijama, i dalje ih mozemoporediti,

72 # ali poredjenje se vrsi na osnovu imena tipa elementa leksikografski# npr. element tipa List < element tipa String < element tipa Tuple i slicno

74 print "\n(1,2,['a','b']) < (1,2,'ab')"print (1,2,['a','b']) < (1,2,'ab')

1.1.2 Zadaci za samostalni rad sa rešenjima

Zadatak 1.6 Pogodi broj Napisati program koji implementira igricu ”Pogodi broj”.Na početku igre računar zamišlja jedan slučajan broj u intervalu [0,100]. Nakon toga igrač unosisvoje ime i započinje igru. Igrač unosi jedan po jedan broj sve dok ne pogodi koji broj je računarzamislio. Svaki put kada igrač unese broj, u zavisnosti od toga da li je broj koji je unet veći ilimanji od zamišljenog broja ispisuje se odgovarajuća poruka. Igra se završava u trenutku kada igračpogodio zamišljen broj.

[Rešenje 1.6]

Zadatak 1.7 Aproksimacija broja PI metodom Monte Karlo Napisati programkoji aproksimira broj PI koriscenjem metode Monte Karlo. Sa standardnog ulaza unosi se broj N.Nakon toga N puta se bira tačka na slučajan način tako da su obe koordinate tačke iz intervala[0,1]. Broj PI se računa po sledecoj formuli:

PI = 4 ∗A/B

• A je broj slučajno izabranih tačaka koje pripadaju krugu poluprečnika 0.5, sa centrom utački (0.5, 0.5)

• B je broj slučajno izabranih tačaka koje pripadaju kvadratu čija temena su tačke (0, 0), (0, 1), (1, 1), (1, 0).

[Rešenje 1.7]

Zadatak 1.8 X-O Napisati program koji implementira igricu X-O sa dva igrača.

[Rešenje 1.8]

1.1.3 Zadaci za vežbu

Zadatak 1.9 Ajnc Napisati program koji implementira igricu Anjc sa jednim igračem.Igra se sa špilom od 52 karte. Na početku igrač unosi svoje ime nakon čega računar deli dve karteigraču i dve karte sebi. U svakoj sledećoj iteraciji računar deli po jednu kartu igraču i sebi. Ciljigre je sakupiti karte koje u zbiru imaju 21 poen. Karte sa brojevima nose onoliko bodova koliki jebroj, dok žandar, dama, kralj nose 10 bodova. Karta As može da nosi 1 ili 10 bodova, u zavisnostiod toga kako igraču odgovara. Igrač koji sakupi 21 je pobedio. Ukoliko igrač premaši 21 bod,pobednik je njegov protivnik. https://en.wikipedia.org/wiki/Blackjack

Zadatak 1.10 4 u liniji Napisati program koji implementira igricu 4 u nizu sa dvaigrača. Tabla za igru je dimenzije 8x8. Igrači na početku unose svoja imena, nakon čega računarnasumično dodeljuje crvenu i žutu boju igračima. Igrač sa crvenom bojom igra prvi i bira kolonuu koju ce da spusti svoju lopticu. Cilj igre je da se sakupe 4 loptice iste boje u liniji. Prvi igračkoji sakupi 4 loptice u liniji je pobedio. https://en.wikipedia.org/wiki/Connect_Four

9

Page 14: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1 Skript programiranje

1.2 Datoteke, niske, JSON format, datum1.2.1 Uvodni primeri

Zadatak 1.11 Funkcije za rad sa niskama.

# Niske2 #

# Mozemo ih pisati izmedju jednostrukih i dvostrukih navodnika4

niska1 = 'Ovo je neka niska.'6 niska2 = "People are strange when you're a stranger ."

8 print "\n------Niske ------\n"print niska1

10 print niska2

12 # Karakterima u niski mozemo pristupati koristeci notaciju [] kao kod listiprint "\n------Pristupanje karakterima u niski ------\n"

14 print niska2[4]print niska2[6:10]

16

# Duzinu niske racunamo koristeci funkciju len(niska)18 print "\n------Duzina niske ------\n"

print len(niska1)20

# Funkcija count22 # niska.count(podniska [, pocetak [, kraj]]) - vraca broj koliko se puta

# podniska nalazi u niski (u intervalu od pocetak do kraj, ne ukljucujuci kraj)24 print "\n------Funkcija <<count >>------\n"

print niska2.count("strange")26

# Funkcija find28 # niska.find(podniska [, pocetak [, kraj]]) - vraca poziciju prvog pojavljivanja

# podniska u niski (u intervalu od pocetak do kraj, ne ukljucujuci kraj), -1 ukolikose podniska ne nalazi u niski

30 print "\n------Funkcija <<find>>------\n"print niska2.find("are")

32

# Funkcija join34 # niska_separator.join([niska1,niska2,niska3 ,...]) - spaja listu niski separatorom

print "\n------Funkcija <<join>>------\n"36 print ' '.join(["Olovka",'pise','srcem.'])

38

# Korisne funkcije za rad sa niskama:40 #

# niska.isalnum()42 # isalpha()

# isdigit()44 # islower()

# isspace()46 # isupper()

# niska.split(separator) - razlaze nisku u listu koristeci separator48 # niska.replace(stara, nova [, n]) - zamenjuje svako pojavljivanje niske stara

# niskom nova (ukoliko je zadat broj n, onda zamenjuje najvise n pojavljivanja)

Zadatak 1.12 Datoteke.

1 # Datoteke#

3 # Datoteku otvaramo koristeci funkciju#

5 # open(ime_datoteke, mod)#

7 # mod: "r" -> read, "w" -> write, "a" -> append, "r+" -> read + append#

9 # Datoteku zatvaramo koristeci funkciju#

11 # datoteka.close()

10

Page 15: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1.2 Datoteke, niske, JSON format, datum

13 f = open("dat1.txt","r")

15 # f.read(n) cita n karaktera iz datotekeprint "\n-----Funkcija <<read >>-----\n"

17 while True:c = f.read(2)

19 if c == '':break

21 print c

23 # f.readline() cita jednu liniju iz Datotekef.close()

25

g = open("dat2.txt","r")27

# Liniju po liniju mozemo ucitavati koristeci petlju29 # tako sto 'iteriramo' kroz Datoteku

print "-----Iteriranje kroz datoteku <<for>> petljom -----\n"31 for linija in g:

print linija33

g.close()35 # f.readlines() i list(f)

# vracaju listu linija datoteke37 #

# f.write(niska) upisuje nisku u datoteku39 print "-----Upisivanje u datoteku -----\n"

h = open("dat3.txt","r+")41 h.write("water\n")

43 print h.readlines()

45 h.close()

Zadatak 1.13 Modul datetime.1 # Datumi

3 # Ukljucujemo klasu datetime iz modula datetime

5 from datetime import datetime

7 # Nov objekat datuma:#

9 # datetime.datetime(godina, mesec, dan [, sat [, minut [, sekund]]])#

11 # Korisne funkcije:#

13 # datetime.now() - vraca trenutno vreme odnosno datum# datetime.year, datetime.month, datetime.day, datetime.hour, datetime.minute,

datetime.second,15 # datetime.strftime(format) - vraca string reprezentaciju objekta datuma na osnovu

zadatog formata# datetime.strptime(niska, format) - vraca objekat datetime konstruisan na osnovu

niske u zadatom formatu17 # datetime.time([sat [, minut [, sekund]]]) - vraca objekat koji predstavlja vreme

# datetime.date(dan, mesec, godina) - vraca objekat datuma19 # format:

# %A - dan u nedelji (Monday, Tuesday ,...)21 # %w - dan u nedelji (0, 1, 2,..., 6)

# $d - dan (01, 02, 03,...)23 # %B - mesec (January, February ,...)

# %m - mesec (01, 02, ...)25 # %Y - godina (1992, 1993,...)

# %H - sat (00, 01, ..., 23)27 # %M - minut (00, 01, ..., 59)

# %S - sekund (00, 01, ..., 59)29 #

31

33 print "\n-----Datumi -----\n"print datetime.now().strftime("Dan u nedelji: %a/%w, Dan: %d, Mesec: %b/%m, Godina: %

11

Page 16: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1 Skript programiranje

y, Vreme: %H:%M:%S\n")35 print datetime.now().time()

print datetime.now().date()37 # ukoliko se ne zada datum u formatu, podrazumevano se koristi pocetni datum sistema

# ukoliko se ne zada vreme u formatu, podrazumevano se koriste nule za sat, minut,sekund

39 print datetime.strptime("10:15:32", "%H:%M:%S")

Zadatak 1.14 JSON format.

1 # JSON format#

3 # Funkcije za rad sa JSON formatom se nalaze u modulu jsonimport json

5

# json.dumps(objekat) vraca string koji sadrzi JSON reprezentaciju objekta x7

print "\n-----JSON reprezentacija objekta -----\n"9 junak = {"Ime":"Dusko", "Prezime":"Dugousko", "Godine":11}

junakjson = json.dumps(junak)11 print junakjson

13 # json.dump(x,f) upisuje string sa JSON reprezentacijom objekta x u datoteku f

15 f = open("dat4.json","w")json.dump(junak,f)

17 f.close()

19 # json.loads(objekat) vraca python objekat na osnovu JSON formata objekta argumentaprint json.loads(junakjson)

21 # json.load(f) ucitava iz datoteke string koji sadrzi JSON format objekta i vracaobjekat

print "\n-----Ucitavanje objekta iz datoteke -----\n"23 f = open("dat4.json","r")

x = json.load(f)25 print x['Ime']

print x['Prezime']27 print x['Godine']

f.close()

1.2.2 Zadaci za samostalni rad sa rešenjima

Zadatak 1.15 Napisati program koji sa standardnog ulaza učitava ime datoteke i broj n iračuna broj pojavljivanja uzastopnih n-grama u datoteci koji su sačinjeni od proizvoljnih karakterai rezultat upisuje u datoteku rezultat.json.

Na primer, za n = 2 i sledeći sadržaj datoteke:

Listing 1.1: dat.txt

1 Ovo je datoteka dat

Listing 1.2: rezultat.json

1 {2 'ot': 1, 'ek': 1, ' d': 1, 'da': 1, 'o ': 1,3 'at': 1, 'je': 1, 'Ov': 1, 'a ': 14 }

[Rešenje 1.15]

Zadatak 1.16U datoteci korpa.json se nalazi spisak kupljenog voća u json formatu:

1 [ { 'ime' : ime_voca, 'kolicina ' : broj_kilograma } , ...]

12

Page 17: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1.2 Datoteke, niske, JSON format, datum

U datotekama maxi_cene.json, idea_cene.json, shopngo_cene.json se nalaze cene voća u jsonformatu:

1 [ { 'ime' : ime_voca, 'cena' : cena_po_kilogramu } , ...]

Napisati program koji izračunava ukupan račun korpe u svakoj prodavnici i ispisuje cene na stan-dardni izlaz.

[Rešenje 1.16]

1.2.3 Zadaci za vežbu

Zadatak 1.17 Napisati program koji sa standardnog ulaza učitava ime datoteke i broj n iračuna broj pojavljivanja svih n-grama u datoteci (i preklapajućih) koji su sačinjeni od proizvoljnihkaraktera i rezultat upisuje u datoteku rezultat.json.

Na primer, za n = 2 i sledeći sadržaj datoteke:

Listing 1.3: dat.txt

1 Ovo je datoteka dat

Listing 1.4: rezultat.json

1 {2 'a ': 1, 'ka': 1, 'ot': 1, 'ek': 1,3 ' d': 2, ' j': 1, 'da': 2, 'e ': 1,4 'o ': 1, 'to': 1, 'at': 2, 'je': 1,5 'Ov': 1, 'te': 1, 'vo': 16 }

Zadatak 1.18 Napisati program koji iz datoteke ispiti.json učitava podatke o ispitimai njihovim datumima. Ispisati na standardni izlaz za svaki ispit njegovo ime i status ”Prosao”ukoliko je ispit prosao, odnosno ”Ostalo je jos n dana.”, gde je n broj dana od trenutnog datumado datuma ispita.

Listing 1.5: ispiti.json

1 [ {'ime': 'Relacione baze podataka',2 'datum': '21.09.2016.'},3 {'ime': 'Vestacka inteligencija ',4 'datum': '17.06.2017.'},5 {'ime': 'Linearna algebra i analiticka geometrija ',6 'datum': '08.02.2017.'} ]

Zadatak 1.19 Napisati program koji izdvaja sve jednolinijske i višelinijske komentare iz .cdatoteke čije ime se unosi sa standardnog ulaza, listu jednih i drugih komentara upisuje u datotekukomentari.json. Jednolinijski komentari se navode nakon // a višelinijski između /∗ i ∗/.

Listing 1.6: program.c

#include <stdio.h>2

// Primer jednolinijskog komentara4

int main(){6 /*

Na ovaj nacin ispisujemo tekst8 na standardni izlaz koristeci jezik C.

*/10 printf("Hello world!");

13

Page 18: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1 Skript programiranje

12 // Na ovaj nacin se ispisuje novi redprintf("\n");

14 /*Ukoliko se funkcija uspesno zavrsila

16 vracamo 0 kao njen rezultat.*/

18 return 0;}

Listing 1.7: komentari.json

1 {2 'jednolinijski ' : ['Primer jednolinijskog komentara ',3 'Na ovaj nacin se ispisuje novi red'],4 'viselinijski ' : ['Na ovaj nacin ispisujemo tekst na standardni5 izlaz koristeci jezik C.',6 'Ukoliko se funkcija uspesno zavrsila7 vracamo 0 kao njen rezultat.']8 }

Zadatak 1.20 Napisati program upoređuje dve datoteke čija imena se unose sa standardnogulaza. Rezultat upoređivanja je datoteka razlike.json koja sadrži broj linija iz prve datotekekoje se ne nalaze u drugoj datoteci i obratno. Napomena Obratiti pažnju na efikasnost.

Listing 1.8: dat1.txt

//netacno2

same=1;4

for(i=0;s1[i]!='\0' && s2[i]!='\0';i++) {6 if(s1[i]!=s2[i]) {

same=0;8 break;

}10 }

return same;

Listing 1.9: dat2.txt

1 //tacno

3 for(i=0;s1[i]!='\0' && s2[i]!='\0';i++){

5 if(s1[i]!=s2[i])return 0;

7 }return s1[i]==s2[i];

Listing 1.10: razlike.json

1 {2 'dat1.txt' : 7,3 'dat2.txt' : 44 }

1.3 Argumenti komandne linije, obilazak direktorijuma, sor-tiranje

1.3.1 Uvodni primeri

14

Page 19: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1.3 Argumenti komandne linije, obilazak direktorijuma, sortiranje

Zadatak 1.21 Modul sys i argumenti komandne linije# modul sys ima definisan objekat argv koji predstavlja listu argumenata komandne

linije (svi argumenti se cuvaju kao niske karaktera)2

import sys4

if len(sys.argv)==1:6 print "Niste naveli argumente komandne linije"

# funkcija exit() iz modula sys prekida program8 # (ukoliko se ne prosledi argument, podrazumevano

# se salje None objekat)10 exit()

12 # ispisujemo argumente komandne linije# prvi argument, tj. sys.argv[0] je uvek ime skript fajla koji se pokrece

14 for item in sys.argv:print item

16

# korisnik moze da zada ime datoteke kao prvi argument komandne linije18 # u tom slucaju datoteku otvaramo sa f = open(sys.argv[1], "r")

Zadatak 1.22 Modul os# Prolazak kroz direktorijume

2

import os4 # ispisuje oznaku za tekuci direktorijum

print os.curdir6 # ispisuje oznaku za roditeljski direktorijum tekuceg direktorijuma

print os.pardir8 # ispisuje separator koji koristi za pravljenje putanja

print os.sep10

12 # funkcija za prosledjenu putanju direktorijuma vraca listu imena svih fajlova u tomdirektorijumu, . je zamena za putanju tekuceg direktorijuma

14 print os.listdir(".")

16 ## os.walk() - vraca listu torki (trenutni_direktorijum , poddirektorijumi, datoteke)

18 # os.path.join(putanja, ime) - pravi putanju tako sto nadovezuje na prosledjenuputanju zadato ime odvojeno /

20 print "\n-----Prolazak kroz zadati direktorijum -----\n"for (trenutni_dir , poddirektorijumi , datoteke) in os.walk("."):

22 print trenutni_dirfor datoteka in datoteke:

24 print os.path.join(trenutni_dir , datoteka)

26 # os.path.abspath(path) - vraca apsolutnu putanju za zadatu relativnu putanju nekogfajla

# os.path.isdir(path) - vraca True ako je path putanja direktorijuma, inace vracaFalse

28 # os.path.isfile(path) - vraca True ako je path putanja regularnog fajla, inace vracaFalse

30 print "\n-----Regularni fajlovi zadatog direktorijuma -----\n"for ime in os.listdir("."):

32 # ako je regularan fajl u pitanju ispisujemo njegovu apsolutnu putanjuif os.path.isfile(os.path.join(".", ime)):

34 print os.path.abspath(os.path.join(".", ime))

Zadatak 1.23 Sortiranje1 # Sortiranje

#3 # sorted(kolekcija [, poredi [, kljuc [, obrni]]]) - vraca sortiranu kolekciju

#5 # kolekcija - kolekcija koju zelimo da sortiramo

# poredi - funkcija poredjenja

15

Page 20: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1 Skript programiranje

7 # kljuc - funkcija koja vraca kljuc po kome se poredi# obrni - True/False (opadajuce/rastuce)

9 ## za poziv sorted(kolekcija) koristi se funkcija cmp za poredjenje

11 # cmp(x, y) -> integer# vraca negativnu vrednost za x<y, 0 za x==y, pozitivnu vrednost za x>y

13 # ako su x i y niske, cmp ih leksikografski poredi#

15

import json17 import math

19 l = ["A", "C", "D", "5", "1", "3"]print l

21 print "sortirana lista: ", sorted(l)

23 # u sledecem primeru je neophodno da definisemo svoje funkcije za poredjenje ivracanje kljuca jer je kolekcija lista recnika i za to cmp nema definisanoponasanje

tacke = [{"teme":"A" , "koordinate": [10.0, 1.1]}, {"teme":"B" , "koordinate": [1.0,15.0]}, {"teme":"C" , "koordinate": [-1.0, 5.0]}]

25

27 # funkcija koja tacke x i y poredi po njihovoj udaljenosti od koordinatnog pocetkadef poredi(x,y):

29 if (x[0]*x[0] + x[1]*x[1]) > (y[0]*y[0] + y[1]*y[1]):return 1

31 else:return -1

33 # funkcija kljuc kao argument ima element kolekcije koja se poredi, u ovom slucaju jeto jedan recnik

# povratna vrednost funkcije kljuc je u stvari tip argumenata funkcije poredi35 def kljuc(x):

return x["koordinate"]37

sortirane_tacke = sorted(tacke, poredi, kljuc) # ili sorted(tacke, poredi, kljuc,True) ako zelimo opadajuce da se sortira

39 print "Tacke pre sortiranja:"for item in tacke:

41 print item["teme"],print "\nTacke nakon sortiranja: "

43 for item in sortirane_tacke:print item["teme"],

45 print

1.3.2 Zadaci za samostalni rad sa rešenjima

Zadatak 1.24 Napisati program koji računa odnos kardinalnosti skupova duže i šire za za-dati direktorijum. Datoteka pripada skupu duže ukoliko ima više redova od maksimalnog brojakaraktera po redu, u suprotnom pripada skupu šire. Sa standardnog ulaza se unosi putanja dodirektorijuma. Potrebno je obići sve datoteke u zadatom direktorijumu i njegovim poddirektoriju-mima (koristiti funkciju os.walk()) i ispisati odnos kardinalnosti skupova duže i šire.

[Rešenje 1.24]

Zadatak 1.25 Napisati program koji obilazi direktorijume rekurzivno i računa broj datotekaza sve postojeće ekstenzije u tim direktorijumima. Sa standardnog ulaza se unosi putanja dopočetnog direktorijuma, a rezultat se ispisuje u datoteku rezultat.json. Na primer:

Listing 1.11: rezultat.txt

1 {2 'txt' : 14,3 'py' : 12,4 'c' : 105 }6

16

Page 21: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1.4 Rešenja

[Rešenje 1.25]

Zadatak 1.26 U datoteci radnici.json nalaze se podaci o radnom vremenu zaposlenih upreduzeću u sledecem formatu:

1 [ { 'ime' : 'Pera Peric',2 'odmor' : ['21.08.2016.', '31.08.2016.'],3 'radno_vreme ' : ['08:30', '15:30'] }, ...]

Napisati program koji u zavisnosti od unete opcije poslodavcu ispisuje trenutno dostupne radnikeodnosno radnike koji su na odmoru. Moguće opcije su ’d’ - trenutno dostupni radnici i ’o’ - radnicikoji su na odmoru. Radnik je dostupan ukoliko nije na odmoru i trenutno vreme je u okvirunjegovog radnog vremena.

[Rešenje 1.26]

Zadatak 1.27 Napisati program koji učitava ime datoteke sa standardnog ulaza i na stan-dardni izlaz ispisuje putanje do svih direktorijuma u kojima se nalazi ta datoteka.

[Rešenje 1.27]

1.3.3 Zadaci za vežbu

Zadatak 1.28 Napisati program koji ispisuje na standardni izlaz putanje do lokacija svihApache virtuelnih hostova na računaru. Smatrati da je neki direktorijum lokacija Apache virtuel-nog hosta ukoliko u sebi sadrži index.html ili index.php datoteku.

Zadatak 1.29 Napisati program koji realizuje autocomplete funkcionalnost. Sa standardnogulaza korisnik unosi delove reči sve dok ne unese karakter !. Nakon svakog unetog dela reči ispisujuse reči koje počinju tim karakterima. Spisak reči koje program može da predloži se nalazi u datotecireci.txt.

1.4 Rešenja

Rešenje 1.6 Pogodi broj

1 # Pogodi broj

3 import random

5 print "-------- IGRA: Pogodi broj ---------\n"

7 zamisljen_broj = random.randint(0,100)

9 ime = raw_input("Unesite Vase ime: ")

11 print "Zdravo {0:s}. :) \nZamislio sam neki broj od 1 do 100. Da li mozes da pogodiskoji je to broj? ".format(ime)

13 pogodio = 0;while not pogodio:

15 print "Unesi broj:"broj = int(raw_input())

17 if broj == zamisljen_broj:pogodio = 1

19 elif broj > zamisljen_broj:print "Broj koji sam zamislio je MANJI od {0:d}.".format(broj)

21 else:print "Broj koji sam zamislio je VECI od {0:d}.".format(broj)

23

print "BRAVO!!! Pogodio si! Zamislio sam {0:d}. Bilo je lepo igrati se sa tobom. :)".format(zamisljen_broj)

17

Page 22: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1 Skript programiranje

Rešenje 1.7 Aproksimacija broja PI metodom Monte Karlo

# Aproksimacija broja PI metodom Monte Karlo2

4 import random

6 print "Izracunavanje broja PI metodom Monte Karlo \n"N = int(raw_input("Unesite broj iteracija: "))

8 # Broj tacaka koje se nalaze u kruguA = 0

10 # Broj tacaka koje se nalaze u kvadratuB = 0

12

i = N14 while i >= 0:

tacka = (random.random(), random.random())16 print "Tacka: "

print tacka18 # Ukoliko se tacka nalazi u krugu, povecavamo broj tacaka u krugu

if ((float(tacka[0])-0.5)**2 + (float(tacka[1])-0.5)**2) < (0.5**2):20 A = A + 1

B = B + 122 i = i - 1

24 print "Broj PI aproksimiran metodom Monte Karlo: "print 4.0*A/B

Rešenje 1.8 X-O

1 # X-O#

3 # - | O | X# --- --- ---

5 # X | - | -# --- --- ---

7 # - | X | O

9 import random

11 def ispisi_tablu(tabla):print "\n TABLA \n"

13 print " 1 2 3 "print " --- --- --- "

15 indeks = 1for i in tabla:

17 print indeks,"|",i[0],"|",i[1],"|",i[2],"|"print " --- --- --- "

19 indeks = indeks + 1print "\n"

21

def pobedio(tabla):23 if (tabla[0][0] != "-" and tabla[0][2] != "-") and ((tabla[0][0] == tabla[1][1]

== tabla[2][2]) or (tabla[0][2] == tabla[1][1] == tabla[2][0])):return True

25 for i in range(3):if ((tabla[0][i] != "-" and tabla[i][0] != "-") or tabla[i][i] != "-") and ((

tabla[0][i] == tabla[1][i] == tabla[2][i]) or (tabla[i][0] == tabla[i][1] ==tabla[i][2])):

27 return Truereturn False

29

def ucitaj_koordinate(ime):31 while True:

print "{0:s} unesite koordinate polja koje zelite da popunite u posebnimlinijama:\n".format(ime)

33 x = int(raw_input("Unesite vrstu: "))y = int(raw_input("Unesite kolonu: "))

35 if 1<=x<=3 and 1<=y<=3:return x-1,y-1

37 else:"Morate uneti brojeve 1,2 ili 3\n"

18

Page 23: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1.4 Rešenja

39

def korak(igrac):41 while True:

x,y = ucitaj_koordinate(igrac[0])43 if tabla[x][y] == "-":

tabla[x][y] = igrac[1]45 ispisi_tablu(tabla)

break47 else:

print tabla[x][y]49 print "Uneto polje je popunjeno!\n"

51 print "IGRA: X-O pocinje\n"

53 ime1 = raw_input("Unesite ime prvog igraca: ")print "Zdravo {0:s}!\n".format(ime1)

55 ime2 = raw_input("Unesite ime drugog igraca: ")print "Zdravo {0:s}!\n".format(ime2)

57

indikator = random.randint(1,2)59 if indikator == 1:

prvi_igrac = (ime1, "X")61 drugi_igrac = (ime2, "O")

else:63 prvi_igrac = (ime2, "X")

drugi_igrac = (ime1, "0")65

print "Igrac {0:s} igra prvi. \n".format(prvi_igrac)67 print "X : {0:s}\n".format(prvi_igrac)

print "O : {0:s}\n".format(drugi_igrac)69

tabla = [['-','-','-'],['-','-','-'],['-','-','-']]71

print "Zapocnimo igru \n"73

ispisi_tablu(tabla)75

na_redu = 077 iteracija = 0

igraci = [prvi_igrac , drugi_igrac]79 while iteracija < 9:

korak(igraci[na_redu])81 if pobedio(tabla) == True:

print "BRAVO!!!!!!! {0:s} je pobedio!\n".format(igraci[na_redu][0])83 break

na_redu = (na_redu+1)%285 iteracija = iteracija + 1

87 if iteracija == 9:print "NERESENO! Pokusajte ponovo.\n"

Rešenje 1.15

import json2

ime_datoteke = raw_input("Unesite ime datoteke: ")4 n = int(raw_input("Unesite broj n: "))

6 # Otvaramo datoteku i citamo njen sadrzajf = open(ime_datoteke , "r")

8

recnik = {}10 # Prolazimo kroz sadrzaj i uzimamo jedan po jedan n-gram

while True:12 ngram = f.read(n)

# provera da li je ispravan n-gram, tj. da li je ostalo manje od n karaktera udatoteci

14 if len(ngram)<n:break

16 # Ukoliko se n-gram vec nalazi u recniku,# povecavamo mu broj pojavljivanja

18 if recnik.has_key(ngram):

19

Page 24: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1 Skript programiranje

recnik[ngram] = recnik[ngram]+120 # Inace dodajemo novi n-gram u recnik i postavljamo mu broj pojavljivanja na 1

else:22 recnik[ngram] = 1

f.close()24 # Upisujemo napravljen recnik u datoteku

f = open("rezultat.json", "w")26 json.dump(recnik,f)

f.close()

Rešenje 1.16

1 import json

3 # Ucitavamo podatke iz datotekaf = open('korpa.json', "r")

5 korpa = json.load(f)f.close()

7

f = open('maxi_cene.json', "r")9 maxi_cene = json.load(f)

f.close()11

f = open('idea_cene.json', "r")13 idea_cene = json.load(f)

f.close()15

f = open('shopngo_cene.json', "r")17 shopngo_cene = json.load(f)

f.close()19

maxi_racun = 021 idea_racun = 0

shopngo_racun = 023 # Za svako voce u korpi dodajemo njegovu cenu u svaki racun posebno

for voce in korpa:25 ime = voce['ime']

maxi_cena = 027 # za svaku prodavnicu trazimo recnik koji odgovara vocu iz korpe

# tj. koji za kljuc 'ime' ima istu vrednost kao kljuc 'ime' iz recnika voce29 for voce_m in maxi_cene:

if voce_m['ime'] == ime:31 maxi_cena = voce_m['cena']

break33 idea_cena = 0

for voce_i in idea_cene:35 if voce_i['ime'] == ime:

idea_cena = voce_i['cena']37 break

shopngo_cena = 039 for voce_s in shopngo_cene:

if voce_s['ime'] == ime:41 shopngo_cena = voce_s['cena']

break43 maxi_racun = maxi_racun + voce['kolicina']*maxi_cena

idea_racun = idea_racun + voce['kolicina']*idea_cena45 shopngo_racun = shopngo_racun + voce['kolicina']*shopngo_cena

47 print "Maxi: " + str(maxi_racun) + " dinara"print "Idea: " + str(idea_racun) + " dinara"

49 print "Shopngo: " + str(shopngo_racun) + " dinara"

Rešenje 1.24

1

import os3

dat_u_duze = 05 dat_u_sire = 0

20

Page 25: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1.4 Rešenja

7 # Funkcija koja obilazi datoteku i vraca 1 ukoliko datoteka pripada skupu duze# odnosno 0 ukoliko datoteka pripada skupu sire

9 def obilazak(ime_datoteke):br_linija = 0

11 najduza_linija = 0f = open(ime_datoteke , "r")

13 for linija in f:br_linija = br_linija + 1

15 if len(linija) > najduza_linija:najduza_linija = len(linija)

17 f.close()if br_linija > najduza_linija:

19 return 1else:

21 return 0

23 ime_direktorijuma = raw_input("Unesite putanju do direktorijuma: ")

25 for (tren_dir, pod_dir, datoteke ) in os.walk(ime_direktorijuma):for dat in datoteke:

27 if obilazak(os.path.join(tren_dir, dat)) == 0:dat_u_sire += 1

29 else:dat_u_duze += 1

31

print "Kardinalnost skupa duze: kardinalnost skupa sire"33 print str(dat_u_duze)+":"+str(dat_u_sire)

Rešenje 1.25

1

import os3 import json

5 ime_direktorijuma = raw_input("Unesite putanju do direktorijuma: ")

7 ekstenzije = {}

9 for (tren_dir, pod_dir, datoteke ) in os.walk(ime_direktorijuma):for dat in datoteke:

11 pozicija = dat.find(".")# Ukoliko datoteka ima ekstenziju, pretpostavljamo da su datoteke imenovane

tako da posle . ide ekstenzija u ispravnom obliku13 if pozicija >= 0:

# Ukoliko ekstenzija postoji u mapi, povecavamo njen broj15 if dat[pozicija:] in ekstenzije:

ekstenzije[dat[pozicija:]] += 117 else:

# Dodajemo novu ekstentiju u mapu i postavljamo njen broj na 119 ekstenzije[dat[pozicija:]] = 1

21 f = open("rezultat.json","w")json.dump(ekstenzije , f)

23 f.close()

Rešenje 1.26

1 import json, osfrom datetime import datetime

3

f = open("radnici.json", "r")5 radnici = json.load(f)

f.close()7

opcija = raw_input("Unesite opciju koju zelite (d - dostupni radnici , o - radnici naodmoru): \n")

9

if opcija != "d" and opcija != "o":11 print "Uneta opcija nije podrzana."

exit()

21

Page 26: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

1 Skript programiranje

13

tren_dat = datetime.now()15

# funkcija datetime.strptime(string, format) pravi objekat tipa datetime na osnovuzadatih podataka u stringu i odgovarajuceg formata, na primer ako je datumzapisan kao "21.08.2016" odgovarajuci format je "%d.%m.%Y." pa se funkcija pozivasa datetime.strptime("21.08.2016", "%d.%m.%Y.")

17

for radnik in radnici:19 kraj_odmora = datetime.strptime(radnik['odmor'][1],"%d.%m.%Y.").date()

pocetak_odmora = datetime.strptime(radnik['odmor'][0],"%d.%m.%Y.").date()21 kraj_rad_vrem = datetime.strptime(radnik['radno_vreme'][1],"%H:%M").time()

pocetak_rad_vrem = datetime.strptime(radnik['radno_vreme'][0],"%H:%M").time()23 if opcija == "o":

# Ukoliko je radnik trenutno na odmoru ispisujemo ga25 if pocetak_odmora < tren_dat.date() < kraj_odmora:

print radnik["ime"]27 else:

# Ukoliko je radnik trenutno dostupan i nije na odmoru, ispisujemo ga29 if not (pocetak_odmora < tren_dat.date() < kraj_odmora) and pocetak_rad_vrem

< tren_dat.time() < kraj_rad_vrem:print radnik["ime"]

Rešenje 1.27

import os2

ime_datoteke = raw_input("Unesite ime datoteke: ")4

# pretrazujemo ceo fajl sistem, odnosno pretragu krecemo od root direktorijuma /6 # imajte u vidu da ce vreme izvrsavanja ovog programa biti veliko posto se pretrazuje

ceo fajl sistem, mozete ga prekinuti u svakom trenutku sa CTRL+Cfor (tren_dir, pod_dir, datoteke ) in os.walk("/"):

8 # objekat datoteke predstavlja listu imena datoteka iz direktorijuma# ta imena poredimo sa zadatim

10 for dat in datoteke:# ako smo naisli na trazenu datoteku, pravimo odgovarajucu putanju

12 if dat == ime_datoteke:print os.path.join(os.path.abspath(tren_dir), ime_datoteke)

22

Page 27: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

2

Programiranje ograničenja -Python

Potrebno je imati instaliran Python 2.7 i biblioteku python-constraint. Na Ubuntu 14.04 ope-rativnom sistemu, biblioteka python-constraint se moze instalirati pomocu Pip alata:sudo apt-get -y install pipsudo pip install python-constraint

Korisni linkovi i literatura:http://labix.org/doc/constraint/https://pypi.python.org/pypi/python-constrainthttp://www.hakank.org/constraint_programming_blog/

2.1 Programiranje ograničenja

Zadatak 2.1 Modul constraint, osnovne funkcije

1 # Programiranje ogranicenja

3 # Ukljucujemo modul za rad sa ogranicenjimaimport constraint

5

# Definisemo problem7 problem = constraint.Problem()

# Dodajemo promenljive9 #

# problem.addVariable(ime_promenljive, domen_lista)11 # problem.addVariables(lista_imena_promenljivih , domen_lista1 [, domen_lista2, ...,

domen_listan])problem.addVariable('x',[1,2,3])

13 problem.addVariable('y',['a','b','c'])# Ispisujemo resenja

15 # print problem.getSolutions()

17 problem.addVariable('z',[0.1,0.2,0.3])# Dodajemo ogranicenjima

19 ## problem.addConstraint(ogranicenje)

21 ## ogranicenje moze biti:

23 # constraint.AllDifferentConstraint() - razlicite vrednosti svih promenljivih# constraint.AllEqualConstraint() - iste vrednosti svih promenljivih

25 # constraint.MaxSumConstraint(s [,tezine]) - suma vrednosti promenljivih (pomnozenasa tezinama) ne prelazi s

# constraint.MinSumConstraint(s [,tezine]) - suma vrednosti promenljivih (pomnozenasa tezinama) nije manja od s

27 # constraint.ExactSumConstraint(s [,tezine]) - suma vrednosti promenljivih (pomnozena sa tezinama) je s

# constraint.InSetConstraint(skup) - vrednosti promenljivih se nalaze u skupu skup29 # constraint.NotInSetConstraint(skup) - vrednosti promenljivih se ne nalaze u skupu

skup

23

Page 28: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

2 Programiranje ograničenja - Python

# constraint.SomeInSetConstraint(skup) - vrednosti nekih promenljivih se nalaze uskupu skup

31 # constraint.SomeNotInSetConstraint(skup) - vrednosti nekih promenljivih se nenalaze u skupu skup

#33 # Mozemo napraviti i svoju funkciju ogranicenja

def ogranicenje(x,z):35 if x / 10.0 == z:

return True37

# Prosledjujemo funkciju ogranicenja i redosled promenljivih koji treba da odgovararedosledu argumenata funkcije ogranicenja

39 problem.addConstraint(ogranicenje ,['x','z'])resenja = problem.getSolutions()

41 print "\n-----Resenja -----\n"for resenje in resenja:

43 print resenje

2.1.1 Zadaci za samostalni rad sa rešenjima

Zadatak 2.2 Napisati program koji pronalazi trocifren broj ABC tako da je količnik ABC /(A + B + C) minimalan i A, B i C su različiti brojevi.

Zadatak 2.3 Dati su novčići od 1, 2, 5, 10, 20 dinara. Napisati program koji pronalazi svemoguće kombinacije tako da zbir svih novčića bude 50.

Zadatak 2.4 Napisati program koji ređa brojeve u magičan kvadrat. Magičan kvadratje kvadrat dimenzija 3x3 takav da je suma svih brojeva u svakom redu, svakoj koloni i svakojdijagonali jednak 15 i svi brojevi različiti. Na primer:

4 9 23 5 78 1 6

Zadatak 2.5 Napisati program koji pronalazi sve vrednosti promenljivih X, Y i Z za kojevaži da je X >= Z i X ∗2+Y ∗X+Z <= 34 pri čemu promenljive pripadaju narednim domenimaX ∈ {1, 2, ..., 90}, Y ∈ {2, 4, 6, ...60} i Z ∈ {1, 4, 9, 16, ..., 100}

Zadatak 2.6 Napisati program koji dodeljuje različite vrednosti različitim karakterima takoda suma bude zadovoljena:

TWO+TWO---------FOUR

Zadatak 2.7 Napisati program koji pronalazi sve vrednosti promenljivih X, Y, Z i W za kojevaži da je X >= 2 ∗ W , 3 + Y <= Z i X − 11 ∗ W + Y + 11 ∗ Z <= 100 pri čemu promenljivepripadaju narednim domenima X ∈ {1, 2, ..., 10}, Y ∈ {1, 3, 5, ...51}, Z ∈ {10, 20, 30, ..., 100} iW ∈ {1, 8, 27, ..., 1000}.

Zadatak 2.8 Napisati program koji raspoređuje brojeve 1-9 u dve linije koje se seku u jednombroju. Svaka linija sadrži 5 brojeva takvih da je njihova suma u obe linije 25 i brojevi su u rastućemredosledu.

1 32 456 87 9

24

Page 29: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

2.1 Programiranje ograničenja

Zadatak 2.9 Pekara Kiflica proizvodi hleb i kifle. Za mešenje hleba potrebno je 10 minuta,dok je za kiflu potrebno 12 minuta. Vreme potrebno za pečenje ćemo zanemariti. Testo za hlebsadrži 300g brašna, a testo za kiflu sadrži 120g brašna. Zarada koja se ostvari prilikom prodajejednog hleba je 7 dinara, a prilikom prodaje jedne kifle je 9 dinara. Ukoliko pekara ima 20 radnihsati za mešenje peciva i 20kg brašna, koliko komada hleba i kifli treba da se umesi kako bi seostvarila maksimalna zarada (pod pretpostavkom da će pekara sve prodati)?

Zadatak 2.10 Napisati program pronalazi vrednosti A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S(svako slovo predstavlja različit broj) koje su poređane u heksagon na sledeći način:

A,B,CD,E,F,GH,I,J,K,LM,N,O,PQ,R,S

tako da zbir vrednosti duž svake horizontalne i dijagonalne linije bude 38 ( A+B+C = D+E+F+G= ... = Q+R+S = 38, A+D+H = B+E+I+M = ... = L+P+S = 38, C+G+L = B+F+K+P =... = H+M+Q = 38).

Zadatak 2.11 Kompanija Start ima 250 zaposlenih radnika. Rukovodstvo kompanije jeodlučilo da svojim radnicima obezbedi dodatnu edukaciju. Da bi se radnik obučio programskomjeziku Elixir potrebno je platiti 100 evra po osobi za kurs, ali bi njegovo produktivno znanje ovogprogramskog jezika donelo 150 projekat/sati mesečno, što bi za kompaniju značilo dobit od 5 evrapo projekat/satu. Da bi se radnik obučio programskom jeziku Dart potrebno je platiti 105 evra poosobi za kurs, ali bi njegovo produktivno znanje ovog programskog jezika donelo 170 projekat/satimesečno, koji bi za kompaniju značili dobit od 6 evra po satu. Ukoliko Start ima na raspolaganju26000 evra za obuku i maksimalan broj 51200 mogućih projekat/sati mesečno, odrediti na kojinacin kompanija treba da obuči svoje zaposlene kako bi ostvarila maksimalnu dobit.

Zadatak 2.12 Napisati program koji raspoređuje 8 topova na šahovsku tablu tako da senikoja dva topa ne napadaju.

Zadatak 2.13 Napisati program koji raspoređuje 8 dama na šahovsku tablu tako da se nikojedve dame ne napadaju.

Zadatak 2.14 Napisati program koji učitava tablu za Sudoku iz datoteke čije ime se zadajesa standardnog ulaza i korišćenjem ograničenja rešava Sudoku zagonetku.

2.1.2 Zadaci za vežbu

Zadatak 2.15 Za svaku narednu zagonetku, napisati program koji dodeljuje različite vrednostirazličitim karakterima tako da suma bude zadovoljena:

GREEN + ORANGE = COLORSMANET + MATISSE + MIRO + MONET + RENOIR = ARTISTSCOMPLEX + LAPLACE = CALCULUSTHIS + IS + VERY = EASYCROSS + ROADS = DANGERFATHER + MOTHER = PARENTWE + WANT + NO + NEW + ATOMIC = WEAPONEARTH + AIR + FIRE + WATER = NATURESATURN + URANUS + NEPTUNE + PLUTO = PLANETSSEE + YOU = SOONNO + GUN + NO = HUNTWHEN + IN + ROME + BE + A = ROMANDONT + STOP + THE = DANCEHERE + THEY + GO = AGAINOSAKA + HAIKU + SUSHI = JAPANMACHU + PICCHU = INDIAN

25

Page 30: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

2 Programiranje ograničenja - Python

SHE + KNOWS + HOW + IT = WORKSCOPY + PASTE + SAVE = TOOLS

Zadatak 2.16 Za svaku narednu zagonetku, napisati program koji dodeljuje različite vrednostirazličitim karakterima tako da suma bude zadovoljena:

THREE + THREE + ONE = SEVENNINE + LESS + TWO = SEVENONE + THREE + FOUR = EIGHTTHREE + THREE + TWO + TWO + ONE = ELEVENSIX + SIX + SIX = NINE + NINESEVEN + SEVEN + SIX = TWENTYONE + ONE + ONE + THREE + THREE + ELEVEN = TWENTYEIGHT + EIGHT + TWO + ONE + ONE = TWENTYELEVEN + NINE + FIVE + FIVE = THIRTYNINE + SEVEN + SEVEN + SEVEN = THIRTYTEN + SEVEN + SEVEN + SEVEN + FOUR + FOUR + ONE = FORTYTEN + TEN + NINE + EIGHT + THREE = FORTYFOURTEEN + TEN + TEN + SEVEN = FORTYONENINETEEN + THIRTEEN + THREE + TWO + TWO + ONE + ONE + ONE = FORTYTWOFORTY + TEN + TEN = SIXTYSIXTEEN + TWENTY + TWENTY + TEN + TWO + TWO = SEVENTYSIXTEEN + TWELVE + TWELVE + TWELVE + NINE + NINE = SEVENTYTWENTY + TWENTY + THIRTY = SEVENTYFIFTY + EIGHT + EIGHT + TEN + TWO + TWO = EIGHTYFIVE + FIVE + TEN + TEN + TEN + TEN + THIRTY = EIGHTYSIXTY + EIGHT + THREE + NINE + TEN = NINETYONE + NINE + TWENTY + THIRTY + THIRTY = NINETY

Zadatak 2.17 Za svaku narednu zagonetku, napisati program koji dodeljuje različite vrednostirazličitim karakterima tako da jednakost bude zadovoljena:

MEN * AND = WOMENCOGITO = ERGO * SUM((JE + PENSE) - DONC) + JE = SUISFERMAT * S = LAST + THEOREM.WINNIE / THE = POOHTWO * TWO + EIGHT = TWELVE

Zadatak 2.18 Uraditi sve zadatke koji su pobrojani ovde:http://www.primepuzzle.com/leeslatest/alphameticpuzzles.html

Zadatak 2.19 Napisati program koji učitava ceo broj n i ispisuje magičnu sekvencu S brojevaod 0 do n − 1. S = (x0, x1, ..., xn−1) je magična sekvenca ukoliko postoji xi pojavljivanja broja iza i = 0, 1, ..., n− 1.

Zadatak 2.20 Čistačica Mica sređuje i čisti kuće i stanove. Da bi sredila i počistila jedan stanpotrebno joj je 1 sat, dok joj je za kuću potrebno 1.5 sati. Prilikom čišćenja, Mica potroši nekukoličinu deterdženta, 120ml po stanu, odnosno 100ml po kući. Mica zaradi 1000 dinara po svakomstanu, odnosno 1500 dinara po kući. Ukoliko Mica radi 40 sati nedeljno i ima 5l deterdženta naraspolaganju, koliko stanova i kuća je potrebno da očisti kako bi imala najveću zaradu?

Zadatak 2.21 Marija se bavi grnčarstvom i pravi šolje i tanjire. Da bi se napravila šolja,potrebno je 6 minuta, dok je za tanjir potrebno 3 minuta. Pri pravljenju šolje potroši se 75 gr,dok se za tanjir potroši 100 gr gline. Ukoliko ima 20 sati na raspolaganju za izradu svih proizvodai 250 kg gline, a zarada koju ostvari iznosi 2 evra po svakoj šolji i 1.5 evra po tanjiru, koliko šoljai tanjira treba da napravi kako bi ostvarila maksimalnu zaradu?

Zadatak 2.22 Jovanin komšija preprodaje računare i računarsku opremu. Očekuje isporukuračunara i štampača. Pri tom, računari su spakovani tako da njihova kutija zauzima 360 kubnih

26

Page 31: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

2.1 Programiranje ograničenja

decimetara prostora, dok se štampači pakuju u kutijama koje zauzimaju 240 kubnih decimetaraprostora. Komšija se trudi da mesečno proda najmanje 30 računara i da taj broj bude bar za 50%veći od broja prodatih štampača. Računari koštaju 200 evra po nabavnoj ceni, a prodaju se poceni od 400 evra, dok štampači koštaju u nabavci 60 evra i prodaju se za 140 evra. Magacin kojimkomšija raspolaže ima svega 30000 kubnih decimetara prostora i mesečno može da nabavi robu uiznosu od najviše 14000 evra. Koliko računara, a koliko štampača komšija treba da proda kako bise maksimalno obogatio?

27

Page 32: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

2 Programiranje ograničenja - Python

28

Page 33: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

3

Komponentno programiranje

3.1 JavaPotrebno je imati instalirane sledeće programe:

(a) Eclipse (može se preuzeti na strani http://www.eclipse.org/downloads/)

(b) JavaFX (može se preuzeti na strani http://www.oracle.com/technetwork/java/javase/overview/javafx-overview-2158620.html)

(c) JavaFX Scene Builder 2.0 (može se preuzeti na strani http://www.oracle.com/technetwork/java/javafxscenebuilder-1x-archive-2199384.html)

Literatura:

(a) http://docs.oracle.com/javafx/2/

(b) http://www.java2s.com/Tutorials/Java/JavaFX/

(c) https://docs.oracle.com/javase/8/scene-builder-2/get-started-tutorial/jfxsb-get_started.htm

3.1.1 Uvod

Zadatak 3.1 Uvodni primer kreiranja aplikacije.

Zadatak 3.2 Aplikacija koja testira formu za prijavljivanje na sistem. Korisničko ime je niskakoja počinje sa mr, a lozinka mora imati tačno 10 karaktera.

Zadatak 3.3 Aplikacija koja crta krug čiji je poluprečnik jednak trenutnoj vrednosti slajdera.

Zadatak 3.4 Aplikacija koja sortira listu imena prikazanih u List View komponenti pritiskomna dugme za sortiranje.

3.1.2 Zadaci za samostalni rad

Zadatak 3.5 Napraviti aplikaciju koja prikazuje matricu sa tablicom množenja. Elementimatrice su dugmići na kojima je ispisana vrsta i kolona matrice kojoj pripadaju. Klikom na odgo-varajući dugmić na standardni izlaz se prikazuje rezultat množenja. Omogućiti da veličina tablicemnoženja bude promenljiva korišćenjem slajdera. Vrednost slajdera definiše dimenziju matrice(max=9) koja se prikazuje u centralnom delu (na primer, ako je vrednost slajdera 5 potrebno je dase prikaže tablica množenja veličine 5x5). Za osnovni kontejner upotrebiti BorderPane na kom seu gornjem regionu dodaje FlownPane sa slajderom čija je inicijalna vrednost 0 i tekstom ”Veličinatablice množenja”. Matricu dugmića dodati u GridPane koji se postavlja u centralnom regionuBorderPane kontejnera.

29

Page 34: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

3 Komponentno programiranje

Zadatak 3.6 Napraviti aplikaciju koja organizuje grupe za zajednički rad na seminarskomzadatku. Program pri pokretanju daje svoj predlog za dve grupe u obliku listi u kojima su zapisanaimena studenata (u svakoj po 5). Omogućiti korisniku da napravi drugačije grupe prebacivanjemstudenata iz jedne u drugu listu. Za osnovni kontejner upotrebiti HBox koji sadrži dve liste.Između listi treba da stoje dugmići označeni sa »>”i «<”(za njihovu organizaciju koristiti VBox).Odabirom elementa iz leve liste i klikom na »>”, taj element je potrebno prebaciti na kraj desneliste (analogno i za dugme «<”).

Zadatak 3.7 Napraviti aplikaciju koja implementira digitron sa osnovnim binarnim opera-cijama (sabiranje, oduzimanje, množenje i deljenje). Omogućiti i brisanje tekućeg rezultata. Zaosnovni kontejner upotrebiti Grid Pane koji sadrži tekstualno polje za prikaz tekućeg rezultata,dugme za svaku cifru ponaosob i dodatne dugmiće za operacije. Pritiskom na dugme u tekstualnopolje se upisuje odgovarajuća cifra, znak operacije ili se briše celokupni sadržaj. Čim se unesedrugi argument operacije, binarni izraz u tekstualnom polju zameniti rezultatom izračunavanjaodgovarajuće operacije.

Zadatak 3.8 Napraviti aplikaciju koja iscrtava odgovarajući geometrijski oblik u centralnomdelu u zavisnosti od pritiska na odgovarajuće dugme. Za osnovni kontejner upotrebiti Border Pane.U gornju oblast postaviti dugme za crtanje kruga, u donju dugme za crtanje elipse, a u levu i desnuoblast, dugmad za crtanje pravougaonika i kvadrata redom. U zavisnosti od izabranog dugmeta,u centralnoj oblasti treba iscrtati traženi geometrijski oblik. Podrazumevane vrednosti su: 10 zaprečnik kruga i stranicu kvadrata, 5 i 15 za ose elipse, tj. stranice pravougaonika redom.

Zadatak 3.9 Napraviti aplikaciju koja simulira izvlačenje nagrada u jednom kolu. Napravitiproizvoljnu bazu nagrada (lista stringova) iz koje se nasumično bira sledeća za dodelu. Za osnovnikontejner upotrebiti VBox. Prva dva elementa su tekstualna polja za unos imena i prezimenaučesnika nagradne igre. U sledećem redu postaviti dugme za generisanje nagrade. Pritiskom nadugme, nasumično izabrati nagradu (nakon čega je treba obrisati iz baze) i u tekstualnom poljuispod dugmeta prikazati ime dobitnika i nagrade. U slučaju da više nema nagrada, prikazatiporuku Vise srece u sledecem krugu!.

30

Page 35: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

4

Konkurentno programiranje

4.1 JavaPotrebno je imati instalirane sledeće programe:

(a) Eclipse (može se preuzeti na strani http://www.eclipse.org/downloads/

(b) Java JDK 1.8 (može se preuzeti na strani http://www.oracle.com/technetwork/java/javase/downloads/index.html

Literatura:

(a) http://www.roseindia.net/java/thread/index.shtml

(b) http://www.javamex.com/tutorials/threads/

4.1.1 Uvod, kreiranje niti, prioritet, sinhronizacija.Uvodni primeri

Zadatak 4.1 Kreiranje niti korišćenjem java.lang.Thread klase.1 package cas_1;

3 /** niti se mogu kreirati kao instance neke potklase klase Thread i onda

5 * nasledjuju sve metode klase Thread od kojih je najvazniji run-metod*/

7 class MojaNit extends Thread {MojaNit(String s1) {

9 super(s1);}

11

/*13 * metod run() se izvrsava kad se nit pokrene metodom start() iz main

* funkcije15 */

public void run() {17 /*

* instanca klase Thread se prikazuje u obliku [ime, prioritet,19 * roditeljska nit] za nasu nit roditeljska nit je main jer je ona

* pozvala metod start() tj. pokrenula njeno izvrsavanje21 */

System.out.println("Pokrenuta je nit: " + this.getName() + " (" + this23 + ").");

25 }}

27

public class PokretacNiti {29 public static void main(String args[]) {

MojaNit m1 = new MojaNit("moja prva nit");31 /*

31

Page 36: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

4 Konkurentno programiranje

* metod start() pokrece izvrsavanje niti, odnosno JVM poziva metod33 * run() niti koja je konstruisana rezultat je konkurentno izvrsavanje

* dve niti, one koja se vraca iz poziva start() metoda i one koja se35 * izvrsava pozivom metoda run()

*/37 m1.start();

}39 }

Zadatak 4.2 Kreiranje niti korišćenjem java.lang.Runnable interfejsa.1 package cas_1;

3 /** niti se mogu kreirati i kao elementi klasa koje implemetiraju

5 * Runnable-interfejs i metod run() koji je jedini metod ovog interfejsa* i sluzi za definisanje nacina rada niti u klasi gde se koristi

7

Prednost koriscenja interfejsa je ta sto nasa klasa u ovom slucaju moze da9 nasledi neku drugu klasu koja nije Thread, a opet mozemo kreirati nit koja ce

izvrsavati kod definisan metodom run() tako sto u konstruktoru prosledimo instancu11 nase klase

*/13 class MojaNit implements Runnable {

Thread t;15

MojaNit(String s1) {17 /*

* konstuktoru se salje instanca nase klase koja implementira Runnable19 * interfejs, nit t ce izvrsavati kod definisan u metodu run nase klase

*/21 t = new Thread(this);

t.setName(s1);23 }

25 public void run() {System.out.println("Nit koja se trenutno izvrsava: "

27 + Thread.currentThread().getName() + ".");}

29 }

31 public class PokretacNiti2 {public static void main(String args[]) {

33 MojaNit m1 = new MojaNit("moja prva nit");m1.t.start();

35 /* ukoliko ne zelimo da metod run izvrsava zasebna nit, vec main nit */m1.run();

37 }}

Zadatak 4.3 Program demonstrira tri procesa sa različitim prioritetom. Svaki proces predsta-vlja po jedan red čekanja pacijenata u bolnici (deca, penzioneri, zaposleni). Pacijenti se prozivajuna svake 2 sekunde s tim što prednost imaju deca i starija lica.

package cas_1;2

/*4 * Prioritet se koristi pri odlucivanju kada ce se kontrola nad jednom niti predati

drugoj.* To je smena okruzenja (eng. context switch). Prioritet niti u Javi je odredjen

brojevima6 * od 1 do 10. Java đobezbeuje konstante za zadavanje prioriteta:

* - Thread.MAX_PRIORITY8 * - Thread.MIN_PRIORITY

* - Thread.NORM_PRIORITY10 * Treba imati u vidu da iako mozemo postaviti da neke niti imaju veci prioritet od

drugih* ne postoji garancija da ce OS to koristiti prilikom smene okruzenja.

12 */class MojaNit extends Thread {

14 String red_cekanja[];

32

Page 37: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

4.1 Java

16 MojaNit(String s, String red_cekanja[]) {super(s);

18 this.red_cekanja = red_cekanja;}

20

public void run() {22 for (int i = 0; i < red_cekanja.length; i++) {

Thread cur = Thread.currentThread();24 System.out.println("Sledeci pacijent: " + red_cekanja[i] + "(nit "

+ cur.getName() + ", prioritet: " + cur.getPriority()26 + ").");

/*28 * metod sleep() prekida izvrsavanje tekuce niti za dati broj

* milisekundi koristimo try catch blok jer metod moze da izbaci30 * dve vrste izuzetka 1. IllegalArgumentException - ukoliko je

* argument negativan broj 2. InterruptedException - ukoliko32 * neka druga nit prekine tekucu nit

*/34 try {

Thread.sleep(2000);36 } catch (InterruptedException e) {

// TODO Auto-generated catch block38 e.printStackTrace();

}40 }

}42 }

44 public class PrioritetNiti {public static void main(String args[]) {

46 String deca[] = { "Ana Antic", "Petar Petrovic", "Milica Mikic" };String penzioneri[] = { "Ljubisa Lukic", "Mara Mikic" };

48 String zaposleni[] = { "Anita Lazic", "Brankica Mijatovic" };MojaNit Deca = new MojaNit("Deca", deca);

50 MojaNit Penzioneri = new MojaNit("Penzioneri", penzioneri);MojaNit Zaposleni = new MojaNit("Zaposleni", zaposleni);

52

Deca.setPriority(Thread.MAX_PRIORITY);54 Penzioneri.setPriority(Thread.MAX_PRIORITY - 1);

Zaposleni.setPriority(Thread.MIN_PRIORITY);56 /*

* iako smo postavili da Deca imaju najvisi prioritet, OS to ne mora da58 * ispostuje prilikom odlucivanja

*/60 Deca.start();

Penzioneri.start();62 Zaposleni.start();

}64 }

Zadatak 4.4 Join metod. Uočen problem u prethodnom primeru se rešava korišćenjem joinmetoda.

package cas_1;2

class MojaNit extends Thread {4 String red_cekanja[];

6 MojaNit(String s, String red_cekanja[]) {super(s);

8 this.red_cekanja = red_cekanja;}

10

public void run() {12 for (int i = 0; i < red_cekanja.length; i++) {

Thread cur = Thread.currentThread();14 System.out.println("Sledeci pacijent: " + red_cekanja[i] + "(nit "

+ cur.getName() + ", prioritet: " + cur.getPriority()16 + ").");

/*18 * metod sleep() prekida izvrsavanje tekuce niti za dati broj

* milisekundi koristimo try catch blok jer metod moze da izbaci dve

33

Page 38: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

4 Konkurentno programiranje

20 * vrste izuzetka 1. IllegalArgumentException - ukoliko je argument* negativan broj 2. InterruptedException - ukoliko neka druga nit

22 * prekine tekucu nit*/

24 try {Thread.sleep(2000);

26 } catch (InterruptedException e) {// TODO Auto-generated catch block

28 e.printStackTrace();}

30 }}

32 }

34 public class Join {public static void main(String args[]) {

36 String deca[] = { "Ana Antic", "Petar Petrovic", "Milica Mikic" };String penzioneri[] = { "Ljubisa Lukic", "Mara Mikic" };

38 String zaposleni[] = { "Anita Lazic", "Brankica Mijatovic" };MojaNit Deca = new MojaNit("Deca", deca);

40 MojaNit Penzioneri = new MojaNit("Penzioneri", penzioneri);MojaNit Zaposleni = new MojaNit("Zaposleni", zaposleni);

42 /** da bi bili sigurni da ce redosled prozivanja pacijenata biti deca,

44 * penzioneri, zaposleni koristimo metod join koji obezbedjuje* izvrsavanje nekog koda (niti) tek posto neka druga nit zavrsi svoje

46 * izvrsavanje (kada dodje do kraja run-metoda), u nasem primeru glavna* nit ceka da se prvo nit Deca zavrsi, nakon cega pokrece nit

48 * Penzioneri, pa nit Zaposleni*/

50 try {Deca.start();

52 Deca.join();if (!Deca.isAlive())

54 System.out.println("Nijedno dete vise ne ceka");Penzioneri.start();

56 Penzioneri.join();if (!Penzioneri.isAlive())

58 System.out.println("Nijedan penzioner vise ne ceka");Zaposleni.start();

60 Zaposleni.join();if (!Zaposleni.isAlive())

62 System.out.println("Nijedan zaposlen vise ne ceka");System.out.println("Nema vise pacijenata");

64 } catch (InterruptedException e) {// TODO Auto-generated catch block

66 e.printStackTrace();}

68 }}

Zadatak 4.5 Podaci o zaposlenim licima u preduzeću se cuvaju u obliku deljenih podatakakojima mogu pristupati različiti procesi i modifikovati ih. Program demonstrira problem nesinhro-nizacije niti koji može dovesti do nekonzistentnosti podataka u bazi preduzeća.

1 package cas_1;

3 /* niti nekad dele neke resurse (podatke) i ukoliko nismo pazljivi u operisanju sanjima,

* mogu da se pojave nezeljeni rezultati ukoliko ih niti modifikuju5 * staticki elementi klase su vrsta deljenih podataka izmedju instanci te klase

*/7

class DeljeniPodaci {9 public String ime;

public double plata;11 }

13 class MojaNit extends Thread {static DeljeniPodaci s;

15

MojaNit(String naziv) {

34

Page 39: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

4.1 Java

17 super(naziv);}

19

/*21 * niti X i Y koriste iste deljene podatke s, koji ne ostaju konzistenti

* tokom izvrsavanja niti upravo jer nisu sinhronizovane23 */

public void run() {25 for (int i = 1; i < 10; i++) {

if (getName().equals("X")) {27 s.ime = "Aleksandar";

try {29 // Uspavljivanje slucajno od 0 do 99 ms.

Thread.sleep((long) (Math.random() * 100));31 } catch (InterruptedException e) {

}33 s.plata = 999.0;

} else {35 s.ime = "Marija";

try {37 // Uspavljivanje slucajno od 0 do 99 ms.

Thread.sleep((long) (Math.random() * 100));39 } catch (InterruptedException e) {

}41 s.plata = 20000.0;

}43 System.out.println(getName() + " ime = " + s.ime);

System.out.println(getName() + " plata = " + s.plata);45 System.out.println();

}47 }

}49

public class Nesinhronizovani {51 public static void main(String[] args) {

MojaNit.s = new DeljeniPodaci();53 MojaNit ns1 = new MojaNit("X");

MojaNit ns2 = new MojaNit("Y");55 ns1.start();

ns2.start();57 }

}

Zadatak 4.6 Sinhronizacija niti. Uočen problem u prethodnom primeru se rešava korišćenjemsynchronized bloka.

package cas_1;2

/* niti nekad dele neke resurse (podatke) i ukoliko nismo pazljivi u operisanju sanjima,

4 * mogu da se pojave nezeljeni rezultati* staticki elementi klase su vrsta deljenih podataka izmedju instanci te klase

6 */

8 class DeljeniPodaci {public String ime;

10 public double plata;}

12

class MojaNit extends Thread {14 static DeljeniPodaci s;

16 MojaNit(String naziv) {super(naziv);

18 }

20 /** U Javi se mogu sinhronizovati objekti ili metodi.

22 ** synchronized ime_metoda(){} Metodu koji izvrsava kritican posao

24 * dodeljujemo modifajer synchronized. Na taj nacin, dok jedna nit koristi* taj metod, druga mu ne moze pristupiti.

35

Page 40: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

4 Konkurentno programiranje

26 ** synchronized(identifikator_objekta){} Slicno tome, mozemo sinhronizovati

28 * neki objekat preko synchronized bloka. Synchronized blok koristi koncept* monitora koji omogucava zakljucavanje podataka i pristup samo jedne niti

30 * zakljucanom podatku (kada nit udje u monitor, ona ga zakljuca i nijedna* druga ne moze da udje dok ova ne zavrsi).

32 ** U nasem primeru, sinhronizujemo deljene podatke s cime smo se obezbedili

34 * od mesanja podataka.*/

36 public void run() {

38 for (int i = 1; i < 10; i++) {synchronized (s) {

40

if (getName().equals("X")) {42

s.ime = "Aleksanadar";44 try {

// Uspavljivanje slucajno od 0 do 99 ms.46 Thread.sleep((long) (Math.random() * 100));

} catch (InterruptedException e) {48 }

s.plata = 999.0;50

} else {52 s.ime = "Marija";

try {54 // Uspavljivanje slucajno od 0 do 99 ms.

Thread.sleep((long) (Math.random() * 100));56 } catch (InterruptedException e) {

}58 s.plata = 20000.0;

}60

System.out.println(getName() + " ime = " + s.ime);62 System.out.println(getName() + " plata = " + s.plata);

System.out.println();64 }

}66 }

}68

public class Sinhronizovani {70 public static void main(String[] args) {

MojaNit.s = new DeljeniPodaci();72 MojaNit ns1 = new MojaNit("X");

MojaNit ns2 = new MojaNit("Y");74 ns1.start();

ns2.start();76 }

}

Zadaci za samostalni rad sa rešenjima

Zadatak 4.7 Napisati program kojim se paralelizuje izračunavanje proizvoda n-dimenzionalnogvektora skalarom. Korisnik unosi dimenziju vektora, elemente i skalar sa standardnog ulaza. Ko-ristiti zasebne niti za operisanje sa određenim elementima vektora, broj niti treba da odgovarabroju procesora koji su na raspolaganju. Ne praviti novi vektor za smeštanje rezultata. Main nittreba samo da ispiše rezultujući vektor na standardni izlaz.

Zadatak 4.8 Napisati program kojim se paralelizuje izračunavanje skalarnog proizvoda dvan-dimenzionalna vektora. Korisnik unosi dimenziju vektora i njihove elemente sa standardnogulaza. Main nit treba samo da ispiše rezultujući skalar na standardni izlaz, a za izračunavanjekoristiti zasebne niti. Broj niti treba da odgovara broju procesora koji su na raspolaganju.

Zadatak 4.9 Napisati program kojim se paralelizuje izračunavanje izraza (2+36)∗(15+100).Koristiti zasebne niti za primenu matematičkih operacija koje se javljaju u izrazu, broj niti treba

36

Page 41: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

4.1 Java

da odgovara broju procesora koji su na raspolaganju. Main nit treba samo da ispiše vrednost izrazana standardni izlaz.

Zadatak 4.10 Napisati program kojim se paralelizuje izračunavanje zbira elemenata dvaniza dužine n ([a1a2...an] + [b1b2...bn] = [a1 + b1a2 + b2...an + bn]). Korisnik unosi elementesa standardnog ulaza. Za smeštanje rezultata koristiti prvi niz. Main nit treba samo da ispišerezultujući niz na standardni izlaz, a za izračunavanje koristiti zasebne niti. Broj niti treba daodgovara broju procesora koji su na raspolaganju.

Zadatak 4.11 Napisati program koji proverava koji su elementi niza prosti brojevi i ispisuje ihna standardni izlaz. Korisnik unosi elemente sa standardnog ulaza. Za proveru da li su odgovarajućielementi niza prosti brojevi koristiti zasebne niti. Broj niti treba da odgovara broju procesora kojisu na raspolaganju.

Zadatak 4.12 Napisati program koji računa proizvod dve kvadratne matrice reda n kojekorisnik unosi sa standardnog ulaza. Za izračunavanje skalarnih proizvoda odgovarajućih vrsta ikolona koristiti zasebne niti, dok main nit treba samo da ispiše rezultujuću matricu na standardniizlaz. Broj niti treba da odgovara broju procesora koji su na raspolaganju.

Zadaci za vežbu

Zadatak 4.13 Sve zadatke iz prethodnog odeljka rešiti korišćenjem Runnable interfejsa.

Zadatak 4.14 Napisati program koji proverava koji su elementi niza savršeni brojevi i ispisujeih na standardni izlaz. Korisnik unosi elemente sa standardnog ulaza. Za proveru da li su elementiniza savršeni brojevi koristiti zasebne niti. Broj niti treba da odgovara broju procesora koji su naraspolaganju. Savršenim se naziva prirodni broj kome je zbir pozitivnih delilaca različitih od sebesamog jednak tom broju ili, analogno, onaj broj n kojem je zbir delilaca 2n. Primer savršenogbroja: 28 (1 + 2 + 4 + 7 + 14 = 28).

Zadatak 4.15 Napisati program koji računa determinantu matrice reda 3 koju korisnik unosisa standardnog ulaza. Koristiti zasebne niti za izračunavanje pomoćnih determinanti drugog reda,dok main nit treba samo da ispiše rezultujući skalar na standardni izlaz. Broj niti treba da odgovarabroju procesora koji su na raspolaganju.

4.1.2 Zaključavanje, java katanci i uslovni redovi čekanja.Uvodni primeri

Zadatak 4.16 Primer narušavanja integriteta podataka. Program demonstrira rad banke čijitransfer metod predstavlja kritičnu sekciju dok su klijenti niti koje izvršavaju prebacivanje novcasa jednog računa na drugi račun.

Zadatak 4.17 Zaključavanje kritične sekcije. Vrši se sinhronizacija niti klijenata da bi seobezbedila konzistentnost podataka, u ovom slučaju, ukupan saldo u banci.

Zadatak 4.18 Uslovni redovi čekanja za ulazak u kritičnu sekciju. Ne dozvoljavamo da klijentikoji ne poseduju dovoljnu kolicinu novca na računu izvrše transfer.

Zadaci za samostalni rad sa rešenjima

Zadatak 4.19 čokoladni svet Postoji veliko skladište čokolade koje ima 100 hiljadačokoladica. Pored skladišta postoje 4 prodavnice u koje može da se smesti najviše 1000 čokoladica.Inicijalno su prazne. Postoji i 100 ljudi i svaki od njih na svakih 0.5 sec oseti potrebu za čokoladicomi odlazi do neke od nasumično odabrane prodavnice. Potom u prodavnici, ako je dostupno, uzmenasumično od 1 do 7 čokoladica. Brzo nakon toga ih pojedu, ali uvek zapamte koliko su dosaduzeli komada. Prodavnice se snabdevaju periodično iz skladišta na svakih 5 sec. One uvek uzmutoliko čokoladica da se dopune do maksimalnog kapaciteta. Modelovati sistem i pobrinuti se da u

37

Page 42: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

4 Konkurentno programiranje

svakom momentu ukupna količina čokoladica u skladištu, prodavnicama i broj pojedenih komadabude 100 hiljada. Ispisavati promene stanja svake sekunde, koristiti odvojenu nit za ovo.

4.1.3 Grafički korisnički interfejsKorisni linkovi:

(a) http://www.roseindia.net/java/example/java/awt/index.shtml

(b) http://www.roseindia.net/tutorial/java/swing/JFrame.html

Uvodni primer - železnička stanica

Zadatak 4.20 Železnica nudi usluge prevoza robe. Vozovi kreću iz date stanice u nasumičnusledeću samo ako su ili potpuno puni, ili potpuno prazni. Tada u slučaju da su potpuno puni,pokušavaju da istovare svu svoju robu u prvoj sledećoj stanici, inače pokušavaju da napune svojevagone do punog kapaciteta. Veza između svaka dva grada na mapi ima dva koloseka, tako daprugu ne treba gledati kao deljeni resurs. Sa druge strane, stanice su deljeni resursi, iz razloga štou datom momentu više vozova može čekati na robu u njoj. Stanice su raspoređene kao na sliciispod, a veze između njih su zadate matricom povezanosti. Potrebno je kreirati 5 vozova i inici-jalno ih postaviti na različite polazne stanice. Vozovi će imati svoj kapacitet proizvoljno određenu opsegu od 5-10. Takođe, inicijalno su svi prazni, dakle, moraće da uzmu robu iz polazne stanice.Svaki voz treba implementirati kao zasebnu nit i grafički ga predstaviti kao pravougaonik (čija ćedužina zavisiti od njegovog kapaciteta). Mehanizme čekanja kod vozova realizovati korišćenjemkondicionih listi. Trenutni kapacitet stanica prikazan je brojem, a potrebno je prikazati i odnostrenutnog stanja i kapaciteta.

Slika 4.1: Na slici je dat grafički prikaz železnice, a u kodu pored se mogu videti tačne koordinate,kapaciteti i trenutno stanje robe po stanicama, kao i matrica povezanosti stanica

Zadaci za samostalni rad sa rešenjima

Zadatak 4.21 Lanac ishrane U centralnom delu prozora nalazi se njiva sa kupusom,oko nje je livada. Godišnji prinos iznosi 10 glavica, a kako je ovo ubrzana simulacija, pretpostavimoda godina traje samo 10 sekundi. Ukoliko zec naiđe na njivu, on uglavnom pojede jednu, a ako jebaš jako gladan najviše dve glavice kupusa, nakon toga napušta njivu. Ako na njivi nema kupusa,zec čeka dok se situacija ne promeni. Zečiji algoritam kretanja je vrlo jednostavan, ukoliko naiđena njivu ili zidove prozora, on se odbija pri čemu je izlazni ugao jednak ulaznom. Vuk se kreće naidentičan način i njemu nije interesantna njiva. Međutim, ukoliko naiđe na zeca on će ga pojestibez obzira gde se on nalazi, bilo na njivi, bilo na livadi. Napraviti okvir dimenzija 400 x 600 saprozorom dimenzija 350 x 550 na kom je iscrtana zela njiva dimenzija 100 x 100 na sredini. Svaki

38

Page 43: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

4.1 Java

zec je zasebna nit pri čemu je potrebno implementirati gore opisano kretanje, detektovanje ulaskau njivu, konzumaciju kupusa i blokiranje ukoliko ga nema dovoljno. Zec grafički izgleda kao plavikrug prečnika 10. Kreirati ukupno 20 zečeva van njive. Svaki vuk je zasebna nit sa gore opisanimkretanjem, pri čemu se on ne blokira se na njivi već samo prelazi preko nje. Vuk je grafički prikazancrnim krugom prečnika 40 i potrebno je da detektuje zeca kao objekat, a to je kada se dva krugapreseku. U tom momentu zec nestaje sa ekrana, tj. uklanja se iz kolekcije zečeva. Kreirati ukupno2 vuka van njive. Njiva je jedini deljeni resurs i treba ga zaštiiti korišćenjem semafora i liste čekanjau slučaju da nema dovoljno kupusa (primetiti da nema gornje granice, jer zečevi ne donose kupus,već ga samo uzimaju). Njiva je obnovljivi resurs, tako da i ona treba da bude nit, kako bi savremena na vreme povećavala količinu kupusa (10 glavica na svakih 10 sekundi).

Zadaci za vežbu

Zadatak 4.22 Gradilište Lokalna građevinska firma gradi četiri petospratnice. Peto-spratnice se grade na presecima stranica kvadrata dimenzija 500 x 500. Za svaku petospratnicu jeobezbeđeno po 2 vozila, jedno za transport građevinskog materijala, a drugo za transport ostalihmaterijala. Prvo vozilo je kamion, a drugo veliki kombi. Razlika je u kapacitetu i brzini kretanja:kamion prenosi duplo više (10000 kg : 5000 kg), ali se krede duplo sporije od kombija (postavitida je pomeraj za kamion duplo manji nego pomeraj za kombi). Građevinski materijal se nalazi ucentralnom delu ekrana (na preseku dijagonala kvadrata), dok se ostali materijali nalaze na oboduprozora desno i levo od centra gradilišta. Da bi se rad na zgradi odvijao regularno, potrebnoje imati dovoljne količine građevinskog i ostalog materijala. Kada jednog materijala ponestane(potrebno je bar 100 kg građevinskog i 50 kg ostalog materijala) izgradnja stoji, u suprotnom sesvake sekunde utroši po 100 kg jednog i 50 kg drugog materijala. Na skladištima građevinskog iostalog materijala uvek ima dovoljno da se napuni kamion ili kombi, dakle tu ne postoji nikakvočekanje. Za izgradnju jednog sprata potrebno je 20 tona materijala (10 građevinskog i 10 ostalog).Kada se zgrade završe vozila obustavljaju rad(implementirati listu čekanja ovde). Na početku svikamioni su na skladištu građevinskog materijala i kreću svaki ka petospratnici za koju su zaduženi(oni se kreću po dijagonalama), predstaviti ih plavim kvadratima dimenzije 20. Kombiji (dva po-stavljena na levom skladištu ostalog materijala, a dva na desnom) se kreću po vertikalama svakika petospratnici za koju je zadužen, predstaviti ih zelenim kvadratima stranice 10. Vozila se, čimprebace materijal, vraćaju na skladište sa kog su pošli. Zgrade predstaviti kao kvadrate dimenzija100 x 100 i ispisivati koliko je trenutno upotrebljeno građevinskog, a koliko ostalog materijala, kadje gradnja gotova, obojiti kvadrat u žuto.

Zadatak 4.23 Diskoteka Ekran dimenzija 500 x 500 je podeljen na dva dela, levi idesni iste širine. U levom delu se nalazi bankomat sa neograničenom količinom novca. Predstavitibankomat kao pravougaonik dimanzija 50 x 50 na sredini leve ivice ekrana. Na celom desnom deluje diskoteka predstavljena pravougaonikom 250 x 500. U diskoteci je 100 ljudi, i svako ima slučajanbroj novčanica od 200 dinara, i to ne manje od 5, a ne više od 20. Budući da vreme brzo prolazi,svako troši po jednu novčanicu od 200 dinara u sekundi. Algoritam kretanja čoveka je sledeći: akonema novca, kreće se pravolinijski ka bankomatu i podiže još 1000 dinara. Ako neko već podiženovac u tom trenutku, čeka ga da završi (implementirati listu čekanja ovde). Ako je podigao novac,najkraćim putem se vraća u diskoteku, i potom se haotično kreće u njoj (na slučajan način biratismer kretanja, ali voditi računa da ne izlazi iz diskoteke). Ljude predstaviti crnim krugovimapoluprečnika 5, koji su puni ako čovek ima novca, a prazni ukoliko mu je ponestalo novca.

39

Page 44: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

4 Konkurentno programiranje

40

Page 45: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

5

Generičko programiranje

Potrebno je imati instaliran g++.

Literatura:

(a) http://www.generic-programming.org/

(b) http://www.cplusplus.com/

5.1 Osnove programskog jezika C++, šabloni funkcija5.1.1 Uvodni primeri

Zadatak 5.1 Prvi c++ program.1 /* Umesto C-ovih FILE tokova, u C++ postoje klasni tipovi istream, ostream, koji

predstavljaju ulaz i izlaz (ifstream i ofstream su ekvivalentne klase za rad safajlovima). Ukljucivanjem zaglavlja iostream automatski se ukljucuju definicijesvih ovih tipova. Takodje, ovo zaglavlje definise i tri konkretna objekta: cin,cout, cerr (koji su ekvivalenti C-ovim stdin, stdout i stderr pokazivacima).Pomocu ovih objekata koristimo standardni ulaz i izlaz. */

3 #include <iostream>

5 /* Programski jezik C++ uvodi pojam "prostora imena" (eng. namespace). Prostori imenaimaju ulogu da grupisu tipove, promenljive (objekte) i funkcije koji su na neki

nacin logicki povezani i cine celinu. Identifikatorima koji su definisani uokviru prostora imena pristupa se na sledeci nacin:

7 <ime_prostora >::<identifikator>

9 Samim tim, svaki objekat, klasa ili funkcija iz standardne biblioteke mora imatiprefiks std:: prilikom koriscenja. Npr. umesto cout morate pisati std::cout. Dane bi stalno navodili ovaj prefiks ispred imena objekata, narocito ako smosigurni da identifikatori iz tog prostora nece doci u konflikt saidentifikatorima iz drugih prostora, postoji mogucnost da se "ukljuci" ceoprostor imena, direktivom 'using namespace <ime_prostora >;'. Nakon ove direktive,identifikatori iz ukljucenog prostora se mogu koristiti bez prefiksa, kao da su

definisani na globalnom nivou. */

11 using namespace std;

13 void swapLosaVarijanta(int a, int b){int temp = a;

15 a = b;b = temp;

17 }

19 /* Za svaki tip T u C++-u je moguce definisati tip T & koji se zove "referenca na T".Analogno pokazivacima, koji pokazuju na neki objekat tipa T, za reference kazemoda "referisu" na objekat tipa T. Na primer:

21 int x;

41

Page 46: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

5 Generičko programiranje

int & r = x;23

Promenljiva r je tipa "int &" , (cita se "referenca na int") koja je inicijalizovanada referise na int varijablu x. Semanticki, referenca je slicna pokazivacima, tj.omogucava da se preko nje pristupi drugom objektu u memoriji. Medjutim, postoje

neke kljucne razlike:25

1) Referenca se inicijalizuje samim objektom, a ne adresom tog objekta.27 2) Referenca se mora inicijalizovati (pokazivacka promenljiva se moze kreirati

neinicijalizovana, ili se inicijalizovati nulom, tj. da ne pokazuje ni na stainicijalno).

3) Referenca do kraja svog zivota referise na taj isti objekat kojim jeinicijalizovana (pokazivac se moze "preusmeriti" da pokazuje na nesto drugo ukasnijem toku programa).

29 4) Referenca se uvek odnosi na objekat na koji referise, tj. kada god napisemo r, toje isto (i po tipu, i po vrednosti, i po adresi), kao da ste napisali x, gde je xobjekat na koji r referise. Dakle, jezik ne pruza sintaksnu mogucnost da se

pristupi samoj referencnoj promenljivoj. Izraz:

31 r++;uvecace promenljivu x za jedan.

33

Pravi smisao referenci se ogleda u referencnim parametrima funkcija. Time seomogucava prenosenje podataka po adresi, mnogo lakse i sintaksno udobnije zakoriscenje od pokazivaca. Referenca se moze inicijalizovati samo "levimvrednostima", tj. izrazima koji mogu da stoje na levoj strani operatora dodele:

35

int & r = x; // ok37 int & r = a[i]; // ok, za niz int-ova

int & r = *p; // ok, gde je p pokazivac na int.39 int & r = x + 1; // ne valja!! x + 1 nije leva vrednost

float f;41 int & r = f; // ne valja, mora biti leva vrednost tipa int

int & r = x++; // ne valja, operator ++ ne vraca levu vrednost */43

45 void swap(int &a, int &b){int temp = a;

47 a = b;b = temp;

49 }

51 int main(){int a, b;

53 /* Ulazni i izlazni tokovi (istream i ostream) u kombinaciji sa operatorima << i >>su prilicno "pametni" -- za razliku od C-ovih scanf() i printf() funkcija, ovdevam nisu potrebni specifikatori konverzije (%d, %f, i sl.), da bi on znao o komse tipu radi -- sve se automatski prepoznaje. Operator << preusmerava ono sto jesa desne strane na izlazni tok, a operator >> prebacuje informacije sa ulaznogtoka u promenljive iz programa. */

cout<<"Zdravo cpp-u!"<<endl;55 cout<<"a=";

cin>>a;57 cout<<"b=";

cin>>b;59 swapLosaVarijanta(a,b);

cout<<"a="<<a<<" b="<<b<<endl;61 /* Prilikom poziva ne treba navoditi operator &, jer parametri funkcije nisu

pokazivaci, vec reference. Referencni parametri funkcije se inicijalizujuda referisu na promenljive a i b funkcije main(). */

63 swap(a,b);cout<<"a="<<a<<" b="<<b<<endl;

65

}

Zadatak 5.2 Prostor imena.#ifndef SEGMENT_H

2 #define SEGMENT_H#include<iostream>

4

/*6 Definisemo novi prostor imena, clanice istog prostora imena mogu da referisu jedna na

42

Page 47: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

5.1 Osnove programskog jezika C++, šabloni funkcija

drugu bez specijalne notacije dok je pristup van prostora moguc samo uznavodjenje prefiksa ime_prostora::clanica_prostora.

8 */namespace Segment{

10

bool paran(int n);12 void ispis(int n);

14 }

16 #endif

#include "Segment.h"2

/*4 Definicije funkcija se takodje navode u okviru prostora imena u kom su deklarisane.

*/6 namespace Segment{

8 bool paran(int n){if(n%2)

10 return false;else

12 return true;}

14 /* funkcija za parno n ispisuje sve parne od 0 do n, a za neparno sve neparne od 1do n */

void ispis(int n){16 /* funkcija paran je u istom prostoru, pa ne treba prefiks */

if(paran(n)){18 for(int i = 0; i <= n; i+=2)

std::cout << i << " ";20 std::cout << std::endl;

}22 else{

for(int i = 1; i <= n; i+=2)24 std::cout << i << " ";

std::cout << std::endl;26 }

}28 }

#ifndef SEGMENTK_H2 #define SEGMENTK_H

#include<iostream>4

namespace SegmentKvadrata{6

void ispis(int n);8

}10

#endif

#include "SegmentKvadrata.h"2

namespace SegmentKvadrata{4

/* funkcija ispisuje kvadrate svih brojeva od 0 do n */6 void ispis(int n){

for(int i = 0; i <= n; i++)8 std::cout << i*i << " ";

std::cout << std::endl;10 }

12 }

1 // program prevodite sa: g++ namespace.cpp Segment.cpp SegmentKvadrata.cpp

3 #include <iostream>

43

Page 48: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

5 Generičko programiranje

5 /* da nismo definisali prostore imena za svaku od napravljenih biblioteka, dolazi dogreske jer u obe biblioteke postoji funkcija ispis() pa njena upotreba ne bi bilamoguca */

#include "Segment.h"7 #include "SegmentKvadrata.h"

9 /*Takodje, ukljucivanje oba prostora imena sa:

11

using namespace Segment;13 using namespace SegmentKvadrata;

15 u ovom slucaju dovodi do greske jer se sada sve funkcije iz ovih prostora gledaju kaoglobalne u nasem programu pa ce postojati konflikt izmedju funkcija ispis() iz

ovih prostora

17 Zbog svega navedenog se preporucuje da se nove klase, funkcije definisu u korisnickimprostorima imena i da se van tih prostora koriste navodjenjem prefiksa prostora

kome pripadaju.

19 */

21 /*ipak, neke objekte i klase iz prostora std cesto koristimo, pa bi njihova upotreba

bez navodjena prefiksa bila pogodnija, u tom slucaju koristimo using -deklaraciju kojom se ukljucuje samo navedeni objekat ili klasa, a ne ceo prostorimena ( ipak, i u ovom slucaju se mora voditi racuna da li moze doci do konflikta, u nasem primeru, ako bismo pokusali nesto ovako:

23

using Segment::ispis;25 using SegmentKvadrata::ispis;

27 dovodi do greske, ali na primer ako bismo naveli samo

29 using Segment::ispis;

31 sa ispis(n) bi automatski pozivali funkciju iz prostora Segment i nema konflikta, jerse funkciji ispis() iz prostora SegmentKvadrata pristupa navodjenjem prefiksa )

33 */using std::cout; // sada cout i std::cout imaju isto znacenje

35

int main(){37 int n;

cout << "Unesite pozitivan broj: " << std::endl;39 std::cin >> n;

if(n<0)41 n *= -1 ;

/* poziv funkcije paran() bez odredjenog prefiksa dovodi do greske jer funkcijanije globalno definisana vec u okviru prostora Segment */

43 if(Segment::paran(n)){cout << "Parni brojevi iz segmenta [0, " << n << "]: " << std::endl;

45 // pozivamo funkciju ispis iz prostora SegmentSegment::ispis(n);

47 }else{

49 cout << "Neparni brojevi iz segmenta [0, " << n << "]: " << std::endl;// pozivamo funkciju ispis iz prostora Segment

51 Segment::ispis(n);}

53 cout << "Kvadrati brojeva iz segmenta [0, " << n << "]: "<< std::endl;// pozivamo funkciju ispis iz prostora segment_kvadrata

55 SegmentKvadrata::ispis(n);

57 }

Zadatak 5.3 Klasa Trougao.

Zadatak 5.4 Šabloni funkcija. Opcioni argumenti šablona funkcija.

Zadatak 5.5 Napisati šablone funkcija za određivanje:

44

Page 49: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

5.1 Osnove programskog jezika C++, šabloni funkcija

(a) zbira dva objekta

(b) n-tostruke vrednosti nekog objekta

(c) minimalne vrednosti dva objekta

Primeniti prethodne šablone na:

(A) cele brojeve

(B) realne brojeve

(C) objekte klase Trougao

Zadatak 5.6 Klasa Osoba.

Zadatak 5.7 Napisati šablone funkcija za:

(a) kreiranje niza tipa T dužine n date kao argument funkcije

(b) učitavanje niza tipa T dužine n date kao argument funkcije

(c) ispisivanje niza tipa T dužine n date kao argument funkcije

(d) određivanje maksimuma niza tipa T dužine n sa podrazumevanom dužinom 2

Primeniti prethodne šablone na:

(A) niz celih brojeva

(B) niz realnih brojeve

(C) niz objekata klase Osoba

5.1.2 Zadaci za vežbu

Zadatak 5.8 Napisati klasu Datum i u njoj obezbediti:

(a) konstruktor sa podrazumevanim vrednostima (1.1.2017.)

(b) pristupne metode

(c) metod za izmenu datuma

(d) metode za čitanje i ispisivanje datuma

(e) aritmetičke operatore +,- i operatore poređenja <, ==, >

Zadatak 5.9 Napisati klasu KompleksanBroj i u njoj obezbediti:

(a) konstruktor sa dva argumenta (realni i imaginarni deo) i podrazumevanim vrednostima (0,0)

(b) pristupne metode

(c) metod za izmenu kompleksnog broja

(d) metode za čitanje i ispisivanje kompleksnog broja

(e) aritmetičke operatore +,-,*

(f) metod za određivanje modula

(g) metod za određivanje argumenta

Zadatak 5.10 Napisati sledeće šablone funkcija:

45

Page 50: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

5 Generičko programiranje

(a) Funkciju koja pronalazi maksimalni element u nizu.

(b) Funkciju koja pronalazi minimalni element u nizu.

(c) Funkciju koja pronalazi prosek niza.

Primeniti takve šablone funkcija nad nizovima:

(A) Celobrojnih vrednosti

(B) Realnih vrednosti

(C) Trodimenzionih tačaka (kod tačaka udaljenost od (0,0,0) definise magnitudu, a po toj uda-ljenosti se dalje računa i prosek)

5.2 Šabloni klasa

5.2.1 Uvodni primeri

Zadatak 5.11 Šablon klasa Koordinate za predstavljanje koordinata tačaka u prostoru.

5.2.2 Zadaci za vežbu

Zadatak 5.12 Napraviti šablon od klase Trougao tako da dužine stranica mogu biti različitogtipa. Napisati program koji testira šablon klasu Trougao za stranice tipa int.

Zadatak 5.13 Napisati šablon klasu Radnik u okviru prostora imena kompanija. Radnikakarakterišu jedinstveni identifikacioni broj id, tipa int i njegova plata (u dinarima), tipa T koji jeparametar šablona. U klasi obezbediti:

(a) konstruktor sa dva argumenta za polja podatke,

(b) operatore poređenja <, == (poređenje radnika se svodi na poređenje njihovih plata, pretpo-staviti da za objekte tipa T postoje definisani operatori poređenja),

(c) metode za računanje visine plate izražene u evrima i dolarima (smatrati da je kurs evra119.2, a dolara 100.3), pretpostaviti da za objekte tipa T postoji definisano množenje sakonstantama i da će rezultat izračunavanja biti tipa T .

Napisati program koji testira šablon klasu Radnik za platu tipa double.

Zadatak 5.14 Napisati šablon klasu Kvadar u okviru prostora imena geometrija koja kaopolja podatke ima širinu, dužinu i visinu kvadra. Sva tri podatka su tipa T koji je parametaršablona. U klasi obezbediti:

(a) konstruktor sa tri argumenta

(b) metod za računanje zapremine kvadra (pretpostaviti da za objekte tipa T postoji definisanaoperacija množenja i da će rezultat izračunavanja biti tipa T )

(c) operatore poređenja <, == (poređenje kvadara se svodi na poređenje njihovih zapremina,pretpostaviti da za objekte tipa T postoje definisani operatori poređenja)

Napisati program koji testira šablon klasu Kvadar za podatke tipa int.

46

Page 51: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

5.3 STL

5.3 STL5.3.1 Uvodni primeri

Zadatak 5.15 Korisnik unosi cene artikala sve dok ne unese 0 (0 je oznaka za kraj ulaza, nečuva se u kolekciji). Koristeći pogodnu kolekciju iz STL-a za čuvanje cena, napisati program koji:

(a) dodaje cene artikala u kolekciju u redosledu u kom stižu. Nakon učitavanja ispisati cenusvakog trećeg artikla počev od najnovijeg ka najstarijem.

(b) dodaje cene artikala u kolekciju u obrnutom redosledu od onog u kom stižu. Nakon učitavanjacena (čiji se unos završava sa 0), korisnik dodatno unosi još jednu cenu, nakon čega trebaobrisati sve artikle skuplje od unete cene i ispisati modifikovanu kolekciju.

(c) dodaje cene artikala tako da neparne stavlja na početak, a parne na kraj kolekcije i tako dokraja ulaza. Ispisati dobijenu kolekciju i zbir unetih cena.

(d) eliminiše duplikate cena iz unetog niza, a zatim ispisuje cene prvo u rastućem, a zatim i uopadajućem poretku.

Zadatak 5.16 Napisati program koji sa standardnog ulaza učitava pozitivan ceo broj n, a zatimpodatke o n studenata u obliku korisničko ime studenta sa alas-a prosek. Nakon toga, korisnik unosikorisničko ime studenta čiji prosek želi da mu se prikaže. Ukoliko takav student ne postoji u bazi,omogućiti korisniku da doda podatke o tom studentu, a ukoliko postoji, prikazati trenutni prosekna standardni izlaz i omoguciti korisniku da promeni trenutni prosek za tog studenta. Koristitipogodnu kolekciju iz STL-a za čuvanje podataka.

Zadatak 5.17 Napisati program koji sa standardnog ulaza učitava pozitivan ceo broj n,a zatim dva vektora, gde je prvi vektor dužine n i proizvoljnog tipa, a drugi vektor dužine n-1 i sačinjen je od stringova čije su vrednosti + ili -. Napisati šablon funkciju za učitavanje uvektor proizvoljnog tipa, kao i za ispis proizvoljnog vektora i šablon funkciju koja prihvata dvavektora pomenutog formata i primenjuje operaciju sabiranja ili oduzimanja nad prvim vektoromi ispisuje dobijeni rezultat. Na primer, ako su učitani vektori: 462 − 34 i + + −+ dobiće se:4 + 6 + 2− (−3) + 4 = 19. Testirati program nad vektorom celih i realnih brojeva. Pretpostavitida su ulazni podaci u ispravnom formatu.

Zadatak 5.18 Napisati program koji sa standardnog ulaza učitava kvadratnu matricu reda nsačinjenu od objekata proizvoljnog tipa, a zatim ispisuje:

(a) zbir elemenata matrice na glavnoj dijagonali.

(b) maksimalni element matrice.

(c) transponat učitane matrice.

Potrebno je napraviti šablon klasu Matrica sa odgovarajućim metodama. Za čuvanje elemenatamatrice iskoristiti pogodnu kolekciju iz STL-a. Testirati program nad matricom celih i realnihbrojeva i objekata klase Trougao. Pretpostaviti da su ulazni podaci u ispravnom formatu.

Zadatak 5.19 Napisati program koji sa standardnog ulaza učitava pozitivan ceo broj n, azatim kolekciju dužine n proizvoljnog tipa, i menja je tako što nad svakim elementom kolekcijeprimenjuje unarnu transformaciju:

(a) inkrementaciju.

(b) dekrementaciju.

(c) kvadriranje.

Napisati šablon funkciju za učitavanje i ispis proizvoljne kolekcije, kao i šablon funkciju koja menjakolekciju na pomenut način. Testirati program nad vektorom celih brojeva i listom realnih brojeva.Pretpostaviti da su ulazni podaci u ispravnom formatu.

47

Page 52: Programski  · PDF file1 Skript programiranje PotrebnojeimatiinstaliranPython2.7naračunaru. Literatura: (a)   (b)

5 Generičko programiranje

Zadatak 5.20 Napisati program koji sa standardnog ulaza učitava pozitivan ceo broj n, a zatimkolekciju dužine n proizvoljnog tipa, i menja je tako što zadržava samo elemente koji ispunjavajusledeći unarni uslov:(a) da su deljivi sa 3.

(b) da nisu deljivi sa 5.

(c) da su veci od 7.

(d) da su manji od 11.Napisati šablon funkciju za učitavanje i ispis proizvoljne kolekcije, kao i šablon funkciju koja menjakolekciju na pomenut način. Testirati uslove deljivosti/nedeljivosti nad vektorima celih brojeva,a poredbene uslove nad listama realnih brojeva. Pretpostaviti da su ulazni podaci u ispravnomformatu.

Zadatak 5.21 Uopštavanje prethodnog zadatka: Napisati program koji sa standardnog ulazaučitava pozitivan ceo broj n, a zatim kolekciju dužine n proizvoljnog tipa i menja kolekciju takošto zadržava samo elemente koji ispunjavaju unarni uslov:(a) da su deljivi sa dodatno učitanim celim brojem.

(b) da su veci od dodatno učitanog realnog broja.Napisati šablon funkciju za učitavanje i ispis proizvoljne kolekcije, kao i šablon funkciju koja menjakolekciju na pomenut način. Testirati uslov deljivosti nad vektorom celih brojeva, a poredbeniuslov nad listom realnih brojeva. Pretpostaviti da su ulazni podaci u ispravnom formatu.

Zadatak 5.22 Napisati program koji sa standardnog ulaza učitava pozitivan ceo broj n, azatim kolekciju dužine n proizvoljnog tipa i ispisuje elemente nule linearne jednačine sa realnimkoeficijentima koji se dodatno učitavaju. Ispisati i broj pronađenih nula u kolekciji. Napisati šablonfunkciju za učitavanje i ispis proizvoljne kolekcije, kao i šablonski funkcional pod nazivom Linearkoji pri kreiranju prihvata dva realna argumenta, odnosno koeficijente linearne jednačine. Testiratiprogram nad vektorom celih i realnih brojeva. Pretpostaviti da su ulazni podaci u ispravnomformatu.

Zadatak 5.23 Program učitava podatke o prodavnici u sledećem formatu, broj vrsta artikala,a zatim za svaki artikal ime (pretpostaviti da je jedinstveno), količinu i cenu. Prikazati redovne cenei stanje u prodavnici za sve artikle, a zatim prikazati i cene artikala za vreme akcije - popusta od10% na sve. Implementirati odgovarajuću šablon funkciju iz biblioteke algorithm za modifikovanjekolekcije sa podacima o prodavnici na traženi način.

Zadatak 5.24 Modifikovati prethodni program ako se akcijski popust (u procentima) unosi kaovrednost sa standardnog ulaza. Ukoliko je uneta vrednost veća od 50, podrazumevano primenitiakciju u pola cene. Napisati odgovarajući funkcional pod nazivom Akcija koji za argument prihvatavrednost popusta koji treba da se obračuna za sve artikle.

Zadatak 5.25 Program učitava podatke o prodavnici u sledećem formatu, broj vrsta artikala,a zatim imena svih artikala, pa nakon toga raspoloživu količinu za sve artikle u odgovarajućemredosledu. Prikazati stanje u prodavnici za sve artikle. Zatim za one artikle kojih nema dovoljno nastanju (minimalno 100), postaviti količinu na 100 i prikazati novo stanje u prodavnici. Implemen-tirati odgovarajuću šablon funkciju iz biblioteke algorithm za modifikovanje kolekcije sa podacimao prodavnici na traženi način.

Zadatak 5.26 Modifikovati prethodni program ako se minimalna količina za artikle unosi kaovrednost sa standardnog ulaza. Ukoliko je uneta vrednost veća od 100, podrazumevano postavitikoličinu na 100. Napisati odgovarajući funkcional pod nazivom Dopuna koji za argument prihvatavrednost koju treba postaviti kao novu količinu za artikle kojih nema dovoljno na stanju.

5.3.2 Zadaci za vežbu

Zadatak 5.27 Za vežbu implementirati preostale šablone definisane u STL biblioteci algo-rithm. http://www.cplusplus.com/reference/algorithm/

48