$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

2. Бројачи и суме

У овој глави

  1. уводимо појам бројача,
  2. показујемо како се рачунају суме, и
  3. то знање примењујемо на проблем рачунања просека низа бројева.

2.1. Бројач

Често је потребно да пребројимо колико у низу има елемената који имају неку особину. Стандардни начин да се ова врста проблема реши је да се једна променљива задужи за посао бројања и онда се она зове бројач.

Пример. Написати Пајтон функцију prebroj_petice која у датом списку оцена броји петице. На пример,

prebroj_petice([3, 1, 5, 4, 5, 2, 5])

треба да врати

3

зато што наведени списак оцена садржи три петице.

Решење.

In [1]:
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 [2]:
prebroj_petice([3, 1, 5, 4, 5, 2, 5])
Out[2]:
3

Пример. Написати Пајтон функцију prebroj_ocene која броји колико пута се у датом списку оцена појављује дата оцена. На пример,

prebroj_ocene([3, 1, 5, 4, 5, 2, 5], 4)

треба да врати

1

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

Решење.

In [3]:
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 [4]:
def prebroj_cifre(n):
    br_cif = 0
    while n > 0:
        br_cif += 1
        n //= 10
    return br_cif

Идеја програма је следећа.

све док број "има још цифара":
    увећај број цифара за 1
    "откини" последњу цифру броја

Условом n > 0 проверавамо да ли је остала још нека цифра у броју, док командом n //= 10 "откинемо" последњу цифру броја. Ево примера:

In [5]:
n = 12487
n //= 10
n
Out[5]:
1248

Ето: "откинули" смо последњу цифру броја n. Да пробамо још једном:

In [6]:
n //= 10
n
Out[6]:
124

Ради!

Дакле, у сваком пролази кроз петљу броју n (крволочно) "откинемо" по једну цифру, па када падне на нулу знамо да смо му откинули све цифре, и тако смо сигурни да смо их све и пребројали.

Да проверимо функцију:

In [7]:
prebroj_cifre(12487)
Out[7]:
5

Важна напомена. Подсетимо се да уграђена функција len одређује број елемената у низу. Она се може испрограмирати овако (мада је, наравно, увек ефикасније позвати уграђену функцију):

In [8]:
def duzina_niza(niz):
    broj = 0
    for x in niz:
        broj += 1
    return broj

2.2. Збир елемената низа

Често је потребно сабрати елементе неког низа бројева, што можемо урадити следећом Пајтон функцијом:

In [9]:
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 [10]:
saberi([3,1,2,4,9,0,-6])
Out[10]:
13

Пример. Милица добија џепарац који је сваког месеца исти. За следећи месец Милица је испланирала низ трошкова. Написати Пајтон функцију 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 [11]:
def dzeparac_je_dovoljan(dzeparac, troskovi):
    ukupni_troskovi = saberi(troskovi)
    if dzeparac >= ukupni_troskovi:
        print("Dzeparac je dovoljan")
    else:
        print("Dzeparac NIJE dovoljan")

Да видимо како функција ради:

In [12]:
dzeparac_je_dovoljan(1500, [250, 500, 200, 300, 100, 100, 100])
Dzeparac NIJE dovoljan

Важна напомена. Подсетимо се да уграђена функција sum одређује збир елемената у низу, попут функције saberi који смо видели раније. Наравно, увек је ефикасније позвати уграђену функцију него нашу функцију.

2.3. Просек елемената низа

Да се подсетимо, просек низа бројева се рачуна овако:

$$ \hbox{просек низа } [x_1, x_2, \dots, x_n] = \frac{x_1 + x_2 + \dots + x_n}{n}. $$

Дакле, да бисмо добили просек низа бројева саберемо све елементе низа и тако добијени број поделимо дужином низа.

У Пајтону се обе ове активности могу обавити позивом одговарајуће уграђене функције: функција len рачуна дужину низа, док функција sum рачуна збир елемената низа бројева.

Како ћемо у много наврата рачунати просек, дефинисаћемо нову функцију која га рачуна:

In [13]:
def prosek(L):
    return sum(L) / len(L)

Пример. Мирко из музичког има 5, 4, 5 и још једну оцену која се не види јер се преко ње разлило мастило. Просек његових оцена из музичког је 4. Која је то оцена преко које се разлило мастило?

Решење. Пробаћемо разне могућности:

In [14]:
prosek([5,4,5,5])
Out[14]:
4.75
In [15]:
prosek([5,4,5,4])
Out[15]:
4.5
In [16]:
prosek([5,4,5,3])
Out[16]:
4.25
In [17]:
prosek([5,4,5,2])
Out[17]:
4.0

Ето одговора! Оцена која се не види је 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 [ ]: