{
 "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
}