Iva se, zbog tatina posla, s roditeljima preselila u drugi grad. Njezina je mama programerka koja radi od kuće, tako da joj, za razliku od Ive, promjena sredine nije teško pala. Ivina su utjeha bili kućni ljubimci, čija ljubav prema njezinoj obitelji nema granica s obzirom na to da su pas Lunjo i mačka Maza udomljeni iz azila za životinje. S novom školom dobila je novo društvo, ali i novi predmet – Informatiku. Kako bi pobliže upoznala svoje vršnjake, odlučila je uz maminu pomoć napraviti program koji će prebrojiti koliko njezinih kolega iz razreda ima psa, mačku ili oboje.
Za rješenje Ivina problema upotrijebit ćemo algoritamski konstrukt koji se naziva grananje ili odluka.
Odluka ili grananje algoritamski je konstrukt u kojem daljnji tijek izvođenja algoritma ovisi o nekom uvjetu.
Pogledajmo kako bi mogao izgledati dijagram toka za Ivin problem.
Kod u Pythonu za Ivin dijagram mogao bi izgledati ovako:
broj_učenika = int(input('Unesi broj učenika: '))
m = 0
p = 0
for i in range(broj_učenika):
unos1 = input('Ima li učenik mačku? (da/ne) ')
if unos1 == 'da':
m += 1
unos2 = input('Ima li učenik psa? (da/ne) ')
if unos2 == 'da':
p += 1
print('U razredu ima' , m, 'učenika koji imaju mačke te' , p, 'učenika koji imaju pse')
Postoji nekoliko situacija odluke koje se pojavljuju u algoritmima.
Prva je situacija kada se pri neispunjavanju uvjeta ne događa ništa. Tada u Pythonu zapisujemo samo if dio programskog koda.
Druga je situacija kada odlučujemo hoće li algoritam ići u jednom ili u drugom smjeru. Tada zapisujemo if i else dijelove programskog koda.
Treća je situacija kada imamo više od dva izbora. Tada zapisujemo if dio koda, onoliko elif (else if se u Pythonu zapisuje elif) dijelova koda koliko nam je potrebno te else dio koda.
Na jednom ćemo primjeru prikazati sve tri situacije.
# program unosi koliko je trenutačno sati (samo sate, bez minuta i sekunda)
h = int (input ('Unesi koliko je trenutačno sati: '))
if h < 12:
print('Dobro jutro! ')
#program unosi koliko je trenutačno sati (samo sate, bez minuta i sekunda)
h = int (input ('Unesi koliko je trenutačno sati: '))
if h < 12:
print('Dobro jutro! ')
else:
print('Dobar dan! ')
#program unosi koliko je trenutačno sati (samo sate, bez minuta i sekunda)
h = int (input ('Unesi koliko je trenutačno sati: '))
if h < 12:
print('Dobro jutro! ')
elif h >= 12 and h <= 18:
print('Dobar dan! ')
else:
print('Dobra večer! ')
U prvoj se verziji programa, ako unesemo broj veći od jedanaest, ne događa ništa. U drugoj verziji imamo dvije mogućnosti, a u trećoj smo verziji ubacili naredbu elif kojom dobivamo još jednu mogućnost. Kao što smo već napomenuli, naredbi elif može biti beskonačno mnogo. Nakon elif naredbe također ide uvjet, kao i kod if naredbe, za razliku od else naredbe nakon koje se uvjet ne zapisuje.
Dopuni sljedeći programski kôd tako da za uneseni broj ispisuje je li jedanak nuli, manji od nule ili veći od nule.
Pomoć:
Koji uvjet nam treba u prvom slučaju?
Ne zaboravi na uvjet nakon naredbe elif!
Postupak:
n = int(input('Unesi broj: '))
if n == 0:
print('Broj je jednak nuli.')
elif n < 0:
print('Broj je manji od nule.')
else:
print('Broj je veci od nule.')
Napravimo program koji će generirati nasumičan broj od 1 do 5, ocjenu koju je Iva dobila iz Matematike. Korisnikova je zadaća da pokuša pogoditi koliko je Iva dobila iz Matematike, a program javlja je li ocjena pogođena ili je upisana viša ili niža ocjena. Dodaj dijelove koda koji nedostaju.
Postupak:
from random import * # uvodenje biblioteke s naredbama za nasumicne brojeve
ocjena = randint(1, 5) # naredba randint generira nasumican broj u intervalu koji je zapisan u zagradama
unos = int(input('Koliko je Iva dobila iz matematike? '))
if ocjena == unos:
print('Tocno!')
elif ocjena > unos:
print('Unesena ocjena je niza od Ivine!')
else:
print('Unesena ocjena je visa od Ivine!')
Prethodni program koristi neke naredbe koje je potrebno dodatno objasniti.
Naredba randint koja generira nasumičan broj u nekom intervalu nije dio zadanih naredbi u Pythonu, već se nalazi u zbirci naredbi random.
Kako bismo u program uključili naredbe iz zbirke random, prije korištenja određene naredbe trebamo zapisati from random import *, pri čemu je zvjezdica odnosno asterisk simbol za uključenje svih naredbi.
Osim zbirki naredbi random, postoji još mnogo zbirki naredbi koje možemo uključiti u svoj program u Pythonu. Često korištena zbirka naredbi koja sadrži matematičke funkcije i konstante jest math. Za one koji vladaju engleskim jezikom, na sljedećoj poveznici nalazi se lista svih zbirki naredbi u Pythonu.
Iva želi unaprijediti svoj program tako da računa postotak učenika s mačkama među učenicima koji imaju pse ili mačke. Program ispisuje veći postotak, a javlja ako su jednaki. Ivi su se omaknule dvije pogreške pa te moli za ispravak netočnih relacijskih operatora.
Postupak:
broj_ucenika = int(input('Unesi broj ucenika: '))
m = 0
p = 0
br_zivotinja = 0
for i in range(broj_ucenika):
unos1 = input('Ima li ucenik macku? (da/ne) ')
if unos1 == 'da':
m += 1
br_zivotinja += 1
unos2 = input('Ima li ucenik psa? (da/ne) ')
if unos2 == 'da':
p += 1
br_zivotinja += 1
postotak_macaka = m / br_zivotinja * 100
postotak_pasa = p / br_zivotinja * 100
if postotak_macaka > postotak_pasa:
print('Macke vode s ', postotak_macaka, '%.')
elif postotak_macaka < postotak_pasa:
print('Psi vode s ', postotak_pasa, '%.')
else:
print('50 % : 50 %')
Što ako se netko skrbi za više pasa ili mačaka? U tom bismo slučaju korisnika morali pitati koliko ima pasa ili mačaka pa te brojeve pribrojiti u akumulacijsku varijablu. Pogledajmo konačnu verziju Ivina programa.
Program za svakog učenika provjerava ima li psa ili mačku te unosi njihov broj.
Postupak:
Za početak unosimo broj učenika te akumulatorima za broj mačaka, pasa i životinja dodjeljujemo vrijednost nula.
Petlja se ponavlja onoliko puta koliko imamo učenika.
Za svakog učenika provjeravamo ima li psa ili mačku te, ako je odgovor da, unosimo broj mačaka i pasa koje pribrojavamo ukupnom broju mačaka i pasa te životinja.
Nakon što smo unijeli podatke za sve učenike, računamo postotak mačaka te postotak pasa.
Ispisujemo ima li više mačaka, pasa ili je omjer podjednak.
Odluka ili grananje temeljni je koncept u programiranju. Promotrimo li pomnije svijet oko sebe, već na prvom semaforu zamijetit ćemo koncept odluke. Programiranje je dio našeg života, znali mi to ili ne! :)