You are on page 1of 35

Programiranje 1

Skupovi, Rečnici,
Ulaz i izlaz

Univerzitet u Beogradu
Elektrotehnički fakultet
Sadržaj
 Skupovi:
⚫ Kreiranje skupa prema zadatom pravilu
 Rečnici:
⚫ Iteracije kroz rečnik
⚫ Pakovanje i raspakivanje rečnika
 Ulaz i izlaz:
⚫ Datoteke
⚫ Direktorijumi
⚫ CSV format

ETF Beograd::Programiranje 1 2/35


Skupovi
 Kolekcije drugih objekata (kao liste)
 Promenljiv tip podataka (kao liste)
 Elementi mogu biti različitih tipova (kao kod lista)
 Elementi nisu uređeni (za razliku od lista):
⚫ Ne može im se pristupati preko indeksa
⚫ Može se iterirati kroz skup
 Nisu dozvoljeni duplikati (za razliku od lista):
⚫ Brža provera da li je element u skupu nego u listi
skup = set([1, "tekst", 1, False]) # {False, 1, 'tekst'}
skup = {1, "tekst", 1, False} # {False, 1, 'tekst'}

ETF Beograd::Programiranje 1 3/35


1. zadatak (1/2)
 Na programskom jeziku Python sastaviti program
koji za prosleđene liste pronalazi:
⚫ a) presek elemenata prve dve liste
⚫ b) elemente koji se nalaze u svim listama
⚫ c) elemente koji se nalaze u samo jednoj listi

def a(l1, l2):


s1, s2 = set(l1), set(l2) 2
return s1.intersection(s2) 8 5
7
3
def b(*lists): 1
sets = [set(l) for l in lists] 9 0
6
return set.intersection(*sets)
ETF Beograd::Programiranje 1 4/35
1. zadatak (2/2)
def c(*lists):
sets = [set(l) for l in lists]
diff = []
for i in range(len(sets)):
sets[0], sets[i] = sets[i], sets[0]
diff.append(set.difference(*sets))
return set.union(*diff)

l1, l2, l3 = [8, 3, 5, 6, 7], [9, 0, 3, 8, 7], [0, 3, 2, 1, 5]


a, b, c = a(l1, l2), b(l1, l2, l3), c(l1, l2, l3)
print("a) {}\nb) {}\nc) {}".format(a, b, c))

a) {8, 3, 7}
b) {3}
c) {9, 2, 6, 1}

ETF Beograd::Programiranje 1 5/35


2. zadatak
 Na programskom jeziku Python sastaviti funkciju
koja proverava da li je zadata rečenica heterogram
(nijedno slovo se ne pojavljuje više od jednom).

def isHeterogram(sentence):
letters = [char for char in sentence if char.isalpha()]
return len(set(letters)) == len(letters)

sentence = input("Unesi rečenicu: ")


if isHeterogram(sentence):
print("\"{}\" JESTE heterogram".format(sentence))
else:
print("\"{}\" NIJE heterogram".format(sentence))

ETF Beograd::Programiranje 1 6/35


3. zadatak
 Na programskom jeziku Python sastaviti funkciju
koja proverava da li je zadata rečenica pangram
(sva slova se pojavljuju bar jednom).

def isPangram(sentence):
alphabet = {chr(i) for i in range(ord("a"), ord("z")+1)}
letters = {l.lower() for l in sentence if char.isalpha()}
return len(letters) == len(alphabet)

sentence = input("Unesi recenicu: ")


if isPangram(sentence):
print("\"{}\" JESTE pangram".format(sentence))
else:
print("\"{}\" NIJE pangram".format(sentence))

ETF Beograd::Programiranje 1 7/35


Rečnici
 Kolekcije drugih objekata (kao liste)
 Promenljiv tip podataka (kao liste)
 Elementi mogu biti različitih tipova (kao kod lista)
 Elementi nisu uređeni (za razliku od lista):
⚫ Ne može im se pristupati preko indeksa
⚫ Može im se pristupati preko ključa
⚫ Može se iterirati kroz rečnik
 Nisu dozvoljeni duplikati (za razliku od lista)
