Основне аритметичке операције и примена

Рачунар или компјутер (енгл. computer) је справа која рачуна тј. справа која је направљена тако да може веома брзо и ефикасно да изводи рачунске операције над бројевима. Рачунање се назива и аритметика (од грчке речи ἀριθμός тј. аритмос која значи број, бројање, рачунање), а рачунске операције се називају и аритметичке операције.

Сабирање, одузимање, множење

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

  • Основна аритметичка операција је сабирање. Збир бројева 3 и 5 се у математици представља као 3 + 5. У програмском језику Python користи се готово идентичан запис 3 + 5.
  • Поред сабирања можемо разматрати одузимање. Разлика бројева 8 и 2 се у математици представља као 8 - 2. У програмском језику Python користи се готово идентичан запис 8 - 2.
  • Још једна од основних операција је и множење. Производ бројева 4 и 6 се у математици представља као 4 · 6. У програмском језику Python множење се означава помоћу оператора * и производ бројева 4 и 6 се записује као 4 * 6.

Програмски језик Python, наравно, уме и да дели, да израчунава остатак при дељењу и цео део количника и много штошта друго. О овим операцијама ћемо говорити на неком од наредних часова.

Приметимо да смо око оператора куцали размаке (на пример, 3 + 5, 8 - 2 или 4 * 6). Ти размаци нису неопходни и исправно је написати и 3+5 или 4*6. Програмери воле да куцају размак око сваког оператора (знака операције) да би добили текст програма који лепше изгледа и који се лакше може прочитати.

Ако на свом рачунару покренеш интерпретатор за програмски језик Python, вредност неког израза (на пример, 3 + 5 или 4 * 6) можеш израчунати тако што тај израз просто укуцаш (иза знакова >>>) и притиснеш тастер Enter. На пример,

Python 3.4.3 (default, Mar 26 2015, 22:03:40)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 3 + 5
8
>>> 4 * 6
24

Међутим, за вежбу ти чак није потребно да инсталираш Python на свом рачунару, већ програме можеш уносити и у поља која се налазе на страницама овог интерактивног уџбеника. У та поља се уносе комплетни програми (додуше, они ће у почетку бити прилично кратки) и стога, да би се одштампала вредност неког израза, рачунару мораш некако рећи да он ту вредност одштампа. Штампај се на енглеском језику каже print, па се онда вредност израза може добити на следећи начин.

Подесили смо да се овај програм покрене чим се ова страница учита и са десне стране можеш видети резултате његовог израчунавања (одштампане бројеве 8 и 24).

Пробај сада да прилагодиш претходни програм тако да исписује разлику бројева 174 и 83 и производ бројева 24 и 36. Када направиш измене програм покрени дугметом Покрени програм. Ако је све урађено како треба, требало би да видиш резултате 91 и 864.

Сложени изрази, приоритет оператора и заграде

Некада је потребно да решавамо задатке који укључују више рачунских операција и тада можемо користити сложеније изразе, потпуно исто како смо навикли у математици. На пример, посматрајмо следећи задатак који је преузет из једне збирке задатака из математике.

Израчунај производ збира бројева 874 и 437 и разлике бројева 915 и 364.

Уз помоћ рачунара можеш веома једноставно решити овај задатак (чак једноставније него помоћу дигитрона тј. калкулатора). Једино је важно да умеш исправно да запишеш израз којим се тражено израчунавање изражава. У математици би се одговарајући израз записао као (874+437)·(915-364). Ако се сетиш да се множење изражава знаком * и ако ти кажемо да у програмском језику Python можеш употребљавати заграде на исти начин као у математици, онда ти је јасно да претходни математички задатак можеш лако решити тако што употребиш израз (874 + 437) * (915 - 364), тј. наредни програм (притисни дугме Покрени програм да би се програм извршио).

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

