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