$$ \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.

Предлог пројекта – Калкулатор

Мотивација

Од ове школске године у рачунању не користиш више само природне, него и целе и децималне бројеве. Вероватно сада чешће користиш калкулатор, или програм калкулатор на телефону или рачунару. Шта мислиш колико је тешко да се направи програм калкулатор?

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

Сценарио пројекта

Основни сценарио је прилично очигледан – на позорници имамо дугмад као на калкулатору и једну видљиву променљиву, која има улогу екрана калкулатора. Кликовима на дугмад уносимо бројеве и операције, а на екрану видимо шта је унето. После притиска на знак = на екрану видимо резултат.

_images/kalkulator_scena.jpg

Разрађивањем детаља долази се до различитих варијанти овог основног сценарија:

  • Наш калкулатор може, а не мора да има дугме C за брисање свега унетог.

  • Наш калкулатор може, а не мора да има дугме ± за мењање предзнака броја.

  • Наш калкулатор може, а не мора да има дугме за брисање последњег унетог знака. То дугме може да допушта брисање само цифара или и цифара и знакова операција.

Даље, треба дефинисати како желимо да се програм понаша када се после уноса нпр. 2+2 покуша унос нове операције, нпр. +. У таквој ситуацији програм може:

  • да игнорише унос операције, а да допушта само наставак уноса броја или унос знака =

  • да израчуна оно што је претходно унето и омогући унос нове операције. На пример, ако се унесе 2+2+, у том тренутку изглед екрана се мења у 4+.

  • да настави прихватање уноса, да би касније поштовао приоритет рачунских операција. На пример, ако се настави са уносом и унесе 2+2+2*3=, да се тек тада садржај екрана замени са 10 (а не са 18, што би се добило простим рачунањем слева на десно). Ову варијанту је могуће направити, али ти је не предлажемо јер је њу знатно теже остварити од претходно набројаних варијанти.

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

унос        садржај екрана
2           2
3           23
+           23+
2           23+2
*           25*
3           25*3
=           75
±           -75
+           -75+
2           -75+2
=           -73
±           73

Анализа и планирање

Ликови

Имаћемо по један лик за сваку цифру, за децималну тачку и за сваки од знакова C, =, +, -, X, :, ±. Сви овим ликовима можемо (а не морамо) да додамо један лик који ће на почетку програма да постави почетне вредности променљивих. У случају да не желимо додатни лик, ову иницијализацију може да обави било који од наведених ликова, нпр. лик C.

Променљиве

Свакако нам је потребна пороменљива која представља екран и која ће бити приказивана на позорници током рада програма.

Да бисмо што једноставније могли да обављамо рачунање током уноса, најзгодније је да имамо још бар три променљиве: једну за операцију и две за бројеве над којима се та операција извршава. Према томе, за сада планирамо променљиве

  • текући број

  • операција

  • претходни број

  • екран

Понашање ликова (скрипте)

Када се покрене програм, један од ликова треба да постави све ове променљиве на “празно”. Лик C ради то исто када се кликне на њега.

Сваки лик који представља цифру само треба да допише одговарајућу цифру на текући број и екран када се кликне на тај лик. Исто важи и за лик децималне тачке. Например, Лик цифре 5 ради следеће:

_images/kalkulator_skripta_lik_5.png

Лик операције (+, -, X, :) треба прво да провери да ли је нека операција већ унета раније. Ако јесте, онда прво треба израчунати оно што је до сада унето. Да се скрипта за рачунање не би појављивала на више места, ликови операција могу да у овом случају разгласе поруку израчунај, на коју ће да реагује лик =.

Када се све претходно унето по потреби замени једним бројем, ту вредност треба запамтити као претходни број, а нову операцију као операција. Текући број треба тек да буде унет након операције, па његову тренутну вредност треба поништити. На крају скрипте, знак операције треба да се појави и на екрану. Према томе, скрипта за лик + би могла да изгледа овако:

_images/kalkulator_skripta_lik_plus.png

За лик = смо већ рекли да треба да реагује на поруку израчунај. Реакција се састоји у томе да се провери да ли је задата операција сабирање, па ако јесте, да се екран замени са претходни број + текући број.

_images/kalkulator_skripta_lik_jednako_deo1.png

Слично треба урадити и за одузимање, множење и дељење.

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

_images/kalkulator_skripta_lik_jednako_deo2.png

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


Преостаје нам још лик ±. Употребу овог дугмета ћемо допустити само у случају када је на екрану један број. У противном (када је на екрану већ израз) није јасно шта би био смисао клика на ово дугме.

Према томе, Када се кликне на лик ±, он прво треба да провери да ли је на екрану само један број, тј. да ли је екран = текући број. Ако је тако, онда или треба дописати знак - испред броја ако није већ дописан, или (ако број почиње знаком -) треба уклонити почетни минус из текућег броја и са екрана.

_images/kalkulator_skripta_lik_plus_minus.png

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

Самоевалуација

Када направиш програм, покушај да (пре свега себи) одговориш на ова питања:

  • Да ли је, по твојој процени, пројекат успешно приведен крају? Колико си ти лично задовољан/задовољна урађеним? Зашто?

  • Који део је био посебно тежак? Како си га решио/решила? Да ли је постојао неки проблем чијим решавањем се посебно поносиш?

  • Да ли је било накнадних измена првобитног плана? Због чега?

  • Да ли је пројекат био користан за стицање или унапређивање неких знања или вештина? Којих?

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