Уграђене функције

Појам функције

Функције су један од основних појмова математике и програмирања. Оне представљају пресликавања одређених улазних вредности (каже се параметара, аргумената) у једну или више излазних вредности тј. резултата. На пример, функција може да као улазни параметар добије дужину странице једнакостраничног троугла \(а\) и да као резултат врати дужину обима тог троугла \(3\cdot a\). Таква зависност би се у математици описала као \(f(a) = 3\cdot a\) што значи да функција коју смо назвали f (што је најчешће име за функцију) на основу датог параметра \(а\) одређује вредност \(3\cdot a\). Слично, функција која израчунава обим правоугаоника на основу дужине његових страница би се у математици описала као \(g(a, b) = 2\cdot a + 2 \cdot b\). У овом случају је функцији дат назив \(g\), она има два улазна параметра (\(a\) и \(b\)) и враћа резултат који је одређен формулом \(2\cdot a + 2 \cdot b\).

Касније ћемо видети како можемо дефинисати функције у језику Python, а започетак ћемо се само позабавити коришћењем неких основних уграђених функција (оне су већ дефинисане језиком и можемо их слободно користити тј. позивати у нашим програмима).

Минимум и максимум

У многим задацима потребно је одредити мањи или већи од два дата броја. Пошто је тај задатак веома чест, програмски језик Python нуди решење у виду функција min и max. На пример, вредност израза min(2, 5) је мањи од бројева 2 и 5 тј. број 2 (тај израз представља позив функције min са аргументима 2 и 5), док је вредност израза max(2, 5) већи од бројева 2 и 5 тј. број 5 (тај израз представља позив функције max са аргументима 2 и 5).

Вредност израза min(24, 17) је min означава мањи број

    Која је вредност израза min(min(5, 2), 3)?
  • (A) 2
  • Тачно!
  • (B) 3
  • min означава мањи од два броја.
  • (C) 5
  • min означава мањи од два броја.

Минимум и максимум неколико бројева могуће је израчунати тако што се сви наведу као параметри функција min тј. max. На пример, вредност израза max(3, 2, 5, 4) је 5.

Покажимо сада неколико задатака у чијем нам решењу ове функције могу помоћи.

Већа оцена

Љубица је једног дана добила оцену из биологије и географије. Која је већа оцена коју је Љубица добила тог дана?

Највећи број поена у игрици

Асмир, Снежа и Мица су играли игрицу на рачунару. Колики је највећи број поена (high-score) који је освоји неко од њих.

Браћа и књиге на полици

Аљоша и Борис су браћа која иду у трећи и шести разред и деле исту собу. У соби имају две полице за књиге, међутим, књиге су им се измешале и они желе да их раздвоје тако да на једној полици буду само Аљошине књиге за трећи, а на другој полици буду само Борисове књиге за шести разред (свеједно им је која ће полица бити чија). Колики је најмањи број књига које треба да помере?

_images/police_sa_knjigama.jpg

Приметимо да постоје два начина да се књиге раздвоје. Први је да се све Аљошине књиге са прве полице пребаце на другу, а да се све Борисове књиге са друге полице пребаце на прву полицу. Други начин је да се све Борисове књиге са прве полице пребаце на другу, а да се све Аљошине књиге са друге полице пребаце на прву. У првој варијанти број књига које се пребацују једнак је збиру броја Аљошиних књига на првој и Борисових књига на другој полици, док је у другој варијанти тај број једнак збиру броја Борисових књига на првој и Аљошиних књига на другој полици. Решење је мањи од та два броја (а мањи од два броја можемо израчунати функцијом min).

Пресек интервала

Алекса и Ђорђе су два програмера који раде у истој компанији. Алекса ће у понедаљак бити на послу од 8 сати до 17 сати, а Ђорђе од 10 до 15 сати. Колико су сати тог дана могли заједно да раде на игрици коју програмирају? Напиши програм тако да ради и када се подаци промене (на пример, у уторак ће Алекса бити на послу од 15 до 20, а Ђорђе од 8 до 14).

