{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Бројачи и суме\n", "\n", "У овој глави\n", "\n", "1. уводимо појам бројача,\n", "2. показујемо како се рачунају суме, и\n", "3. то знање примењујемо на проблем рачунања просека низа бројева." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.1. Бројач\n", "\n", "Често је потребно да пребројимо колико у низу има елемената који имају неку особину. Стандардни начин да се ова врста проблема реши је да се једна променљива задужи за посао бројања и онда се она зове *бројач*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Пример.** Написати Пајтон функцију `prebroj_petice` која у датом списку оцена броји петице. На пример,\n", "\n", " prebroj_petice([3, 1, 5, 4, 5, 2, 5])\n", "\n", "треба да врати\n", "\n", " 3\n", "\n", "зато што наведени списак оцена садржи три петице.\n", "\n", "*Решење.*" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def prebroj_petice(spisak):\n", " broj = 0\n", " for ocena in spisak:\n", " if ocena == 5: broj += 1\n", " return broj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Функција `prebroj_petice` прими списак оцена у коме треба да преброји петице и онда се понаша овако.\n", "\n", "1. Променљива `broj` ће бројати петице. Пошто још нисмо кренули са провером оцена, постављамо њену вредност на 0 (за сада нисмо наишли ни на једну петицу).\n", "2. Наредбом `for ocena in spisak:` пролазимо кроз `spisak` тако што променљива `ocena` редом узима вредности које су наведене на списку. Према томе, за сваку оцену са списка ћемо проверити да ли је једнака са 5, и ако јесте увећаћемо вредност променљиве `broj`.\n", "3. На крају враћамо вредност променљиве `broj` као резултат рада функције.\n", "\n", "Да погледамо како функција ради:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "prebroj_petice([3, 1, 5, 4, 5, 2, 5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Пример.** Написати Пајтон функцију `prebroj_ocene` која броји колико пута се у датом списку оцена појављује дата оцена. На пример,\n", "\n", " prebroj_ocene([3, 1, 5, 4, 5, 2, 5], 4)\n", "\n", "треба да врати\n", "\n", " 1\n", "\n", "зато што наведени списак оцена садржи само једну четворку.\n", "\n", "*Решење.*" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def prebroj_ocene(spisak, n):\n", " broj = 0\n", " for ocena in spisak:\n", " if ocena == n: broj += 1\n", " return broj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Пример*.** Написати Пајтон функцију `prebroj_cifre` која за дати позитиван цео број утврђује колико он има цифара. На пример,\n", "\n", " prebroj_cifre(12487)\n", "\n", "треба да врати\n", "\n", " 5\n", "\n", "зато што број 12487 има 5 цифара.\n", "\n", "*Решење.*" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def prebroj_cifre(n):\n", " br_cif = 0\n", " while n > 0:\n", " br_cif += 1\n", " n //= 10\n", " return br_cif" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Идеја програма је следећа.\n", "\n", " све док број \"има још цифара\":\n", " увећај број цифара за 1\n", " \"откини\" последњу цифру броја\n", "\n", "Условом `n > 0` проверавамо да ли је остала још нека цифра у броју, док командом `n //= 10` \"откинемо\" последњу цифру броја. Ево примера:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n = 12487\n", "n //= 10\n", "n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ето: \"откинули\" смо последњу цифру броја *n*. Да пробамо још једном:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n //= 10\n", "n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ради!\n", "\n", "Дакле, у сваком пролази кроз петљу броју *n* (крволочно) \"откинемо\" по једну цифру, па када падне на нулу знамо да смо му откинули све цифре, и тако смо сигурни да смо их све и пребројали.\n", "\n", "Да проверимо функцију:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "prebroj_cifre(12487)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Важна напомена.** Подсетимо се да уграђена функција `len` одређује број елемената у низу. Она се може испрограмирати овако (мада је, наравно, увек ефикасније позвати уграђену функцију):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def duzina_niza(niz):\n", " broj = 0\n", " for x in niz:\n", " broj += 1\n", " return broj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.2. Збир елемената низа\n", "\n", "Често је потребно сабрати елементе неког низа бројева, што можемо урадити следећом Пајтон функцијом:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def saberi(L):\n", " zbir = 0\n", " for x in L:\n", " zbir += x\n", " return zbir" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Функција `saberi` прими низ бројева који треба сабрати и ради овако.\n", "\n", "1. Променљива `zbir` ће полако акумулирати збир. Пошто још нисмо кренули са сабирањем, постављамо њену вредност на 0.\n", "2. Наредбом `for x in L:` пролазимо кроз низ `L` тако што променљива `x` редом узима вредности које су наведене у низу. Тако постижемо да елементе низа, један по један, додајемо на збир `zbir`.\n", "3. На крају враћамо вредност променљиве `zbir` као резултат рада функције.\n", "\n", "Да погледамо како функција ради:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "saberi([3,1,2,4,9,0,-6])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Пример.** Милица добија џепарац који је сваког месеца исти. За следећи месец Милица је испланирала низ трошкова. Написати Пајтон функцију `dzeparac_je_dovoljan` која проверава да ли ће Милица моћи да својим џепарцем покрије све планиране трошкове. Функција треба да прими два податка: висину њеног џепарца и списак трошкова, и треба да испише поруку о томе да ли су њени планови реални. Функција не враћа никакву вредност.\n", "\n", "На пример,\n", "\n", " dzeparac_je_dovoljan(1500, [250, 500, 100, 100, 100, 100, 100])\n", "\n", "треба да испише:\n", " \n", " Dzeparac je dovoljan\n", "\n", "док\n", " \n", " dzeparac_je_dovoljan(1500, [250, 500, 200, 300, 100, 100, 100])\n", "\n", "треба да испише:\n", " \n", " Dzeparac NIJE dovoljan\n", "\n", "*Решење.*" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def dzeparac_je_dovoljan(dzeparac, troskovi):\n", " ukupni_troskovi = saberi(troskovi)\n", " if dzeparac >= ukupni_troskovi:\n", " print(\"Dzeparac je dovoljan\")\n", " else:\n", " print(\"Dzeparac NIJE dovoljan\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Да видимо како функција ради:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dzeparac_je_dovoljan(1500, [250, 500, 200, 300, 100, 100, 100])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Важна напомена.** Подсетимо се да уграђена функција `sum` одређује збир елемената у низу, попут функције `saberi` који смо видели раније. Наравно, увек је ефикасније позвати уграђену функцију него нашу функцију." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.3. Просек елемената низа\n", "\n", "Да се подсетимо, *просек* низа бројева се рачуна овако:\n", "\n", "$$\n", " \\hbox{просек низа } [x_1, x_2, \\dots, x_n] = \\frac{x_1 + x_2 + \\dots + x_n}{n}.\n", "$$\n", "\n", "Дакле, да бисмо добили просек низа бројева саберемо све елементе низа и тако добијени број поделимо дужином низа.\n", "\n", "У Пајтону се обе ове активности могу обавити позивом одговарајуће уграђене функције: функција `len` рачуна дужину низа, док\n", "функција `sum` рачуна збир елемената низа бројева.\n", "\n", "Како ћемо у много наврата рачунати просек, дефинисаћемо нову функцију која га рачуна:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def prosek(L):\n", " return sum(L) / len(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Пример.** Мирко из музичког има 5, 4, 5 и још једну оцену која се не види јер се преко ње разлило мастило. Просек његових оцена из музичког је 4. Која је то оцена преко које се разлило мастило?\n", "\n", "*Решење.* Пробаћемо разне могућности:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "prosek([5,4,5,5])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "prosek([5,4,5,4])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "prosek([5,4,5,3])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "prosek([5,4,5,2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ето одговора! Оцена која се не види је 2." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.4. Задаци" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задатак 1.** Написати Пајтон функцију `broj_pozitivnih` која утврђује колико у датом низу има позитивних бројева. На пример,\n", "\n", " broj_pozitivnih([2, -1, 3, 0, -5, 1, 9])\n", "\n", "треба да врати 4." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задатак 2.** Написати Пајтон функцију `broj_prestupnih` која прими две године и утврди колико преступних година има у наведеном интервалу. На пример,\n", "\n", " broj_prestupnih(1987, 2019)\n", " \n", "треба да врати 8. У томе ти може помоћи следећа функција која проверава да ли је година преступна:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def prestupna_godina(g):\n", " if g % 400 == 0 or (g % 100 != 0 and g % 4 == 0):\n", " return True\n", " else:\n", " return False" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задатак 3*.** Написати Пајтон функцију `prebroj_max` која утврђује колико пута се у датом низу бројева појављује највећа вредност низа." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задатак 4*.** Дресирани жабац се налази на ливади. Када добије команду \"s\" он скочи један метар на север; када добије команду \"j\" он скочи један метар на југ; када добије команду \"i\" он скочи један метар на исток; а када добије команду \"z\" он скочи један метар на запад.\n", "\n", "Написати Пајтон функцију `skoci_zabac` која прима низ команди и онда утврђује да ли се жабац након извршеног низа команди вратио у тачку са које је кренуо. На пример,\n", "\n", " skoci_zabac([\"s\", \"z\", \"j\", \"i\", \"j\", \"i\", \"j\", \"s\", \"s\", \"z\", \"i\", \"z\"])\n", "\n", "треба да испише\n", "\n", " Zabac se vratio kuci\n", "\n", "док\n", "\n", " skoci_zabac([\"s\", \"i\", \"j\", \"i\", \"j\", \"i\", \"j\", \"s\", \"s\", \"z\", \"i\", \"z\"])\n", "\n", "треба да испише\n", "\n", " Zabac se nije vratio kuci" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задатак 5*.** Написати Пајтон функцију `zbir_cifara` која рачуна збир цифара датог позитивног целог броја. На пример,\n", "\n", " zbir_cifara(12487)\n", " \n", "треба да врати 22." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задатак 6.** *Судбински број* неке особе се добија овако:\n", "\n", "1. Запишемо датум рођења те особе као један низ цифара, на пример: 15. мај 2001. $\\to$ 15052001\n", "2. Саберемо цифре тог броја.\n", "3. Ако смо добили једноцифре број, то је судбински број особе.\n", "4. Ако нисмао добили једноцифрен број, саберемо цифре добијеног броја, и тако све док не добијемо једноцифрен број.\n", "\n", "*(а)* Израчунај свој судбински број користећи функцију `zbir_cifara` из претходног задатка.\n", "\n", "*(б)* Напиши функцију `sudbinski_broj` рачуна судбински број неке особе.\n", "\n", "**Важна напомена!** Ово је само вежбица из програмирања у Пајтону. Немојте придавати никакав значај добијеном броју! Нумерологија је изашла из моде пре око хиљаду година." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задатак 7.** Милан у дневнику има неколико оцена из информатике. Напиши Пајтон функцију `koliko_do_odlicnog_uspeha` која прима низ Миланових оцена и онда одређује колико петица Милан треба да добије из информатике да би наставник морао да му закључи 5. (Према Правилнику о оцењивању, наставник мора да закључи оцену 5 ученику чији просек оцена је барем 4,50.)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }