четвртак, 28. мај 2020.

CIKLUSI SA PREDUSLOVOM


ZADACI SA USLOVNIM CIKLUSIMA

Primer 1:
Napisati program koji učitani broj n transformiše tako što mu uklanja nule sa desne strane (npr. od 130000 pravi 13)


Uslov za izvršavanje ciklusa je da je broj deljiv sa 10 tj. da ima nulu sa desne strane.  U svakom ponavljanju ciklusa eliminišemo po jednu nulu celobrojnim deljenjem sa 10. Iz ciklusa se izlazi kada ostatak celobrojnog deljenja više nije nula.

Primer 2:
Napisati program za približno računanje sume:


Sabirati do člana čija je vrednost manja od zadate tačnosti (tj. određujemo u stvari na koliko decimala nam treba tačna suma).
Inače, ova suma je u stvari vrednost  eksponencijalne funkcije o kojoj puno slušamo za vreme ove epidemije virusa Korona.

  Ciklus se izvršava sve dok je tekući član sume veći od tačnosti   tj. dovoljno veliki da utiče na sumu



Primer 3: Za uneti broj n prebrojati koliko ima cifara




Uneti broj celobrojno delimo sa 10. Istovremeno sa svakim deljenjem brojač uvećavamo za 1. Ciklus se izvršava dok ne dobijemo nulu kao rezultat, što je znak da smo došli do poslednje cifre. Praktično, sa svakim okretanjem ciklusa, tj. sa svakim deljenjem, odbacujemo po jednu cifru i istovremeno brojač cifara uvećavamo za 1.

Primer 4: Za uneti broj n ispitati da li je palindrom


Unosimo prirodan broj. Palindrom je ako ima istu vrednost i ako se čita naopačke, npr 1221 je palindrom. Zadatak ćemo rešiti tako što ćemo formirati drugi broj, kome ćemo obrnuti cifre. Ako su uneti i novodobijeni broj jednaki, to znači da je broj palindrom. Na primer, od broja 1234 napravićemo 4321, a pošto su uneti i dobijeni broj različiti, ovaj broj nije palindrom.



Pošto nam uneti broj n treba na kraju za upoređivanje, sačuvaćemo njegovu vrednost i koristiti pomoćnu promenljivu m koju ćemo menjati u ciklusu.
S je novodobijeni broj sa obrnutim ciframa.
U ciklusu uzimamo  ostatak deljenja broja sa 10 ( to nam je uvek preostala poslednja cifra broja sa desne strane, tj cifra jedinica)
m=1234   m%10=4
Znači u prvom prolasku kroz ciklus novodobijeni broj je 4.
Sada m delimo sa 10 i dobijamo 123
U sledećem prolasku s=s*10+m%10 što znači da od 4 dobijamo 40 i na to dodajemo 3 pa nam je novodobijeni broj 43, a m dobija novu vrednost 12 posle m=123//10.
U sledećem prolasku s=s*10+m%10 što znači da od 43 dobijamo 430 i na to dodajemo 2 pa nam je novodobijeni broj 432, a m dobija novu vrednost 1 posle m=12//10.
U sledećem prolasku s=s*10+m%10 što znači da od 432 dobijamo 4320 i na to dodajemo 1 pa nam je novodobijeni broj 4321, a m dobija novu vrednost 0 posle m=1//10.
Sada je jasno zašto nam je uslov za izvršavanje ciklusa da je m>0. Kada je m=0 "potrošili" smo sve cifre i dobili novi broj čije su cifre obrnute od unetog.
Na izlazu, ako su uneti i novodobijeni broj jednaki, broj je palindrom, ako nisu, nije.

Napomena: Ovim smo završili predavanja za ovu školsku godinu. Posle predloga zaključnih ocena koji ću vam poslati do kraja nedelje, dogovorićemo se oko odgovaranja u školi ako bude potrebe.





SKUPOVI I REČNICI


REČNICI (DICTIONARY)