Време које ће моћи да раде заједно је време које тече од тренутка када дође други од њих, до тренутка када оде први од њих. На пример, ако је Алекса дошао у 8 сати, а Ђорђе у 10, онда је други дошао у 10, а ако је Алекса дошао у 9, а Ђорђе у 7, онда је други дошао у 9. Слично, ако је Алекса отишао у 17, а Ђорђе у 15, онда је први отишао у 15. Могуће је да се деси да је први отишао пре него што је други дошао и тада је заједничко време 0. Иначе је време једнако разлици између времена када је први отишао и времена када је други дошао (дакле, заједничко време је већи од броја 0 и те разлике).

Апсолутна вредност

Још једна веома корисна функција коју си упознао/упознала у математици је апсолутна вредност. Апсолутном вредношћу се одређује одступање броја од нуле. На пример, број 4 одступа од нуле за 4, док број -5 одступа од нуле за 5 јединица. Дакле апсолутна вредност броја \(x\), која се, подсетимо се обележава са \(|x|\), једнака самом броју \(x\) ако је \(x \geq 0\) тј. броју \(-x\), ако је \(x < 0\).

У језику Python апсолутну вредност можемо израчунати помоћу функције abs. Тако је вредност израза abs(5) једнака 5, док је вредност израза abs(-3) једнака 3.

Вредност израза abs(-11.2) је abs означава апсолутну вредност броја и она не може бити негативна abs означава апсолутну вредност броја

Једна од најзначајнијих примена апсолутне вредности је да се израчуна удаљеност бројева, без обзира на њихов међусобни однос. Наиме, растојање између бројева \(x_1\) и \(x_2\) је једнако апсолутној вредности њихове разлике тј. вредности \(|x_1 - x_2|\), без обзира да ли је \(x_1 \geq x_2\) или је \(x_1 < x_2\). Размотримо наредни задатак.

Удаљеност спратова

Cпратови у једној згради су обележени са бројевима од -2 до 10 (бројеви -2 и -1 означавају два нивоа испод земље, 0 означава приземље, док остали бројеви означавају спратове изнад земље). Ако се знају спратови на којима се налазе два другара, израчунај колико су спратова удаљени.

Пошто не знамо да ли лифт иде на горе или на доле тј. да ли је полазни спрат мањи или већи од долазног, растојање између спратова можемо израчунати тако што израчунамо апсолутну вредност разлике између тих спратова. На пример, ако би први другар био на трећем спрату, а други у првом подруму, исправи програм који рачуна то растојање.

Наравно, уместо бројева 3 и -1 могуће је стављати и друге, а могуће је ове бројеве учитати приликом покретања програма.

Време чекања на станици

Јелена је дошла аутобусом на станицу у s1 сати и m1 минута, док је Иванин аутобус стигао у s2 сати и m2 минута. Колико је сати и минута она која је прва стигла чекала ону која је друга стигла?

И у овом задатку се тражи да се израчуна растојање између два временска тренутка за које се не зна који је први, а који други. Као што смо приказали раније, рачунање растојања се своди на рачунање апсолутне вредности разлике, а рад са сатима и минутима лакше обављамо ако прво претворимо све у минуте, затим израчунамо број минута колико су се чекале и након тога то претворимо у сате и минуте.

Менхетн растојање

Менхетн, део града Њујорка је организован у авеније у правцу север-југ и улице у правцу isток-запад. Размак између две улице је 80m, а између две авеније је 275m. Ако се Том налази на углу улице \(u_1\) и авеније \(a_1\) и жели да стигне на угао улице \(u_2\) и авеније \(a_2\), колико ће метара морати да пређе.

_images/manhattan_distance.png

Том има више начина да стигне са једног на друго место (може да иде цик-цак, на разне начине), међутим, пређено растојање је исто као када би прво ишао улицом \(u_1\) све док не дође до угла са авенијом \(a_2\), а затим да се креће авенијом \(а_2\) све док не дође до угла са улицом \(u_2\). Дакле, потребно је израчунати растојање између авенија \(a_1\) и \(a_2\) (да би се оно добило у метрима потребно је помножити апсолутну разлику између њихових редних бројева размаком између суседних авенија) и на то додати растојање између улица \(u_1\) и \(u_2\) (да би се оно добило у метрима потребно је помножити апсолутну разлику између њихових редних бројева размаком између суседних улица).

