You are on page 1of 11

relacijski operatori

5.

and, or, not

slijedni programi

moduli
Struktura programa
u
Pythonu
logiki
operatori import

petlje

5.1. Jednostavni programi


U prethodna dva poglavlja upoznali smo dovoljno elemenata programskog jezika Python i naina uporabe njegova suelja tako da moemo sustavno pristupiti pisanju jednostavnih programa. U jednostavnim programima naredbe se izvode jedna iza druge onim redoslijedom kako
su napisane. Takve programe moemo nazvati slijednim ili sekvencijskim programima. U njima
naredbe slijede jedna drugu.
Kako se u ovom poglavlju elimo usredotoiti na izuavanje svojstva samog jezika, a ne na
nain kako iznalaziti postupke za rjeavanje razliitih problema, postupno emo razvijati samo
jedan program i to program za uvjebavanje aritmetikih operacija moglo bi se rei za igranje s brojevima. eljeli bismo provjeravati kako netko napamet izraunava zbrojeve i umnoke
brojeva. Teina zadatka ovisit e o veliini zadanih brojeva.

5.1.1. Zamiljena igra s brojevima


Zamislimo da bi igra trebala rezultirati ovakvim dijalogom u prozoru interaktivnog suelja:
U ovoj igri trebate odgovoriti na 5 pitanja!
Koliki je zbroj brojeva 17 i
Utipkati odgovor: 42
Odgovor je toan!
Koliki je umnoak brojeva 11
Utipkati odgovor: 132
Odgovor je toan!
Koliki je zbroj brojeva 27 i
Utipkati odgovor: 73
Odgovor je netoan!
Koliki je umnoak brojeva 15
Utipkati odgovor: 255
Odgovor je toan!

25?

i 12?

56?

i 17?

61

Struktura programa u Pythonu

Koliki je zbroj brojeva 28 i 68?


Utipkati odgovor: 86
Odgovor je netoan!
U ovoj igri ste tono odgovorili na 3 od ukupno 5 pitanja.
elite li nastaviti igru (odgovoriti s da ili ne): ne
Igra zavrava - lijep pozdrav!
Razmislimo jesmo li dosadanjim saznanjima o Pythonu u stanju napisati program s kojim bi se
mogao voditi ovakav dijalog?
Odmah vidimo da to nee biti mogue. Za sada ne znamo kako ustanoviti je li odgovor toan
jer ne znamo nain za usporeivanje tonog rezultata s otipkanim odgovorom. Prema tome ne
moemo ni znati koliko je tonih, a koliko netonih odgovora.
Jedino to moemo uiniti jest ispis tonog odgovora (bez obzira na to je li utipkan toan ili
netoan odgovor). Igra sam mora izbrojiti tone i pogrene odgovore.
Isto tako, odgovor na pitanje eli li igra nastaviti igru ili ne, ne znamo vrednovati.
Dakle, program koji smo u stanju nainiti mogao bi izgledati ovako:
# Prva inaica igre s brojevima; primjer_05_A
print('U ovoj igri trebate odgovoriti na 5 pitanja!')
print()

# prazni redak

x = 17
y = 25
print('Koliki je zbroj brojeva {0} i {1}?'.format(x, y))
input('Utipkati odgovor: ')
z = x + y
print('Odgovor je:', z)
x = 11
y = 12
print('Koliki je umnoak brojeva {0} i {1}?'.format(x, y))
input('Utipkati odgovor: ')
z = x * y
print('Odgovor je:', z)
x = 27
y = 56
print('Koliki je zbroj brojeva {0} i {1}?'.format(x, y))
input('Utipkati odgovor: ')
z = x + y
print('Odgovor je:', z)

62

x = 15
y = 17
print('Koliki je umnoak brojeva {0} i {1}?'.format(x, y))
input('Utipkati odgovor: ')
z = x * y
print('Odgovor je:', z)
x = 28
y = 68
print('Koliki je zbroj brojeva {0} i {1}?'.format(x, y))
input('Utipkati odgovor: ')
z = x + y
print('Odgovor je:', z)
print()

# prazni redak

print('Odgovorili ste na 5 pitanja.')