Rečnici su generalizovana verzija liste.
Listе nаm dајu mоgućnоst dа оrgаnizuјеmо pоdаtkе zа kоје је pоznаt nеki rеdоslеd i u kојimа svаki pоdаtаk imа svој rеdni brој (nа primеr, listu smо upоtrеbili dа оrgаnizuјеmо imеnа putnikа u аviоnu ili pоdаtkе о mеsеcimа u gоdini) i pristup еlеmеntimа listе vrši sе nа оsnоvu njihоvоg indеksа (rеdnоg brоја, tј. pоziciје). Меđutim, čеstо pоdаci prеdstаvlјајu nеkо prеslikаvаnjе u kојеm nа оsnоvu dаtоg klјučа žеlimо dа pristupimо vrеdnоsti kоја је pridružеnа tоm klјuču. Nа primеr, nа оsnоvu šifrе prоizvоdа pristupаmо njеgоvој cеni, nа оsnоvu ЈМBG grаđаnа pristupаmо njеgоvоm imеnu, nа оsnоvu brоја bаnkоvnоg rаčunа pristupаmо iznоsu nоvcа nа tоm rаčunu i sličnо. U tim situаciјаmа umеstо listе mnоgо је bоlје kоristiti rеčnikе (kаžе sе i mаpе ili аsоciјаtivnе nizоvе).

Lista koja sadrži broj dana u mesecima godine:
dana = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
Ako hoćemo broj dana u januaru, koristimo izraz dana[0]. Decembar ima dana[11] ili dana[-1].
Rečnik dana u mesecima godine:
dani = {'Januar':31, 'Februar':28, 'Mart':31, 'April':30, 'Maj':31, 'Jun':30, 'Jul':31, 'Avgust':31,'Septembar':30, 'Oktobar':31, 'Novembar':30, 'Decembar':31}

Da dobijemo broj dana u januaru pišemo dani[‘Januar’]. Prednost korišćenja rečnika u ovom slučaju je da je kod mnogo čitljiviji, i da ne treba da razmišljamo koji je indeks za traženi mesec. Rečnici, kao što ćemo videti, imaju veliki broj primena.
OSNOVNE OPERACIJE SA REČNICIMA

Kreiranje rečnika
d = {'A':100, 'B':200}

Da označimo da je nešto rečnik koristimo  vitičaste zagrade { }. Svaki element u rečniku je par podataka razdvojen sa dve tačke. Prvi deo u paru se naziva ključ (key) a drugi je vrednost (value). Ključ igra ulogu sličnu indeksu. Tako je u prvom paru našeg primera, ‘A’:100, ključ jednak ‘A’, a vrednost je jednaka 100, pa d[‘A’] daje 100. Ključevi su često stringovi, ali mogu biti i celi i decimalni brojevi, kao i mnogo drugih tipova. U istom rečniku mogu se naći ključevi različitog tipa.
Promena rečnika

Počnimo sa sledećim rečnikom:
d = {'A':100, 'B':200}
Da promenimo d[‘A’] na 400 (umesto 100) pišemo:
d['A']=400
Da dodamo novi element u rečnik, prosto dodelimo novom ključu neku vrednost kao u primeru:
d['C']=500
Setite se da ovo nije moguće sa listama. Ako napišemo L[2]=500 za listu L koja ima samo dva elementa (L[0] i L[1]) dobićemo „index out of range“ grešku. Za razliku, kod rečnika je to moguće.
Da izbrišemo element iz rečnika koristimo operator del
del d['A']

Prazan rečnik

Prazan rečnik je { }, čemu je analogno [ ] za praznu listu, ili ‘’ za prazan string.
Primeri rečnika
Primer 1:
Rečnik se može koristiti kao stvarni rečnik definisanja pojmova kao u sledećem primeru:
d = {'pas' : 'ima dugačak rep i laje!',
     'mačka' : 'kaže mjau',
     'miš' : 'love ga mačke'}
Evo i primera kako se taj rečnik može koristiti:
reč = input('Unesite reč: ')
print('Definicija reči:', d[reč])
  izlaz:

Unesite reč: miš
Definicija reči: love ga mačke

Primer 2:
Sledeći rečnik je koristan za rad sa Rimskim brojevima:
rimski = {‘I’:1, ‘V’:5, ‘X’:10, ‘L’:50, ‘C’:100, ‘D’:500, ‘M’:1000}

Primer 3:
U igri Scrabble, svakom slovu je pridružena vrednost. Možemo koristiti sledeći rečnik za vrednost slova u njemu:
points = {'A':1, 'B':3, 'C':3, 'D':2, 'E':1, 'F':4, 'G':2,
          'H':4, 'I':1, 'J':8, 'K':5, 'L':1, 'M':3, 'N':1,
          'O':1, 'P':3, 'Q':10, 'R':1, 'S':1, 'T':1, 'U':1,
          'V':4, 'W':4, 'X':8, 'Y':4, 'Z':10}