Уради наредни тест да провериш да ли си потпуно разумео/разумела досадашње излагање.

    Q-137: Која је вредност израза 5 + 5 * 5?
  • (A) 15
  • Знак ``+`` означава сабирање, а знак ``*`` множење.
  • (B) 30
  • Тачно!
  • (C) 50
  • Обрати пажњу и на приоритет операција (исти је као и у математици).
  • (D) 125
  • Знак + означава сабирање, а знак * множење.

    Q-138: Која је вредност израза (5 + 5) * 5?
  • (A) 15
  • Знак ``+`` означава сабирање, а знак ``*`` множење.
  • (B) 30
  • Обрати пажњу на то да прво треба да израчунаш оно што је у заградама.
  • (C) 50
  • Тачно!
  • (D) 125
  • Знак + означава сабирање, а знак * множење.

    Q-139: Који од наредних програма израчунава и исписује производ разлике бројева 184 и 72 и разлике бројева 273 и 194.
  • (A) print((184 + 72) * (273 - 194))
  • Обрати пажњу на то шта је збир, а шта разлика.
  • (B) print((184 - 72) * (273 - 194))
  • Тачно!
  • (C) (184 - 72) * (273 - 194)
  • Да би програм исписао резултат, мораш користити print.
  • (D) print(184 - 72 * 273 - 194)
  • Обрати пажњу на приоритет операција. Да ли ти требају заграде?

Променљиве - имена међурезултата

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

Збиру смо доделили име zbir, разлици име razlika, а производу име proizvod (уместо zbir и razlika могли смо, на пример, користити и имена prvi_cinilac, drugi_cinilac). Иако се на овај начин добија програм који мало дужи него полазни, он је мало разумљивији, јер се његовим читањем може јасно видети да се прво тражи израчунавање збира, затим разлике и затим њиховог производа. То се десило пре свега захваљујући пажљивом одабиру имена која смо употребили и веома је важно у програмима користити имена која читаоцу програма дају назнаке шта тај програм заправо израчунава. Рачунар једнако успешно извршава програм, ма која имена да употребиш. Ипак, имај на уму да програме читају и људи који те програме пишу, исправљају и дорађују, а њима је прилично важно да текст програма лако разумеју. У већини случајева си читалац програма управо ти, тако да давањем илустративних имена променљивима данас помажеш заправо себи у будућности.

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

Рецимо да постоје и нека правила која се односе на имена (каже се и идентификаторе) која можемо користити. Прво, постоји разлика између великих и малих слова и није исто да ли смо употребили zbir или Zbir. Препоручује се да у именима користимо само слова енглеске абецеде (тзв. ошишану латиницу), бројеве и подвлака (симбол _) који ћемо користити да повежемо више речи у једно име. У именима не можемо користити размаке, зарезе и слично, нити име можемо започети цифром. Дозвољена имена су, на пример, x, obim, drugi_sabirak, broj_sekundi, a2, а недозвољена су, на пример, 3d_grafika (јер почиње цифром), prvi sabirak (јер садржи размак) и jezik_c# (јер садржи недозвољени знак #).

    Q-140: Шта од наведеног може бити исправно име променљиве у језику Python? Означи све тачне одговоре.
  • (A) xyZ
  • Било која комбинација слова је у реду.
  • (B) Indijana_Dzons_3
  • Подвлаке се могу користити да повежу више делова у целину.
  • (C) 3stvari
  • Цифра не сме бити први карактер.
  • (D) zdravo-svima
  • Цртице се не смеју користити у склопу имена (цртица тј. минус заправо означава одузимање).

Задаци

Технике које смо до сада научили довољне су нам да бисмо решили велики број математичких задатака. Размотримо неколико.

Смедеревска тврђава

Смедеревска тврђава има облик троугла страница 550m, 502m и 400m. Колики је обим тврђаве (када шеташ око тврђаве, колико ћеш метара прећи)?

_images/smederevska_tvrdjava.jpg