Исправи наредни код тако да коректно израчуна пређени пут (наравно, програм треба да ради и када се улазни подаци промене или учитају са улаза).

Приметимо да је формула у претходном примеру била веома дугачка и проценили смо да је прегледније да је одштампамо кроз више редова. Да бисмо нагласили да се нека наредба наставља и у следећој линији на крај линије стављамо симбол \.

Краљево растојање на шаховској табли

Краљ се на шаховској табли налази на пољу обележеном координатама \((x_1, y_1)\). Ако се зна да се у сваком потезу краљ може кретати по једно поље у било ком од осам смерова, израчунај колики је најмањи број потеза потребних да краљ стигне на поље означено координатама \((x_2, y_2)\).

_images/kralj.jpg

Овај задатак је донекле сличан претходном. Поново је потребно да израчунамо хоризонтално и вертикално растојање између полазне и долазне тачке. Размисли како се број потеза може израчунати на основу та два растојања (у првих неколико потеза краљ може да се креће дијагонално, а после тога, ако је потребно, наставиће да се креће хоризонтално тј. вертикално).

Хоризонтално и вертикално растојање израчунавамо као апсолутну вредност разлике одговарајућих координата. Број дијагоналних потеза једнак је мањем од два растојања, док је број хоризонталних тј. вертикалних потеза након тога једнак разлици између већег и мањег растојања. Дакле, укупан број потеза је једнак већем од два растојања. Заиста, у почетним потезима се оба растојања умањују за по један, све док мање растојање не достигне нулу, након чега дуже растојање наставља да се умањује за један и укупан број потеза да оно достигне нулу једнак је његовој полазној вредности.

Остале математичке функције

Поред ових које смо видели, језик Python 3 нуди многе друге корисне функције за рад са бројевима. На пример, функција round заокружује дати реални број на најближи цео број.

    Превлачењем упари изразе са њиховим вредностима. Покушај поново
  • round(2.1)
  • 2
  • round(2.9)
  • 3
  • round(4.5)
  • 5

Слично, функција math.ceil заокружује дати реалан број навише тј. на најмањи цео број већи или једнак њему, док math.floor заокружује дати реалан број наниже тј. на највећи цео број мањи или једнак њему. На пример, math.ceil(2.1) је 3, исто као и math.ceil(2.9), док је math.floor(2.1) једнако 2, исто као и math.floor(2.9). Приметимо да имена ових функција почињу са math. Оне су део такозване математичке библиотеке и да би се могле користити у програму на његовом почетку мора бити написано import math.

Вредност math.ceil(7.25) је размисли који је најмањи цео број који је већи или једнак 7,25 Вредност math.floor(7.25) је Размисли који је највећи цео број који је мањи или једнак 7,25 Вредност math.floor(7.25) је Размисли који је цео број који је најближи броју 7,25

Функција math.sqrt израчунава квадратни корен тј. онај ненегативан број који када се помножи сам са собом (када се квадрира) даје полазни број. На пример, важи да је \(2 \cdot 2 = 4\), тако да је квадратни корен броја \(4\) број \(2\) (то се у математици записује као \(\sqrt{4} = 2\).

Напиши програм који за дату површину квадрата израчунава дужину његове странице.

Пошто важи да је \(P = a\cdot a\), важи да је \(a = \sqrt{P}\).

Функција math.pow врши степеновање. На пример, \(2^{8} = 256\) се може израчунати помоћу math.pow(2, 8). Као што множење означава узастопно сабирање, тако степеновање означава узастопно множење. Други степен броја \(2\) je \(2^2 = 2 \cdot 2 = 4\), трећи степен броја \(2\) је \(2^3 = 2 \cdot 2 \cdot 2 = 8\) и тако даље. Поменимо и да је степен дефинисан и када аргументи нису цели бројеви, али се тиме нећемо бавити. Степеновање се може израчунати и оператором **. Тако се уместо math.pow(2, 8) може употребити израз 2 ** 8 чија је вредност такође 256.

Осим функција, у библиотеци math дефинисане су и разне корисне константе. На пример, број \(\pi\) који представља однос пречника и обима круга доступан је помоћу math.PI (вредност тог броја је око \(3,141592\)).