$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Definisanje funkcija

U delu posvećenom upravljanju Karelom smo pomenuli da grupu naredbi možemo da izdvojimo u zasebnu celinu, koja se zove funkcija. Podsetimo se kako u opštem slučaju izgleda funkcija napisana na Pajtonu:

Za pisanje funkcija na Pajtonu važe sledeća pravila:

Pravila pisanja funkcije:

  • Defniicija funkcije počinje rečju def, iza koje sledi ime funkcije, lista argumenata u zagradama i znak : (dvotačka) na kraju reda.

  • Kao ime_funkcije može da se pojavi bilo koje pravilno napisano ime (pravila su ista kao za imena promenljivih).

  • Kao lista_argumenata može da se pojavi prazna lista (ništa) ako funkcija ne koristi argumente, ili jedan ili više argumenata razdvojenih zarezima.

  • U telu funkcije (naredba_1, … naredba_k) mogu da se pojave bilo koje naredbe jezika Pajton. Ove naredbe se pišu uvučeno u odnosu na red koji sadrži ime i argumente funkcije.

Funkcije mogu a ne moraju da vrate neku vrednost. Do sada smo imali prilike da vidimo i jednu i drugu vrstu funkcija. Na primer, funkcije pomoću kojih se robot Karel pomera napred, okreće, uzima i ostavlja loptice su sve funkcije koje ne vraćaju vrednost. Sa druge strane, matematičke funkcije poput abs ili round, kao i funkcije pomoću kojih proveravamo da li Karel ima loptica kod sebe, da li ima loptica na polju i da li Karel može da ide napred su funkcije koje vraćaju vrednost.

Pisanje funkcija koje vraćaju vrednost

Da bi neka funkcija vratila vrednost, potrebno je da se u telu funkcije bar jednom navede naredba return. Naredba return se sastoji od reči return iza koje sledi izraz čiju vrednost funkcija treba da vrati.

Naredba return može da se pojavi na više mesta u funkciji (obično sa različitim vrednostima), a obavezno se navodi na kraju tela funkcije. Funkcija abs, da nije ugrađena, mogla je biti definisana ovako:

Funkcija može da vrati i više od jedne vrednosti. Takva je, na primer, ugrađena funkcija divmod, koja vraća dva broja - rezultat celobrojnog deljenja i ostatak. Funkciju divmod koristimo isto kao i funkcije koje vraćaju jednu vrednost, samo vraćene vrednosti smeštamo u više promenljivih:

Kada pišemo funkcije koje vraćaju više vrednosti, dovoljno je da posle reči return navedemo vrednosti koje vraćamo, razdvojene zarezima. Kada bi trebalo da sami definišemo funkciju divmod, mogli bismo da je napišemo ovako:

Primer

Primer - krečenje:

Za krečenje \(1m^{2}\) zida potrebno je oko \(0.5kg\) boje. Napisati funkciju koja kao argumente prihvata sledeća 4 argumenta:

  • dužinu sobe

  • širinu sobe

  • visinu sobe

  • dužinu koja se ne kreči (zbirna širina vrata, prozora, plakara i slično)

Funkcija treba da vrati količinu boje (u kilogramima), potrebne za krečenje zidova i plafona.

Posle funckcije napisati i program koji učitava podatke za 5 različitih prostorija, a zatim koristeći napisanu funkciju izračunava i ispisuje ukupnu količinu potrebne boje za krečenje svih pet prostorija.

Zadaci za vežbu:

Zadatak - Geografske koordinate u obliku za GPS

Našli ste staru mapu zakopanog blaga i sa nje očitali koordinate blaga u stepenima, minutima i sekundama, ali vaš GPS uređaj podržava samo geografske koordinate kao realne brojeve stepeni.

Napišite program koji za datu koordinatu u stepenima, minutima i sekundama ispisuje realan broj stepeni.

Program je skoro sasvim napisan. Potrebno je još dodati izraz za računanje realnog broja stepeni. Da bismo (uglovne) minute pretvorili u stepene, delimo ih sa \(60\), a sekunde pretvaramo u stepene deljenjem sa \(60 \cdot 60 = 3600\).

Zadatak - Geografske koordinate u obliku za staru mapu

