Brojevi

Ovo poglavlje se fokusira na rad sa brojevima i prostu matematiku u Python-u.

Celi i decimalni brojevi

Zbog načina na koji se izrađuju računarski čipovi, celi i decimalni brojevi se u računarima prikazuju na različit način. Decimalni brojevi se prikazuju u takozvanoj formi plivajućeg zareza ( floating point ). Važna stvar koju treba imati na umu kod decimalnih brojeva je da oni tipično imaju preciznost od oko 15 cifara. Bilo bi lepo da nema ograničenja u preciznosti, ali se proračuni vrše mnogo brže ako zalomite broj na nekoj decimali.

S druge strane, celi brojevi u Pythonu nemaju ograničenja i mogu biti proizvoljne dužine.

Kod decimalnih brojeva poslednja cifra je malo sumnjiva zbog činjenice da računari koriste binarni ( sa bazom 2 ) a ljudi decimalni ( sa bazom 10 ) brojni sistem. Na primer, matematički mi znamo da je razlomak 7/3 jednak 2.333…, gde tri tačke označavaju beskonačno ponavljanje poslednje cifre. Ali kada u Python šel-u unesemo 7/3 dobićemo 2.3333333333333335. To se zove greškom zaokruživanja (roundoff error). U većini praktičnih situacija ova greška se može zanemariti, ali kod nekih specifičnih matematičkih i naučnih proračuna može da prouzrokuje probleme.

Matematički operatori

Sledi lista poznatih matematičkih operatora u Python-u:

Operator Opis
+ sabiranje
- oduzimanje
* množenje
/ deljenje
** stepenovanje
// celobrojno deljenje
% modulo (ostatak)

Celobrojno deljenje

Operator za celobrojno deljenje, //, zahteva malo objašnjenje. U osnovi za cele brojeve ovaj operator se ponaša kao obično deljenje, s tom razlikom što odbacuje decimalni deo pri deljenju. Tako će 8/5 biti 1.6, a 8//5 jednako je 1. Videćemo kasnije zašto je ovakva operacija korisna. Napominjemo da u mnogim programskim jezicima, pa i u starijim verzjama Python-a, običan operator deljenja, / , u stvari vrši celobrojno deljenje.

Modulo (Moduo)

Modulo operator, %, daje ostatak pri deljenju. Na primer, rezultat operacije 18%7 je 4, jer kada podelimo 18 sa 7 dobijemo 2 i ostatak 4. Ova operacija je iznenađujuće korisna. Na primer, neki broj je deljiv sa brojem n kada je ostatak deljenja tog broja sa n jednak 0. Tako na primer, da bismo proverili da li je neki broj n, paran, dovoljno je da proverimo je li n%2 jednako 0. Da proverimo je li n deljivo sa 3, proverimo da li je n%3 jednako 0, itd.

Jedna moguća upotreba modulo operacije je kada hoćete da se neka operacija u petlji obavi u svakom drugom prolazu kroz petlju. To postižete ispitivanjem da li varijabla petlje modulo 2 iznosi 0 ako iznosi željenu operaciju treba izvršiti.

Modulo operator se veoma često javlja u formulama. Ako želite da napravite zaokret i vratite se na početak, modulo će biti od koristi. Na primer, uzmimo časovnik. Ako dodate šest sati na 8 sati izjutra rezultat je 2 sata popodne. Matematički to možete da postignete korišćenjem modulo operatora, to jest (8+6)%12 jednako je 2.

Kao još jedna primer, posmatrajmo neku igru sa 5 igrača označenih brojevima od 1 do 5. Recimo da imate varijablu player koja ukazuje na tekućeg igrača. Nakon što igrač 5 završi, igrač 1 bi trebao da nastavi igru. U tu svrhu se može iskoristiti modulo operator na sledeći način:

player = player%5+1

Kada je player jednako 5, player%5 će biti 0 pa će ceo izraz postaviti varijablu player na vrednost 1.

Redosled matematičkih operacija