U interaktivnom e se prozoru odvijati dijalog slian ovome:
>>> ============================ RESTART ============================
>>>
U ovoj igri trebate odgovoriti na 5 pitanja!
Koliki je zbroj brojeva 17 i
Utipkati odgovor: 22
Odgovor je: 42
Koliki je umnoak brojeva 11
Utipkati odgovor: 132
Odgovor je: 132
Koliki je zbroj brojeva 27 i
Utipkati odgovor: 83
Odgovor je: 83
Koliki je umnoak brojeva 15
Utipkati odgovor: 255
Odgovor je: 255
Koliki je zbroj brojeva 28 i
Utipkati odgovor: 93
Odgovor je: 96

25?

i 12?

56?

i 17?

68?

Odgovorili ste na 5 pitanja.


Igra zavrava lijep pozdrav!
>>>
Ovakav emo tekst vidjeti u prozoru suelja ako je igra na upite programa utipkavao redom
brojeve: 22, 132, 83, 255 i 93.

63

5.1.

Jednostavni programi

Struktura programa u Pythonu

S ovakvim programom ne moemo biti nikako zadovoljni. On ima niz nedostataka.


Ve smo ustanovili da nemamo mogunost usporeivanja tonog rezultata (koji program
izraunava) s utipkanim rezultatom.
Vidimo da iste naredbe moramo prepisivati pet puta (za vei broj pitanja to bi bilo mukotrpno).
Nemamo mogunost upita igraa eli li i dalje igrati.
Igru moemo ponoviti samo ponovnim pokretanjem programa, ali e nam se pritom ponavljati uvijek isti brojevi ime igra gubi svoj smisao.
Oigledno je da nam trebaju neke jezine konstrukcije ako elimo unaprijediti ovaj program
kako bi se on ponaao slino zamiljenom.

5.2. Donoenje odluka i grananja u programima


5.2.1. Relacijski operatori
Ustanovili smo da u prethodno opisanoj igri ne moemo otkriti je li utipkani odgovor toan ili
netoan. Nedostajala nam je mogunost usporeivanja utipkanih brojeva s tonim rezultatima
koji se unutar programa tono izraunavaju.
Upravo u tu svrhu u Pythonu (a tako je i u drugim programskim jezicima) postoje operatori
usporeivanja, tzv. relacijski operatori. Relacijski operatori usporeuju dva operanda. Rezultat
usporedbe ima vrijednosti True ili False. Prema tome, izraz usporedbe koji se sastoji od dva
operanda i relacijskog operatora je logiki sud koji moe biti istinit ili laan. Podsjetimo se to
smo nauili o logikom ili Booleovu tipu u odjeljku 3.2.3. Umjesto naziva logiki sud mi emo se
ee koristiti nazivom uvjet. Ako je logiki sud istinit, rei emo da je uvjet ispunjen, a ako je
logiki sud laan, rei emo da uvjet nije ispunjen.
Svi relacijski operatori koji postoje u Pythonu prikazani su tablicom 5.1. Operatori >=, <=,
==, != piu se kao dva uzastopna znaka. Posebno treba obratiti panju na operator jednako
==. Isputenjem jednog znaka = on se odmah pretvara u znak pridruivanja to moe potpuno
promijeniti smisao programa.

Operator

Znaenje simbola

>

vee od

<

manje od

>=

vee od ili jednako

<=

manje od ili jednako

==

jednako

!=

nije jednako

Tablica 5.1. Relacijski operatori

64

Pogledajmo u interaktivnom suelju kako operatori djeluju:


>>> 17
False
>>> 17
True
>>> 17
False
>>> 17
True
>>>

> 35
< 20
== 18
!= 18