recnik = {"prvi": 1, "drugi": "tekst", "prvi": False} # {'prvi': False, 'drugi': 'tekst'}
recnik = dict(prvi=False, drugi="tekst") # {'prvi': False, 'drugi': 'tekst'}

ETF Beograd::Programiranje 1 8/35


Iteracije kroz rečnik
 Mogu se koristiti metode za rad sa rečnicima
values(), keys(), items()
opstine = {
"Voždovac": 149,
"Vračar": 3,
"Zvezdara": 32,
"Palilula": 447
}

for k in opstine:
print(k, opstine[k]) # Voždovac 149...

for k in opstine.keys():
print(k, opstine[k]) # Voždovac 149...

for v in opstine.values():
print(v) # 149...

for k, v in opstine.items():
print(k, v) # Voždovac 149...

ETF Beograd::Programiranje 1 9/35


Pakovanje i raspakivanje rečnika
 Pakovanje i raspakivanje rečnika realizuje se
korišćenjem operatora **
def pakovanje(**recnik):
for kljuc in recnik:
print(recnik[kljuc], end=' ')

pakovanje(a=3, b=2, c=4, d=5, e=1) # 3 2 4 5 1

prvi = {"a": 3, "b": 2, "c": 4}


drugi = {"d": 5, "e": 1}
raspakivanje = {**prvi, **drugi}
for element in raspakivanje.values(): print(element, end=' ') # 3 2 4 5 1

def redosled(obican, *torka, **recnik):


print(obican, end=' ') # 3
for element in torka: print(element, end=' ') # 2 4
for element in recnik.values(): print(element, end=' ') # 5 1

redosled(3, 2, 4, a=5, b=1) # 3 2 4 5 1

ETF Beograd::Programiranje 1 10/35


Datoteke
 Otvaranje i zatvaranje datoteke:
⚫ Ugrađena funkcija open()
⚫ Metoda close()
 Čitanje datoteke:
⚫ Metode read(), readline(), readlines()
 Pisanje u datoteku:
⚫ Metode write(), writelines()
 Pozicioniranje unutar datoteke:
⚫ Metode seek(), tell()

ETF Beograd::Programiranje 1 11/35


4. zadatak (1/2)
 Na programskom jeziku Python sastaviti funkciju
koja pronalazi srednju dužinu reči zadate datoteke.
v05z04.txt
prva druga
treca
cetvrta peta sesta

Unesite ime datoteke: v05z04.txt


Srednja dužina reči datoteke v05z04.txt je 5.00

datoteka = input("Unesite ime datoteke: ")


print("Srednja dužina reči datoteke {} je {:0.2f}"
.format(datoteka, srednja_duzina_reci(datoteka)))

ETF Beograd::Programiranje 1 12/35


4. zadatak (2/2)
def srednja_duzina_reci(datoteka):
broj_slova = 0
broj_reci = 0
pocetak_reci = True
f = open(datoteka)
for linija in f:
for znak in linija:
if znak.isspace():
pocetak_reci = True
else:
broj_slova += 1
if pocetak_reci:
broj_reci += 1
pocetak_reci = False
f.close()
return broj_slova / broj_reci

ETF Beograd::Programiranje 1 13/35


5. zadatak (1/3)
 Na programskom jeziku Python sastaviti program
koji:
⚫ a) prvo čita tekst iz ulazne tekstualne datoteke i upisuje
tekst u ASCII formatu u izlaznu binarnu datoteku
⚫ b) zatim čita podatke iz formirane binarne datoteke i
upisuje ih u izlaznu tekstualnu datoteku

v05z05d01.txt v05z05d02.txt
Prva recenica. Druga. Prva recenica. Druga.
Treca recenica u novom redu. Treca recenica u novom redu.
Cetvrta. Peta recenica. Cetvrta. Peta recenica.
Sesta recenica na kraju. Sesta recenica na kraju.

ETF Beograd::Programiranje 1 14/35


5. zadatak (2/3)
def tekstualna_u_binarnu(ulazna, izlazna):
with open(ulazna, encoding="ASCII") as ulaz:
with open(izlazna, "wb") as izlaz:
izlaz.write(ulaz.read().encode("ASCII"))

