Rješenja zadataka napišite u Python modulima. Iz IDLE shell

Uputstvo:
• Rješenja zadataka napišite u Python modulima. Iz IDLE shell-a, novi modul možete napraviti
tako što ćete iz menija File izabrati opciju ``New window''. Kad završite program, snimite ga sa
ekstenzijom .py (npr. min.py, max.py itd) i pokrenite izborom opcije ``Run module'' iz menija
``Run'' (meni se nalazi u prozoru u kojem pišete modul, ne u shell-u.
• Za većinu ovih programa najteži dio rješavanja je nalaženje ispravnog postupka za rješenje (tj.
algoritma). Vaš uspjeh ili neuspjeh na ispitu zavisiće uglavnom od vaše sposobnosti da smislite
ispravan algoritam.
Primjeri koji su zadani u zadacima služe samo da se ukratko ilustruje namjena programa ili
funkcije, pa su i veoma kratki. Za funkcije koje su generalne namjene (kao što su npr. funkcije iz
prvog zadatka) često vam za nalaženje ispravnog algoritma može biti od pomoći da razmislite
kako biste riješili jako veliki primjer. Npr. zamislite da morate naći najveći element iz liste od
5000 elemenata. Jako veliki primjeri vas često mogu natjerati da napišete precizan opis rješenja,
koji se onda lako može prevesti u Python (ili bilo koji drugi programski jezik).
• Zadaci nisu organizovani ni po težini ni po oblastima. Zli jezici bi mogli reći da su totalni dezorganizovani.
1. Napišite svoje varijante ugrađenih Python funkcija:
• moj min
• moj max
• moj sum
Funkcije treba da se ponašaju identično kao i odgovarajuće ugrađene funkcije (dakle moj min
kao min itd). Primjer izvršavanja:
>>> moj min ( [ 1 , 2 , 3 , 4 , 5 ] )
1
>>> moj max ( [ 1 , 2 , 3 , 4 , 5 ] )
5
>>> moj sum ( [ 1 , 2 , 3 , 4 , 5 ] )
15
>>>
2. Kao što znate, svaka kvadratna jednačina se može predstaviti u obliku:
ax2 + bx + c = 0
Tj. za opis jednačine dovoljno je poznavati njena tri koeficijenta a, b, i c. Osim toga, svaka ova
jednačina ima dva rješenja (tzv. korijeni jednačine). Napraviti funkciju korijeni, koja, za zadane
koeficijente, vraća par rješenja zadane jednačine.
Uputstvo: jednačina nema uvijek realna rješenja. Funkcija sqrt ne može da nađe kvadratni korijen negativnog broja, pa ćete morati da smislite nešto sa kompleksnim brojevima.
3. Napisati funkciju satro koja zadanu rečenice vraća ispisanu u šatrovačkom žargonu. Rečenicu
možete ``šatrovati'' tako što svaku riječ iz rečenice obrnete na pola (drugu polovinu stavite na
početak, a prvu polovinu na kraj).
U tu svrhu, prvo napravite funkciju satro rijec koja ``šatruje'' jednu riječ. Podsjetimo se, rečenicu
možete razbiti na listu riječi koristeći metodu .split() stringa:
>>> "Radis nesto tesko".split()
['Radis', 'nesto', 'tesko']
1
S druge strane, da spojite listu riječi tako što ćete između riječi ubaciti neki string, možete iskoristiti metodu .join() stringa:
>>> '-'.join(['Lista', 'nekih', 'stringova'])
'Lista-nekih-stringova'
>>> ' '.join(['Lista', 'nekih', 'stringova'])
'Lista nekih stringova'
Metode join i split će vam biti potrebne u funkciji satro). Kada napišete pomenute funkcije,
napišite i ostatak programa. Od korisnika tražite da unese neku rečenicu (zbog jednostavnosti
pretpostavite da se ona sastoji samo od riječi i razmaka, dakle bez interpunkcijskih znakova), a
zatim je ispišite ``šatrovanu''.
Unesi recenicu: Radis nesto komplikovano
Disra stone kovanokompli
4. Napisati program koji korisniku prvo prikazuje meni u menzi, zatim od njega traži da unese
broj željene narudžbe, a zatim štampa odgovarajuću akciju ili štampa poruku o grešci ukoliko
korisnikov izbor nije ispravan.
Primjer izvršavanja:
1. Supa i salata
2. Spageti bolonjez
3. Kuvarov specijalitet
Koji broj zelite da narucite? 2
Vasa narudzba "Spageti bolonjez" stize!
Još jedan primjer:
1. Supa i salata
2. Spageti bolonjez
3. Kuvarov specijalitet
Koji broj zelite da narucite? 5
Zao mi je, neispravna narudzba!
Napomena: meni se prikazuje samo jednom, dakle nema potrebe da koristite petlje.
5. Jedna bitna operacija u kompjuterskim naukama je tzv. operacija heširanja. Operacija heširanja
kao argument uzme neki tekst, a zatim ga nekako konvertuje u broj. Ova operacija ima veoma
veliku primjenu u više oblasti, od kojih je jedna kriptografija.
Druga stvar koju ćemu da iskoristimo je modulo operator (%). Već znate šta ovaj operator radi računa ostatak pri dijeljenju. Ovaj operator je koristan jer je za razliku od većine drugih matematičkih operatora ``jednosmjeran''. Pod tim podrazumijevamo da mogu da vam kažem da sam
zamislio broj x, i da x % 5 daje rezultat 3, ali da vam ova informacija nije dovoljna da saznate x
(x bi moglo biti 3, ili 8, ili 13, ili...).
U ovom zadatku, pokušaćete da napravite ekran za prijavljivanje na sistem. Korisnik će morati
da unese ispravnu lozinku da bi mogao da vidi tajnu poruku. Daćemo korisniku tri šanse da
unese ispravnu lozinku, a zatim odštampati ili tajnu poruku ili poruku o neuspjehu (nakon 3
promašena pokušaja od strane korisnika).
Prvo, definišite funkcije kriptuj koja uzima jedan parametar tipa string. Funkcija treba da hešira
string koristeći ugrađenu Python funkciju hash (u interpreteru možete da isprobate kako ova
2
funkcija radi) i zatim naći ostatak dobijene vrijednosti pri dijeljenju sa nekim prostim brojem
(npr. brojem 541 - ovaj broj je veoma mali za ozbiljnu kriptografiju, ali je za naš primjer dovoljno
dobar). Funkcija zatim treba da vrati izračunati broj.
Npr. kriptuj("mojasif ra") treba da vrati rezultat 40 (ako koristite 541 kao prost broj).
Na početku datoteke, definišite promjenjivu KLJU C koja ce biti rezultat izvršavanja funkcije
kriptuj sa željenom lozinkom (npr. ukoliko stavite lozinku ``mojasifra'', stavite KLJU C = 40).
Sad napišite ostatak programa. Svaki put kada pitate korisnika za lozinku. Ukoliko se vrijednosti poklapaju, korisnik je (najvjerovatnije) unio ispravnu lozinku.
6. Mnoge kompjuterske igre u pozadini imaju kompleksne programe za simuliranje fizike (tzv.
fizičke ``engine''). Jedna od osnovnih funkcija ovih programa je da provjere da li se neka dva
objekta sudaraju ili ne. Objekti čudnih oblika se često aproksimiraju pomoću lopti. U ovom
programu, pokušaćemo da ustanovimo da li se dvije lopte sudaraju ili ne.
Da bismo malo pojednostavili stvari, radićemo u dvije dimenzije (mada je postupak za 3D veoma
sličan). Da bismo odredili da li se dvije lopte sudaraju, jedine informacije koje su nam bitne su
pozicija lopte u prostoru i njezina veličina. Poziciju možemo zapamtiti tako što ćemo zapamtiti
x i y koordinate centra lopte, a veličinu tako što ćemo zapamtiti poluprečnik lopte. Dakle lopta
je uređena trojka (x, y, r).
Da bismo ustanovili da li se dvije lopte sudaraju, moramo da sračunamo udaljenost između
njihovih centara, a zatim da provjerimo da li je ona manja od sume njihovih poluprečnika. Ako
jeste, onda se sudaraju.
Napisati funkciju koja uzima dvije kugle i računa da li se sudaraju ili ne. Zatim pozovite funkciju
sa dva različita para lopti. Prvi par treba da budu lopte (0, 0, 1) i (3, 3, 1); rezultat bi trebalo da
bude da se ne sudaraju. Drugi par su lopte (5, 5, 2) i (2, 8, 3); one se sudaraju.
7. Ovaj zadatak je dio specijalnog novogodišnjeg izdanja predmeta ``Uvod u računarstvo 1''. Cilj je
da napišete funkciju bor, koja pomoću zvjezdica crta stablo bora. Funkcija treba da uzme jedan
argument, koji predstavlja broj ``segmenata'' koje stablo treba da ima.
Kako kaže stara kineska poslovica, slika vrijedi 1000 riječi.
>>> bor(1)
*
***
*****
>>> bor(2)
*
***
*****
***
*****
*******
>>> bor(3)
*
***
*****
***
*****
*******
*****
*******
*********
>>> bor(4)
3
*
***
*****
***
*****
*******
*****
*******
*********
*******
*********
***********
Ako biste ovaj zadatak čitali u zbirci, vjerovatno bi bio označen - zvjezdicom...
4