Jasno je da nema smisla usporeivati parove brojeva koje unaprijed znamo. Zbog toga se u
relacijskom izrazu obino pojavlju varijable ije se vrijednosti tijekom izvoenja programa mijenjaju.
Logiki sudovi (ili uvjeti) mogu biti sloeni. Primjerice, ako elimo znati je li neki broj x vei od
ili jednak nekoj donjoj granici x_d i istovremeno manji od ili jednak nekoj gornjoj granici x_g,
primjerice za zadane vrijednosti: x_d = 0, x_g = 1000, x = 700 ili za x = 1100. U tom sluaju
moramo ispitati dva uvjeta:
>>> x_d = 0
>>> x_g = 1000
>>> x = 700
>>> x >= x_d
True
>>> x <= x_g
True
>>> x = 1100
>>> x >= x_d
True
>>> x <= x_g
False
>>>
Vidljivo je da je broj 700 u zadanim granicama, a broj 1100 nije. Dva uvjeta koja smo ispitivali
mogli bismo ispitati jednim ispitivanjem ako od dva logika suda stvorimo sloeni logiki sud.
To je mogue uiniti posluimo li se pravilima algebre logikih sudova (logikom algebrom ili
Booleovom algebrom).

5.2.2. Logiki operatori i logiki izrazi


Za stvaranje bilo kojeg sloenog suda dovoljna su nam tri operatora. Oni su prikazani u tablici
5.2. Operator and obavlja operaciju I, odnosno konjunkciju, operator or obavlja operaciju ILI,
odnosno disjunkciju, dok operator not obavlja operaciju NE ili negaciju, odnosno komplementiranje. U treem su stupcu navedeni uobiajeni simboli logike algebre.

65

5.2.

Donoenje odluka i grananja u programima

Struktura programa u Pythonu

Operator

Naziv operacije

Algebarski simbol

and

I operacija, konjunkcija

or

ILI operacija, disjunkcija

not

NE operacija, komplementiranje

Tablica 5.2. Logiki operatori


U interaktivnom suelju ispitajmo kako ti operatori djeluju:
>>> False and False
False
>>> False and True
False
>>> True and False
False
>>> True and True
True
>>>
Prema tome, I operacija daje rezultat True samo onda kada oba operanda imaju vrijednost
True.
U odjeljku 3.2.3 spomenuli smo da se umjesto vrijednosti False i True mogu upotrebljavati i
vrijednosti 0 i 1. Utvrdimo je li to uistinu tako:
>>>
0
>>>
0
>>>
0
>>>
1
>>>

0 and 0
0 and 1
1 and 0
1 and 1

Jednako tako, moemo ispitati i djelovanje operatora or:


>>> False or False
False
>>> False or True
True
>>> True or False
True
>>> True or True
True

66

>>>
0
>>>
1
>>>
1
>>>
1
>>>

0 or 0
0 or 1
1 or 0
1 or 1

Dakle, rezultat ILI operacije jednak je True (odnosno 1) ako samo jedan od operanada ima vrijednost True (odnosno 1). Drugim rijeima, rezultat ILI operacije bit e jednak False (odnosno
0) samo onda ako oba operanda imaju vrijednost False (odnosno 0).
Opisivanje operacija rijeima pomoi e nam pri razmiljanju kada budemo pokuavali rjeavati
neki problem.
Operator negacije not djeluje na jedan operand i invertira (True postaje False, False postaje
True) njegovu vrijednost. Zbog toga operaciju negacije (komplementiranja) nazivamo jo i
inverzijom:
>>> not
False
>>> not
True
>>> not
True
>>> not
False
>>>

True
False
0
1

Zanimljivo je da se not 0 ispisuje kao vrijednost True, a ne vrijednost 1 te da se not 1 ispisuje


kao vrijednost False, a ne vrijednost 0, kako bismo to oekivali prema ispisima rezultata operacija and i or. To je jedna od rijetkih nedosljednosti u jeziku Python.
Uporabom logikih operacija mogu se jednostavni sudovi kombinirati u sloene sudove. U tom
sluaju treba voditi rauna o redoslijedu izvoenja logikih operacija. Slino kao i kod aritmetikih, i logike operacije imaju prioritet izvoenja. Prioritet izvoenja dan je sljedeom tablicom:

Redoslijed

Operacija

1.

not

2.

and

3.

or

Tablica 5.3. Redoslijed izvoenja logikih operacija

67

5.2.

Donoenje odluka i grananja u programima

Struktura programa u Pythonu

Ilustrirajmo to na nekoliko primjera:


>>> True or False and True
True
>>> False or True and False
False
>>> False or not False
True
Kod sloenih izraza istovremeno moemo imati vie vrsta operacija: i aritmetike i relacijske i
logike. Redoslijed izvoenja operacija dan je sljedeom tablicom:

Redoslijed

Operacija

1.

aritmetiki

2.

relacijski

3.

logiki

Tablica 5.4. Redoslijed izvoenja operacija


>>> 2 + 3 < 4
False
>>> 2 * 3 - 1 > 3 * 3 - 5
True
>>> 3 + 4 > 5 and 3 + 5 > 4 and 4 + 5 > 3
True
>>>
Sada se ispitivanje je li broj x vei od ili jednak donjoj granici x_d i istovremeno manji od ili
jednak gornjoj granici x_g moe provesti ovim sloenim uvjetom:
(x_d <= x) and (x <= x_g).
Taj e uvjet biti istinit ako se vrijednost varijable x nalazi u zadanim granicama. Primijetimo da
izraz moemo napisati i bez zagrada:
x_d <= x and x <= x_g
Meutim, isti smo uvjet mogli napisati i na sljedei nain:
x_d <= x <= x_g
Ispitat emo to u interaktivnom suelju:
>>> x_d = 0
>>> x_g = 1000
>>> x = 700
>>> (x >= x_d) and (x <= x_g)
True
>>> x_d <= x <= x_g
True

68

>>> x = 1100
>>> x_d <= x <= x_g
False
>>> x = -1
>>> (x >= x_d) and (x <= x_g)
False
>>>
Vidjet emo ubrzo da e nam pri rjeavanju problema od znatne koristi biti vjeta i pouzdana
uporaba logikih sudova i vrednovanje logikih izraza. Donoenje razliitih odluka u programima iskljuivo ovisi o logikim izrazima. Poeljno je da oni budu to je mogue jednostavniji i
razumljiviji. U tome nam moe pomoi poznavanje logike algebre. Ovdje se neemo njome
podrobnije baviti i spomenut emo samo neke injenice.
Zanimljivo je razmotriti kako se zamjenom relacijskih operatora pri oblikovanju nekog uvjeta
mijenja oblik logikog izraza koji opisuje taj uvjet. Nekada nam to moe pomoi pri pojednostavnjivanju programa i, to je jo vanije, olakati razumijevanje problema koji rjeavamo.
Pogledajmo tablicu 5.5.
U njoj su u krajnje lijevom stupcu napisani sudovi koje smo imenovali sa G. U krajnje desnom
stupcu napisani su sudovi s istim vrijednostima operanada, ali s tzv. suprotnim relacijskim operatorima. Naime, kako je 5 vee od 2, onda je jasno da 5 nije manje od ili jednako 2.
Ako, primjerice, izrazu koji smo dobili nekim relacijskim operatorom pridruimo logiku varijablu G, moemo se zapitati koji bi relacijski operator trebalo primijeniti tako da uz iste vrijednosti
operanada bude istinit komplement od G. Nazovimo K = notG istinit.

sud G

vrijednost G

vrijednost K = not G

sud K

x>2

x <= 2

x>6

x <= 6

x=5

x != 5

x <= 3

x>3

Tablica 5.5. Primjeri uporabe suprotnih operatora (za x = 5)


Iz tablice se moe zakljuiti da se zamjenom relacijskog operatora nekim drugim u nekom sudu
moe dobiti negacija tog suda. Nazovimo takav zamjenski operator suprotnim operatorom. Parovi meusobno suprotnih relacijskih operatora prikazani su u tablici 5.6.

Operator

Suprotni operator

>
<
>=
<=
==
!=

<=
>=
<
>
!=
==

Tablica 5.6. Meusobno suprotni relacijski operatori

69

5.2.

Donoenje odluka i grananja u programima

Struktura programa u Pythonu

5.2.3. Donoenje odluka u programima izbor alternativnih blokova naredbi