def binarna_u_tekstualnu(ulazna, izlazna):


with open(ulazna, "rb") as ulaz:
with open(izlazna, "w", encoding="ASCII") as izlaz:
izlaz.write(ulaz.read().decode("ASCII"))

tekstualna_u_binarnu("v05z05d01.txt", "v05z05d02.bin")
binarna_u_tekstualnu("v05z05d02.bin", "v05z05d01.txt")

 Da li uvek treba čitati celu datoteku odjednom?


Kada se može javiti problem?
ETF Beograd::Programiranje 1 15/35
5. zadatak (3/3)
def u_binarnu(ulazna, izlazna):
with open(ulazna, encoding="ASCII") as ulaz:
with open(izlazna, "wb") as izlaz:
for linija in ulaz:
izlaz.write(linija.encode("ASCII"))

def u_tekstualnu(ulazna, izlazna):


with open(ulazna, "rb") as ulaz:
with open(izlazna, "w", encoding="ASCII") as izlaz:
while True:
bajt = ulaz.read(1)
if not bajt: break
izlaz.write(bajt.decode("ASCII"))

 Šta ako ne pripadaju svi znakovi ASCII kodu?


ETF Beograd::Programiranje 1 16/35
6. zadatak (1/2)
 Na programskom jeziku Python sastaviti funkciju
koja vrši obradu nad spiskom nadimaka:
⚫ Ulazna datoteka u jednom redu sadrži podatke o
nadimku, polu (0 – ženski, 1 – muški) i imenima.
⚫ Izlazna datoteka treba da grupiše imena po nadimcima.
Ako je nadimak za imena oba pola koristiti oznaku 2.
v05z06d01.txt v05z06d02.txt
Tea 0 Dorotea Teodora Tea 0 Dorotea, Teodora
Saša 0 Aleksandra Saša 2 Aleksandra, Aleksandar
Fića 1 Filip Fića 1 Filip
Jela 0 Jelisaveta Jela 0 Jelisaveta, Jelica, Jelena
Saša 1 Aleksandar
Jela 0 Jelica Jelena
ETF Beograd::Programiranje 1 17/35
6. zadatak (2/2)
def obrada(ulazna, izlazna):
nadimci = {}
with open(ulazna, encoding="UTF-8") as ulaz:
for linija in ulaz:
nadimak, pol, *imena = linija.split()
imena = ", ".join(imena)
if nadimak not in nadimci:
nadimci[nadimak] = [pol, imena]
else:
nadimci[nadimak][1] += ", " + imena
if pol != nadimci[nadimak][0]:
nadimci[nadimak][0] = 2
with open(izlazna, "w", encoding="UTF-8") as izlaz:
for k, v in nadimci.items():
izlaz.write("{:6}{:<3}{}\n".format(k, v[0], v[1]))

obrada("v05z06d01.txt", "v05z06d02.txt")
ETF Beograd::Programiranje 1 18/35
Direktorijumi
 Korisne funkcije iz modula os i os.path:
⚫ Za datoteke: remove(), isfile()
⚫ Za direktorijume: chdir(), listdir(), mkdir(), rmdir()
⚫ Za datoteke i direktorijume: rename(), exists()
import os

if not os.path.exists("direktorijum"):
os.mkdir("direktorijum")
os.chdir("direktorijum")
if os.path.exists("novi.txt") and os.path.isfile("novi.txt"):
os.rename("novi.txt", "stari{}.txt".format(len(os.listdir())))
with open("novi.txt", "w") as f: f.write(input())

import os

for f in os.listdir("direktorijum"):
os.remove("direktorijum/" + f)
os.rmdir("direktorijum")

ETF Beograd::Programiranje 1 19/35


7. zadatak (1/4)
 Na programskom jeziku Python sastaviti funkciju
koja računa osvojene poene studenta:
⚫ Ulazna CSV (comma-separated values) datoteka sadrži
sledeće kolone: indeks, ime i prezime studenta,
kolokvijum, tačnost svake od četiri pitalice (-1, 0, 1) i
broj poena osvojen na zadatku (0-100)
⚫ Treba kreirati izlaznu tekstualnu datoteku za svakog
studenta sa poenima osvojenim na svakom kolokvijumu i
ukupnim brojem poena (0.3*K1 + 0.35*K2 + 0.35*K3)
⚫ Tačna pitalica vredi 15 poena, a netačna -3.75 poena,
pitalice nose 45 poena, dok zadatak nosi 55 poena

