You are on page 1of 165

ПРЕДГОВОР

Овај уџбеник написан је по Плану и програму за предмет Рачунарство и информатика за трећи


разред гимназије, а којим се предвиђа да се ученици упознају с програмирањем. Када се каже
програмирање, тај појам у овом уџбенику повезује се са програмирањем апликација под Windows
оперативним системом. То значи да се програмира са графичким корисничким интерфејсом, с
којим су се ученици срели још када су први пут на рачунару покренули неки програм за игрицу
или слично.
Није нимало лако из материјала наведеног у Плану и програму, с датим објашњењима како и
колико часова утрошити за поједине тематске целине, издвојити и репрезентовати оптималан
избор. С обзиром на дугогодишње искуство, циљ аутора је управо избор оптималних делова и
примера како би ученици што лакше савладали овај план и програм, и оспособити се за касније
самостално усавршавање.
Задаци имају поставку па упутство како се решавају и поступак за њихову имплементацију.
Посвећена је велика пажња алгоритмима, па је за већину задатака дат и алгоритам по ком је
решаван, а за неке и разне варијанте алгоритамских решења. Сваки задатак (апликација) тестирана
је, и тестови су илустровани сликама. Ученик може праћењем наставе и уз помоћ Уџбеника и
наставника у кабинету или код куће самоучењем успешно савладати овај наставни план и програм.
Аутор овде не може да укаже на време потребно за успешно савлађивање градива, али се ослања
на умешност наставника или таленат и упорност ученика.
Уџбеник могу користити и остали ученици који желе да се образују за професију програмера. За
професионално познавање програмирања, потребни су вишегодишње учење, практичан рад и
непрестана размена искустава с другим програмерима. Међутим, за оне који почињу да уче
програмирање, мишљења сам да ће овај уџбеник понудити основно почетно знање на бази ког се
касније може усавршавати.
Наведени примери су различити, математички, графички, а има и оних који су из практичне приме
не. Како се сваки од њих може назвати апликацијом, и како је комплетно спроведен поступак
њиховог пројектовања, ученик неће имати потребу да тражи било какву додатну подршку да би те
примере сам реализовао на рачунару. У уџбенику је урађено 98 апликација са илустрованим
сликама њиховог тестирања. Приказано је 86 различитих алгоритама коришћених у разне сврхе.
То је утицало на обимност уџбеника, али циљ аутора био је да се у Уџбенику нађе све што је
потребно за дате примере. Доста примера апликација је рађено по принципу да се на једној форми
да што више различитих захтева обраде. То неће сметати ни ученику а ни наставнику да сваки од
њих може појединачно реализовати и где ће се свака од обрада обављати на једној форми.
Уз уџбеник се испоручује и пратећи CD на коме се налазе неки примери задатака који су због
обимности комплетног упутства за њихову имплементацију на рачунару у уџбенику описани у
скраћеној варијанти, а затим и задаци за вежбање. Додатно на CD-у се налазе и три примера
апликација које се користе за оцењивање ученика из предмета Рачунарство и информатика са
комплетним програмским кодом, али без поступка како су они креирани.
Захваљујем рецензентима на пажљивој анализи рукописа и сугестијама које су допринеле
квалитету овог уџбеника.

У Београду 01. 09. 2014.

1
1. РЕШАВАЊЕ ПРОБЛЕМА ПРИМЕНОМ РАЧУНАРА

Рачунари се данас користе у научно-техничке сврхе, за пословну обраду података, писање разних
текстова, креирање графичких објеката, мултимедијалних садржаја, управљање производним
процесима, преношење и размену података по целој планети Земљи и ван ње, а имају и много
других практичних примена. Примена рачунара је нашла своје место у свим областима живота и
рада човека, у науци, техници, едукацији, медицини, банкарству, разним индустријским гранама,
производним делатностима и услугама, истраживањима свих врста, забави итд.
За решавање неког задатка помоћу рачунара потребно је познавати основне принципе
програмирања. Човек, који ништа не зна о рачунарима, поставља питање: Какву моћ има рачунар
када може да се примени у свим областима живота на разне начине? Човек има потребу и да
разуме на који начин рачунар има моћ да комуницира са човеком и пружи му све ове наведене
могућности.
Рачунар је нека врста машине која омогућава човеку да дође до свих наведених употребних
функција. Зна се да та машина не зна да говори као човек, али се можда не зна да и рачунар има
свој језик. Људи међусобно комуницирају користећи језик који разумеју, а језик се састоји од речи
које чине словни симболи (знакови или слова од којих се праве неке речи). Значи, човек за реч која
има неко значење користи словне симболе. На пример за реч рачунар користи словне знаке р а ч у
н а р.
Поставља се питање како човек комуницира са рачунаром. Рачунар има своју физичку реализацију
коју видимо голим оком, а назива се хардвер, а састоји се из много делова: матичне плоче,
процесора, оперативне меморије, спољашње меморије, графичке карте, монитора, тастатуре, миша
итд.
Да би се покренуо аутомобил и ставио на располагање човеку, мора имати погонско гориво које
покреће мотор, а човек мора да научи све операције које су потребне да би возио аутомобил. То
значи да мора да зна који се део за шта користи и како се користи. Како овде говоримо о рачунару,
човек, дакле, треба да научи како да користи рачунар за разне своје потребе. Рачунар, када
користимо у било коју сврху, троши електричну енергију. Човек треба да препозна неке основне
делове (не све) како би знао за шта који може да употреби. На пример: тастатуру и миша користи
као улазне уређаје да унесе неки податак или покрене неку команду, монитор или штампач
употребљава да види резултат неких рачунарских обрада и слично. Било би добро знати да обраду
података обавља централни процесор рачунарa (енгл. Central Processing Unit – скраћено CPU)
како би се одабрао одговарајући за потребе те обраде.
Хардверски делови рачунара нису довољни да би рачунар имао практичну примену. Компонента
софтвер (скуп разних програма), која се инсталира на рачунар, омогућава широку примену
рачунара. Софтвер чине разни програми, чија је сврха да управљају радом рачунара али и да
кориснику — човеку омогуће да обави неку жељену активност на рачунару. Прву групу програма
чине такозвани системски, док другу групу програма чине апликативни или кориснички, којима
човек обавља жељену активност на рачунару.
Када човек рачунаре користи за обављање неких послова – апликација (уноси текст, уређује
текстуалне и бројчане податке, креира графичке податке, слике, аудио-визуелне податке и слично)
и ако га не интересују детаљи како рачунари све то обављају, он се бави рачунарима само као
корисник. За корисника рачунара битно је да има рачунар и да зна за шта ће га и како употребити
у послу који обавља, за забаву или за неку другу примену. За то му је потребно да зна само неке
делове који су неопходни како би од рачунара добио оно што му је потребно.

2
Ако се човек стручно бави рачунарима, мора да разуме како рачунари раде, треба да има и
информације о томе како рачунар управља уређајима од којих је састављен, који је језик
споразумевања човека и рачунара, као и како се човек служи рачунаром кад су им језици
различити.
Као што људи користе словне симболе (писмо), од којих састављају речи с одређеним значењем
које човек разуме, и рачунар има своје речи, које се састављају само од два симбола и то 0 и 1.
Азбука или писмо рачунара назива се бинарна азбука. Речи се у рачунару састављају
комбинацијом та два знака у низ од најмање 8 знакова и рачунар препознаје и разуме то писмо и те
речи.
Комуникација људи с рачунаром остварује се путем команди. Тако човек може рачунару задати
команду да изврши неку конкретну акцију. Команда се може задати директно ако се зна како се
она позива или индиректно, неким програмом. Рачунар ће извршити команду.
Рачунар је машина, која се може програмирати да обавља конкретне задатке који имају практичну
примену. За реализацију програмирања на рачунару потребан је програм који пише програмер у
неком програмском језику (Pascal, Fortran, Algol, Cobol, PL/I, C, C++, JAVA, PHP, Perl, SWIFT
итд.).

РЕШАВАЊЕ ПРОБЛЕМА ПРИМЕНОМ РАЧУНАРА

Да би се неки проблем решио помоћу рачунара, односно да би се написао програм на рачунару


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

Анализа и дефинисање задатка (проблема)

За решавање било ког задатка рачунаром или без њега, потребно је да се задатак добро разуме
односно дефинише. У математици је то било постављање задатка, а друга фаза је била решавање
задатка.
Проблем који се решава коришћењем рачунара може дефинисати наручилац програма, јер он као
будући корисник програма углавном зна шта му је потребно. Наручилац, без обзира на то што зна
шта му је потребно, мора ангажовати људе који се баве пројектовањем програмских решења на
рачунару. Тако се формира тим људи, са једне стране од наручиоца а са друге стране од људи
стручних за пројектовање програмских решења. Tим дефинише проблем и формулише га језиком
којим се људи споразумевају. Да би се задатак добро разумео – дефинисао, потребна је детаљна
анализа.

3
Анализом проблема се дефинишу улазни и излазни подаци. Најпре се уочавају и издвајају битнe
чињенице и њихове карактеристике значајне за решавање задатка (разне функције, ограничења).
Тако издвојене чињенице сматрају се улазним подацима битним за решавање проблема. Такође је
потребно установити како су подаци међусобно повезани. Над издвојеним улазним подацима
дефинише се скуп операција које ће довести до траженог решења постављеног задатка. Решење
задатка се приказује скупом излазних података као резултата дејства примењених операција над
улазним подацима. Резултат анализе проблема се може свести на математичку формулацију
прилагођену за реализацију на рачунару.
У поступку пројектовања програма ова фаза се назива систем анализа, из које проистиче
пројектна документација с дефинисаним задатком и описом проблема који је јасан како наручиоцу
тако и стручњацима ИТ, који ће проблем касније реализовати на рачунару.
За пример обраде података с матурског испита наручилац програма могло би да буде
Министарство просвете. Ако Министрство просвете има сектор који се бави развојем и
одржавањем програма то ће они преузети његову реализацију на рачунару, док ће у супротном
ангажовати фирму за производњу програма.
Анализом задатка који треба да се уради издвајају се битни подаци за решавање задатка као што
су: име и презиме ученика, школа коју ученик тренутно похађа, предмети које полаже на матури,
максималан број бодова за сваки предмет, број бодова по сваком питању из конкретног предмета,
број бодова за успех ученика из претходног школовања, број додатних бодова за успех 5,00, број
бодова за посебна такмичења на којима је ученик заузео прво, друго или треће место као и
додатни бодови за ученике генерације. Сви ти подаци могли би се сматрати улазним подацима.
Следећа фаза била би дефинисање излазних података који се траже као решење овог задатка.
Излазни подаци настају као резултат обраде улазних података и могу се приказивати на неком
излазном уређају (монитору, штампачу итд.). Излазни подаци за овај задатак могли би да буду
разни прикази као што су:
 о свим матурантима који су полагали матуру са сумарним подацима из којих се види ранг листа
поређана по укупно освојеним поенима на свим полагањима из свих предмета, заједно с
додатним бодовима,
 о резултатима полагања матуре који се односе на сваки полагани предмет посебно,
 о матурантима који су освојили поене на разним такмичењима и тиме показали своје посебне
надарености,
 о матурантима вуковцима из претходног школовања и ученицима генерације,
 о поређењу успеха из претходног школовања с постигнутим резултатима на матури из свих
полаганих предмета,
 о поређењу оцена из предмета у претходном школовању с оценама из полаганих предмета, о
праћењу ефикасности полагања појединих предмета и свих заједно у поређењу с оценама из
претходног школовања,
 и многи други.
Могло би се закључити да је потребан програм који ће обезбедити унос података потребних у вези
с испитима који се полажу на матури, исправку и брисање истих и обраду података по јасно
дефинисаним критеријумима која ће омогућити приказивање резултата као излазних података.
Свакако да после ове фазе треба формирати одговарајућу пратећу документацију, која ће се
користити за будући рад у вези с датим проблемом.

4
Пројектовање решења

Пројектовање решења је дефинисање начина како ће се од почетних задатих улазних података


доћи до тражених резултата који се приказују као излазни подаци. Непотпуни или погрешно
препознати улазни подаци доводе до неисправног решења. Потребно је одабрати и дефинисати
начин на који ће се у алгоритму репрезентовати улазни и излазни подаци и тај део назива се опис
података. За сваки улазни и излазни податак уводи се идентификатор који га репрезентује а
идентификатору се додељује име које ће се користити у алгоритму. За име идентификатора се
користе симболи из природног језика. Имена се могу формирати без посебних ограничења од
словних и бројчаних симбола, и осталих знакова по избору као што су на пример: -, _, и слично.
При додељивању имена идентификатору препоручује се да име асоцира на проблем (задатак) који
се решава.
Да би се од улазних података добили резултати као излазни подаци, прво се дефинише које ће
операције над почетним издвојеним улазним подацима да се изврше, а затим се спецификује
поступак решавања посматраног задатка, односно одабира се алгоритам. Под алгоритмом се
може подразумевати коначан скуп строго формулисаних правила и поступака по тим
правилима за решавање одређеног проблема. Како се проблем може решити на више начина,
избор оптималног алгоритма је од великог значаја. Код једноставних проблема се избор
оптималног решења може занемарити, док код сложених проблема има велики значај. Сложеност
решења се може посматрати на основу броја операција које доводе до решења, односно време
потребно да се алгоритам изврши. Сложенија решења захтевају више меморијског простора да се
алгоритам изврши.
Овај део трансформације почетних улазних података у жељене излазне податке назива се обрада
података. Алгоритам приказује начин како се од улазних података дошло до тражених излазних
података.
На основу претходних радњи може се израдити програмски захтев (општа структура програма).
Сагледава се цео проблем и дели на логичке целине, при чему се свака целина може даље делити у
зависности од сложености. Он мора да буде јасан тиму стручњака за рачунаре, који ће на основу
њега одабрати одговарајући програмски алат за реализацију пројекта. У зависности од врсте
пројекта, бирају се одговарајући програмски језик, модел и организација података који ће описати
проблем и начин чувања и одржавања података и програма. По изради програмског захтева следи
акција имплементирања дефинисаног програмског захтева (програмирање и креирање података).
У овој фази утврђује се и начин како и где ће се чувати подаци, као и како ће се они заштитити, ко
ће одржавати и администрирати податке, која је рачунарска опрема потребна за проблем који се
решава и слично.
За пример полагања матурског испита у овој фази би се проблем поделио на логичке целине као
што су: унос исправка и брисање података, креирање разних упита, креирање разних извештаја и у
вези са тим разних обрада потребних за њихову реализацију. Пројектовање решења за програм
полагања матурског испита би у овој фази требало да добије модел и организацију података,
потребне описе података с дефинисаним детаљима, као што је тип података, њихова прецизност
(дужина), међусобна повезаност као и ограничења.
Полазећи од корисничких захтева јасно дефинисаних у фази анализе и дефинисања задатка у вези
са полагањем матурског испита, улазни подаци пролазе кроз одговарајућу обраду у којој настају
резултати који се приказују као излазни подаци. При томе треба водити рачуна о начину чувања и

5
заштите података. Није овде циљ да се уради пројектовање решења за програм полагања
матурског испита, али ће се описати улазни подаци који се односе на ученике и испите који се
полажу.
Опис улазних података за ученике:
1. шифра ученика,
2. име ученика,
3. презиме ученика,
4. име родитеља,
5. датум рођења,
6. адреса становања,
7. број зграде,
8. број стана,
9. телефон,
10. претходна школа коју је похађао,
11. датум завршетка претходне школе.
Опис улазних података за испите који се полажу:
1. шифра предмета,
2. назив предмета,
3. максималан број поена,
4. број питања у предмету,
5. поени по питању.
Ако би се даље наставио поступак описивања улазних података, требало би описати податке који
се односи на резултате постигнуте из разних предмета који се полажу, као и повезаност тих
података са осталима.
Међутим, ако погледамо описане податке о ученику и испиту, може се писати програмски захтев
који ће омогућити унос, исправку и брисање тих података. Тако ће овај програмски захтев чинити
једну логичку целину решења проблема. Такође се могу утврдити и начин чувања тих података,
њихова заштита и одржавање. Овде се може одредити и програмско окружење у коме ће се
програм имплементирати.
Пример: Програмски захтев могао би описно да гласи овако: Креирати део апликације који се
односи на унос, исправку и брисање улазних података за предмете које ће ученици полагати на
матурском испиту.
Поред овог описа потребно је дати који су то све улазни подаци, као и описи и организација тих
података.

Писање програма у програмском језику(кодирање програма)

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


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

6
излазни) називају се описне наредбе, а наредбе којима се извршавају операције над улазним
подацима, називају се извршне наредбе програма.
Програмирање у ширем смислу подразумева анализу проблема, пројектовање решења и
имплементацију решења у програмском језику. Међутим, програм у програмском језику мора се
превести (компајлирати) у извршни облик програма, како би се могао извршавати на рачунару.
За наведени пример проблема полагања матурског испита а у вези с наведеним програмским
захтевом приказаће се један његов део као логичка целина. Потребно је на рачунару
имплементирати унос, исправку и брисање података који се односе на улазне податке о испиту. За
то је потребан прозор као простор на коме се могу обавити тражене обраде. Ово би био један део
програмског решења задатка који се односи на полагање матуре. Користи се за унос, исправку и
брисање података који су у вези с појединим предметима и бројем питања по предмету, бројем
поена по питању и максималним бројем поена по тесту на сваком од предмета. У визуелном
програмирању се често користи појам прозор. По њему је оперативни систем Windows и добио
име. Прозор је софтверски дефинисан и он се као маска може приказивати на екрану. Такав приказ
ћемо убудуће у складу са визуелним програмирањем називати форма. У зависности шта се налази
на форми, односно које компоненте смо на њу поставили, оне имају различите изгледе. Тако за
обраду података у вези са испитом имамо приказану следећу форму:

Ако се погледа приказана форма у вези с испитом, уочава се да се на њој налазе места где се уносе
подаци описани као Sektor za upis podataka где су постављена поља за унос података са
одговарајућим описима и унутар тог сектора дугме за акцију уписа података. Други део је описан
као Sektor za ispravku i brisanje podataka који омогућава да се подаци који су већ унети и
сачувани могу исправити и брисати и два дугмета за акцију исправљања и брисања. Посебно је
постављено и дугме за излазак из овог дела апликације као и наслов описан као TABELA
PREDMETA ZA POLAGANJE MATURE.
Да буде јасније, све ово што видите на приказаној форми се у одговарајућем програмском алату
прво креира као форма са разним компонентама, а затим се програмирају акциона дугмад за
поједине фазе обраде у апликацији. Програм који се овде не види омогућава целокупно решавање
проблема који је постављен у задатом програмском захтеву.

Тестирање програма

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

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

Анализа извршавања програма и добијених резултата с модификацијом модела

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

Програмска продукција

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

Одржавање програма и података и усавршавање програмског решења

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

8
Израда документације

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

ПОЈАМ И КАРАКТЕРИСТИКЕ АЛГОРИТМА

Термин алгоритам увео је арапски математичар Мухамед Ал Хорезми (Abu Abdullah Muhammad
bin Musa al-Khwarizimi) 825. године нове ере. Написао је књигу Ал Хорезми о индијској вештини
рачунања (латински Algoritmi de numero indorum), у којој у арапску математику уводи индијске
цифре и децимални бројни систем. Реч алгоритам потиче управо из овог превода на латински.
Корак по корак је дефинисао све четири аритметичке операције (сабирање, одузимање, множење и
дељење) у облику упутстава која се састоје од елементарних корака. У тој књизи се дуго налазио
поступак за рачунање са децималним бројним системом (индијским, односно, арапским цифрама)
и прецизно описан математички начин стизања до решења проблема. Алгоритам је постао један од
основних појмова у математици, а даљим развојем науке и у рачунарству.
Појам алгоритма не треба везивати само за математику или ручунарство и информатику.
Алгоритми могу имати примену и у осталим процесима чија реализација се обавља по тачно
утврђеним корацима. Алгоритми се користе за: кување кафе, рецепт за питу од јабука, зидање
грађевинског објекта, покретање аутомобила и сл.
Постоје бројне дефиниције алгоритама, које га прецизније дефинишу, међутим, сматрамо да је
дефиниција која је већ дата довољна за некога ко почиње да учи програмирање. Под алгоритмом
се може подразумевати коначан скуп строго формулисаних правила и поступака по тим
правилима за решавање одређеног проблема.
Следећа графичка шема приказује алгоритам у најопштијем облику:

УЛАЗ ОБРАДА ИЗЛАЗ

У алгоритам се укључују следећа три модула:


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

9
У алгоритму се улазни подаци поступно трансформишу све до коначног решења постављеног
задатка, када се добијају тражени излазни подаци.
Наводе се особине које се могу применити у сваком алгоритму:
 дефинисаност – сваки алгоритамски корак је прецизно и једнозначно дефинисан,
 детерминисаност – добијена вредност после извршења сваког корака је једнозначно одређена
вредностима из претходног корака,
 коначност – мора се завршити после коначно много алгоритамских корака,
 масовност – може се применити за решавање групе сродних проблема без обзира на различите
улазне податке као полазне величине,
 ефикасност – решење се добија у што мањем броју алгоритамских корака за што краће време
обраде.
Поступци израде алгоритама нису једнозначни, па се за једно исто решење могу дати различите
алгоритамске варијанте. Ипак, не постоје универзални алгоритми, који решавају све проблеме.
Сваки алгоритам произвољне сложености може се реализовати помоћу три елементарне
управљачке структуре (Bohma и Jaccopini):
 секвенце, која означава да се два или више скупова операција извршавају секвенцијално, један
за другим,
 селекције, која означава да ће, у зависности од вредности неког податка или података који се
поставља као услов извршити један или други скуп операција,
 итерације, која означава да се један скуп операција извршава више пута – да се понавља.
Наведене управљачке структуре су познате конструкције структурног програмирања и оне одеђују
редослед извршавања акција у обради при решавању проблема. Алгоритам се може приказати
текстуалним описом (псеудокод) и графички (дијаграм тока). У псеудокоду се користе описи у
природном језику људског споразумевања прилагођени програмском језику, док се у графичком
приказу алгоритма користе посебни графички симболи за поједине алгоритамске кораке.

Текстуални опис алгоритма (псеудокод)

Псеудокод је језик који се користи за описивање решења проблема. Састављен је од низа реченица
обичног људског говора које почињу глаголом. Разумљив је и прихватљив за сваког без обзира на
познавање програсмског језика.
Проблем који се решава псеудокодом почиње апстрактном реченицом, помоћу које се даје
спецификација будућег решења проблема (иницијална реченица), у којој се игноришу сви
детаљи повезани с решењем проблема.
Иницијална реченица се затим декомпонује на одређени број мање апстрактних компоненти –
реченица. У таквој декомпозицији разумљив је и комплетно дефинисан постављени захтев, али не
морају да буду познати и детаљи сваке компоненте, односно како тачно треба извршити акције
описане у компонентним реченицама. То је први апстрактан ниво, где свака компонента,
идентификована реченица, описује само „шта треба урадити” да би се реализовао постављени
захтев. Из таквог описа не може се сазнати „како то треба урадити”. Сазнање о томе добија се
тек из следеће декомпозиције на своје компоненте (други ниво апстракције). Процес
декомпозиције апстрактних кампонената завршен је на нивоу на којем све компоненте реченице
разумљиво и прецизно описују „шта треба урадити” и „како то треба урадити”. Најнижи
апстрактни ниво којем се тежи у процесу декомпозиције није строго дефинисан.

10
Сваки постављени задатак може се решити у псеудокоду помоћу управљачких структура секвенце,
селекције и итерације које се заснивају на реченицама људског говора.
Секвенцу у псеудокоду чини низ императивних реченица које се извршавају у редоследу како су
записане. Селекција означава избор алтернативних низова реченица за извршавање и то на основу
вредности неког услова. Итерација означава понављање извршавања једне или низа реченица.
Карактеристика сваког језика је његова синтакса и семантика. На основу синтаксе (граматике)
језика одређује се да ли је једна реченица правилно записана или не. Синтакса псеудокода треба да
буде конзистентна, природна и да омогући лако читање добијених решења. Семантика језика
специфицира значење различитих синтаксних конструкција.
У синтакси псеудокод језика користе се посебне речи које су јасне и разумљиве природном језику
којима се људи споразумевају као што су: početak, kraj, ako je, tada, u suprotnom, sve dok je и
radi. Ове посебне речи се могу назвати „службене речи“ и као такве их треба и примењивати у
алгоритму који се описује псеудокодом. Службене речи имају дефинисано значење које ће бити
објашњено у разматрању управљачких структура. Да би се уочиле, службене речи су писане
подебљаним – масним словима. Не употребљавати службене речи као имена идентификатора.
Користе и посебни знаци као што су: витичасте заграде{ }, тачка-зарез (;) и знак тачка (.). Њихова
примена и објашњење ће се приказати са семантиком у управљаким структурама.
Општа структура решења проблема (задатка) у псеудокоду може се представити на следећи начин:
{Inicijalna rečenica koja opisuje rešenje problema}
početak
Аkcije obrade;
kraj.
Објашњење: Свако решење проблема прво описати иницијалном реченицом. Поставља се
службена реч početak која означава почетак решавања проблема, а затим се у акцијама обраде
могу налазити управљачке структуре (секвенца, селекција и итерација). Службена реч kraj иза
које стоји тачка означава крај алгоритамског решења у псеудокоду.
Напомена: Како би се лакше разумело, решење задатка у псеудокоду, а касније његово превођење
у програмски код, у овој књизи је писано латиницом. Такође, из истог разлога имена
идентификатора која се уводе као репрезентација и коментари, који ће се приказивати као излазни
подаци, и операције обраде представљене формулама писани су латиничним словима.

Секвенца

Секвенца је најједноставнији облик компоновања реченица у псеудокоду. Секвенца се састоји од


низа акција које се записују помоћу императивних реченица. Такав низ акција обично се назива
компонована реченица и поставља се између резервисаних речи početak и kraj. Сврха
резервисаних речи početak и kraj је да означе груписање више реченица у једну
компоновану(секвенцу). Реч početak означава почетак, док реч kraj означава крај секвенце.
Најпростија секвенцијално компонована реченица у псеудокоду састоји се од само две акције.
Знак тачка-зарез (;) користи се као сепаратор између реченица. Не ставља се тачка-зарез код
последње реченице у једној секвенци. Ако се помоћу секвенце описује општа структура решења,
обавезно се ставља знак тачка (.) иза резервисане речи kraj. Витичасте заграде { } користиће се за
означавање коментара. Коментари се користе да опишу проблем који се решава или неки његов
део који је декомпонован.

11
У табели 1.1. приказане су синтакса и семантика управљачке структуре секвенце у псеудокоду:

12
Синтакса Семантика
Секвенца - за две наредбе
početak Прво се извршава akcija 1
akcija 1; после извршавања akcijе 1
akcija 2 следи извршавање akcijе 2.
kraj Акција 1 и akcija 2 извршавају се увек и само једном.
Секвенца - за коначан број наредби
početak
akcija 1;
Све акције akcija 1, akcija 2,
akcija 2;
... akcija n извршавају се у редоследу у коме су записане.
...
Свака акција извршава се увек и само једном.
akcija n
kraj
Табела 1.1. – Синтакса и семантика секвенце у псеудокоду
У табели 1.2. приказана су два примера секвенце, један за школовање до завршетка мастер
студија и други за кување кафе. Како се овде секвенца користи као општа структура решења
проблема, на крају иза речи kraj стављена је тачка.
{Školovanje do završetka master studija} {Kuvanje kafe}
početak početak
Završiti prvo osnovnu školu; Sipati vodu u posudu za kuvanje;
Završiti srednju školu; Zagrejati vodu;
Upisati osnovne studije po želji; Dodati šećer po ukusu;
Završiti osnovne studije; Dodati kašičicu kafe;
Upisati master studije po želji; Vratiti na šporet da proključa;
Završiti na kraju master studije Sipati kafu u šoljicu
kraj. kraj.
Табела 1.2. – Примери секвенце у псеудокоду

Селекција

Слекција омогућава избор алтернативних низова акција и то на основу вредности неког услова.
У табели 1.3. приказан је прво најпростији облик управљачке структуре селекције који се може
користити при решавању неког проблема у псеудокоду где се извршава само једна акција обраде, а
затим са више акција обраде:
Синтакса Семантика
ako je uslov ispunjen Ако је услов испуњен,
tada akcija тада се извршава akcija 1;
у супротном не извршава се akcija 1.
ako je uslov ispunjen
tada
Ако је услов испуњен,
početak
тада се извршава низ акција између
akcija 1;
резервисаних речи početak и kraj; у
akcija 2;
супротном не извршава се ниједна од
...
наведених акција.
akcija n
kraj
Табела 1.3. – Облик селекције у псеудокоду са једном и више акција обраде

13
У табели 1.4. приказан је облик селекције који омогућава да на основу постављеног услова, ако је
он испуњен обавља се само једна акција обраде, али и када тај услов није испуњен може се
обавити нека друга(али једна) акција обраде:
Синтакса Семантика
ako je uslov ispunjen Ако је услов испуњен,
tada akcija 1 тада се извршава akcija 1,
u suprotnom akcija 2 а не извршава се akcija 2;
у супротном ако услов није испуњен
извршава се akcija 2, а
akcija 1 се не извршава.
Табела 1.4. – Облик селекције у псеудокоду са два могућа избора а по једном акцијом обраде
У табели 1.5. приказан је облик селекције који омогућава да на основу постављеног услова, ако је
он испуњен обавља се више акција обраде, али и када тај услов није испуњен могу се обављати
неке друге акције обраде:
Синтакса Семантика
ako je uslov ispunjen Ако је услов испуњен,
tada извршава се низ акција akcija 11, akcija 12,...
početak akcija 1n између резервисаних речи početak и
akcija 11; kraj;
akcija 12; у супротном ако услов није испуњен
... извршава се низ акција akcija 21, akcija 22,...
akcija 1n akcija 2n између резервисаних речи početak и
kraj kraj.
u suprotnom
početak
akcija 21;
akcija 22;
...
akcija 2n
kraj
Табела 1.5. – Облик селекције у псеудокоду са два могућа избора са по више акција обраде
У постојећу селекцију се може угњездити друга и такво повезивање селекција се назива
угњеждавање. У табели 1.6. приказан је један облик селекције:
Синтакса Семантика
ako je uslov1 ispunjen Ако је услов 1 испуњен,
tada akcija 1 тада се извршава akcija 1;
u suprotnom у супротном ако услов 1 није испуњен, поставља се
ako je uslov2 ispunjen други услов,
tada akcija 2 ако је услов 2 испуњен,
u suprotnom akcija 3 тада се извршава akcija 2;
у супротном ако услов 2 није испуњен тада се
извршава akcija 3.
Табела 1.6. – Облик селекције у псеудокоду где се врши њихово угњеждавање
У табели 1.7. приказана су два примера селекције, који су наставак претходих примера секвенце из
табеле 1.2. За први пример школовање до завршетка мастер студија декомпонована је реченица
{Upisati master studije po želji}, док је за други пример кување кафе декомпонована реченица
{Dodati šećer po ukusu}. Њихово декомпоновање је у табели обојено сивом позадином.

14
15
{Školovanje do završetka master studija} {Kuvanje kafe}
početak Početak
Završiti prvo osnovnu školu; Sipati vodu u posudu za kuvanje;
Završiti srednju školu; Zagrejati vodu;
Upisati osnovne studije po želji; {Dodati šećer po ukusu}
Završiti osnovne studije; ako je potreban šećer
{Upisati master studije po želji} tada Dodati šećer po ukusu;
ako je student upisao master studije po želji Dodati kašičicu kafe;
tada Završiti master studije; Promešaj kafu sa vodom i šećerom;
kraj. Vratiti na šporet da proključa;
Sipati kafu u šoljicu
kraj.
Табела 1.7. – Примери селекције у псеудокоду
Напомена: Синтаксна реченица за селекцију „ako je uslov1 ispunjen“ може имати и облик „ako
nije uslov1 ispunjen“.

Итерација

Када је у решавању неког проблема потребно извршити једну или низ акција два или више пута
где се не мора прецизно знати колико пута, користи се управљачка структура итерација. Итерација
се користи увек када се претпоставља, или се тачно зна, да ће се једна или низ акција поновити.
Ако се у итерацији извршава само једна акција (императивна реченица), иза те акције се ставља
знак тачка-зарез (;).
У табели 1.8. приказани су облици управљачке структуре итерације у псеудокоду:

Синтакса Семантика

Итерација – најпростији облик са једном акцијом


sve dok je uslov radi Све док је услов испуњен, понавља се извршавање akcija 1.
akcija 1; Наведен услов у итерацији је услов изласка из итерације. Тело циклуса је
akcija 1. Извршвање тела итерације понавља се нула или више пута.
Итерација – где у телу итерације има више акција
sve dok je uslov radi Све док је услов испуњен,
početak понавља се извршавање тела итерације које се састоји од компоноване
akcija 1; реченице. Ако услов није испуњен не извршава се тело итерације.
akcija 2;
...
akcija n
kraj
Табела 1.8. – Синтакса и семантика итерације у псеудокоду
Напомена: Синтаксна реченица за итерацију „sve dok je uslov radi“ може имати и облик „sve dok
nije uslov radi“.
У табели 1.9. приказана су два примера итерације, који су наставак претходих примера селекције.
За пример школовање до завршетка мастер студија декомпонована је реченица {Završiti
srednju školu}, док је за пример кување кафе декомпонована реченица {Zagrejati vodu}.

16
{Školovanje do završetka master studija} {Kuvanje kafe}
početak Početak
Završiti prvo osnovnu školu; Sipati vodu u posudu za kuvanje;
{Završiti srednju školu} {Zagrejati vodu}
Upisati željenu srednju školu; Uključi sporet;
sve dok učenik nije završio sva četiri razreda radi sve dok voda nije zagrejana radi
uči da bi završio uspešno te razrede; Pevaj omiljenu pesmu;
Položiti maturu; Isključi šporet;
{Upisati osnovne studije po želji} {Dodati šećer po ukusu}
ako je student upisao željene studije ako je potreban šećer
tada Završiti osnovne studije; tada Dodati šećer po ukusu;
Upisati master studije po želji; Dodati kašičicu kafe;
Završiti na kraju master studije Promešaj kafu sa vodom i šećerom;
kraj. Vratiti na šporet da proključa;
Sipati kafu u šoljicu
kraj.
Табела 1.9. – Примери итерације у псеудокоду
Пример 1: Возач треба да реши проблем замене оштећене аутомобилске гуме која није за
употребу. То може сам урадити уколико има исправан резервни точак, али у супротном ако га
нема мора потражити мајстора - вулканизера.
Ако је резервни точак исправан, возач мора прво да демонтира точак са оштећеном гумом.
Демонтирање је завршено када возач извади све шрафове којима је точак причвршћен. Затим возач
мора склонити точак и на његово место монтирати резервни са исправном гумом. Монтирање
резервног точка траје све док сви шрафови не буду поново постављени и зашрафљени.
Решење проблема:
Иницијална реченица која описује „шта треба урадити“ а игноришу се сви детаљи решавања
проблема „како заменити точак“ може се представити као:
Zamena oštećene automobilske gume
Реализација ове акције зависи од исправности резервног точка. Почетна иницијална реченица се
може изразити као избор између две алтернативне реченице на следећи начин:
{Zamena oštećene automobilske gume}
početak
ako je rezervni točak ispravan
tada zameni točak sa oštećenom gumom novim rezervnim
u suprotnom pronađi najbližeg vulkanizera
kraj.
{Kraj zamene oštećene automobilske gume}
Ако се издвоји реченица „zameni točak sa oštećenom gumom novim rezervnim“, ова акција се
може декомпоновати на низ простих акција на следећи начин:
{zameni točak sa oštećenom gumom novim rezervnim}
početak
demontiraj točak sa oštećenom gumom;
skloni točak sa oštećenom gumom;
uzmi rezervni točak sa ispravnom gumom;
montiraj rezervni točak
kraj

17
{kraj zamene točka sa oštećenom gumom novim rezervnim}
Реченица „demontiraj točak sa oštećenom gumom“ се може изразити као итеративно извршавање
акције описане реченицом „odvrni šraf“. Возач би ову акцију понављао све док не одврне све
шрафове, а то би се могло приказати на следећи начин:
{demontiraj točak sa oštećenom gumom}
sve dok nisu odvrnuti svi šrafovi radi
odvrni šraf;
{kraj demontiraj točak sa oštećenom gumom}
На сличан начин, и реченица „montiraj rezervni točak“ се може изразити као итеративно
извршавање акције описане реченицом „zavrni šraf“. Возач би ову акцију понављао све док не
заврне све шрафове, а то би се могло приказати на следећи начин:
{montiraj rezervni točak}
sve dok nisu zavrnuti svi šrafovi radi
zavrni šraf;
{kraj montiraj rezervni točak}
Сада се може написати детаљан алгоритам у псеудокоду којим се утврђује тачан редослед
извршавања добијених детаљних акција. Свака реченица на одређеном месту и апстрактном
нивоу, замењује се одговарајућим скупом детаљнијих акција описаним реченицама на нижем
апстракном нивоу.
Решење постављеног проблема у целини се може приказати на следећи начин:

{Zamena oštećene automobilske gume}


početak
ako je rezervni točak ispravan
tada
{zameni točak sa oštećenom gumom novim rezervnim}
početak
{demontiraj točak sa oštećenom gumom}
sve dok nisu odvrnuti svi šrafovi radi
odvrni šraf;
{kraj demontiraj točak sa oštećenom gumom}
skloni točak sa oštećenom gumom;
uzmi rezervni točak sa ispravnom gumom;
{montiraj rezervni točak}
sve dok nisu zavrnuti svi šrafovi radi
zavrni šraf;
{kraj montiraj rezervni točak}
kraj
{kraj zamene točka sa oštećenom gumom novim rezervnim}
u suprotnom pronađi najbližeg vulkanizera
kraj.
{Kraj zamene oštećene automobilske gume}

18
Графички приказ алгоритма (дијаграм тока)

За графичко приказивање алгоритма користе се различити симболи у које се уписују акције


обраде, а у табели 1.10. приказани су основни графички симболи. Графички приказ алгоритма
назива се још и дијаграм тока. Ови симболи не морају изгледати баш овако, а за њих смо се
определили јер мислимо да поједностављују разумевање алгоритма. Путем алгоритма може да се
добије разумљиво решење проблема чија се исправност може тестирати.
Када је програм једноставан, решава неки простији задатак, алгоритам се своди на једноставну
интерпретацију. Међутим, када је задатак компликован, односно сложен, алгоритамска
интерпретација је пре свега неопходна, али и компликована и дугачка.
Табела 1.10. – Симболи који се користе за графичко приказивање алгоритма

Опис симбола и дејства у алгоритму Симболи у алгоритму


Правоугаоник са овалним угловима користи се за означавање
почетка и краја програма.
Трапез који се користи за опис улазних података.

Правоугаоник се користи за опис инструкција у поступку


обраде података.
Трапез који се користи за опис излазних података.

Ромб и шестоугао се користе када се у алгоритму појави


гранање у зависности од услова који може бити испуњен или
неиспуњен. Шестоугао се користи у алгоритму и за услов
изласка из итерације.

Мали ромб се користи за означавање понављања неких


инструкција у поступку обраде података.

Линије хоризонталне, вертикалне и линије са стре лицама


користе за означавање правца кретање у алгоритму.

Кружић се користи да би се у алгоритму означио прекид низа


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

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

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

Дијаграм тока Опис

Секвенца - за две наредбе


Прво се извршава akcija 1;
akcija 1 после извршавања akcijе 1
akcija 2 следи извршавање akcijе 2.
Акција 1 и akcija 2 извршавају се увек и само
2s=n/3600
једном.

Секвенца - за коначан број наредби


Све акције akcija 1, akcija 2,
akcija 1 ... akcija n извршавају се у редоследу у коме су
2s=n/3600 записане. Свака акција извршава се увек и
akcija 2 само једном.
2s=n/3600
...
akcija n
2s=n/3600

Селекција - најпростији облик


Ако је услов испуњен,
da тада се извршава akcija 1;
uslov у супротном не извршава се akcija 1.
ne akcija 1

Селекција - ако је услов испуњен и треба извршити више акција


Ако је услов испуњен,
da извршава се низ акција akcija 1, akcija 2,
uslov akcija 1 ... akcija n.
ne 2s=n/3600
akcija 2
2s=n/3600
...
akcija n
2s=n/3600

Селекција - облик када је услов испуњен али и када није

20
Дијаграм тока Опис
Ако је услов испуњен,
da тада се извршава akcija 1,
uslov а не извршава се akcija 2;
ne akcija 1 у супротном ако услов није испуњен
akcija 2 извршава се akcija 2, а
akcija 1 се не извршава.

Селекција - облик када је услов испуњен али и када није са више акција
Ако је услов испуњен,
da извршава се низ акција akcija 11, akcija 12,...,
uslov akcija 11 akcija 1n;
ne у супротном ако услов није испуњен
akcija 21 2s=n/3600
akcija12 извршава се низ акција akcija 21, akcija 22,...,
2s=n/3600 2s=n/3600
akcija 22 akcija 2n.
...
2s=n/3600
... akcija1n
akcija 2n 2 s=n/3600
2s=n/3600

Селекција - облик када се једна селекција као реченица угњеждава у оквиру неке
друге селекције
Ако је услов 1 испуњен,
da тада се извршава akcija 1;
uslov 1 akcija 1 у супротном ако услов 1 није испуњен,
ne 2s=n/360 поставља се други услов,
da 0 и ако је услов 2 испуњен,
akcija 2 uslov 2 тада се извршава akcija 2;
2s=n/360 ne у супротном ако услов 2 није испуњен тада се
0 akcija 3 извршава akcija 3.
2s=n/3600 Напомена: Ово је један пример угњеждавања а
могуће су и друге комбинације.

Итерација – најпростији облик са једном акцијом


Све док је услов испуњен,
ne
понавља се извршавање акције akcija 1.
uslov Услов наведен у итерацији је услов изласка из
da итерације. Тело циклуса је akcija 1.
akcija 1
2s=n/3600 Извршавање тела итерације понавља се нула
или више пута.

Итерација – где у телу итерације има више акција

21
Дијаграм тока ... Опис
Све док је услов испуњен,
ne
понавља се извршавање тела итерације кога
uslov чине низ акција akcija 1, akcija 2,
da
akcija 1 ... akcija n. Ако услов није испуњен не
2akcija
s=n/3600 извршава се тело итерације.
2
2s=n/3600
...
akcija n
2s=n/3600

Табела 1.11. – Управљачке структуре у дијаграму тока(графички приказ алгоритма)


За алгоритам у облику сквенце се каже да је то линијска структура, за алгоритам који користи
селекцију се каже да је то разграната структура, док се за алгоритам који користи итерацију каже
да је то циклучна структура.
Како су разјашњене све ознаке у дијаграму тока, сада се може написати општи алгоритам који
неће улазити у детаље обраде, и он се може приказати на следећи начин:
početak

ulazni podaci

obrada ulaznih
podataka
izlazni podaci

kraj
Најједноставнији облик алгоритма је линијска структура (секвенца). Састоји се од низа акција,
које се записују помоћу императивних реченица. Акције се у линијској структури извршавају
безусловно редоследом како су наведене, и то једна за другом.
Пример 2: Путовање аутомобила од места A до места B траје n секунди. Треба израчунати колико
путовање траје у минутима, а затим колико траје у сатима.
Улазни подаци: Време потребно да аутомобил стигне од места A до места B, репрезентује се са
именом идентификатора n.
Излазни подаци: Време путовања у минутима и у сатима, репрезентује се са именима
идентификатора vm и vs.
Обрада: На симболе којима су репрезентовани улазни подаци примењују се операције потребне за
добијање решења задатка, које ће се видети као излазни податак или, ако их има више, као излазни
подаци (vm = n/60, vs = n/3.600).
После апстракције примењене на постављен задатак, проблем је јасно дефинисан и лако се назире
решење. Јасно су издвојени улазни и излазни подаци, а јасне су и операције које треба применити
да се задатак реши, односно да се изврши трансформација улазних података у излазне податке.
Напомена: Како је псеудокод идејно решење проблема (задатка), не мора се у потпуности писати
тачно његова синтакса и семантика. Тако ће се реченице којима се описује решење примера у овој
књизи писати нормалним фонтом (regular). Подебљаним (bold) фонтом писаће се: симболи којима

22
се репрезентују улазни и излазни подаци, поруке, акције обраде представљене формулама,
бројчане вредности и услови који се налазе у селекцији и итерацији као и службене речи. Бројчане
вредности ће се приказивати са знаком-тачка (.) за раздвајање по три груписане цифре, а за
децимални зарез ће се користити знак-зарез (,).У алгоритмима приказаним графички (дијаграм
тока) уместо речи ili користиће се реч or, а уместо слова i реч and. Ученику ће се тиме упростити
приказ решења проблема у псеудокоду. Ово се наравно не мора поштовати, јер се као што је
речено користе за да би се упростило учење о појмовима потребним за разумевање алгоритма.
Следи решење задатка у псеудокоду и алгоритму:

23
Алгоритам у псеудокоду Алгоритам графички
{Izračunati putovanje u minutima i satima} početak
početak
Uneti podatak za vreme u sekundama, n; n
Izračunati koliko je vreme u minutima, vm=n/60;
Izračunati koliko je vreme u satima, vs=n/3.600; vm=n/60
Prikazati vreme u minutima i u satima, vm,vs vs=n/3.600
kraj. vm,vs

kraj

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


алгоритaм не унесемо време у секундама, тада даљи кораци у алгоритму не упућују на то шта у
том случају треба да се чини. Наилази се на корак обраде (акцију) где треба обавити рачунање
времена у минутима по формули vm = n/60, а не постоји вредност за податак о времену у
секундама описа са n. Оваква нелогичност је очигледна и не се може очекивати исправно решење.
Разграната програмска структура (селекција) омогућава да се у програм (алгоритам) постави
услов на основу ког се може у случају да је услов испуњен одабрати једна или више акција обраде,
а такође се може нека друга обрада вршити и када услов није испуњен.
Тако, за задатак Пример 2, у случају да се за време у секундама унесе вредност која је мања или
једнака 0 (n<=0), задтак би био бесмислен. Да би се то спречило, у алгоритам треба убацити
управљачку структуру селекцију која садржи одговарајући услов који ће контролисати тај случај и
која ће, ако се он заиста појави, предвидети приказивање одговарајуће поруке. Порука треба да
укаже на то да је потребно унети одговарајући податак, а у овом случају то би требала бити
бројчана вредност која је већа од нуле. На тај начин се линијска структура претвара у разгранату.
Следи приказ алгоритма који ће адекватно решити проблема:

Алгоритам у псеудокоду Алгоритам графички


{Izračunati putovanje u minutima i satima} početak
Početak
Uneti podatak za vreme u sekundama, n; n
ako je uneta vrednost manja ili jednaka 0 (n<=0) da
tada n<=0
Ispisati poruku 'Vrednost mora biti >0' ne мora biti>0
u suprotnom vm=n/60 Vrednost
početak
vs=n/3.600
Izračunati vreme u minutima, vm=n/60;
Izračunati vreme u satima, vs = n/3.600; vm,vs
Prikazati vreme u minutima i u satima, vm, vs
kraj
kraj
kraj.

Програм који се извршава по овом алгоритму у случају да се не унесе вредност која је већа од нуле
реаговаће са приказањем поруке 'Vrednost mora biti >0'. Да би се програм извршавао даље,
улазни податак за број секунди треба унети да буде већи од нуле.
У алгоритму се лако може уочити да су на постављени услов обрађене акције када је услов
испуњен и алтернативно, када услов није испуњен.

24
Такође, у алгоритмима се може користити и разграната програмска структура, која има
вишеструко гранање на основу постављеног услова. О томе ће бити речи касније, када се буду
обрађивале наредбе гранања.
Пример 3: Дати су цена, количина, попуст на укупан рачун за купљену количину неке робе и
износ новца којим купац плаћа. Купац добија попуст ако је укупан износ рачуна већи од 2.500 дин.
Израчунати и приказати укупан износ без попуста, износ попуста, укупан износ с попустом и
кусур. У случају да је купац уплатио мањи износ од укупног износа рачуна с попустом, издати
поруку „доплати”.
Улазни подаци: Цена c, количина k, попуст p (%), уплата купца up су имена идентификатора.
Излазни подаци: Укупан износ рачуна без попуста (uk), износ попуста (ip), укупан износ с
попустом (ukp) и за враћање кусура ku су имена идентификатора.
Обрада: Израчунати укупан износ рачуна без попуста. uk= c*k. Ако је uk већа од 2.500 дин.,
израчунати износ попуста ip и износ рачуна са попустом ukp. Израчунати и кусур.
Алгоритам у псеудокоду Алгоритам графички
{Izračunavanje iznosa računa za plaćanje} početak
Početak
Uneti cenu, količinu robe, popust i uplatu (c,k,p,up); c,k,p,up
ako je vrednost za c ili za k, ili za p, ili za up <=0 da
tada (c<=0) or (k<=0) or
Ispisati poruku 'Uneti podatke da su >0' (p<=0) or (up<=0)
u suprotnom ne
uk=c*k da su >0
početak podatke
Izračunati ukupan iznos računa bez popusta (uk=c*k); ukp=uk
ne
Uneti
Dodeliti (ukp=uk); uk>2.500
ako je ukupan iznos računa bez popusta uk > 2.500 dinara
da
tada ip=0
početak ip=uk*p
Izračunati iznos popusta (ip=uk*p); ukp= uk-ip
Izračunati iznos računa s popustom (ukp=uk-ip);
ne
kraj up<ukp
u suprotnom iznos popusta je nula (ip=0);
da ku=up-ukp
ako je uplata manja od uk.iznosa s popustom (up<ukp)
tada Ispisati poruku 'Doplati'
Doplati
u suprotnom izračunati iznos kusura (ku=up-ukp);
Prikazati ukupan iznos računa bez popusta (uk); uk
Prikazati iznos popusta (ip) i iznos računa s popustom (ukp);
Prikazati vrednost za iznos kusura(ku) ip,ukp
kraj
kraj. ku

kraj

У задатку Пример 3 у разгранату програмску структуру убачена је селекција ako je vrednost za c ili
za k, ili za p, ili za up <=0 Ispisati poruku 'Uneti podatke da su >0', и акције даље обраде ако услов
није испуњен. У грани ове селекције када услов није испуњен угнежђене су две селекције: једна
селекција ako je ukupan iznos računa bez popusta uk > 2.500 dinara, где се на основу постављеног
услова, ако је испуњен, обавља обрада израчунавања износа попуста и износа рачуна с попустом, а
у супротном је износ попуста постављен на вредност 0, и друга селекција је ako je uplata manja od
uk.iznosa s popustom (up<ukp), где се на основу постављеног услова, ако је испуњен, покреће
акција Ispisati poruku 'Doplati', а у супротном је израчуната вредност за враћање кусура.

25
Пример 4: Банка за нове штедише даје на орочени девизни износ камате на период од 6 и 12
месеци које се налазе у табели, и додатно фиксне износе као награду штедиши у зависности од
рока орочавања. Каматне стопе и фиксне износе посматрати као константе.
Банка не даје друге рокове орочавања. Израчунати износ камате и укупан износ, који ће штедиша
подићи после истека орочавања.

Рок орочавања Каматна стопа Фиксни износ


6 месеци 4,5% 100 евра
12 месеци 5,9% 110 евра
Улазни подаци: Износ који се орочава, репрезентује се са i; рок орочавања, са r, каматнe стопе, са
– константама 4,5% и 5,9%, а фиксни износи као награда, са – константама 100 и 110 евра.
Излазни подаци: Износ камате, репрезентује се са ik; укупан износ на рачуну, са uk.
Обрада: Ако је орочен износ на 6 месеци, износ камате рачуна се по формули ik=(i*0,045), а
укупан износ с каматом и наградом uk = i+ik+100. Ако је орочен износ на 12 месеци, износ камате
се рачуна по формули ik=(i*0,059), а укупан износ с каматом и наградом после истека орочавања
uk = i+ik+110. Ако би било још рокова орочавања, задатак би се морао другачије решавати.
Алгоритам у псеудокоду Алгоритам графички
{Izračunavanje kamate i krajnjeg iznosa posle štednje}
početak
Početak
Uneti podatke za iznos (i) i rok (r); i,r
ako su uneti podaci za iznos (i) ili za rok (r) <=0 da
(i<=0) or (r<=0)
tada Ispisati poruku 'Uneti podatke da su>0'
ne ne
u suprotnom
a
da su>0
(r=6) or (r=12)
početak podatke
da 12 meseci
ako je rok oročavanja (r=6) ili (r=12)
Uneti
da e Rok 6 ili
tada e r=6
početak ik=i*0,045
a
ne
ako je rok oročavanja (r=6) uk=i+ik+100
tada da
e r=12
početak
ik=i*0,059 a
Izračunati iznos kamate (ik=i*0,045); ne
uk=i+ik+110
Izračunati ukupan iznos (uk=i+ik+100);
kraj
ik,uk

ako je rok oročavanja (r=12)


tada
kraj
početak
Izračunati iznos kamate (ik=i*0,059);
Izračunati ukupan iznos (uk=i+ik+110);
kraj
Prikazati iznos kamate i ukupan iznos (ik,uk);
kraj
u suprotnom Ispisati poruku 'Rok 6 ili 12 meseci';
kraj
kraj.

26
Ако се разматра алгоритам у задатку Пример 4, уочава се да је тај алгоритам радио обрачун за
једног штедишу банке. Међутим, ако се жели исти поступак обраде применити за 100 штедиша,
исти поступак обраде требало би да се понови 100 пута. Такође, морају се знати подаци о року и
износу орочавања за сваког штедишу посебно. Зато ће бити потребно дефинисати и унети улазне
податке који ће за сваког штедишу имати вредности за рок и износ орочавања. У поглављу 10
говори се о низовном типу података који омогућава организовање података на овај начин.
Обрада података, у којој се једна акција или више акција понављају више пута, назива се
циклична програмска структура (итерација). Може се тачно знати колико пута ће се циклус
извршавати, али је могуће и не знати тај податак. У селекцији се услов користио да се одреди да ли
ће се неки низ акција извршити ниједном или једном.
Услов се у цикличној програмској структури посматра другачије. Он се користи да се једна акција
или више акција понављају све док је услов испуњен или није испуњен. Без обзира на тај податак,
сигурно је да ће се циклична програмска структура применити када се зна да ће се нека обрада
поновити више пута. Следи пример када се не зна колико пута ће се циклус поновити.
Пример 5: Из скупа целих позитивних бројева мањих од 50 израчунати и приказати збир парних
бројева.
Улазни подаци: Цели позитивни бројеви почев од 2, не зна се тачно колико их је, уз услов мањих
од 50, репрезентује се са x.
Излазни подаци: Износ збира парних бројева, репрезентује се са zbir.
Обрада: Издвојити парне бројеве из скупа бројева мањих од 50. Пре итерације је задата вредност
првог парног броја на 2, формулом (x=2) и почетна вредност збира парних бројева на 0, формулом
zbir=0. Циклус се извршава све док је испуњен услов да је добијени паран број мањи од 50,
односно (x<50). У првом проласку кроз циклус, мењају почетне задате вредности тако да се збир
парних бројева увећава са почетне вредности 0, за вредност првог парног броја која је задата пре
итерације, односно за 2. За то се користи формула zbir=zbir+x. Такође, у првом проласку кроз
циклус, да би се добио следећи паран број у односу на први задати чија је вредност 2, сваки
следећи паран број се добија увећавањем за 2 у односу на претходни. За то се користи формула
x=x+2. Све док је испуњен услов, обавља се израчунавање збира парних бројева а затим се следећи
парни број увећава за 2 истим формулама као у првом проласку. Када овај услов није испуњен,
прекида се извршавање циклуса, и наставља се на акцији која следи после циклуса, односно на
приказивање збира парних бројева.
Алгоритам у псеудокоду Алгоритам графички
{Izračunavanje zbira parnih brojeva manjih od 50} početak
početak x=2
Postaviti početnu vrednost prvog parnog broja (x=2);
Postaviti početnu vrednost zbira parnih brojeva na 0 (zbir=0); zbir=0
ne
{Ciklus sabiranja parnih} x<50
sve dok je (x<50) radi da
početak zbir = zbir+x
Povećati zbir za parnе brojeve (zbir=zbir+x); x=x+2
Formirati sledeći parni broj manji od 50 (x=x+2);
kraj zbir
Prikazati zbir parnih brojeva manjih od 50 (zbir)
kraj.
kraj

Напомена: У алгоритмима који следе имена идентификатора за улазне и излазне податке која се
формирају од симбола природног језика ће се само навести, и неће се више посебно наглашавати
да су то имена идентификатора.

27
Пример 6: Пронаћи највећи заједнички делилац два броја заснован на Еуклидовом алгоритму.
Принцип алгоритма заснива се на томе да се највећи заједнички делилац (nzd) два броја не мења
уколико се мањи број одузме од већег, па се затим одреди nzd новодобијеног броја и мањег од
претходна два. На пример, 21 је nzd за 252 и 105 (252=21×12; 105=21×5); пошто је 252−105=147,
zd за 147 и 105 је такође 21. Како је већи од два полазна броја на овај начин смањен, понављањем
поступка добијаће се све мањи бројеви док се један од њих не сведе на нулу.
Алгоритам у псеудокоду Алгоритам графички
{Najveći zajednički delilac dva broja} početak
Učitati vrednosti za brojeve a i b;
{Ciklus rada} a,b
sve dok je (b< >0) radi ne
početak b< >0
ako je a>b da
tada umanjiti vrednost a za vrednost b (a=a-b) da
a>b
u suprotnom umanjiti vrednost b za vrednost a (b=b-a); ne
kraj b=b-a a=a-b
Dodeliti vrednost najvećem zajedničkom deliocu (nzd=a);
Prikazati vrednost najvećeg zajedničkog delioca (nzd)
k raj. nzd=a
nzd

kraj

КРАТАК ПРЕГЛЕД РАЗВОЈА ПРОГРАМСКИХ ЈЕЗИКА

Један од успешнијих покушаја да се направи машина која би заменила човека у пословима


рачунања био је у седамнаестом веку, а реализовали су га француски научник Блез Паскал ( Blaise
Pascal) и немачки математичар Готфрид Лајбниц (Gottfried Leibnitz). Паскалов уређај могао је да
изврши операције сабирања и одузимања, док је Лајбниц тај уређај усавршио да може да обавља и
множење и дељење (калкулатори).
Ови уређаји раде на таквом принципу по ком треба унети податке (операнде) и задати операције
које калкулатор треба да изврши над тим подацима. По извршењу једне операције и добијању
резултата мора се унети нов податак (подаци) и задаје се нова операција итд.
У деветнаестом веку енглески научник Чарлс Бебиџ (Charles Babbage) био је творац две машине.
Другу је назвао аналитичка машина, и она је имала сличне особине данашњим рачунарима.
Машина је радила с бушеним картицама, од којих је један блок картица бушен за операције које
машина треба да изврши, а други блок садржао је податке, тачније локације у меморији машине из
којих су се узимали операнди и у које су смештани резултати извршавања задатих операција. Ова
машина је у зависности од вредности појединих података, могла да мења редослед извршавања
задатих операција. Тај низ картица на којима су бушене операције, представљао је програм за
аналитичку машину.
Захваљујући развоју електромеханике и електронике четрдесетих година двадесетог века појавили
су се рачунари који могу аутоматски, без интервенције човека, да извршавају више операција
једну за другом. Човек је морао унапред да дефинише више операција и редослед којим се те
операције у машини извршавају. Појавом првих рачунара настала је и потреба за програмом и,
наравно, програмирањем.

28
Програм за рачунар представља решење задатка који ће он обавити, а записан је на језику
програмирања, који се назива програмски језик. Програмски језик има одређену способност да
помоћу скупа алата и правила којима располаже изгради поступак решавања задатка у облику који
ће рачунар као машина бити способан да изврши. При томе се користе разне инструкције
(наредбе) програмског језика. Према томе решавање проблема програмирањем своди се на
прецизно писање инструкција (наредби) тако да се он може исправно решити на рачунару.
Људи се споразумевају помоћу језика. Језик људи је дакле средство за представљање и преношење
информација. Човек који пише програм за рачунар, треба на неки начин да саопшти рачунару све
инструкције које треба да изврши. При томе је програмски језик средство којим он као програмер
програмом саопштава рачунару шта и како да изврши. Рачунар може да „разуме” само формалан
запис, без толерисања било какве непрецизности. Програмски језик располаже скупом правила
којима се рачунару представљају инструкције и описују подаци. Најбитнија карактеристика
програмског језика је једнозначност.
Према степену развоја програмирања, постоје различити нивои програмирања и то у:
 машинском језику,
 симболичком језику (асемблер),
 вишем програмском језику.
Машински и симболички језици су зависни од рачунарске конфигурације, односно нису исти за
све конфигурације. Програмски језици вишег нивоа не зависе од рачунарске конфигурације.

Програм у машинском језику

Први рачунари радили су помоћу електронских кола њиховим директним повезивањем


„ожичавањем”. Амерички научник Џон фон Нојман (John von Neuman) реализовао је концепт
„рачунара са ускладиштеним програмом”. Осим података у меморији рачунара налази се и
програм. Програм чине наредбе, које имају различите задатке и улоге у програму. Машински језик
заснован је на бинарној азбуци. Свака инструкција, наредба програма представљана је у
бинарном облику, односно низом цифара састављених од нула и јединица. Један знак бинарне
азбуке представља један бит (binary digit).
У зависности од архитектуре рачунара, низови битова имају различита тумачења и различите су
величине, па је потребно да се добро познаје архитектура одређене рачунарске конфигурације.
Пример: Наредба у машинском језику

Прва четири знака означавају операцију коју треба извршити (+, -, *, /).

0110 1010 1011 1100 Последња група битова, означава адресу у коју треба
уписати резултат извршења операције (овде је декадна
адреса 12).

Друга и трећа група битова означавају адресе меморијских локација (овде


су то декадне адресе 10 и 11) у којима се налазе операнди.

Може се сматрати да оваква машина има два нивоа, хардверски – физички, и други, који је изнад
њега, машински. Програм се извршавао тако што је централни процесор рачунара узимао

29
инструкцију по инструкцију из меморије, тумачио њихов операциони код (интерпретирао), а затим
их извршавао. Програмски језик у машинском облику (бинарном) био је спор и непоуздан.
Како је сваки процесор у различитим рачунарима имао свој систем машинских команди, програм
написан за један процесор (рачунар) није могао да се извршава на другом рачунару с другачијим
процесором. Процесор једино разуме програм написан у машинском језику, а чије се наредбе
пишу у бинарном облику. Данас се машински језик користи само у посебним случајевима, ретко,
када треба програмирати специјализоване рачунарске уређаје.

Програм у симболичком језику

Следећи развојни облик наредбе био је писање наредбе симболима који су блиски човеку, и добио
је име симболички, асемблерски језик. Користила су се скраћена симболичка имена, као, на
пример, LDA (Load Accumulator), уместо кодова у бинарним знацима и адреса операнада.
Претходна наредба би, симболичким језиком написана изгледала овако:

ADD A,B C резултат сабирања се смешта у C


ADD представља операцију сабирања броја А и броја B
где су A, B, C симболичке адресе операнада. Ова наредба је разумљива човеку, али не и хардверу
рачунара који треба да је изврши. Зато је направљен посебан програм, који је преводио програм са
симболичког језика на његов машински код који хардвер рачунара разуме. Такав програм назива
се транслатор. Процес програмирања, као и одржавање програма знатно су упрошћени појавом
симболичког језика, али и даље није решен проблем преношења програма и његовог извршавања
на рачунарима с различитим процесорима.

Програм у вишем програмском језику

Амерички научник Џон Бекус (John Backus), је 1954. године с групом сарадника радио на првом
вишем програмском језику FORTRAN-у, и 1957. настао је преводилац (compiler), који је
програме писане у FORTRAN језику преводио на асемблерски језик.
Виши програмски језици знатно су упростили програмирање. Није потребно познавати
организацију рачунара на ком се програми извршавају. Машина је „сакривена” помоћу софтвера,
односно програма преводиоца. Како машину (рачунар) чине хардвер и софтвер, она је с аспекта
посматрања програма виртуелна, и може „директно” да извршава наредбе програма написаног у
вишем програмском језику.
Виши програмски језик је близак и лако разумљив за човека. Наредбе и подаци описују се на
енглеском језику. Тако, претходна наредба написана у симболичком језику за сабирање два броја,
у FORTRAN језику гласила би овако:
C=A+B
Како рачунар разуме само машински облик програма, програм написан на вишем програмском
језику мора се превести на машински језик да би се извршавао на рачунару. На слици 1.1.
приказана је развојна структура програма.
Слика 1.1. – Развојна структура програма

НИВО вишег програмског језика


преводилац — compiler 30

НИВО асемблера
преводилац — assembler
ХАРДВЕР

Треба указати на то да виши програмски језици имају висок степен независности у односу на
различите архитектуре рачунара и оперативне системе на којима се извршавају. Програм
преводилац програмски код у вишем програмском језику преводи у одговарајући машински језик
који се може извршавати на свим рачунарима без обзира на тип.
Не постоји прецизан и јасно дефинисан критеријум за класификацију програмских језика. Може се
рећи да је најчешћа класификација заснована на следећим факторима:
 начину превођења,
 области примене,
 начину решавања проблема.
Према начину превођења током извршавања програма, програмски језици се деле на:
 компајлере и
 интерпретере.
Процесом компајлирања програм се у потпуности преведе па се тек тада извршава. Због тога у
процесу извршавања програма транслатор – компајлер није потребан и не налази се у оперативној
меморији рачунара. Програм који се пише (кодира) у вишем програмском језику, прво се унесе у
меморију рачунара у такозваном изворном облику програма (source code). Преводилац (compiler)
преводи тај облик програма у машински облик програма (извршни, типа .exe), који се затим
може извршавати на рачунару. У процесу превођења (компајлирања) програма преводилац
(компајлер) открива синтаксне грешке које је програмер направио у поступку кодирања програма
у вишем програмском језику и даје листинг обавештења о тим грешкама. Такве грешке називају се
компајлерске (compile-time errors). Компајлер није у могућности да открије грешке које су
логичког или семантичког типа а које су резултат некоректног алгоритма. После сваке грешке
која се исправи, програм се мора поново преводити и извршавање програма почиње од почетка.
Програми писани у интерпретерском програмском језику извршавају се тако што се свака наредба
посебно прво интерпретира, па се извршава. При томе се током извршавања програма транслатор
интерпретерског типа налази у оперативној меморији рачунара, па је веће меморијско оптерећење.
Програм се много спорије извршава услед сталне предаје контроле транслатору приликом
превођења наредби. Уколико у наредби која се тренутно интерпретира постоји грешка, програм не
може даље да настави од тог места на следећој наредби.
Према области примене, програмски језици се деле на:
 програмске језике опште намене и
 специјализоване програмске језике.
Неки од програмских језика опште намене су:
 Basic, развијен 1964, који има за циљ да заинтересује широк круг људи за програмирање. Прва
верзија била је интерпретерског типа. Новија верзија, Visual Basic, данас омогућава решавање
сложених проблема у професионалној употреби, а транслацију програма може да обавља
компајлирањем и интерпретирањем;
 C, који је развијен 1972. да би се користио у системском програмирању као замена за асемблер.
 Креиран је да омогући писање ефикасних програма, док је питање једноставности језика и
 комфорности програмирања било у другом плану;
 C++, који је развијен 1980. да подржава објектно програмирање широко је распрострањен и
популаран међу професионалацима. Данас постоје и појављују се нови програмски језици
засновани на C/C++ програмима. Windows оперативни систем развијен је у C++;

31
 Pascal, који је развијен 1974. да би се обучавали за програмирање, а појавила се и идеја о
структурном програмирању. Даљим развојем Pascal је прерастао у језик за професионално
програмирање. Постоје верзије програма Turbo Pascal за објектно програмирање, који се затим
развио у моћно интегрисано окружење за професионални развој апликација, под именом
Delphi. У данашње време Delphi се користи као алат за пројектовање програмских апликација с
базама података и динамичким апликацијама на вебу и то на свим платформама. Има јасну
логичку структуру, могућност различитих примена (научно-техничке, мултимедијалне,
графичке и у системском програмирању), а може се користити на свим платформама;
 C# и Java, који су у великој мери наследили као основу C/C++ . Остављене су најбоље
осмишљене конструкције, а избачене су комплексне. Креаторима ових језика као да је био циљ
да се направи језик који ће ефикасно и брзо развијати робусне програме. Међутим, програми
писани у C# или Javi доста су спорији од C/C++ програма, па они немају велику примену у
системском програмирању, али су нашли примену у сфери интернет програмирања. При раду с
Java interpreterom програмски код се преводи у псеудокод виртуелне Java машине као
програмски емулатор који се извршава на расположивом хардверу рачунара;
 Aда, је програмски језик направљен за Министарство одбране САД. Одлично структуриран
језик, комплексан, који ради тога нема широку популарност. Користи се за израду софтвера
рачунарских система који се уграђују у самоносеће и крстареће ракете, авионе и космичке
летелице. Програми у језику ADA раде великом брзином, а језик подржава и паралелно
извршавање програма на више процесора.
Специјализовани програмски језици користе се за решавање специјализованих задатака.
Најпопуларнији су:
 Fortran (за научно техничке прорачуне),
 Cobol (за пословну обраду података),
 Modula, Ada (за програмирање у реалном времену),
 Lisp, Refal (за обраду симбола).
Према начину решавања проблема може се извршити подела програмскиј језика на:
 процедуралне и
 декларативне језике.
Одлика процедуралних језика је висок степен алгоритмичности, односно прецизно планирање
поретка акција које се извршавају. Рачунару се даје комплетан скуп инструкција којима се
проблем решава, односно даје му се поступак за решавање задатка. Процедуралним језиком
описује се како се решава конкретан проблем. Такви језици су: Asembler, Fortran, Basic, Pascal,
C, Ada итд. Одлика непроцедуралних језика је могућност апстраховања детаља алгоритма решења
задатка.
Развојем, који је уследио касније, програмски језици декларативног типа полазе од идеје да се
проблеми описују, а да сам систем (интерпретатор) има уграђене поступке како да реши описани
проблем. Описује се шта се зна о проблему и шта се жели добити као резултат његовог решавања,
а систем сам проналази поступак за његово решавање. Примери декларативних језика су: Prolog,
Lisp, Haskell и SQL. Ови програми специјализовани су само за одређене врсте проблема.
У раду с базама података користи се SQL језик. Организовање података у базе података користи
се за велике количине података. Подаци се организују у базне табеле. У раду с њима, програмски
језик SQL користи се за приступ бази ради добијања одређених информација. Ако се подаци о
матурантима налазе у табели под именом Maturant (шифра матуранта, име, презиме, број
освојених бодова итд.), и уколико је потребно израчунати средњу вредност освојених бодова на
матурском испиту, то се може остварити следећом наредбом:

32
SELECT AVG (bodovi) FROM Maturant;

Контролна питања:
1. Какав је поступак у решавања проблема на рачунару?
2. Шта је алгоритам и које су његове карактеристике?
3. Које врсте алгоритма се користе за решавање проблема на рачунару?
4. Шта је псеудокод и како се он користи?
5. Које управљачке структуре се користе у алгоритму?
6. Шта је програмирање?
7. Шта је машински језик, а шта је виши програмски језик?
8. Који се графички елементи користе за састављање алгоритма?
9. Како се програм из изворног програмског језика преводи у извршан облик?
10. Како се могу поделити програмски језици?
11. Које су особине интерпретерских, а које компајлерских програмских језика?
12. Који су програми опште, а који специјализоване намене?
13. Који су процедурални, а који декларативни програмски језици?
14. Објектно оријентисано програмирање (ООП)

33
2.УВОД У ПРОГРАМСКО ОКРУЖЕЊЕ ПРОГРАМСКОГ
ЈЕЗИКА

ОСНОВНИ ЕЛЕМЕНТИ ПРОГРАМСКОГ ЈЕЗИКА

Како је програмски језик Object Pascal саставни део програмског окружења Delphi то је ипак
неопходно да се том језику посвети мало пажње, и то онолико колико је потребно да би се
разумели програми који прате поједине апликације.
Сваки језик био он природни којим се људи споразумевају или програмски који се користи за
програмирање има скуп основних симбола (знакова) кога чине слова, цифре и специјални знаци.
Основни знаци који се користе у програмском језику Delphi јесу:
 слова (велика и мала слова енглеског алфабета),
 цифре (декадне цифре 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) и
 специјални знаци: (#, $, S, (, ), *, +, -, ., /, :, ;, <, =, >, @, [, ], ^, ,, (, ), ', {, } и знаци празнина,
знак за нову линију, за табулацију, итд.
Скуп основних знакова је уређен и коначан где сваки од њих има редни број који зависи од
имплементације програмског језика.
Основни елемент језика предсатвљају и такозване резервисане или службене речи. Резервисане
(службене) речи које се користе у програмском језику Delphi јесу: and, as, asm, array, begin, case,
class, const, constructor, destructor, div, do, downto, else, end, except, exports, file, finalyy, for,
function, goto, if, implementation, in, inhered, inline, initialization, interface, is, label, library, mod,
nil, not, object, of, or, packed, procedure, program, property, raise, record, repeat, set, shl, string,
then, to, try, type, unit, until, uses, var, while, with, xor.
Службене речи имају дефинисано значење и могу означавати наредбе, делове наредби, неке
операторе, неке константе и друге службене елементе језика. Забрањена је употреба службених
речи као идентификатора других објеката у програмима.
Лексички симболи су недељиви низови знакова који могу да представљају: идентификатор,
константе, резервисане (службене) речи, операторе и сепараторе. Могу да се пишу спојено или
раздвојено са знацима празнина (blank), знаком табулације и знаком за прелазак у нови ред. Ако
се два узастопна симбола пишу словима и комбинацијом са цифрама, њиховим спајањем би настао
нови лексички симбол. У том случају мора се користити бар један знак празнине као сепаратор.
Примери:
a div b {ispravno označava celobrojno deljenje}
аdivb {nije ispravno jer bi ovo bio identifikator sa 5 slova, nema praznina izmedju operatora div}
x+y {ispravno}
x * y {ispravno}
Идентификатори или имена служе за означавање основних објеката језика и могу да се састоје
од низа словних и бројних знакова укључујући и знак доња црта (_), а морају почети словним
знаком и не смеју имати празнине (blank). Идентификатор служи за означавање следећих објеката
језика: програма, константе, променљиве, процедуре, функција, својства, поља, типа, модула,
библиотеке и пакета. Препоручује се да се при додељивању имена води рачуна да оно асоцира на
радњу у програму. Имена не могу да буду резервисане речи и стандардна имена, која су одређена

34
за програмски језик. Стандардна имена су резервисана за означавање стандардних константи,
датотека (фајлова), процедура, функција и типова. Не прави се разлика између малих и великих
слова, па се имена могу писати само малим, само великим словима или њиховим комбиновањем.
Сада ћемо се упознати са појмом променљива у програмском језику. Променљива је објекат
језика коме је додељено име и коме се могу додељивати различите вредности. Променљивој се
додељује меморијска локација, односно физичко место у оперативној меморији у коме се чува
вредност променљиве. Регистар меморије се састоји од низа бајтова где је адреса регистра у
његовом првом бајту. У програмским језицима вишег нивоа (осим машинског) за обраду се
користе симбиличка имена променљивих, док транслатор преузима задатак да свакој променљивој
додели меморијски простор у коме ће се чувати њене вредности.
Пример:
Исправно: Oceneucenika или Ocene_ucenika
Погрешно: 2Oceneucenika (почиње бројем), Ocene ucenika (има празнину),
for (резервисана реч)
Да би се знало ком објекту или модулу припада идентификатор, користи се референца, која указује
на припадност идентификатора модулу или објекту. Прво се наводи име ком припада
идентификатор, а затим се ставља тачка, иза које следи име идентификатора.
Пример: Написати да идентификатор с именом identifikator1, припада модулу Unit1.
Unit1.identifikator1
Пример: Написати да метод Click дугмета Button1 припада форми Form1.
Form1.Button1.Click
Бројеви се у програмском језику препознају као:
 ЦЕЛИ, а то су бројеви у декадном запису ( 0, 7, -5 , +32, -3456 итд.) и
 РЕАЛНИ, а то су декадни бројеви са целобројним и разломљеним делом, између којих је
децимална тачка, и ту постоје два облика записа − позициони и експоненцијалан.
Пример: Написани су исправно следећи бројеви у позиционом (фиксном зарезу).
25.6 –56.78 +123.45
Пример: Написани су исправно следећи бројеви у експоненцијалном – покретном зарезу.
2.36Е6 -34.67Е-12 +2.35Е02 –45.03Е6
Симбол Е је мантиса броја, тј. степен броја 10.
У табели 3.1. приказани су неки од примера записа у покретном зарезу.

У Delphi језику Математички запис Вредност


4.56E6 4.56*106 4 560 000
543.21E-2 543.21*10-2 5.4321
-7.9E5 -7.9*105 -790 000
- 0.53E-4 -0.53*10-4 -0.000053
Табела 3.1. – Приказ записа података у покретном зарезу
Знакови се у програмском језику пишу унутар два апострофа (једнострука).

35
36
Пример: Написани су исправно следећи знакови.
'N' '1' '' 'New_York' '0.7+22'
Сепаратори су знаци којима се раздвајају наредбе (;), променљиве у набрајању (,), а знаком (:)
раздвајају се променљиве од типа података ком припадају.
Коментари су објашњења у програмима постављена за аутора или другог читаоца програма са
циљем да се опишу делови програма. Преводилац их занемарује што значи да они немају никакво
дејство у програму. Могу да се поставе између било која два лексичка симбола. Пишу се као
произвољан текст између витичастих заграда {} или две косе црте // иза којих се пише текст
коментара.
Пример: Написани су исправно следећи коментари у програму:
{ovo je komentar izmedju viticastih zagrada}
// ovo je komentar posle znaka dve kose crte
Стандардне директиве су идентификатори са унапред дефинисаним значењем и то су: absolute,
abstract, assembler, at, default, dinamic, export, external, far, forward, index, message, name, near,
nodefault, on, override, private, protected, public, published, read, resident, virtual и write.
Програм је низ наредби написаних у програмском језику и представља логичку целину, односно
решење неког проблема–задатка. Свакако ће се у сваком програму користити основни елементи
програмског језика како би се решавали конкретни проблеми.
При програмирању треба разликовати два сегмента:
 обраду података и
 организацију података који ће се обрађивати.
Обрада података подразумева наредбе којима се подаци обрађују а оганизација података се
остварује преко концепта типа података.
Наредба или инструкција представља посебну реч којом се задаје одређена активност рачунару, а
деле се на:
 извршне (обављају неку акцију обраде у програму, тј. конкретну радњу, обраду података) и
 декларативне (декларишу, описују потребне променљиве, константе и типове података у
програму, процедуре и функције).
Сваки податак који се обрађује у програму мора бити прво експлицитно декларисан.
Декларисањем се податку додељује назив који припада неком претходно дефинисаном типу.

37
РАЗВОЈНО ОКРУЖЕЊЕ И КРЕИРАЊЕ АПЛИКАЦИЈЕ

Програмско окружење Delphi садржи моћан алат за брзо и лако организовање и дизајнирање
комуникације на релацији корисник – апликација чији је резултат професионална апликација за
разне платформе. Омогућава развој софтвера за оперативне системе Windows, Mac Mountain
Lion, Mobile, Linux и стално се унапређује.
Delphi користи програмски језик Object Pascal, који је, у ствари, ООП проширење стандардног
језика Pascal. Синтакса програмског језика Pascal читљивија је и обимнија од C језика, што је
задржано и у проширењу Object Pascal-а, те је тако равноправан с моћним новијим објектно
оријентисаним језицима C++ или Java. Има уграђену подршку за управљање датотекама, приказ
података као API (Application Programming Interface) функција, које фирма Microsoft даје за
израду апликација у Windows окружењу.
Delphi има моћан алат за рад са базама података као и повезивање различитих система за
управљање базама података.
Како је циљ да ученици користе Delphi програмско окружење за савлађивање предвиђеног
наставног плана и програма, у књизи ће се разматрати само они делови програмског окружења
који су за то неопходни.

Прозор Delphi програма и његов интрфејс

Програмски пакет Delphi може се покренути помоћу иконе на радној површини Windows-а или
путем Start менија, затим All Programs дела за избор програма, на ком се пронађе опција која
указује на Delphi и из које се затим изабере одговарајућа иконица. По покретању Delphi програма
на екрану се приказује његов главни прозор (сл. 3.1.).
Уочавају се следећи елементи који се налазе у прозору:
1. насловна линија, а у продужетку дугмад Minimize, Maximize, Close,
2. линија менија главног прозора (File, Edit, Search, View …),
3. линија алата најчешће коришћених команди,
4. картица компоненти на којој компонента има своје алате (Standard, Additional, Win32 …),
5. алат који се налази на картицама (тренутно с картице Standard),
6. прозор форме као радна површина (визуелни образац),
7. едитор изворног програмског кода, који се мало види иза визуелног обрасца,
Object Inspector − прозор за особине (својства) објеката на картици Properties и догађаје
на картици Events,
8. Object TreeView – прозор за хијерархијски приказ структуре компоненти апликације.

38
Слика 3.1. – Прозор који се активира када се стартује Delphi
Стартовањем Delphi-ја аутоматски се покреће рад на новом празном пројекту (апликацији).
Уколико је претходно рађено на некој апликацији, обично се она прво затвори тако што се из File
менија изабере опција Close All, а затим се отвара нови празан пројекат бирањем опција New, па
Application.
Да би се видео едитор програмског кода, из менија View бира се опција Unit, а затим Unit1, те се
помоћу дугмета OK потврди избор програмске јединице, после чега се појављује едитор (сл. 3.2.).

Слика 3.2. – Приказ едитора програмског кода


Враћање на форму могуће је такође путем View менија и бирањем опције Form. Из форме у
едитор програма може се прећи и кликом мишем на прозор за форму или едитор.
Сваки корисник може да прилагоди окружење својим специфичним потребама. У том случају
прозор приказан на слици 3.1. може да буде и другачији.

39
На располагању је интегрисано и интерактивно окружење за програмирање (Integrated
Development Environment). Delphi је програмски пакет који креира Windows апликације које раде
у графичком окружењу. Графички део апликације налази се у датотекама ресурса које описују
изглед (Form1 – форме), док је програмски код у другој датотеци (Unit1). Свака Windows
апликација има бар две датотеке (Form, Unit), а може их имати и више. У поступку пројектовања
апликације настаје пројекат који чини скуп датотека.
Апликацијом се може назвати конкретан кориснички захтев за реализацију на рачунару. Прозори
као графички делови апликације називају се форме. Најједноставнија апликација има само једну
форму која је главна (главни прозор). Сложеније апликације имају више форми (прозора), при
чему је углавном прва форма (прозор) главна, док су остале форме секундарне.
Дизајнирање форме (прозора) професионално је развијено и лако прихватљиво како за
програмере, тако и за кориснике апликација. Креирање прозора је једноставно. Они су јасни,
доброг изгледа и омогућавају решавање корисничких захтева. Могу се правити прозори разних
димензија, постављати различити управљачки елементи, натписи, заглавља, слике,
мултимедијални прикази итд.
Управљање радом у Delphi окружењу омогућено је разним командама приказаним на главном
прозору (сл. 3.3.).

Слика 3.3. – Главни прозор за управљање радом у Delphi окружењу


На линији менија постоје следећи менији: File, Edit, View, Project, Run, Component, Database,
Tools, Window и Help. Команде се могу покренути из менија, али и из линија алата за наjчешће
коришћене команде. На пример, бирањем File менија, приказује се списак за избор разних
команди (сл. 3.4.).

Слика 3.4. – Приказ менија File, подменија New и Help менија


Команде се активирају избором одговарајуће ставке у менију. Очигледно је да неке команде имају
стрелицу с десне стране, што говори да имају свој подмени. На пример ако се жели отворити нови
празан пројекат, пошто се одабере команда New, отвара се следећи подмени као што је приказано
на слици 3.4, а поред отвореног File менија, после чега се бира опција Application. Међутим,
већина команди активира се директно, на пример, за излазак из апликације, бира се команда Exit.

40
Ако се рад на новом пројекту покреће из менија File, избором опције Other, приказује се прозор из
ког се могу покретати разне варијанте креирања апликација (сл. 3.5.).

Овде се жели приказати избор који нуди Delphi за


разне врсте апликација, али ће се указати само на
могућност избора опција Application и Console
Application. Опција Application покреће пројекат
исто као и када се стартује Delphi са свим
својствима, док Console Application стартује тзв.
конзолну апликацију која је својствена
оперативним системима без визуелног графичког
окружења (DOS оперативни систем). Конзолна
апликација нема пратећи формулар, те се у том
режиму рада не могу ни користити Delphi
компоненте за визуелно програмирање.

Слика 3.5. – Прозор за покретање апликација


Ако се покрене команда која се налази y линији алата, а где су и команде које се најчешће користе,
на пример, команда New items отвара се прозор за избор апликација (сл. 3.4.). Зелено дугме са
стрелицом, описано као Run (F9) омогућава компајлирање и покретање апликације. Остале
команде, било из менија, било из алата најчешће коришћених команди, можете прегледати и
анализирати, али ће оне најважније за рад бити касније објашњене у овој књизи.
Посебан мени у ком се могу добити многе информације као помоћ током рада је Help, слика 3.4.
Постоје опције за Delphi Help, Delphi Tools и друге. Командом Help и Contens могу се тражити
информације организоване по поглављима. Командом Help и Search активира се помоћ и
претраживање по темама, и то полазећи од конкретних појмова. Унутар оквира су појмови по
абецедном реду, али се у оквиру за текст може задати и тражени појам. Помоћ се може добити и
употребом дугмета F1 на тастатури. Ако вас занима конкретан појам који је на форми, треба да се
позиционирате на њега и притисните тастер F1.
Покретањем Delphi програма аутоматски се креира тзв. костур апликације којa се приказује у
празној форми с генеричким именом Form1. Ако се зна кориснички захтев, лако се може
конкретан кориснички захтев реализовати на оваквој платформи празне форме. Празну форму
прати одговарајући изворни програмски код с генерисаним именом Unit1. Овај модул садржи
дефиницију форме у типу класе TForm1 укључујући и одређене наредбе.
Приказ садржаја тренутно актуелне датотеке за чување пројекта добија се из менија Project
бирањем опције View Source, после чега се приказује њен садржај, у овом случају празан пројекат
који има следећи програмски код:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

41
Први ред је заглавље, у ком је име пројекта Project1 генерички додељено. У секцији, у којој се
укључују модули uses, налази се модул Forms, као и модул Unit1 из датотеке Unit1.pas, која прати
форму Form1. Нови модули се придружују пројекту (апликацији), коришћењем менија File и
опције Use Unit или убацивањем нових форми које прате одговарајуће програмске јединице.
У блоку извршних наредби (begin...end.) прво се наредбом Application.Initialize иницијализује
апликација, а затим извршавање апликације из пројектне датотеке почиње наредбом Application.
CreateForm(TForm1, Form1) која креира форму, док се наредбом Application.Run наређује да се
изврши апликација, и у овом случају при извршавању ће се приказати само празна форма.
Објекат Application управља током пројекта у извршавању и за то има одговарајућу подршку.
Овде се неће разматрати шта овај објекат ради, а препоручује се да се ова датотека не мења, осим
ако се то посебно не нагласи. Појам пројекат поистовећује се с појмом апликација (апликативни
програм) те их убудуће треба тако посматрати.
Модул за програмску јединицу (Unit1) у коме се чува изворни програмски код има следећи
садржај:

unit Unit1; Заглавље програмске јединице

Део за спрегу
interface
Део за листу модула
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Део за дефинисање класе форме
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public Део за декларацију инстанци, метода и променњивих
{ Public declarations }
end; Део за реализацију
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
Први ред представља заглавље модула у ком је програмској јединици додељено генеричко име
Unit1. Први део модула почиње од речи interface и чине га декларативни одељци, на пример
одељак type, у ком се налази дефинисана класа форме и var, за декларацију метода, процедура,
функција и променљивих у програму. Касније ће у оквиру програмске јединице (модула) бити
више речи о овим одељцима и њиховим деловима.
Иза резервисане речи implementation је место на ком се дефинишу методе као потпрограми који
програмирају радње које се обављају на датој форми. Оно је у тренутку покретања нове
апликације празно зато што образац не садржи ниједну методу. За програмера почетника то је
једино место на ком ће он нешто да програмира.

42
У оваквом костуру програма представљена је празна форма, без компоненти, које се касније могу
постављати према задатку у поступку програмирања, а што се чува у одговарајућем програмском
модулу. Генеричко име TForm1 је класа наслеђена од класе TForm, што значи да садржи сва њена
својства и методе. Графички класа TForm1 представља форму којој се додају контроле потребне
за функционисање апликације, што значи да програмер мења и надограђује њен садржај.
У празном пројекту (апликацији) програмер још ништа није програмирао. То значи да није
поставио ништа ново на форму, нити је програмирао било какав догађај. Delphi је пројектован да
реагује на догађаје, а сваки од њих има одговарајућу методу (процедуру), која обрађује конкретан
догађај.
На форми за рад (Form) обавља се визуелно програмирање тако што се постављају разне
компоненте (контроле), док се у позадини овог прозора налази датотека програмске јединице
(Unit), која представља изворни програмски код апликације. У овом случају апликација има само
једну форму (Form1), и једну датотеку програмске јединице (Unit1). Затим се програмирају разни
догађаји на компонентама у циљу да апликација постигне функционалност за проблем који
решава.
Програмер може да прави сопствене форме с пратећим програмским јединицама. Програмер може
да направи колико жели програмских јединица, при чему не морају све да имају форме, што је
уобичајено када се не захтева визуелно приказивање, односно када није потребна форма као радна
површина. У том случају се отварање програмске јединице без форме обавља отварањем File
менија и бирањем опције New, па опције Unit. Аутоматски, Delphi у том случају мења главни
програм, односно пројектну датотеку додајући те модуле у секцију uses.
Delphi располаже са уграђеним програмским модулима који нису укључени када се стартује нови
пројекат, али се они могу накнадно укључити по потреби.
Пример: Укључивање уграђених модула Math и StdCtrls у програмску јединицу Unit.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Math, StdCtrls;
У раду с Delphi-јем често се отварају и затварају датотеке како би се радило на различитим
деловима пројекта. За то се користи File мени. Затварањем пројекта Close или Close All, када се
налази на програмској јединици (Unit), аутоматски се затвара и придружена форма (Forms).
Датотеке се отварају из File менија бирањем опција Open, или Reopen. Опција Reopen користи се
да би се поново отворила једна од недавно отворених датотека. Када се отвара датотека
програмске јединице, аутоматски се, ако она има придружену форму, отвара и форма.
Датотеке се чувају помоћу File менија, и то бирањем опције Save која има следеће облике:

Облик Save опције Опис дејства


Save Снима програмску датотеку.
Save As Снима програмску датотеку под другим именом.
Save Project As Снима датотеку пројекта под другим именом.
Save All Снима све датотеке пројекта на ком се ради.
У поступку чувања датотеке пројекта (наставак .dpr) име које се додели пројекту биће и име
апликативног програма, које се преводи у извршни облик. Пројектна датотека са придруженим
наставком .dpr је текстуалног типа и представља главну датотеку пројекта. Датотека садржи све

43
информације о формама и програмским јединицама (модулима) који су укључени у апликацију
(пројекат), као и наредбе за иницијализацију и покретање програма.
Препоручује се да се за прво снимање новог пројекта користи Save All, јер ће се тада прво
понудити да се сачува програмска јединица као посебна датотека (Unit) са наставком .pas, а затим
пројекат датотека с наставком .dpr. При томе датотека која садржи вредности које описују
својства форме као и својства компоненти (контрола) постављених на њу, биће сачувана
аутоматски са истим именом као и датотека програмске јединице, али са придруженим наставком
.dfm.
На тај начин се сачувају све потребне датотеке за рад на датом пројекту у два корака.
Напомена: Датотеке типа .pas и типа .dfm не треба брисати.
Чување се по правилу обавља у фолдеру Project, али се зато може креирати и други фолдер.
Уколико се жели чување у посебном директоријуму (фолдеру), потребно га је креирати. Ради
лакшег рада такође се препоручује да се сваки пројекат смести у посебан директоријум на диску.
Програм написан у изворном програмском коду, да би се могао извршавати на рачунару, мора се
превести у извршни програмски код. Превођење (компајлирање), те истовремено и извршавање
програма најједноставније се реализују притискањем тастера F9. За извршавање пројекта може се
користити и зелено дугме у облику троугла ( ).
У режиму извршавања (Run mode) програм се може тренутно зауставити и предати контролу само
ако наиђе на тачку прекида која је убачена у програм или ако је из Run менија активирана команда
Program Pause. Тачке прекида могу се активирати и деактивирати тастером F5. Када програмер
жели да се програм извршава поступно, корак по корак, притисне се тастер F8 или тастери
Alt+R+S. У том случају програм се зауставља на свакој наредби, али ће се процедуре и функције
извршавати без застоја. Ако се жели поступно испитивање процедура, притисне се тастер F7 или
се из Run менија изабере опција Trace Into, што се користи за откривање и отклањање грешака у
програму.
Елементи апликације(пројекта)
Приликом креирања пројекта (апликације) када се обавља његово чување, поред датотеке за
програмску јединицу у којој се налази изворни програмски код модула форме са наставком .pas,
датотеке која представља главну пројектну датотеку са наставком .dpr и датотеке која садржи
вредности које представљају својства форме и својства свих контрола на форми са наставком .dfm,
настају и следеће датотеке које чине целину пројекта(апликације):
− .dcu, која садржи преведени (компајлирани) облик изворног програмског кода датотеке с
наставком .pas и која се укључује у извршну .exe датотеку. Ако се избрише, поново се може
креирати превођењем апликације;
− .res, која садржи бинарне ресурсе, као што су системске иконе и друге битмапе. Оне се могу
мењати путем Image Editor-а који се налази у менију Tools;
− .cfg, текстуална датотека која чува конфигурације пројекта, и има исто име као датотека
пројекта;
− .dsk, датотека која чува стање Delphi окружења, и има исто име као датотека пројекта;
− .exe, извршна датотека апликације која се добија компајлирањем пројекта;
− .~dpr, .~dfm, .~pas, представљају копије датотека које се могу брисати ако се не желе чувати
претходне верзије програма.
Све датотеке (фајлови) који настану приликом креирања апликације могу се видети унутар
фолдера у коме је апликација сачувана помоћу програма Windows Explorer-a.

44
На слици 3.6. приказано је шта све улази у састав апликације:

Слика 3.6. – Приказ структуре пројекта – апликације


На основу приказане слике може се закључити да пројектна датотека са наставком .dpr може
имати један или више програмских модула које прате одговарајуће форме али могу да буду
укључени и само програмски модули без форми. Пројекат може укључивати потпрограме као
програмске модуле о којима ће се касније говорити. Компајлирањем пројекта (датотеке .dpr)
настаје програм који се извршава на рачунару (апликација) и та датотека је типа .exe.
Сваки задатак који се решава у Delphi окружењу сматра се апликацијом или пројектом. Од захтева
постављеног задатка зависи које ће се компоненте поставити на форму (Form) и који ће се
догађаји применити на постављене компоненте рачунајући и саму форму. Обраду сваког догађаја
прати одговарајућа метода, која се програмира у оквиру програмске јединице (Unit-a) која прати
форму или у оквиру посебне програмске јединице.
Како се сада разматра програмско окружење Delphi, то би се могло за основне елементе објектног
програмирања рећи следеће:
 Објекат је основни елемент и има одговарајућа својства, методе које дефинишу његово
понашање и могуће догађаје на које реагује.
 Својства објекта су следеће карактеристике: величина, боја, позиција, величина фонта и
др. Својства одређују појављивање и понашање објекта.
 Догађаје активира или корисник програма или оперативни систем.
 Метода је програмски код који се придружује објекту и одређује реакцију на догађај
активиран на објекту, или другачије речено догађај активира неку обраду података која се
програмира у методи.
Delphi алат омогућава визуелно уређивање прозора (форми), постављање компоненти на форму,
као и подешавање њихових својстава и померање по екрану. Тај део се назива и дизајнирање
апликације, при чему нема никаквог писања програма. Програмира се када се активира неки
догађај апликације на који треба одговорити (нпр., клик мишем на неко дугме), после чега се
активира метода којом се врши обрада тог догађаја.
Постоји и верзија Delphi програмског пакета за оперативни систем Linux под именом Kylix.

Библиотеке визуелних компоненти (VCL)

45
Објектно оријентисани језици поседују велики број већ креираних класа и њихови објекти могу се
користити за креирање апликација. У Delphi окружењу оне се налазе у оквиру библиотеке
визуелних компонената (Visual Component Library - VCL). Класе у Delphi-ју образују
хијерархијско стабло (дрво) с називима класа из VCL библиотеке.
Структура класa може се видети када се из View менија бира опција Browser, после чега су у
прозору приказане класе као на (сл. 3.7.):

Слика 3.7. – Приказ структуре класа у библиотеци VCL


TObject је најстарија класа („прадеда“) и све класе настају од ње. Испод класе TObject налази се
TPersistent класа која управља могућностима компоненти да саме себе сниме у датотеке и
меморију. Дакле, није потребно много да се зна о класи TPersistent, јер за већину апликација у
Delphi-ју нису значајне.
Објекти готових класа могу да буду форма (TForm), дугме (TButton), поље за унос текста (TEdit)
и многи други, који ће се користити у овој књизи. О класама које стоје на располагању у овој
библиотеци биће више речи касније у овој књизи.
На слици 3.7. указано је на стабло структуре класа са њиховим именима. Велики део VCL костура
састављен је од класа које представљају компоненте. Остале класе нису у вези с компонентама и
оне извршавају задатке спремања − понашају се као помоћне класе и пружају неке помоћне
сервисе. Хијерархија VCL класа која се бави компонентама је комплексна, али за програмирање
није потребно знати њену детаљну структуру. Међутим како се у овој теми говори о развојном
окружењу програмског језика, сматрамо да треба укратко објаснити неке од класа. На највишем
хијерархијском нивоу налази се TObject.
Класа TComponent служи као фундаментална класа повезана с компонентама, и она подржава
комплетну функционалност основним компонентама. Невизуелне компоненте издвојене су
директно из класе TComponent.
Визуелне компоненте издвојене су из класе TControl, која је издвојена из класе TComponent.
Класа TControl омогућава додатну функционалност коју захтевају визуелне компоненте. Пре
додавања било које компоненте на образац Delphi издвоји нову класу из класе TForm (случај

46
класе TForm1 = class(TForm)) како би ова класа приказала образац (форму). Када се компонента
постави на форму, она се аутоматски прикључује у декларацији класе форме, и додељује јој се
унапред дефинисано име у својству Name које је повезано са одговарајућом класом. Ако се на
пример, у апликацији на форму постави компонента Memo, она се прикључује у декларацији класе
форма са именом Memo1 које је повезано са класом TMemo. То име се путем својства Name
може променити. Слично се догађа и с осталим компонентама (нпр., TButton). Мало познавања
VCL класа и компоненти неопходно је пре почетка рада са VCL компонентама.
Садржај VCL компоненти налази се на адреси ProgramFiles\Borland\Delphi7\Source\Vcl. Из
списка понуђених може се бирати жељена датотека за комоненту. За пример ће бити отворена
датотека Buttons.pas и изабрана класа TBitBtn. После тих активности приказује се прозор који се
види на слици 3.8. Слично се могу видети и садржаји других датотека као на пример: Forms.pas,
Graphics.pas, Menus.pas и др.

Слика 3.8. – Приказ садржаја датотеке визуелних компоненти Button.pas.

Класе апликација и форми

Класе апликација и форми представљају објекте и форме Application у VCL библиотеци. Оне су
издвојене из класе TComponent и саме представљају класу. Издвојене су да би их разликовали од
контрола које се постављају на форму. Класа TApplication енкапсулира основне операције
Windows програма. Она управља иконицом апликације, за одређене делове даје одговарајуће
помоћи, управља порукама. Свака Delphi апликација има показивач (поинтер) на објект
TApplication, који се назива Application.
Класа TForm енкапсулира форме (обрасце на екрану на које се постављају компоненте). Форме се
користе за главни прозор, оквире за дијалог, секундарне прозоре и скоро све типове прозора.
Садржи велики број својстава, метода и око 20 догађаја.

Класе компоненти

Ова група класа садржи широк спектар класа које даље могу да буду подељене у одвојене
категорије. Тако могу да буду:
 класе стандардних компоненти − Standard,

47
 класе додатних компоненти − Additional,
 корисничке класе за контролу − Win32 итд.
Стандардне компоненте енкапсулирају већину уобичајених Windows контрола, а то су следеће
компоненте: TButton, TEdit, TListBox, TMemo, TMainMenu, TScrollBar, TPopupMenu,
TCheckBox, TRadioButton, TRadioGroup, TGroupBox, TPanel, TActionList. Већина ових класа
енкапсулира Windows контроле.
Компоненте на картици Additional су: TBitBtn, TSpeedButton, TMaskEdit, TStringGrid,
TDrawGrid, TImage, TShape, TBevel, TScrollBox, TCheckListBox, TSplitter, TStaticText,
TChart.
Компоненте на картици Win32 енкапсулирају већину корисничких контрола 32-битних верзија
оперативног система Windows. На располагању су класе: TListView, TTreeView, TTrackBar,
TProgressBar, TTabControl, TPageControl, TRichEdit, TImageList, TStatusBar, TAnimate,
TDateTimePicker, TToolBar, TCollBar и друге. Неке од ових контрола су по самој природи
компликоване, па су и VCL класе које их представљају исто тако компликоване.
Постоје и друге класе − компоненте, као што су:
 класе компоненти базе података − картице DataControls, DataAccess и друге,
 класе уобичајених дијалога − TOpenDialog, TSaveDialog, TOpenPictureDialog,
TSavePictureDialog, TFontDialog, TColorDialog, TPrintDialog, TPrinterSetupDialog,
TFindDialog и TReplaceDialog,
 класе системских компоненти − картица System,
 класe компоненти − картица Win 3.1,
 класе интернет компоненти − картица Internet,
 класе контроле за ActiveX − картица ActiveX,
 класе за графички интерфејс − TCanvas, TBrush, TPen, TBitmap и TFont,
 помоћне класе − TIniFile, TRegistry, TRegkeyInfo, TStringList, TList, TStream, TFileStream,
TMemoryStream и TResourceStream.
Међутим, циљ ове књиге није да се савлада комплетан алат Delphi програма и све његове
могућности, већ да се искористе само неке које су потребне. Тако ће се у деловима где је потребно
појављивање нове класе дати и објашњење о њеној практичној примени.

КОМПОНЕНТЕ ЗА КРЕИРАЊЕ АПЛИКАЦИЈЕ

Delphi софтверски пакет за развој апликација користи систем под називом RAD – Rapid
Application Development, у ком се објекти представљају као компоненте. Компоненте се могу
поставити на форму и с њима се може манипулисати путем својстава, догађаја и метода. Концепт
оваквог рада познат је као визуелно програмирање. Програми писани у Delphi окружењу
извршавају се десетине пута брже од програма писаних у Visual Basic-у.
VCL компоненте су објекти који извршавају одређени задатак у вези с програмирањем и налазе се
у оквиру Delphi класа. Својства, методе и модели догађаја чине јавни интерфејс компоненти у
оквиру VCL-a (део компоненти које корисник види).
Delphi располаже с велким бројем компоненти за креирање разних апликација. Компоненте су
распоређене по картицама на палети за избор компоненти. Компоненте могу да буду визуелне,
невизуелне, управљачке с прозором и управљачке без прозора.

48
Компоненте су груписане по картицама са ознакама: Standard, Additional, Data Access, Win32,
System, DataAccess, Data Control, итд. За постављање било које компоненте на форму, треба
левим кликом тастера миша одабрати прво одговарајућу картицу, а затим компоненту, па онда на
место где се жели поставити на форму кликнути мишем. Слика 3.9. приказује палету компоненти
груписаних по картицама где је отворена картица са компонентама Standard.

Слика 3.9. – Палета с избором компоненти


Део картица са компонентама се не види, али на горњем десном углу су постављене стрелице за
навигацију по разним картицама које су расположиве. Задржавање стрелице миша на неком
дугмету подсећа програмера поруком испод дугмета о којој се компоненти ради.

Може се из View менија бирањем опције Component добити листа компоненти сортираних по
абецедном редоследу. Слика 3.10. приказује такву листу.

Ако се двапут кликне на леви тастер миша на одређену компоненту та


компонента ће се аутоматски поставити у образац и то у средину.

Уклањање компоненте једноставно је и прво се селектује једна или више


компоненти кликом, а затим присисне тастер Delete на тастатури.

За постављање компоненте на форму, уобичајено је да се прво изабере картица


са које ће се бирати компоненте, а затим сама компонента, те после тога клик
мишем на форму(образац).

Слика 3.10. Листа компоненти из View менија

Како нам није циљ да научимо програмски алат Delphi до детаља, већ само основно о креирању
Windows апликација, користећи његово окружење, овде ће бити речи само о неким компонентама,
њиховим својствима и догађајима потребним за тај циљ. Компоненте ће се поставити на места по
плану којим је конципирана књига, а углавном пре него што се за то прикаже пратећи пример
апликације.
Када се стартује нова апликација са палете компоненти отвара се картица са алатима типа
Standard. На њој се налазе следеће компоненте: Frames, MainMenu, PopupМenu, Label, Edit,
Memo, Button, CheckBox, RadioButton, ListBox, ComboBox, ScrolBar, GroupBox, RadioGroup,
Panel и ActionList.
Својства (properties) су параметри чије вредности одређују тренутно стање компоненте. Могу да
буду расположива за време пројектовања апликације или за време извршења апликације. Постоје и
посебна својства чије се вредности могу очитати, али се не могу променити.
Најзначајнија својства компонената су:
1. име,
2. поседовање,
3. припадност,
4. видљивост и употребљивост,
5. положај и величина,

49
6. натпис − наслов,
7. изглед.
Име компоненте (Name) припада својству типа string. Користи се за приступање датој
компоненти. Све форме истог пројекта морају имати различита имена. Све компоненте унутар
исте форме морају да имају различита имена. Имена не треба мењати за време извршавања
апликације.
Поседовање компонената говори ко је власник свих форми и компоненти на њима. Пројекат
(апликација) је власник форми. Форме су власници постављених компоненти. Власник компоненте
налази се у својству Owner типа TComponent. Број компоненти којима је дата компонента
власник, налази се у својству ComponentCount типа Integer. Низ компонената, чији је власник
компонента, налази се у својству Components типа TComponent. Индекс компоненте,
представљен својством ComponentIndex типа Integer, одређује место компоненте у низу.
Припадност компонената говори о хијерархији компоненти. Како се свака компонента сматра
посебним објектом, неки од њих су претходници а неки су следбеници. Тако је нека компонента
претходник (родитељ) а нека је следбеник (дете). Компонента постаје дете када се постави у радни
простор компоненте родитеља. Компонента родитељ представља се својством Parent. Број деце
неке контејнерске компоненте налази се у својсту ControlCount типа TComponent. Својством
ComponentIndex типа Integer одређује место компоненте у низу компонената.
Видљивост и употребљивост компонената контролише се својством Visible (видљиво) типа
Boolean. Вредност True означава да ће се компонента приказивати на екрану, а вредност False да
компонента неће бити приказана. Употребљивост компоненте, тј. да ли жижа може да се помери
на компоненту контролише се својством Enabled (омогућено) типа Boolean. Ако је вредност True,
компонента је употребљива, иначе је неупотребљива.
Положај компонената одређен је координатама Top (на врху), Left (улево), у односу на горњи
леви угао радног простора родитеља посматране компоненте.
Величину компоненте одређују својства висина (Height) и ширина (Width).
Величина радног простора компоненте исказује се помоћу својстава:
 ClientHeight (висина клијента),
 ClientWidth (ширина клијента),
 Constraints (ограничења),
 Align (поравнање),
 Anchors (релативан положај у односу на ивице родитеља).
Натпис компоненте је описни текст за дату компоненту. За то се користи својство Caption типа
String. Подразумевана вредност натписа поклапа се с именом (Name). Може да се поставља за
време пројектовања и да се мења за време извршавања апликације. У управљачким компонентама
испред једног знака у натпису може да се стави знак &. Тако обележен знак је пречица.
Изглед компоненте представља начин на који ће се она приказати на екрану. За то се користе
следећа својства:
 Ctl3D (тродимензионална компонента) типа Boolean с подразумеваном вредношћу True, која
означава приказивање са тродимензионалним ефектима, а вредност False означава
дводимензионално;
 ParentCtl3D (тродимензионалност родитеља) типа Boolean с вредношћу True која означава да
компонента преузима вредност својства Ctrl3D од свог родитеља. Вредност False означава да
се број димензија компоненте подешава независно од родитеља;

50
 BorderStyle (стил ивица) с вредношћу bsSingle (једнострука) означава исцртавање оквира чије
су ивице једноструке линије, а вредност bsNone (ништа) означава одсуство оквира.
 BevelKind (врста косина) одређује да ли се око компоненте приказују косине или се не
приказују:
 BevelOuter (спољашња косина),
 BevelInner (унутрашња косина),
 Cursor (показивач) одређује изглед показивача миша,
 Color (боја) одређује боју компоненте,
 Font (фонт) одређује особине слова.
Својства компоненти (properties) контролишу понашање компоненте или, боље речено, како
компонента може да изведе неку акцију. Већина компонената има заједничка својства. На пример,
све визуелне компоненте имају својства Top (горе) и Left (лево). Та два својства контролишу где
ће компонента бити постављена током дизајнирања, односно током рада програма. Све
компоненте имају својство Owner (власник), коју VCL користи за праћење компоненти потомака
за одређену форму претка, односно компоненту која је поседује. Својства компоненти могу се
видети у Object Inspector-у.
За идентификацију својства у програмирању користи се прво име објекта, иза ког се ставља тачка,
па затим својство. На пример: Form1.Caption.
У табели 3.2. приказана су својства која су заједничка за многе компоненте, али са напоменом да
неке компоненте немају сва ова својства:
Р.бр. Својство Функционалност компоненте
1. Name име контроле које се користи током програмирање
2. Text текстуални садржај придружен контроли као вредност
3. Caption вредност својства је описни текст за контролу
4. Font вредности својстава и његових подствојства везани су за фонт
5. Left лева позиција на екрану
6. Top горња позиција на екрану
7. Align хоризонтално поравнање на екрану
8. Width ширина
9. Height висина
10. Color боја позадине
11. BorderStyle стил ивица прозора
вредност својства true указује да посматрано својство постаје активно,
12. Enabled
док вредност false указује да није активно
одређује видљивост контроле при извршавању апликације
13. Visible
(вредност true да је видљива, док вредност false да није видљива).
14. TabOrder редослед постављених компоненти на форми

Табела 3.2. – Својства заједничка за многе компоненте


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

51
Компоненте управљају током извршавања апликације, па се називају и контроле. Како је циљ да се
у овом делу књиге ученици упознају са развојним окружењем, и при томе објасни основно о томе
како функционише програмирање вођено догађајима, посматраћемо само неке контроле и то:
компонентe за описивање (Label и StaticText), акционо дугме (Button), пољa за унос и
приказивање података (Edit, MaskEdit и LabeledEdit), и компоненту часовник (Timer).
Приликом креирања апликација уочавају се две етапе које се међусобно преплићу: етапа
дизајнирања корисничког интерфејса, која се односи на постављање компоненти на образац и
етапа кодирања, која све те промене прати уписивањем одговарајућег програмског кода у
програмску јединицу.

Компонента Label

Компонента Label налази се на картици Standard, и означена је словом A на дугмету. Користи се


за приказивање описног текста наслова, за опис компоненти на форми или приказ излазних
података. Својства ове компоненте се лако мењају у Object Inspector-у, а могу се мењати и у току
извршавања апликације.
Својства која има ова компонента већ су набројана у табели 3.2, осим својстава Text и BorderStyle
која ова компонента нема. Својства која има ова компонента а не налазе се у табели су:
 AutoSize – за промену дужине текста који се уноси у својству Caption (подразумевана
вредност је True значи да се мења дужина, а вредност False да се не мења),
 Aligment – одређује хоризонтално поравнање текстуалног описа у односу на својство за
ширину Width,
 Layout – одређује вертикално поравнање текстуалног описа у односу на својство за висину
Height,
 WordWrap – за прелом текста (вредност True дозвољава прелом текста, док вредност False
не дозвољава).

Компонента StaticText

Користи се у исте сврхе као и компонента Label. Разлика је у томе што компонента статички
текст (StaticText) на описни текст може поставити оквир. Компонента се поставља на форму са
картице Additional на којој се налази дугме пречица са описним именом StaticText.
Сва својства наведена за компоненту Label користе се на исти начин и за статички текст, с тим да
ова компонента нема својства Layout и WordWrap, а додатна својства за постављање оквира су:
 BevelEdges са подсвојствима (beLeft, beTop, beRight, beBotton) – косине ивица оквира,
 BevelInner – унутрашња косина оквира,
 BevelKind – врста косине оквира,
 BevelOuter – спољашња косина оквира,
 BorderStyle – стил ивица оквира.

Компонента Edit

52
Компонента Edit налази се на картици Standard, означена дугметом ab и описним именом Edit.
Користи се за унос и приказивање података у једном реду. У својству Text, ова компонента
обухвата прихватање и приказ података у облику стринга без обзира да ли су унети подаци
специјални знакови, слова или бројеви.
Својства која има ова компонента већ су набројана у табели 3.2, осим својстава Caption и Align
која ова компонента нема, а уколико се појаве нова, биће додатно објашњена.
Својства која се не налазе у табели су:
 CharCase – омогућава избор приказа слова када се куцају на тастатури, тако да их
приказују како се уносе сва слова мала и сва слова велика,
 MaxLength – максимални број знакова који се може уписати у поље,
 PasswordChar – омогућава унос знакова који се приказују у оквиру за текст када је
потребно унети лозинку,
 ReadOnly – омогућава избор да се текст може само читати а не може уписивати, али и да
се може и читати и уписивати.

Компонента MaskEdit

Ова компонента (оквир за текст с маском) користи се у исте сврхе као и компонента Edit и има
сличан изглед. Разликује се по томе што може да наметне тачно одређени формат за уношење
података (нпр. само цифре). Налази се на картици Additional као дугме пречица са описним
именом MaskEdit. Својство EditMask (маска за уређивање) типа String дефинише маску за
форматирање података током уношења преко тастатуре. Поред својства EditMask када се кликне
на дугме три тачкице појави се формулар као на слици 3.11:

Слика 3.11. – Садржај едитора за постављање маски у компоненти MaskEdit


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

Компонента LabeledEdit

Ова компонента (оквир за текст с описом) представља комбинацију оквира за текст и лабеле
(описа). Компонента се налази на карици компоненти Additional као LabeledEdit и поставља се на
исти начин као и компонента Edit.

53
Има иста својства као и компонента Edit и додатно још:
 EditLabel – компонента оквира за текст са описом где се у подсвојство Caption уноси
опис,
 LabelPosition – положај ознаке у односу на оквир за текст (lpAbove, lpBellow, lpLeft,
lpRight),
 LabelSpacing – растојање од оквира за текст до описа.

Обично дугме Button

Компонента Button се налази на картици Standard. Користи се као акционо дугме преко кога се
активира догађај за обраду података.
Својства која има ова компонента већ су набројана у табели 3.2, осим својстава Text, Align, Color
и BorderStyle која ова компонента нема. Својство које се не налази у табели WordWrap већ је
објашњено у компоненти Label.

Компонента часовник (Timer)

Часовник је невизуелна компонента помоћу које може да се мери време. Он генерише догађај
OnTimer у тренутку када истекне задати период времена. То омогућава да програм у тим
тренуцима нешто уради, а да корисник не изврши никакву акцију. Налази се на картици
компоненти System са описним именом Timer.
Својства компоненте су:

 Name – име компоненте,


 Interval – одређује временски интервал учесталости догађаја OnTimer,
 Enabled – одређује да ли часовник ради, подразумевана вредност True означава да
часовник ради, а Fal1se да је часовник заустављен.
Напомена: Имена наведених компоненти су унапред дефинисана са њеним скраћеним називом и
редним бројем компоненте, као што приказује табела 3.3:
Компонента Унапред дефинисана имена
Form Form1, Form2, Form3 itd.
Label Label1, Label2, Label3 itd.
StaticText StaticText1, StaticText2, StaticText3 itd.
Edit Edit1, Edit2, Edit3 itd.
LabeledEdit LabeledEdit1, LabeledEdit2, LabeledEdit3 itd.
Button Button1, Button2, Button3 itd.
Timer Timer1, Timer2, Timer3 itd.

Табела 3.3. – Унапред дефинисана имена компоненти


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

54
Тако се за компоненту Form може користити испред имена словни знак f иза кога се наводи опис
форме за шта се она користи у апликацији (нпр . за име форме где се у апликацију рачуна камата
форму у својству Name назвати fKamata). За компоненте Edit, у истој апликацији у којој се уносе
подаци о износу новца који се орочава и износу камате, у својству Name се могу доделити на
пример имена eIznos и eKamata. Слично применити и на остале компоненте где се прво испред
поставља словни знак компонентe (Label – l, StaticText – st, LabeledEdit – le, Button – b, Timer –
tm за компоненте ). Додељивањем имена компонентама избгава се забуна у апликацији која
компонента се за шта користи, а посебно ако има више истих компоненти.
Ову препорука се не мора поштовати. Могу се имена компоненти оставити како су унапред
дефинисана (default) или им се доделити произвољна имена која дозвољава преводилац.

Етапа дизајна корисничког интерфејсе

У етапи дизајнирања корисничког интерфејса се на форму, која представља основу за грађење


апликације, постављају компоненте путем којих ће корисник комуницирати с апликацијом. На
пример, то могу да буду компоненте за унос података (Edit), часовник (Timer), дугме за
покретање неког догађаја (Button), текст за описивање Label и др. Ове компоненте су контроле.
Корисник на форми види промене настале у овој етапи. Објекти, који се у фази дизајнирања
постављају на форму, бирају се с картице компоненти. Ако то буду компоненте Edit, Button,
Label, то ће бити картица Standard, а ако је то компонента Timer, то је картица System. Слично је
и за остале компоненте. Својства компоненти могу се мењати у фази дизајнирања било да се мења
величина, било да се мењају боја, позиција и слично.
Када се стартује Delphi, појављују се два прозора − Object TreeView и Object Inspector. На слици
3.12. приказан је прозор Object Inspector-а са својствима и догађајима који припадају празној тек
отвореној форми. Картица Properties користи се за описивање својстава објекта, у овом случају за
форму (Form1), а картица Events за активирање догађаја.

Слика 3.12. – Прозори Object Inspector и Object TreeView


Компонента се на форму поставља тако што се прво одабере картица са припадајућим
компонентама, па се кликне левим тaстером на одговарајућу компоненту, а затим кликне на
одређено место на форми где се жели поставити. Даљи рад са овом компонентом, подешавање
својстава и програмирање догађаја ради се преко Object Inspector-а. Најпре се компоненти додели
име у својству Name, после чега се у прозору Object Treeview-a приказује име те компоненте као
садржај обрасца. После именовања компоненте следи даље подешавање својстава и програмирање
догађаја.

55
На тако отворену празну форму Form1 додате су следеће компоненте: Label, Edit, Button и
Timer. Прве три налазе се на картици Standard док је последња на картици System. После
постављања компоненти на слици 3.13. приказани су: форма са компонентама, стабло компоненти
и програмски код унутар програмског модула (јединице) Unit1.

Слика 3.13. – Форма са компонентама, Object TreeView и модул Unit1

Компонента у жижи

За компоненту која је тренутно активна каже се да је она у жижи. То значи да се тој компоненти
могу мењати својства. Компонента која је у жижи означена је са осам црних квадратића, а на врху
прозора Object Inspector-а та компонента означена је сивом бојом. Ако се погледа слика 3.13,
компонента у жижи је дугме Button1. Када се апликација извршава, компонента у жижи
препознаје сe на разне начине. Ако је у жижи компонента Button, видеће се тачкице у оквиру око
описа, а ако је у жижи компонента Edit, трепереће курсор унутар ње.
У једном тренутку, само једна компонента може бити у жижи. Премештање жиже између
компоненти обавља се тастером Tab преко тастатуре или кликом миша на компоненту. Треба
нагласити да неке компоненте не могу бити у жижи. Својство компоненте TabStop је обавезно
поставити на True да би она била у жижи.
Пример: uSvojstva, pSvojstva, fSvojstva
Дизајнирати апликацију тако да се на форми промене својства: име (Name), текстуални опис у
насловној линији (Caption), позиција лево од ивице екрана (Left), висина форме (Heigh) и ширина
форме (Width). На форму поставити компоненту Label за описивање текстом. Постављеној
компоненти Label у оквиру својства Font подесити да величина слова буде 14 и боја плава, а
затим у својству Style подесити да слова буду болдована.
Процедура за решавање задатка:
1. Отворити нови празан пројекат и сачувати га с именом за програмску јединицу uSvojstva, а за
пројекат pSvojstva.
2. За додељивање имена форми, позиционирати се на својство Name и у поље поред њега уписати
име fSvojstva, па се затим позиционирати на својство Caption и у поље поред уписати опис
Promena svojstava u dizajnu. Потом се позиционирати на својство Left и у поље поред уписати
вредност 200, па на својство Heigh и у поље поред уписати 350 и на крају бирати својство
Width и у поље поред уписати вредност 300. Док се мењају вредности, уочавају се промене на
форми.

56
3. С картице Standard бирати компоненту Label, а затим је поставити кликом мишем на жељено
место у форми. У својству Name променити име компоненте на lNaslov, а у својство Caption
уписати текст описа MENJANJE SVOJSTAVA.
4. Маркирати компоненту lNaslov, бирати својство Font и кликнути мишем на знак плус, који се
налази испред, после чега се отварају подсвојства. Од подсвојстава изабрати опцију за боју
слова clBlue (плава), а за подсвојство Size унети вредност за величину фонта 14. У својству
Style кликнути на знак плус, који се налази испред и где су подсвојства са скуповним
вредностима (True, False). Позиционирати се на подсвојство fsBold и изабрати вредност True.
5. Сачувати све промене помоћу SaveAll из менија File, а затим компајлирати и покренути
апликацију. Притиснути F9 на тастатури или зелену стрелицу, или из менија Run бирати
команду Run.
Може се рећи да својства представљају поља класа. Свако својство има прикључено одговарајуће
поље података, али само својство није поље података класе. Измене у својству обично узрокују
извршавање кода у позадини. Мењање својстава повезано је с методама приступа.
Својство Font припада класи TFont, где се могу бирати: типови, боје, величине фонта итд. У
Object Inspector-у треба се позиционирати на својство Font, где се уочава да поред речи Font
постоји знак плус. То значи да постоје посебна подсвојства, која се могу едитовати у оквиру датог
својства. Уколико се два пута кликне мишем на назив својства Font, уочићемо да прозор Object
Inspector-а прошири својство, али је подсвојство Style означено знаком плус, што говори да оно
има своја подсвојства. Својство Style у оквиру објекта Font је скуповног типа. Да би се видело
својство Style, треба кликнути на знак + поред њега, и уочићемо да се поље Style проширује како
би се открио садржај скупа (сл. 3.14.). Сада је могуће засебно едитовати сваки елемент својства
Font и његовог подсвојства Style.
У случају својства Font, подсвојства могу да буду едитована позивањем едитора, када се кликне
мишем на дугме са три тачкице које је десно од назива својства Font после чега се отвори
едитор за фонт као на слици 3.14.

У овом случају скуп се састоји од различитих стилова,


који су карактеристични за фонтове: подебљано
(fsBold), курзив (fsItalic), подвучено (fsUnderline) и
прецртано (fsStrikeOut). Двоструким кликом мишем на
стил можете укључити, односно искључити стил. Са
десне стране је падајућа листа у којој се може
укључивати (True) или искључивати својство (False).
Скуп може да буде празан, односно може да садржи
једну вредност, или више дозвољених вредности.

Слика 3.14. – Дијалог подешавања својства Style


Нека својства стринговног типа отварају оквир за дијалог, као што се у случају својства Font
кликом мишем на дугме с три тачке позива оквир за дијалог Choose Font. Тачан тип едитора
својства зависи од самог својства, иако нека својства могу делити заједничке едиторе. Кликом на
дугме с три тачке позива се едитор за својства. За пример ће се узети већ креирана апликација
pSvojstva на којој ће се извршити неке промене.

57
58
Пример: uSvojstva, pSvojstva, fSvojstva (измењена верзија апликације)
Сада на форму fSvojstva која је креирана, поставити у фази дизајнирања компоненте за унос
података (Edit), часовник (Timer), као и дугме за покретање неког догађаја (Button). При томе
треба променити нека од њихових својстава.
Процедура за решавање задатка:
1. С картице Standard бирати компоненту Edit, а затим је поставити кликом мишем на жељено
место у форми. У својству Name променити име компоненте на eSvojstva, избрисати садржај
својства Text, а својство за измену фонта Font променити тако што се двапут кликне на дугме с
три тачкице с десне стране својства , после чега се отвори дијалог (сл. 3.15.), на ком су изабране
и подешене опције као подсвојства (Font style, Size, Color, Script).

Слика 3.15. Подешавање подсвојстава својства Font Слика 3.16. Извршавање апликације pSvojstva
2. С картице Standard бирати компоненту Button и поставити је на жељено место у форми. У
својству Name променити име компоненте у bSvojstva, у својству за описивање дугмета
Caption уписати SVOJSTVA, својство за висину дугмета Heigh поставити на вредност 50,
својство за ширину дугмета Width поставити на вредност 160, а променити подсвојство Font
style својства за измену фонта Font на Bold и подсвојство Size на вредност 14.
3. С картице System бирати компоненту Timer, а затим је поставити кликом мишем на жељено
место у форми. У својству Name променити име компоненте у tmSvojstva, а у својство за
брзину тајмера Interval уписати вредност 100.
После покретања апликације резултат рада се може видети на слици 3.16. Лако се уочава да се
компоненте Edit и Button виде на форми, док се компонента Timer не види.
Својства се могу мењати током дизајнирања и током израде програма.
Својства могу да се бирају из понуђене листе опција (enumerations). Оваква спецификација опција
за одређено својство препознаје се као падајућа листа, која се отвара кликом на дугме са
стрелицом на десној страни вредности својства. Алтернативно решење је да се два пута кликне
мишем на колону Value.

Својство Cursor добар је пример својства са спецификацијом. Када се кликне на


стрелицу да се отвори падајућа листа, приказује се листа могућих избора, од којих
се може изабрати један (сл. 3.17). Изаберите својство Cursor и кликните мишем
на дугме са стрелицом да би се појавила листа потенцијалних опција.
Спецификације и скупови разликују се по томе што се од својстава са
спецификацијом могу одабрати само опције које постоје (само један курсор може
да буде активан).

Слика 3.17. – Одабирање једног од понуђених курсора

59
Напомена: Својства могу укључити једноставне типове података, стрингове, низове, скупове,
спецификације и објекте VCL класа.
Својства могу да буду поља класа и може им се приступити као класним пољима. Својства нису
класна поља, већ су посебна категорија класних елемената. Својства обично позивају методе за
приступ када се уписују у наведене методе (додељују се вредности) а што зависи од начина на који
је одређена компонента записана.
Објављена својства обично имају генеричке вредности. Генеричка вредност је она која се
иницијално појављује у прозору Object Inspector-а када се компонента први пут активира.
Својства могу да буду дизајнирана за читање/писање, која се могу само читати, односно могу се
само писати. Својства, која су видљива само током рада програма, не појављују се у прозору
Object Inspector-а и могу се мењати само током рада програма.
Напомена: Како је чување апликације после креирања и после свих исправки увек исто, нема
потребе да се наводи у поступцима који даље следе. Исто се односи и на отварање новог пројекта,
односно први корак у креирању и почетном чувању апликације. Увек се додељује прво име
програмској јединици а затим пројекту (апликацији). Додељивање имена форми, је такође
поступак који је увек исти. То значи да сваки пример има унапред дефинисана имена програмске
јединице, пројекта и форме а која су наведена иза речи „ПРИМЕР:”. У случају када се у
апликацији користе и модули, навешће се и име модула. Да би се ученик лакше снашао, за име
програмске јединице увек је прво слово u, за име пројекта увек је прво слово p, а за име форме
прво слово у имену је f. Биће примера где имена нису мењана, у том случају она која нису мењана,
неће се ни наводити.
Својства која су коришћена да се на форми јасније прикажу компоненте, за величину фонта, боје
фонта, боје позадине и слично, неће се посебно обрађивати у свим примерима апликације.

Етапа кодирања

У етапи кодирања програмирају се методи који обрађују реакцију апликације на одређени догађај
изазван акцијом корисника или стањем система. Програмирањем тих метода кориснику се
омогућава прегледно кретање кроз апликацију и безбедан рад. Методе могу мењати својства
компоненти, али и помоћу компоненти обрађивати дате улазне податке у тражене резултате који
се приказују као излазни подаци.
Промена својства обавља се у програмском коду програмске јединице додељивањем својству
одговарајуће вредности. У тренутку доделе вредности VCL ради у позадини и позива методе за
приступање датом својству.
Пример: Мењање својстава Left и Top форме Form1 у програмском коду неке методе.
Left:=200;
Top:=200;
У овом примеру мења се лева позиција форме и почетна горња при чему VCL реагује и поново
исцртава форму.
За читање и приступање својству постоје два спецификатора приступа (property access specifiers).
Један је спецификатор за читање (read specifier) а други за писање (write specifier). Када се
својство чита, односно записује, методе придружене својству позивају се аутоматски. Када се
додели вредност, као у наведеном примеру, приступа се спецификатору за писање. Проверава се
постоји ли метод за приступање за спецификатор писања и, ако постоји, позива се метод приступа.

60
Уколико метод приступања не постоји, VCL додељује нову вредност пољу података, која се
придружује својству.
Пример: Када се својство користи као референца (својство је са десне стране знака једнакости),
приступа се спецификатору читања и то се може задати на следећи начин:
X:=Left; {poziva se specifikator da procita vrednost svojstva Left}
Атрибути својства или, другачије речено, својство својства, дефинисани су помоћу записивача
компоненте. Својство може да буде дефинисано тако да се може само читати ( read-only), вредност
се може прегледати − али се не може мењати.
Нека својства могу да буду дефинисана као видљива само током рада програма ( runtime-only).
Она се не појављују током дизајнирања програма, Object Inspector их не приказује. Таква својства
могу истовремено да буду декларисана и као својства која се могу само читати.
У етапи дизајнирања корисничког интерфејса на форму се додају контроле (поља за уношење
текста, дугме, часовник и слично) и друге компоненте. Апликације су вођене догађајима. За сваки
догађај треба програмирати методу за обраду догађаја. На пример, притиском на дугме на којем
пише Crveno променити боју позадине форме у црвену, а притиском на дугме на којем пише
Zeleno променити боју позадине у зелену.
У објектно оријентисаном програмирању кључно место је објекат и све што се може догодити с
објектом и око њега. Догађај може бити све што корисник учини директном акцијом помоћу миша
или тастатуре, али и све што је резултат извршавања програма или неког његовог дела. Догађајем
се може сматрати: клик мишем, прелазак показивачем миша преко објекта, мењање димeнзија,
притискање на одређене тастере тастатуре, појављивање или нестанак објекта, унос неке
вредности и др. Програмер за поједине објекте у апликацији бира одговарајуће догађаје на које ће
реаговати и какву реакцију ће изазвати у апликацији. Реакција на догађај програмира се као
метода која обрађује догађај. Може се рећи да, ако ниједан догађај није обрађен, односно нема
методу која га обрађује, програм (апликација) неће ништа радити осим онога што приказује
садржај екрана формиран током етапе дизајнирања апликације. Најкраће речено, свака компонента
(објекат) дизајнирана је да одговори на догађаје који су за њу одређени. Постоје три групе догађаја
и то: догађаји изазвани активирањем миша, тастатуре и системски догађаји.
На слици 3.18. приказан је прозор Object Inspector-а са картицом догађаја Events за форму
(Form1) која је отворена када се стартује нова апликација.

Картица Events располаже догађајима који представљају


конкретне акције. Догађај може бити једноструки леви клик
миша (Onclick) којим се изазива акција обраде или поруке. Иза
догађаја стоји одговарајућа процедура која обрађује догађај.
Картица Events има леву колону са именом догађаја, а да би се
тај догађај активирао потребно је у десној колони поред имена
двапут притиснути леви тастер миша.

Слика 3.18. – Прозор Object Inspector_a форме, картица догађаја Events


Као што различите компоненте имају нека заједничка а нека само своја посебна својства, тако је и
са догађајима компоненти. Сваки објекат има своје догађаје на које се може изазвати реакција.

61
У табели 3.4. приказани су неки од догађаја са описима када они настају.
Назив догађаја Опис
OnCreate Када се објекат креира.
OnActive Када објекат постане активан.
OnDeactive Када објекат престане да буде активан.
OnClick Када се мишем једанпут кликне (левим тастером) на објекат.
OnDblClick Када се мишем двапут кликне (левим тастером) на објекат.
OnChange Када се изврши нека промена на објекат
OnClose Када се објекат затвори.
OnDestroy Када се објекат избрише.
OnDragDrop Када се објекат превуче и отпусти помоћу миша.
OnDragOver Када се објекат довлачи помоћу миша.
OnShow Када се објекат приказује.
OnHide Када се објекат скрива, постоји, али се не види.
OnExit Када се објекат напушта.
OnKeyPress Када је на тастатури притиснут неки тастер.
OnMouseMove Када се мишем креће преко објекта.
OnMouseWheel Када се покрене точкић на мишу.
OnResize Када се објекту мења величина.
Табела 3.4. – Догађаји са припадајућим описима
У раду са догађајима треба знати и следеће чињенице:
 могуће је одговорити на било који догађај компоненте уколико је то потребно,
 не захтевају се одговори на све догађаје које компонента дефинише,
 догађајима се управља преко метода за управљање догађајима који се зову управљачи
догађајима (event handlers),
 више компонети може делити заједнички управљач догађајем,
 називи управљача догађајима које генерише Delphi су генерички и програмери их могу мењати.
 називи управљача догађајима мењају се само у прозору Object Inspector-а,
 параметар Sender можете користити да би утврдили која компонента генерише догађај,
 двоструким кликом миша на назив управљача догађајем у оквиру прозора Object Inspector-а
отвара се едитор програмског кода у који се уписује програмски код за управљање догађајем,
 сваки управљач догађајем садржи параметре који су поребни за исправно управљање догађајем.
Напомена: Углавном се управља једним догађајем, али је могуће управљати и са више догађаја
над компонентама. Уколико не одговорите на одређени догађај, порука догађаја ће бити или
повучена, или ће се њоме управљати на генерички начин како је описано у VCL-у.
Пример: uDelphi, pDelphi
Креирати апликацију која активирањем догађаја OnCreate исписује поруку: Drago mi je sto ste
izabrali Delphi.
Процедура за решавање задатка:
1. У Object Inspector-у бирати картицу Events и пронаћи догађај OnCreate (догађаји су сортирани
по азбучном реду). Догађај се активира када се двапут кликне левим тастером миша десно у
поље поред догађаја.

62
2. Када се отвори програмска јединица с костуром методе као процедуром за обраду догађаја
OnCreate, треба између речи begin и end уписати наредбу ShowMessage ('Drago mi je sto ste
izabrali Delphi'), тако да програмски код процедуре има следећи садржај:
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage('Drago mi je sto ste izabrali Delphi');
end;
Када се ово уради, аутоматски се у делу где је дефинисана класа форме TForm1 додаје
дефиниција методе као процедуре на следећи начин:
type
TfForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
Напомена: За приказивање порука у визуелном графичком окружењу Delphi користи уграђене
процедуре ShowMessage и ShowMessagePos. О њима ће се детаљно говорити касније.
Пример: uForma, pForma
Креирати апликацију која на следеће догађаје активира реакције и то:
a) на догађај OnCreate приказује поруку 'Pozadina formulara se menja u crveno 1xklik, u zeleno
2xklik',
б) на догађај OnClick следеће реакције: мења боју позадине форме у црвену, почетну горњу
позицију (Top) на вредност 10, почетну леву позицију (Left) на вредност 300 и мења текст
насловнe линије у: 'Pozadina crvena, sa pozicijama Top=10, Left=300 ',
в) на догађај OnDblClick следеће реакције: мења боју позадине форме у зелену, почетну горњу
позицију (Top) на вредност 200, почетну леву позицију (Left) на вредност 800 и мења текст
насловнe линије у : 'Pozadina zelena, sa pozicijama Top=200, Left=800'.
Процедура за решавање задатка:
1. За наслов форме поставити текст: Dogadjaji na formi koji pokrecu metode za menjanje svojstava
forme, и доделити форми име. У Object Inspector-у бирати картицу за својства Properties, у
својство Caption унети горњи текст, а у својство Name уписати име fFormular.
2. За решење задатка под а) активирати догађај OnCreate, који позива методу за приказивање
поруке: Pozadina formulara se menja u crveno 1xklik, u zeleno 2xklik. У Object Inspector-у
бирати картицу Events, пронаћи догађај OnCreate, двапут кликнути левим тастером миша
десно у поље поред догађаја, а када се отвори програмска јединица с костуром процедуре за
обраду догађаја OnCreate, уписати у њу наредбу за поруку с текстом који је горе наведен, и то
на следећи начин:
procedure TfFormular.FormCreate(Sender: TObject);
begin
ShowMessage('Pozadina formulara se menja u crveno 1xklik, u zeleno 2xklik');
end;
3. За решавање задатка под б) активирати догађај OnClick, који позива методу за мењање
својстава форме. У Object Inspector-у бирати картицу Events, пронаћи догађај OnClick, двапут
кликнути левим тастером миша десно у поље поред догађаја, а када се отвори програмска
јединица с костуром процедуре за обраду догађаја, уписати у њу следећи програмски код:
procedure TfFormular.FormClick(Sender: TObject);
begin

63
fFormular.Top:=10; fFormular.Left:=300; fFormular.Color:=clRed;
fFormular.Caption:='Pozadina crvena, sa pozicijama Top=10, Left=300';
end;
4. За решавање задатка под в) активирати догађај OnDblClick, који позива методу за мењање
својстава форме. У Object Inspector-у бирати картицу Events, пронаћи догађај OnDblClick,
двапут кликнути левим тастером миша десно у поље поред догађаја, а када се отвори
програмска јединица с костуром процедуре за обраду догађаја, уписати у њу следећи
програмски код:
procedure TfFormular.FormDblClick(Sender: TObject);
begin
fFormular.Top:=200; fFormular.Left:=800; fFormular.Color:=clGreen;
fFormular.Caption:='Pozadina zelena, sa pozicijama Top=200, Left=800';
end;
Када се заврше кораци 2, 3 и 4, аутоматски се у део у ком је дефинисана класа форме
TfFormular додаје дефиниција методa као процедурa, и то на следећи начин:
type
TfFormular = class(TForm)
procedure FormClick(Sender: TObject);
procedure FormDblClick(Sender: TObject);
procedure FormCreate(Sender: TObject);

Контролна питања:
1. Које могућности има програмски пакет Delphi за развој апликација?
2. Шта садржи библиотека визуелних компоненти?
3. Који су све елементи у стартном прозору Delphi-ја?
4. Како и одакле се покрећу команде у раду с Delphi интерфејсом?
5. Шта садржи тренутна пројектна датотека и како се попуњава?
6. Шта садржи тренутно отворена програмска датотека и како се попуњава?
7. Како се нови пројекат отвара, затвара и како се чува његов садржај?
8. Која је улога прозора Object Inspector и Object TreeView?
9. Могу ли се у апликацију додавати нове програмске јединице без форме?
10. Које датотеке се креирају када се креира нова апликација?
11. Шта је дизајнирање корисничког интерфејса а шта етапа кодирања?
12. Који су основни елементи програмског језика?
13. Шта чини структуру пројектне датотеке?
14. Из чега се састоји модул програмске јединице?
15. Чему служи одељак који почиње иза речи interface?
16. Чему служи одељак који следи иза речи implementation?
17. Које су етапе у поступку креирања апликације?
18. Шта се ради у етапи дизајнирања корисничког интерфејса?
19. Шта се подразумева под контролама?
20. Које контроле се најчешће користе с картице Standard?
21. Шта су својства компоненти и која су најзначајнија?
22. Која су заједничка својства за већину контрола (компоненти)?
23. Шта се ради у етапи кодирања и како она почиње?
24. Објаснити контроле: Label, Edit, MaskEdit, LabelEdit, Button и StaticText?
25. Шта су то догађаји и која је њихова улога?
26. Где се могу видети догађаји?
27. Који уређаји активирају догађај? 64
28. Шта представљају методе и ко иницира догађај?
4. ТИПОВИ ПОДАТАКА

Организација података врши се преко концепта типа података. Под типом података подразумева
се скуп вредности и скуп дозвољених операција над тим вредностима. Програмски језик подржава
целе бројеве и операције над њима (сабирање, одузимање, множење, дељење, логичке операције,
итд.), затим реалне бројеве и одговарајуће операције над њима, знаке (симболе – слова, цифре,
специјалне знаке).
Основни тип (скаларни) није могуће даље разлагати на елементарније типове. Слично објектима о
којима је било речи у делу апстракције, могу се посматрати и подаци у програмским језицима. На
апстрактном нивоу тумаче се и схватају као мисаона концепција о распону вредности и
операцијама над њима. Издвајају се битна својства и функционалност, за решавање задатка, а
занемарује се начин представљања у рачунару. Издвојени апстрактни подаци се затим на
симболичком нивоу репрезентују типовима података који зависе од могућности подршке
програмског језика. Физички ниво је онај на коме се подаци физички својим вредностима датог
типа могу сместити у меморију рачунара.
Сваки податак који се појављује у програму мора припадати неком од типова података
(целобројни, реални, знакови, логички и слично). Променљиве које се користе у програму могу
прихватати вредности тачно одређеног типа података. Сваки податак може припадати само једном
типу.
Типом податка одређује се:
 скуп вредности променљивих и израза који му припадају,
 скуп операција које се могу извршити над променљивим,
 начин регистровања променљивих у рачунару.
Object Pascal располаже са следећим типовима података:
 основни,
 структуриран (сложени),
 показивачки.

ОСНОВНИ ТИПОВИ ПОДАТАКА

Основни тип података може бити стандардан (default) и нестандардан.


Основни стандардни типови података имају стандардна имена:
1. целобројни (Integer, ShortInt, LongInt, Byte и Word),
2. реални (Real, Single, Double, Extended и Comp),
3. логички (Boolean, ByteBool, WordBool и LongBool),
4. знаковни (Char).
Стандардни типови су они који су уграђени у програмски језик и као такви се одмах могу
користити у свим програмима.
Основни нестандардни типови су:
1. набројиви и
2. интервални.

65
Нестандардне (изведене) типове података дефинише програмер у свом програму по потреби и они
важе само у програму у коме су дефинисани. Име типа података не сме се поклопити са неком
резервисаном речи програмског језика, а затим се наводе сви елементи који припадају том типу.
У Object Pascal језику постоје следећи сложени или структурирани типови података:
1. низ знакова (string),
2. низови или поља (array),
3. слогови (record),
4. скупови (set of),
5. датотеке (file of),
6. објектни тип (class).
У разматрању о типовима података, биће речи о томе како су дефинисани, њиховом опсегу,
операцијама које се могу обављати над њима, као и њиховим уграђеним фукцијама и процедурама.

Целобројни тип података

На апстрактном нивоу целобројни тип је дефинисан математички као пребројив уређени скуп
бројева ...,-3,-2,-1,0,+1,+2,+3,.... Област вредности целобројног типа су све негативне, нула и све
ненегативне вредности. На симболичком нивоу или нивоу програмског језика, целобројни тип је
дефинисан синтаксом односно симболичким записом у Object Pascal језику низом цифара
декадног система са предзнаком.
У меморији рачунара, податак као цео број се записује физички као бинарни запис у зависности од
начина регистровања. Ако је величина регистра 16 бита, највећи цео број који се може
регистровати као бинарни запис je 01111111111111112, а чија је декадна вредност 215 – 1, односно
32767.
Ако је регистар меморије 4 бајта или 32 бита, највећи цео број који се може регистровати као
декадна вредност је 231-1, односно 2 147 483 647. На физичком нивоу регистровања, формула за
израчунавање максималне вредности декадног броја је:
декадна_вредност=2n-1 -1 где је n број битова у регистру меморије.
У табели 4.1. приказани су начини дефинисања целобројног типа података у Delphi окружењу:

Тип података Најмања вредност Највећа вредност Број бајтова


Integer -2147483648 2147483647 4
Cardinal 0 4294967295 4
ShortInt -128 127 1
SmallInt -32768 32767 2
LongInt -2 147 483 648 2 147 483 647 4
63 63
Int64 -2 2 -1 8
Byte 0 255 1
Word 0 65535 2
LongWord 0 4294967295 4
Табела 4.1. – Дефинисање целобројног типа података

66
Типови Integer и Cardinal су основни, док су остали у табели подтипови типа Integer.
Приметићете да неки типови података имају и негативне и позитивне вредности, док неки имају
само позитивне вредности. Има неких разлика код различитих преводиоца, нпр. Delphi има исте
вредности за Integer и LongInt тип.

Реални тип података

Реални тип података су подаци из подскупа реалних бројева. Записују се у меморију рачунара као
експоненцијалан запис. Мантиса и експонент се чувају у посебним меморијским локацијама, па
због тога заузимају више меморијског простора од целобројног типа. За експонент је резервисано
2 бајта, а за мантису количина меморије зависи од величине бројева који се памте. Међутим,
њихово регистровање у рачунарском систему није апсолутно тачно. С обзиром да је тако,
операције које се изводе над приближним вредностима можда неће дати очекиване резултате, а
што се може проверити у следећем изразу:
(дељеник/делилац) * делилац=дељеник
Математички постављени израз је исправан. У рачунарској аритметици овај израз не мора бити
апсолутно тачан. Ако број један поделимо бројем три, вредност се региструје у рачунару с
коначним бројем децимала, на пример као 0.33333333… Множењем са 3 добија се резултат
0.99999999.
У табели 4.2. приказани су начини дефинисања реалног типа података у Delphi окружењу:

Број Број
Тип података Најмања вредност Највећа вредност
бајтова цифара
-324 308
Real 5.0 *10 1.7* 10 8 15-16
-39 38
Real48 2.9* 10 1.7* 10 6 11-12
-45 38
Single 1.5* 10 3.4* 10 4 7-8
-324 308
Double 5.0 *10 1.7* 10 8 15-16
-4951 4932
Extended 3.6*10 1.1 * 10 10 19-20
63 63
Cоmp -2 +1 2 -1 8 19-20
Currency -922337203685477.5808 922337203685477.5807 8 19-20
Табела 4.2. – Дефинисање реалног типа података
Напомена: Тип Real48 избегавати, јер се не слаже са архитектуром Intel процесора. Типови Single
и Double користе се када се не тражи да подаци буду превелики или премали са великим
прецизностима. Тип Extended даје већу прецизност, али има проблема у преносу података на
различите платформе. Тип Comp погодан је за Intel, представља 64 битни цео број али како се не
понаша као уређени скуп, припада реалном типу без децималних места. Како не заузима меморију
за експонент, Comp тип заузима мање меморије од типа Extended. Тип Currency је везан за
финансијско пословање, припада реалном типу и чува се у фиксном зарезу а нема експонент.

Логички тип података

Логички тип, дефинише податaк који има вредност логичкe константe TRUE (или 1) која се
интерпретира као истина и FALSE (или 0) као неистина (лаж).
У табели 4.3. приказани су начини дефинисања логичког типа података у Delphi окружењу:

67
Тип података Могуће вредности Број бајтова Вредности
Boolean True или False 1 0 или 1
ByteBool True или False 1 256
WordBool True или False 2 65536
LongBool True или False 4 4294967296
Табела 4.3. – Дефинисање логичког типа података
Сви набројани типови имају исте вредности (false, true). Како у Windows апликацијама логичке
променљиве могу добијати вредности различите од 0 и 1, то су неопходни различити подтипови
који су у складу са целобројним типом. Међутим, како постоје само две логичке константе, то се
константи false додељује 0, а све остале вредности се придружују константи true.

Знаковни тип података

Знаковни тип је уређени скуп основних знакова који се налазе у посебној табели кодова за знакове.
Вредност знаковне константе или променљиве је знак који припада скупу дозвољених знакова, а
пишу се између једноструких апострофа (нпр. 'a'). Знаковном типу припада и такозвани знак
„blank” (празнина, нпр. ' '). Константа или променљива знаковног типа у меморији рачунара
заузима 1 или 2 бајта у зависности од кодне табеле знакова која се користи. Ако се ради о ASCII
табели, тачно се зна који елемент је испред који иза, односно редослед одређује њихов код или
редни број у табели. Да би операције биле затворене, испред првог елемента је последњи, а иза
последњег је први елемент табеле.
У табели 4.4. приказани су начини дефинисања знаковног типа података у Delphi окружењу:

Тип података Могуће вредности Број бајтова


Char ANSI - симбол 1
AnsiChar ANSI - симбол 1
WideChar Unicode - симбол 2
Табела 4.4. – Дефинисање знаковног типа података

Набројиви тип података

Набројиви тип се дефинише као уређени скуп набројаних имена где су та имена константе
набројивог типа. Имена се раздвајају зарезима, а скуп елемената који чине дати тип наводи се
између заграда. Како набројиви тип припада нестандардним типовима, то они нису дефинисани
као default, што значи да их у програму мора дефинисати креатор програма.
Набројиви тип дефинише се у наредби type на следећи начин:
type
ime_tipa=(c1,c2,...,cn);
где су:
type – службена реч за дефинисање типа података,
ime_tipa – име типа података набројивог типа,
c1,c2,..,cn – константе као елементи набрајања.
Напомена: Иста константа не може се понављати у дефиницији.

68
Наведене вредности константи у набројивом типу чине уређени скуп који се аутоматски нумерише
почев од нуле при чему се успоставља однос у ком је текућа вредност константе увек мања од
следеће вредности.
У табели 4.5. приказана је наредба type која дефинише исправна имена набројивог типа података:

Дефинисање имена набројивог типа у наредби type Опис


boje=(crvena,zuta,plava,zelena); Укључује боје унутар заграда.
dani=(ponedeljak,utorak,sreda,cetvrtak,petak,subota,nedelja); Укључује дане унутар заграда.
ocene=(1,2,3,4,5); Укључује бројеве унутар заграда.
Табела 4.5. – Дефинисање имена набројивог типа
Пример: Неисправна наредба type. Није дозвољено да се иста константа (у примеру црвена),
наводи као елемент набрајања у две или у више дефиниција за type.
type
boje=(crvena,zuta,plava,zelena);
kose=(crvena,plava,crna);

Интервални тип података

Део или подинтервал било ког простог типа изузев real, може се дефинисати као интервални тип.
Подинтервал се задаје почетном најмањом вредношћу и крајњом највећом, а између којих се
налазе две тачке као сепаратор. Прва константа мора бити мања или једнака од друге задате
константе. Овај део (одсечак) чине граничне вредности и све вредности између њих.
Формат наредбе за дефинисање интервалног типа може се приказати на следећи начин:
type
ime_tipa=pocetna_konstanta..krajnja_konstanta;
где су:
type – службена реч за декларисање типа,
ime_tipa – име типа података као интервални тип,
pocetna_konstanta – почетна најмања вредност константе из интервала,
krajnja_konstanta – крајња највећа вредност константе из интервала.
Табела 4.6. приказује исправно дефинисана имена интервалног типа података у наредби type:
Име интервалног типа у наредби type Опис
slova='A..Z'; Сви знакови од A до Z засновани на знаковном типу char.
cifre='0'.. '9'; Све цифре од 0 до 9 засноване на знаковном типу char.
ocene=1..5; Све цифре од 1 до 50 засноване на типу integer.
broj=1..32767; Сви цели бројеви од 1 до 32767.
radnidani=ponedeljak..petak; Сви радни дани у недељи од ponedeljak до petak.
temperatura=-30..45; Све температуре су од -30 до 45 степени.
Табела 4.6. – Дефинисање имена интервалног типа

Текстуални тип података

69
Низом симбола записаних између знакова једноструких апострофа као речи или реченице се у
Delphi језику декларише тип стринга. За разлику од знаковне променљиве или константе које
имају само један знак, стринг може имати више знакова између апострофа. Знакови између
апострофа чине једну целину где апострофи не улазе у састав стринга. Тип стринг се гради од
основног знаковног типа Char па се самим тим не сврстава у основни тип. Како се у Delphi
програмирању улазно-излазне операције обављају помоћу података типа стринг, а имају их многе
компоненте са којима ће се радити у својим својствима, то је потребно да се упознамо са њим.
У табели 4.7. приказани су стринговни типови које подржава Delphi:

Тип података Максимална дужина симбола Број бајтова/Gb


String 255 2 By – 256 By
ShortString 255 2 By – 256 By
AnsiString 2^31 4 By – 2 Gb
WideString 2^30 4 By– 2 Gb
Табела 4.7. – Дефинисање типа података String
Напомена: Тип WideString има подршку за националне симболе (Unicode).

ДЕКЛАРАЦИЈА И ДЕФИНИЦИЈА ПРОМЕНЉИВЕ

Рачунару се мора саопштити које врсте података су регистроване да би их на прави начин тумачио
и обрађивао. Променљива је име (идентификатор) меморијске локације у којој програм
(апликација) чува вредност. Декларисање променљивих је процес именовања података у
програму и дефинисање типа којем они припадају. Приликом декларисања променљивих, било
би практично да се користе имена која смислено могу одговарати информацији која се чува. У
тренутку декларисања променљиве, у меморији рачунара се обезбеди физичко место где ће се
сместити податак и том простору се додели одговарајућа адреса. У простору на датој физичкој
адреси тада нема садржаја, односно вредности.
Декларисање променљиве обавља се у делу за декларацију променљивих у следећем формату:
var ime_p1,ime_p2,…,ime_pn:Tip;
где су:
var – службена реч за декларацију,
ime_p1,ime_p2,…,ime_pn – имена променљивих и
Tip – тип коме променљиве припадају.
За означавање типа коме променљиве припадају могу се користити идентификатори стандардних
типова или идентификатори типова које је дефинисао корисник.
После декларисања променљиве на овај начин, оне садрже неке случајне почетне вредности.
Променљиве могу бити глобалне, односно могу се користити у целој програмској јединици, свуда
могу попримати вредности или се мењати, и локалне које се могу користи само у функцијама,
процедурама и методама у којима су декларисане.
У наставку приказаћемо примере декларисања различитих променљивих које припадају разним
типовима података.
За променљиве целобројног типа користи се службена реч integer.

70
Пример: Декларисање променљивих целобројног типа.
var a,B,x:integer; {promenljive a,B i x su deklarisane kao celobrojni tip podataka}
или ако се свака декларише појединачно:
var a:integer; {promenljivа a deklarisanа kao celobrojni tip podataka}
var B:integer; {promenljivа B deklarisanа kao celobrojni tip podataka}
var x:integer; {promenljivа x deklarisanа kao celobrojni tip podataka}
али није дозвољено овако:
var a:integer; {promenljivа a ne sme biti 2 x deklarisana}
b:integer;
a:integer;
нити је дозвољено овако:
var a:integer; {promenljivа a deklarisana sa dva tipa}
b:integer;
a:char;
Глобалним променљивама дозвољено је додељивање иницијалне вредности приликом
декларисања. То значи да се не мора чекати да им се посебном акцијом додели почетна вредност,
али то није дозвољено за локалне променљиве.
Пример: Декларисање глобалних променљивих целобројног типа и додељивање почетне
вредности.
var a:integer = 2; {promenljive a i b deklarisane i dodeljena pocetna vrednost}
b:integer = 5;
али није дозвољено овако:
var a,b,c:integer = 2; {grupi promenljivih se ne moze ovako dodeliti pocetna vrednost}
Преводилац ће после овако задате наредбе објавити грешку са поруком Cannot initialize multiple
variables.
За променљиве реалног типа користи се службена реч real.
Пример: Декларисање променљивих реалног типа.
var a,B,x:real; {promenljive a,B i x su deklarisane kao realan tip podataka}
или појединачно на један од следећа два начина:
var a: real; B:real; x:real; {promenljive a,B i x su deklarisane кao realan tip podataka}
var a: real; {promenljive a,B i x su deklarisane jedna ispod druge kao realan tip podataka}
B:real;
x:real;
За променљиве логичког типа користи се службена реч boolean.
Пример: Декларисати променљиве знаковног типа са именима slovo и simbol.
var slovo,simbol:char; {promenljive slovo i simbol su znakovnog tipa}
или на један од следећа два начина:
var slovo:char; simbol:char; { prvi nacin: slovo i simbol su deklarisane u istom redu}
var slovo:char; { drugi nacin: slovo i simbol su deklarisane posebno u dva reda}

71
simbol:char;
Променљива набројивог типа може се дефинисати директно преко имена променљиве у наредби
var на следећи начин:
var
ime_promenljive:(c1,c2,...,cn);
где су:
var – службена реч за декларисање променљивих,
ime_promenljive – име променљиве која може добити неку од наведених вредности константи
(c1,c2,..,cn).
Када се име променљиве набројивог типа декларише референцирањем на име дефинисаног
набројивог типа, тада се наредба var задаје на следећи начин:
var
ime_promenljive: ime_tipa;
где су:
var – службена реч за дефинисање променљивих,
ime_promenljive – име променљиве референциране на набројиви тип,
ime_tipa – име дефинисаног набројивог типа.
У табели 4.11. приказане су исправне наредбе за декларисање променљивих набројивог типа
података директно у наредби var и дефинисањем имена типа, па декларисањем набројивих
променљивих:

Дефинисање набројивог типа са type и


Декларисање набројиве променљиве са var
декларисање набројиве променљиве са var
var type
boja,ruza:(crvena,zuta,plava,zelena); boje=(crvena,zuta,plava,zelena);
dan,ime_d:(ponedeljak,utorak,sreda,cetvrtak, dani=:(ponedeljak,utorak,sreda,cetvrtak,
petak,subota,nedelja); petak,subota,nedelja);
var
boja,ruza:boje;
dan,ime_d:dani;
Табела 4.11. – Декларисање променљивих набројивог типа
Формат наредбе за декларисање интервалне променљиве:
var
ime_promenljive:ime_intervalnog_tipa;
где су:
var – службена реч за дефинисање променљивих,
ime_promenljive – име променљиве набројивог типа,
ime_intervalnog_tipa – име типа података као интервални тип на који је референцирана
променљива.
У табели 4.12. приказане су исправне наредбе за декларисање променљивих (var) интервалног
типа референцираних на имена интервалног типа дефинисана у табели 4.6.

72
Декларисање подинтервалне
Опис променљиве
променљиве у наредби var
znak1,znak2:slova; znak1 и znak2 су интервалног типа са именом slova.
znak3,znak4:cifre; znak3 и znak3 су интервалног типа са именом cifre.
oc:ocene; oc је интервалног типа са именом ocena.
t1,t2,sredt:temperatura; t1, t2 и sredt су интервалног типа са именом temperatura.
br1,br2,minbr:broj; br1, br2 и minbr су интервалног типа са именом broj.
dan1,dan2:radnidani; dan1 и dan2 су интервалног типа са именом radnidani.
Табела 4.12. – Декларисање променљивих интервалног типа
Пример: Променљиве интервалног типа могу се дефинисати и директно у одељку var на следећи
начин:
var
znak1,znak2:'A'.. 'Z';
znak3,znak4:'0'..'9';
oc:1..5;
t1,t2,sredt:-30..45;
br1,br2,minbr:1..maxint;
dan1,dan2:ponedeljak..petak;
Декларисање променљиве стринговног типа обавља се у следећем формату:
var ime_s1,ime_s2,...,ime_sn:string[duzina];
где су:
var – службена реч за дефинисање променљивих,
ime_s1,ime_s2,...,ime_sn – имена стринг променљивих,
string – службена реч за тип стринг података, обавезна, наводи се иза знака :,
duzina – максимална дужина знакова. Ако се не зада, узима вредност 255 знакова.
Пример: Дате су следеће исправне декларације стринговних променљивих у секцији var:
var
ps:string[9]; {deklarisana je promenljiva sa imenom ps stringovnog tipa, duzine 9}
s255:string; {deklarisana je promеnljiva sa imenom s255 stringovnog tipa, duzine 255}

Декларисање примерка (instance) класе

Речено је да свака инстанца класе представља објекат. Приликом отварања нове апликације у
секцији var се аутоматски декларише објектна променљива Form1 као инстанца класе TForm1
која репрезентује форму на следећи начин:
var
Form1: TForm1;
У примеру апликације pKvadrat ако се погледа садржај програмске јединице uKvadrat, у секцији
за декларисање променљивих у овом случају инстанце класе биће приказана инстанца класе
fKvadrat на следећи начин:
var
fKvadrat: TfKvadrat; {Instanca klase fKvadrat referencirana je na klasu TfKvadrat}

73
Напомена: Ово име инстанце је објекат именован као fKvadrat и то име ће се користити за све
будуће операције над тим објектом који представља форму.
Класе које у апликацији креира корисник у секцији type, не дефинишу аутоматски објектне
променљиве.
У секцији var корисник ће класну променљиву требати да декларише у следећем формату:
var
ime_promenljive : ime_tipa_klase;
где су:
var – службена реч за дефинисање променљивих,
ime_promenljive – име променљиве класног типа и,
ime_tipa_klase – име класе дефинисане у наредби type.
Да буде јасније, декларисањем класне променљиве уствари се декларише објекат. Када се у
секцији var декларише променљива са именом ime_promenljive, компајлер резервише меморијски
простор само за адресу објекта.
Пример: Примери декларисања променљивих класног типа у секцији var.
var
AStudent:TStudent; {deklarisanje promenljive referencirane na klasu TStudent}
АDate:TDate; {deklarisanje promenljive referencirane na klasu TDate}
АBankomat:TBankomat; {deklarisanje promenljive referencirane na klasu TBankomat}
АPas:TPas; {deklarisanje promenljive referencirane na klasu TPas}
Напомена: Када се декларишу примерци класе (instance) смештају се у динамичку зону меморије
(heap), што није случај за остале типове података.

ДЕКЛАРАЦИЈА И ДЕФИНИЦИЈА КОНСТАНТЕ

Константе су подаци чије вредности не могу да се промене. У програмима се могу користити


простим навођењем вредности у зависности од типа података. Међутим, константе се могу
представити помоћу идентификатора (имена). Декларација константе помоћу имена обавља се у
секцији за дефинисање константи и њен општи формат може се приказати на следећи начин:
const
ime_c1=vrednost1;
ime_c2=vrednost2;

ime_cn=vrednostn;
где су:
const – резервисана реч за константе,
ime_c1, ime_c2,…,ime_cn – имена константи,
vrednost1, vrednost2,…,vrednostn – додељене вредности.
Пример:
const
Koef=5; Pi=3.14159265359;
Eps=1E-9; Tab='#9';
Znak='A'; Ind=True;
str='ABCDEF';

74
Типови именованих константи одговарају типовима константи које представљају.

ОПЕРАТОР ДОДЕЛЕ

Израз x=x+1 у програмским језицима Basic-у и Fortran-у, сваком програмеру почетнику, ствара
забуну, јер се коси са математичком логиком. У Pascal и Object Pascal језицима уместо знака =
користи се знак :=. Овај знак се назива оператор доделе и он се тумачи тако што се прво израчуна
вредност израза са десне стране оператора, а затим се та вредност додели променљивој на левој
страни оператора. Када се претходни израз напише оператором доделе, односно као x:=x+1, тада
се он може прочитати као „променљивој x са леве стране додељује се вредност са десне стране,
односно x+1”. Оператор доделе је саставни део једноставне наредбе која се назива наредба
доделе.
Код оператора доделе, мора се поштовати следеће правило: „ тип података вредности израза на
десној страни од оператора доделе мора се слагати са типом променљиве која је на левој страни
оператора”. Изузетак који је дозвољен у овом правилу је, „ако је израз са десне стране целобројног
типа, а променљива са леве стране је реалног типа”. Тада се вредност израза са десне стране из
целобројног типа претвара у реалан тип.
Пример: Примери оператора доделе.
a:=5;
У наведеним примерима оператор доделе је примењен над изразима
b:=10.5;
c:=a+b; у којима учествују константе и променљиве, али се он исто тако
znak:= 'A'; може применити у изразима у којима учествују контроле као
rec:= 'Alo ko je'; компоненте Delphi окружења које се постављају на форму.
ind:=True;
У горе наведеним примерима оператора доделе, претпоставка је да су променљиве са леве стране
декларисане одговарајућим типом како би им се доделиле вредности са десне стране. Међутим,
код операције доделе често се догађа да се врши превођење једног типа података у други које се
назива конверзија података.

КОНВЕРЗИЈА ПОДАТАКА

Превођење једног типа података у други назива се конверзија података. У визуелном графичком
окружењу најчешће се обавља конверзија између података типа стринга и нумеричких података. У
Delphi програмском окружењу подаци који се уносе у компоненте Edit су стринговног типа, што
значи да се не могу директно уносити нумерички подаци. Да би се обављале операције са
нумеричким подацима, стринговни тип мора се конвертовати у нумерички. Обрнуто, када податке
треба приказати у компонентама Edit, користи се обрнута конверзија, нумерички подаци се
конвертују у стринговне.
Конверзија података се обавља и када треба обавити неку операцију која није дозвољена у оквиру
типа података коме припадају, те се они конвертују у тип података над којим се може применити
таква операција. Подаци се могу конвертовати помоћу функција и процедура. Delphi располаже са
уграђеним стандардним функцијама и процедурама за конверзију података табела 5.15. и о њима
ће се говорити више у поглављу 5.

75
Пример: Дате су две компоненте Edit именоване са eb1 и eb2 које су улазни подаци у које се
уносе бројчани подаци, и једна компоненте Edit именована са erez која ће представљати излазни
податак. У табели 4.13. приказани су примери оператора доделе и конверзије података
коришћењем функција и процедура на разним операцијама:
Оператор доделе Опис
Компоненте eb1 и eb2
eb1.Text:='11'; eb2.Text:='22'; садрже бројчане податке '11'
и '22' као string тип.
Компонента еrez после
еrez.Text:=eb1.Text+eb2.Text; наредбе доделе садржи
вредност '1122'.
Компонента еrez после
еrez.Text:=IntToStr(StrToInt(eb1.Text)+StrToInt(eb2.Text)); наредбе доделе садржи
вредност '33'.
Компоненте eb1 и eb2
eb1.Text:='11.11'; eb2.Text:='22.22'; садрже бројчане податке
11.11 и 22.22 као string тип
Компонента еrez после
еrez.Text:=eb1.Text+eb2.Text; наредбе доделе садржи
вредност '11.1122.22'.
Компонента еrez после
еrez.Text:=FloatToStr(StrToFloat(eb1.Text)
наредбе доделе садржи
+StrToFloat(eb2.Text));
вредност '33.33'.
Објашњење:
У наредби доделе еrez.Text:=IntToStr(StrToInt(eb1.Text)+StrToInt(eb2.Text));, да би се
текстуални податак типа string претворио у цео број (integer) коришћена је конверзија са
функцијом StrToInt где су у наведеном примеру текстуални подаци у компонентама Edit (eb1.
Text:='11'; eb2.Text:='22';) преведени у бројеве 11 и 22 над којима је примењен операнд сабирања
(+) и тако је добијен резултат са бројчаном вредношћу 33. Али, да би се та бројчана вредност
сместила у садржај компоненте Edit именоване са еrez, применила се функција IntToStr (обојено
зелено).
У наредби доделе еrez.Text:=FloatToStr(StrToFloat(eb1.Text)+StrToFloat(eb2.Text));, да би се
текстуални податак типа string претворио у реалан (real) број коришћена је конверзија са
функцијом StrToFloat где су у наведеном примеру текстуални подаци у компонентама Edit
(eb1.Text:='11.11'; eb2.Text:='22.22';) преведени у бројеве 11.11 и 22.22 над којима је примењен
операнд сабирања (+) и тако је добијен резултат 33.33. Али, да би се та бројчана вредност сместила
у садржај компоненте Edit именоване са еrez, применила се функција FloatToStr (обојено жуто).

Контролна питања:
1. Шта се одређује типом података?
2. Како се врши подела типа података?
3. Који типови се сматрају основним стандардним а који основним нестандардним?
4. Ко дефинише нестандардне типове података?
5. Како се декларише и дефинише променљива?
6. Како се дефинише целобројни тип и који су његови подтипови?
7. Како се декларише променљива целобројног типа?
8. Како се дефинише реални тип?
9. Како се декларише променљива реалног типа? 76
10. Како се дефинише логички тип?
11. Како се декларише променљива логичког типа?
12. Како се дефинише знаковни тип?
13. Како се декларише променљива знаковног типа?
5. ИЗРАЗИ И НАРЕДБЕ

У поступку креирања апликације програмер програмским кодом (програмирањем) управља како


ће се она извршавати. Како се у објектном програмирању обрађују догађаји, обрада догађаја се
назива методом. Значи да догађаје прате одговарајуће методе које га обрађују, односно управљају
током извршавања апликације. Метода је програмирана да реагује на одређени догађај и састоји се
од више наредби које се извршавају једна за другом. Саставни део наредби су изрази који се могу
градити од константи, променљивих које су међусобно повезане операторима и од позива метода.
У случају да су елементи израза различитог типа, конверзијама се морају свести на исти тип како
би операције могле бити извршене.
Свака наредба има своје правило писања. Правила су јасно уређена синтаксом језика, па се за
сваку наредбу посебно она морају знати. У писању наредби се користе службене речи, операције,
операнди, променљиве, константе и слично. Како су делови наредбе изрази то исто важи и за
изразе. Правила за формирање израза су једноставна и лако их је контролисати. Проста правила у
програмирању заснована су на математичким правилима прилагођеним одговарајућем
програмском језику. На пример, свака отворена заграда мора бити затворена, два или више
знакова операције не могу се наћи непосредно један поред другог, израз не може стајати
самостално у програму, вредност израза се израчунава аутоматски приликом доделе вредности
параметрима. Наредбе програма се раздвајају знаком тачка са запетом (;) која се не ставља иза
последње наредбе програма end иза које следи само знак тачка (.).

ИЗРАЗИ
У поступку обраде података над улазним (датим) подацима се примењују разне операције у циљу
добијања резултата или међурезултата као излазних података. Израз дефинише начин и поредак
израчунавања неке вредности (резултата). Израз се може формирати од операнада (променљиве,
константе), операција (симбола +, -, * ,/), заграда и од позива метода и функција. Операција у
изразу дефинише акције које се извршавају над операндима.
Изрази могу да буду прости (само константа, променљива, позивање методе) или сложени, с
произвољним бројем оператора и елемената израза одвојених заградама. Симболи за операције у
програмском језику нису увек исти као у математици. Табела 5.1. приказује изразе у математици и
у програмском језику:

У математици У Delphi језику


321 321
K:5 K/5
3i 3*i
6(3x-6y) 6*(3*x-6*y)
x:(y-5x) + 1 x/(y-5*x) +1
X2+1 X*X+1 или sqr(X)+1
√x +y sqrt(x)+y
(i+j)k (i+j)*k
(10+ x(a-1)):(b+3)-1 (10+ x*(a-1))/(b+3)-1

77
x>y+12 x>y+12
Табела 5.1. – Приказ израза у Delphi окружењу
Према типу резултата, изрази се деле на: аритметичке, логичке и текстуалне. Ради тачности
података у изразу треба водити рачуна о приоритету операција и постављању заграда.
Променљиве које учествују у изразу морају претходно имати неку вредност како би се вредност
израза могла израчунати. Променљива декларисана у програму са дефинисаним типом и
додељеном иницијалном вредношћу података прихвата (добија) вредност која припада том типу.
Оператором доделе се може додељивати вредност променљивама.
Пример: Изрази где су променљивама a и b додељене иницијалне вредности а = 8 и b =-4. Табела
5.2. приказује примере аритметичких израза и њихове вредности за наведени пример, а у случају
оператора доделе вредност израчунатог израза са десне стране додељује се променљивој c.

Израз Оператор доделе Вредност за c


a c:=a 8
b c:=b -4
a + 33 c:=a+33 41
75 - b c:=75-b 79
a+b c:=a+b 4
a/b c:=a/b -2
Табела 5.2. – Приказ израза и оператора доделе

ОПЕРАТОРИ
Оператори представљају радње које се извршавају над операндима (подацима), при чему се
добијају одређени резултати. Често се те радње називају операцијама. Помињани су када се
говорило о типовима података да се укаже који су дозвољени за конкретне типове. Примењују се у
изразима. Изрази су састављени од операнада и оператора.
Оператори могу бити:
 Аритметички (+, – , * , /, div – целобројни део који се добија дељењем и mod – остатак од
целобројног дељења),
 Логички (not, and, or, xor),
 Логички са битовима (not, and, or, xor, shl – замена вредности слева за одређени број бита,
 shr – замена вредности сдесна за одређени број бита),
 Поређења (=, < >, <, >, <=, >=),
 Повезивања у линији (+),
 Над скуповима (+, -, *, <=, >=, < >(различито), in (елемент скупа)),
 Над класама (as, is, =, < >),
 Приказ адресе (@).
Табела 5.3. приказује који се аритметички оператори користе у изразима и за које операције:

Операција Знак
Множење *
Дељење /

78
Целобројно дељење div
Издвајање остатка при целобројном дељењу mod
Сабирање +
Одузимање -
Табела 5.3. – Приказ знакова за аритметичке операције
Табела 5.4. приказује који се оператори поређења користе у изразима и њихово значење:
Оператор Објашњење
= Пореди да ли је једнако.
<> Пореди да ли је различито.
< Пореди да ли је мање.
> Пореди да ли је веће.
<= Пореди да ли је мање или једнако.
>= Пореди да ли је веће или једнако.
Табела 5.4. – Приказ оператора поређења
У Object Pascal језику важи следећи приоритет операција, који је дат следећим редоследом:
 @, not;
 *, /, div, mod, and, shl, shr, as;
 +, -, or, xor;
 =, < >, <, >, <=, >=, in, is.
У изразима се може појавити један или више оператора. Ако се користе изрази са једним
оператором, тад би се могло рећи да су они једноставни, као на пример:
10 + 18, a + b, 7.5*x, y + 18
Комбинацијом једноставних израза у које се укључује више оператора настају сложенији изрази.
Ако се још у наредби доделе користе у више корака са више наредби тада постају још сложенији.
Пример: Разни примери операција.
not (А in Skup)
xl and (x2>= 0)
'Linija1 '+'Liniјa2'+str(broj)
x1 in Podskupu
Q <= Podatak

Операције са артитметичким изразима

Аритметички изрази обрађују нумеричке податке и као резултат дају нумеричку променљиву
целобројног или реалног типа података.
Код целобројног типа података, изрази са множењем, сабирањем и одузимањем су исти као у
математици, само се дељење изводи преко функцијске операције div која даје целобројни део од
дељења, а остатак од целобројног дељења добија се преко функцијске операције mod.
Операција дељења са знаком / није дозвољена над целобројним вредностима, јер се као резултат
може појавити број који није целобројног типа.

79
Приоритет операција у изразима у којима се користе целобројни подаци је следећи: *, div, mod, а
који имају приоритет у односу на операције + и-.
Објашњење:
A div B=C целобројно дељење броја A са бројем B даје као резултат цео број C без остатка
A mod B =C остатак од дељењу броја A са бројем B представља резултат у виду броја C.

80
Табела 5.5. приказује примере оператора div и mod:

Функција div Функција mod


21 div 2 = 10 21 mod 2 = 1
-22 div -3= 7 -22 mod -3 =-1
-27 div 6 = -4 -27 mod 6 =- 3
27 div -6 = -4 27 mod -6 =3
3 div 6 = 0 3 mod 6 = 3
Табела 5.5. – Приказ примера оператора mod и div
Примери: Разни примери са приоритетом операција.
20 div 2+3 =13 {prvo se radi operacija 20 div 2, a zatim se dobijeni rezultat 10 sabira sa 3}
100 div 10*3=30 {prvo se radi operacija 100 div 10, zatim se dobijeni rezultat 10 mnozi sa 3}
101 mod 10 * 3 = 3 {prvo se radi operacija 100 mod 10, zatim se dobijeni rezultat 1 mnozi sa 3}
7*7-5*3 = 34 {prvo se radi operacija 7*7, pa 5*3, a zatim se od 49 oduzima 15}
7*7+7 div 2 = 52 {prvo se radi operacija 7*7, pa 7 div 2, pa se obavlja sabiranje 49+3}
7*7+7 mod 2 = 50 {prvo se radi operacija 7*7, pa 7 mod 2, pa se obavlja sabiranje 49+1}
Израз комбинован од целобројних и реалних делова као резултат даје реалну вредност. Реалној
променљивој се могу доделити целобројне вредности израза, док супротно није могуће. Приоритет
операција у изразима са реалним подацима је: *, /, па затим + и -.
Примери: Разни примери са приоритетом операција.
1.5*1+3.9/3 = 2.8 {prvo se radi operacija 1.5*1, pa 3.9/3, a zatim se sabira 1.5 + 1.3}
8.8/2.2*2 = 8.00 {prvo se radi operacija 2.2*2, a zatim 8.8 deli sa 1.1}
Заграде могу мењати приоритет операција.
Примери: Приказ израза где заграде регулишу приоритет операција.
9.7/(3.7 * 5.0)
{prvo se radi operacija u zagradi (3.7 * 5.0) pa se 9.7 deli sa dobijenim rezultatom}
4 * ((3 + 10) * 3)
{prvo (3+10), pa se dobijeni rezultat se mnozi sa 3, i na kraju se dobijeni rezultat mnozi sa 4}
5 * (10 + 5 * (4 – 1))

Операције са логичким изразима

У програму се често користе методе које контролишу редослед извођења појединих делова
програма. Тада се примењују наредбе са условима (наредбе селекције). Када се каже – са
условима, мисли се на изразе логичког типа. Логички изрази се у обради користе за поређење
различитих података и за друге логичке операције као на пример за услов да је x<50, где се као
резултат добија логички тип true (истина) или false (лаж).
Над операндима логичког типа могу се применити логичке операције приказане у табели 5.6:

Опис операције Операција


негација NOT
коњукција AND
дисјункција OR
ексклузивна дисјункција XOR

81
Табела 5.6. – Приказ логичких операција
Оператор NOT P је лаж ако је вредност P истина, а истина ако је вредност P лаж. У табели 5.7.
приказане су вредности операција NOT, AND и OR над операндима P и Q:

P Q NOT P P AND Q P OR Q P XOR Q


false false true false false false
true false false false true true
false true true false true true
true true false true true false
Табела 5.7. – Приказ резултата примене логичких операција
Дозвољене су све операције поређења као и код целобројног типа података. Додатна релација која
повезује скуповни тип података са логичким типом је in, и она је тачна само ако неки елемент
припада скупу.
Пример:
p or q and r је исто као p or (q and r)
p<=q and r је исто као p<=(q and r)

Операције са текстуалним изразима

Текстуални изрази се користе за обраду текста. У изразима се мора налазити текстуални тип
података било као константа или променљива.
Примери: Са текстуалним изразима.
'Object' + ' Pascal' {rezultat spajanja je Object Pascal}
'Program '+'Delphi' {rezultat spajanja je Program Delphi}

Оператори поређења

Аритметички изрази у програму имају неку своју вредност која је нумеричког типа, док логички
изрази имају истинитосну вредност true (истина) или false (лаж). На њих се могу применити
оператори поређења.
Пример: Логички израз поређења једнакости две променљиве а и b.
a=b
Знак = се назива оператор поређења. За операције поређења на располагању су оператори
приказани у табели 5.8. за које су дати примери над променљивама P и Q као операндима:

Операциј
Опис Операције Израз Услов
а
Једнако = P=Q Вредност P је једнака вредности Q
Различито <> P< >Q Вредност P није једнака вредности Q
Мање < P<Q Вредност P је мања од вредности Q
Мање или једнако <= P <= Q Вредност P је мања или једнака од вредности Q
Веће > P>Q Вредност P је већа од вредности Q
Веће или једнако >= P >= Q Вредност P је већа или једнака од вредности Q

82
Табела 5.8. – Приказ примера оператора поређења
Оператори поређења могу се применити на сва четири стандардна типа података (целобројни,
реални, логички и знаковни).
За целобројни и реални тип података треба објаснити два појма „претходи” и „следи”. Каже се да
један број претходи другоме ако је први број мањи од другога. А када се каже да један број следи
други, тада је први број већи од другога. Реч „претходи” се дакле може заменити с речју „мањи
од”, док реч „следи” са речју „већи од”.
У табели 5.9. су приказани оператори поређења с целобројним и реалним типом података и
њиховим резултатима:

Израз Вредност Израз Вредност


5=5 Истина 4.7<= 7.9 Истина
5=6 Лаж 6.7 > 10.8 Лаж
5<6 Истина 7.7 >= 8.5 Лаж
9.5 < 10 Истина 6.8< >7 Истина
9.2 < 10.9 Истина 0.5< >0.5 Лаж
Табела 5.9. – Приказ примера оператора с целобројним и реалним типом
Пример: Логички (Булов) израз који укључује правила која су до сада разматрана.
(10<3*3+1) OR (2*6=3*4) AND NOT(3+3=6)
Пример: Израз (10<9+1) OR (12=12) AND NOT(3+3=6) се извршава тако што се најпре решава
оно што је у заградама уз поштовање приоритета оператора па се решење приказује на следећи
начин:
(10<10) OR (12=12) AND NOT (6=6) {resavanje unutar zagrada}
false OR true AND NOT true {primena relacijskih operatora}
false OR true AND false {NOT je najviseg prioriteta, a sledeci je AND, pa OR}
false OR false {poslednje poredjenje}
false {krajnji rezultat}
Скуп основних знакова и њихових редних бројева је уређени скуп, и на знаковни тип могу се
применити операције поређења. У сваком случају слова су поређана по абецеди а бројеви по реду.
Поредак знакова се може разликовати у зависности од рачунара. Неки рачунари корист ASCII код,
док други користе неки други код. У табели 5.10. приказани су знакови из ASCII кодне табеле са
децималном конотацијом и одговарајућим знаком за сваки број:
Dec Znak Dec Znak Dec Znak Dec Znak Dec Znak Dec Znak
32 Space 48 0 64 @ 80 P 96 ` 112 p
33 ! 49 1 65 A 81 Q 97 a 113 q
34 " 50 2 66 B 82 R 98 b 114 r
35 # 51 3 67 C 83 S 99 c s
36 $ 52 4 68 D 84 T 100 d 116 t
37 % 53 5 69 E 85 U 101 e 117 u
38 & 54 6 70 F 86 V 102 f 118 v
39 ' 55 7 71 G 87 W 103 g 119 w
40 ( 56 8 72 H 88 X 104 h 120 x
41 ) 57 9 73 I 89 Y 105 i 121 y

83
42 * 58 : 74 J 90 Z 106 j 122 z
43 + 59 ; 75 K 91 [ 107 k 123 {
44 , 60 < 76 L 92 \ 108 l 124 |
45 - 61 = 77 M 93 ] 109 m 125 }
46 . 62 > 78 N 94 ^ 110 n 126 ~
47 / 63 ? 79 O 95 _ 111 o
Табела 5.10. – Приказ знакова из ASCII кодне табеле
Пример: За набројиве променљиве boja и ruza декларисане у табели 4.11. као набројиве, важи
следећи редослед:
crvena<zuta<plava<zelena
Пример: За набројиву променљиву dan декларисану у табели 4.11. може се формирати условни
израз комбиновањем операције поређења са логичким оператором and на следећи начи:
(dan< >subota) and (dan< >nedelja)
У операцијама поређења података типа стринг (знаковног низа) резултати могу бити тачни,
нетачни и непредвидиви.

Пример:
'ABCD'<'ABCE'

Први пар знакова D и E нису једнаки а како је D мање од E то важи дата релација.

Пример:
'500'<'53'

Израз је тачан зато што први пар знакова је исти (5), док други пар знакова '0'<'3' важи, исправан је
за стринг, па самим тим је ово поређење коректно, за разлику од нумеричких података.

Библиотечки потпрограми

За додатне радње које се не могу урадити операторима, Delphi има на располагању библиотеку
потпрограма који се могу применити над стандардним типом података и на дефинисаним
типовима података које је уградио креатор програма. у табели 5.11. је њихов списак:
Тип
Опис функције Функција Тип аргумента
резултата
целобројни као x
Апсолутна вредност x. abs(x)
real real
Квадрат од x. sqr(x) real real
Квадратни корен од x. sqrt(x) real real
Експоненцијална еx. exp(x) real real
Логаритамска logex. ln(x) real real
Број . Pi  real
Синус од x. sin(x) real real

84
Косинус од x. cos(x) real real
Аркус тангенс од x. arctan(x) real real
Умањивање x за 1(x:=x-1). dec(x) целобројни као x
Умањивање x за n (x:=x-n). dec(x,n) целобројни као x
Увећавање x за 1. inc(x) целобројни као x
Увећавање x за n. inc(x,n) целобројни као x
Да ли је x непаран број. odd(x) целобројни boolean
Целобројни део од x. int(x) real real
Претдходнa вредност у односу на x. pred(x) набројиви као x
Наредна вредност у односу на x. succ(x) набројиви као x
Најмања вредност истог типа као x. low(x) набројиви као x
Највећа вредност истог типа као x. high(x) набројиви као x
Најмања вредност типа Т. low(T) иден.набројивог типа T
Највећа вредност типа Т. high(T) иден.набројивог типа T
Заокруживање разломљеног дела на цео број. round(x) real longint
Знак са индексним бројем x chr(x) byte char
Индексни број x-а. ord(x) набројиви longint
Цео број добијен одсецањем разломљеног
trunc(x) real longint
дела броја x.
Величина податка x у бајтовима. sizeof(x) Било који Word
Величина податка типа T у бајтовима. sizeof(T) Иден. било ког типа Word
Разломљени део од x. frac(x) real real
Табела 5.11. – Приказ уграђених библиотечких потпрограма
Константа π која се користи за израчунавање тригонометријских функција као и у задацима
везаним за круг чија је математичка приближна вредност 3.14 је уграђана у програмски језик као
стандардна константа са ознаком pi чија вредност тачније износи 3.1415926535897932385.
У табели 5.12. приказани су примери коришћења библиотечких потпрограма као функција:

Функција Пример
abs(x) abs(0)=0 abs(-7)=7 abs(7-9)=2
sqr(x) sqr(9-4)=25 sqr(4)=16 sqr(-8)=64
sqrt(x) sqrt(49)=7 sqrt (17+8)=5.0 sqrt(3.14159)=1.77245
exp(x) exp(1)=2.71828 exp(-1)=3.67879E-1 exp(0)=1
ln(x) ln(0)=1 ln(10)=2.30259 ln(exp(1))=1.0
sin(x) sin(1)=8.41471E-1 sin(3.14)=0 sin(45*3.14/180)=7.07106E-1
cos(x) cos(1)=5.40302E-1 cos(3.14)=1.0 cos(45*3.14/180)=7.07388E-1
trunc(x) trunc(3.13)=3 trunc(3.50)=3 trunc(-7.9)=-7
int(x) int(55.25)=55.00
round(x) round(2.87)=3 round(4.50)=5 round(-9.30)=-9.0
chr(x) chr(65)='A' chr(66)='B' chr(67)='C'
ord(x) ord('A')=65 ord('B')=66 ord('C')=67

85
succ(x) succ('B')='C' succ(6)=7
pred(x) pred('B')='A' pred(6)=5 pred(true)=false
odd(x) odd(11)=true odd(12)=false
frac(x) frac(9.55)=0.55
dec(x) Ако је x=2, dec(x)=1
inc(x) Ако је x=2, inc(x)=3
Табела 5.12. – Приказ примера уграђених библиотечких функција
Дозвољене стандардне функције на целобројним типом су: pred(x), succ(x), abs(x), sqr(x) и sqrt(x).
Дозвољене стандардне функције чији је резултат реална су: sin(x), cos(x), arctan(x), ln(x), exp(x),
sqrt(x), abs(x), sqr(x), trunc(x), round(x), frac(x) и int(x). Дозвољене логичке функције су: pred(x),
succ(x), odd(x) и ord(x). функције које се могу користити са знаковним типом су: pred(x), succ(x),
UpCase(x), ord(x) и chr(x).
Табела 5.13. приказује примере разних типова израза где су коришћене уграђене функције у
комбинацији са операторима:

Аритметички изрази Логички изрази Текстуални изрази


sqr(x)/(y-1) (p>q) and (p>=r) ord('C')+ord('B')
1-sqrt(x) ((a+b)<0)) and (c>0) chr(ord('E') -1)
(a div 2)-(b mod 2) ((x+y)>1) or (z<=5) pred('E')=succ('D')
Табела 5.13. – Приказ примера израза са операторима и уграђеним функцијама
Примери: Следећи примери користе операторе поређења и уграђене библиотечке функције, али и
аритметичке операторе код знаковног типа података. како је поређење ord('A') < ord('B') тј.
65<66 је вредност true, то важи да је 'A'<'B'. како је поређење ord(5) = ord(7) вредност false, то
не важи да је '5'='7'. вредност израза ord('D') – ord('A') тј. 68-65, износи 3. вредност израза
chr(ord('C') – 1) је (chr(67-1) односно chr(66) је
Како логички тип има вредности true и false и важи операција да је false<true то се може
коришћењем библиотечких функција pred и succ рећи да је:
succ(false)=true, red(false)=true
pred(true)=false, succ(true)=false
Ако треба број a степеновати на број b, тада се примењује функција Power(a,b) која се налази у
уграђеном модулу Math. Модул Math се мора посебно додати јер није укључен када се покрене
нова апликација, у делу где су модули и то на следећи начин:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Math;
Дефиниција функције Power има следећи приказ:
function Power(const Base, Exponent: Extended): Extended;

где су:
function – службена реч за функцију,
Power – име функције за степеновање,

86
const – константа за основу Base која се степенује,
Exponent – експонент којим се степенује основа,
Extended – тип података.
Како је тип података Extended, то значи да се степеновање може обављати за основу целобројног
и ралног типа, али и са експонентом целобројног и релног типа.
Примери степеновања приказани су у табели 5.14:

Функција Резултат
Power(154,0) 1
Power(10,4) 10.000
Power(2.34,10) 4922.19227058666
Power(10,5.87) 741310.241300918
Power(34.871,12.64) 3.13870167856987E19
Табела 5.14. – Приказ примера степеновања
У табели 5.15. приказани су библиотечки потпрограми (функције и процедуре) за типове података
string, или како их још и називају знаковни низови:

87
Опис Потпрограм Облик
Максимална дужина низа знакова s. High(s):Word функција
Дужина коју тренутно садржи низ s. Length(s):Integer функција
Претвара садржај низа s у мала слова. LowerCase(s):string функција
Претвара садржај низа s у велика слова. UpperCase(s):string функција
Умеће низ s1 у низ s од позиције p. Insert(s1,s, p) процедура
Додаје низ s1 на крај низа s. AppendStr(s1,s) процедура
Брисање знакова почев од позиције p из низа s у дужини од
Delete(s,p,n) процедура
n знакова.
Преводи садржај низа знакова s у нумерички податак n са
Val(s,n,c) процедура
контролним бројем кода грешке c.
Преводи нумерички податак n у низ знакова s. Str(n,s) процедура
Преводи нумерички податак n у низ знакова s уз могућност
Str(n:sirina,s) процедура
уноса броја места за приказ.
Преводи нумерички податак n у низ знакова s уз могућност
Str(n:sirina,s:broj_decimala) процедура
уноса броја места за приказ и броја децимала.
Подниз од низа s почев од позиције p у дужини n. Copy(s,p,n) :string функција
Позиција првог појављивања подниза p у низу s. Pos(p,s):Byte функција
Спајање низова s1,s2,…,sn. Concat(s1,s2,…,sn):string функција
Упоређивање два низа s1 и s2 при чему се прави разлика
Compare(s1,s2):Integer функција
између малих и великих слова.
Упоређивање два низа s1 и s2 без разликовањем малих и
CompareText(s1,s2):Integer функција
великих слова.
Претвара целобројну вредност v у низ целобројних знакова. IntToStr(v):string функција
Претвара целобројну вредност v у низ од n хексадецималних
IntToHex(v,n):string функција
цифара.
Претвара децималну вредност v у низ децималних знакова
FloatToStr(v):string функција
(са децималном тачком).
Претвара децималну вредност v у низ децималних знакова
са задатим бројем децимала. Погодна за приказ реалних FloatToStrF(v):string функција
података у фиксном зарезу.
Претвара низ цифара из s у целобројну вредност. StrToInt(s):LongInt функција
Претвара низ цифара из s у целобројну вредност. Вредност
StrToIntDef(s,c):LongInt функција
c=1 ако је s непопуњен, иначе c=0.
Претвара низ цифара из s у реалан број. StrToFloat(s):Real функција
Претвара низ цифара из s у реалан број.
StrToFloatDef(s,c):Real функција
Вредност c=1 ако је s непопуњен, иначе c=0.
Табела 5.15. – Приказ уграђених потпрограма за тип string
Напомена: Код функција StrToIntDef и StrToFloatDef аутоматски се обавља контрола када је
садржај аргумента s празан, тако да се претварање у нумерички податак стопира, а вредност
функције постаје 1, док када садржај аргумента није празан вредност функције је 0. коришћењем

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

89
НАРЕДБЕ

Наредбе су основне јединице обраде у програмима. у претходном поглављу упознали смо наредбе
за декларацију променљивих различитих типова података, а често их неки називају описним
наредбама. Декларисане променљиве се касније користе у извршним наредбама програма.
Извршне наредбе се у програму користе за обраду улазних података и међурезултата обраде.
Према нивоу сложености извршне наредбе се могу класификовати као просте и структуриране.
Просте наредбе у Object Pascal језику су:
 наредба доделе,
 процедуралне наредбе улаза и излаза (read, write) и
 наредба безусловног скока goto.
Структуриране наредбе у Object Pascal језику су:
 компонована наредба,
 наредбе селекције (if и case) и
 цикличне наредбе (for, while и repeat).
Структуриране наредбе су сложене јер се у њима налазе управљачке структуре којима се одређује
редослед извршавања наредби у програму. Говорили смо о управљачким структурама у поглављу
1 када је указано да постоје следеће: секвенца, селекција и итерација. У саставу структурираних
наредби могу се наћи просте или друге структуриране наредбе.

Наредба доделе

Да би се некој променљивој доделила вредност користи се знак за додељивање := тј. двотачка-


једнако. Овај оператор се назива оператор доделе и о њему је било више речи у поглављу 4. Ова
наредба је једноставна и има значење да се садржај вредности са десне стране додељује
променљивој на левој страни једнакости. може се једноставно на десној страни наћи само
константа, или само променљива, или само стандардна уграђена функција, али може се наћи и
израз који се израчунава. формат у коме се наредба задаје може са написати као:
ime_promnljive:=vrednost;
где су:
ime_promnljive – име променљиве којој се додељује вредност са десне стране,
:= – оператор доделе, vrednost – вредност која може бити константа, променљива, стандардна
функција и израз.
Напомена: све променљиве које се користе у извршним наредбама морају прво бити декларисане.
Пример: Пример наредбе доделе за сабирање два броја. Пример је урађен у поглављу 6. креирање
апликација под називом uSabiranje,pSabiranje. Овде је приказано алгоритамско решење овог
примера и програмски код обраде где се користе променљиве.

Početak Почетак програма


а,b,c programa
Декларисање променљивих
a=5,b=10 Додељивање вредности променљивама

c=a+b Сабирање c=a+b


c 90
Приказ резултата
Kraj Крај програма
Напомена: У алгоритмима који ће се даље приказивати неће се приказивати акција декларисања
променљивих.
Програмски код за алгоритамско решење овог примера приказан је са објашњењем у табели 5.16:

Наредба Шта се догађа


var У меморији се формирају три адресе са одговарајућим просторима за податке.
a,b,c:integer; a b c
begin Наредбама доделе се у овај простор смештају одговарајуће вредности
a:=5; a 5 b 10
b:=10;
c:=a+b; Наредбом доделе се прво израчуна израз са десне стране a+b, па се израчуната
end; вредност додели променљивој c с леве стране оператора доделе.
c 15
Табела 5.16. – Приказ програмског кода за сабирање два цела броја
У табели 5.17. приказане су исправни примери наредбе доделе са датим описом и напоменама:

Наредба доделе Опис Напомена


Променљивој a се додељује Променљива a може бити
a:=156;
вредност константе 156 целобројног или реалног типа.
Променљиве y и x морају бити
Променљивој y се додељује
y:=x; истог типа (осим изузетака када је
вредност променљиве x.
то могуће).
Променљивој plata се додељује Променљиве plata, bod и sati
plata:=bod*sati; резултат множења вредности могу бити целобројног или
променљивих bod и sati. реалног типа.
Променљивој y се додељује
Променљива x је целобројног
y:=sqrt(x); квадратни корен вредности
типа а променљива y реалног.
аргумента x.
Променљивој kamata се додељује Променљива ulog може бити
kamata:=ulog*0.05; резултат множења променљиве целобројног или реалног типа а
ulog и констане(броја) 0.05. променљива kamata реалног.
Променљива x је целобројног
Променљивој stepen се додељује
stepen:=sqr(x); типа а променљива stepen
квадрат вредности аргумента x.
целобројног или реалног.
Табела 5.17. – Приказ исправних примера наредбе доделе
Наредбом додељивања се у меморијску локацију која је обезбеђена у наредби за декларацију
променљиве која се налази са леве стране знака доделе, смешта вредност која је са десне стране
знака.

Пример: За декларисане две целобројне променљиве x и y најпре променљивој y доделити вредност


20, а затим променљивој x доделити вредност 11, па применити наредбу доделе y:=x.
У тренутку декларисања По додели вредности за
променњиве x и y нису x x:=11, и примени наредбе x 11
x:=11 91
имале додељене вредности. y:=x, променљива x има
После доделе вредности y 20 вредност 11, а променљива
променљива y има додељену y замењује стару вредност y 20 11 y:=11
вредност 20. 20 новом вредношћу 11.
y:=20
Пример:
Наредба доделе је z:=x+y;, и ако су већ пре задавања ове наредбе меморисане вредности за x=11, за
y=19 и за z=20 тада се после наредбе доделе вредност 30 (11+19) као нова додељује променљивој z.
Графички то изгледа овако:
x 11

y 19 z:=11+1
пре доделе променљива z је
9z:=30 после доделе нова вредност
имала додељену вредност 20 z 2030 за z 30 замењује стару 20.

Ако после наредбе из претходног примера z:=x+y;, задамо нову наредбу z:=z+x;, може доћи до
забуне зато што се иста имена променљиве налазе на левој и на десној страни наредбе доделе.
међутим, како се вредности z и x добијају из меморије, и ако је вредност за z у меморији 30, а
вредност за x у меморији 11, тада се у изразу те вредности замењују, тако да је z:=30+11(z:=41).
Напомена: Код наредбе доделе треба поштовати правило, да тип израза на десној страни од
знака доделе мора одговарати типу променљиве са леве стране знака доделе. Изузетак у овом
правилу је дозвољен и односи се на случај када је израз са десне стране целобројног типа, а
променљива са леве стране је реалног типа. У том случају се вредност израза са десне стране из
целобројног типа претвара у реалан тип.
Пример: Саставити алгоритам и написати одговарајићи програмски код са променљивама за
размену вредности две променљиве (a и b). Како Delphi нема функцију Swap, за решавање овог
задатка уводи се помоћна променљива (pom).
Oвде је дат поступак решавања (алгоритам), док је у поглављу 6 имплементиран као апликација
под називом uRazmena, pRazmena, fRazmena.
Следи приказ алгоритма за размену вредност две променљиве и програмски код извршних
наредби додела које користе променљиве:

Алгоритам примера размене две променљиве Програмски код


početak Почетак алгоритма

a,b Унети вредности за a и b

pom=a Доделити a променљивој pom begin


DodelitiСабирање c=a+b pom:=a;
а=b Доделити b променљивој a
Доделити pom променљивој b a:=b;
b=pom
b:=pom;
a,b Приказ резултата после обраде end;

kraj Крај алгоритма

Да би се алгоритам размене две променљиве тестирао, за вредност променљиве a учитати да је 2.2,


а за вредност променљиве b учитати да је 5.5. Затим тестирањем алгоритма обављају се следеће
акције обраде:

92
I. променљивој pom се додељује вредност променљиве a, pom=a при чему променљива pom
добија вредност 2.2.
II. променљивој a се додељује вредност променљиве b, a=b при чему променљива a уместо
вредности 2.2 добија нову вредност 5.5.
III. променљивој b се додели вредност променљиве pom, b=pom при чему променљива b
уместо 5.5 добија нову вредност 2.2.
У табели 5.18. приказане су промене стања приликом промене вредности две променљиве:

Стање после I акције Стање после II акције Стање после III акције
a b a b a b
2 2
2.2 5.5 5.5 5.5 5.5 2.2
pom pom
1 pom
2.2 2.2
2.2
Табела 5.18. – Приказ догађања при размени вредности две променљиве
Следе примери коректних наредби доделе за набројиве променљиве декларисане у табели 4.11.
Пример:
dan:=utorak;
boja:=crvena;
ruza:=crvena;
Следе примери некоректних наредби доделе за набројиве променљиве декларисане у табели 4.11.
Пример:
dan:= 'utorak'; {'utorak' је константа знаковног типа char}
boja:=siva; {siva није коректна константа}
dan:=pio; {pio није коректна константа}
Следе примери коректних наредби доделе за интервалне променљиве декларисане у табели 4.12.
Примери:
sredt:=(t1+t2) div 2;
znak2:=pred(znak1);
Код операције доделе (:=), дозвољено је да се са обе стране користе разне променљиве, међутим
ако су вредности променљивих ван граница интервалног типа, додељивање се неће извршити.
Следећа три примера се односе на примену наредбе доделе код типа података string где су
примењене уграђене функције и процедуре из табеле 5.15.
Пример: За стринговну променљиву ps декларисану као var ps:string[9];, доделити јој текст
између апострофа 'DOBAR DAN'.
ps:= 'DOBAR DAN'; {promenljivoj ps je dodeljen sadrzaj 'DOBAR DAN'}
После извршења ове наредбе доделе, стринговна променљива ps је попуњена на следећи начин:
ps[1]:='D' ps[2]:='O' ps[3]:='B' ps[4]:='A' ps[5]:='R' ps[6]:=' ' ps[7]:='D' ps[8]:='A' ps[9]:='N'
Сваком знаку у стрингу може приступити, јер се тачно зна позиција сваког од њих.
Пример: Ако се декларишу променљиве s1, s2, s3, s4, s5 као стринг, и променљиве poz1 и poz2
као целобројне. Променљивој s1 додели се садржај 'Delphi program', а променљивој s5 додели
садржај 'Dobar dan'. Променљивој duz доделити дужину стринга s1. Издвојити подниз из низа s1

93
тако да се добије реч Delphi и доделити је променљивој s2. Издвојити подниз из низа s1 тако да се
добије реч program и доделити је променљивој s3. Спојити речи Dobar и dan коришћењем
функције за спајање concat, а затим то исто урадити са оператором за спајање +. Одредити
позицију од које почиње реч dan у стринг низу s5 и доделити је променљивој poz1. Одредити
позицију од које почиње реч DAN у стринг низу s5 и доделити је променљивој poz2.
Следећа табела приказује декларисане променљиве типа стринг и наредбе доделе са применом
функција:

Наредба Објашњење дејства


var s1,s2,s3,s4,s5:string; декларисане су стринг променљиве s1, s2, s3, s4 ,s5
poz1,poz2,duz:integer; декларисане су позиције за стринг poz1,poz2 и дужина duz
s1:= 'Delphi program'; променљивој s1 додељен садржај 'Delphi program'
s5:= 'Dobar dan'; променљивој s5 додељен садржај 'Dobar dan'
duz:=length(s1); после функције length, duz=14
s2:=copy(s1,1,6); после функције copy, s2='Delphi'
s3:=copy(s1,8,7); после функције copy, s3='program'
s4:=concat('Dobar','dan'); после функције concat, s4='Dobardan'
s4 := 'Dobar'+'dan'; после спајања са знаком +, s4='Dobardan'
poz1:=pos('dan',s5); после функције pos, poz1=7
poz2:=pos('DAN',s5); после функције pos, poz2=0, јер не постоји реч DAN
Пример: Променљиве s1 и s2 декларисати као стринг, променљивој s1 доделити садржај s1:= 'Ja
citam knjigu', а променљивој s2 садржај 'dobru '. спојити ове две реченице са једном празнином
између да се добије реченица 'Ja citam dobru knjigu', а затим обрисати реч dobru.
Следећа табела приказује декларисане променљиве типа стринг наредбе доделе и процедуре за
решење овог примера:

Процедуре Објашњење дејства


var s1,s2:string; декларисане су стринг променљиве s1, s2
s1:= 'Ja citam knjigu'; променљивој s1 додељен садржај 'Ja citam knjigu'
s2:= 'dobru'; променљивој s2 додељен садржај 'dobru'
insert(s2,s1,10); после процедуре insert, s1='Ja citam dobru knjigu'
delete(s1,9,6); после процедуре delete, s1='Ja citam knjigu'
Наредба доделе за креирање инстанце објекта би се могла дефинисати на следећи начин:
promenljivaklase:=ime_tipa_klase.Create;
Пример: Наредба доделе за позивање метода који креира инстанцу класе.
AStudent:=TStudent.Create; {Kreiranje instance – objekta}
Објашњење: Креирање инстанце обавља се у извршном делу програма (implementation).

94
Процедуралне наредбе

Процедуралне наредбе улаза и излаза (read, write) се у стандардном језику Pascal користе за унос
и приказивање података. У окружењу Delphi се користе само специјални облици ових наредби за
рад са датотекама, и то ретко, јер се у данашње време тај начин рада сматра превазиђеним, па су те
наредбе у објектном програмирању замењене компонентом Edit која служи за унос и приказ
података.

Наредба безусловног скока GOTO

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

Компонована наредба

Ова наредба је структурирана, почиње са службеном речи begin, а завршава се са end иза кога се
на крају ставља знак „;”. формат ове наредбе може се представити на следећи начин:
begin
naredba_1;
naredba_2

naredba_n
end;

Наредба гранања (селекција)

Када се у програму појави потреба за постављањем неког услова, тада се говори о разгранатој
програмској структури. U том случају се програм на основу тога да ли је услов испуњен или не
грана, при чему свака грана може имати своје посебне наредбе укључујући и наредбу гранања.
Delphi има две наредбе гранања if и case. О њима ће се посебно говорити у поглављу 7.

Наредба понављања (циклуси - итерација)

Када се извршавање једне или скупа наредби као део програма понавља више пута, тада се у
програму говори о наредбама за понављање циклусу–цикличној програмској структури или како
се још другачије зове петља.
Све наредбе понављања (има их више облика) састоје се од:
 излазног услова (критеријума) из циклуса и
 тела циклуса.
Delphi има три наредбе: for, while и repeat. О њима ће се посебно говорити у поглављу 8.

95
Контролна питања:
1. Која су правила за формирање израза?
2. Које врсте израза постоје према типу података?
3. Шта су оператори а шта операције?
4. Које су операције дозвољене у раду са целобројним типом?
5. Које су операције дозвољене у раду са реалним типом?
6. Које су операције дозвољене у раду са логичким типом?
7. Које су операције дозвољене у раду са знаковним типом?
8. Које су операције дозвољене у раду са стринговним типом?
9. Који оператори поређења могу да се користе у раду са целобројним типом?
10. Који оператори поређења могу да се користе у раду са реалним типом?
11. Који оператори поређења могу да се користе у раду са логичким типом?
12. Који оператори поређења могу да се користе у раду са знаковним типом?
13. Који оператори поређења могу да се користе у раду са стринговним типом?
14. Које стандардне функције могу да се примене на целобројни тип?
15. Које стандардне функције могу да се примене на реални тип?
16. Које стандардне функције могу да се примене на логички тип?
17. Које стандардне функције могу да се примене на знаковном типу?
18. Које стандардне функције и процедуре могу да се примене на стринговни тип?
19. Шта је наредба програма и које врсте наредби постоје?
20. Како се задаје и тумачи проста наредба доделе?
21. Које су наредбе сложене (структуриране)?
22. Када се користе процедуралне наредбе?
23. Када се користи наредба безусловног скока?
24. Шта представља компоновану наредбу?
25. Када се користи наредба гранања (селекција) и које врсте те наредбе постоје?
26. Када се користи наредба понављања (циклус) и којој управљачкој структури
одговара?

96
6. КРЕИРАЊЕ АПЛИКАЦИЈЕ
Програмски пакет Delphi користи се за креирање апликација са графичким корисничким
интерфејсом. Програмери имају подршку да направе графички интерфејс апликације, као и алат за
функционисање апликације.
Било би добро да укратко поновимо најважније што смо до сада научили из претходних делова
књиге а важно је за креирање апликација:
 сваки задатак који се решава у Delphi окружењу назива се пројектом (апликацијом). Задатак
располаже графичким интерфејсом за његово приказивање и решавање. Интерфејсом се
дефинише алат апликације који стоји на располагању кориснику и начин коришћења алата.
Интерфејс се креира дизајнирањем формe на коју се постављају разне компоненте за
управљање апликацијом;
 функционалност апликације представља се догађајима који се активирају на изабраним
компонентама. сваки догађај има своју методу (процедуру), у којој је дефинисано шта он, у
ствари, ради у апликацији. свака метода програмира се одговарајућим програмским кодом,
који прецизно дефинише догађаје у апликацији;
 да би се креирала апликација, потребно је располагати знањима о објектно оријентисаном
програмирању и алатом које Delphi ставља на располагање за креирање апликација;
 прва фаза креирања апликације је фаза дизајна. у овој фази се на форму постављају објекти
(компоненте) потребни за решавање задатка. које ће се компоненте поставити зависи од самог
задатка, али и од програмера који дизајнира апликацију. Потребно је поставити компоненте
које ће репрезентовати улазне и излазне податке, али и компоненте које ће изазвати догађаје
којима се врши обрада улазних података и добијање излазних података;
 друга фаза је фаза кодирања, односно писања програмског кода који обрађује догађаје
компоненти на форми, чиме се уређује како и шта апликација ради. О томе је већ било речи у
поглављу 3, Увод у развојно окружење програмског језика, с тим што треба да се истакне да
се део програма којим се обрађује догађај назива метода;
 изворни облик програма (source) пише се у наредбама програмског језика коришћењем
правила синтаксе и семантике језика. свака неправилност синтаксе и семантике језика доводи
до грешака у програму и програм неће моћи да изврши предвиђени постављени задатак за који
је писан;
 изворни облик програма се још назива и програмски код. Програмски код се може писати на
папиру, табли и слично, али се тако написан код не може извршавати на рачунару. међутим,
како се програм пише да би се извршавао на рачунару, мора се унети у рачунар у свом
изворном облику писан наредбама које су на програмском језику. За унос програма у
рачунар користи се одговарајући едитор текста;
 да би рачунар разумео и могао да извршава програм написан у програмском језику, после
његовог уноса у рачунар, он се поступком компајлирања преводи у извршни облик програма.
Позивањем извршног програма, уствари се на рачунару извршава постављени задатак, и
рачунар може пратити комплетну активност, почев од улазних података, обраде и добијања
резултата који се приказују као излазни подаци. Програм који преводи изворни програмски код
програма у извршни облик назива се компајлер;
 понекад се у решавању задатка појави и нека грешка у изворном програмском коду писаном у
програмском језику. компајлер открива у поступку превођења грешке програма, и даје пратећи

97
текст као упозорење где се налазе грешке и опис грешке. Програм са грешкама још увек није
прошао цео поступак компајлирања и не може се још извршавати. Овде се мисли на синтаксне
грешке у програму а не на логичке и рачунске које решавају задатак. Овај поступак откривања
грешака и њихово отклањање назива се дебаговање. грешка се на енглеском каже „bug”, па
отуда и ова реч дебаговање;
 тек после дебаговања, отклањања синтаксних грешака у програму, програм је спреман за
извршавање. Али преостаје још једна фаза у програмирању која се назива тестирање
програма. За разлику од ручног тестирања алгоритма, сада се тестирање програма обавља на
рачунару. Проверава се коректност рада апликације за све могуће случајеве улазних података
као и свих потребних контрола у програму да не би дошло до тзв „пуцања програма”.

Фазе у решавању пројектног задатка (креирање апликације)

Када се решава сложен задатак, потребно је за такву апликацију ангажовати тим стручњака. О
поступку кроз који пролази пројекат (апликација) од идеје до реализације било је речи у поглављу
Решавање проблема коришћењем рачунара. како се у овој књизи не говори о сложеним
задацима, нема потребе да се пролази кроз све наведене фазе, односно да се формира тим
стручњака. Задаци који ће се решавати у књизи прилагођени су појединцу који се учи основним
техникама програмирања. у ту сврху се предлаже следећи скраћени поступак:
A. Написати шта су улазни, шта излазни подаци у програму и шта треба урадити у обради улазних
података да би се добили излазни подаци. При томе дефинисати сва имена потребних
променљивих којe ће се касније користити у програму.
Б. Написати алгоритам који решава овај задатак, и то по жељи као псеудокод или графички
(дијаграм тока).
В. У алгоритму прецизно означити шта је улазни блок података, шта је обрада, а шта излазни блок
података.
Г. Ручно тестирати алгоритам на произвољно изабран узорак улазних података.
Д. Написати програм у програмском језику.
Ђ. Тестирати и отклонити грешке, и поново после исправке грешака тестирати рад програма.

Пример: uMenjacnica, pMenjacnica, fMenjаcnica


Познат је принцип рада мењачнице. једна валута се купује или продаје за другу по неком курсу.
курс је однос вредности једне валуте у односу на другу. На пример: ако се купује евро за динаре,
тада је курс за 1 евро = 119,7644 и то је продајни курс валуте за коју вам банка продаје евро за
динаре, а ако се продаје евро за динаре, тада је курс за 1 евро = 119,2345, и то је куповни курс
валуте за који вам банка откупљује(плаћа) евро. Приказано је најједноставније решење без
посебних детаља као што су која валута се мења за неку другу, курсна листа и слично. Банка на тај
начин остварује своју зараду. Лако је закључити да када банка продаје једну валуту а плаћа другом
валутом, примењује се продајни курс који је већи, а када купује једну валуту а исто плаћа другом
валутом, курс је мањи.
Решење:
A.
Улазни подаци:
Износ валуте која се купује, променљива ikv, курс валуте као однос између куповне и продајне
валуте – kv, и износ продајне валуте која се уплаћује – ipv.

98
Излазни подаци:
Износ који се израчунава у продајној валути на основу датог курса – pipv. Kусур који се
израчунава као разлика уплаћеног износа продајне валуте и израчунате вредности износа у
продајној валути који се плаћа за валуту која се купује − kusur.
Обрада:
Како се зна колико се купује одређене валуте и који је курс у односу на продајну валуту, прво се
израчунава колики је износ потребан у продајној валути да би се купио одговарајући износ
куповне валуте. тај износ израчунава се следећом формулом: pipv=ikv*kv. кусур у продајној
валути израчунава се формулом: kusur=ipv-pipv.
Б. и В.
Алгоритам и означавање у алагоритму:

Г.
Формирати произвољно узорак и ручно тестирати алгоритам куповине евра за динаре. Нека су
учитани подаци: ikv=10 евра, kv=119,7644 и ipv=2000,00. Тада се обрадом добијају вредности:
pipv=10*119,7644, односно pipv=1197,644, а за kusur=2000-1197,644, односно kusur=802,356.
Д.
Програм написан у програмском језику.
За реализацију решења задатка употребом апликације, а према датом алгоритму, у ООП прво
треба урадити фазу дизајнирања корисничког интерфејса. На форму се постављају компоненте
(контроле) потребне за решавање задатка. у другој фази, која се назива кодирање, дефинишу се
догађаји чија се реакција програмира помоћу наредби које чине методе тих догађаја. Писање
програма се обавља у едитору за писање програма. За то је потребно познавати наредбе, њихову
синтаксу и семантику. При томе треба познавати компоненте и њихова својства, догађаје који се
активирају на компонентама као и методе које обрађују догађаје. На слици 6.1. приказана је форма
која учествује у решавању задатка у вези с мењачницом настала после фазе дизајнирања
апликације.

99
Слика 6.1. – Приказ форме с компонентама примера апликације pMenjacnica
Процедура за решавање задатка:
1. За улазне и излазне податке с картице Standard поставити пет компоненти Edit. у својству
Name доделити им редом имена: eikv, ekv, eipv, epipv и ekusur. Испразнити садржај својства
Text. Приметићете да су имена Edit компоненти настала од имена променљивих са словом e,
које је додато на почетак имена. то олакшава да се променљиве касније у програму повежу с
компонентама које их прате у поступку програмирања.
2. За описивање компоненти поставити с картице Additional компоненту StaticText. како она има
улогу да опише компоненте Edit, у својству Name није јој потребно додељивати име. у својство
Caption уписати као име ULAZNI PODACI. Oстали описи могу се поставити копирањем ове
компоненте. копирање се изводи постављањем на компоненту StaticText, и то тако што се
кликом десним тастером миша отвори контекстни мени и бира се опција Copy. Друга фаза
копирања обавља се тако што се кликне десним тастером миша на празно место на форми и
одабере опција Paste. како је потребно још шест описа, команда Paste изврши се шест пута. у
својства Caption ископираних компоненти StaticText-а унети као описе редом: Iznos kupovne
valute, KURS, Iznos uplate u prodajnoj valuti, IZLAZNI REZULTATI, Izracunati iznos u
valuti placanja и KUSUR. Закључак је да се операција копирања може користити и за друге
компоненте.
3. За израчунавање резултата и њихово приказивање као излазних података, с карице Standard
поставити компоненту Button. у својство Name уписати bRacunaj а у својство Caption уписати
опис MENJANJE.
4. Да би се обавило израчунавање и приказивање резултата, потребно је над компонентом
bRacunaj активирати догађај OnClick који ће дефинисати костур методе за обраду тог догађаја.
Из ObjectInspectorа одабрати картицу за догађаје Events, а затим одабрати догађај OnClick
тако што се двапут кликне мишем у поље поред догађаја. у едитор програмског кода унети
следећи садржај, односно програм за обраду догађаја који представља методу:
procedure TfMenjacnica.bRacunajClick(Sender: TObject);
var ikv,kv,ipv,pipv,kusur:real;
begin
ikv:=StrToFloat(eikv.Text); kv:=StrToFloat(ekv.Text);
ipv:=StrToFloat(eipv.Text); pipv:=ikv*kv; kusur:=ipv-pipv;
epipv.Text:=FloatToStr(pipv); ekusur.Text:=FloatToStr(kusur);
end;

100
5. За операцију изласка из апликације поставити на форму компоненту Button. у својство Name
уписати као име bIzlaz а у својство Caption опис I Z L A Z. с картице догађаја Events одабрати
догађај OnClick и унети следећи програмски код:
procedure TfMenjacnica.bIzlazClick(Sender: TObject);
begin
Close;
end;
Напомена: Како ће се излазак из апликације убудуће обављати на исти начин, убацивањем
процедуре Close, када се активира догађај OnClick на дугмету које ће се користити за излаз, у
даљим процедурама за решавање примера апликација неће се спомињати. у овој процедури за
решавање задатка смо описали где се налазе компоненте Edit, StaticText и Button, па убудуће
ћемо само говорити да се оне постављају и која имена или нека важна својства користе за
програмирање апликације. Када се буде постављала компонента Edit, убудуће се неће у опису
процедуре за решавање задатка писати да се њен садржај у својству Text празни, односно брише.
За будуће нове компоненте, биће објашњено на којој се картици налазе, како се оне зову, за шта се
могу користити и њихова важна својства за програмирање апликације. Када се активирао догађај
OnClick објашњено је како се то ради, па како се затим у методу уноси програмски код, убудуће
се то неће објашњавати, већ ће се само навести садржај програмског кода у методи која обрађује
тај догађај. Када се буде појавио неки други догађај, он ће посебно бити истакнут, тј. како се
активира и све што је везано за њега.
Ђ.
Тестирање и отклањање грешака

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

Слика 6.2. – Приказ тестирања апликације pMenjacnica


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

101
Предлаже се да ученик сваки задатак уради пролазећи кроз наведене фазе решавања. Аутору то
није било тешко да уради у свим примерима, али је због лимитирања броја страна ове књиге то
намерно изоставио. међутим, у многим примерима је ипак додао алгоритамско решење задатка.
Пример: uProstKalk, pProstKalk, fProstKalk
Крерати апликацију рада простог калкулатора са операцијама сабирања, одузимања, множења и
дељења над улазним подацима два задата броја који ће се уносити помоћу две компоненте Edit.
При томе применити потребне функције за превођење података из типа стринг у реалан тип и
обрнуто. Омогућити приказ назива активиране операције у наслову.
Процедура за решавање задатка:
1. За улазне и излазне податке поставити три компоненте Edit. у својству Name доделити им
имена редом: eo1, eo2, и erez.
2. За опис наслова користити компоненту Label. Бирати Standard картицу, кликнути на
компоненту Label, а затим је поставити на форму. у својству Name доделити јој име lNaslov, а
у својству Caption унети опис за наслов ARITMETICKE OPERACIJE.
3. За описе компоненти Edit поставити три компоненте StaticText. у својства Caption унети описе
редом: Operand 1, Operand 2 и Rezultat. Да би се видела разлика од компоненте Label
примениће се нека својства која компонента Label нема. у својству AutoSize одабрати вредност
False, у својству Alignment одабрати вредност taCenter, у својству BorderStyle одабрати
вредност bsSunken, у својству BevelInner одабрати вредност bvLowered и у својству
BevelKind одабрати вредност bkTitle.
4. За обраду података поставити пет компоненти Button. у својству Name уписати редом: bPlus,
bMinus, bPuta, bDeli и bOFF, a у својству Caption уписати описе редом: +, -, *, \ и OFF.
5. За операцију сабирање, позиционирати се на дугме bPlus, активирати догађај OnClick и унети
следећи програмски код:
procedure TfProstKalk.bPlusClick(Sender: TObject);
begin
erez.Text:=FloatToStr(StrToFloat(eo1.Text)+StrToFloat(eo2.Text));
lNaslov.Caption:='S A B I R A NJ E';
end;
6. За операцију одузимање, позиционирати се на дугме bMinus, активирати догађај OnClick и
унети следећи програмски код:
procedure TfProstKalk.bMinusClick(Sender: TObject);
begin
erez.Text:=FloatToStr(StrToFloat(eo1.Text)-StrToFloat(eo2.Text));
lNaslov.Caption:='O D U Z I M A NJ E';
end;
6. За операцију множење, позиционирати се на дугме bPuta, активирати догађај OnClick и унети
следећи програмски код:
procedure TfProstKalk.bPutaClick(Sender: TObject);
begin
erez.Text:=FloatToStr(StrToFloat(eo1.Text)*StrToFloat(eo2.Text));
lNaslov.Caption:='M N O Z E NJ E';
end;
7. За операцију дељење, позиционирати се на дугме bDeli, активирати догађај OnClick и унети
следећи програмски код:

102
procedure TfProstKalk.bDeliClick(Sender: TObject);
begin
erez.Text:=FloatToStr(StrToFloat(eo1.Text)/StrToFloat(eo2.Text));
lNaslov.Caption:='D E LJ E NJ E';
end;
Следи тестирање апликације pProstKalk, где је на слици 6.3. приказано тестирање сабирања и
дељења.

Слика 6.3. – Приказ извршавања апликације pProstKalk.


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

Грешке у програму

У поступку креирања пројекта долази до појаве грешака. грешке се могу сврстати у три групе:
 синтаксне које се откривају у току превођења програма,
 логичке које се појављују у току извршавања програма и
 логичке грешке које се не откривају.
Синтаксне грешке се појављују када се не поштују формална правила писања програма. На
пример, могу се појавити ако се неисправно пишу или користе службене речи језика, коришћење
имена која претходно нису декларисана, неисправно конструисање сложених наредби, итд.
У поступку кодирања када се пишу наредбе у едитору програма, службене резервисане речи су
исписане подебљаним словима. Ако знате да уносите резервисане речи у наредбе, а видите да нису
подебљане, знајте да их нисте написали синтаксно исправно.
Синтаксне грешке се појављују у поступку компајлирања изворног програмског кода у модулима,
односно када се покрене команда Run или команда за повезивање без извршавања Compile или
Build.
Могу се појавити и када се врши превођење без повезивања са командом. Syntax check. На слици
6.4. приказана је грешка у претходном примеру апликације pProstKalk.

103
Слика 6.4. – грешка настала услед погрешног имена компоненте Edit означене као eopolje1.
Линија програма у којој је грешка истакнута је браон или неком другом бојом, док показивач
трепће на месту где је Delphi пронашао да је грешка. Може се десити да грешка није баш на том
месту, али је сигурно негде у непосредној близини означене линије. у статусној линији налази се
порука о врсти грешке са пратећим текстом програмског модула (Error) uProstKalk.pas(55):
Undeclared identifier: 'eopolje1 '. Том поруком преводилац указује да не постоји компонента Edit
са именом eopolje1. Требало би се вратити у поступак креирања пројекта, погледати како се зове
та компонента, у овом случају eo1, исправити име на означеном месту и поново запамтити
пројекат па покренути извршавање. Ако нема других грешака, програм ће се извршавати, у
супротном се појављује нека нова грешка. слично се догађа када се не напише правилно службена
реч, на пример када би уместо речи FloatToStr написали то неисправно на пример FlaotToStr.
Ако би у истој наредби, уместо правилно написане наредбе доделе, било написано нешто
погрешно, као што је, на пример, знак =, појавила би се порука (Error) uProstKalk.pas(55): ':='
expected but '=' found, која указује да је преводиоц очекивао исправну наредбу доделе означену
као ':= ', али је нашао у апликацији '=' која је неисправна.
Логичке грешке у току извршавања се како сама реч каже појављују у поступку извршавања
програма. Како у претходном примеру апликације pProstKalk није спроведена логичка контрола
унетих података пре уласка у методу њихове обраде, сигурно је да ће се појавити грешка.
Kонтроле се могу односити на случај да се не унесе податак у Edit компоненту, да се не унесе
бројчани податак, да се не може делити нулом у операцији дељења и сл. јасно је потпуно, ако
имамо неку наредбу која користи садржаје компоненти Edit, а она нема одговарајућу вредност, да
мора доћи до грешке у програму или „пуцања” програма. За апликацију pProstKalk, то значи да
ако не унесемо вредности у поља за унос улазних података која су компоненте Edit, или не
унесемо бројчане податке који се траже, а притиснемо дугме за извршавање неких од
аритметичких операција, појавиће се порука као на слици 6.5. На овој слици приказан је и случај
када се коректно унесу подаци, али је за дељење унета вредност 0 за делилац, што проузрокује
грешку у апликацији.

104
Ако се не
унесу
коректни
подаци

Ако се
дели са
нулом

Слика 6.5. – Логичка грешка настала услед некоректних улазних података и дељења са 0.
Логичке грешке настају приликом доделе неадекватног типа податка декларисаној променљивој,
примене неадекватне функције конверзије, покушаја дељења са нулом, приступања датотеци
података која не постоји и сл. Код ове врсте грешке, у оквиру за дијалог грешке постоји опис
проблема, и дугме Help за помоћ при решавању истог. Ако се притисне дугме Help приказује се
помоћ коју Delphi пружа кориснику да реши настали проблем.
За исправљање логичких грешака, после читања помоћи, затворити прозор за помоћ и притиснути
дугме OK, после чега се враћа у пројекат.
Да би се избегла грешка која би настала због непопуњености поља за унос података, односно
садржаја Edit компоненти које учествују у обради, могу се у фази дизајна апликације својства Text
тих компоненти иницијално напунити вредностима 0. Међутим, тиме се неће решити проблем који
се јавља у вези с дељењем нулом, а што није дозвољено.
Друго решење за непопуњеност садржаја компоненти Edit се може реализовати догађајем
OnCreate за форму, и у тој методи иницијално напунити одговарајући подаци. За пример
апликације pProstKalk, метода за догађај OnCreate би имала следећи садржај:
procedure TfProstKalk.FormCreate(Sender: TObject);
begin
eo1.Text:='0'; eo2.Text:='0';
end;
Вратити се у апликацију pProstKalk и уградити за сада ову програмску контролу.
Оваква програмска контрола не даје потпуну контролу у компонентама Edit, као на пример – шта
се догађа ако се тражи да се унесе бројчана вредност као податак, а унета је друга.
У поглављу 7 када се буде говорило о наредбама гранања, биће речи и примера како се спроводи
програмска контрола у компонентама Edit тако да се апликације извршавају коректно без грешака
и „пуцања”.
Delphi располаже додатним могућностима отклањања ових грешака, али како циљ овог уџбеника
није да се оформи професионални програмер, неће се спомињати.
Напомена: У наредним апликацијама у којима је иницијално попуњавање садржаја компоненти
Edit рађено са догађајем OnCreate неће се детаљно описивати у процедури за решавање задатка,
већ само оно најважније.
Пример: uRazmena, pRazmena, fRazmena
Креирати апликацију која размењује вредности две променљиве. Задатак је алгоритамски решен у
поглављу 5 „Изрази и наредбе”. Следи његова имплементација у Delphi окружењу.
Процедура за решавање задатка:

105
1. За наслов поставити компоненту StaticText и у својству Caption уписати RAZMENA
VREDNOSTI DVE PROMENLJIVE.
2. За улазне податке поставити две компоненте Edit, у својство Name унети еа и еb.
3. За опис компоненти еа и еb поставити две компоненте StaticText. у својство Caption унети
описе Vrednost za a и Vrednost za b.
4. За обраду података у апликацији поставити компоненту дугме Button. у својствo Name уписати
bRazmeni, а у својствo Caption уписати Razmeni.
5. Позиционирати се на дугме bRazmeni, активирати догађај OnClick и унети следећи програмски
код:
procedure TfRazmena.bRazmeniClick(Sender: TObject);
var a,b,pom:integer;
begin
a:=StrToInt(ea.Text); b:=StrToInt(eb.Text);
pom:=a; a:=b; b:=pom;
ea.Text:=IntToStr(a); eb.Text:=IntToStr(b);
end;
6. За непопуњеност улазних податак у компонентама Edit, за форму активирати догађај OnCreate,
и у костур методе унети програмски код: ea.Text:='0'; eb.Text:='0'; тестирати апликацију
pRazmena, при чему се добија резултат, као на слици 6.6.
Унос вредности После активирања дугмета за размену

Слика 6.6. – Приказ извршавања апликације pRazmena.


Пример: uCifre, pCifre, fCifre
Из датог троцифреног броја издвојити цифре стотина, десетица и јединица. Приказати вредности
цифара за стотине, десетице и јединице сваку посебно. формирати нови троцифрен број, тако што
ће цифре јединица и цифре стотина заменити места. Прикази новонастали троцифрен број.
креирати апликацију која решава овај задатак.
Улазни подаци: троцифрен број, променљива eBroj као компонента Edit.
Излазни подаци: вредности стотина, променљива lcs, десетица lcd, и јединица lcj као компоненте
Label. Нови троцифрен број, после замене места ezambroj као Edit компонента.
Обрада: Издвајање цифара се обавља комбинацијом функције div и mod. формирати нови број
тако што ће цифре јединица и стотина заменити места.
Процедура за решавање задатка:
1. За улазни податак троцифрени број и излазни нови број после замене места цифара поставити
две компоненте Edit. у својство Name унети еBroj и ezambroj.
2. За излазне подаке, цифру стотина, цифру десетица и цифру јединица, поставити три
компоненте Label. у својство Name редом унети: lcs, lcd и lcj. у својство Caption унети редом
описе: Cifra stotina:, Cifra desetica: и Cifra jedinica:

106
3. За наслов апликације и описе компоненти поставити три компоненте StaticText. у својство
Caption унети текст за наслов RASTAVLJANJE BROJA NA CIFRE, а као описе компоненти
Edit унети Zadat trocifren broj и Broj posle zamene mesta.
4. За обраду података поставити компоненту дугме Button. у својство Name унети bUradi a у
својство Caption опис URADI.
5. Позиционирати се на дугме bUradi, активирати догађај OnClick и унети следећи програмски
код:
procedure TfCifre.bUradiClick(Sender: TObject);
var x,y,s,d,j:integer;
begin
x:=StrToint(eBroj.Text);
s:=x div 100; d:=x div 10 mod 10; j:=x mod 10;
y:=j*100+d*10+s; lcs.Caption:=lcs.Caption+' '+IntToStr(s);
lcd.Caption:=lcd.Caption+' '+IntToStr(d); lcj.Caption:=lcj.Caption+' '+IntToStr(j);
ezambroj.Text:=IntToStr(y);
end;
6. За непопуњеност улазних података у компонентама Edit, за форму активирати догађај
OnCreate, и у костур методе унети програмски код:
broj.Text:='0';
На слици 6.7. је у табели приказан алгоритам методе догађаја OnClick за дугме bUradi и тест
апликације pCifre.
Алгоритам методе догађаја OnClick за дугме bUradi. Приказ тестирања апликације

pocetak
x
s:=x div 100
d:=x div 10 mod 10
j:=x mod 10

y:=j*100+d*10+s
s,d,j,y
kraj

Слика 6.7. – Приказ алгоритма методе и тестирања апликације pCifre


Методе у VCL компонентама су уграђене функције и процедуре које могу бити позване да би
компонента извршила одређену активност. методе су функционалне целине које обављају неку
обраду над компонентом. На пример, све визуелне компоненте имају методу под називом Show
која приказује компоненту, а такође и методу под називом Hide, која сакрива компоненту.

Методе у VCL компонентама

Методе у VCL компонентама су уграђене функције и процедуре које могу бити позване да би
компонента извршила одређену активност. Методе су функционалне целине које обављају неку
обраду над компонентом. На пример, све визуелне компоненте имају методу под називом Show
која приказује компоненту, а такође и методу под називом Hide, која сакрива компоненту.

107
Пример: Ако некој компоненти доделимо име Komponenta, тада би се могле писати методе за
приказ и скривање те компоненте на следећи начин:
Komponenta.Show;
{ obrada }
Komponenta.Hide;
Методе у VCL-у могу бити декларисане као јавне, заштићене и приватне. Јавним методама
корисници могу приступити преко компоненти. У овом примеру Show и Hide методе су јавне.
Заштићеним методама се не може приступити преко компоненти које их користе, али се може
приступити преко класа (компоненти), издвојених из компоненте. Наравно, приватним методама
се може приступити само из њихових класа. Неке методе узимају параметре и враћају вредности
док друге то не чине. У зависности од тога како је метода написана коришћењем записивача
компоненти, зависи да ли ће метода имати, односно да ли неће имати вредност коју враћа.
Методе се позивају када се прво наведе име компоненте иза кога се ставља знак тачка а после
тачке се наведе име методе.
На пример, метода constructor Create указује на стварање компоненте после чега се могу
користити њена својства (посебно својство Name). Да би нова компонента била употребљива
треба својству Parent додати вредност. Најчешће се наведе вредност Self.
Пример: Креирање дугмета Button.
bDugme:=TButton.Create (Self);
bDugme.Parent:=self;
Ево неких метода које ће се користити, са кратким описима њихове функционалности:
 procedure Free – склања се компонента и ослобађа меморија,
 procedure Show – текућа компонента постаје видљива, тако што се вредност својства Visible
постави на True,
 procedure Hide – компонента постаје невидљива постављањем вредности Visible на False,
 procedure SetBounds – одређује положај и величину компоненте,
 procedure Release – брише форму и ослобађа меморију коју она заузима,
 function ShowModal – да прикаже форму,
 procedure ScrollInView – потпуно или делимично доводи компоненту или прозор дете у видно
поље прозора,
 procedure Close – затвара форму или апликацију.

Креирање порука

За приказивање порука у визуелном графичком окружењу Delphi, користе се уграђене процедуре


ShowMessage и ShowMessagePos. Поруке су саставни део сваке апликације.
Наведене процедуре се користе за једноставне поруке и при позиву се приказује оквир са поруком
унутар кога се налази акционо дугме ОК. Дефиниције процедура за поруке су:
procedure ShowMessage(const Poruka:string);
procedure ShowMessagePos(const Poruka:string;X,Y:integer);
где су:
procedure – службена реч која означава да се ради о процедури,
ShowMessage, и ShowMessagePos – називи процедура,
const – службена реч која указује на константу,

108
Poruka – текст поруке типа стринг,
X,Y – позиција горњег левог угла оквира за поруку у односу на леви угао екрана,
string, integer – типови података.

Дугме BitBtn

Ово дугме се поставља на форму са палете компоненти Additional, а поступак постављања је исти
као код обичног дугмета. Користи се на исти начин као и обично дугме. Разлика је у томе што
поред натписа може да се обележи и неком сликом.
Својства су иста као код обичног дугмета и додатна су још:
 Kind – врста дугмета (bkAbort, bkAll, bkCancel, bkClose, bkCustom, bkHelp, bkIgnore,
bkNo, bkOk, bkRetry, bkYes),
 Glyph – сликa на дугмету типа TBitmap,
 NumGlyph – број слика по ширини садржај својства Glyph,
 Layout – поравнање слике и текста на дугмету.
Пример: uPoruka, pPoruka, fPoruka
Креирати апликацију која на форми има постављено дугме Button и дугме BitBtn. Прво дугме
програмирати тако да кад се притисне леви клик мишем издаје поруку 'Poruka je pozvana sa
ShowMessage', процедуром ShowMessage, а друго дугме поруку 'Poruka je pozvana sa
ShowMessagePos', процедуром ShowMessagePos.
Процедура за решавање задатка:
1. Позиције форме подесити на својству Top и уписати вердност 240, и у својству Left уписати
202. У својстви Hight одредити висину прозора где треба уписати вредност 272, а за ширину
прозора у својству Width уписати вредност 428.
2. За наслов поставити компоненту Label и у својство Caption уписати опис P O R U K E.
3. На форму поставити компоненту Button. У својству Name уписати за име bObicno, док за опис
дугмета у својству Caption уписати OBICNO DUGME.
4. На форму поставити компоненту BitBtn бирањем из картице Additional. У својство Name
уписати bBitAbort. Како ово дугме има и додатна подсвојства, бирати из својства Kind
подсвојство bkAbort, из својства Layout подсвојство blGluphLeft.
5. С војство Gluph има могућност да се бира дугме из понуђеног скупа дугмади, тако што се
двапут кликне у поље десно од својства TBitMap, после чега се појави прозор са иконицама за
дугмад, као едитор сличица које се могу изабрати. Дугме Load омогућава убацивање сличице
за дугме. Путањом (адреса) c:\Program Files\Common Files\Borland Shared\Images\Buttons се
долази до сличица за дугмад и за овај пример одабрати слику са именом SHOW. Потврдити са
OK да би се слика убацила на површину дугмета.
6. Позиционирати се на дугме bObicno, активирати догађај OnClick и унети програмски код:
procedure TfPoruka.bObicnoClick(Sender: TObject);
begin
ShowMessage('Poruka je pozvana sa ShowMessage');
end;
7. Позиционирати се на дугме bBitAbort, активирати догађај OnClick и унети програмски код:

109
procedure TfPoruka.bBitAbortClick(Sender: TObject);
begin
ShowMessagePos('Porukaje pozvana sa ShowMessagePos',300,150);
end;
Тестирати апликацију pPoruka, при чему се добија следећи приказ порука, као на слици 6.8.

Порука са процедуром ShowMessage Порука са процедуром ShowMessagePos

Слика 6.8. – Приказ извршавања апликације pPoruka.


Пример: uGeomet1, pGeomet1, fPravPira
Креирати апликацију која израчунава површину и обим правоугаоника, као и површину и
запремину правилне четворостране пирамиде. једноструки клик мишем на форму нека постави
описе који се односе на површину и обим правоугаоника, а двоструки клик мишем на форму нека
постави описе за површину и запремину правилне четворостране пирамиде.
Улазни подаци: Две компоненте Edit као странице правоугаоника(а и b). У случају
четворостране пирамиде то ће бити дужина основне ивице а и дужина бочне странице s.
Излазни подаци:Површина и обим правоугаоника, и површина и запремина четворостране
пирамиде. За њихов приказ користити компоненте Edit.
Обрада: Површина и обим правоугаоника се израчунава по формулама: P:=a*b и O:=2*a+2*b.
Површина и запремина правилне четворостране пирамиде се израчунава по формули P:=B+M
(површина базе + површина омотача), где се површина базе израчунава формулом B:=a2, а
површина омотача формулом M:=2*a*ha. Запремина правилне четворостране пирамиде се
израчунава по формули V:=B*ha/3. Да би се израчунале површина и запремина правилне
четворостране пирамиде треба израчунати њену висину по формули: hа:=sqrt(sqr(s)-sqr(а/2)).
Процедура за решавање задатка:
1. За улазнe и излазне податакe поставити четири компоненте Edit. компоненте Edit1 и Edit2
биће улазни подаци, а комоненте Edit3 и Edit4 излазни подаци.
2. За опис наслова и компоненти поставити пет компоненти Label. За наслов у својство Name
унети за име lNaslov а у својство Caption опис P I O PRAVOUGAONIKA I P I Z PIRAMIDE.
За остале описе који ће се користити за компоненте, у својство Caption унети исти опис за све
− VREDNOST.
3. Да би се променили наслов и описи компоненти које учествују у апликацији, а у складу са
одговарајућом акцијом дугмета које ће се покренути, програмирати два догађаја форме и то:
један догађај OnClick који ће поставити наслов и описе у складу са израчунавањем површине и
обима правоугаоника и дуги догађај OnDblClick који ће поставити наслов и описе у складу са
израчунавањем површине и запремине пирамиде.
4. За форму активирати догађај OnClick и уписати следећи програмски код:
procedure TfPravPira.FormClick(Sender: TObject);

110
begin
lNaslov.Caption:='POVRSINA I OBIM PRAVOUGAONIKA';
Label1.Caption:='Stranica pravougaonika a'; Label2.Caption:='Stranica pravougaonika b';
Label3.Caption:='Povrsina pravougaonika'; Label4.Caption:='Obim pravougaonika b';
end;
5. Затим за форму активирати догађај OnDblClick и уписати следећи програмски код:
procedure TfPravPira.FormDblClick(Sender: TObject);
begin
lNaslov.Caption:='POVRSINA I ZAPREMINA 4 STRANE PIRAMIDE';
Label1.Caption:='Osnovna ivica pramide'; Label2.Caption:='Bocna ivica piramide';
Label3.Caption:='Povrsina piramide'; Label4.Caption:='Zapremina piramide';
end;
6. За обраду података према постављеном задатку поставити три компоненте Button. у својство
Name унети редом: bPOP, bPZP и bIzlaz, а као њихове описе у својство Caption редом
уписати: P I O pravougaonika, P I Z piramide и IZLAZ.
7. Позиционирати се на дугме bPОP, активирати догађај OnClick и унети програмски код са
приказом алгоритамског решења методе:
Алгоритам методе Програмски код методе
догађаја OnClick за дугме bPop. догађаја OnClick за дугме bPop.
pocetak procedure TfPravPira.bPOPClick(Sender: TObject);
var a,b,P,O:real;
a,b begin
P:=a*b a:=strtofloat(edit1.Text);
b:=strtofloat(edit2.Text);
O:=2*a+2*b P:=a*b; O:=2*a+2*b;
O,P edit3.Text:=floattostr(P);
edit4.Text:=floattostr(O);
kraj end;
8. Позиционирати се на дугме bPZP, активирати догађај OnClick и унети програмски код са
приказом алгоритамског решења методе:
Алгоритам методе догађаја OnClick за дугме Програмски код методе догађаја OnClick за дугме
bPZP bPZP
procedure TfPravPira.bPZPClick(Sender: TObject);
pocetak
var i:integer; a,s,h,b,v,m,p:real;
a,s begin
b:=sqr(a) a:=strtofloat(edit1.Text);
s:=strtofloat(edit2.Text);
h:=sqrt(sqr(s)-sqr(а/2)) b:=sqr(a);
h:=sqrt(sqr(s)-sqr(а/2));
v:=b*h/3
v:=b*h/3;
m:=2*a*ha m:=2*a*ha;
p:=b+m p:=b+m;
v,p edit3.Text:=floattostr(p);
edit4.Text:=floattostr(v);
kraj end;

9. За непопуњеност улазних податак у компонентама Edit, за форму активирати догађај


OnCreate, и у костур методе унети програмски код:
Edit1.Text:='0'; Edit2.Text:='0';

111
Тестирати апликацију pGeomet1, при чему се добија резултат, као на слици 6.9.
Рачунање за правоугаоник Рачунање за пирамиду

Слика 6.9. – Приказ извршавања апликације pGeomet1

Платно за цртање (Canvas)

Доста компоненти има својство Canvas (платно) које представља област компоненте по којој се
може цртати или на којој се могу приказивати цртежи и слике. Објекат TCanvas није компонента,
не налази се на палети компоненти односно објеката који су уједно и компоненте. Под платном се
може подразумевати правоугаона мрежа квадратића који се називају пиксели. Положај пиксела на
платну се дефинише хоризонталном (X) и вертикалном (Y) координатом. Почетни положај платна
је горњи леви угао, када је пиксел на позицији (0,0), а завршни је доњи десни угао, када је пиксел
на позицији дефинисаној својствима (ClientWidth-1, ClientHeight-1). Својство ClientWidth
представља ширину, док својство ClientHeight представља висину клијентске области платна,
односно границе унутар којих се задају вредности за X и Y. Својство Canvas имају следеће
компоненте: форма (класа TForm), штампач (класа TPrinter), табела (класа TStringGrid),
компонента за слике Image. Подсвојства својства Canvas ових компоненти могу бити: перо за
цртање (Pen), четка за бојење (Brush), линија, правоугаоник, елипса и други графички облици.
Пиксел (pixel) je најмања честица и сматра се јединицом за цртање по платну, а дефинисана је
позицијама (X,Y). За бојење пиксела може се користити унапред дефинисан тип TColor чији су
елементи константе: clBlack, clGreen, clBlue итд; или њима одговарајући бројеви који могу
попримати целобројне вредности.
Покретањем поступка за пројектовање нове апликације, сви пиксели на форми се боје у унапред
дефинисану боју, и та боја се може мењати преко својства Color. Својство платна Canvas које се
користи за бојење је Pixels. када у апликацији треба да се ради с бојењем пиксела, односно платна,
може се декларисати променљива на један од следећих начина:
var ime_p:TColor; или
var ime_p:longint;
Примери: Бојење пиксела.
var bojapixel:TColor; {prvo deklarisana promenljiva bojapixel}
bojapixel:=Canvas.Pixels[50,100]:=clBlack; {crna boja se reprezentuje kao rec clBlack}
bojapixel:=Canvas.Pixels[ClientWidth-1,ClientHеight-1]:=clBlack;
или ако се променљива декларише као целобројна
var bojapixel:TColor; {prvo deklarisana promenljiva bojapixel}
bojapixel:= Canvas.Pixels[50,100]:=0; {crna boja se reprezentuje sa brojem 0} или
bojapixel:=Canvas.Pixels[ClientWidth-1,ClientHеight-1]:=0; {piksel u donjem desnom uglu}

112
Delphi за промену боје на располагању има уграђену функцију RGB. Она комбиновањем црвене
(Red), зелене (Green) и плаве (Blue) боје боји платно. функција има следећи формат записа:
function RGB(R:Byte,G:Byte,B:Byte):longint;
где су:
function – службена реч за функцију,
RGB – име уграђене функције,
R, G, B – листа параметара функције типа Byte, где слово R представља црвену, слово G зелену
и слово B плаву боју,
longint – резултат функције је типа longint.
У апликацијама за цртање слика, цртежа или шема на екрану, Delphi располаже са елементарним
графичким примитивима као што су: тачка, линија, елипса, правоугаоник и слично. Од њих се
образује слика на екрану. За цртање графичких примитива на платну су на располагању
одговарајуће методе својства Canvas: LineTo, Polyline, Rectangle, Polygon, Elipse, TextOut итд.

Цртање линије

Линије на платну (Canvas) се цртају помоћу подсвојства Pen које се назива „перо”.Може се рећи
да је то невидљиви објекат, који се налази на позицији последњег обојеног пиксела. У тренутку
креирања форме текућа позиција пера је 0,0. Позиција пера се мења када се црта на платну, и она
се може прочитати помоћу својства PenPos. Задавање текуће позиције пера се омогућава методом
MoveTo(X,Y) али без осветљавања. За извлачење линије од текуће задате позиције X,Y до неке
нове позиције X1,Y1 линије постиже се методом LineTo(X1,Y1), при чему тачка до које је
извучена линија постаје нова текућа тачка. Перо има подсвојства преко којих се може задати
вредност за дебљину линије (Pen.Width), или доделити боја линије (Pen.Color, нпр. clBlue), или
доделити стил линије (Pen.Style, нпр. psSolid, psDash, psDot итд).
Пример: uCrtanje, pCrtanje, fCrtanje
Креирати апликацију која помоћу линија црта на платну следеће:
а) разнострани троугао,
б) правоугли троугао,
в) квадрат и
г) коцку.
Процедура за решавање задатка:
1. За обраду података поставити пет компоненти Button. У својство Name уписати редом:
bTrougao, bTrougaop, bKvadrat и bKocka, a у својство Caption за опис дугмета редом
уписати: Trougao, Pravoug. trougao, Kvadrat и Kocka.
2. За решење под a), активирати догађај OnClick за дугме bTrougao и унети програмски код:
procedure TfCrtanje.bTrougaoClick(Sender: TObject);
begin
Refresh; Label1.Caption:='RAZNOSTRANI TROUGAO';
Canvas.MoveTo(100,300); Canvas.Pen.Color:=clRed; Canvas.Pen.Width:=3;
Canvas.LineTo(100,50); Canvas.Pen.Color:=clBlue; Canvas.Pen.Width:=3;
Canvas.LineTo(150,250); Canvas.Pen.Color:=clGreen; Canvas.Pen.Width:=3; Canvas.
LineTo(100,300);
end;

113
3. За решење под б), активирати догађај OnClick за дугме bTrougaop и унети програмски код:
procedure TfCrtanje.bTrougaopClick(Sender: TObject);
begin
Refresh; Label1.Caption:='PRAVOUGLI TROUGAO';
Canvas.MoveTo(100,100); Canvas.Pen.Color:=clRed; Canvas.Pen.Width:=3; Canvas.
LineTo(400,100); Canvas.Pen.Color:=clGreen; Canvas.Pen.Width:=3;
Canvas.LineTo(400,400); Canvas.Pen.Color:=clBlue; Canvas.Pen.Width:=3; Canvas.
LineTo(100,100);
end;
4. За решење под в), активирати догађај OnClick за дугме bKvadrat и унети програмски код:
procedure TfCrtanje.bKvadratClick(Sender: TObject);
begin
Refresh; Label1.Caption:='KVADRAT';
Canvas.MoveTo(100,100); Canvas.Pen.Color:=clGreen; Canvas.Pen.Width:=6; Canvas.
LineTo(400,100); Canvas.Pen.Color:=clRed; Canvas.Pen.Width:=6;
Canvas.LineTo(400,400); Canvas.Pen.Color:=clBlue; Canvas.Pen.Width:=6; Canvas.
LineTo(100,400); Canvas.Pen.Color:=clBlack; Canvas.Pen.Width:=6;
Canvas.LineTo(100,100);
end;
5. За решење под г), активирати догађај OnClick за дугме bKocka и унети програмски код:
procedure TfCrtanje.bKockaClick(Sender: TObject);
begin
Refresh; Label1.Caption:='KOCKA';
Canvas.Pen.Color:=clBlack; Canvas.Pen.Width:=4; Canvas.MoveTo(100,100);
Canvas.LineTo(400,100); Canvas.LineTo(400,400); Canvas.LineTo(100,400);
Canvas.LineTo(100,100); Canvas.LineTo(200,1); Canvas.LineTo(500,1);
Canvas.LineTo(500,300); Canvas.LineTo(400,400); Canvas.Pen.Color:=clGreen;
Canvas.Pen.Width:=4; Canvas.LineTo(500,1); Canvas.Pen.Color:=clRed;
Canvas.Pen.Width:=4; Canvas.LineTo(100,400); Canvas.Pen.Color:=clBlack; Canvas.
Pen.Width:=4; Canvas.LineTo(200,300); Canvas.LineTo(500,300); Canvas.LineTo(200,300);
Canvas.LineTo(200,1);
end;
Тестирати апликацију pCrtanje, при чему се добија резултат, као на слици 6.10.

Решење под а) Решење под б)

Решење под в) Решење под г)

114
Слика 6.10. – Приказ извршавања апликације pCrtanje

Цртање простих фигура

На платну (Canvas) могу се цртати следеће просте фигуре: правоугаоник, правоугаоник са


овалним угловима, елипса која обухвата и круг, кружни исечак, лукови и други. Поред простих
фигура омогућено је и цртање многоуглова и изломљених линија.
За сваку од фигура постоји метода за цртање, па ћемо их овде навести:
 за правоугаонике – Canvas.Rectangle(T1,T2,T3,T4);. Параметри T1 и T2 представљају горњи
леви угао, а T3 и T4 доњи десни;
 за правоугаонике са облим угловима – Canvas.RoundRect(x1,y1,x2,y2,x3,y3);. Параметри x1,
y1, x2, y2 представљају положај темена дијагонале правоугаоника, а параметри x3, y3 димензије
елипсе чија се ¼ користи за исцртавање заобљеног угла;
 за текст унутар правоугаоника – Canvas.TextRect(ime_p,x,y,'TEKST');. где је ime_p име
променљиве која је декларисана као тип TRect. Параметри x,y означавају позицију где текст
почиње, а затим следи више знакова под апострофима;
 за елипсе и кругове – Canvas.Elipse(T1,T2,T3,T4);. Параметри T1, T2, T3 и T4 су дефинисана
темена дијагонале правоугаоника унутар кога се исцртава елипса или круг;
 за лук – Canvas.Arc(x1,y1,x2,y2,x3,y3,x4,y4);. Параметри x1,y1,x2,y2,x3,y3,x4,y4 дефинишу
елипсу односно крајеве дијагонале правоугаоника којим се задаје елипса, а чији део је лук;
 за исечак елипсе или кружнице – Canvas.Pie (x1,y1,x2,y2,x3,y3,x4,y4);. Параметри
x1,y1,x2,y2,x3,y3,x4,y4 дефинишу елипсу односно крајеве дијагонале правоугаоника којим се
задаје елипса, а чији део је исечак;
 за многоуглове – Canvas.Polygon([Point(x1,y1), Point(x2,y2),…,Point(xn,yn)]);. Параметри
Point(x1,y1), Point(x2,y2),…,Point(xn,yn) дефинишу почетне и завршне позиције сваке линије
(дужи) многоугла и припадају типу TPoint дефинисан као;
TPoint = record
X:Integer;
Y:Integer;
end;
 за изломљене линије – Canvas.PolyLine([Point(x1,y1), Point(x2,y2),…,Point(xn,yn)]);. Параметри
Point(x1,y1), Point(x2,y2),…,Point(xn,yn) дефинишу почетне и завршне позиције сваке линије
(дужи);
 за убацивање текста – Canvas.TextOut(x,y,Tekst);. Параметри x,y дефинишу почетну позицију
исписивања текста (горњи леви угао) док параметар Tekst исписује текст који се зада под
апострофима.
Када се црта и бојом попуњава затворени простор, својства за оловку (Pen) и четку (Brush) су
Color за боју а Width за дебљину линије.

115
Пример: uFigure, pFigure, fFigure
Креирати апликацију која на платну црта графичке фигуре, изломљене линије и убацује текст на
платно и то на следећи начин:
а) црта заставу помоћу правоугаоника и убацује звезду изломљеним линијама,
б) црта заобљен правоугаоник и у њему помоћу изломљених линија други правоугаоник,
в) црта елипсу, а затим два круга, један унутар елипсе а други који је сече,
г) црта многоугао, а унутар њега изломљеним линијама правоугаоник,
д) црта правоугаоник за текст, а затим испод њега приказује само текст.
Процедура за решавање задатка:
1. За наслов поставити компоненту Label. У својство Caption уписати CRTANJE FIGURA.
2. За обраду података поставити пет компоненти Button. У својство Name редом уписати:
bZastava, bPrvZaob, bElipsе, bPoligon и bTekst, a у својство Caption за опис дугмета редом
уписати: Zastava – pravougaonik, Zaobljen pravougaonik, Elipse, Mnogougao и Tekst.
3. За решење под a), активирати догађај OnClick за дугме bZastava и унети програмски код:
procedure TfFigure.bZastavaClick(Sender: TObject);
begin
Refresh; Canvas.Pen.Color:=clBlue; Canvas.Pen.Width:=1;
Canvas.Brush.Color:=clRed; Canvas.Rectangle(10,10,150,50);
Canvas.Brush.Color:=clBlue; Canvas.Rectangle(10,50,150,90);
Canvas.Brush.Color:=clWhite; Canvas.Rectangle(10,90,150,130);
Canvas.Pen.Color := clRed; Canvas.Pen.Width:=3;
Canvas.PolyLine([Point(80,45),Point(60,95),Point(110,65),Point(50, 65),Point(100,95),Point(80,45)]);
end;
4. За решење под б), активирати догађај OnClick за дугме bPrvZaob и унети програмски код:
procedure TfFigure.bPrvZaobClick(Sender: TObject);
begin
Refresh;
Canvas.Pen.Color:=clBlue; Canvas.Pen.Width:=6;
Canvas.Brush.Color:=clRed; Canvas.RoundRect(10,10,280,180,30,30);
Canvas.Pen.Color:=clYellow; Canvas.Pen.Width:=6;
Canvas.Polygon([Point(110, 160), Point(110, 100),Point(190, 100),Point(190, 160)]);
end;
5. За решење под в), активирати догађај OnClick за дугме bElipsе и унети програмски код:
procedure TfFigure.bElipseClick(Sender: TObject);
begin
Refresh;
Canvas.Pen.Color:=clBlue; Canvas.Pen.Width:=6;
Canvas.Brush.Color:=clLime; Canvas.Ellipse(10,10,300,120);
Canvas.Pen.Color:=clWhite; Canvas.Pen.Width:=6;
Canvas.Brush.Color:=clRed; Canvas.Ellipse(40,40,100,100);
Canvas.Pen.Color:=clGreen; Canvas.Pen.Width:=6;
Canvas.Brush.Color:=clSkyBlue; Canvas.Ellipse(80,80,200,200);
end;
6. За решење под г), активирати догађај OnClick за дугме bPoligon и унети програмски код:
procedure TfFigure.bPoligonClick(Sender: TObject);
begin

116
Refresh;
Canvas.Brush.Color:= clTeal; Canvas.Pen.Width:=10; Canvas.Pen.Color:=clBlue;
Canvas.Polygon([Point(150, 20), Point(260, 100),Point(220, 220), Point(80, 220),Point(40, 100)]);
Canvas.Pen.Width:=10; Canvas.Pen.Color:=clWhite;
Canvas.Polygon([Point(110, 160), Point(110, 100),Point(190, 100),Point(190, 160)]);
end;
7. За решење под д), активирати догађај OnClick за дугме bTekst и унети програмски код:
procedure TfFigure.bTekstClick(Sender: TObject);
var Pravoug:TRect;
begin
Refresh;
Canvas.Brush.Color := clYellow; Canvas.Font.Size:=24;
Canvas.Font.Color:=clBlue; Pravoug := Rect(40,40,410,100);
fFigure.Canvas.TextRect(Pravoug,50,50,'GIMNAZIJA BEOGRAD');
fFigure.Canvas.Brush.Color := clBlack; fFigure.Canvas.FrameRect(Pravoug);
Canvas.TextOut(120,120, 'Marko Petrovic');
end;
Тестирати апликацију pFigure, при чему би требало да се добије резултат приказан на слици 6.11.

Решење под а) Решење под б) Решење под в) Решење под г) Решење под д)

Слика 6.11. – Приказ извршавања апликације pFigure

Компоненте за цртање основних облика(Shape)

Помоћу компоненте Shape која се налази на картици Additional могу се на форми приказати
основни облици као што су квадрат, правоугаоник, круг и елипса. Димензије облика се могу
мењати, а могу се бојити линије и позадина различитим бојама.
Најједноставнији графички облик је правоугаоник. већ је правоугаоник цртан помоћу објекта
TCanvas на форми, овде ће се показати како се то ради са компонентом TShape. важнија својства
компоненте Shape су приказана у табели која следи:

Назив својства Опис


својство садржи објекат типа TBrush којим се дефинише боја за
Brush
попуњавање облика и начин попуне.
својство садржи објекат типа TPen којим се дефинише боја и
Pen
дебљина оквира облика.

117
Представља врсту облика којим се исцртава: елипса (stElipse),
правоугаоник (stRectangle), правоугаоник са заобљеним ививцама
Shape (stRoundRect), квадрат са заобљеним ивицама (stRoundSquare),
квадрат (stSquare) и круг (stCircle).
Својства компоненте Shape за величину су: Left, Top, Height и Width. координате су дате у
односу на форму а не на цео екран. Постављањем компоненте на форму она добије дефинисане
димензије и својства која се могу мењати развлачењем мишем или помоћу опција Object
Inspectorа.
Пример: uOblici, pOblici
Креирати апликацију за цртање облика које подржава компонента Shape на следећи начин:
а) да се омогуће цртања свих облика,
б) да се обоји позадина облика,
в) да се обоји оквир линија.
Процедура за решавање задатка:
1. На форму поставити четири компоненте Edit. у својство Name уписати имена редом: el, et, es и
ev.
2. За описе компоненти Edit поставити четири компоненте StaticText. у својство Caption уписати
редом описе: Levo, Gore, Sirina и Visina.
3. За цртање разних облика, бојење позадине, бојење оквира и излазак из програма на форму
поставити девет дугмади (компоненте Button). у својство Name уписати редом имена: bEl, bPr,
bPrz, bKvz, bKv, bKr, bBp, bBok и bOff, а у својству Caption уписати редом описе: ELIPSA,
PRAVOUGAONIK, ZAOB.PRAV, ZAOB.KVAD, KVADRAT, KRUG, BOJA POZADINE,
BOJA OKVIRA и OFF.
4. Да би се исцртавали основни облици, на форму поставити компоненту Shape. са картице
Additional изабрати компоненту и поставити је на форму.
5. За мењање боја на форми поставити компоненту ColorDialog. са картице Dialogs изабрати
компоненту и поставити је на форму (картица Dialogs ће се разматрати у поглављу 8).
6. Да се црта елипса, активирати догађај OnClick за дугме bEl и унети програмски код:
procedure TForm1.bElClick(Sender: TObject);
begin
Shape1.Shape:=stEllipse;
Shape1.Left:=StrToInt(el.Text); Shape1.Top:=StrToInt(et.Text);
Shape1.Width:=StrToInt(es.Text); Shape1.Height:=StrToInt(ev.Text);
end;
8. Да се црта правоугаоник, активирати догађај OnClick за дугме bPr и унети програмски код:
procedure TForm1.bPrClick(Sender: TObject);
begin
Shape1.Shape:=stRectangle;
Shape1.Left:=StrToInt(el.Text); Shape1.Top:=StrToInt(et.Text);
Shape1.Width:=StrToInt(es.Text); Shape1.Height:=StrToInt(ev.Text);
end;
9. Да се црта заобљени правоугаоник, активирати догађај OnClick за дугме bPrz и унети
програмски код:
procedure TForm1.bPrzClick(Sender: TObject);

118
begin
Shape1.Shape:=stRoundRect;
Shape1.Left:=StrToInt(el.Text); Shape1.Top:=StrToInt(et.Text);
Shape1.Width:=StrToInt(es.Text); Shape1.Height:=StrToInt(ev.Text);
end;
10.Да се црта заобљени квадрат, активирати догађај OnClick за дугме bKvz и унети програмски
код:
procedure TForm1.bKvzClick(Sender: TObject);
begin
Shape1.Shape:=stRoundSquare;
Shape1.Left:=StrToInt(el.Text); Shape1.Top:=StrToInt(et.Text);
Shape1.Width:=StrToInt(es.Text); Shape1.Height:=StrToInt(ev.Text);
end;
11.Да се црта квадрат, активирати догађај OnClick за дугме bKv и унети програмски код:
procedure TForm1.bKvClick(Sender: TObject);
begin
Shape1.Shape:=stSquare;
Shape1.Left:=StrToInt(el.Text); Shape1.Top:=StrToInt(et.Text);
Shape1.Width:=StrToInt(es.Text); Shape1.Height:=StrToInt(ev.Text);
end;
12. Да се црта круг, активирати догађај OnClick за дугме bKr и унети програмски код:
procedure TForm1.bKrClick(Sender: TObject);
begin
Shape1.Shape:=stCircle;
Shape1.Left:=StrToInt(el.Text); Shape1.Top:=StrToInt(et.Text);
Shape1.Width:=StrToInt(es.Text); Shape1.Height:=StrToInt(ev.Text);
end;
13. Да се обоји позадина, активирати догађај OnClick за дугме bBp и унети програмски код:
procedure TForm1.bBpClick(Sender: TObject);
begin
if ColorDialog1.Execute
then Shape1.Brush.Color:=ColorDialog1.Color;
end;
14. Да се боји оквир, активирати догађај OnClick за дугме bBok и унети програмски код:
procedure TForm1.bBokClick(Sender: TObject);
begin
if ColorDialog1.Execute
then
begin
Shape1.Pen.Color:=ColorDialog1.Color; Shape1.Pen.Width:=6;
end;
end;
15. За непопуњеност улазних податак у компонентама Edit, за форму активирати догађај
OnCreate, и у костур методе унети програмски код:
el.Text:='0'; et.Text:='0'; es.Text:='0'; ev.Text:='0';

119
Тестирати апликацију pOblici, при чему се добија резултат, као на слици 6.12.

Елипса са задатим параметрима Заобљен правоугаоник

Слика 6.12. – Приказ извршавања апликације pOblici

Контролна питања:
1. Које фазе пролази пројекат за решавање конкретнтог задатка (апликације)?
2. Шта је изворни а шта извршни облик програма?
3. Како изгледа палета алата са које се постављају компоненте (контроле)?
4. Какав је поступак за постављање компоненти на форму?
5. Које компоненте се налазе на стандардној картици Standard?
6. Шта значи када кажемо да је компонента у жижи?
7. Шта су методе компоненти и која је њихова улога?
8. Навести најчешће коришћене методе компоненти?
9. Како се креирају поруке у апликацији?
10. Како се спречава пуцање програма ако улазна поља нису попуњена?
11. Које грешке могу да се појаве у програму и како се отклањају?
12. Шта представља платно за цртање (Canvas)?
13. Које компоненте имају својство Canvas?
14. Која су подсвојства платна за цртање?
15. Које се методе користе за цртање на платну?
16. Шта се може цртати на платну и којим методама?
17. Која се компонентa користи за цртање основних графичких облика?
18. Која су најчешће коришћена својства компоненте Shape?

120
7. НАРЕДБЕ ГРАНАЊА

Разграната програмска структура подразумева да се у програму наилази на испитивање задатог


услова, па на основу тога да ли је услов испуњен или не, програм може али и не мора да настави са
даљим радом. тако у програму долази до тзв. гранања па се отуда и назива разграната
програмска структура. у ту сврху програмски језик ObjectPascal има на располагању две
наредбе IF и CASE. како у наредбама постоји услов, ове наредбе се још називају и наредбе
условног преласка.

НАРЕДБА УСЛОВНОГ ПРЕЛАСКА

У решавању задатка алгоритмом управљачка структура селекција говори да у случају када је неки
услов испуњен (или није испуњен), може се покренути једна акција или више акција. у Delphi
окружењу када се пишу наредбе у програму, селекцију замењује наредба if а појам акција се
замењује са наредба.
У следећој табели су приказани основни облици наредбе if са одговарајућим графичким приказом
у алгоритму за случај када се на основу постављеног услова може извршити само једна наредба:

I облик у I облик у II облик у II облик у


програму алгоритаму програму алгоритаму
if (U) if (U)

ne
then N; da then N1
N2
U

U
N else N2;
ne

da
N1

где су:
if, then, else – резервисане речи,
U – израз (услов) који се испитује, а резултат је логичка истина (true − da) или лаж (false − ne) и
N, N1, N2 – наредбе.
Компонована наредба или такозвани „begin blok” формира се када постоје две и више наредби
које се извршавају као једна група. Такве наредбе сe постављају између службених речи begin и
end. Наредба if може укључити у своје гране (then или и then и else) компоноване наредбе што
приказује III и IV облик if наредбе:

121
III облику IV облик у
III облик у алгоритму IV облик у алгоритму
програму програму da
if (U) if (U) U
then then
da ne
begin begin
N1; U N11; N21 N11
N2; N1 N12;
.... ne ..... N22 N12
Nn; N1n
N2
end; end ... ...
else
... N2n N1n
begin
N21;
Nn N22;
...
N2n
end;
где су:
if, then, else – резервисане речи,
U – израз (услов) који се испитује, а резултат је логичка истина (true − da) или лаж (false − ne),
N1, N2, …, N2 – наредбе у компонованој наредби, почиње са begin а завршава са end,
N11, N12, …, N1n – наредбе у компонованој наредби, почиње са begin а завршава са end,
N21, N22, …, N2n – наредбе у компонованој наредби, почиње са begin а завршава са end.
Напомена: Постоји и облик наредбе где грана then (da) нема никакву наредбу, док грана else (ne)
има наредбу, што нема посебног смисла јер се услов може поставити обрнуто од изворног услова
па се свести на грану then да је услов испуњен.
Први основни облик је облик if-then који функционише тако што се испитује услов U. Када је
услов испуњен (логичка истина − тачно), у програму то представља грану then, извршава се
наредба означена са N, и програм наставља даље са радом са наредбом која следи после наредбе if.
Када услов није испуњен (логичка неистина − нетачно), нема никакве нередбе у овој грани, не
пише се грана else, не извршава се наредба N, и програм наставља даље рад са наредбом која следи
после наредбе if.
Други основни облик, је облик if-then-else који функционише тако што се испитује услов U. Када
је услов испуњен (логичка истина − тачно), у програму то представља грану then, извршава се
наредба означена са N1, и програм наставља даље рад са наредбом која следи после наредбе if.
Када услов није испуњен (логичка неистина − нетачно), у програму то представља грану else,
извршава се наредба означена са N2, и програм наставља даље рад са наредбом која следи после
наредбе if.
Трећи основни облик је облик if-then који функционише тако што се испитује услов U. Када је
услов испуњен (логичка истина − тачно), у програму то представља грану then, извршавају се
наредбе редом једна за другом означене са N1, N2,…, Nn и програм наставља даље рад са наредбом
која следи после наредбе if. Када услов није испуњен (логичка неистина − нетачно), нема никакве
нередбе у овој грани, не пише се грана else, не извршавају се наредбе N1, N2,…, Nn, и програм
наставља даље рад са наредбом која следи после наредбе if.
Четврти основни облик је облик if-then који функционише тако што се испитује услов U. Када је
услов испуњен (логичка истина − тачно), у програму то представља грану then, извршавају се
наредбе редом једна за другом означене са N11, N12,…, N1n, и програм наставља даље рад са наредбом

122
која следи после наредбе if. Када услов није испуњен (логичка неистина − нетачно), у програму то
представља грану else, извршавају се наредбе редом једна за другом означене са N21, N22,…, N2n, и
програм наставља даље рад са наредбом која следи после наредбе if.
У оквиру наредбе if односно у било којој грани, може се наћи друга или више других if наредби.
Тако постављање if наредби се назива угнежђавање. При угнежђавању треба водити рачуна о
раду преводиоца који када наиђе на резервисану реч else као део гране наредбе if ако услов није
испуњен враћа се уназад (нагоре) до прве претходне резервисане речи if и тако је затвара. Ако су
све наредбе тако упарене, неће правити проблеме у раду. Међутим, ако су неке од наредби
непотпуне, може доћи до збуњивања и настанка алгоритамске грешке, па се тиме могу добити
неочекивани и нетачни резултати обраде. Није лако пратити више од три угнежђене наредбе if.
Зато се предлаже да се угнежђавање обавља тако што се у грани then обавезно пише као
компонована наредба са begin и end чак и ако се извршава само једна наредба (варијанта 2). у
следећој табели су приказани примери угнежђавања:

Варијанта 1 Варијанта 2 Варијанта 3 Варијанта 4 Варијанта 5

if (U1) if (U1) if (U1) if (U1) if (U1)


then then then N1 then then
if (U2) begin else if (U2) else
then N1 if (U2) if (U2) then if (U2)
else N2; then N1; then N2; if (U3) then
N3; end N3; then N; else
else N2; if (U3)
N3; then
else
N;
Угнежђавање у варијанти 1, ради тако да ако услов U2 није испуњен извршила би се наредба N2
иза резервисане речи else. Међутим, у случају неиспуњености првог услова U1 извршила би се
прва наредба испод резервисане речи else, што би представљало логичку грешку која би произвела
погрешне резултате обраде. Да би се избегло да таква грешка настане, нуди се варијанта 2, и у
случају да услов U1 није испуњен, извршава се наредба N2. У варијанти 3 где се непотпуна if
наредба налази иза резервисане речи else, није неопходно постављати компоновану наредбу (begin
– naredbе − end;) јер је тада потпуно јасно која се наредба извршава у случају да неки од услова
није испуњен.
Пример: uBroj, pBroj, fBroj
Учитава се само један цео број. Ако је број који се учитава једнак броју 5 исписати поруку на
екрану ‘Pogodio si broj’, a затим после условне наредбе исписати поруку’Ucitan broj je:’ и
вредност учитаног броја.

123
Алгоритамско решење овог примера задатка приказано је следећим дијаграмом тока:

Процедура за решавање задатка:


1. За улазни податак, број који се учитава, користити компоненту LabeledEdit. Са картице
Additional изабрати компоненту LabeledEdit, поставити је на форму и променити својство
Name у leBroj, и у садржај својства Text уписати 0. Бирати својство EditLabel, па подсвојство
Caption, и за опис компоненте уписати Uneti broj.
2. За обраду података поставити компоненту Button. У својство Name уписати за име bBroj5 а у
својство Caption уписати опис за дугме POGODI.
3. Поставити две компоненте Label на форму, једну за наслов, којој треба у својству Caption
уписати Pogodite da li je unet broj 5, и другу за поруку, и у својству Name доделити јој назив
lPoruka, а у својство Caption уписати Poruka.
4. Позиционирати се на дугме bBroj5, активирати догађај OnClick и уписати програмски код:
procedure TfBroj.bBroj5Click(Sender: TObject);
begin
if StrToInt(leBroj.Text)= 5
then ShowMessage('Pogodio si broj');
lPoruka.Caption:='Ucitan broj je: '+' '+leBroj.Text;
end;
Тестирање апликације pBroj даје резултате као на слици 7.1.

Када се унесе број 5 Када се не унесе број 5

Слика 7.1. – Приказ тестирања апликације pBroj

124
Коришћење својства Visible

Својство Visible, може се превести на наш језик речју видљиво. Ако се погледа ово својство, види
се да је типа Boolean, што значи има две вредности True (истина) видљиво, и False (неистина)
није видљиво. Својство Visible за компоненте се користи у циљу контроле да ли се та компонента
сакрива или се приказује. Следећи пример ће приказати како се може искористити ово својство у
програмирању.
Пример: uShowHide, pShowHide, fProba
На форму поставити компоненту LabeledEdit и једно обично дугме Button. Користећи својство за
компоненте Visible програмирати догађај OnClick за постављено дугме, тако да се притиском на
компоненту Button сакрива компонента LabeledEdit, а када се поново притисне на то дугме,
приказује се иста компонента. Креирати пројекат (апликацију) за решавање постављеног задатка.
Процедура за решавање задатка:
1. На форму поставити компоненту LabeledEdit. У својство Name уписати име lеProba, а у
својство Text уписати PODATAK. Бирати својство EditLabel, па подсвојство Caption, и за
опис компоненте уписати Prikazi/Sakri.
2. Поставити компоненту Button. У својство Name уписати име bProba, а описати је у својству
Caption са именом PROBA.
3. За скривање компоненте LabeledEdit, односно поновног приказивања означити дугме bProba,
активирати догађај OnClick, и унети следећи програмски код:
procedure TfProba.bProbaClick(Sender: TObject);
begin
if leProba.Visible
then
begin
leProba.Hide; ShowMessage('SAD GA NE VIDIS');
end
else
begin
leProba.Show; ShowMessage('SAD GA VIDIS');
end;
Тестирање апликације pShowHide даје резултате као на слици 7.2.

После првог клика на После другог клика на


дугме дугме

Слика 7.2. – Приказ тестирања апликације pShowHide

125
Параметар Sender

Ако се погледају процедуре за обраду догађаја (методе), приметиће се да све имају у заградама
параметар Sender. Кад год се активира догађај повезан са неком процедуром за његову обраду та
процедура добија информацију која потиче од објекта који је изазвао догађај. Ову информацију
предаје параметар Sender. Да би било јасније, када се позове процедура за обраду догађаја,
параметар Sender показује на објекат који је изазвао догађај. Параметар Sender је типа TObject
(предак свих класа).
Ако се погледа пример апликације pShowHide у наслову заглавља процедуре
procedure TfProba.bProbaClick(Sender: TObject);
види се да метода bProbaClick користи показивач на класу TObject под називом Sender.
Све класне променљиве у Delphi-ју су показивачи. Сваки управљач догађајем ће имати бар један
параметар Sender.
Шта представља параметар Sender? Управљач догађајем садржи све информације потребне за
његову обраду. Sender je показивач на компоненту која шаље поруку управљачу порука. Sender
постоји како би омогућио постављање више компоненти које могу користити исти управљач
догађајем. У примеру uPrikaziSakri, pPrikaziSakri, fProba дугме bProba је пошиљалац, где
параметар Sender упућује на исти догађај који је користило већ постојеће дугме bProba.
У зависности од догађаја којим се управља, управљач догађајем може имати један, или више
параметара.
Оператор is проверава да ли је објекат који је изазвао догађај специфицираног типа тако што
резултат Sender is TButton даје True ако је операнд са леве стране is објекат типа који је означен
десним операндом, у супротном је False.
Пример примене параметра Sender биће претходна апликација pPrikaziSakri, а примениће се
следећи поступак њене измене:
1. Изабрати дугме bProba и у својству Name уписати Show а у својство Caption уписати Prikazi.
2. Додати ново дугме, компоненту дугме Button, и у својство Name уписати Hide а у својство
Caption уписати Sakri.
3. Кликнути на дугме Show и активирати догађај OnClick. Аутоматски се у пољу за име налази
ShowClick. Сада га промените у првобитно име које се додељује генерички Button1Click (може
се доделити и име по избору и он ће представљати иницијални управљач догађајем).
4. К ликнути на дугме Hide па на догађај OnClick, где се у пољу поред види падајућа листа,
кликнути на стрелицу и бирати име Button1Click (биће само то име понуђено). Двапут
кликнути мишем на вредност у овом пољу односно на Button1Click, после чега се приказује
програмски код кога треба изменити тако да се наредба if leProba.Visible замени наредбом if
Sender=Hide у којој се користи параметар Sender, те програмски код после измене има следећи
садржај:
procedure TfProba.Button1Click(Sender: TObject);
begin
// if leProba.Visible
if Sender=Hide
then
begin

126
leProba.Hide; ShowMessage('SAD GA NE VIDIS');
end
else
begin
leProba.Show; ShowMessage('SAD GA VIDIS');
end;
end;
Тестирање промењене апликације pShowHide даје резултате као на слици 7.3.

Када се притисне дугме Prikazi Када се притисне дугме Sakri

Слика 7.3. – Приказ тестирања апликације pShowHide после промене


Претходним поступком је креиран метод за управљање догађајем OnClick коме је додељено име
Button1Click и кога користе оба постављена дугмета Button (и дугме Show и дугме Hide). При
томе је коришћен параметар Sender да одреди које дугме шаље догађај OnClick, како би се
приказала односно сакрила компонента Edit под именом leProba. Очигледно је да се то могло
постићи коришћењем одвојених управљача, односно одвојеним програмским кодом за свако дугме
Button, али је овако краћи програмски код.
Иначе циљ је био да се илуструје примена параметра Sender као показивача. у наведеном примеру,
упоређивала се променљива Sender са својством Name дугмета Button (за прво дугме Show и
друго дугме Hide). како су оба показивачи, поређење се врши да се утврди да ли обе променљиве
садрже исту адресу. корак 4 у претходном примеру указује на чињеницу да се после креирања
управљача догађајем OnClick за одређену компоненту могу прикачити на исти управљач било које
компоненте на форми. тако се на овај начин исти управљач догађајем може користити за више
компоненти.
Пример: uМaxtri, pMaxtri, fNajveci
Креирати апликацију која од задата три броја проналази и приказује највећи. За унос улазних
података и приказ резултата у виду највећег броја од њих користити компоненте Edit.
Улазни подаци: Три броја чије се вредности уносе преко компоненти Edit (променљиве a, b, c).
Обрада: Променљивама a, b, c додељене су вредност из компоненти Edit. Дати су дијаграми тока.
Излазни подаци: Највећи број (променљива max).
Процедура за решавање задатка:
1. За наслов на форми поставити компоненту Label и у својству Caption поставити текст UNETI
TRI BROJA I NACI NAJVECI OD NJIH.
2. За улазне и излазне податке поставити четири компоненте Edit, и у својству Name уписати
редом њихова имена: еа, eb, ec и emax.
3. За опис ових компоненти Edit поставити четири компоненте StaticText и у својствима Caption
унети описе редом: Broj 1, Broj 2, Broj 3 и MAX.

127
4. За проналажење највеће вредности од задата три броја поставити на форму компоненту дугме
Button. У својству Name уписати bNajveci, а у својству Caption уписати опис NAJVECI.
5. За програмирање обраде према постављеном задатку, маркирати дугме bNajveci, активирати
догађај OnClick и унети програмски код:
procedure TfNajveci.bNajveciClick(Sender: TObject);
var a,b,c,max:Integer;
begin
a:=StrToInt(ea.Text); b:=StrToInt(eb.Text); c:=StrToInt(ec.Text);
max:=a;
if max<b
then max:=b;
if max<c
then max:=c;
emax.Text:=IntToStr(max);
end;
Тестирањем примера апликације pMaxtri са унетим подацима, приказује се слика 7.6.

Слика 7.6. – Приказ резултата тестирања апликације pMaxtri


Приказана су два дијаграма тока као решења за методу догађаја OnClick активираног за дугме
bNajveci.
Прво решење pMaxtri Друго решење uМaxtri, pMaxtri
pocetak pocetak
a,b,c a,b,c

(a>b) and (a>c) max:=a


max:=a (max<b)
max:=b
(b>a) and (b>c)
max:=b (max<c)
max:=c
(c>a) and (c>b)
max:=c max

max
kraj

kraj

128
Пример: uPrimer2, pPrimer2, fRacun
У поглављу 1 Основни принципи програмирања, решаван је пример под називом Пример2 у
псеудокоду графичким алгоритмом. Креирати апликацију која решава постављени задатак. За
улазне и излазне податке користити компоненте Edit. Постојећем задатку додати контролу
коректности улазних података за цену, количину, попуст и уплату. Омогућити порукe „Unesi
cenu”, „Unesi kolicinu”, „Unesi popust” и „Unesi uplatu” које се појављују када се показивач миша
позиционира на поља за улазне податке (својство Hint).
Процедура за решавање задатка:
1. Поставити осам компоненти Edit од којих ће четири бити за унос улазних података, док ће
остале четири бити излазни подаци. У својству Name за поља Edit унети редом имена: eCena,
eKol, ePop, eUplata, eUk, eIp, eUkpop и eIsplata.
2. За опис наслова и осталих компоненти поставити девет компоненти StaticText. За једну
компоненту у својство Caption као наслов уписати Prodavnica:PRODAVNICA1,
kasirka:KASIRKA 1, а за остале компоненте уписати описе следећим редом: Cena robe,
Kolicina robe, Popust, Uplaceno, Ukupna cena, Iznos popusta, Ukupno sa popustom и Kusur.
3. За бојење површине форме у светлу нијансу зелене боје и поља за унос података по жељи, на
форми активирати догађај OnCreatе и унети следећи програмски код:
procedure TfRacun.FormCreate(Sender: TObject);
begin
fRacun.Color:=$00C0FF82; eCena.Color:=$00FF8000;
eKol.Color:=$00FF8000; ePop.Color:=$00FF8000;
ePop.Color:=$00FF8000; eUplata.Color:=$00FF8000;
eUk.Color:=$0040880FF; eIp.Color:=$0040880FF;
eUkpop.Color:=$0040880FF; eIsplata.Color:=clRed;
end;
4. За компоненте Edit треба исписати информативне поруке (Hint). Изабрати компоненту eCena и
из Object Inspector-а бирати картицу Properties, затим својство Hint и у празно поље десно од
својства унети „Unesi cenu”, у поље eKol унети „Unesi kolicinu”,у поље ePop унети „Unesi
popust” и у поље eUplata унети „Unesi uplatu”. Затим за свако од ових поља пронаћи испод њега
својство ShowHint и поставити га на True. У извршавању апликације, ове поруке појавиће се
када се показивач миша позиционира на њих.
5. За обраду поставити компоненту Button. У својству Name за име уписати bRacun, а у својству
Caption уписати RACUN. На овом дугмету, активирати догађај OnClick и унети следећи
програмски код:
procedure TfRacun.bRacunClick(Sender: TObject);
var pop:real;
begin
pop:=StrToFloat(ePop.Text)/100;
eUk.Text:=FloatToStr(StrToFloat(eCena.Text)*StrToFloat(eKol.Text));
eUkpop.Text:= eUk.Text;
if StrToFloat(eUk.Text) > 2500
then
begin
eIp.Text:= FloatToStr(StrToFloat(eUk.Text)*pop);
eUkpop.Text:= FloatToStr(StrToFloat(eUk.Text)-StrToFloat(eIp.Text));
end
else eIp.Text:='0';

129
if StrToFloat(eUplata.Text)<StrToFloat(eUkpop.Text)
then ShowMessage('Nemate dovoljno para'+' treba Vam= '+eUkpop.Text)
else eIsplata.Text:=FloatToStr(StrToFloat(eUplata.Text)-StrToFloat(eUkpop.Text));
end;
Тестирањем апликације pPrimer2 приказају се неки делови као на слици 7.7.
Ако нема довољно новца за рачун Рачун за купца

Слика 7.7. – Приказ резултата тестирања апликације pPrimer2

Генерисање случајних бројева(Randomize, Random)

Примена случајних бројева у програмирању се користи у разним ситуацијама када се симулирају


разни статистички подаци, у програмирању игара, у тестирању програма генерисањем података
итд.
У ту сврху Delphi има на располагању процедуру Randomize и функцију Random. Пре позива
функције се мора прво навести процедура Randomize која иницијализира базу за генерисање
случајних бројева, а затим се позива функцијa за генерисање случајних бројева. Ако се то не
уради, увек се при извршавању програма генерише исти низ бројева у бази.
Функција се задаје у формату:
Random; или
Random(b);
где су:
Random – службена реч која говори о функцији за генерисање случајних бројева,
b – интервал за генерисање [0,b-1].
Ако се користи само Random, тада се генеришу случајни реални бројеви са равномерном
расподелом у интервалу [0,1].

Догађај OnKeyPress

Догађај OnKeyPress је везан за акцију када је на тастатури притиснут неки тастер. Када се каже
неки тастер, мисли се на алфанумеричке тастере, као и тастере Tab, Enter, Esc и Backspace. Овај
догађај регулише који тастер се може притиснути када се уносе подаци у поље Edit.
Следећа наредба if која се налази у процедури, регулише да се преко тастатуре у компоненту Edit
могу унети само цифре од 0 до 9:
if not (Key in ['0'..'9']) {dozvoljeni su znaci sa tastarure izmedju uglastih zagrada}
then Key:= #0; {ako vrednost nije iz skupa dozvoljenih, neutralise se znakom 0}

130
Ако се унесу знаци који нису наведени између заграда, ништа се не дешава, односно апликација
игнорише дотични податак са тастатуре (поставља знак #0 што уствари представља одсуство било
ког тастера).
Следећи облик наредбе дозвољава да се унесу цифре од 0 до 9, и знаци: -, тачка и зарез, али
додатно производи пратећи звучни сигнал.
if not(Key in [′0′..′9′,′-′,′.′,′,′])
then
begin
Beep; {proizvodi zvucni signal}
Key:= #0;
end;
Пример: uNagrada, pNagrada, fBingo
Написати апликацију која симулира игру на срећу где се случајно бирају три броја, тако да ако се
приликом случајног избора погоде два суседна броја осваја се новчана награда 1.000 динара, ако
се погоде сва три иста броја осваја се награда 10.000 динара и ако се догоди да унети број играча
буде погођен осваја се највећа награда BINGO у износу од 100.000 динара.
Процедура за решавање задатка:
1. За описе у игри користити компоненте Label. Поставити четири компоненте. Редом у својству
Caption уписати: IGRA NA SRECU, Dva uzastopna ista broja nagrada 1.000 din, Sva tri broja
ista nagrada 10.000 din и Broj jednak zadatom broju BINGO 100.000 din.
2. За број који уноси играч поставити компоненту Edit. У својству Name уписати ebr. За опис
компоненте поставити компоненту Label и у својству Caption уписати опис Uneti broj.
3. За податке који се генеришу функцијом Random поставити три компоненте Label. У својству
Name уписати lb1, lb2 и lb3, а у својству Caption уписати редом: 0, 0 и 0.
4. За обраду поставити компоненту Button, у својству Name уписати bSreca, а у својству Caption
уписати SRECA.
5. За програмску контролу улазног податка о задатом броју, позиционирати се на компоненту Edit
са именом ebr, активирати догађај OnKeyPress, и уписати следећи програмски код:
if not (Key in ['0'..'9'])
then Key:= #0;

131
За обраду игре означити дугме bSreca, активирати догађај OnClick, и унети програмски код:

Програмски код примера uNagrada, pNagrada Алгоритам примера uNagrada, pNagrada

procedure TfBingo.bSrecaClick(Sender:
TObject); var x1,x2,x3,br:integer; s,sc:String;
begin
randomize;
x1:=Random(10); str(x1,s);
lb1.Caption:=s;
x2:=Random(10); str(x2,s);
lb2.Caption:=s;
x3:=Random(10);
str(x3,s);
lb3.Caption:=s;
if ebr.Text=''
then
begin
if (x1=x2) and (x2=x3)
then ShowMessage('10.000');
else if (x1=x2) or (x2=x3)
then ShowMessage('1.000')
end
else
begin
s:=lb1.Caption+lb2.Caption+lb3.Caption
; br:=StrToint(s); if
br=StrToInt(ebr.Text)
then
begin
ShowMessage('BINGO 100.000');
ebr.SetFocus; ebr.SelectAll;
end;
end; end;

Тестирањем апликације pNagrada приказани су могући добици у игри на срећу, као на слици 7.8.

Добитак БИНГО
Без добитка Добитак 1.000 Добитак 10.000
100.000

Слика 7.8. – Приказ тестирања примера апликације pNagrada


Напомена: Како ће се у примерима апликација које следе појављивати догађај OnKeyPress и
контрола података у компонентама за унос података Edit коришћењем програмског кода сличном
наведеном:

132
if not (Key in ['0'..'9'])
then Key:= #0;
тe нема потребе да се она убудуће пише у комплетном програмском коду.
Пример: uKvJednacina, pKvJednacina, fKvjednacina
Креирати апликацију која израчунава решења квадратне једначинe ax2+bx+c=0 уз услов да је a≠0.
Упутство за решавање задатка:

Пре самог писања програма треба математички формулисати поставку задатка, а то је да једначина
има два решења која се рачунају преко формуле:
+ 2
−b

√b −4 ac
x1,2=
2a
а која постоје ако је задовољен услов да је D=b2 - 4ac>0. Ako je D=0 једначина има само једно
b
решење које се рачуна по формули x = -
2a
Процедура за решавање задатка:
1. За наслов задатка поставити на форму три компоненте Label. У својству Caption, за прву
уписати текст KVADRATNA JEDNACINA ax, за другу − текст 2, и за трећу − текст +bx+c=0.
2. За улазне податке a, b и c, као и за решења када једначина има два решења x1, x2 поставити пет
компоненти Edit. У својству Name доделити имена редом: ea, eb, ec, ex1 и ex2.
3. За описе компоненти Edit поставити пет компоненти StaticText. У својству Caption доделити
им описе редом: a, b, c, x1 и x2.
4. За решење када једначина има једно решење поставити једну компоненту Label. У својству
Name за име уписати lx, a описати га у својству Caption са x=.
5. Поставити два дугмета Button, једно за решавање задатка а друго за излаз из програма. Прво
дугме у својству Name назвати bResenje а друго bIzlaz, а описати их у својству Caption као
RESENJE и IZLAZ.
6. За контролу улазних података у компонентама Edit именованим са ea, eb, и ec користити
догађај OnExit, а у методи догађаја процедуру val.
7. За обраду која се тражи у задатку означити дугме са именом bResenje, активирати догађај
OnClick, и унети следећи програмски код:
procedure TfKvjednacina.bResenjeClick(Sender: TObject);
var
a,b,c,x,x1,x2,D:real;
begin
lx.Caption:='x=';
a:=StrToFloat(ea.Text);
b:=StrToFloat(eb.Text);
c:=StrToFloat(ec.Text);
if (a< >0)
then
begin
D:=sqr(b)-4*a*c;

133
if (D<0)
then
begin
ShowMessage('Nema resenje');
ea.SetFocus; ea.SelectAll;
end
else
begin
if (D=0)
then
begin
x:=-b/(2*a); lx.Caption:=lx.Caption+FloatToStr(x);
end
else
begin
x1:=(-b+sqrt(D))/(2*a); x2:=(-b-sqrt(D))/(2*a);
ex1.Text:=FormatFloat('##0.00',x1); ex2.Text:=FormatFloat('##0.00',x2);
end
end
end
else ShowMessage('Nije kvadratna');
end;
Сада следи алгоритамско решење методе активиrаног догађаја OnClick за дугме bResenje.

Алгоритамско решење методе обраде у апликацији pKvJednacina


pocetak

a,b,c
ne
a< >0
da
D:=sqr(b)-4*a*c ′nije kvadratna′
da
D<0
′nema resenja′
ne
ne da
D=0

x1:=(-b+sqrt(D))/(2*a) x:=-b/(2*a)

x2:=(-b-sqrt(D))/(2*a) x

x1,x2

kraj

134
На слици 7.9. приказани су резuлтати тестирања апликације pKvJednacina.

Има два решења Нема решења Има једно решење

Слика 7.9. – Приказ резултата тестирања примера апликације pKvJednacina.

НАРЕДБА ВИШЕСТРУКОГ ИЗБОРА

Прегледност програма смањује се угнежђавањем наредби if, па се зато препоручује да


угњежђавање буде у дубини до три if наредбе. Када је услов за гранање сложенији, односно
захтева више грана као активности (више од две), проблем се може решити вишеструком
употребом наредбе if тако што се услов преформулише у неколико једноставних услова. Међутим,
за овај случај, када услов има више од две гране, постоји посебна наредба case. Она омогућава да
се на основу задатог услова као израза који може добити различите вредности врши избор
одговарајуће наредбе или групе наредби (begin блок – компонована наредба). Наредба case
замењује вишеструко угнежђавање if наредбе.
У следећој табели је приказан формат наредбе case са одговарајућим графичким приказом у
алгоритму:
v_1
v_n

v_2
else

Формат наредбе case Алгоритамски приказ наредбе case


izraz
...

case (izraz) of
v_1: naredba_1;
v_2: naredba_2;
...
Alternativna

naredba_n

naredba_2

naredba_1
naredba

v_n: naredba_n;
else al_naredba;
end;
kraj

где су:
case – службена реч која указује на селектора (izraz),
izraz – израз који представља селектора који селектује која ће се од наредби извршити,
v_1,v_2,...,v_n – вредности константи које добија селектор, а које одређују која од наредби
се извршава,

135
of, end – службене речи.
Тип селектора може бити целобројни, знаковни, и логички, али не може реални тип.
Одговарајуће вредности за izraz као селектор гранају програм на само једну од грана и то:
вредност vt_1: активира neredbu_1 или блок наредби, вредност v_2: активира nаredbu_2 или блок
наредби, и тако редом до коначне вредности v_n: која активира naredbu_n или блок наредби.
Алтернативна наредба else се користи ако селектор не узме ни једну од понуђених вредности Није
дозвољено да се нека вредност селектора појављује у два или више случајева.
Селектор може имати највише 255 вредности, а ако је у програму потребно више, онда се
комбинују две или више наредби case. Случајеви тј. вредности израза се могу задавати као:
– појединачно свака вредност – v_1,v_2: naredbе;
– интервално (од до) – v_1..v_ n: naredbе; {izmedju pocetne i krajnje vrednosti je znak ..}.
Ако у неким случајевима треба извршити више од једне наредбе, онда их обавезно треба
посматрати као компоноване, што значи писати их у begin блоку (begin naredbe end;). Следи
пример:
case (izraz) of
v_1: naredba_1; {kada selector ima jednu vrednost i jednu naredbu}
v_2: begin {kada selector ima jednu vrednost i vise naredbi}
naredbe;
end;
v_3, v_4,v_k: begin {kada selector ima vise razlicitih vrednosti i vise naredbi}
naredbe;
end;
...
v_6..v_7: naredba_n; {kada selector pripada intervalu i ima jednu naredbu}
else begin
al_naredbe; {alternativno ima vise naredbi}
end;
end;
Дозвољено је да у оквиру једне case наредбе буде још једна case наредба или више других case
наредби. С обзиром да свака наредба има свој крај (end) зна се који случај припада којем изразу и
не може доћи до забуне. Ако се у наредби case користи наредба if, да не дође до забуне да ли грана
else припада if или case наредби, решити тако што се обавезно за наредбу case иза гране else
затвара са знаком ;, а што у наредби if није дозвољено. Програмери користе и компоновану
наредбу да би овај проблем решили.
Пример: uOceniti, pOceniti, fOceniti
Креирати апликацију за оцењивање контролног задатка ученика и одређивање назива дана када је
оцењивање обављено где улазне податке представљају укупан број поена на контролном и редни
број дана када се контролни радио, и то на следећи начин:
а) Професор прегледа сваки задатак на контролном, додељује му одговарајући број поена, и све
поене сабира у збир поена на основу кога ученуку даје оцену, а према следећем критеријуму
приказаном у табели:

Број поена Оцена


0–40 1
41-55 2

136
56-69 3
70-85 4
86-100 5
б) На основу унетог податка о редном броју дана у недељи приказати назив дана када је ученик
оцењиван а према следећој табели:
Редни број дана 1 2 3 4 5 6 7
Назив дана понедељак уторак среда четвртак петак субота недеља
Задатак има два дела, под а) и под б), а овде ће се решавати на једној форми, тако што једно дугме
Button ће се односити на обраду под а), а друго дугме Button за обраду под б). Овај задатак се
може разбити на две једноставније апликације где ће свака имати своју посебну форму тако да
једна апликација буде решење под а) а друга решење под б). Такво решење се оставља ученику.
Али, задатак се може поставити и решити тако да се на на једној форми налазе улазни подаци и да
се обрада улазних података обавља на једном дугмету Button, односно оцењује ученик и
истовремено приказује дан када је оцењен. Овај пример под именом uOcenaDan, pOcenaDan,
fOceniti урађен је на пратећем CD-у.
Процедура за решавање задатка:
1. За улазне податке потребне у задатку, број поена и редни број дана, поставити две компоненте
Edit. У својство Name уписати имена редом: epoena и ebdn.
2. За излазни податак, оцену ученика, поставити компоненту Edit, у својству Name уписати име
eocena. За приказ назива дана у недељи поставити компоненту Label, у својству Name уписати
име lbdn, а у својству Caption опис DAN.
3. За опис наслова и компоненти поставити четири компонентe StaticText. У својству Caption
уписати редом за сваку компоненту описе: OCENJIVANJЕ I DAN OCENJIVANJA, BROJ
POENA, RED.BROJ DANA и OCENA.
4. За обраду и излаз из апликације поставити три компоненте Button. У својству Name уписати
редом: bOceni, bDan и bOff, а у својству Caption описе редом: OCENI, DAN и OFF.
5. За контролу улазних података у компонентама Edit именованим са epoena и ebdn користити
догађај OnExit, а у методи догађаја процедуру val.
6. За обрада података под а), означити дугме bOceni, активирати догађај OnClick и унети следећи
програмски код:
procedure TfOceniti.bOceniClick(Sender: TObject);
var poeni:integer;
begin
poeni:=StrToInt(epoena.Text);
case poeni of
0..40:begin
eocena.Text:='1'; ShowMessage('Nedovoljan '+ eocena.Text);
end;
41..55:begin
eocena.Text:='2'; ShowMessage('Dovoljan '+ eocena.Text);
end;
56..69:begin
eocena.Text:='3'; ShowMessage('Dobar '+ eocena.Text);
end;

137
70..85:begin
eocena.Text:='4'; ShowMessage('Vrlo dobar '+ eocena.Text);
end;
86..100:begin
eocena.Text:='5'; ShowMessage('Olican '+ eocena.Text);
end;
else begin
ShowMessage('Broj poena nije оd 0 do 100');
epoena.SetFocus; epoena.SelectAll;
end;
end;
end;
7. За обраду података под б), означити дугме bDan, активирати догађај OnClick и унети следећи
програмски код:
procedure TfOceniti.bDanClick(Sender: TObject);
var bdn:integer;
begin
if ebdn.Text=''
then
begin
ShowMessage('Uneti broj dana u nedelji');
ebdn.SetFocus; ebdn.SelectAll;
end
else
begin
bdn:=StrToInt(ebdn.Text);
case bdn of
7:lbdn.Caption:='NEDELJA';
6:lbdn.Caption:='SUBOTA';
5:lbdn.Caption:='PETAK';
4:lbdn.Caption:='CETVRTAK';
3:lbdn.Caption:='SREDA';
2:lbdn.Caption:='UTORAK';
1: lbdn.Caption:='PONEDELJAK';
else lbdn.Caption:='Nekorektan broj dana';
end;
end;
end;
На слици 7.10. приказани су резултати тестирања апликације pOceniti.
На првој слици приказано је решење с поруком, а на другој се види да, када се
порука потврди, она нестане.

138
Слика 7.10. – Приказ резултата тестирања примера апликације pOceniti
Пример: uKalkulator, pKalkulator, fKalkulator
Креирати апликацију која симулира рад калкулатора са основним аритметичким операцијама,
израчунавањем квадрата и квадратног корена задатог броја. Поље у које се уносе
подаци контролисати тако да се може унети само нумерички податак.
Процедура за решавање задатка:
1. Сада подесити нека својства форме:
За висину ClientHight поставити на 230, за ширину ClientWidth на 300, за удељаност од леве
ивице форме Left на 300, за удаљеност од врха Top на 260, за бирање боје обрасца бирати
својство Color и двапут кликнути у поље десно од својства где се прво приказује формулар за
избор унапред задатих боја (основне боје) или кликнути на дугме Define custom Colors после
кога се појављује други приказ у коме можете подесити и нијансу изабране боје као на слици
7.11.
Први приказ за бојење Други приказ за бојење

Слика 7.11. – Приказ прозора за избор боја


2. Поставити једну компоненту Edit за унос и приказ података. У својству Name унети ebroj.
Својству Color доделити clSkyBlue (светлоплаву). За удаљеност од врха форме својство Top
поставити на 70, а за удаљеност од леве ивице форме својство Left на 80. Висину Edit ком
поненте поставити у својству Hight на 30.Поставити једну компоненту Edit за унос и приказ
података. У својству Name унети ebroj. Својству Color доделити clSkyBlue (светлоплаву). За
удаљеност од врха форме својство Top поставити на 70, а за удаљеност од леве ивице форме
својство Left на 80. Висину Edit компоненте поставити у својству Hight на 30.
3. Поставити девет компоненти дугмета Button које ће се користити као оператори:
– прво за сабирање, у својству Name назвати га bPlus, у својству Caption описати са +,
– друго за одузимање, у својству Name назвати га bMinus, у својству Caption описати са -,
– треће за множење, у својству Name назвати га bMnozi, у својству Caption описати са *,

139
– четврто за дељење, у својству Name назвати га bDeli, у својству Caption описати са /,
– пето за једнако, у својству Name назвати га bJednako, у својству Caption описати са =,
– шесто за квадрат броја, у својству Name назвати га bKvadrat, у својству Caption описати
са kvadrat,
– седмо за квадратни корен, назвати га у својству Name bKoren, у својству Caption описати
са koren,
– осмо за пражњење поља, у својству Name назвати га bPonisti, у својству Caption описати са Clr,
– двето за гашење, назвати га у својству Name bОff, у својству Caption описати са Off.
– после ових акција форма би имала следећи изглед, као на слици 7.12:

Слика 7.12. – Приказ форме после постављања компоненти


4. Како после уноса вредности поље мора да се испразни за унос следеће вредности која ће ући у
израчунавање, у ту сврху ће се користити догађај OnExit (напуштање компоненте у жижи).
Позиционирати се на компоненту Edit(eBbroj), активирати догађај OnExit. и унети следећи
програмски код:
procedure TfKalkulator.eBrojExit(Sender: TObject);
begin
if eBroj.Text=''
then
begin
ShowMessage('Unesite broj');
eBroj.SetFocus; eBroj.SelectAll;
end;
end;
5. К онтролу улазнoг податка у компоненте Edit, именованом са eBroj обавити догађајем
OnKeyPress. У ту сврху у методи користити следећи програмски код:
if not (Key in ['0'..'9','-','.'])
then Key:=#0;
6. Променљиве које ће се користити у апликацији b, b1, b2 и ind декларисати у програмској
јединици као јавне на следећи начин:
b1,b2,b:Real;
ind:integer;
7. Сада програмирати дугмад за одговарајуће операције. Означити дугме bPlus, активирати догађај
OnClick и унети код:
procedure TfKalkulator.bPlusClick(Sender: TObject);
begin
b1:=StrToFloat(eBroj.Text); ind:=1; eBroj.Text :='';

140
eBroj.SetFocus; eBroj.SelectAll;
end;
Означити дугме bMinus, активирати догађај OnClick и унети код:
procedure TfKalkulator.bMinusClick(Sender: TObject);
begin
b1:=StrToFloat(eBroj.Text); ind:=2; eBroj.Text :='';
eBroj.SetFocus; eBroj.SelectAll;
end;
Означити дугме bMnozi, активирати догађај OnClick и унети код:
procedure TfKalkulator.bPutaClick(Sender: TObject);
begin
ind:=3; b1:=StrToFloat(eBroj.Text); eBroj.Text :='';
eBroj.SetFocus; eBroj.SelectAll;
end;
Означити дугме bDeli, активирати догађај OnClick и унети код:
procedure TfKalkulator.bDeliClick(Sender: TObject);
begin
ind:=4; b1:=StrToFloat(eBroj.Text); eBroj.Text :='';
eBroj.SetFocus; eBroj.SelectAll;
end;
Означити дугме bJednako, активирати догађај OnClick и унети код:
procedure TfKalkulator.bJednakoClick(Sender: TObject);
begin
b2:=b1; b1:=StrToFloat(eBroj.Text);
case ind of
1:b:=b2+b1;
2:b:=b2-b1;
3:b:=b2*b1;
4:begin
if b1=0
then
begin
ShowMessage('Nije dozvoljeno deljenje sa 0');
eBroj.SetFocus; eBroj.SelectAll;
end
else b:=b2/b1;
end;
end;
eBroj.Text :=FloatToStr(b);
end;
Означити дугме bKvadrat, активирати догађај OnClick и унети код:
procedure TfKalkulator.bKvadratClick(Sender: TObject);
begin
ind:=5; b1:=StrToFloat(eBroj.Text); eBroj.Text:=FloatToStr(sqr(b1));
eBroj.SetFocus; eBroj.SelectAll;
end;

141
Седмо дугме је корен с именом bKoren. Треба га означити, па активирати догађај OnClick и
унети код:
procedure TfKalkulator.bKorenClick(Sender: TObject);
begin
ind:=6; b1:=StrToFloat(eBroj.Text); eBroj.Text:=FloatToStr(sqrt(b1));
eBroj.SetFocus; eBroj.SelectAll;
end;
Означити дугме bPonisti, активирати догађај OnClick и унети код:
procedure TfKalkulator.bPonistiClick(Sender: TObject);
begin
eBroj.Text :='';
eBroj.SetFocus; eBroj.SelectAll;
end;
Ако се боље погледа рад апликације, уочиће се да компонента Edit није у фази пројектовања
прихватила својство Hight за висину тог поља које је промењено на 30. Решење за овај
недостатак, којим би сва својства у пројектовању могла да се подесе, лежи у томе да се то
подешавање обави у фази кодирања програма. У ту сврху ће се користити догађај OnCreate за
форму fKalkulator после кога се уноси следећи код:
procedure TfKalkulator.FormCreate(Sender: TObject);
begin
eBroj.Font.Height:=30;
end;
После исправке покренути апликацију и сада је својство Hight за висину тог поља које је
промењено на 30 уважено, што се лако може видети.
Тестирање апликације pKalkulator приказано је на слици 7.13. која приказује неке операције:
За дељење је унет је број 1024, притиснуто је дугме /, унет је број 64, па је притиснуто дугме =, те је
тако добијен резултат 16.

За квадрат је унет број 500 За корен је унет број 1024 За брисање поља притиснути
и притиснуто дугме kvadrat и притиснуто дугме koren дугме Clr

Слика 7.13. – Приказ тестирања апликације pKalkulator

142
КОНТРОЛЕ ИЗБОРА И КОНТЕЈНЕРСКЕ КОМПОНЕНТЕ

Визуелно програмирање омогућава да се на форму поставља више различитих контрола


(компоненти) за разне обраде података. На пример, треба бирати да ли ће се израчунати сумa низа
бројева, минимални елемент задатог низа или максимални елемент задатог низа. Слично је и када
се може бирати обрачун камате било по пропорционалној или конфорmној методи. Такође,
приликом уноса података може се дозволити бирање података од више понуђених који се желе
унети и много других ситуација. На форму се у ту сврху постављају разне компоненте (контроле)
које се прилагођавају и програмирају догађајима за реализацију разних врста обрадa. Једна од њих
омогућава одабирање само једне од понуђених опција, док друга омогућава да се од понуђених
опција одабере више опција, неке од њих или све.
На располагању су следеће контроле:
 RadioButton и RadioGroup – за бирање једне опције, од више понуђених, а називају се
радио дугме и групно радио дугме,
 CheckBox – за бирање једне, ниједне, више или свих опција од понуђених, а назива се
опциони квадрат или поље за потврду.
Контроле RadioButton и CheckBox су појединачне док контрола RadioGroup групише два или
више радио дугмади.
Груписањем контрола у логички организоване целине на форми као делове апликације, чини
апликацију ефикаснијом и прегленијом за рад. За групиасње контрола на форми Delphi има
посебне компоненте које се називају контејнерске компоненте. У овој књизи ће се користити
следеће контејнерске компоненте: GroupBox, Panel, RadioGroup.

Дугме опциони квадрат(CheckBox)

Дугме CheckBox се с правом назива и дугме за потврђивање, јер се његовим означавањем


примењује нека опција на коју то дугме указује. Дугме има два стања, потврђено и непотврђено а
евентуално се може укључити и неодређено стање у зависности од апликације. У току извршавања
апликације корисник може мењати стање овог дугмета тако што се прво позиционира на њега, а
затим га потврди кликом мишем или помоћу тастатуре. Користи се када је потребно бирати једну,
две, више или све понуђене опције. Назив опционо дугме је оправдан јер се нуде разне опције
избора које су наведене.
Поставља се на форму исто као и обично дугме са палете компоненти Standard, а означенo је
квадратићем прецртаним са x. Ово дугме има сва својства наведена у Табели 3.2. осим својстава
Text, Align и BorderStyle. Поред наведеног има и додатна следећа својства:
 Checked – да ли је дугме потврђено, типа Boolean с вредношћу True означава да је у
потврђеном стању, док вредност False означава да је дугме у стању које је непотврђено;
 AllowGray – указује на неодређен статус, типа Boolean с вредношћу True означава да се ради о
дугмету са неодређеним статусом при чему се могу појавити три стања дугмета (потврђено,
непотврђено и неодређено – сиво), док вредност False означава да може имати само два стања
дугмета (потврђено и непотврђено);
 State – стање дугмета, набројивог типа, означава тренутно стање дугмета. Могуће вредности су
cbChecked (потврђено), cbGrayed (неодређено) и cbUnchecked (непотврђено);
 Alignment – поравнање дугмета, набројивог типа одређује да ли се натпис оквира за потврду
налази са леве или са десне стране дугмета.
Једноставнији облик коришћења контроле CheckBox је провера да ли је дугме потврђено или

143
није потврђено:
if CheckBox1.Checked Ако је квадратић CheckBox1 потврђен (True), извршава се
then Akcija1 (први одговарајући програмски део), а ако квадратић
Akcija 1
није потврђен (False), извршиће се Akcija2 (други одговарајући
else
Akcija2; програмски део).

Када се у својству State одабере стање cbGrayed, на форми се компонента CheckBox препознаје
као сиви квадратић. Да би се на форми видела компонента CheckBox као сива, треба у својству
AlowGrayed поставити вредност True, јер default вредност за ово својство је False. Ако се
својство AlowGrayed постави на True, провера стања компоненте CheckBox се обавља помоћу
својства State. Преко својства State може се испитивати актуелно стање својства компоненте
CheckBox са одговарајућим пратећим акцијама, па су у следећој табели приказани као уопштено
испитивање и са једним примером на следећи начин:

Уопштено испитивање преко својства State Пример испитивања преко својства State
if CheckBox1.State=cbGrayed if CheckBox1.State=cbGrayed
then then
Akcija1 CheckBox1.Font.Color:=clGray
else else
if CheckBox1.State=cbChecked if CheckBox1.State=cbChecked
then then
Akcija2 CheckBox1.Font.Color:=clRed
else еlse
Akcija3; CheckBox1.Font.Color:=clGreen;
У оба случаја заглавље методе која би обрађивала догађај Checked контроле CheckBox била би:
procedure TForm1.CheckedBox1Click(Sender:TObject);
Пример: uSklanjanje, pSklanjanje, fTest
На форму поставити компоненте Edit, Label, Button и CheckBox. Програмирати догађај OnClik
на компоненти Button, тако да, ако је дугме CheckBox означено, компонента Edit се сакрије,
форма се обоји у жуто, а у компоненту Label упише се текст Sakrio Edit i obojio formu. У
супротном, ако дугме CheckBox није означено, приказати компоненту Edit, вратити почетну боју
форме, а у компоненту Label уписати Vratio Edit i boju. Креирати апликацију која решава
постављени задатак.
Процедура за решавање задатка:
1. Поставити на форму контролу Edit, у својство Name уписати eTest, и у својству Text уписати
SKLONI.
2. Са картице Standard бирати контролу CheckBox, поставити је на форму, и у својству Name
уписати cbTest, а у својству Caption уписати SAKRI, OBOJI FORMU.
3. За обраду према постављеном задатку, на форму поставити дугме Button. У својству Name
уписати као име bTest, а у својству Caption уписати SAKRI.
4. Активирати догађај OnClick за дугме bTest, и унети следећи програмски код:
procedure TfTest.bTestClick(Sender: TObject);
begin
if cbTest.Checked
then
begin

144
eTest.Hide; fTest.Color:=clYellow;
lNaslov.Caption:='Sakrio Edit i obojio formu';
end
else
begin
eTest.Show; lNaslov.Caption:='Vratio Edit i boju';
fTest.Color:=clBtnFace;
end;
end;
Тестирање апликације pSklanjanje приказано је на слици 7.16.

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

Слика 7.16. – Приказ тестирања апликације pSklanjanje


Пример: uOcena, pOcena, fOcena
Креирати апликацију за контролни задатак у вези с хардвером. Ученик из информатике означава
тачне одговоре на питање: Koje komponente racunara su ulazne?. Понуђени су одговори: stampac,
monitor, mis, tastatura, skener, bar kod citac, joystick, ploter. За сваки тачан одговор доделити по
1 поен. Ако није маркиран тачан одговор доделити му 0 поена, а ако је погрешно одговорио –
(минус) 1 поен и обојити слова описа компоненте црвеном бојом, а боју позадине белом бојом. На
крају сабрати број поена. Ако је ученик освојио 5 поена, добија оцену 5, 4 поена, оцену 4, 3 поена,
оцену 3, 2 поена, оцену 2 и за остале случајеве оцену 1.
Улазни подаци: Променљива poena за број поена на контролном.
Обрада: Поставити почетну вредност (poena:=0), а затим у зависности од датог одговора на
питање увећавати за 1 поен (poena+1) или умањивати за 1 поен (poena-1). Када се формира укупан
број поена после свих одговора по задатом критеријуму се формира оцена. Ако је дат нетачан
одговор обојити слова описа компоненте црвеном бојом, а боју позадине белом бојом.
Излазни подаци: број поена у компоненти Edit и одговарајућа оцена као порука.

145
Алгоритамско решење задатка uOcena, pOcena, fOcena као метода догађаја
OnClick на одговарајућем дугмету Button за обраду.
pocetak 1
poenа:=0 ePoena.Text:=IntToStr(po
ne ena)
cbStampac.Checked
poenа
da
5′
poena := poena-1 5
′Ocena je
cbStampac.Font.Color:=clRed 4′
cbStampac.Color:=clWhite 4
′Ocena je

ne 3′
cbMonitor.Checked
3
′Ocena je
da 2′
poena := poena-1
2
′Ocena je
cbMonitor.Font.Color:=clRed
cbMonitor.Color:=clWhite
1′
inаče
′Ocena je
ne
cbMis.Checked
da
kraj
poena :=poena+1

ne
cbTastatura.Checked
da
poena :=poena+1
ne
cbSkener.Checked
da
poena :=poena+1

cbBarkod.Checked ne
da
poena :=poena+1
ne
cbJoystick.Checked
da
poena :=poena+1

cbPloter.Checked ne

da
poena := poena-1
cbPloter.Font.Color:=clRed
cbPloter.Color:=clWhite

1
Процедура за решавање задатка:
1. Компонента CheckBox се налази на картици Standard. На форму поставити осам
компоненти CheckBox, и у својство Caption унети описе редом: STAMPAC, MONITOR,
MIS, TASTATURA, SKENER, BAR KOD, JOYSTICK и PLOTER, а затим у својство
Name уписати њихова имена редом: cbStampac, cbMonitor, cbMis, cbTastatura, cbSkener,
cbBarkod, cbJoystick, и cbPloter.

146
2. Поставити једну компоненти Label која ће се користити за наслов, у својству Name
уписати lNaslov, а у својству Caption уписати KOJA OD KOMPONENTI RACUNARA JE
ULAZNA.
3. Поставити на форму обично дугме Button и у својству Caption унети податак OCENA, а у
својству Name као име дугмета bOcena.
4. Поставити компоненту Edit за број поена назвати је у својству Name именом ePoena.
5. Активирати догађај OnClick за дугме bOcena и унети следећи програмски код:
procedure TfOcena.bOcenaClick(Sender: TObject);
var poena:integer;
begin
poena:=0;
if cbStampac.Checked
then
begin
poena := poena-1;
cbStampac.Font.Color:=clRed; cbStampac.Color:=clWhite;
end;
if cbMonitor.Checked
then
begin
poena := poena-1;
cbMonitor.Font.Color:=clRed; cbMonitor.Color:=clWhite;
end;
if cbMis.Checked then poena := poena+1;
if cbTastatura.Checked then poena := poena+1;
if cbSkener.Checked then poena := poena+1;
if cbBarkod.Checked then poena := poena+1;
if cbJoystick.Checked then poena := poena+1;
if cbPloter.Checked
then
begin
poena := poena-1;
cbPloter.Font.Color:=clRed; cbPloter.Color:=clWhite;
end;
eBodovi.Text:=IntToStr(poena);
case StrToInt(eBodovi.Text) of
5:ShowMessage('Ocena je 5');
4: ShowMessage('Ocena je 4');
3: ShowMessage('Ocena je 3');
2: ShowMessage('Ocena je 2');
else ShowMessage('Ocena je 1');
end;
end;
Тестирање апликације pOcena приказано је на слици 7.17.

147
Слика 7.17. – Тестирање примера апликације pOcena

Компонента радио-дугме (RadioButton)

Дугме RadioButton користи се за одабирање само једне опције (акције) од више понуђених. Ако се
користи само једно радио-дугме, корисник може да изабере опцију на коју дугме указује, а може и
да је не изабере. Користи се као групно дугме, што значи да се на форму поставља два или више
дугмади, при чему свако радио-дугме представља једну ставку. Графички се приказује као округао
оквир и натпис поред њега који га описује. Празан оквир означава да наведена ставка није
одабрана, а попуњен оквир у коме је подебљана тачка да је ставка одабрана. Користи се исто као и
опционо дугме CheckBox с два стања, а разлика је у томе, када се једно дугме у групи одабере
(притисне), друго дугме, које је до тада било одабрано, аутоматски се поништи (искључи). То
значи да, ако се на форми налазе два или више дугмади може са изабрати само једно од њих, које
тако постаје активно.
Постављање на форму је исто као код свих дугмади, а налази се на картици стандардних
компоненти Standard означено као RadioButton.
Ово дугме има сва својства наведена у Табели 3.2. осим својстава Text, Align и BorderStyle. Али
има додатна својства Checked и Alignment чија су значења иста као и код дугмета CheckBox.
Проверавање да ли је радио-дугме RadioButton означено као активно (чекирано), обавља се у
његовом својству Checked, а које може имати вредности:
 True (потврђено, истина) и
 False (непотврђено, неистина).
Програмирање се своди на if наредбу, којом се испитује да ли је радио-дугме чекирано за акцију
или није чекирано. Наредба би се могла писати на следећи начин:
if RadioButton.Checked;
then akcija;
Тумачење: Ако је радио-дугме чекирано за акцију, тада се акција изврши. Акција може бити било
која наредба или скуп наредби.
Пример: uKamata, pKamata, fKamata
Креирати апликацију која на бази износа новца који се орочава у банци израчунава и приказује
годишњу камату на неорочену штедњу са каматном стопом 2.8%, и на орочену штедњу са
каматном стопом 8,2% и укупан износ са каматом. За решавање задатка користити компоненту
радио-дугме.
Процедура за решавање задатка:
1. На форму поставити три компоненте Edit. У својству Name за имена уписати редом: eNovac,
eKamata и eIznsakam.

148
2. За наслов и описе компоненти поставити на форму четири компоненте StaticText. У својство
тих компоненти Caption уписати редом: OBRACUN KAMATE, Orocen iznos, Iznos kamate и
Iznos sa kamatom.
3. Компонента RadioButton се налази на картици Standard. Поставити два радио-дугмета
RadioButton, и у својству Name доделити имена rbNeorocen и rbOrocen, а у својству Caption
уписати редом описе : Neoroceno 2,8% и Оroceno 8,2%.
4. За обраду према постављеном задатку и излазак из апликације на форму поставити двe
компоненте Button. У својству Name унети редом: bRacunaj и bKraj, а у својство Caption
уписати редом описе: RACUNAJ и KRAJ.
5. За контролу улазног података у компоненти Edit именованом са eNovac користити догађај
OnExit, а у методи догађаја процедуру val.
6. Активирати догађај OnClick за дугме bRacunaj и унети следећи програмски код:
procedure TfKamata.bRacunajClick(Sender: TObject);
var ulog:real;
begin
Ulog:=StrToFloat(eNovac.Text);
if rbNeorocen.Checked
then eKamata.Text:=FloatToStr(Ulog*0.028);
if rbOrocen.Checked
then eKamata.Text:=FloatToStr(Ulog*0.082);
eIznsakam.Text:=FloatToStr(Ulog+(StrToFloat(eKamata.Text)));
end;
На слици 7.18. приказано је тестирање апликације pKamata.

Када је неорочен износ Када је орочен износ

Слика 7.18. – Тестирање примера апликације pKamata

Контејнерска компонента групно радио-дугме (RadioGroup)

Контрола (компонента) RadioGroup представља групу радио-дугмади која садржи два или више
дугмади повезаних у недељиву и независну целину и представља контејнерску компоненту. Ако
има више групних радио-дугмади на форми, унутар сваке групе се може у једном тренутку бирати
само по једно дугме. Визуелно се препознаје као правоугаоник у коме су смештена радио-дугмад у
групи. Горња ивица правоугаоника може да садржи опис групе. Ова компонента се налази на
стандардној палети компоненти Standard означена као RadioGroup.
Ово дугме има сва својства наведена у Табели 3.2. осим својстава Text и BorderStyle. Поред тога
има и додатна следећа својства:

149
 Items – ставке типа TStrings, представља листу са описима дугмади у групи. Број ставки
(број редова текста), одређује број дугмади у групи. Број може да се утврди помоћу
Item.Count,
 ItemIndex – индекс ставке типа Integer, означава које је дугме у групи по реду означено,
 Columns – колоне типа Integer, одређује у колико колона ће се расподелити дугмад.
Својство Caption за RadioGroup означава наслов организоване групе, а наслови појединих
дугмади у оквиру групе се означавају својством Items, тако што се на ово својство двапут кликне
мишем, после чега се отвара едитор листе назива у који уносимо наслове појединих дугмади
поређане по редоследу приказивања. Које радио-дугме је чекирано у групи одређује се својством
ItemIndex. Прво дугме у групи индексирано је са 0, друго са 1, треће са 2, итд, све док има
дугмади. У поступку програмирања својство ItemIndex се може мењати према потреби обраде у
апликацији.
Пример: uRegistracija, pRegistracija, fRegistracija
Креирати апликацију, за израчунавање и приказивање новчаног износа за плаћање регистрације
према снази мотора путничког аутомобила која се изражава у kW(киловатима). У компоненте Edit
уносе се подаци о износу за путарину, износу за осигурање, и износу за републичку таксу. У
зависности од снаге мотора аутомобила у kW, израчунати основни новчани износ који се затим
множи одговарајућим коефицијентима да би се добио укупан износ регистрације и то:
• за снагу до 23 kW коефицијент је 1,
• за снагу од 24 до 33 kW коефицијент је 1.2,
• за снагу од 34 до 43 kW коефицијент је 1.4,
• за снагу од 44 до 53 kW коефицијент је 1.6,
• и за снагу преко 53 kW коефицијент је 2.
Процедура за решавање задатка:
1. За улазне и излазне податке поставити четири компоненте Edit, и у својству Name уписати
имена редом: ePutarina, eOsigiranje, eTaksa и eCena.
2. Компонента RadioGroup се налази на картици Standard. За одређивање снаге мотора, на
форму поставити групно радио-дугме, и у својству Name доделити му име rgCena, док у
својству Caption, унети опис SNAGA MOTORA. Затим из картице Properies ObjecInspector-а
бирати својство Items и кликнути двапут мишем на три тачке. Појавиће се едитор за опис
ставки као радио-дугмади, па унети редом: DO 23 kW, OD 24 DO 33 kW, OD 34 DO 43 kW,
OD 44 DO 53 kW и последње PREKO 53 kW. На крају притиснути дугме OK.
3. За обраду у апликацији и излазак из апликације, поставити две компоненте Button, у својству
Name унети bCena и bKraj, а у својству Caption уписати описе Cena registracije и OFF.
4. За описивање наслова и компоненти поставити пет компоненти StaticText. У својство Caption
уписати редом: REGISTRACIJA VOZILA, Putarina, Osiguranje, Taksa republicka и Cena
registracije.
5. Активирати догађај OnClick за дугме bCena и унети следећи програмски код:
procedure TfRegistracija.bCenaClick(Sender: TObject);
var
a,b,c,d:real;
begin
a:=StrToFloat(ePutarina.Text);
b:=StrToFloat(eOsiguranje.Text);
c:=StrToFloat(eTaksa.Text);
case rbSnaga.itemIndex of

150
0:d:=(a+b+c);
1:d:=(a+b+c)*1.2;
2:d:=(a+b+c)*1.4;
3:d:=(a+b+c)*1.6;
4:d:=(a+b+c)*2;
end;
{funkcija FormatFloat za prikaz realnih brojeva}
eCena.Text:=FormatFloat('#,##0.00',d);
{donja naredba ukazuje da se moze koristiti i funkcija FloatTostrF za prikaz realnih brojeva}
//eCena.Text:=FloatTostrF(d,ffFixed,9,2);
end;
6. За контролу улазних података у компонентама Edit, именованим са ePutarina, eOsiguranje и
eTaksa користити догађај OnKeyPress са следећим програмским кодом:
if not (Key in ['0'..'9','-','.'])
then Key:=#0;
7. Додатна контрола поља за унос података односи се на попуњеност подацима – подаци морају
да се унесу да би се извршио обрачун. У ту сврху користити догађај OnExit и процедуру val.
Тестирање апликације pRegistracija је приказано на слици 7.19.

За возила од 34 до 43 kW За возила јача од 53 kW

Слика 7.19. – Тестирање примера апликације pRegistracija


Објашњење:
У примеру је коришћена функција FormatFloat. Користи се за разна приказивања нумеричких
децималних записа. Ова функција има следећи опис у Delphi окружењу:
function FormatFloat(const Format: string; Value: Extended): string; overload;
где су:
function – кључна реч која говори да се ради о функцији,
FormatFloat – име функције,
const – кључна реч која говори да се ради о константи,
Format – формат приказа,
Value – вредност као string,
string – кључна реч која говори да је констанат Format типа string.
Као вредности се у string могу унети '0' , '.' , ',' , 'Е+' , 'Е-' , '%' и ';'.
Како ће се у програмима јављати потреба за приказом вредности у различитим форматима, у
следећој табели се приказују примери формата и резултати који настају када се доделе разне
вредности:

151
Формат/Вреднос
1234 -1234 0.5 0
т
0 1234 -1234 0.5 0
0.00 1234.00 -1234.00 0.50 0.00
#.## 1234 -1234 .5
#,##0.00 1,234.00 -1,234.00 0.50 0.00
#,##0.00;(#,##0.00) 1,234.00 (1,234.00) 0.50 0.00
#,##0.00;;Zero 1,234.00 -1,234.00 0.50 Zero
0.000E+00 1.234E+03 -1.234E+03 5.000E-01 0.000E+00
#.###E-0 1.234E3 -1.234E3 5E-1 0E0
##0.0# % 1234.0 % -1234.0 % 0.5 % 0.0 %
Може се користити и функција FloatToStrF која има следећи облик:
function FloatToStrF(Value,Format,Precision,Digits);
function FloatToStrF(Value:Extended;Format:TFloatFormat;Precision,Digits:Integer):string;overload;
где су:
FloatToStrF – име функције,
Value – вредност реалног броја као string,
Format – формат приказа: ffExponent (експоненцијалан), ffFixed (у фиксном зарезу), ffGeneral
(универзалан), ffNumber (у фиксном зарезу са цифрама за раздвајање хиљада) и ffCurency
(новчани износи валута),
Precision – број места за смештање записа,
Digits – број места за децимале.
Пример: У компоненти за приказ података Edit именованом са eCena коришћењем функција
FormatFloat и FloatToStrF приказати реалан број у фиксном зарезу са две децимале.
eCena.Text:=FormatFloat('#,##0.00',d);
eCena.Text:=FloatTostrF(d,ffFixed,9,2);
Предлаже се да ученик испроба ове функције и закључи како и када ће их применити.

Контејнерска компонента (GroupBox)

Контејнерска компонента GroupBox као контрола се користи када се укаже потреба да се


неколико истих или различитих контрола повеже у једну организовану целину која представља
један део апликације. Може се назвати оквиром за групу.
Ова контејнерска компонента има сва својства наведена у Табели 3.2. осим својстава Text и
BorderStyle. Димензије компонента могу се мењати како би се распоредиле постављене контроле
унутар оквира. У оквиру се могу поставити разне контроле, радио-дугмад, опциони квадрати,
обична дугмад, поља Edit, компоненте Label и други.
Налази се на картици Standard, у својству Name добија име групе, а у својству Caption се уписује
информациона порука о организованости те групе. Када се компоненте организују помоћу
компоненте GroupBox, и када се у компоненту GroupBox као „родитеља” постављају друге
компоненте − „деца”, компонента „дете” може од „родитеља” преузети неке вредности својстава
која су додељена „родитељу” (ParentFont, ParentColor ...). Неке компоненте, дефинисане као
„дете” могу се селити GroupBox из оквира једног „родитеља” у уквире другог „родитеља”
операцијом Cut/Paste. Преко компоненте GroupBox може се контролисати припадност

152
компоненти одређеној групи. Тиме је омогућено да се једном командом могу искључити све
компоненте у групи, могу се привремено склонити са форме, а затим по потреби поново вратити.
Пример: uTestInformatika, pTestInformatika, fInformatika
Креирати апликацију контролног теста из информатике, где ће се посебно одвојити тест из
хардвера од теста из софтвера. За одвајање користити компоненту GroupBox. У обе групе треба
приказати број освојених поена.
У тесту који се односи на софтвер даје се списак следећих програма: MS Word, Windows 7, Linux,
FaceBook и DOS. Ученик одговара на питање којој групи програма припадају наведени програми
и то системским или апликативним. Ако се изаберу програми који припадају одговарајућој
групи, додељује се 1 поен, а ако се изаберу програми који не припадају одговарајућој групи
одузима се 1 поен. У тесту за хардвер даје се списак рачунарских компоненти: Модем, ТВ карта,
Хард диск и оптички DVD читач и резач. Ученик одговара на питање у који део на матичној
плочи може да смести неку од наведених хардверских компоненти и за то се нуди избор Slot или
PS2 Port. Бодовати одговоре тако да, ако се изабере место на матичној плочи (Slot или PS2 Port),
прећи на избор хардверских компоненти које се могу на то место поставити. Када се за изабрано
место одабре одговарајућа хардверска компонента која се може у њу поставити додељује се 1
поен, а ако се изабере неодговарајућа хардверска компонента одузима се 1 поен. Познавалац
хардвера рачунара одмах ће уочити да се у PS2 Port не може поставити ниједна од наведених
хардверских компоненти. Ако се изабере PS2 Port, тада је број поена 0 и треба приказати поруку
да је извршен неодговарајући избор.
Процедура за решавање задатка:
1. Компонента GroupBox налази се на картици Standard. Да би се тестови из хардвера и софтвера
раздвојили, на форму поставити две компоненте GroupBox и у својству Name уписати имена
редом: gbSoftver и gbHardver, а у својству Caption описе TEST IZ SOFTVERA и TEST IZ
HARDVERA.
2. У оквир за софтвер gbSoftver, поставити пет опционих квадрата CheckBox и доделити им у
својству Name имена редом: cbWord, cbWindows, cbLinux, cbFace и cbDos, а затим у
одговарајуће својство Caption унети редом описе: Ms Word, Windows 7, Linux, FaceBook и
DOS. Они ће се користити да се означе називи програма који ће се сврставати у системске или
апликативне. За бирање којој групи ће припадати означени програми на форму поставити два
радио-дугмета RadioButton. У својству Name уписати имена rbSistemski и rbAplikativni, док у
својству Caption уписати описе SISTEMSKI и APLIKATIVNI. За приказ броја поена на форму
поставити компоненту Label и у својству Name уписати име lPoenas, а у својству Caption
уписати опис Poena:. За акцију којом се врши обрада према постављеном задатку поставити у
оквир дугме Button и у својству Name уписати bSoftver, а у својству Caption уписати опис
REZULTAT.
3. Да би се обрађивао део апликације који се односи на софтверска питања, означити дугме
bSoftver, активирати догађај OnClick и унети следећи програмски код:
procedure TfInformatika.bSoftverClick(Sender: TObject);
var
poenas:integer; P:TPoint;
begin
P.X:=0; P.Y:=0;
P:=ClientToScreen(P); {postavljanje okvira za poruku na poziciju 0,0}
poenas:=0;
if rbSistemski.Checked
then poenas:=ord(cbWindows.Checked)+ord(cbLinux.Checked)+

153
ord(cbDos.Checked)-ord(cbWord.Checked)-ord(cbFace.Checked)
else
if rbAplikativni.Checked
then poenas:=ord(cbWord.Checked)-ord(cbLinux.Checked)-
ord(cbDos.Checked)-ord(cbWindows.Checked)+ord(cbFace.Checked)
else MessageDlgPos('Oznaciti jedan od kruzica',mtWarning,[mbOk],0,P.X,P.Y);
lpoenas.Caption:='Osvojeno poena:'+ IntToStr(poenas);
end;
4. У оквир за хардвер gbHardver, поставити четири опциона квадрата CheckBox и доделити им
имена у својству Name редом: cbModem, cbTVkarta, cbHard и cbDvd, а у својству Caption за
ове дугмиће убацити редом описе: MODEM, TV KARTA, HARD DISK и DVD/RW ROM. Они
ће се користити да се означе називи рачунарских компоненти које се могу поставити на једна
од места на матичној плочи. За бирање на који део матичне плоче се могу поставити означене
рачунарске компоненте поставити два радио-дугмета RadioButton. У својству Name уписати
имена rbSlot и rbPort, док у својству Caption уписати описе SLOT и PS2 PORT. За приказ
броја поена на форму поставити компоненту Label и у својству Name уписати име lPoenah, док
у својству Caption уписати опис Poena:. За акцију којом се врши обрада према постављеном
задатку поставити у оквир дугме Button и у својству Name уписати bHardver, а у својству
Caption уписати опис REZULTAT.
5. Да би се обрађивао део апликације који се односи на софтверска питања, означити дугме
bHardver, активирати догађај OnClick и унети следећи програмски код:
procedure TfInformatika.bHardverClick(Sender: TObject);
var
poena:integer;
P:TPoint;
begin
P.X:=0;
P.Y:=0;
P:=ClientToScreen(P);
poena:=0;
if rbSlot.Checked
then poena:=ord(cbModem.Checked)+ord(cbTvkarta.Checked)-
ord(cbHard.Checked)-ord(cbDvd.Checked)
else
if rbPort.Checked
then
begin
MessageDlgPos('Neodgovarajuci izbor ',mtWarning,[mbOk],0,P.X,P.Y);
poena:=0;
end
else MessageDlgPos('Oznaciti jedan od kruzica',mtWarning,[mbOk],0,P.X,P.Y);
lpoenah.Caption:='Osvojeno poena:'+ IntToStr(poena);
end;

154
На слици 7.20. приказани су примери тестирања апликације pTestInformatika.

Тестирање хардвера са поруком Тестирање хардвера

Тестирање софтвера Оба теста − хардвер и софтвер

Слика 7.20. – Примери тестирања апликације pTestInformatika


У овој апликацији pTestInformatika, функција ord се применила код испитивања својства да ли је
опционо дугме CheckBox означено или не, и то на следећи начин:
ord(cbModem.Checked)
Уграђена функција ord, овде има улогу, да уколико је вредност у загради cbModem.Checked
истинита (True), то значи да је дугме опциони квадрат означено и функција даје резултат 1, а
уколико је неистина (False) то значи да дугме опциони квадрат није означено и функција даје
резултат 0.

Компонента (Bevel)

Ова компонента се користи као рам (оквир) чија је улога да визуелно групише компоненте на
форми. Није контејнерска компонента и над њом се не извршавају никакви догађаји. Налази се на
картици Additional под именом Bevel. Компонента има следећа важна својства:
 Shape – (облик) типа набрајања одређује врсту рама и
 Style – (стил) приказивање може бити утиснуто (bsLowered) или издигнуто (bsRaised).

Контејнерска компонента (Panel)

Компонента Panel представља површину на форми на коју се могу постављати друге компоненте.
Она je контејнерска компонента чија површина може да буде издигнута или утиснута. Може да
буде уоквирена правоугаоном спољашном и унутрашњом косином. Користи се у визуелном
програмирању за постављање палете алатки и за израду такозваних статусних панела. Често се
користи и као маска за уношење и приказивање података када се желе постићи визуелни ефекти.
Када се на форму поставе два или више панела истовремено, тада се компоненте могу груписати
по својим функционалностима. Користи се слично као и компонента GroupBox.

155
Панел може да заузме цео простор форме, или само неке делове, може да има ивице које делују
тродимензионално, може се скривати и поново појављивати када треба, може се померати по
форми и слично. Када се постави на форму Panel представља родитеља, и очекује се да се као деца
прикључују друге компоненте које се постављају на површину плоче. Деца компоненте су
саставни делови плоче и померањем плоче померају се и деца компоненте. На форму се поставља
са картице Standard, бирањем сличице за Panel.
Ова контејнерска компонента има сва својства наведена у Табели 3.2. осим својстава Text. Али
има и додатна следећа својства:
 BorderStyle – стил ивица с вредношћу bsSingle (једнострука) означава исцртавање оквира чије
су ивице једноструке линије, а вредност bsNone (ништа) означава одсуство оквира,
 BorderWidth – дебљина линије ивице,
 BevelWidth – дебљина оквира,
 BevelInner – унутрашњи изглед косина,
 BevelOuter – спољашна изглед косина.
Пример: uMetodeLB, pMetodeLB, fListBox
Креирати апликацију која ће на основу постојеће листе предмета у школи омогућити следеће
активности:
a) додавање нових елемената у постојећу листу, као што су називи предмета у школи,
б) пребацивање предмета из постојеће листе у компоненту Edit, а затим на другу листу за
предмете природних наука,
в) брисање из прве постојеће листе предмета који су пребачени у листу природних наука,
г) брисање свих елемената из прве постојеће листе предмета.
Процедура за решавање задатка:
1. За додавање назива предмета, поставити једну компоненту ListBox, а за пребацивање из ње
одабраних предмета поставити другу компоненту ListBox у коју ће се пребацивати. За прву
компоненту ListBox, која ће се користити за унос предмета као елемената, брисање појединих
елемената с листе и брисање целе листе, у својству Name уписати lbPredmeti. У својству
Sorted поставити вредност на True. За другу листу ListBox, у коју ће се пребацивати предмети
из природних наука из прве листе, у својству Name уписати lbPred2, а да би елементи били
сортирани, својство Sorted поставити на True.
2. У задатку се тражи да се приликом преноса из једне у другу листу, у поље компоненте Edit
уписује предмет који се пребацује и да се у ово поље могу уносити предмети који ће се
пребацивати у прву листу lbPredmeti. У ту сврху, на форму поставити компоненту Edit и у
својству Name уписати име epredmet.
3. За описивање листа и поља Edit поставити три компоненте Label. У својству Caption
поставити текст редом: LISTA PREDMETA, PRIRODNE NAUKE и PREDMET.
4. У задатку се тражи да се уносе нови предмети у прву листу, да се они могу пребацивати у другу
листу, да се из прве листе могу брисати поједини елементи и сви одједном. За те операције
поставити четири компоненте Button. У својству Name за њихова имена уписати редом:
bDodaj, bPrebaci, bBrisi, bBrissve, а у својство Caption редом уписати описе: Add, U predmet,
Delete и Clear.
5. Програмирати прво дугме за додавање новог елемента у постојећу листу предмета. Бирати
дугме bDodaj, активирати догађај OnClick и унети следећи програмски код:

156
procedure TfListBox.bDodajClick(Sender: TObject);
begin
lbPredmeti.Items.Add(epredmet.Text);
epredmet.Text:='';
end;
6. Програмирати друго дугме за пребацивање предмета из постојеће листе у нову листу а који
припадају природним наукама, при чему се тај предмет прво пребаци у Edit поље epredmet, а
затим у листу предмета са природним наукама. Бирати дугме bPrebaci, активирати догађај
OnClick и унети следећи програмски код:
procedure TfListBox.bPrebaciClick(Sender: TObject);
begin
epredmet.Text:=lbPredmeti.Items[lbPredmeti.ItemIndex];
lbPred2.Items.Add(epredmet.Text);
end;
7. Програмирати треће дугме за брисање предмета из постојеће листе lbPredmeti а који су
пребачени у другу листу са предметима природних наука lbPredmeti. Бирати дугме bBrisi,
активирати догађај OnClick и унети следећи програмски код:
procedure TfListBox.bBrisiClick(Sender: TObject);
begin
lbPredmeti.Items.Delete(lbPredmeti.ItemIndex);
epredmet.Text:='';
end;
Напомена: Могу се појединачно избрисати сви елементи из листе lbPredmeti.
8. Програмирати четврто дугме за брисање свих елемента из постојеће листе одједном. Бирати
дугме bBrissve, активирати догађај OnClick и унети следећи програмски код:
procedure TfListBox.bBrissveClick(Sender: TObject);
begin
lbPredmeti.Clear;
end;
9. Податке који се уносе у компоненти Edit за уношење предмета, контролисати тако да се не
дозволи да ништа није унето (да постоји празнина). Позиционирати се на компоненту
epredmet, у својству TabOrder поставити 0 како би то била прва компонента, активирати
догађај OnExit и унети следећи програмски код:
procedure TfListBox.epredmetExit(Sender: TObject);
begin
if epredmet.Text=''
then
begin
ShowMessage('Unesite naziv predmeta');
epredmet.SetFocus; epredmet.SelectAll;
end;
end;
На слици 7.22. приказана су четири теста апликације pMetodeLB.

157
Унос података у прву листу предмета Пребацивање природних предмета

Брисање природних предмета из листе Брисање целе листе

Слика 7.22. – Приказ тестирања примера апликације pMetodeLB

Компонента клизач(ScrollBar)

Компонента клизач (ScrollBar) се користи као самостална компонента за подешавање неких


бројчаних вредности у задатим границама или као саставни део других компоненти, на пример
образаца или разних оквира. Може се поставити у хоризонталан или вертикалан положај.
Клизач има три дугмета, две стрелице на крајевима, и дугме између њих. Клизач се може померати
нагоре и надоле само ако је у жижи, и то тако што се кликне мишем на означене стрелице.
Покретно дугме може се покренути и стрелицама на тастатури (лева, десна, горња и доња) или
дугмадима PgUp, PgDn, Home и End. Када је клизач у жижи, површина покретног дугмета
трепери. Положај покретног дугмета одређује тренутну вредност представљену клизачем. Најмања
вредност су крајњи леви и крајњи горњи положај, док су крајњи десни и крајњи доњи положај
највећа могућа вредност.
Клизач припада класном типу TScrollBar а као компонента ScrollBar се налази на картици
Standard.
Важна својства компоненте су:
 Kind – положај или врста клизача, може бити sbHorizontal и sbVertical,
 Min, Max – најмања и највећа целобројна вредност, може се подешавати,
 Position – тренутни положај који је целобројна вредност,
 SmallChange, LargeChange – износ мале или велике промене вредности постигнуте клизачем,
а одговарају малом односно великом помаку покретног дугмета.
Наведена својства могу се подешавати у фази дизајна апликације, али могу се мењати и у фази
извршавања апликације. Својство Position може променити и корисник.
Важнa методa компоненте ScrollBar je:

158
SetParams – подешава вредности својстава Min, Max и Position чије заглавље има следећи облик:
procedure SetParams (Nova pozicija, Min, Max:Integer);
Догађај клизачем OnScroll (приликом померања) активира методу чије је заглавље следећег
облика:
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer);
где су:
ScrollCode – (набројивог типа), начин померања покретног дугмета чије вредности су:
scLineUp, scLineDownn, scPageUp, scPageDown, scTrack, scPosition, scBottom, scTop и scEndScroll,
ScrollPos – тренутна позиција покретног дугмета.
Пример: uShapeboji, pShapeboji
Креирати апликацију са графичким облицима које може да црта компонента Shape на следећи
начин:
а) да се омогуће цртања свих облика: елипсе, правоугаоника, заобљеног правоугаоника, заобљеног
квадрата, квадрата и круга,
б) да се обоји позадина облика,
в) да се обоји оквир линија,
г) да се мења боја са функцијом RGB.
Процедура за решавање задатка:
1. Да би се исцртавали основни облици, на форму са картице Additional поставити компоненту
Shape.
2. На форму поставити четири компоненте Edit. У својству Name уписати имена редом: el, et, es и
ev, а у својства Text уписати вредност 0. У њих ће се уносити подаци за својства фигурe редом:
Left, Top, Width и Height.
3. Као описе компоненти Edit поставити четири компоненте StaticText. У својству Caption
уписати редом описе: Levo, Gore, Sirina и Visina.
4. За бирање облика који ће се цртати поставити компоненту RadioGroup. У својству Name
уписати име rgOblici а у својство Caption уписати OBLICI I BOJE. У својству Items после
активирања едитора унети ставке редом: ELIPSA, PRAVOUGAONIK, ZAOBLJEN
PRAVOUGAONIK, ZAOBLJEN KVADRAT, KVADRAT, KRUG, BOJA POZADINE и BOJA
OKVIRA.
5. За мењање боја на форму поставити компоненту ColorDialog са картице Dialogs.
6. За подешавање боја у функцији RGB поставити три компоненте ScrollBar: једна за црвену,
друга за зелену и трећа за плаву боју. У свакој од њих променити својство Max на 255 зато што
су то максималне вредности за функцију RGB које се односе на боје.
7. Као описе сваке компоненте ScrollBar поставити три компоненте StaticText. У својству
Caption уписати редом описе: R, G, и B. Додатно за компоненту описану као R у прозору за
подешавање фонта подесити да својство Style буде Bold, својствo Size 14 и својство Color Red.
За компоненту описану као G, исто као и претходна само у својство Color Green, а за
компоненту описану као B, својство Color Blue.
8. Да се прикажу бројчане вредности боја у функцији RGB, поставити три компоненте Edit.
9. За подешавање облика поставити две компоненте клизач ScrollBar. Прва нека буде као
хоризонтални клизач у дну форме, те за њу у својству Align одабарати alBottom, а у својству
Kind одабарати sbHorizontal. Друга нека буде као вертикални клизач уз десну ивицу форме, те

159
за њу у својству Align одабарати alRight, а у својству Kind одабарати sbVertical. За обе
компоненте својство Min поставити на вредност 1 а својство Max на вредност 150.
10. Да се прикажу бројчане вредности хоризонталног и вертикалног клизача, поставити две
компоненте Edit.
11. За програмирање према постављеном задатку поставити дугме Button. У својству Name
уписати bRadi, а у својству Caption опис OBLICI. Активирати догађај OnClick и унети
следећи програмски код:
procedure TForm1.bRadiClick(Sender: TObject);
begin
Shape1.Left:=StrToInt(el.Text); Shape1.Top:=StrToInt(et.Text);
Shape1.Width:=StrToInt(es.Text); Shape1.Height:=StrToInt(ev.Text);
case rgOblici.ItemIndex of
0: Shape1.Shape:=stEllipse;
1: Shape1.Shape:=stRectangle;
2: Shape1.Shape:=stRoundRect;
3: Shape1.Shape:=stRoundSquare;
4: Shape1.Shape:=stSquare;
5: Shape1.Shape:=stCircle;
6: if ColorDialog1.Execute
then Shape1.Brush.Color:=ColorDialog1.Color;
7: if ColorDialog1.Execute
then
begin
Shape1.Pen.Color:=ColorDialog1.Color; Shape1.Pen.Width:=6;
end;
end;
end;
12. Да би се подешавале боје помоћу компоненти ScrollBar-а, означити све три компоненте
одједном, активирати догађај OnChangе и унети следећи програмски код:
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
Shape1.Brush.Color:=RGB(ScrollBar1.Position,ScrollBar2.Position,ScrollBar3.Position);
Edit1.Text:=IntTostr(ScrollBar1.Position);
Edit2.Text:=IntTostr(ScrollBar2.Position);
Edit3.Text:=IntTostr(ScrollBar3.Position);
end;
13. Да би се подешавала ширина фигуре помоћу компоненти ScrollBar-а, означити хоризонталну
компоненту клизач, активирати догађај OnChangе и унети програмски код:
procedure TForm1.ScrollBar4Change(Sender: TObject);
begin
Shape1.Width:=ScrollBar4.Position*3;
Edit4.Text:=IntTostr(ScrollBar4.Position);
end;
14. Да би се подешавала висина фигуре помоћу компоненти ScrollBar-а, означити вертикалну
компоненту клизач, активирати догађај OnChangе и унети следећи програмски код:
procedure TForm1.ScrollBar5Change(Sender: TObject);
begin

160
Shape1.Height:=ScrollBar5.Position*2;
Edit5.Text:=IntTostr(ScrollBar5.Position);
end;
Напомена: Догађај OnChange се користи када се на објекту (компоненти) врши нека његова
промена која проузрокује ново стање објекта.
На слици 7.23. приказани су неки од тестова апликације pShapeboji.

Нацртан квадрат где је потом Нацртан круг где је потом постављена


постављена боја позадине па боја оквира боја оквира, а затим обојена позадина

Слика 7.23. – Приказ тестирања примера апликације pShapeboji


Напомена: Компонента ScrollBar се у овом примеру апликације користила за одређивање
бројчане вредности када се клизач помера, а те вредности су се додељивале у функцији RGB
одређеним бојама (R-црвена, G-зелена и B-плава). Својство Position компоненте ScrollBar је
позиција на којој се налази клизач. Тако је на тесту где је нацртан круг, вредност за R=200, за
G=132 и за B=213. Резултат је љубичаста боја у приказаној нијанси. Нека друга комбинација дала
би другу боју или неку другу нијансу.
Пример: uLopta, pLopta, fLopta
Креирати апликацију са лоптом односно кругом који се на екрану понаша на следећи начин:
а) почиње кретање горе доле
б) зауставља се
в) продужава са кретањем
г) убрзава кретање
д) успорава кретање
За решење задатка користити компоненте Shape за круг и Timer који ће ову динамику регулисати.
Процедура за решавање задатка:
1. На форму поставити две компоненте Panel. Једну за дугмад која ће регулисати акције које
треба да се изврше и другу за површину по којој ће се кретати лопта. У првом панелу за дугмад:
као својство Caption уписати LOPTA, за својство Align бирати alTop, за својство BevelInner
бирати bvNone, за својство BevelOuter бирати bvRaised, за својство BevelWidth бирати 1 и за
својство Color бирати clWhite. У другом панелу за површину кретања лопте: својство Caption
испразнити, за својство Align бирати alClient, за својство BevelInner бирати bvLowered, за
својство BevelOuter бирати bvRaised, за својство BevelWidth бирати 10 и за својство Color
бирати $00FF8000.

161
2. На панел за дугмад поставити шест дугмади Button. У својству Name уписати редом: bKreni,
bStani, bProduzi, bUbrzaj, bUspori и bOff. У својству Caption уписати редом: KRENI, STANI,
PRODUZI, UBRZAJ, USPORI и OFF.
3. На панел за површину по којој ће се лопта кретати, поставити компоненту Shape и у својству
Name уписати име shLopta, у својству Brush.Color бирати clRed, у својству Shape бирати
stCircle, у својству Pen.Color бирати clYellow и у својству Pen.Width уписати вредност 5.
4. На панел за површину по којој ће се лопта кретати, поставити компоненту Timer и у својству
Name уписати име tmSat. У својству Enable бирати False, а у својству Intеrval уписати 500.
5. Како ће се у методама користити неке променљиве, оне се у сектору за декларисање јавних
променљивих var унутар програмске јединице uLopta, испод декларације fLopta: TfLopta
морају декларисати на следећи начин:
xsmer,ysmer,korak:integer;
1. Да се програмира дугме bKreni, означити га, активирати догађај OnClick и унети следећи
програмски код:
procedure TfLopta.bKreniClick(Sender: TObject);
begin
ShLopta.Left:=0; ShLopta.Top:=0;
xsmer:=1; ysmer:=1; Korak:=10;
tmSat.Interval:=100; tmSat.Enabled:=True;
end;
1. Да се програмира дугме bStani, означити га, активирати догађај OnClick и унети следећи
програмски код:
procedure TfLopta.bStaniClick(Sender: TObject);
begin
tmSat.Enabled:=false;
end;
1. Да се програмира дугме bProduzi, означити га, активирати догађај OnClick и унети следећи
програмски код:
procedure TfLopta.bProduziClick(Sender: TObject);
begin
tmSat.Enabled:=true;
end;
1. Да се програмира дугме bUbrzaj, означити га, активирати догађај OnClick и унети следећи
програмски код:
procedure TfLopta.bUbrzajClick(Sender: TObject);
begin
tmSat.Interval:= tmSat.Interval-10;
if tmSat.Interval < 10 then tmSat.Interval:=10;
end;
10. Да се програмира дугме bUspori, означити га, активирати догађај OnClick и унети следећи
програмски код:
procedure TfLopta.bUsporiClick(Sender: TObject);
begin
tmSat.Interval:= tmSat.Interval+50;
if tmSat.Interval > 1000 then tmSat.Interval:=1000;
end;

162
11. Да се програмира догађај за покретање рада компоненте Timer са именом Sat, означити
компоненту, активирати догађај OnTimer и унети следећи програмски код:
procedure TfLopta.tmSatTimer(Sender: TObject);
begin
ShLopta.Left:=ShLopta.Left+ xsmer*korak;
ShLopta.Top:=ShLopta.Top+ysmer*korak;
if (ShLopta.Left <0) or (ShLopta.Left>Panel2.Width-ShLopta.Width)
then xsmer:=- xsmer;
if (ShLopta.Top <0) or (ShLopta.Top >Panel2.Height-ShLopta.Height)
then ysmer:=-ysmer;
end;
Тестирати апликацију pLopta, при чему би требало да се добије резултат приказан на слици 7.24, а
после притиснутог дугмета KRENI а затим притиска дугмета STANI. Оставља се ученику да
тестира и остале акције са лоптицом.

Прво је активирано дугме KRENI а затим дугме STANI.

Слика 7.24. – Приказ тестирања примера апликације pLopta


Пример: uSemafor, pSemafor
Креирати апликацију која симулира рад семафора.
Да бисмо решили овај задатак, потребне су нам компоненте Shape и Timer, које ће симулирати
рад семафора.
Процедура за решавање задатка:
1. На форму поставити прво две компоненте Shape које ће бити конструкција семафора. За прву
компоненту подесити следећа својства: Left вредност 160, Top вредност 24, Height вредност
233, Width вредност 89, Brush.Color изабрати clMedGrey и Shape изабрати stRectangle. За
другу компоненту подесити следећа својства: Left вредност 184, Top вредност 256, Height
вредност 249, Width вредност 41, Brush.Color изабрати clMedGrey и Shape изабрати
stRectangle.
2. Затим поставити три компоненте Shape, а то ће бити кругови разних боја. Прво поставити једну
компоненту Shape. У својству Name доделити јој име Crveno, у својству Shape изабрати
stCircle, и у својству Brush.Color изабрати clRed. Поставити je на већ одговарајуће место. Сада
ископирати ту Shape компоненту, из контекстног менија одабрати прво Edit па Copy, а онда
Edit па Paste. Добијеној новој компоненти Shape у својство Name доделити име Zuto, и
својство Brush.Color променити у clYellow. Још једном направити контекстни мени па опет
Edit па Paste да се добије трећа компонента Shape. Добијеној новој компоненти Shape у

163
својство Name доделити име Zeleno, и својство Brush.Color променити у clGreen. Све кругове
распоредити као на семафору.
3. На панел за површину по којој ће се лопта кретати, поставити компоненту Timer.
4. За покретање семафора, за заустављање и излазак из програма, поставити три дугмета Button.
У својству Name уписати редом имена: bRadi, bStani и bOff, а у својству Caption уписати
описе: RADI, STANI и OFF.
5. Како ће се у методама користити променљива за заустављање и покретање семафора, она се у
сектору јавних променљивих var програмске јединице uSemafor мора декларисати на следећи
начин:
stanje:integer;
1. Да се програмира догађај OnTimer компоненте Timer, позиционирати се на ту компоненту,
активирати догађај OnTimer и унети следећи програмски код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
stanje:=stanje+1;
if stanje>4 then stanje:=1;
if stanje=1
then
begin
timer1.Interval:=4000; Crveno.Brush.Color:=clRed;
Zuto.Brush.Color:=cl3DLight; Zeleno.Brush.Color:=cl3DLight;
end;
if stanje=2
then
begin
timer1.Interval:=2500; Crveno.Brush.Color:=clRed;
Zuto.Brush.Color:=clYellow; Zeleno.Brush.Color:=cl3DLight;
end;
if stanje=3
then
begin
timer1.Interval:=4000; Crveno.Brush.Color:=cl3DLight;
Zuto.Brush.Color:=cl3DLight; Zeleno.Brush.Color:=clGreen;
end;
if stanje=4
then
begin
timer1.Interval:=2500; Crveno.Brush.Color:=cl3DLight;
Zuto.Brush.Color:=clYellow; Zeleno.Brush.Color:=cl3DLight;
end;
end;
2. Да се програмира дугме bRadi, означити га, активирати догађај OnClick и унети следећи
програмски код:
procedure TForm1.bRadiClick(Sender: TObject);
begin
stanje:=0; Timer1.Enabled:=True;
end;

164
3. Да се програмира дугме bStani, означити га, активирати догађај OnClick и унети следећи
програмски код:
procedure TForm1.bStaniClick(Sender: TObject);
begin
Timer1.Enabled:=False;
end;
Тестирати апликацију pSemafor, при чему би требало да се добије резултат као на слици 7.25.
Упаљено црвено Упаљено црвено и жуто Упаљено зелено

Слика 7.25. – Приказ тестирања примера апликације pSemafor

Контролна питања:
1. Шта се подразумева под разгранатом програмском структуром?
2. Које наредбе гранања су на располагању у Deplhi окружењу?
3. Који облици наредбе if постоје?
4. Како се могу међусобно угнежђавати наредбе if?
5. Каква је улога својства Visible?
6. Шта је то параметар sender и за шта се користи?
7. Како се примењује функција за генерисање случајних бројева (random)?
8. Како се креира дијалошка порука у апликацији?
9. За шта се користи компонента DateTimePicker?
10. Које се функције користе у раду са датумима?
11. Која наредба се користи у случају вишеструког гранања?
12. Шта је то селектор у наредби case?
13. Шта су то случајеви избора у наредби case?
14. Може ли се угнежђавати наредба case једна унутар дуге?
15. Може ли се наредба if наћи у наредби case?
16. Које контроле (компоненте) се користе за примену гранања у програму?
17. Које контејнерске контроле (компоненте) се користе у пројектовању
апликације?
18. Која су својства и догађаји контролног дугмета опциони квадрат (CheckBox)?
19. Која су својства и догађаји контролног дугмета RadioButton?
20. Која су својства и догађаји контејнерске компоненте RadioGroup?
21. Која су својства и догађаји контејнерске компоненте GroupBox?
22. Која су својства и догађаји компоненте Bevel?
23. Која су својства и догађаји контејнерске компоненте Panel?
24. Kоја су својства и догађаји компоненте SpinEdit?
25. Која су својства и догађаји компоненте ScrollBar?
26. Која су својства и догађаји компоненте Timer? 165

You might also like