Провери да ли је твој програм израчунао тачан резултат.

Обим Смедеревске тврђаве је Сабери дужине страница!

Воћњак са јабукама

Пера је засадио 380 стабала јабуке. Ђура је засадио 142 стабла јабука више од Пере, а Мика је засадио два пута више од Пере. Колико су стабала засадили заједно?

_images/vocnjak.jpg

Притисни сада дугме Корак по корак. Оно ти пружа могућност да програм извршаваш корак по корак. Дугметом Forward извршаваш наредну наредбу (ону обележену црвеном стрелицом). Наредба која је претходно извршена обележена је светло-плавом стрелицом. У делу Frames можеш видети вредности свих до сада израчунатих резултата, док у прозору тога можеш видети излаз програма (резултате одштампане наредбом print).

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

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

Марко је прочитао књигу за три дана. Другог дана је прочитао 17 страна више него првог, а трећег два пута више него другог. Колико та књига има страна?

Река Морава

Велика Морава је дугачка 185km и настаје од Јужне Мораве која је 90km дужа, и Западне Мораве која је 123km дужа од ње. Колика је укупна дужина ове три реке?

_images/morava.jpg

Стефан Немањић је постао краљ Србије 1217 и владао је 11 година. После њега је Радослав владао до 1234. година, па Владислав који је владао 9 година и предао престо брату Урошу Првом који је владао до 1276. У којим временским периодима су владали ови српски краљеви?

Исправи претходни програм тако да исправно израчуна периоде у којима су владали краљеви. Ако све урадиш како треба добићеш следеће резултате:

Стефан: 1217 - 1228
Радослав: 1228 - 1234
Владислав: 1234 - 1243
Урош: 1243 - 1276

Приметимо да смо у претходном задатку додали испис имена краљева и цртица између почетка и краја њихове владавине, тако што смо тај текст који смо желели да се испише ставили под знаке навода (нпр. навели смо "Стефан: "). О раду са текстом ће више речи бити касније.

Приметимо да смо текст исписивали ћириличким писмом. У језику Python од верзије 3 можемо слободно користити знакове различитих писама. Чак је било могуће и имена променљивих написати ћирилицом, међутим, то некада може довести до проблема (ако се, на пример, едитор текста који се користи да се програм откуца не подеси адекватно), тако да ћемо за сваки случај имена променљивих увек писати латиницом, без коришћења српских слова (š, ž, č, ...).

Године маме и тате

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

        Q-141: Поређај делове кода тако да представљају исправно решење овог задатка.milica = 4
---
mama = 7 * milica
tata = 8 * milica
---
razlika = tata - mama
---
print(razlika)

Фудбалски терен

Дужина фудбалског терена је 115 метара, а ширина 80 метара. Ана трчи по правоугаоној стази која је са сваке стране терена споља удаљена по 5 метара. Колико она претрчи, ако се зна да је оптрчала терен 3 пута.

_images/teren.jpg

Ана претрчи троструку дужину обима стазе. Да бисмо израчунали обим стазе потребно је да израчунамо њену дужину и ширину. Стаза је 10 метара дужа од терена (по 5 метара са сваке стране), и 10 метара шира од терена (по 5 метара са сваке стране). Обим је једнак двострукој вредности збира дужине и ширине, па задатак можемо решити на следећи начин.

Овај програм коректно израчунава претрчан пут, међутим, има неколико недостатака. Прво, неке величине смо рачунали у глави, уместо да препустимо рачунару да их израчуна (на пример, 125 смо добили као 115 + 2·5), чиме смо себи створили непотребан посао и што је још важније, увели у програм могуће рачунске грешке (за разлику од рачунара који у рачуну не греше баш никада, људи у рачуну често греше). Даље, читајући текст програма није баш јасно зашто се резултат добија баш на начин на који је то урађено у програму. Такође, овакав програм није потпуно једноставно изменити. Размислимо шта би се десило када би се улазни подаци мало променили, тј. када би бисмо посматрали терен дугачак 110 метара, широк 80 метара и стазу која је на растојању 10 метара од терена. Да бисмо изменили програм, потребно би било да поново напамет израчунамо дужину и ширину стазе, што је непотребно компликовано.