ETF Beograd::Programiranje 1 20/35


7. zadatak (2/4)
v05z07.csv
28/2019, Filip Ristic, K1, 1, 1, 1, 1, 100
413/2019, Jelena Petrović, K2, -1, 1, 0, 1, 87
28/2019, Filip Ristic, K2, 1, 0, 0, -1, 79
28/2019, Filip Ristic, K3, 0, 1, -1, 1, 63

rf190028d.txt
K1: 100.00
K2: 54.7
K3: 60.90
UKUPNO: 72.8925

pj190413d.txt
K2: 74.10
UKUPNO: 25.93

ETF Beograd::Programiranje 1 21/35


7. zadatak (3/4)
import os

def obrada(ulazna):
direktorijum = "rezultati"
if not os.path.exists(direktorijum):
os.mkdir(direktorijum)
os.chdir(direktorijum)
rezultati = {}
vrednosti = {"-1": -3.75, "0": 0, "1": 15}
with open("../" + ulazna) as ulaz:
for linija in ulaz:
linija = [p.strip() for p in linija.split(",")]
indeks, ip, kolokvijum, *pitalice, zadatak = linija
broj, godina = indeks.split("/")
ime, prezime = ip.split()
poeni = sum([vrednosti[p] for p in pitalice])
poeni = min(poeni, 45) + float(zadatak) * 0.55
ETF Beograd::Programiranje 1 22/35
7. zadatak (4/4)
i, p = ime[0].lower(), prezime[0].lower()
g, b = godina[2:], "{:0>4}".format(broj)
izlazni = p + i + g + b + "d"
if izlazni not in rezultati:
rezultati[izlazni] = [kolokvijum], [poeni]
else:
rezultati[izlazni][0].append(kolokvijum)
rezultati[izlazni][1].append(poeni)
for k, v in rezultati.items():
with open(k, "w") as izlaz:
s = 0
for kol, p in zip(v[0], v[1]):
izlaz.write("{}: {:0.2f}\n".format(kol, p))
s += p * 0.3 if kol == "K1" else p * 0.35
izlaz.write("UKUPNO: {:0.2f}\n".format(s))

obrada("v05z07.csv")
ETF Beograd::Programiranje 1 23/35
8. zadatak (1/4)
 Na programskom jeziku Python sastaviti program
koji pronalazi ukupno vreme potrebno za obliazak
svih tvrđava na ruti unetoj sa standardnog ulaza:
⚫ Ulazna CSV datoteka sadrži informaciju o vremenu
potrebnom da se stigne od jedne do druge tvrđave za
svaki postojeći par tvrđava
⚫ Vreme je izraženo u minutima i isto je za oba smera
⚫ Ruta se unosi sa standardnog ulaza, po jedan naziv
tvrđave u svakom redu i završava se praznim redom
⚫ Ukupno vreme izraziti u satima i minutima
⚫ Ignorisati mala i velika slova i suvišne blanko znakove
ETF Beograd::Programiranje 1 24/35
8. zadatak (2/4)
v05z08.csv
Petrovaradinska tvrđava, Maglič, 185
Beogradska tvrđava, Petrovaradinska tvrđava, 82
Golubački grad, beogradska tvrđava, 121
Petrovaradinska tvrđava, Golubački Grad, 172
Maglič, Beogradska tvrđava, 156
Maglič, Golubački grad, 191

1. tvrđava: petrovaradinska tvrđava


2. tvrđava: MAGLIČ
3. tvrđava: Golubački Grad
4. tvrđava: beogradska tvrđava
5. tvrđava: Petrovaradinska tvrđava
6. tvrđava: smederevska tvrđava
7. tvrđava:
Ukupno vreme: 09:39

ETF Beograd::Programiranje 1 25/35


8. zadatak (3/4)
def ukloni_razmake(naziv):
return " ".join(naziv.split())

