Napravite paket naredbi¶
Podsetimo se zadatka Uzmi lopticu na susednom polju. Zadatak je bio da Karel u svakom smeru pokuša da ode na susedno polje i (ako uspe da ode na susedno polje) da pokuša da uzme lopticu tamo. Naravno, da bi Karel mogao da pokuša u sledećem smeru, bilo je potrebno i da se posle svakog pokušaja vrati na polazno polje.
Program koji rešava zadatak može da izgleda ovako:
Verovatno vam je deo programa od sedme do jedanaeste linije malo teži za praćenje. U tom delu možda zamišljate Karela kako izvršava naredbu po naredbu da biste sasvim razumeli šta se tu dešava.
Komentari donekle pomažu da se ovaj deo programa lakše razume. Pored komentara, još bolje bi bilo kada bi postojala funkcija nazad(), pomoću koje bi Karel napravio korak unazad. Tada bi program bio kraći i jasniji:
Funkcija nazad() nije deo Karel biblioteke, ali možemo vrlo jednostavno da sami napravimo tu funkciju. Kada je napravimo, funkciju nazad() moći ćemo da je koristimo ravnopravno sa funkcijama biblioteke Karel kao što su napred(), desno() i ostale.
Kako se pišu funkcije¶
Za sada ćemo se upoznati samo sa najjednostavnijim načinom pisanja funkcije u Pajtonu, a ostale, složenije oblike ćemo upoznavati kasnije.
Pri pisanju bilo koje funkcije na Pajtonu, reč def
na početku, zagrade ()
i dvotačka :
na kraju prvog reda su obvavezni. Kao ime_funkcije može se pojaviti bilo koje pravilno napisano ime koje mi izaberemo. Naredbe koje slede, pišu se uvučeno i čine telo funkcije (ako se piše više naredbi u jednom redu, onda se te naredbe razdvajaju znakom tačka-zarez). Naredbe u telu funkcije će se izvršiti svaki put kada se pri izvršavanju programa naiđe na ime funkcije, to jest kada ta funkcija bude pozvana.
U skladu sa ovim pravilima, funkciju nazad() možemo da napišemo ovako:
Tada bi ceo program izgledao ovako:
Kada neku logičku celinu izdvojimo u funkciju, možemo da pišemo programe koji su kraći i jasniji, jer smo problem razložili na delove koji su manje složeni.
Još jedna prednost od pisanja funkcija je da ih lako možemo iskoristiti u drugim programima (ovde ćemo napisane funkcije povremeno kopirati, ali u realnom programiranju postoji bolji i jednostavniji način).
Izlazak iz funkcije ili petlje pre njenog kraja¶
U primeru traženja loptice na susednom polju, radi jednostavnosti programa smo odlučili da Karel i kad nađe lopticu, on nastavlja da je traži u preostalim smerovima. Postoji način da izbegnemo ovo nepotrebno izvršavanje preostalih naredbi.
Kada želimo da prekinemo izvršavanje petlje, pišemo specijalnu naredbu break
. Efekat naredbe break je da „iskočimo” iz petlje i nastavimo izvršavanje programa od prve naredbe posle petlje.
Naredbom break ćemo iskočiti iz najbliže (najuže) for ili while petlje koja sadrži ovu naredbu. Ako se break naredba nalazi u dve ili više ugnežđenih petlji, izvršavanje se nastavlja naredbom koja sledi posle unutrašnje (najuže) petlje.
Koristeći naredbu break, mogli bismo glavni deo programa
da prepravimo u:
Na taj način se iz petlje izlazi čim je loptica pronađena i uzeta. Pošto posle ove petlje nema drugih naredbi, u ovom slučaju se izvršavanjem naredbe break završava i rad programa.
Vrlo slično izlasku iz petlje, iz funkcije takođe možemo da izađemo pre nego što se sve njene naredbe izvrše.
Kada želimo da prekinemo izvršavanje funkcije, pišemo specijalnu naredbu return
. Efekat naredbe return je da „iskočimo” iz funkcije i nastavimo izvršavanje programa od prve naredbe posle mesta odakle je funkcija pozvana.
Naredbom return iskačemo iz funkcije bez obzira na to koliko petlji okružuje naredbu return.
Od programa za uzimanje loptice na susednom polju možemo da napravimo funkciju. U tom slučaju bismo mogli da pišemo:
Zadaci za vežbu¶
Ostavljaj loptice dok ima loptica i polja¶
Karel na početku ima nekoliko loptica i treba da ih rasporedi duž puta po jednu na svako polje (počevši od polja na kome stoji) dokle je moguće. Karel prekida sa postavljanjem loptica kada naiđe na prepreku ili kada ostane bez loptica (šta god se pre dogodi). Pri tome nije važno da li će se Karel zaustaviti na poslednjem popunjenom, ili na prvom praznom polju.
Predlog: Stavite jedan od ova dva uslova u while petlju, tako da se petlja završi kada uslov ne bude više ispunjen. Koristite break naredbu da izađete iz petlje ako drugi uslov nije ispunjen.
Pomeri sve loptice unazad¶
Ispred Karela je prav put nepoznate dužine. Na početnom polju nema loptica. Karel treba da svaku lopticu premesti za jedno polje ka levoj strani ekrana.
Ovaj zadatak možete da rešite tako što, dok god ima polja ispred Karela, ponavljate sledeće korake:
pređi na sledeće polje
uzmi sve loptice sa tog polja
idi korak nazad (to jest, okreni se dva puta i idi napred)
ostavi sve loptice
vrati se na polje sa kojeg si uzeo loptice
Pri tome, za vraćanje na polje na koje Karel premešta loptice možete da koristite ranije napisanu funkciju nazad(). Treba samo da je iskopirate ili prepišete u prostor za rešavanje.
Prati loptice¶
Na svakom polju se nalazi po jedna ili nijedna loptica. Polja sa lopticama formiraju put, koji počinje na polju pored Karela. Karel treba da prati taj put i da pokupi sve loptice.
Predlog: radi rešavanja ovog zadatka možete da napišete funkciju na_neprazno_susedno_polje(), koja treba samo da premesti Karela na susedno polje na kome postoji loptica (pri tome naredba return može da bude korisna). Funkcija na_neprazno_susedno_polje treba da se razlikuje od ranije napisane funkcije uzmi_na_susednom_polju() samo po tome što ne uzima lopticu.
Kada Karel pokupi sve loptice, sledeći poziv ove funkcije će ostaviti Karela na nekom praznom polju (to će biti polje na kome je Karel uzeo poslednju lopticu). Po tome što nema loptice na polju na kome se nalazi Karel, znaćemo da je Karel već uzeo sve loptice.
Uzmi sve loptice sa cele table¶
Karel je na početku okrenut ka severu (gore), a nalazi se u donjem levom uglu pravougaone table nepoznate veličine, bez unutrašnjih zidova. Na svakom polju može biti bilo koliko loptica. Karel treba da uzme sve loptice sa svih polja table.
Predlog: Napišite funkciju isprazni_red(), pomoću koje Karel:
okreće se na levo (na istoku, tj. desnoj strani ekrana, gledajući duž reda na čijem je početku)
prolazi ceo red tabele i usput uzima sve loptice sa svakog polja iz tog reda, uključujući i prvo polje u redu, sa koga je krenuo
okreće se ka početku reda (ka zapadu, tj. ka desnoj strani ekrana)
vraća se na početak reda i okreće se na severu (gore), kao što je stajao pre poziva funkcije
Program koji rešava zadatak pomoću ove funkcije nije dugačak. Potrebno je:
isprazniti prvi red
dok ima redova ispred Karela, ići na sledeći red i isprazniti ga