Pošto ste shvatili da je stara mapa iz prethodnog zadatka bila nečija šala, rešili ste da i vi nekome priredite sličnu šalu. Izabrali ste mesto u blizini i očitali koordinate sa vašeg GPS uređaja. Sada vam je potrebno da koordinate sa uređaja u realnim stepenima pretvorite u cele stepene, minute i sekunde, da biste napravili odgovarajuću „staru” mapu.

Dovršite započeti program koji obavlja ovo pretvaranje.

Zadatak - Vodoinstalater:

Petar je vodoinstalater i za danas ima planirane tri intervencije. Petar će za svaku intervenciju zabeležiti kada je počela i kada se završila, a na osnovu tih podataka treba izračunati koliko vremena je Petar ukupno proveo u intervencijama.

Dat je delimično napisan program koji učitava vreme početka i završetka u satima i minutima za svaku Petrovu intervenciju, a zatim određuje i ispisuje ukupno vreme trajanja svih intervencija.

Dopunite program tako što ćete napisati funkciju trajanje(h1, m1, h2, m2), koja izračunava koliko ukupno minuta protekne od h1 sati i m1 minuta do h2 sati i m2 minuta;

Funkcije koje ne vraćaju vrednost

Funkcije koje ne vraćaju vrednost samo obavljaju neki posao i koristimo ih kao naredbe. Takve su na primer bile funkcije nazad() ili uzmi_na_susednom_polju(), koje smo pisali u delu posvećenom Karelu. Slede primeri takvih funkcija u programu sa tekstualnim interfejsom.

Primer - prevoz:

Članovima četvoročlane porodice je potrebno redom 55, 35, 40 i 20 minuta da stignu kući sa mesta na kojima se nalaze, pod uslovom da krenu kući pre 16 časova. U protivnom im treba 15 minuta više.

Napisati program koji učitava vreme polaska u satima i minutima za svakog člana porodice i ispisuje vreme stizanja kući.

Funkcija obradi_clana_porodice obavlja sve potrebne radnje za jednog člana porodice: učitava vreme polaska, na osnovu tog vremena produžava trajanje puta ako je potrebno, izračunava i ispisuje vreme stizanja kući. U glavnom programu je preostalo samo da se ova funkcija pozove za svakog člana porodice.

Zadaci za vežbu:

Zadatak - popust:

Jedan proizvođač nudi robu po ceni od 100 dinara za komad, a za porudžbine od 50 i više komada odobrava popust od 10%. Nekoliko kupaca se najavilo da dolaze da kupe određeni broj komada. Imena kupaca i tražene količine su dati na početku programa.

Napisati funkciju koja za dato ime kupca i količinu robe ispisuje koliko taj kupac treba da plati.

Ime kupca se ovde prosleđuje funkciji samo radi ispisivanja. Cena robe se računa na osnovu količine, koja se prosleđuje fuknciji kao drugi argument.

Zadatak - podvlačenje teksta:

Napisati funkciju podvuci(tekst), koja zadati tekst prikazuje podvučeno.

Pomoć: Funkcija podvuci treba da se sastoji od samo dve print naredbe. U prvoj se ispisuje dati tekst, a u drugoj linija. String koji sadrži liniju možete da dobijete množenjem stringa '-' dužinom datog stringa.


Pomenimo na kraju neke od koristi koje imamo od pisanja funkcija, koje ovde zbog kratkoće naših primera i zadataka nisu mogle da dođu do izražaja:

  • Funkcije se u dugačkim programima često koriste da rasterete glavni deo programa i učine ga kraćim i lakšim za razumevanje. Naši programi nisu toliko dugački da bi bilo potrebno rasterećivati glavni deo prorama, ali pokazuju kako bi to moglo da se uradi i sa dužim programima.

  • Funkcije mogu da nam pomognu da izbegnemo ponavljanje istog ili sličnog koda u programima. Ponavljanje koda treba izbegavati jer se takav kod teže održava - svaku izmenu treba uneti na više mesta, što je zamorno i podložno greškama i propustima.

  • Kada pišemo funkcije, omogućavamo drugima da lakše upotrebe delove našeg koda. Napisane funkcije se mogu izdvojiti u poseban modul, koji drugi programeri lako uključuju u svoje programe.

  • Kod veoma velikih programa, formiranjem funkcija omogućavamo da se program rasporedi u više fajlova, umesto jednog ogromnog i nepreglednog fajla.