def sortiraj_tvrdjave(prvi, drugi):


prvi = ukloni_razmake(prvi.lower())
drugi = ukloni_razmake(drugi.lower())
return prvi + "-" + drugi if prvi < drugi \
else drugi + "-" + prvi

def ucitaj_datoteku(ulazna):
with open(ulazna, encoding="UTF-8") as ulaz:
vremena = dict()
for linija in ulaz:
prva, druga, vreme = linija.split(",")
par = sortiraj_tvrdjave(prva, druga)
vremena[par] = int(vreme)
return vremena
ETF Beograd::Programiranje 1 26/35
8. zadatak (4/4)
def konvertuj_vreme(minuti):
sati = minuti // 60
minuti %= 60
return "{:02}:{:02}".format(sati, minuti)

vremena = ucitaj_datoteku("v05z08.csv")
trenutna = prethodna = ""
i, ukupno_vreme = 1, 0
while True:
prethodna = trenutna
trenutna = input("{}. tvrđava: ".format(i)).lower()
if not trenutna: break
par = sortiraj_tvrdjave(prethodna, trenutna)
if par in vremena:
ukupno_vreme += vremena[par]
i += 1
print("Ukupno vreme: {}".format(konvertuj_vreme(ukupno_vreme)))
ETF Beograd::Programiranje 1 27/35
Pregled

ETF Beograd::Programiranje 1 28/35


Pregled – Funkcije i metode (1)
 Ugrađene funkcije:
⚫ open()
 Metode za rad sa skupovima:
⚫ union()
⚫ intersection()
⚫ difference()
 Metode za rad sa rečnicima:
⚫ keys()
⚫ values()
⚫ items()
ETF Beograd::Programiranje 1 29/35
Pregled – Funkcije i metode (2)
 Metode za rad sa stringovima:
⚫ encode() ⚫ join()
 Metode za rad sa binarnim tipom:
⚫ decode()
 Metode za rad sa datotekama:
⚫ close() ⚫ readline() ⚫ write() ⚫ seek()
⚫ read() ⚫ readlines() ⚫ writelines() ⚫ tell()
 Funkcije iz modula os i os.path:
⚫ remove() ⚫ rename() ⚫ chdir() ⚫ mkdir()
⚫ isfile() ⚫ exists() ⚫ listdir() ⚫ rmdir()
ETF Beograd::Programiranje 1 30/35
Pregled – Ključne reči
 Za rad resursima (context managers):
⚫ with

ETF Beograd::Programiranje 1 31/35


Pregled – Operatori
 Aritmetički operatori
 Bitski operatori
 Operatori dodele
 Relacioni operatori
 Logički operatori
 Operatori identiteta
 Operatori pripadnosti

ETF Beograd::Programiranje 1 32/35


Pregled – Tipovi podataka
 Int
 Float  Numerički tipovi
 Complex
 Boolean  Logički tip
 String
 List
 Tuple  Kolekcije
 Set
 Dict
ETF Beograd::Programiranje 1 33/35
Literatura – Knjige
 M. Kovačević, Osnove programiranja u Pajtonu,
Akademska misao, Beograd, 2017.
 M. Lutz, Learning python: Powerful object-oriented
programming, 5th edition, O'Reilly Media, Inc., 2013.
 J. Zelle, Python Programming: An Introduction to
Computer Science, 3rd Ed., Franklin, Beedle &
Associates, 2016.
 D. Beazley, B. K. Jones, Python Cookbook, 3rd edition,
O'Reilly Media, 2013.
 A. Downey, J. Elkner, C. Meyers, How To Think Like A
Computer Scientist: Learning With Python, free e-book
ETF Beograd::Programiranje 1 34/35
Literatura – Online izvori
 Python 3 documentation,
https://docs.python.org/3/index.html
 Learn Python, Basic tutorial,
https://www.learnpython.org/
 TutorialsPoint, Python tutorial
https://www.tutorialspoint.com/python/index.htm
 W3Schools, Python tutorial
https://www.w3schools.com/python/
 GeeksforGeeks, Python programming language
https://www.geeksforgeeks.org/python-programming-
language/
ETF Beograd::Programiranje 1 35/35

You might also like