Da izračunamo skor za neku reč koristimo kod:
skor = sum([points[c] for c in word])
Ili  duža varijanta:
score = 0
for c in word:
    score += points[c]

Rad sa rečnicima

Operator in
Operator in se koristi da nam kaže da li je neki ključ u rečniku ili nije. Na primer, recimo da imamo sledeći rečnik:

d = {'A':100, 'B':200}
Ako pokušamo da dobijemo vrednost nekog ključa koji nije u rečniku dobićemo grešku. Na primer print(d[‘C’]) će javiti grešku. Da to sprečimo, možemo da iskoristimo operator in da proverimo da li je neki ključ u rečniku pre nego što upotrebimo taj ključ. Evo primera:
slovo = input('Unesite slovo: ')
if slovo in d:
    print('Vrednost je', d[slovo])
else:
    print('Nije u rečniku')

Možete takođe koristiti i not in da proverite da ključ nije u rečniku.
Petlje

Može se napraviti petlja kroz rečnik na sličan način kao i kod liste. Evo jedan primer koji štampa sve ključeve iz rečnika:
for kljuc in d:
    print(kljuc)
A evo i primera koji štampa vrednosti iz rečnika:
for kljuc in d:
    print(d[kljuc])

clear()    Briše sve vrednosti iz rečnika
copy()     Kopira rečnik
get()        Daje vrednost određenog ključa
items()    Daje listu torki svih ključ-vrednost parova iz rečnika
keys()     Daje listu svih ključeva
values()  Daje listu svih vrednosti iz rečnika
update() Ažurira rečnik novim parom




Skupovi (Sets)

Python ima i strukturu koja se zove set (skup). Set struktura radi slično matematičkim skupovima. Skupovi su slični listama, ali bez ponavljanja elemenata. Skupovi se označavaju vitičastim zagradama, {}, npr. S = {1,2,3,4,5}
Setimo se da se vitičaste zagrade koriste za rečnike, a da je {} prazan rečnik. Da dobijemo prazan skup koristimo funkciju set bez argumenata, kao što je prikazano:
S = set()
Funkcija set se može koristiti i za konverziju objekata u skupove. Evo dva primera:
set([1,4,4,4,5,1,2,1,3])
{1, 2, 3, 4, 5}

set('this is a test')
{'a', ' ', 'e', 'i', 'h', 's', 't'}

Uočite da Python smešta podatke u skup u proizvoljnom redosledu, i ne uvek u redosledu koji ste vi postavili. Kod skupova nije važan redosled, več samo podaci koji ga čine. To znači da indeksiranje kod skupova nema smisla. Zato se ne može , na primer, tražiti s[0], za set s.
Rad sa skupovima
Postoji nekoliko operacija koje se mogu obavljati sa skupovima.

Opis
Primer
I
Unija (union)
{1,2,3}|{3,4} -> {1,2,3,4}
&
Presek (intersection)
{1,2,3}&{3,4} -> {3}
-
Razlika (difference) (elementi skupa A
koji nisu u skupu B)
{1,2,3}-{3,4} -> {1,2}
^
Simetrična razlika (symmetric difference) (elementi koji su samo u A ili samo u B)
{1,2,3}^{3,4} -> {1,2,4}
in
Jeste u skupu
3 in {1,2,3} -> True



Na kraju, možemo slično kao i kod liste sastavljati skupove na skraćeni način:
s = {i**2 for i in range(12)}

{0, 1, 4, 100, 81, 64, 9, 16, 49, 121, 25, 36}

Primer metoda koje su nam omogućene u Pajtonu za rečnike:
add()        Dodaje element skupu
clear()      Uklanja sve elemente skupa
copy()      Daje kopiju skupa
discard() Uklanja odredjenu vrednost iz skupa
issubset() Daje vrednost boolean koji je rezultat operacije da li je jedan skup              podskup drugog skupa
issuperset() Daje vrednost boolean koji je rezultat operacije da li je jedan skup nadskup drugog skupa
remove()
Uklanja odredjeni element iz skupa

Napomena: Ovim smo završili predavanja za ovu školsku godinu. Posle predloga zaključnih ocena koji ću vam poslati do kraja nedelje, dogovorićemo se oko odgovaranja u školi ako bude potrebe.