Prvo se radi stepenovanje, zatim množenje i deljenje (uključujući // i %), pa tek na kraju sabiranje i oduzimanje.

Recimo da imate tri varijable x, y, i z, i da hoćete da izračunate njihovu srednju vrednost. Izraz x+y+z/3 neće dati ispravan rezultat, jer deljenje ima prednost nad sabiranjem. Ispravan rezultat ćete dobiti korišćenjm zagrada: (x+y+z)/3.

Generalno govoreći, kad god niste sigurni u redosled izvršavanja operacija, dodavanje zagrada može da reši problem.

Slučajni brojevi

Da bi napravili neku interesantnu kompjutersku igru, dobro je da se u nju unese neki stepen slučajnosti. U Python-u postoji poseban modul, pod nazivom random, koji nam omogućava da u programima koristimo slučajne brojeve.

Pre nego što nastavimo priču o slučajnim brojevima potrebno je da razjasnimo šta je to modul. Osnovni delovi Python jezika sastoje se od stvari kao što su for petlje, if naredbe, matematički operatori, neke funkcije kao što su print i input. Sve ostalo se nalazi u modulima, te ako želimo da koristimo nešto što se nalazi u modulu, potrebno je da to import-ujemo, odnosno da kažemo Python-u da to želimo da koristimo.

U ovom trenutku mi želimo da koristimo samo funkciju randint iz modula random. Da preuzmemo tu funkciju iz modula pišemo sledeću naredbu:

from random import randint

Korišćenje funkcije randint je jednostavno: randint(a,b) će nam dati jedan slučajan ceo broj između a i b uključujući vrednosti za a i b ( za razliku od range funkcije koja nije uključivala krajnju vrednost za b ). Evo jednog kratkog primera:

from random import randint
x = randint(1,10)
print('Slučajan broj između 1 i 10: ', x)

Izlaz:

Slučajan broj između 1 i 10: 7

Slučajan broj biće različit svaki put kada izvršimo ovaj program.

Matematičke funkcije

Modul math

Python ima modul math koji sadrži osnovne matematičke funkcije kao što su sin, cos, tan, exp, log, log10, factorial, sqrt, floor, i ceil. Pored njih postoje i inverzne trigonometrijske funkcije, hiperboličke funkcije kao i konstante pi i e. Evo kratkog primera:

from math import sin, pi
print('Pi je približno', pi)
print('sin(0) =', sin(0))

Izlaz:

Pi je približno 3.14159265359
sin(0) = 0.0

Ugrađene (built-in) matematičke funkcije

Dve matematičke funkcije, abs (apsolutna vrednost) i round (zaokruživanje) su na raspolaganju bez importovanja math modula. Evo nekoliko primera korišćenja ovih funkcija:

print(abs(-4.3))
print(round(3.336, 2))
print(round(345.2, -1))

Izlaz:
4.3
3.37
350.0

Funkcija round ima dva argumenta: prvi je broj koji treba zaokružiti, a drugi označava broj decimalnih mesta u rezultatu zaokruživanja. Uočite da drugi argument može biti i negativan.

Pomoć (help) u Python-u

Python poseduje ugrađenu (built-in) dokumentaciju koja je dostupna putem komande dir.Da dobijemo help za math modul, na primer, potrebno je da u Python šelu unesemo sledeće dve linije:

>>> import math
>>> dir(math)
['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin',
'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos',
'cosh', 'degrees', 'e', 'exp', 'fabs', 'factorial', 'floor',
'fmod', 'frexp', 'fsum', 'hypot', 'isinf', 'isnan', 'ldexp',
'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin',
'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

Tako smo dobili listu svih funkcija koje math modul sadrži. Možete da zanemarite sve one koje počinju sa donjom crtom. Da dobijete pomoć za neku specifičnu funkciju, naprimer za funkciju floor dovoljno je da ukucate help(math.floor). Ako ukucate help(math) dobićete pomoć za sve što se nalazi u math modulu.

Korišćenje šela (Shell) kao kalkulatora

Python shell može se koristiti kao veoma pogodan i moćan kalkulatora. Evo primera

>>> 23**2
529
>>> s = 0
>>> for n in range(1,10001):
    s = s + 1/n**2

>>> s
1.6448340718480652
>>> from math import *
>>> factorial(10)
3628800

Drugi primer sabira niz brojeva 1+1/4+1/9+…+1/100002. Rezultat se smešta u varijabli s. Da bi na kraju for petlje videli vrednost varijable potrebno je samo da ukucamo njeno ime i pritisnemo enter. Provera vrednosti varijable je korisna kada debagiramo programe. Ako program ne radi kako treba možete na kraju programa ukucati imena varijabli i proveriti kolike su njihove vrednosti.

Naredba from math import * importuje sve funkcije iz math modula, što šel čini moćnim naučnim kalkulatorom.

Napomena

U Shell meniju, izaberite Restart shell ako želite da poništite vrednosti svih varijabli.

Vežbe

3.1 Napišite program kojim se generiše i štampa 50 slučajnih brojeva, svaki između 3 i 6.

3.2 Napišite program kojim se generiše slučajan broj x, između 1 i 50, i slučajan broj y između 2 i 5, pa izračunava xy.

3.3 Napišite program koji generiše slučajan broj između 1 i 10 i štampa vaše ime toliko puta.

3.4 Napišite program koji generiše slučajan decimalni broj između 1 i 10 sa dva decimalna mesta. Primer su brojevi 1.23, 3.45, 9.80, i 5.00.

3.5 Napišite program koji generiše 50 slučajnih brojeva takvih da je prvi broj između 1 i 2, drugi između 1 i 3, treći između 1 i 4,…, poslednji između 1 i 51.

3.6 Napišite program koji traži od korisnika da unese dva broja, x i y pa izračunava izraz |x-y|/(x+y).

3.7 Napišite program koji traži od korisnika da unese ugao između -180° i 180°. Koristeći izraz sa modulo operatorom konvertujte ugao u njegov ekvivalent u granicama između 0° and 360°.

3.8 Napišite program koji traži od korisnika da unese broj sekundi a onda štampa koliko je to minuta i sekundi. Na primer 200 sekundi je 3 minuta i 20 seconds. [Pomoć: Koristite // operator da dobijete minute,a % operator da dobijete sekunde.]

3.9 Napišite program koji traži od korisnika da unese vreme u satima između 1 i 12 kao i za koliko sati se treba pomeriti u budućnost. Štampajte koliko će sati pokazivati časovnik u toj budućnosti. Dole je prikazan jedan primer.

Unesite sat: 8
Koliko sati unapred? 5
Novo vreme: 1 sat

3.10 Jedan način za pronalaženje zadnje cifre nekog broja je da se odredi ostatak pri deljenju tog broja sa 10 ( korišćenjem % operatotra ).Napišite program koji traži od korisnika da unese eksponent (stepen), a onda pronalazi poslednju cifru broja koji se dobija kada se 2 podigne na taj stepen.

3.11 Jedan način da se pronađu dve poslednje cifre nekog broja je da se odredi ostatak prideljenju tog broja sa 100. Napišite program koji traži od korisnika da unese eksponent (stepen), a onda pronalazi poslednje dve cifre broja koji se dobija kada se 2 podigne na taj stepen.

3.12 Napišite program koji traži od korsinika da unese stepen kao i koliko poslednjih cifara žele. Pronađite te cifre u broju koji se dobija kada se 2 podigne na uneti stepen.

3.13 Napišite program koji traži od korisnika da unese težinu u kilogramima. Program treba da konvertuje težinu u funte i da štampa rezultat zaokružen na jednu desetinu funte.

3.14 Napišite program koji traži od korisnika da unese neki broj i da štampa faktorijel tog broja.

3.15 Napišite program koji traži od korisnika da unese neki broja i da štampa sinus, cosinus, i tangens tog broja.

3.16 Napišite program koji traži od korisnika da unese ugao u stepenima i da štampa sinus tog ugla.

3.17 Napišite program kojim se štampa sinus i cosinus uglova od 0 do 345° sa korakom od 15°. Svaki rezultat treba da bude zaokružen na 4 decimale. Primer kako treba da izgleda izlaz iz programa

0  0.0 1.0
15  0.2588 0.9659
30  0.5 0.866
itd.
345 -0.2588 0.9659

3.18 Godina je prestupna ako je deljiva sa 4, izuzev godina koje su deljive sa 100 a nisu deljive i sa 400. Tražite od korisnika da unese godinu i korišćenjem operatora // odredite koliko je prestupnih godina bilo između 1600-te i te godine.

3.19 Napišite program kojim se crta “modularni pravougaonik” kao oni prikazani dole. Korisnik treba da unese širinu i visinu pravougaonika, a brojevi unutar pravougaonika počinju od 0 povećavaju se sleva na desno, ali po modulu 10. Donji primeri pokazuju pravouganike dimenzija 3 × 5 i 4 × 8.

0 1 2 3 4
5 6 7 8 9
0 1 2 3 4

0 1 2 3 4 5 6 7
8 9 0 1 2 3 4 5
6 7 8 9 0 1 2 3
4 5 6 7 8 9 0 1