Наредни програм је мало бољи од претходног, али и даље је неразумљив, а да бисмо га променили морамо бити пажљиви и улазне податке изменити на свим местима (на пример, број 5 је потребно заменити два пута).

Погледајмо сада мало другачије решење истог задатка.

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

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

На крају, можемо направити програм који ће при свом покретању питати корисника да унесе одговарајуће податке. Тако наш програм постаје програм који не решава само један одређен задатак, већ целу породицу задатака истог облика, а у којима се разликују бројеви (улазни подаци). Један начин да се затражи од корисника да унесе неки број је да се у програму наведе broj = int(input("Unesi broj:")). Уместо променљиве broj, наравно, унети број може да се запамти у било којој другој променљивој. Такође, порука може бити сликовитија и текст Unesi broj између двоструких наводника је могуће променити (на пример, користићемо текст Unesi dužinu terena:). Погледајмо сада како изгледа такав програм.

Покушај сада да измениш претходни програм тако што ћеш претпоставити да Ана трчи по правоугаоној стази удаљеној неколико метара од ивице, али на унутра. Претпостави да су познате дужина и ширина терена (duzina_terena, sirina_terena), растојање стазе од ивице терена (rastojanje), као и број кругова које треба да претрчи (broj_krugova). Измени само редове који су обележени, а остало не дирај. Ако све урадиш како треба, након покретања програма (дугметом Покрени програм) и аутоматског тестирања сва поља ће бити зелене боје.

Ево једног начина да се дође до тачног решења.

На крају, ево још један веома сличан задатак који ти остављамо да покушаш да решиш потпуно самостално.

У средини собе квадратног облика се налази тепих. Ако је позната димензија собе у метрима, удаљеност тепиха од зидова, и цена прања по једном квадратном метру тепиха, израчунај цену прања целог тепиха.

Када га покренеш и унесеш бројеве 5, 1 и 15 треба да добијеш резултат 240.

Положај лика у игрици

Програмираш игрицу Super Mario и потребно је да одредиш позицију на којој ћеш приказати слику корњачице. Видљиви део екрана широк је 500 пиксела, а висок 250 пиксела. Примети да корњача стоји на стази која је направљена од квадратних блокова који су величине 50 пута 50 пиксела. На почетку стазе се налази део блока који је широк 20 пиксела. Корњача стоји на петом блоку са леве стране (када се не рачуна почетни блок, који се не види цео). Одреди на којој позицији се налази доњи леви крај корњаче (одреди колико пиксела је та тачка удаљена од леве ивице екрана и колико је пиксела удаљена од горње ивице екрана).

_images/mario.jpg

Удаљеност доњег левог угла корњаче од леве ивице екрана (њену координату x) можемо израчунати тако што саберемо ширину првог блока од 20 пиксела и четири ширине целих блокова тј. можемо израчунати као 20 + 4 * 50. Удаљеност дна корњаче од врха екрана можемо израчунати тако што од висине екрана одузмемо висину блока на којем корњача стоји тј. као 250 - 50.

Приметимо да смо у претходном програму исписали два броја у истом реду тако што смо их оба навели унутар print(...), раздвојене зарезом. Могуће је исписати и више вредности помоћу наредбе облика print(v1, v2, ..., vn).

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

Позиви на концерт

Мирјана и Лидија певају у истом хору и припремају се за концерт. Мирјана има 245 пријатеља на једној друштвеној мрежи, док их Лидија има 218. Када је Мирјана погледала Лидијин профил, видела је да имају 114 заједничких пријатеља. Ако би и једна и друга позвале све своје пријатеље са те друштвене мреже на концерт, колико различтих људи би добило тај позив.