Slijedni programi imaju vrlo skromne mogunosti, kao to smo to vidjeli i na primjeru nae igre
s brojevima. Bilo bi poeljno na temelju ispitivanja nekog uvjeta odabrati jednu od dvije mogunosti (jer njegova vrijednost moe biti samo True ili False). Prije negoli to zapiemo u obliku
kako to odreuje jezik Python opisat emo mogunosti u hrvatskoj varijanti tzv. pseudojezika
(prefiks pseudo- oznauje da nije rije o stvarnom jeziku, ve o ne suvie vrsto definiranom
jeziku kojim moemo relativno slobodno opisivati programe). U tom e se jeziku upotrebljavati
kljune rijei ako je, onda i inae (engl. if, then, else). Uporabom tih kljunih rijei moemo
napisati program u sljedeem obliku:
...
ako je uvjet onda
{
naredba1_1;
...
naredba1_n
}
inae
{
naredba2_1;
...
naredba2_m;
}
...
Ako je uvjet ispunjen (logiki izraz je istinit), obavit e se prvi blok naredbi, a ako uvjet nije
ispunjen (logiki izraz je laan), obavit e se drugi blok naredbi. Uobiajeno se kae da se program grana na dvije grane. Pri izvoenju programa obavit e se ili jedna ili druga grana. Iako
emo esto govoriti o grananju, taj naziv nije sasvim opravdan. Naime, grane nekog stabla,
nakon to se ravaju iz debla ili drugih veih grana, vie se nigdje ne sastaju, dok se nakon
obavljanja naredbi iz jednog ili drugog bloka, program u pravilu nastavlja zajednikim dijelom.
U Pythonu se odabir alternativnih blokova naredbi obavlja naredbama u kojima se rabe sljedee
kljune rijei: if, else i elif, iza kojih se stavlja dvotoka. Blokovi naredbi ne ograuju se
posebnim simbolima oni zapoinju nakon naredbe koja zavrava dvotokom i piu se uvueno
za odgovarajui broj znakovnih mjesta koja se reguliraju tabulatorom (uobiajeno su etiri mjesta), to znai da je dovoljno i poeljno koristiti se tipkom (tab). Iza zadnje naredbe bloka mora
pisati naredba koja nije uvuena. Blok je na taj nain jasno grafiki odreen u tekstu programa.
...
if uvjet:
naredba1_1
...

70

naredba1_n
else:
naredba2_1
...
naredba2_m
...
Niz naredbi koji smo oznaili sa: naredba1_1, naredba1_2, ..., naredba1_n zvat emo blok naredbi i on e se izvesti ako je uvjet istinit. Primijetimo da je isto tako niz naredbi naredba2_1,
naredb2_2, ..., naredba2_m jedan blok naredbi koji se izvodi ako je uvjet laan.
Na osnovi navedenog slijedi opi oblik naredbe if koji zapisujemo na sljedei nain:
...
if uvjet:
blok_naredbi_1
else:
blok_naredbi_2
...
U interaktivnom suelju i u editoru nakon dvotoke se automatski uvlai sljedei redak za etiri slovna mjesta. Naredbe koje slijede smatraju se dijelom bloka i piu se jedna ispod druge.
Nakon to se napie zadnja naredba prvog bloka i prijee u novi red, potrebno je pokaziva
pomaknuti za etiri mjesta ulijevo i napisati else:. Zatim se na isti nain napie drugi blok (u
interaktivnom se suelju blok zavrava tako da se pritisne tipka unos (Enter) ime se pojavljuje
jedan prazan red).

P r i m j e r 5.1.

Pogledajmo to na jednom jednostavnom primjeru.


Napiimo program koji e zahtijevati utipkavanje jednog prirodnog broja i zatim ispisati
je li taj broj djeljiv sa sedam.
Rjeenje:
Na temelju svega to smo nauili program moemo osmisliti na sljedei nain:
# primjer_05_01_A
print('Program e ispisati je li neki utipkani broj djeljiv sa 7')
broj = int(input('Utipkati prirodan broj: '))
if broj % 7 == 0:
print('Broj {} je djeljiv sa sedam.'.format(broj))
else:
print('Broj {} nije djeljiv sa sedam.'.format(broj))

Podsjetimo se da funkcija input() utipkani broj vraa kao string te taj string treba prevesti u
cijeli broj, to obavlja funkcija int(). Funkcija input() predstavlja nam, dakle, vrijednost koja
e biti odreena naim utipkavanjem. Zbog toga se ona moe napisati neposredno kao parametar funkcije int(). Isprobajmo program!

71

5.2.

Donoenje odluka i grananja u programima

You might also like