Скуп људи који ће добити позив на концерт можемо поделити на скуп Мирјаниних пријатеља који нису уједно и Лидијини, на скуп Лидијиних пријатеља који нису уједно и Мирјанини и на скуп њихових заједничких пријатеља (ова три скупа су дисјунктна тј. не постоји ни један пријатељ који је члан више ових скупова). На основу датих података можемо израчунати колико Мирјана има пријатеља који нису уједно и Лидијини пријатељи (као разлику укупног броја Мирјаниних пријатеља и броја њихових заједничких пријатеља). Слично можемо израчунати и број Лидијини пријатеља који нису уједно и Мирјанини пријатељи. Пошто су три описана скупа дисјунктна, yкупан број људи који ће бити позвани на концерт је збир ова два броја и броја заједничких пријатеља који нам је од почетка познат.

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

Формула коју смо применили у овом задатку назива се формула укључења-искључења и она каже да за било која два скупа A и B важи да је |A ∪ B| = |A| + |B| - |A ∩ B|.

Фудбалери и кошаркаши

У одељењу има 15 дечака и сви они тренирају или фудбал или кошарку. Ако се зна да фудбал тренира 10 ученика, а кошарку тренира 8 ученика колико је дечака који тренирају оба спорта?

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ф ф ф ф ф ф ф ф ф ф          
              к к к к к к к к

Уместо нуле упиши израз којим можемо да израчунамо број дечака који тренирају два спорта. Када се програм покрене тестираће се на три тест-примера. Тест-примери на којима програм даје тачан резултат биће обележени зеленом бојом, а они на којима се добија нетачан резултат биће обележени црвеном бојом. Ако се сва три примера обележе зелено, значи да је веома вероватно да је твоје решење тачно.

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

dva_sporta = (fudbal + kosarka) - ukupno_decaka

Цели и реални бројеви

До сада смо у задацима користили само природне бројеве. Језик Python подржава и рад са целим бројевима и они се записују на исти начин као у математици. На пример, вредност израза 3 - 8 је -5 док је вредност израза (-3) - (-8) број 5.

Реалне бројеве је такође веома једноставно користити, једино што се уместо децималног зареза на који смо навикли у математици мора користити децимална тачка. Тако се, на пример, број 2,5 записује као 2.5.

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

Куповина намирница

Марко је купио 0,45 kg саламе, 0,25 kg сира и два паковања од по 0,3 kg шунке. Колико је тешка кеса коју носи кући?

Бајкалско језеро

Бајкалско језеро у Русији је најдубље језеро на свету. Оно је криптодепресија јер се његово дно (најнижа тачка) налази на 1,181 километара испод нивоа мора, а површина му се налази на 456 метара надморске висине. Израчунај његову највећу дубину у метрима.

_images/kriptodepresije.png

Криптодепресија је удубљење испуњено водом, чија је површина изнад нивоа мора, а дно испод нивоа мора. Потиче од грчке речи крипто, што значи скривен или тајан, и речи депресија, што у географији представља израз за предео нижи од нивоа површине мора. Криптодепресије су углавном језера. Највећа криптодепресија на свету је управо Бајкалско језеро, а у Европи је то језеро Ладога. На Балканском полуострву највећа криптодепресија је Скадарско језеро на граници Црне Горе и Албаније. Криптодепресије обично настају када се раседи и расцепи у земљиној кори испуне водом.

Банковни рачун

Ђура је уплатио летовање пре него што је добио плату и ушао је у тзв. дозвољени минус тј. након те уплате дуговао је банци 12.376,5 динара. Три дана касније на рачун му је уплаћена плата од 43.386,9 динара. Колико му је тада било стање на рачуну.

Допуни наредни програм тако да коректно решава тражени задатак

Након покретања, програм треба да испише вредност 31010.4.