Treća godina Programiranje 2014 УВОД ПРОГРАМИРАЊЕ. Raša
|
|
- Φιλομήλ Αγγελόπουλος
- 7 χρόνια πριν
- Προβολές:
Transcript
1 УВОД У ПРОГРАМИРАЊЕ
2 Садржај 1. Решавање проблема помоћу рачунара Основи алгоритмизације Трансформација проблема на облик погодан за решавање на рачунару Програмски језици и њихова синтакса и семантика Питања на која треба обратити пажњу Програми засновани на прозорима Основне карактеристике програма заснованих на прозорима Елементи графичког корисничког интерфејса (Graphical User Interface) Програми руковођени догађајима Питања на која треба обратити пажњу Увод у развојно окружење програмског језика Почетак рада и управљање развојним окружењем Празан пројекат Чување и отварање пројекта Форма и подешавање њених својстава Додавање компоненти форми Компонента у жижи Једноставне компоненте Својства компоненти и њихово подешавање Догађаји компоненти и обрада догађаја Питања на која треба обратити пажњу Типови података Подела типова података Целобројни тип (Integer) Реални тип (Rеаl) Логички тип (Boolean) Знаковни тип (Char) Низовни тип Стринг тип Набројиви тип и интервални тип Скуповни тип Класа и методе класе основни појмови Питања на која треба обратити пажњу
3 5. Наредбе и изрази Синтакса и семантика израза Аритметички и логички изрази Наредбе програмског језика Конверзија типова података Уношење и приказивање података Алгоритам размене вредности две променљиве Програмирање израчунавања по једноставним математичким формулама Питања на која треба обратити пажњу Наредбе гранања Синтакса наредбе If Синтакса наредбе Case Алгоритми са гранањем Питања на која треба обратити пажњу Компоненте избора и контејнерске компоненте Компоненте избора Контејнерске компоненте Наредбе за организацију циклуса Синтакса наредби за организацију циклуса Примена наредби break и continue у циклусима Неки алгоритми са циклусима Питања на која треба обратити пажњу Опис класе Опис методе класе (функције и процедуре) Питања на која треба обратити пажњу Тип низа Једнодимензионални низови Основне операције са низовима Дводимензионални низови Алгоритми за израчунавања и трансформације на табели и њеним деловима Визуелна компонента за табеларни приказ текста Литература
4 Treća godina Programiranje Решавање проблема помоћу рачунара Рачунари се, у данашње време, могу применити у готово свим областима људског деловања и од њих се очекује да решавају све проблеме на које се може наићи. Међутим, потребно је знати да рачунар сам не може решити ни један (и најједноставнији) проблем. Он само извршава низ инструкција које му корисник задаје. Према томе, само ако корисник разуме проблем и познаје пут за решавање тог проблема до најситнијих детаља, он ће бити у стању да тај пут представи преко низа инструкција које рачунар може да разуме и прихвати. Тек тада можемо очекивати од рачунара да тај низ инструкција веома брзо и тачно изврши и да дође до резултата који су потребни. То значи да рачунар не олакшава кориснику рад на решавању проблема, већ само извршава задати програм и у веома кратком времену даје одговарајуће резултате. Када се процес решавања неког проблема спроводи без рачунара, о сваком кораку се мисли непосредно у тренутку када тај корак треба да се спроведе, тј. када покушавамо да решимо неки проблем ми не знамо унапред шта ћемо све радити док не дођемо до решења, већ одлучујемо само о првом следећем кораку. Међутим, када се за решавање проблема користи рачунар, тада цео низ корака које тај процес обухвата мора бити прецизно одређен и унапред задат са свим могућностима које могу да се појаве у току извршавања у зависности од задатих почетних вредности. Тај низ корака мора бити прецизно дефинисан у облику веза и логичких услова. То значи да се, пре него што се приступи коришћењу рачунара за решавање неког проблема, мора написати програм. Са написаним програмом и улазним подацима, који одређују вредности низа параметара који се јављају у програму, рачунар може да добије резултате задатка који се решава Основи алгоритмизације Појам програмирања подразумева дуг процес размишљања о задатку. У том процесу решавања датог проблема користимо познате методе и правила или сами одређујемо поступке решења. Када се заврши мисаони процес решавања проблема, програм је готов. Сада је процес записивања програма само нужна формалност коју и не мора да обави сам програмер. Довољно је да се идеја решења запише у погодном облику да би на основу тог записа нека, за то квалификована особа, кодирала програм - уписала га у меморију рачунара и извршила. Да би се идејно решење проблема могло записати тако да га свако за то квалификован, може разумети морају се поштовати нека прописана и формализована правила понашања. Тај коначан скуп строго формулисаних правила којима је одређен низ радњи за решавање одређеног проблема чини алгоритам. Алгоритам је у математику увео арапски математичар Мухамед Ал Хорезми (Abu Abdullah Muhammad bin Musa al-khwarizmi живео око 825. године нове ере). Он је написао је књигу Ал Хорезми о индијској вештини рачунања где у арапску математику уводи индијске цифре и децимални бројни систем. У књизи су прецизно, корак по корак, дефинисане све четири основне математичке операције (сабирање, одузимање, множење и дељење) у облику упутстава која се састоје од елементарних корака. Када је касније књига преведена на латински добила је назив Algoritmi de numero indorum. Од овог лошег латинског превода презимена арапског математичара и потиче сама реч алгоритам, која је дуго затим означавала поступак за рачунање са децималним бројним системом (и индијским, односно, арапским цифрама) и прецизан начин описивања пута до решења проблема у математици. Даљим развојем науке, алгоритам је постао један од основних појмова како у математици тако и у рачунарству. Алгоритам је коначан низ једноставних корака којим се описује поступак решавања одређеног реалног проблема, али такав да се, после коначно много времена, поступак завршава. Многе реалне ситуације у животу одвијају се по тачно одређеним корацима тако да можемо рећи да су алгоритми саставни део свакодневног живота. Постоји релативно прецизан поступак по коме покрећемо аутомобил, телефонирамо, прелазимо улицу, кувамо кафу Чак, можемо рећи да се и сам живот одвија по неким, мање или више строгим, правилима. Добар пример алгоритма је сваки кулинарски рецепт; у њему јасно разликујемо шта је улаз (потребни састојци), шта је обрада (прецизно описан поступак за кување) и шта је излаз (готово јело). Алгоритам можемо у најопштијим цртама приказати шемом: Постоји много начина да се алгоритам прецизније дефинише, али за нас је довољна и једна оваква, не престрога, дефиниција: Алгоритам је повезани низ елементарних правила, односно, алгоритамских корака у којима се улазне величине поступно трансформишу све док се не добије коначно решење. Сваки алгоритам красе следеће карактеристике: одређеност - сваки алгоритамски корак мора да буде прецизно и једнозначно дефинисан, детерминисаност - вредност која се добија после извршавања сваког корака једнозначно је одређена вредностима из претходног корака коначност - алгоритам се мора завршити после коначно много алгоритамских корака, масовност - алгоритам се прави тако да се може применити за решавање читаве групе сродних проблема без обзира на различите полазне величине, 5
5 ефикасност - алгоритам треба да доведе до решења за што краће време и у што мањем броју алгоритамских корака. Алгоритам је употребљив ако се његовом применом добија резултат у коначном разумном времену. Алгоритам који би бирао потез играча шаха тако што ће испитати све могуће последице потеза, захтевао би милијарде година на најбржем рачунару. Поступци израде алгоритама нису једнозначни, иначе би постојали генератори алгоритама који сами решавају све проблеме. Самим тим, алгоритмизација проблема захтева и велику дозу креативности. У пракси алгоритми се на рачунару представљају изворним кодом (source) неког вишег програмског језика. Програмски језици имају веома строга правила писања инструкција и дефинисања података која, код различитих програмских језика могу бити мање или више слична, али и битно различита. Да би се логичко одвијање процеса решавања проблема лакше сагледало, алгоритам се представља дијаграмом тока, тј. графичком алгоритамском шемом. Према форми веза у шеми алгоритми могу бити: прост линијски алгоритам - сваки алгоритамски корак се остварује тачно једном од горе на доле, разгранати линијски алгоритам - сваки алгоритамски корак се остварује највише једном, тј. има и корака који се неће остваривати за дате полазне величине, циклични алгоритам - постоје алгоритамски кораци који се остварују више пута, селективни алгоритам - у зависности од датог критеријума бирају се следећи алгоритамски кораци. Међутим, код решавања неког проблема, програмер нема пред собом обавезу да направи један од строго одређених типова алгоритама. Најчешће се дешава да се за решење проблема морају употребити различите, готово све поменуте структуре алгоритама у појединим сегментима програма, зато ову поделу алгоритама треба схватити само као теоријску Трансформација проблема на облик погодан за решавање на рачунару Да бисмо решили неки проблем коришћењем рачунара, неопходно је креирати програм у неком програмском језику. Тај процес је комплексан и у њему можемо издвојити следеће фазе: Поставка проблема. Проблем који се решава треба прецизно и потпуно описати на природном језику. То ради корисник коме је намењен програм. Да не би дошло до грешке при формулисању захтева пожељно је да наручилац буде рачунарски описмењен што неретко није случај, зато се већ у овом кораку мора остварити јака сарадња са програмерима. Јасно се одређује циљ и основна намена програма, анализирају се постојеће информације и врши се избор неопходних почетних информација, описују се сви излазни подаци. Анализа проблема. У овој фази прецизно се дефинишу улазни и излазни подаци, ограничења њихових вредности и дефинишу све везе између података. У овој фази треба детаљно поставити задатак, уочити и упознати све елементе значајне за решавање задатка. Потребно је критички оценити значај свих елемената и изабрати оне који су битни за решавање постављеног задатка. Дефинисање проблема је у многим случајевима веома једноставно, међутим, често се догађа да је пут до дефиниције проблема веома дуг. Од тога како је проблем дефинисан веома зависи какве ће се тешкоће појавити у конструисању алгоритма и каква ће бити употребљивост програма. Резултат ове фазе је формалан опис проблема, израда математичког модела који се може реализовати на рачунару који ће представљати скелет програма. Ту спада, на пример, избор математичке методе која је примерена датом проблему. Приликом избора методе треба имати на уму да проблем решавамо на рачунару, а не ручно. Тако се, имајући у виду велику брзину рачунара у извршавању неких врста операција, можемо радије одлучити за поступак који захтева велики број врло простијих операција, него за елегантнију и бржу методу која се састоји од интелигентнијих операција.. Разрада алгоритма. У овој фази се дефинише начин на који се од почетних, улазних података долази до тражених, излазних резултата. Већина проблема може се решити на више начина, зато треба проанализирати све начине и изабрати онај који је оптималан. Сложеност решења проблема можемо посматрати са аспекта броја потребних операција (времена потребног за извршавање алгоритма) и са аспекта потребних меморијских ресурса да се алгоритам изврши (просторна сложеност алгоритма). Доказ о коректности изабраног поступка за решавање проблема неопходно је прецизно извести. О овим аспектима треба посебно водити рачуна при решавању сложених проблема, док их код једноставних проблема занемарујемо. Пројектовање опште структуре програма. У овој фази врши се избор програмског језика. Разматра се цео проблем и дели се у логичке целине; свака целина се даље дели у зависности од њене сложености. Прецизно се дефинише начин чувања информација, тј. дефинише се структура података. Кодирање. У овој фази описују се, у неком програмском језику, подаци и поступак решавања проблема, који су дефинисани у претходним фазама, то је запис алгоритма у облику прихватљивом за рачунар. Овако записан алгоритам назива се програм. Програм записан у неком програмском језику често се зове код, зато се 6
6 ова фаза и назива кодирање. Програм може бити записан на машинском, симболичком или неком вишем програмском језику. Писање програма представља фазу реализације, јер програм оспособљава рачунар за решавање одређеног задатка. Ако смо у претходним фазама прецизно разрадили алгоритам, структуру програма и структуру података, ова фаза је релативно једноставна за извођење. Фаза превођења, извршавања и тестирања програма. Подсетимо се да се на рачунару може извршавати само програм који је написан помоћу бинарних цифара (на машинском језику). Зато је потребно програм написан на програмском језику вишег ниво превести на машински језик; превођење се врши помоћу посебних програма: компајлера, односно, интерпретера. Да би се програм извршавао, потребно је формирати извршну верзију (exe верзију). То се постиже помоћу специфичних програмских алата који се разликују од језика до језика (повезивачи, билдери). Врло често су фаза превођења и фаза прављења извршног фајла обједињене. Тестирањем програма треба проверити да ли програм у потпуности решава постављени задатак. То је врло важна фаза у којој треба открити евентуално скривене грешке. Ово је крупан проблем у програмирању. Обично се дешава да програм није потпуно исправан, па је потребно пронаћи грешке. На неке грешке нас упозорава рачунар тиме што за програм јавља дијагностичку поруку која садржи листу грешака. Када отклонимо те грешке то још увек не значи да је програм исправан. Програм се тестира тако што се извршава за одабране скупове улазних величина. Примерима можемо показати да програм није исправан, али не можемо показати да је исправан. Иако је рачунар идеално средство за тестирање, исправност програма не можемо доказивати тако што ћемо програм извршити за сваки могући скуп улазних величина. За велики број програма овакво тестирање би трајало годинама. Зато се проверавање врши са подацима за тестирање које треба одабрати тако да се без већих напора могу предвидети исправни резултати и којима треба да обухватимо све могуће ситуације, свакако и оне кад постављени проблем нема решења. Ако је програм и даље неисправан на то ће нас упозорити неочекивани резултати. Овај поступак може бити веома дуготрајан и да од програмера захтева много спретности и досетљивости. По потреби се враћамо на претходне фазе. Израда документације. У документацији програма описује се шта програм ради (поставка задатка и алгоритам за његово решавање), дају се упутства како се користи (начин задавања улазних величина и издавања резултата), детаљније се описује алгоритам и објашњавају поједине формуле и поступци када је у питању решавање сложенијих проблема и слично. Документацију никако не треба започињати када је програм написан, већ је треба писати током израде програма, али је свакако треба допунити на крају када је програм комплетно завршен. Детаљна документација о програму омогућава лако коришћење програма, као и евентуалне касније промене у програму. Одржавање програма. Током коришћења програма могу се уочити неке грешке, које се морају отклонити. Понекад треба извршити неке промене у програму услед нових околности. Ако је програм читко написан и ако има добру документацију, онда је ова фаза једноставна, како за саме ауторе програма, тако и за друге програмере. У супротном многим програмерима је лакше да напишу нови програм него да преправљају већ постојећи. У овој фази долази и до проширивања програма додавањем нових функционалности. Када се развија велики пројекат, све претходно наведене фазе су једнако важне. Оспособљавање програмера за успешно реализовање великих пројеката је дуготрајан процес. У едукацији полазимо од једноставних примера ка сложенијим. У овом процесу проблеми које решавамо су једноставни па су све фазе, осим фазе разраде алгоритма, једноставне Програмски језици и њихова синтакса и семантика. Језик је средство комуницирања у процесу размене и обраде информација и података. Постоје природни и вештачки језици. Природни језици су језици људи. Иако су врло богати могућностима изражавања, ови језици су практично неупотребљиви у комуникацији на релацијама човек - машина или машина - машина, бар у данашњим условима. Да би се остварила оваква комуникација приступило се конструкцији вештачких језика. Вештачки језици су једнако приступачни и човеку и машини. У зависности од области и начина примене, конструисани су бројни вештачки језици. Програмски језици су подврста ових језика. Програмски језици су вештачки језици одређени помоћу изабраног скупа симбола. У њима се јављају и неки специфични знаци у односу на језичке конструкције природних језика. Елементарне конструкције програмског језика имају одређена значења, али се у програму никада не јављају као самостални елементи који утичу на рад рачунара. То су константе, подаци, променљиве, низови и изрази. Повезани низ симбола и елементарних конструкција који има одређено значење, а може да представља самосталну целину у програму, односно, може да проузрокује акцију на рачунару је сложена конструкција програмског језика. Такве конструкције су наредбе, програмски редови, потпрограми и програми. Правила помоћу којих се формулишу елементарне и сложене конструкције програмског језика чине његову граматику. Правила помоћу којих се гради и проверава коректност језичких конструкција чине синтаксу програмског језика. Програмски језици су тако конструисани да рачунар може да уочава и упозорава на синтаксне, формалне грешке. Значење појединих језичких конструкција проучава семантика. Састављање програма, исписивање програмских инструкција, тј. кодирање програма врши се на основу алгоритма. Семантичке грешке настају као последица грешке у алгоритму. Ову врсту грешака рачунар не може уочити. Синтакса се односи на начине на који појединачни симболи могу да креирају исправне реченице језика (или програме). Синтакса дефинише формалне релације између елемената језика, тиме пружајући структурне описе различитих израза који чине исправне ниске језика. Синтакса се бави само формом и структуром 7
7 симбола језика без било каквих разматрања у вези са њиховим значењем. За разлику од природних језика, сваки програмски језик има скуп строго дефинисаних правила којима се описује поступак писања програма. Пошто се ради о језику за комуникацију са рачунаром и најмања двосмисленост доводи до грешака. Синтакса програмског језика се описује помоћу метајезика. Синтаксне дефиниције се често задају помоћу специјалне металингвистичке симболике која је позната под именом Проширени Бекус-Науров запис (Extended Backus- Naur Form) или скраћено EBNF. EBNF омогућава врло прецизан и компактан опис елементарних језика, коришћењем неколико симбола специјалне намене метасимбола. Најпростији појмови су симболи и резервисане речи језика. Они се називају терминални симболи или терминали и пишу се између наводника. Сви остали појмови, нетерминали, се постепено изводе из терминалних помоћу специјалних металингвистичких формула и стављају се између угластих заграда. За опис синтаксе језика, због веће прегледности, користе се и синтаксни дијаграми. Они се састоје из кружића, овалних симбола и правоугаоника повезаних у одређеном поретку. Кружићи или овали означавају терминале. Правоугаоници означавају конструкције које се накнадно дефинишу (нетерминале), тј. које се ослањају на друге синтаксне дијаграме. Између EBNF и синтаксних дијаграма постоји веза која омогућава представљање појмова који су записани у EBNF преко синтаксних дијаграма и обрнуто. Семантика придружује значење синтаксно исправним нискама језика. За природне језике, ово значи повезивање реченица са неким специфичним објектима, мислима и осећањима. За програмске језике, семантика описује понашање рачунара током извршавања програма написаног на неком језику. Ово понашање може се описати релацијама између улаза и излаза програма или корак-по-корак објашњењем како ће се програм извршавати на стварној или апстрактној машини. Класификација програмских језика Према степену зависности од рачунара програмски језици се деле на: машински зависне и машински независне језике. Машински зависни језици се деле на: машинске и машински орјентисане језике. Машински језици су језици најнижег нивоа. По структури су најближи машини. Толико су зависни од типа рачунара за који су прављени да се не могу применити на било који други тип рачунара. Главна предност ових језика у односу на све друге је брзина извршавања програма. Нема губљења времена на било каква превођења. Оног тренутка када је програм у меморији рачунара он се и извршава. Зато се овај језик користио за писање неопходних системских програма. Машински орјентисани језици се деле на: симболичке и макро језике. У симболичким језицима се поједине групе симбола машинског језика замењују мнемоничким симболом, па су зато разумљивији, али још јако зависе од рачунара за који су прављени. Брзина извршења програма се смањила, у односу на машинске језике, јер се програм најпре преводи на машински језик, па тек онда извршава. Међутим, још се ту ради о завидној брзини извршења програма. Због тога се ови језици користе за писање неких системских програма. Макро језици су највиши ниво машински зависних језика. Код ових језика се група команди симболичког језика замењује једном макро командом. Зато се програми на макро језицима пишу много једноставније него на симболичким, разумљивији су и краћи, али још увек у великој мери зависе од рачунара за који су прављени. Ови језици се, углавном, користе за писање системских програма. Машински независни језици се деле на: процедуралне језике и проблемски оријентисане језике. Процедурални језици подразумевају најпре алгоритамско решавање проблема, а затим формално исписивање програма. Програми писани овим језицима релативно једноставно могу да се пренесу са једног типа рачунара на други. Проблемски оријентисани језици су језици највишег нивоа. Код оваквих језика програмер треба само да назначи проблем и пут за његово решавање, а програм генератор даље преузима посао формирања алгоритамског решења проблема и формалног исписа програма. Због овакве своје структуре, ови језици су за сада незграпни, троше пуно времена и меморије и прилично су спори. Ипак, то су језици будућности и са даљим развојем науке и технике ће се све више усавршавати. Пошто је написан неки програм, природно је да се он изврши. Да би се неки програм могао извршити, све наредбе се морају превести на машински језик. Само се програми на машинском језику могу извршити непосредно, без превођења. Посао превођења наредби неког програмског језика на машински језик обављају преводиоци. То су посебни програми који повезују програмске конструкције језика са командама машинског језика. Према нивоу језика са кога се програм преводи преводиоце делимо на: 8
8 асемблере, макроасемблере, компилаторе и генераторе. Симболички језици су асемблери, макро језици су макроасемблери, процедурално орјентисани језици су компилатори, а проблемски орјентисани језици су генератори. Процес превођења и процес извршавања програма су два битна процеса са којима се сусрећемо приликом рада на неком програму. Они могу бити временски раздвојени или повезани. Према тој временској карактеристици преводиоци се деле на компајлере и интерпретаторе. Код компајлера процес превођења наредби програма је потпуно временски раздвојен од процеса извршења. Код интерпретатора се у процесу превођења свака преведена наредба изврши, а затим се прелази на следећу наредбу. Компајлерског типа су програмски језици: fortran - FORmula TRANslation system, намењен је пре свега решавању проблема у области математичких наука и технике; први важнији алгоритамски језик у историји програмирања; дизајнирао га је тим програмера америчке компаније ИБМ, године, на чијем је челу био Бекус (John Backus); дизајниран је са идејом да служи потребама научника и научних израчунавања са реалним бројевима (бројевима са покретним зарезом) као и скуповима реалних бројева организованих у један или више низова; cobol - COmmon Business Oriented Language, један од најстаријих виших програмски језик који су и данас у употреби; углавном служи за писање бизнис и финансијских апликација и као подршка административним системима у компанијама и владама; најновија спецификација, кобол 2002, садржи механизме објектно-оријентисаног програмирања и многе друге модерне могућности; algol - ALGOritmic Language, за решавање математичких и научно-техничких проблема; дизајнирао га је комитет америчких и европских научника рачунарства за сврху објављивање алгоритама, али и за рачунарска израчунавања, између и године; алгол поседује рекурзивне потпрограме, односно, процедуре које могу саме себе позивати приликом решавања задатог проблема, редукујући га на мањи проблем било које врсте; новост у алголу је блок структура, где је програм компонован од блокова и може да садржи и податке и инструкције које имају исту структуру као и сам програм; блок структура је врло брзо постала стандард за конструисање масивних програма од малих компоненти; lisp - LISt Processing, прилагођен симболичкој обради; развио га је и имплементирао Макарти (John McCarthy) око године, базирајући га на математичкој теорији рекурзивних функција; програм развијен у лиспу је функција примењена на податке, а не секвенца процедуралних корака, као што је случај у фортрану и алголу; pl/1 - Program Language no. 1, развијен је са намером да замени алгол, фортран и кобол, али није испунио очекивања, тако да није применљив у свим областима рада; c - универзални програмски језик; развили су га Ричи (Dennis MacAlistair Ritchie) и Керниган (Brian Wilson Kernighan) године, у АТ&Т корпорацији за програмирање оперативних система; у данашње време је један од популарнијих због своје једноставности, природности и широке применљивости; неки системски програми пишу у њему; ada - универзални, вишенаменски програмски језик високог нивоа који је заснован на Паскалу, развијен по налогу америчког Министарства одбране, крајем седамдесетих година 20. века, са циљем да буде примарни језик овог Министарства и ту се углавном и користи, име добио по Ади (Ејди) Аугусти Бајрон; gps - General Problem Solver, прилагођен моделирању; развили су га Невил (Allen Newell) и Сајмон (Herbert Alexander Simon) године у покушају да имитирају људски начин размишљања; simula - применљив у моделирању, настао је 60-их године у Норвешкој, развили су га Дал (Ole-Johan Dahl) и Најгард (Kristen Nygaard); синтаксно је врчо сличан алголу; велома је утицао имплементацију неких објеката у програмским језицима С++, Java и С#; pascal - развио га је професор Никлаус Вирт (Niclaus Wirth), као језик погодан за учење структурног програмирања; именован је по чувеном француском математичару и филозофу Блезу Паскалу (Blaise Pascal), творцу прве рачунске машине која је имала могућност извођења операције сабирања; паскал је стандардизован године од стране Међународног комитета за стандардизацију; данас се користи као почетни програмски језик за обуку будућих програмера, наручито оних који намеравају да раде на програмском језику C и много других мање или више познатих. Интерпретаторског типа су програмски језици: basic - Beginners All-purpose Symbolic Instruction Code, универзални, широко распрострањени програмски језик; то је назив за више програмсих језика чија је заједничка особина да су пројектовани са намером да буду једноставни за коришћење; првобитна верзија овог програмског језика је развијена године под руководством Кемења (John George Kemeny) и Керца (Thomas Eugene Kurtz). Имплементиран је за рачунаре серије G.E.225 и за велики број некада популарних кућних рачунара био је у склопу оперативног система; план је био да то буде једноставан језик за учење програмирања, да буде почетни корак за студенте који треба да савладају моћније језике као што су фортран или алгол; један од недостатака бејзика је непостојање стандарда, па програми писани за један тип рачунар не раде на другим; 9
9 Treća godina Programiranje 2014 prolog - PROgramming LOGic, прву верзију овог програмског језика развио је године Колмерер (Alain Colmerauer); намењен симболичкој обради са елементима вештачке интелигенције; године Ворен (David H. D. Warren) је направио први интерпретатор и компајлер за пролог; јапански научници су почетком осамдесетих година најављивали да ће њихови рачунари пете генерације бити засновани на овом програмском језику; пролог је замишљен као машински језик јапанских рачунара пете генерације; од тада је написано много експертних система на њему; уз са лисп, ово је најпознатији језик вештачке интелигенције planer - је дизајнирао Хјуит (Carl Hewitt) године; намењен симболичкој обради са елементима вештачке интелигенције; и други. Неки програмски језици се јављају у обе варијанте (на пример бејзик). Најпознатији проблемски оријентисани језици су: RPG - Report Program Generator, развијен је у IBM, године за пословне апликације са намером да замени истисне Cobol и PL/1, постоје верзије за мејнфрејм и микрорачунаре; ово је језик врло високог нивоа; COGO - Civil Engineering Coordinate Geometry STRESS - STRuctural Engineering System Solver HYDRO - Hydraulic Engineering Computations Mars, Arius, Proza, Graph и други. Аугуста Ада Бајрон, грофица од Лавлејса (Augusta Ada (Byron) King, Countess of Lovelace) је кћи Ана Изабеле Милбанке (Anna Isabella Milbanke) и Џорџа Гордона Ноел Бајрона (George Gordon Noel Byron), рођена je 10. децембра године у Лондону, Енглеска. Ада своја прва знања из области математике добија од Августа Де Моргана (Augustus DeMorgan, ). Адина мајка је хтела да пробуди интерес за математиком и охрабри рационалне аспекте њеног карактера насупрот романтичним утицајима њеног оца. Када је имала 18 година, Ада је слушала предавање о диференцијалној машини коју је дизајнирао Чарлс Бебиџ (Charles Babbage, ). Почевши писмом од 18. јануара 1836., па све до своје смрти, Ада је водила дуготрајну кореспондецију са Бебиџом. У октобру 1842, Луиђи Федерико Менабреа (Luigi Federico Menabrea, ), италијански професор на Универзитету машинства у Торину објавио је рад којим описује функцију и теорију Бебиџове аналитичке машине. Ада је превела овај рад са француског на енглески и додала сопствене опсежне коментаре. Превод је објављен године. И сам Бебиџ био је импресиониран неким компликованим програмима које је Ада написала, најсложенији од њих био је одређивање низа Бернулијевих бројева. Тако је Ада стекла репутацију првог компјутерског програмера (иако су и Бебиџ и неки други, такође, написали бројне програме за никад завршену аналитичку машину). Оптерећена коцкарским дуговима и раком материце, Ада је умрла у 37. година, 27. новембра године, а сахрањена је, на лични захтев, поред свога оца у породичној гробници у цркви Свете Марије Магдалене у Хакналу (Church of St. Mary Magdalene in Hucknall, Nottingham). Шездесетих година двадесетог века развија се велики број нових програмских језика, а најпопуларнији је алгол 60. Као одговор на све веће проблеме у вези са пројектовањем и одржавањем великих програмских система, до тада коришћеним техникама и језицима за програмирање, јавила се жеља да се направи такав универзални језик који би покупио све добре особине свих до тада познатих језика, а отклонио све њихове слабости, језик који би био применљив у свим областима људске делатности. Зато међународна федерација за обраду информација (IFIP) године образује радну групу WG2.1 чији је задатак да на основу програмског језика алгол 60 начини језик који би био задовољавајући у сваком погледу. На самом почетку заједничког рада радна група се распала на два табора, јер је дошло до неслагања у погледу сложености новог програмског језика. Из редова бројнијег табора изникла је нова верзија програмског језика алгол позната под именом алгол 68 (1968. године је објављена прва верзија овог језика). Остатак групе је, нешто касније, 1969/70. године представио потпуно нов програмски језик који је назван паскал по презимену француског математичара, физичара и филозофа Паскала (Blaise Pascal, ) који је један од првих конструктора механичких машина за сабирање. Конструктор програмског језика паскал је професор Високе техничке школе у Цириху (Swiss Federal Institute of Technology) Никлаус Вирт (Niclaus Wirth), поборник структурираног програмирања. Структурирано програмирање је скуп техника за израду програма са јасном и лако разумљивом структуром, уз коришћење података са јасно дефинисаним структурама. Овај процес карактерише модуларност и техника писања програма одозго на доле. - Модуларност значи да се у оквиру програма разликују одговарајуће целине, које се даље могу разлагати на мање и тако даље све до елементарних целина. Свака целина се може представити у облику потпрограма. На овај начин се један велики, компликовани програм може разделити на неколико релативно независних целина - модула. Сваки од модула је релативно лако анализирати и открити евентуалне грешке. На овај начин се избегавају бескрајна проверавања програма за различите полазне податке. - Програмирање одозго на доле подразумева писање програма од општег ка појединачном. Проблем се рашчлани на потпроблеме и сваки од њих се решава као независни проблем. За сваки се пише одговарајући потпрограм који се, затим, повезују у структурни програм. Програмски језик паскал подржава ове принципе свим својим основним управљачким структурама (селекције и циклуси) и структурираним типовима података (низови, записи, скупови, датотеке). За њега постоји и међународни (ISO) стандард. Са појавом паскала остварила се идеја структурираног програмирања, али и формалног доказивања коректности програма. По својој универзалности, једно- ставности и разумљивости паскал је далеко испред свих до тада познатих програмских језика. Паскал краси и изражајност, преносивост и језгровитост. Популарност коју је стекао не опада ни до данашњих дана. Готово да нема области делатности где се паскал не може применити и где се не примењује. Стандардна верзија паскала је званично објављена године. То је језик са једноставном и логичном структуром и због тога се доста лако учи. Врло је погодан за почетнике, за савлађивање основних принципа програмирања, као и за усвајање организованог и разумљивог начина размишљања и изражавања. Стандардни паскал има и неколико озбиљних мана које га чине неподесним за писање великих програмских система. Пре свега, захтева се да целокупан текст изворног програма, укључујући и све потпрограме, буде у једној датотеци. Основна идеја је да се 10
10 преводиоцу омогући да проверава исправност позивања потпрограма. Једна од најнепријатнијих врста грешака у програмима, које се и врло тешко проналазе у сложеним програмским системима, управо је неслагање типова стварних аргумената потпрограма на местима позивања са типовима формалних аргумената у дефиницији потпрограма. Поред тога, ова мера требала је и да онемогући паметним програмерима да свесно наведу стваме аргументе другачијих типова од очекиваних, постижући тиме неке специјалне, нестандардне (и сумњиве) ефекте. Такви програми се косе са једним од основних принципа структурираног програмирања - тешко их је разумети. Друга мана су врло ограничене могућности рада са датотекама. Стандардни паскал предвиђа само секвенцијалне датотеке са секвенцијалним приступом. Релативне датотеке са директним приступом не постоје, а још мање индексне датотеке које би омогућавале приступ помоћу кључа. Да ситуација буде још гора, имена датотека које програм треба да обрађује, не могу да се бирају у току извршавања програма, нити су уграђена у сам програм. Датотеке се у програмима представљају симболичким именима и препуштено је оперативном систему рачунара на који ће начин та имена повезати са физичким датотекама. На избор датотека корисник, евентуално, може да утиче командама оперативног система пре почетка извршавања програма. Трећа мана је нефлексибилност потпрограма при раду са низовима као аргументима. Бројеви елемената низова приликом сваког позивања морају да буду исти као бројеви елемената предвидених у дефиницији потпрограма. Чему правити засебан потпрограм за сортирање низова од по 100 елемената као и засебан за оне од по 500 елемената? Стандардни паскал, такође, нема ни могућност графичког приказивања резултата. Поред стандардне верзије паскала у то време се користе и турбо верзије. Програмски језик Turbo Pascal производ софтверске куће Borland појавио се на персоналним рачунарима под оперативним системом DOS (Disk Operating System) са извесним бројем нестандардних проширења. Нека од тих проширења обезбеђују боље искоришћавање хардверских могућности рачунара коме је језик намењен, док друга отклањају недостатке стандардног паскала. За боље искоришћавање хардверских могућности рачунара уведено је неколико формата целобројних података и неколико формата реалних података, који се међусобно разликују по опсегу вредности и по прецизности израчунавања (стандардни паскал предвиђа само једну врсту целих и једну врсту реалних бројева). Уведени су и специјални оператори за манипулисање са битовима унутар целобројних података. Потреба за писањем текста целокупног програмског система у једној датотеци отклоњена је увођењем програмских модула. Ти модули се преводе одвојено и називају се јединицама превођења (compilation units). Свака датотека програмског текста је један модул и дели се на део за везу са осталим делом система и део за дефинисање садржаја потпрограма који се налазе у њој. У првом делу потребно је описати све потпрограме (тип резултата и типове аргумената) и све глобалне променљиве, који се користе изван те јединице. У току превођења делова програма у којима се користе ти елементи, преводилац ће да консултује делове за везу ради провере исправности коришћења тих потпрограма и глобалних података. Мора се признати да се преводилац се може преварити вештим манипулацијама, али знатно теже него што је то био случај у програмским језицима који су се користили пре појаве паскала. Преводиоцу је потребно подметнути датотеку са лажним делом за везу, што у стандардном паскалу није могуће. Рад са датотекама је, такође, побољшан. Уведена је могућност придруживања симболичких имена физичким датотекама у току извршавања програма. Наравно, то уводи елемент зависности програма од рачунара и од оперативног система, детаљ који се желео избећи у стандардном паскалу. Поред тога, уведена је и могућност директног приступања појединим записима у датотекама, без чега не постоји ефикасна обрада датотека. Са појавом верзије 3.0 делимично је решен и недостатак графичког приказа увођењем команди Turtlegraphic групе. То јесте била нека врста графике, али није задовољавала захтеве. Зато се у верзијама 4.0 и даљим, уз паскал испоручује и све комплетнији графички пакет Graph.tpu. Актуелна верзија 7.0 уводи могућност рада са мишем, са више програма истовремено, објектно програмирање, рад са прозорима, програмирање у оквирима оперативног система Windows и друго. Свака од до сада објављених седам верзија турбо паскала је донела неке новине у односу на претходну, отклањање уочених грешака и увођење нових могућности у језик. У најзначајнија проширења, свакако, спадају увођење подршке за објектно оријентисано програмирање (ООП), почев од верзије 5.5 и подршке за израду атрактивних спрега апликација са корисником, заснованих на прозорима и менијима (Turbo Vision) при раду под оперативним системом ДОС. Објектно оријентисано програмирање је нова методологија израде великих програмских система која се појавила када су програмски системи толико нарасли да технике структурираног програмирања више нису давале задовољавајуће резултате. Док је у центру пажње структурираног програмирања структура програма, у центру пажње објектно оријентисаног програмирања су објекти. Објекти су интелигентни подаци који могу да се налазе у одређеним стањима. Та стања могу да се промене применом одређених метода. Скуп објеката са истим особинама чини једну класу. Класе су аналогне типовима података, као што су цели бројеви или реални бројеви, али могу да представљају произвољно сложене апстрактне објекте (на пример геометријске фигуре). Појава програмског језика паскал и велика популарност коју је врло брзо стекао оставила је дубоке трагове на даљи развој програмских језика. Наиме, из њега су се развили: Mesa, Concurrent Pascal, Euclid, Gypsy, PLZ, Modula, Telos, Edison, Ada и многи други. Никлаус Емил Вирт (Niklaus Emil Wirth), рођен 15. фебруара године у Винтертуру (Winterthur) у Швајцарској је швајцарски информатичар. Звање инжењера електронике је стекао на Швајцарском универзитету технологије у Цириху а докторирао је на Калифорнијском универзитету Беркли Сматра се изузетним стручњаком из области рачунарства а најпознатији је као творац програмског језика Паскал. Осим паскала пројектовао је и програмске језике Euler, Algol W, Pascal, Modula, Modula-2, Oberon, Oberon-2, Oberon-07. За свој рад је године добио Тјурингову награду. Предавао је на универзитету Станфорд на катедри за рачунарске науке ( ) као и на Швајцарском технолошком универзитету године је написао књигу Алгоритми + структуре података = програми (Algorithms + Data Structures = Programs). Од априла jе у пензији. "Шта је човек у васиони, између две бесконачности: бескрајно великог и бескрајно малог? Ништавило у погледу на бескрајност; све у погледу на ништавило; средина између ничега и свег." - Блез Паскал. Блез Паскал (Blaise Pascal, ) је био француски математичар, физичар и филозоф. Још од малена показивао је интересовање за науку, па је већ са 18 година конструисао прву математичку машину, механички сабирач како би помогао свом оцу у пословању године напушта свет науке и окреће се религији, односно како је он написао разматрању величине и мистерије човека. Блез Паскал рођен је 19. јуна у Клермон Ферану (Clermont-Ferrand), у Француској. као треће дете Етјена Паскала (Etienne Pascal) и Антоанете Бегон (Antoinette Begon). Мајка му је умрла када је имао само три године, остављајући га са две сестре Гилберт и Жаклин. Године породица Паскал напушта Клермон и сели се у Париз. Децембра године, Паскалова породица је 11
11 напустила Париз да би живела у Руану где је Етјен био примљен као скупљач пореза за горњу Нормандију. Брзо по смештању у Руану, Блез је написао свој први рад назван Есеј о конусним пресецима, издат фебруара године. Исте године Паскал је изумео и први дигитални калкулатор са намером да помогне своме оцу у прикупљању пореза и такси. Догађаји године су били врло значајни за младог Паскала. Те године је његов отац повредио ногу и морао је да се опоравља код куће. О њему су се бринула његова млађа браћа, који су били у религиозном покрету из Руана. Они су имали дубок утицај на Блеза и он је постао јако религиозан. Етјен Паскал је умро у септембру године. После очеве смрти, Блез је писао једној од својих сестара, давајући, при томе смрти једно дубоко хришћанско значење; и за њега је очева смрт била нешто посебно. Тада је оформио своје идеје које су послужиле као основа за његова писма, обједињена у филозофски рад под називом Мисли (Пенсеес). После овога, Паскал је посетио јансенски манастир Порт Ројал де Шамп, који се налазио око 30 км југозападно од Париза. Почео је да издаје анонимна дела на тему религије. 18 провинцијалних писама је било издато у периоду између године до почетка године. Све је то било писано као знак одбране од његовог пријатеља Антоана и великог противника Језуита и браниоца јансенизма, који је иначе пре својих студија теологије у Паризу, био осуђиван због свог контраверзног религиозног рада. Паскалов најпознатији рад из филозофије је Мисли, а на издању о својим личним мислима везаним за људску патњу, судбину и Бога, којем је приступио касне године, наставио је да ради током и године. Овај рад садржи и Паскалову опкладу као доказ да веровање у Бога је разумно само са пратећим аргументима. Ако Бог не постоји, онај ко не верује у њега неће изгубити ништа, а ако, пак, Бог постоји, тај исти човек ће изгубити све зато што није веровао у њега. Паскал је у својој опклади користио математичке аргументе и аргументе из вероватноће, али његова главна реченица је: ми смо сви присиљени да се коцкамо Питања на која треба обратити пажњу > Разлика између решавања проблема у животу и на рачунару > Појам алгоритма > Особине алгоритма > Врсте алгоритама > Фазе у решавању проблема на рачунару > Појам програмског језика > Граматика програмског језика > Синтакса програмског језика > Семантика програмског језика > Поделе програмских језика > Машински језици > Машински оријентисани језици > Процедурални језици > Проблемски оријентисани језици > Фазе у извршавању програма > Интерпретерски програмски језици > Компајлерски програмски језици > Структурно програмирање и особине > Објектно оријентисано програмирање 12
12 2. Програми засновани на прозорима Апликације су програмски системи пројектовани за решавање одређеног проблема. Поступак израде апликације назива се пројектовање, а предмет тог поступка пројектом апликације или скраћено, само пројектом. Другим речима, пројекат апликације представља апликацију у фази израде или пројектовања. Скица прозора у току пројектовања апликације назива се обрасцем (form). Скица главног прозора за време пројектовања је главни образац пројекта. Основна одлика апликација заснованим на прозорима је комуникација апликације и корисника, заснована на прозорима и другим визуелним компонентама као што су: дугмад, оквири за текст, менији и слично. Помоћу тих компоненти корисник управља радом апликације и прима информације од апликације. Прозори могу да се схвате као оквири који обједињују компоненте у логичке целине. Свака апликација има барем један прозор који се назива главним прозором, main window. Осим њега може да постоји произвољан број других прозора, secondary windows. Главни прозор је обично стално на екрану, док се секундарни појављују и нестају са екрана према тренутним потребама. Има случајева када се и неки од секундарних прозора дуже задржавају на екрану. По намени, специјалну врсту секундарних прозора чине прозори за дијалог, dialog box. Користе се за саопштавање разних порука кориснику и за прикупљање различитих података од корисника. По завршетку дијалога увек нестају са екрана. Прозори за дијалог су специфични и по томе што корисник, све док их не затвори, не може ништа да уради ни у једном од других прозора дате апликације. Прозори са том особином називају се условљеним (modal) прозорима, јер је наставак рада условљен њиховим затварањем. У овом смислу, остали прозори називају се и неусловљеним (modeless) прозорима. Условљени прозори су везани за једну апликацију, тј. и у случају да је на екрану отворен условљени прозор једне апликације, увек може да се приђе прозору друге апликације и да се ради у њој. Када постоји више прозора у апликацији, они се исцртавају један преко другога. Тренутно активан прозор види се у целини, док остали могу да буду делимично или у потпуности заклоњени, у зависности од њихових величина и положаја на екрану. Корисник може помоћу миша да помера независно све прозоре по екрану, да им мења величине или да их уклони са екрана. Постоји специјална врста прозора који се налазе унутар радног простора неког другог прозора. Ти прозори називају се децом, child window, оних прозора у чијем се радном простору налазе, а који се, с друге стране, називају родитељима, parent window, те деце. Прозори деца могу да се померају само унутар радног простора прозора родитеља. Померањем прозора родитеља по екрану померају се и његова деца. Променом величине прозора родитеља не мењају се величине прозора деце. Ако после промене величине прозора родитеља у радни простор не стану прозори деце, појавиће се клизачи уз ивице радног простора прозора родитеља, помоћу којих корисник невидљиве прозоре или њихове делове доводи у видно поље. Основни начин за управљање апликацијама заснованим на прозорима је помоћу миша. Место на коме може да се делује мишем обележава се показивачем миша, mouse cursor. Показивач миша може да има различите графичке представе. Основни облик је стрелица чији врх означава место показивача на екрану. Алтернативни облици могу да се користе за означавање тренутне улоге миша. На пример, изнад разних оквира за текст показивач миша обично има облик танке вертикалне линије са водоравним испустима на горњем и доњем крају. Такав облик је погодан да се означи место између два знака у тексту. Постоје две основне радње које могу да се обаве помоћу миша: Притисак - click и Одвлачење - drag and drop. Под притиском мишем подразумева се померање показивача миша изнад одређене компоненте и притисак и отпуштање левог тастера на мишу. Тако се на екрану може притиснути неко дугме, одабрати нека ставка у менију, променити стање неког оквира за потврду и слично и тиме дати неки сигнал који ће се касније обрадити у апликацији. Под одвлачењем мишем подразумева се померање прозора по екрану или промена величине прозора. Изводи се тако што се показивач миша доведе изнад натписа прозора, притисне се леви тастер миша, помера се показивач миша уз притиснути леви тастер на неко друго место и отпусти се тастер миша. Ако се на тај начин мишем ухвати ивица или угао прозора, померањем показивача помериће се ивица или угао са суседним ивицама, чиме се мења величина прозора. У зависности од апликације, на овај начин понекад могу да се померају и компоненте унутар прозора, да им се промени величина или да се постигну неки други ефекти. Осим мишем, радом апликације може да се управља и преко тастатуре. Основна употреба тастатуре је уношење текста у оквире за текст. Место у тексту на коме може нешто да се промени обележава се показивачем текста, text cursor. То је, обично, вертикална трептећа линија која се увек налази између два знака у тексту. Треба јасно разликовати показивач миша од показивача текста. Показивач миша може да се помера помоћу миша по целом екрану, док се показивач текста помера тастерима са стрелицама на тастатури само унутар текста. Притиском мишем на оквир за текст у некој тачки, показивач текста може да се премести на тренутни положај показивача миша. Под неким условима, и преко тастатуре могу да се производе ефекти притиска мишем. За то могу да се користе одређени тастери са словима у комбинацији са тастером Alt или Ctrl, као и тастери Enter и Esc. За компоненту која на овај начин може да се активира каже се да јој је придружен знак пречица - accelerator character. Знакови пречице приказују се подвучено у натписима компоненти којима су придружени. 13
13 2. 1. Основне карактеристике програма заснованих на прозорима Слика испод приказује главни прозор апликације WordPad, једне од стандардних апликација заснованих на прозорима. На њеном примеру ће бити објашњени сви елементи о којима треба водити рачуна приликом пројектовања неке апликације за рад у графичком оперативном окружењу. Прозори апликације могу да имају следеће делове: 1. Трака са натписом - Caption bar, налази се уз горњу ивицу прозора. Састоји се од натписа и управљачких дугмади. Натпис садржи име апликације и, евентуално, име датотеке која се тренутно обрађује. Четири могућа управљачка дугмета су: Дугме управљачког менија - control menu button, налази се на левом крају траке са натписом и садржи сличицу - icon, придружену прозору. Притиском на то дугме отвара се управљачки мени. Дугме за минимизирање прозора - minimize. Притиском на њега прозор се уклони са екрана при чему остане дугме које га представља у палети послова (Taskbar) у радном простору - (Desktop) виндоуса или се претвара у минимални облик (типично за секундарне прозоре за које обично не постоји придружено дугме у палети послова). Дугме у палети послова садржи сличицу која је придружена прозору и део натписа прозора. Притиском на то дугме левим тастером миша, прозор се поново појави на екрану у првобитној величини и на првобитном месту. Притиском десним тастером на дугме у палети послова отвара се управљачки мени. Минимални облик прозора се састоји од скраћеног облика траке са натписом која садржи сличицу придружену прозору, део натписа и представља дугме за враћање прозора у првобитно стање. Дугме за максимизирање прозора - maximize. Притиском на њега прозор ће се раширити тако да попуни цео екран. Само дугме, након ове акције, мења изглед: до притиска имало је изглед квадратића, а сада ће садржати два делимично преклопљена правоугаоника - restore. Поновним притиском на то дугме, прозор ће се вратити на првобитно место у првобитној величини. Дугме за затварање прозора - close. Притиском на ово дугме прозор се уклони са екрана. Уклања се и придружено дугме, ако постоји, из палете послова. Ако се ради о главном прозору, апликација се завршава. 2. Трака главног менија - menu bar, налази се испод траке са натписом. Садржи ставке главног менија за избор појединих група радњи које апликација може да обави. Трака главног менија обично постоји само у главном прозору апликације. Апликације без главног менија се врло ретко срећу у пракси. 3. Трака са алаткама - toolbars, налази се испод траке главног менија. Садржи дугмад са сличицама помоћу којих се најчешће коришћене радње могу лакше да извршавају него помоћу менија. 14
14 4. Статусна трака - status bar, налази се уз доњу ивицу прозора. Садржи податке о стању апликације укључујући и кратка упутства или поруке кориснику. 5. Радни простор - client area, заузима сав преостали простор у прозору. У том простору се налазе визуелне компоненте које су смештене у прозору. Уз ивице тог оквира могу да се налазе клизачи помоћу којих се делови прозора који нису стали у радни простор доводе у видно поље, померањем клизача по потреби. 6. Ивице прозора - window borders. Ограђују целокупан прозор. Ивице прозора имају различит изглед у зависности од тога да ли величина прозора може да се мења помоћу миша или не, или се ради о прозору за дијалог. Радом апликација управља се командама помоћу којих се могу подешавати параметри обраде или тражити спровођење појединих радњи које су предвиђене у апликацији. Основни начин издавања команди је помоћу менија - menu, мада рад апликација може да се организује и другачије. Мени садржи низ ставки од којих једна може да се одабере да би се назначила нека акција апликације. Да листа ставки не би била предугачка, ставке се групишу и образују се менији чија хијерархијска структура садржи више нивоа. Први ниво ставки је главни мени - main menu, чије ставке представљају групе могућих операција. Избором ставки главног менија појављује се подмени - submenu чије ставке могу да представљају конкретне операције или подменије на следећем нивоу. У пракси најчешће има два нивоа менија, тј. ставке главног менија готово никад не представљају конкретне акције. Ставке главног менија стално су видљиве у траци главног менија, испод траке са натписом прозора. Ставке подменија приказују се само за тренутно одабрану ставку главног менија, поређане усправно испод одговарајуће ставке главног менија. Евентуални подменији који припадају некој од ставки подменија приказују се десно (или, у ретким случајевима, лево) од подменија, са врхом у висини ставке подменија. Постојање подменија означава се стрелицом у облику попуњеног троугла уз десну ивицу одговарајуће ставке. Тренутно одабране ставке у менију приказују се истицањем другом бојом подлоге и слова у односу на остале ставке. Пошто ставке у различитим подменијима могу имати исте натписе, нека ставка у менију је једнозначно одређена низом ставки које треба одабрати, почев од главног менија, да би се стигло до ње. Избор ставки главног менија и подменија може да се врши на више начина: Притиском на леви тастер миша, када је показивач миша изнад жељене ставке главног или подменија. Активирањем главног менија притиском на тастер Алт, а затим, тастерима и крећемо се по ставкама главог менија, а тастерима и по ставкама тренутно активног подменија. Ако ставка подменија има свој подмени, притиском на тастер отвара се тај подмени. Обрнуто, враћање на претходни ниво подменија постиже се тастером. Избор се остварује притиском на тастер Ентер када је изабрана одговарајућа ставка подменија. Истовременим притиском тастера Алт и тастера подвученог слова у ставки главног менија отвара се одговарајући подмени. После тога треба притиснути тастер подвученог слова у ставки подменија (сада више тастер Алт не мора, али може да буде притиснут). Подвучени знакови у натписима ставки менија су знакови пречице. Избором команди иза чијих се имена у подменију налазе три тачке (...) отвара се посебан прозор за дијалог. Тај прозор садржи образац чијим попуњавањем треба да се задају подаци неопходни за извршавање тих команди. Прозори за дијалог, поред компоненти за уношење или избор вредности потребних података, обично, садрже и два дугмета: дугме за потврду - ОК којим се захтева спровођење започете активности са тренутно видљивим вредностима у прозору, и дугме за одустајање - Cancel којим се одустаје од спроводења те акције. Осим мишем, дугме за потврду може да се активира и помоћу тастера на тастатури (у случајевима када је оивичен правоугаоником дебљим од оног око остале дугмади или су слова уоквирена испрекиданом линијом). Дугме за одустајање увек може да се активира помоћу тастера есц на тастатури. Одустајање се постиже и затварањем прозора за дијалог помоћу управљачког менија или притиском мишем на дугме за затварање прозора. Понекад прозор за дијалог служи само да би корисник потврдио да стварно жели спровођење одабране активности. Тиме му се пружа још једна прилика за евентуално одустајање. Такви прозори обично садрже текст одговарајућег питања и дугмад Yes и No. Поред наведених, прозори за дијалог могу да садрже другу дугмад различите намене зависно од функције дијалога, а најчешће и дугме за помоћ - Help. Притиском на то дугме добија се пригодна приручна помоћ, ако је предвиђена у оквиру апликације. За активирање неких радњи апликције, представљених одговарајућим ставкама подменија, могу да постоје тастери пречице - shortcut keys. За разлику од знакова пречица, помоћу којих се по менију креће корак по корак, као и помоћу миша, притиском на тастер пречицу, ставка менија којој је он придружен активира се у једном потезу. При том се мени не отвара и одабрана ставка се уопште не види на екрану. Не смета ако је у тренутку притиска на тастер пречицу мени отворен са било којом истакнутом ставком, укључујући и ставку која се њиме бира. Тастери пречице могу да буду функцијски тастери од F1 до F12 сами или у комбинацији са управљачким тастерима Shift, Alt и/или Ctrl, као и тастери са словима у комбинацији са тастером Ctrl. Постојање тастера пречице означава се уз десну ивицу менија, после натписа ставке менија. За разлику од 15
15 знакова пречица, чије тумачење може да се мења у току извршавања апликације, тумачење тастера пречица је јединствено у току целог извршавања апликације. Поред евентуалног главног менија са пратећим подменијима сваки прозор поседује управљачки мени - control menu који се назива и системски мени - system menu. Управљачки мени активира се притиском на дугме управљачког менија на левом крају траке са натписом прозора. Помоћу управљачког менија прозор може да се минимизира командом Minimize, да се максимира - Maximize, да му се поврати претходна величина - Restore, да се помера по екрану - Move, да му се промени величина - Size и да се затвори - Close. Све ове радње могу и на други начин да се постигну, па је отварање управљачког менија ретко потребно. Прозори поред менија садрже и разне компоненте помоћу којих корисник може да утиче на ток извршавања апликације. Међу њима се најчешће користе: Ознака - label. Приказује текст, натпис ознаке - Caption који може да буде нека порука кориснику или опис намене друге компоненте. Корисник не може да делује на ознаке помоћу миша. Дугме - button. Корисник може мишем да га притисне и тиме да сигнал за неку акцију. Натпис на дугмету означава његову намену. Уношење података у прозоре за дијалог обично се завршава притиском на једно од дугмади. Оквир за текст - edit box. Корисник у овај оквир уноси произвољан текст преко тастатуре. Постоје оквири који могу да садрже само један ред текста и оквири који могу да садрже више редова текста. Оквир за потврду - check box. Мали квадрат поред натписа овог оквира може да садржи знак за потврду ( ) или да буде празан. Присуство знака за потврду означава да особина у натпису важи, а одсуство да не важи. Левим кликом миша мења се стање из непотврђеног у потврђено, и обрнуто. Радио-дугме - radio button. Мали круг поред натписа ове компоненте може да садржи црну тачку ( ) или да буде празан ( ). Користи се у групама с тим да само једно дугме у групи може да има попуњен кружић. Те групе се користе за избор једне од неколико, медусобно искључивих, могућности. Неке од компоненти у прозору или неке ставке менија могу да буду привремено недоступне. Такве компоненте обично се приказују бледо - dimmed. Сваког тренутка само је један од тренутно видљивих прозора на екрану активан. За такав прозор се каже да је у жижи (focus). Од осталих прозора се разликује видљиво по другачијој боји траке са натписом прозора и текста у њој. Корисник може да активира прозоре по произвољном редоследу, осим ако је тренутно активан прозор условљени прозор, простим притиском мишем на било коју тачку која припада жељеном прозору. У тренутно активном прозору сваког тренутка је само једна компонента активна. За ту компоненту се каже да је у жижи. Компонента која је у жижи, обично се видљиво разликује од других компоненти исте врсте. Три карактеристична начина разликовања су: натпис компоненте уоквирен правоугаоником од танке испрекидане линије, за компоненте које имају натписе; трептећи показивач текста унутар оквира за текст или уоквирена једна од ставки унутар оквира са листама. Притиском на неку компоненту мишем или одабирањем помоћу знака пречице, жижа се помери на ту компоненту. Поред тога, жижа може да се помери са једне компоненте на другу према одређеном редоследу, притискањем тастера Tab ( ) на тастатури, односно, комбинације тастера Shift + Tab по обрнутом редоследу. Редослед померања жиже са компоненте на компоненту на овај начин зависи од апликације. У добро пројектованој апликацији редослед померања жиже следи логичан ток уношења података, примерен датој ситуацији. Такође, у добрим апликацијама компоненте су тако распоређене да логичан редослед њиховог обиласка на екрану буде слева удесно и одозго надоле. Све апликације засноване на прозорима могу да се поделе у две групе: Апликације за рад са једним документом (Single Document Interface Applications - СДИ апликације). Могу истовремено да обрађују само један документ (текст, слику итд.). У главном прозору се обрађује један документ (текст, слика или други скуп података), а евентуални остали прозори у апликацији служе само као подршка за остваривање те обраде. Сви су прозори обични, у смислу да међу њима нема прозора родитеља нити прозора деце. Апликације за рад са више докумената (Multiple Document Interface Applications - МДИ апликације). Могу одједном да обрадују више докумената. Главни прозор је прозор родитељ који садржи барем један прозор дете. Сваки прозор дете садржи по један документ који се обрађује у апликацији. Апликација може да има и известан број обичних прозора који служе као подршка за обраду докумената. Појединим радњама у апликацији делује се на документ у прозору детету који је тог тренутка активан. Делфи је апликација заснована на прозорима, а са друге стране, делфи служи за израду апликација заснованим на прозорима. Препорука пројектантима је да се труде да своје апликације што више уклопе у опште прихваћену шему јер тиме повећавају изгледе да њихов производ лакше прихвате будући корисници. Делфи у потпуности подржава и потпомаже пројектовање стандардних и атрактивних апликација за оперативни систем Windows. 16
16 2. 2. Елементи графичког корисничког интерфејса (Graphical User Interface) Графичко корисничко окружење (Graphical User Interface, GUI) је тип корисничког окружења који омогућава људима да рукују рачунаром или уређајима контролисаним рачунаром. То је начин интеракције човека с рачунаром кроз манипулацију графичким елементима и додацима уз помоћ текстуалних порука и обавештења. Графичко корисничко окружење користи иконице, визуелне индикаторе или специјалне графичке елементе (widgets) уместо обичних текстуалних менија или ручног уношења команди. Иконице се често употребљавају заједно са текстом или ознакама да потпуно прикажу информацију и радње доступне кориснику. Графички кориснички интерфејс се ослања на WIMP узор рада корисника са рачунаром. Основни елементи овог модела су: Window (прозор) ограничене правоугаоне области које садрже радну површину, меније, дугмиће, траке за вертикално померање скроловање садржаја прозора и друго. Апликације и датотеке се приказују унутар прозора (мада не мора свака апликација имати свој прозор). Icon (икона или сличица) икона је визуални репрезент објеката у саставу рачунарског система. Објекти могу бити физички или логички (програми или датотеке са подацима). Асоцијативно делује на корисника: јасно означава функцију, лако се памти и разликује се од осталих икона. Селектовањем иконе покреће се програм или отвара датотека, преко путање до садржаја на меморијском медијуму где су смештени. Menu (мени) основни механизам интеракције корисника са програмом, при чему се кориснику прикаже низ могућности у датој ситуацији, а корисник се опредељује за једну од њих. Pointer (показивач) графички симбол којим управља миш или неки други улазни уређај, а користи се за лоцирање, позиционирање и избор визуелног репрезента објекта на екрану монитора. Корисник у GUI окружењу може помоћу миша селектовати и кликнути на жељену иконицу (icon), чиме стартује одговарајући програм. Без помоћи GUI интерфејса корисник би све команде морао да уноси у текстуалном облику преко тастатуре. GUI програми приказују визуалне елементе попут: икона (сличице на десктопу, тј. позадини) прозора дугмад са текстом и/или сликама (button) оквири за унос текста (edit) квадратићи за одабир и типа (могуће је одабрати више квадратића - check box) кружићи за одабир или типа (могуће је одабрати само један кружић - radio button) Претходници GUI програма су развијани су на Станфордском факултету, на челу са Енглбартом (Douglas Englebart) и користили су текстуалне повезнице за управљање. Касније су истраживачи на Xerox PARC-у унапредили и отишли даље од само текстуалних повезница и почели су користити графичко окружење за њихов Alto рачунар. То је био претходник свих данашњих графичких окружења, звао се PUI. PUI је и тада користио прозоре, меније, дугмад, квадратиће за одабир, иконе уз употребу неких показних уређаја као што је миш. Први пут GUI је искористио Apple на својим Macintosh рачунарима и оперативним системима (1984.), док је касније(1985.) Microsoft копирао Apple-ове идеје у својим првим верзијама Windows оперативног система. Примери неких графичких окружења су Mac OS, Microsoft Windows, NEXTSTEP и X Window System од којег су настали Qt (KDE), GTK+ (GNOME) и Motif (CDE). Помоћу графичког окружења употреба данашњих рачунара је много једноставнија него у доба DOS оперативног система који је био прилично негостољубљив према новим корисницима рачунара. Већина данашњих оперативних система има могућност употребе графичког окружења, дакле курсора, икона, прозора и других елемената. У програмима које ћемо писати, најчешће ћемо користити следеће компоненте: Форма (Form - образац) - ова компонента ће се користити за креирање спољашњег изгледа нашег програма и на њу ће се постављати остале компоненте. Лабела (Label - натпис) - може се поставити било где на форми, користи се за приказ текстуалних података. Едит (Edit - оквир за текст) - може се поставити било где на форми, користи се за унос текстуалних података. Тастер (Button - дугме) - може се поставити било где на форми, користи се за потврду почетка неке акције. Мемо (Memo - вишередни текст) - користи се за приказ и унос вишередног текста Програми руковођени догађајима У објектно оријентисаним програмским језицима у центру пажње су догађаји на које могу реаговати распоређене компоненте. Постоји велики број догађаја на које поједине компоненте реагују, а програмом се дефинишу они на које ће поједине компоненте реаговати. На пример, ако је тастер компонента чије реакције на догађаје се обрађују, онда догађаји могу бити: клик мишем на објекат, повлачење објекта, прелазак мишем преко њега, померање миша на горе или на доле, активирање објекта, напуштање објекта, притисак неког тастера на тастатури, отпуштање тастера на тастатури, унос неког карактера помоћу тастатуре и други. 17
17 Извор догађаја може бити миш, тастатура или неки од постављених објеката, а програмер дефинише на које од њих ће постављена компонента реаговати и на који начин. Клик на неки тастер може проузроковати затварање апликације, покретање неке процедуре или неку активност те или неке друге компоненте. Промена садржаја оквира за текст може покретати неку процедуру или дефинисати неку акцију те или неке друге компоненте. И само покретање апликације представља један догађај, исцртавање неке компоненте такође је догађај који може утицати на почетак извршавања неке дефинисане процедуре. Овакав начин покретања појединих делова апликације повећава динамичност и непосредност апликације. Померањем миша можемо проузроковати померање објеката на форми чиме се добија могућност креирања атрактивних апликација које одржавају пажњу корисника и усмеравају га на одговарајућу активност Питања на која треба обратити пажњу > Одлике апликација заснованих на прозорима > Врсте прозора у апликацијама и њихове карактеристике > Карактеристике рада са мишем > Управљање радом апликације помћу тастатуре > Елементи прозора апликације и њихова функција > Главни мени апликације и систем подменија > Прозори за дијалог > Најчешће коришћене компоненте које могу бити елементи апликације > Подела апликација заснованих на прозорима > Елементи графичког корисничког интерфејса > Извори догађаја и утицај њихове обраде на квалитет апликације 18
18 3. Увод у развојно окружење програмског језика На персоналним рачунарима данас врло је популаран рад под оперативним системом Windows и развој апликација за ту платформу. Као одговор на ово велико интересовање, софтверска кућа Borland је давне године објавила своје моћно интегрисано развојно програмско окружење Delphi за израду апликација за рад под оперативним системом виндоус. Програмско окружење делфи садржи врло моћне алате за брзо и лако организовање и уобличавање комуникације на релацији апликација - корисник у стилу професионалних апликација за виндоус платформу. Ти алати омогућавају визуелно уређивање појединих прозора (образаца) и подешавање параметара компонената у тим обрасцима, померањем компонената по екрану помоћу миша и попуњавањем одговарајућих формулара. У том делу посла нема никаквог писања програма. Поступци које апликација треба да обави као одговор на разне догађаје, као што је притисак мишем на неко дугме у прозору, програмирају се на језику Object Pascal. Објектни паскал представља даље усавршавање турбо паскала у домену објектно оријентисаног програмирања. Уграђена је подршка за непосредно коришћење АПИ (API - Application Programming Interface - рутине за управљање датотекама, приказ података и слично) функција, стандардног алата који фирма Microsoft нуди за израду апликација за виндоус окружење. Програмер у делфи окружењу релативно ретко непосредно позива те АПИ функције. Алати које делфи пружа чине то уместо њега. Програмски језик делфи настао је као први програмски језик са визуелном компонентом. Иако је у то време већ постојао Visual Basic (ВБ), не може се рећи да је он први програмски језик за визуелно програмирање јер су се програми у ВБ извршавали под контролом преводиоца. У делфију се изворни програмски код преводи директно у машински чиме се постиже већа брзина код извршавања програма и независност програма од програмског преводиоца, тј. програм написан у делфију и преведен у извршни код може се извршавати без обзира да ли је на рачунару инсталиран делфи преводилац или не. Прва верзија делфија прављена је за оперативни систем Windows 3.1x и правила је 16-битне апликације у машинском коду. Могла је да се користи и под оперативним системима Windows 95 и Windows NT, али није могла да искористи нове погодности које су пружала та нова, 32-битна окружења. Резултујуће апликације су биле искључиво 16-битне, без обзира под којим оператиним системом се радило. Креиране апликације су могле да се извршавају у свим поменутим окружењима. Подршка за 32-битно програмирање је уграђена у верзију 2. Осим тога у ова верзија укида ограничење дужине знаковних низова на 255 знакова. Боље управљање меморијом, истовремено извршавање више нити програма (multithreading), већи број новоуведених компоненти, бољи рад са базама података и повезивање са SQL језиком упита су, такође, новине. Ова знатно прерађена и допуњена верзија, која је објављена у фебруару године, могла је да се користи само под оперативним системима Windows 95 и Windows NT, а и развијене апликације су могле да се извршавају само под тим оперативним системима. Трећа верзија из године донела је само неколико новина и побољшања већ постојећих карактеристика (много већи скок је направљен између верзија 1 и 2). Пре свега, побољшана је помоћ за писање кода апликација, подршка пакетима кода којима могу приступити различити програми, подршка Active X контролама, могућност креирања објектног кода (.оbj) чиме се отвара могућност увоза програмског кода у друге програмске језике. Додате су и интернет компоненте за креирање апликација које могу да користе предности глобалне мреже. Делфи 4 из године доноси знатна побољшања већ постојећих карактеристика претходне верзије и прилагођавање делфија новим верзијама оперативног система са модернијим изгледом и једноставнијом употребом алатки. Делфи 5 доноси знатна олакшања у раду са базама података и даља унапређења Active X контрола. Делфи 6 је до крајњих граница поједноставио изградњу апликација увођењем чаробњака који помажу код почетног формирања различитих апликација. Палете са алаткама су препуне новим компонентама. Делфи 7 је прерађена и мало побољшана верзија делфи 6 пакета прилагођена оперативном систему Windows XP и допуњена пакетом за креирање извештаја Rave Designer. Убрзо, затим, појавила се верзија Делфи 8 и то је последњи пројекат компаније Borland. Испоставило се да је то још један од пословних промашаја фирме, односно, да готово ништа ново и значајно није донео. Компанија је запала у дугове због овог, али и још неких других пословних промашаја и постојала је оправдана сумња да ће се пројекат Делфи угасити. Спас је дошао са појавом верзије Delphi 2009 која је прилагођена раду у мрежном окружењу и новим 64-воро битним оперативним системима, а која је настала у тренутку када је компанију Borland преузела компанија CodeGear. Ово је прва верзија делфија која је испоручивана у пакету са C++ билдером, тако да су њиме могли бити задовољни и љубитељи делфија и це-програмери. Даљи развој оперативних система довео је до појаве делфија у верзији ХЕ. Актуелна је верзија ХЕ2. Карактеристика свих верзија делфија је да генеришу прави машински програм (native code), што резултује бржим извршавањем апликација у односу на друга визуелна окружења која генеришу неки међукод који се после извршава интерпретацијом. Коначан резултат пројектовања је једна извршна датотека (са наставком.еxе) програма који чини апликацију. Приликом инсталације апликације, осим евентуалних датотека које користи апликација, додатне датотеке нису потребне (на пример, библиотеке са динамичким повезивањем, датотеке са наставком.dll), под условом да апликација не користи подршку за рад са базама 19
19 података и за израду извештаја. Ако се користи нека од тих подршки, BDE (Borland Database Engine), односно, Report Smith морају да се инсталирају. Смештање целокупног кода у извршни облик програма има и један недостатак: најмања апликација заузима барем 275 килобајта. Ако се на једном рачунару користи више апликација које су развијене помоћу делфија, долази до знатног утрошка простора на диску (данас је овај проблем знатно ублажен снижењем цене хард дискова и повећањем стандарда на 500 гигабајтова, али средином 90-их година хард дискови су били величине мегабајтова). Због тога је у верзији 3.0 уведена могућност прављења пакета са динамичким повезивањем (.dpl - Delphi Package Library) који по намени одговарају виндоусовим библиотекама са динамичким повезивањем (.dll). Библиотека визуелних компонената се испоручује у облику таквих пакета. Пројектант апликације може да назначи који ће од тих пакета да се уграде у извршни облик апликације, а који не. Наравно, пакети који нису уграђени морају да се испоруче одвојено кориснику апликације. Већина савремених програмских језика подржава ООП. Сви ООП језици су засновани на три концепта: енкапсулацији - Eнкапсулација представља имплементацију која ће довести до жељеног понашања објеката. Битан њен аспект је и сакривање небитних особина класе, тј. сакривање структуре класе. Свака класа има два дела: интерфејс и имплементацију. Интерфејс класе обухвата само спољашњи изглед класе и преко њега се установљава да ли апстракција има жељено понашање. Са друге стране, имплементација обухвата реализацију свих механизама који доводе до тог жељеног понашања. наслеђивању - Механизам наслеђивања (inheritance) састоји се у томе да једна класа може бити врста друге класе са додатним особинама, наслеђујући њену структуру, понашање и комплетну функционалност те класе и додајући евентуално неке своје особености које је чине аутономним ентитетом. полиморфизму - Полиморфизам је својство да објекат изведене класе извршава операцију на начин својствен изведеној класи, иако му се приступа као објекту основне класе. Полиморфизам обезбеђује генерички софтверски интерфејс тако да колекцијом различитих типова објеката може да се манипулише униформно. Програмски језик објектни паскал који делфи користи је ООП проширење стандардног језика паскал. Синтакса програмског језика паскал је обимнија и читљивија од синтаксе, на пример, језика Ц, а његово ООП проширење прати исти приступ и даје му моћ једнаку најновијим ООП језицима Јави или Ц++. Привредна комора Београда, Удружење информатичке делатности у сарадњи са компанијом Ембаракадеро Интернационал и локалним партнером Code Factory, премијерно су представили EMBARACADERO - RAD STUDIO XE3 који садржи програмске алате Делфи/Ц++/ХТМЛ5 за развој софтвера за најновије оперативне системе Windows 8, Mac Mountain Lion, Mobile на стручном скупу: "EMBARACADERO - Нови RAD STUDIO XE3" који је одржан у уторак 11. септембра 2012., са почетком у часова у сали VI, зграде Привредне коморе Београда, Кнеза Милоша 12. Нови алат представљен је као најбржи пут до Windows 8 апликација. По њима Delphi XЕ3 и C++builder XЕ3 са компонентама за Метрополис су једини алати који омогућавају надоградњу класичних Windows UI апликација на Windows 8 Style. Апликације раде на WinXP, Vista, Windows 7 и 8, и то како на десктоп тако и на таблет окружењима као што су Slate и Surface Pro. Апликације у делфију ХЕ3 сада подржавају HD/3D графику задивљујућег изгледа. Пакет укључује и најновију верзију FireMonkey компоненати FireMonkey FM 2 са којима можемо програмирати апликације изузетаног изгледа за Enterprise и ISV и то за Windows 8, Mac OS X Mountain Lion и Mobile и све то из истог изворног кода. Ту је и најновији механизам за повезивање са базама података. Нови Visual LiveBindings пружа најлакши начин за повезивање корисничког интерфејса са подацима у базама. Приступачније него икада до сада, Rad Studio XЕ3 Visual LiveBindings омогућава повезивање без писања иједног реда кода. Повезивање података и контрола је изузетно. Ако питамо било којег програмера који је програмски језик најбољи добићемо увек исти одговор, онај који он користи јер је ефикасан, једноставан, лак за учење итд. Права истина крије се баш у томе. Најбољи је онај језик који најбоље познајемо. А како онда одлучити шта је најбоље ако не знамо ниједан програмски језик. Нема правог одговора. Ако ћемо сами учити, најбоље је почети од језика за који имамо најбољу литературу (теоријске основе и примере развоја различитих апликација, нарочито оних каквим ћемо се бавити), а ако ће нам неко помагати онда препустимо њему да нас води. Када савладамо неке елементарне технике онда даље можемо и сами, а у зависности од прилика можемо и прећи на неки други програмски језик који ће захтевати конкретни посао Почетак рада и управљање развојним окружењем. Покретањем апликације отвара се неколико прозора које ћемо укратко описати. Широка трака на врху екрана (слика испод) је главни изборни прозор или главни прозор апликације. Њен изглед можемо прилагодити свом укусу, али и карактеристикама рачунара на коме радимо (монитор са вишом резолуцијом даје нам више могућности распоређивања делова). Стандардна трака прозора садржи назив програмског модула (Delphi 7 - Project1) са иконицом која представља дугме управљачког менија (Control Menu Button) и три екранска тастера (стандардни 20
20 управљачки тастери): Minimize, Restore Down / Maximize и Close. Подразумева се да знамо да минимизацијом овог прозора са екрана нестају и сви други, зависни прозори делфија и да се у том моду не може радити ништа. Затварањем овог прозора излази се из делфија. Ако оно што смо пре затварања није сачувано програм ће нас упозорити на то и тражити потврду акције или претходно чување нашег рада. Испод ње се налази линија главног менија са стандардним опцијама: File, Edit, Search, View, Project, Run, Component, Database, Tools, Window и Help. Велики део команди у менијима знамо из рада са неким другим виндоус апликацијама и зато ћемо се кратко задржати на њиховим специфичностима у делфију, а остале нећемо објашњавати јер се не уклапају у програм овог курса. Из File мени ћемо користити следеће команде: New - отвара подмени из кога треба одабрати опцију Application Open - отвара дијалошки прозор за учитавање постојећих пројеката и других текстуалних датотека које могу бити саставни део пројекта или не. Команду не треба га користити док мало боље не савладамо рад са делфијем Open Project - отвара дијалошки прозор за учитавање постојећих пројеката Reopen - отвара подмени са листом од пет последњих пројеката које смо сачували из које се кликом мишем може изабрати жељени и дужом листом паскалских програма (јунита) који се могу учитати, али не и стартовати из делфија (зато ту листу користимо за налажење путање до неког пројекта, а не за његово учитавање) Save - омогућава чување тренутно активне датотеке са датим именом (команду треба пажљиво користити јер не чува пројекат, па се може десити да касније не можемо отворити и покренути програм за који смо мислили да је сачуван) Save As - омогућава чување тренутно активне датотеке са промењеним именом; користи се када већ урађен сличан задатак желимо да искористимо да брже урадимо наредни задатак (команду треба обавезно користити у пакету са наредном да бисмо сачували и пројекат са промењеним именом, а не да у претходно отвореном пројекту само променимо име активне датотеке и тако изгубимо претходни задатак) Save Project As - омогућава чување активног пројекта са промењеним именом; користи се када већ урађен сличан задатак желимо да искористимо да брже урадимо наредни задатак Save All - омогућава чување активног пројекта са свим припадајућим датотекама Close затвара активни пројекат са припадајућим датотекама (корисније је, у ову сврху употребљавати наредну команду) Close All - затвара све отворене датотеке Print - штампа активну датотеку на штампачу Exit - затвара се отворени пројекат и напушта делфи апликација; ако оно што смо пре затварања није сачувано програм ће нас упозорити на то и тражити потврду акције или претходно чување нашег рада. Из Edit менија ћемо користити команде: Undo/Undelete - поништава последњу акцију или брисање Redo - враћа последњу акцију поништену претходном командом Cut - селектовани део активне датотеке брише и премешта на clipboard Copy - селектовани део копира на clipboard не бришићи га из активне датотеке Paste - копира садржај са clipboard-а у активну датотеку Delete - брише селектовани део активне датотеке Select All - селектује комплетан садржај активне датотеке Из Search менија ћемо користити команде: Find - проналази наведени текст, ако постоји, и маркира га Replace - проналази наведени текст, ако постоји, и мења га другим наведеним текстом Search Again - понавља претходно дефинисано претраживање Из View менија ћемо користити команде: Object Inspector - отвара и приказује прозор Object Inspector ако је претходно био затворен Object TreeView - отвара и приказује прозор Object TreeView ако је претходно био затворен Alignment Palette - отвара и приказује прозор Alignment Palette Toggle Form/Unit - на врх екрана поставља један од прозора form или unit Из Run менија ћемо користити команде: Run - преводи на машински језик написани програм и извршава га (ако нема грешака) Program Reset - насилно прекида извршење програма, ослобађа радну меморију и враћа нас у делфи да бисмо наставили рад на истом или другом програму (користи се када програм из неког разлога не може да се искључи на регуларан начин). Већина поменутих команди из ових менија има одговарајућу пречицу - комбинацију једног или више тастера којом се може извршити без директног отварања менија и избора команде из њега. У оквиру овог прозора могу се наћи и бројне тулбар траке које могу бити различито распоређене. На њима се налазе екрански тастери - speed buttons којима се, као и пречицама, поједине команде могу извршити без директног отварања менија и избора исте команде из њега. Неки од ових тастера не убрзавају рад са одговарајућом командом (јер команда може бити јако сложена), али је приступ команди једноставнији, па су они зато и постављени на одговарајућу траку. Сада ћемо навести тулбар траке које се стандардно налазе у главном прозору делфија и тастере који се налазе на њима без објашњавања одговарајуће команде јер смо команде које ћемо користити већ објаснили кроз систем менија. Испод траке са називом апликације, у првом реду у продужетку главног менија су тулбар траке (toolbar): Desktop са оквиром Desktop speedsetting и екранским тастерима: Save current desktop и Set debug desktop У другом реду, одмах испод главног менија су: 21
21 Standard са тастерима: New, Open, Save, Save All, Open project, Add file to project, Remove file from project Custom са тастером: Help contents У трећем реду испод главног менија је: View са тастерима: View unit, View form, Toggle Unit/Form, New form Debug са тастерима: Run, Pause, Trace into, Step over Са десне стране у продужетку од последња два реда са тулбар тракама налази се палета са објектима које можемо уградити у свој програм. Навешћемо их све, а затим објаснити само оне које ћемо користити у овом курсу (компоненте које су неопходне да би наш програм радио). Component palette са листићима: Standard, Additional, Win32, System, Data Access, Data Controls, dbexpress, DataSnap, BDE, ADO, InterBase, WebServices, InternetExpress, Internet, WebSnap, Decision Cube, Dialogs, Win 3.1, Samples, ActiveX, Rave, Indy Clients, Indy Servers, Indy Intercepts, Indy I/O Handlers, Indy Misc, COM+, InterBase Admin, IW Standard, IW Data, IW Client Side, IW Control, Servers у оквиру којих се налазе објекти које можемо уградити у свој програм једноставним превлачењем објекта на форму. Део листића се не види, па да би се до њих стигло треба притиснути неколико пута одговарајући тастер са стрелицом Најчешће ћемо користити листић Standard јер се ту налазе најједноставније компоненте за комуникацију програма са корисником, у ретким случајевима ћемо користити неке од компоненти са листића Additional, Win32, System. Остале листиће и компоненте нећемо користити. Селектовање компоненте коју желимо да уградимо у свој програм остварује се кликом миша на њену графичку представу на листићу, а затим кликом на одговарајућу позицију на форми постављамо изабрану компоненту. Ако смо се предомислили, па не желимо ту компоненту можемо: - кликнути на другу компоненту, ако је потребно у програм уградити је, или - кликнути на стрелицу на почетку траке са компонентама, ако не желимо да додамо било шта. Са листића Standard најчешће ћемо користити компоненте: - Label (сличица са великим словом A) - Edit (сличица са малим словима ab) - Button (сличица са словима ОК) - Меmо (сличица између едита и тастера), - ComboBox (једанаеста сличица не рачунајући стрелицу за деселекцију) и - Panel (претпоследња сличица на листићу). Са листића Additional најчешће ћемо користити компоненте: - BitBtn (компонента личи на тастер са могућношћу комбиновања слике и текста на њој), - Image (када желимо да свој програм украсимо сликом) и - LabeledEdit (компонента која представља комбинацију лабеле и едита). Са листића Win32 ћемо користити само компоненту DateTimePicker за читање системског времена и датума. Са листића System ћемо користити само компоненту Timer, а занимљиве су и PaintBox и MediaPlayer код креирања мултимедијалних апликација, али их нећемо користити на почетку учења. Централни део екрана заузима прозор са именом Form1. Форма (образац) представља радну површину програма. То је оно што ће се видети на екрану када се програм извршава. На форму се постављају објекти. Дефинисањем параметара - карактеристика (Properties) форме дефинишемо изглед нашег програма. Једна од карактеристика форме је име - Form1, уопштено, аутоматски додељено на почетку рада што значи да се и оно може, по жељи, променити. Затим ширина и висина форме, боја позадине, основни фонт итд. Као и сваки прозор, форма у десном горњем углу има тастере: Minimize, Restore Down / Maximize и Close и дугме управљачког менија у облику иконице која симболише програмски језик делфи (ови елементи се могу, по жељи, искључити) и назива форме. 22
22 Испод овог прозора налази се прозор Unit1. У њему се пишу кодови процедура и функција које се користе у програму. Подељен је на два дела. У левом делу, који се зове Code Explorer и може бити самосталан прозор изван прозора јунита, виде се називи свих компоненти које смо уградили у свој програм, називи свих променљивих и константи које су декларисане и дефинисане и њихове везе. У десном делу, који се назива Edit Window, су изворни кодови процедура и функција, као и декларације и дефиниције. Наравно, ако програм који пишемо, садржи више независних целина, тј. јунита, десни део овог прозора ће имати посебне листиће за сваки од њих, а прелазак из једног у други листић је стандардни клик левим тастером миша над његовим именом. Прелазак из прозора јунита у прозор форме и обрнуто омогућава тастер F12. Уколико имамо више прозора са јунитима прелазак из једног у други омогућава комбинација Ctrl+F12, а ако имамо више прозора са формама прелазак из једног у други омогућава Shift+F12. Наравно, ако су ови прозори видљиви или бар неки њихов део, из једног у други можемо прећи и једноставним кликом миша на неки од њих. Јунит нема карактеристике јер је невидљив када се програм покрене, а назив јунита се даје приликом чувања пројекта. Лево од ова два прозора (мада се распоред прозора може по жељи мењати, али говоримо о стандардном, изворном распореду прозора - пре било какве акције корисника) су још два стандардно отворена прозора: Object Tree View и Object Inspector. За разлику од претходних прозора, ови се не могу ни минимизирати нити максимизирати помоћу стандардних тастера. Можемо их увећавати или смањивати повлачењем ивица уз помоћ миша или затворити левим кликом на X. Но, то не представља њихов недостатак с обзиром да су то помоћни прозори са дефинисаним садржајем који програмер не може мењати. У случају да су намерно или грешком затворени притиском тастера X или другачије отварају се притиском тастера F11 (Object Inspector) и Shift+Alt+F11 (Object TreeView). Object TreeView је помоћни прозор у коме се виде називи инсталираних компоненти програма и њихова повезаност са главном формом и, евентуална, припадност неким другим компонентама које се налазе на главној форми програма. Нарочито је значајан када се пишу компликованији програми са више панела или форми, програми у којима се поједине компоненте, односно, објекти који су постављени на форму преклапају тако да неки чак и нису видљиви (јер су прекривени другим компонентама), па их је зато немогуће селектовати ради постављања или измене њихових карактеристика. Тада је довољно, да бисмо селектовали један такав скривени објекат, да једноставно кликнемо на његово име у Object TreeView прозору и онда можемо, иако га не видимо, да мењамо његове карактеристике (наравно, морамо знати који се ефекат постиже изменом неке карактеристике, нарочито ако се она односи на спољашњи изглед објекта који не видимо). Object Inspector је врло користан помоћни прозор у коме за активну компоненту, тј. објекат чије име се исписује у првом оквиру, дефинишемо карактеристике и његово реаговање на разне догађаје. Овај прозор има два листића: Properties и Events. Листић Events садржи листу свих догађаја на које одређени објекат може реаговати. Двокликом у оквир десно од назива догађаја аутоматски се отвара процедура коју треба да напише програмер, а која ће представљати реакцију објекта на тај догађај. У случају да је програмер већ дефинисао неке процедуре које могу бити реакција на изабрани догађај, левим кликом на стрелицу на десном крају оквира тог догађаја ће се отворити листа са њиховим именима из које се може изабрати само једно, тј. на један догађај се може реаговати само на један начин. Листа догађаја објекта може бити променљиве дужине у зависности од врсте објекта чија се реакција дефинише, тј. немају сви објекти исту осетљивост на разне догађаје. Листић Properties садржи све могуће карактеристике изабраног објекта (величина, боја, положај, хоризонтално и вертикално уређење, наслов, облик рубова, фонт, име итд) и њихове предефинисане вредности, ако постоје, а код неких карактеристика и све вредности од којих се може изабрати само једна. Програмер има могућност да овде промени све карактеристике објекта не пишући програмски код, већ директним уносом вредности карактеристике у предвиђени оквир. Различити објекти имају различит број карактеристика, па је зато дужина овог листића променљива, осим тога, неке карактеристике које се не мењају често могу бити сакривене, невидљиве или се могу приказивати, по жељи програмера. Неке карактеристике означене су симболом + или - јер представљају сложене, тј. вишедимензионалне карактеристике, на пример: карактеристика Font се састоји из детаља: Charset - кодна страна, Color - боја исписа, Height - висина у тачкама, Name - назив фонта, Pitch - растојање између узастопних слова, Size - величина слова и Style - 23
23 стил исписа који је, такође, сложен и састоји се из подкарактеристика fsbold, fsitalic, fsunderline, fsstrikeout. Притиском на симбол + отварају се сви детаљи који припадају тој карактеристици, а симбол + прелази у симбол -. И неки детаљи, такође, могу бити означени овим симболима, па ако су означени симболом + на исти начин се отварају. Притиском на симбол - затварају се сви детаљи који припадају тој карактеристици, а симбол - прелази у симбол +. Карактеристике објеката у оквиру овог листића су обично уређене по абецедном редоследу, али могу бити уређене и по категоријама, ако нам је тако једноставније да пронађемо карактеристику коју желимо да дефинишемо. Промену начина уређења карактеристика објеката извршићемо притиском десног тастера на било којем делу Object Inspector прозора, избором опције Arrange и, затим, опције by Category или by Name. Избором опције Properties можемо дефинисати боје позадине и исписа (што није претерано важно, али некоме може нешто и значити) као и шта ће се приказивати код карактеристика. Промена неке карактеристике објекта одмах се приказује на селектованом објекту и задржава се све док се програмски или поновном променом на овом листићу не дефинише њена другачија вредност. Ако се промена карактеристике изврши у програму (када се програм стартује) онда она није трајна, тј. поновним стартовањем истог програма карактеристике објеката се постављају на оне које су претходно дефинисане у листићу Properties. Осим ових, стандардно отворених прозора на радној површини делфија могу се појавити и многи други помоћни прозори. Погледајмо (и опишимо) сада само неке од њих: To-Do List је прозор у коме се приказује редослед одвијања операција код извршења програма; Components (претраживач компоненти је корисна алатка ако знамо назив објекта, али не знамо на којој палети се он налази); Project Manager је прозор у коме се виде групе пројеката и пројекти у оквиру групе пројеката и омогућава навигацију, кретање кроз пројектне датотеке. Овај прозор можемо користити и код додавања или брисања пројеката из групе као и за активацију пројекта у оквиру групе. Везано за пројекат, помоћу њега се додају, бришу, чувају и копирају датотеке које припадају том пројекту. Овде се могу видети називи свих jунита и припадајућих форми у оквиру пројекта или групе пројеката. Align - помаже код уређења положаја објеката, леви клик миша на одговарајуће дугме у овом прозору док су селектовани неки објекти на форми помериће некe у смеру стрелице на дугмету до постизања жељеног положаја). Осим поменутих прозора могу се отварати и други. На пример, разни Debug прозори отварају се, на захтев, код превођења програма, у њима се исписују евентуалне грешке у програмском коду, у прозору Evaluate/Modify могу се исписивати и мењати вредности променљивих у појединим фазама програма, у прозору Watch могу се исписивати вредности променљивих или израза у току извршавања програма и слично што може програмеру помоћи да тестира понашање и отклони евентуалне недостатке програма и други. Ове прозоре нећемо сада објашњавати јер нису неопходни за рад на почетку дружења са делфијем. Уз програмски пакет Delphi иде детаљно упутство за радознале и оне који би да науче о овом пакету више него што је обимом ове књиге предвиђено. Упутство је прилагођено раду под оперативним системом XP, а да би се користило под новијим оперативним системом треба инсталирати програмски додатак са сајта његовог произвођача ( 24
24 3. 2. Празан пројекат. Отварањем делфи апликације отворили смо празан пројекат. И овакав пројекат је виндоуз апликација. Може се покренути (након компајлирања). Има све карактеристике апликације: радни прозор, наслов апликације, системски мени са одговарајућим тастерима. Радни прозор се може премештати, можемо му мењати димензије и облик, али ништа не ради (јер нисмо написали програмски код који би вршио неку активност). Основне датотеке које садржи сваки делфи пројекат су: Project1.cfg - конфигурацијски документ који чува параметре пројекта неопходне за рад самог делфија у току израде апликације. Project1.dpr - Delphi Project датотека - основни програмски код који генерише сам делфи и не би је требало дирати без превелике потребе. Project1.res - ресурсна датотека, садржи различите ресурсе које користи апликација коју креирамо, дефинитивно је не треба уклањати. Project1.dof - садржи тренутно важеће параметре за опције у пројекту као што су компајлерски и линкерски параметри, директоријуми, директиве и командни параметри. Unit1.pas - изворни код паскалског програма. Unit1.dfm - Delphi Form датотека, садржи основне параметре извршног прозора апликације коју креирамо. То је текстуална датотека коју делфи интерпретира графички. Осим ових, код компликованијих програма могу се јавити и још неке датотеке које се аутоматски креирају (Unit1.dcu, Unit1.ddp и друге), а компајлирањем програма формира се и Project1.exe - извршна датотека. Име пројекта се аутоматски додељује - Project1. Овде можемо да видимо структуру сваког програма (датотека Project1.dpr може се отворити било којим едитором текста, на пример помоћу Notepad-а, само пажљиво, да се не би десило да датотеку придружимо едитору и да је касније не можемо, аутоматски, отворити помоћу делфијевог едитора): program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Пројект се састоји из јунита и форме. Јунит (Unit1.pas) на почетку рада изгледа овако: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(tform) private { Private declarations } public { Public declarations } var Form1: TForm1; implementation {$R *.dfm} end. Празна форма са предефинисаним димензијама и изгледом, са натписом Form1 дефинише се као текстуална датотека, неки атрибути могу имати и другачије вредности у зависности од рачунара на коме се ради, (датотека Unit1.dfm): object Form1: TForm1 Left = 192 Top = 114 Width = 870 Height = 640 Caption = 'Form1' Color = clbtnface Font.Charset = DEFAULT_CHARSET Font.Color = clwindowtext Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] 25
25 OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 end Покретање ове празне, као и било које друге апликације, остварује се избором команде Run из одговарајућег менија, кликом на тастер у облику зеленог троуглића ("плеј" дугме) или коришћењем пречице - функцијски тастер F9. Пре покретања апликације, добро је сачувати је како нам се не би десило да изгубимо свој "труд" у случају непланираног и неконтролисаног напуштања делфи апликације било услед грешке у програмском коду, било из неког другог, спољашњег разлога. Опште правило у раду са рачунаром је да би требало свој рад чувати често и у фази израде и касније код сваке измене. Учесталост чувања се, обично, одређује обимом посла, тј. кад год урадимо нешто што не бисмо желели да радимо још једном, колико год то било, треба то и сачувати. Празан пројекат је полазна основа у изградњи било које апликације. Наравно, када радимо неки пројекат који мање или више личи на неки претходни, не морамо кренути од празног пројекта и губити време на подешавање истих карактеристика, писање истих или сличних програмских кодова, већ можемо искористити постојећи. У таквом случају, одмах по отварању пројекта који желимо да искористимо за креирање новог потребно је сачувати га са другим именом, како не бисмо изгубили претходни Чување и отварање пројекта. Једна од важнијих ствари које морамо научити пре писања било ког програмског кода је како сачувати свој пројекат. Пошто се сваки пројекат састоји из датотека морамо, пре чувања пројекта, креирати нови фолдер, па тек онда у њега сачувати свој пројекат. Фолдер се може креирати пре отварања новог пројекта или у току рада на новом пројекту. Објаснићемо други начин (јер се претпоставља да је први познат од раније). Из менија File изабраћемо команду Save All. Отвориће се прозор за дијалог Save Unit1 As. Пошто први пут чувамо пројекат, најпре ћемо отворити нови фолдер кликом на сличицу фолдера са звездицом у горњем десном углу или десним кликом у празни део прозора и избором опције New -> Folder. Фолдеру треба дати име које ће нас подсетити на проблем који се решава овим пројектом (на пример: ResavanjePravouglogTrougla). Име фолдера не би требало да садржи размаке, интерпункцијске знаке ни наша слова (сва ћирилична и латинична слова ш, ђ, ч, ћ, ж). У неким верзијама оперативног система употреба ових карактера неће представљати никакав проблем, али због могућности преношења нашег програма на различите рачунаре, ипак, треба поштовати препоруку). Затим треба отворити тај фолдер, двокликом на његову иконицу или кликом на дугме Open (које ће се исцртати уместо дугмета Save на слици). У оквиру означеном са File name: треба уписати име програма (ово није обавезно, тј. име јунита не мора се мењати, може се оставити понуђено Unit1, јер ће у овом фолдеру бити само један задатак, односно, само један јунит). Код давања имена јуниту не би требало користити размаке, знаке интерпункције, латинична слова ш, ђ, ч, ћ, ж нити наша ћирилична слова. Када смо дали име јуниту кликнућемо на дугме Save. Сада се отвара нови дијалошки прозор Save Project1 As у којем треба уписати име пројекта (ово, такође, није обавезно, тј. име пројекта не мора се мењати, коже се оставити понуђено Project1, јер ће у овом фолдеру бити само један задатак, односно, само један пројекат). За име пројекта важе исте напомене као и за име јунита, а име пројекта не би требало да буде исто као име јунита. Код сваке значајне измене програма, без обзира да ли смо на форму додали нове компоненте или смо мењали програмски код, треба сачувати пројекат помоћу команде Save All при чему се претходни прозори више неће отварати (само ћемо себи уштедети мало времена и много нерава у случају да се нешто непредвиђено деси са рачунаром, па да писање програм не морамо да кренемо од почетка). У случају да нисмо отворили нови пројекат, већ користимо постојећи за креирање новог (јер има случну форму или се део програмског кода преклапа са новим или из било којег другог разлога) применом претходно описаног начина преко старог пројекта сачуваћемо нови. На тај начин смо изгубили претходни пројекат. Да се 26
26 то не би десило, у оваквом случају поступак чувања пројекта биће другачији. Из менија File изабраћемо прво команду Save As. Отвориће се прозор за дијалог као на првој слици и сачуваћемо јунит како је раније описано (креираћемо нови фолдер и у њему са истим или промењеним именом сачувати јунит). Затим ћемо из менија File изабрати команду Save Project As. Отвориће се прозор за дијалог као на другој слици и сачуваћемо пројекат како је описано. Пројекат затварамо изабором команде Close All из менија File. Ако претходни пројекат нисмо сачували програм ће нас упозорити на то и дати нам могућност да измене сачувамо пре затварања пројекта. Нови празан пројекат отвара се изабором команде New -> Application из менија File. И у овом случају, ако је претходно био отворен неки пројекат који није сачуван отвориће се исти дијалошки прозор упозорења који ће нам дати нам могућност да измене сачувамо пре затварања пројекта. Отварање постојећег пројекта остварује се тако што се из менија File изабере команда Open Project. Ако претходни пројекат нисмо сачували поново ће се отворити претходно описани дијалошки прозор, упозорити нас на то и дати нам могућност да измене сачувамо пре отварања новог пројекта. Након тога ће се отворити прозор за дијалог као на слици. Треба пронаћи фолдер из којег желимо да отворимо пројекат и отворити га двокликом. Двокликом на само име пројекта или обележавањем простим кликом миша и кликом на дугме Open отвориће се жељена апликација. У случају да се апликација не отвори онда претходни поступак чувања пројекта није испоштован или је накнадно обрисана нека од важних датотека. У неким случајевима то се може решити активностима у оперативном систему, али у већини случајева то значи да ту апликацију не можемо користити за измене или креирање нове. Зато је од изузетне важности научити правилно чување пројекта. Отварање постојећег пројекта могуће је и из оперативног система, пре покретање делфи пакета, тако што се отвори одговарајући фолдер и двокликом изабере пројекат који се отвара. Оперативни систем ће аутоматски покренути делфи апликацију и у њој отворити изабрани пројекат. У овој верзији делфија нема могућности рада са више пројеката истовремено. У једном тренутку могу бити отворена два или више програма, али то подразумева да смо два или више пута покренули програмски пакет делфи. Код неких врста програма, то може значајно успорити или сасвим онемогућити рад на развоју апликације. Ако желимо да гледамо решење једног задатка и на основу њега решавамо други, сличан, треба јунит отворити у неком едитору (на пример у Notepad-у) одакле можемо или копирати или само гледати решење Форма и подешавање њених својстава. Почетни изглед форме описан је у Unit1.dfm датотеци и додавањем нових елемената на форму или мењањем карактеристика већ постојећих, ова датотека се допуњава. Ово је текстуална датотека и њен садржај прегледати у неком едитору. Садржај датотеке може се и мењати у едитору без последица по рад програма уколико не направимо неку грешку. Док је програм отворен у делфију не би требало мењати садржај ове датотеке. Својства форме се могу, у зависности од самог својства, подешавати директно, помоћу миша (ово се односи само на величину и положај форме) или уписивањем одговарајућих карактеристика на листићу Properties прозора Object Inspector (односи се на готово сва својства форме), а могу се поједина својства подешавати и програмски, тј. у фази извршавања пројекта форма може мењати изглед и друге карактеристике. Најчешће се мењају следећа својства: Спољашње димензије форме, односно, ширина (Width) и висина (Height) прозора, али и унутрашње димензије прозора ClientWidth и ClientHeight, при чему се не могу истовремено користити и спољне и унутрашње димензије јер су зависне једне од других. Позиција на екрану, односно, растојање од левог (Left) и од горњег (Top) руба екрана, а осим са ове две, може се дефинисати и карактеристиком Position (са вредностима podefault, podefaultposonly, podefaultsizeonly, podesigned, podesktopcenter, pomainformcenter, poownerformcenter, poscreencenter) и карактеристиком Align (са вредностима albottom, alclient, alcustom, alleft, alnone, alright, altop) при чему ова последња појединим вредностима онемогућава дефинисање ширине или висини прозора апликације. Назив прозора (Caption), односно, текст који ће се исписивати у ттраци на врху прозора. Боја радне површине (Color), избор се врши између 20 стандардно понуђених боја или двокликом на ову карактеристику отварамо палету са које можемо да креирамо једну од преко 16 милиона боја. Стил рубова прозора (BorderStyle), односно, дозвољавамо или забрањујемо кориснику да манипулише позицијом и величином прозора (bsdialog, bsnone, bssingle, bssizeable, bssizetoolwin, bstoolwindow 27
27 су дозвољене вредности, друга и четврта дозвољавају пуну слободу кориснику, а остале делимично или потпуно ограничавају измену прозора апликације). Дебљина оквира (BorderWidth), карактеристика практично дефинише део радне површине уз рубове прозора који се не могу користити за постављање објеката (нешто слично маргинама). Контролна дугмад прозора bisystemmenu, biminimize, bimaximize, bihelp се могу видети на горњем рубу прозора или не, што се подешава у оквиру карактеристике BorderIcons. У оквиру карактеристике Font дефинишемо основни фонт који ће се аутоматски придруживати свим објектима које касније поставимо на форму. Стил форме (FormStyle) дефинише да ли је прозор апликације зависан или не од неког другог прозора и да ли ће бити увек на врху свих отворених прозора, могуће вредности су fsmdichild, fsmdiform, fsnormal, fsstayontop. Облик прозора (WindowState) са вредностима wsmaximized, wsminimized, wsnormal Додавање компоненти форми. Додавање компоненти форми је врло једноставно. Пронађемо жељену компоненту на некој од палета, кликнемо левим тастером миша на њу, а затим кликнемо на одговарајуће место на форми. Не постоји могућност да додамо истовремено више компоненти, већ се овај поступак понавља жељени број пута. Када смо кликнули на неку компоненту она је селектована и клик на форму је тамо и преноси. Ако смо се предомислили и не желимо ту компоненту, већ неку другу, довољно је клинути левим тастером миша на ту другу компоненту и на тај начин аутоматски деселектовати прву и селектовати другу. Ако не желимо ни једну компоненту у овом тренутку, треба кликнути на прву сличицу на палети (стрелица на горе-лево) и на тај начин деселектовати претходно изабрану компоненту. Компонента која је постављена на форму уклања се са форме селектовањем и притиском тастера Delete на тастатури или десним кликом на компонету, па избором команде Delete из подменија Edit падајућег менија који смо отворили. Ако смо додали једну компоненту на форму, а желимо још неколико таквих, можемо понављати поступак додавања потребан број пута или додату компоненту селектовати и ископирати потребан број пута. Копирање се може остварити десним кликом миша на компоненту и подменија Edit падајућег менија који се отвара или селектовањем компоненте помоћу миша и коришћењем пречица помоћу тастатуре (Ctrl+C за копирање објекта у меморију и Ctrl+V, потребан број пута, за постављање копија објекта на форму). Компоненте се на форму могу додати и копирањем са неке друге форме као и програмски (програмер може дефинисати појављивање објекта на форму, али се за овакав начин додавања компоненти захтева виши ниво познавања програмирања у објектно оријентисаним програмским језицима) Компонента у жижи. Компонента може бити у жижи и тада јој се могу мењати карактеристике. Да бисмо знали која је компонента активна довољно је да погледамо на врх прозора Object Inspector-а. Њено име је исписано у првом оквиру. Активна компонента је означена и са осам црно обојених квадратића, на угловима и срединама страница. У извршној верзији апликације, такође, битно је знати која је компонента тренутно активна, односно, у жижи. Када се програм покрене, нема Object Inspector-а, а нема ни црних тачкица на рубовима компоненте и тада активну компоненту можемо препознати по неким другим карактеристикама које зависе од врсте компоненте. Ако се ради о текст компоненти, она је у жижи ако у њој трепери курсор. Ако се ради о графичкој компоненти, она је у жижи ако је око натписа на њој видљив испрекиданим линијама исцртан правоугаоник. На слици је чекбокс компонента у жижи (што препознајемо по тачкицама исцртаном оквиру око текста). У једном тренутку, само једна компонента може бити у жижи. Жижу са компоненте на компоненту премештамо тастером Tab на тастатури или кликом миша на изабрану компоненту. Неке компоненте не могу бити у жижи. Да би компонента могла бити у жижи мора поседовати карактеристику TabStop. Карактеристиком TabStop дефинишемо редослед постављања компоненти у жижу. Овај, природни, редослед може се пореметити кликом мишем на одговарајућу компоненту. Добро организовани програм има редослед доласка компоненти у жижу који прати алгоритамско решење. 28
28 3. 7. Једноставне компоненте натпис (Label) Натпис или лабела (Label) је компонента која омогућава једносмерну комуникацију на релацији програм - корисник, односно, помоћу ње се кориснику програма саопштава нешто; корисник не може да мења садржај лабеле нити на било који начин да утиче на њен изглед и величину осим када је то програмом дефинисано, односно, када је испрограмирано да се на неки начим промене карактеристике задате у фази дизајнирања програма. Када се програм извршава, ова компонента не може бити у жижи. Компонента се налази на листићу Standard на четвртом месту (велико слово А). Као и сваки други објекат, лабела има одређене особине које се могу подешавати како би се постигли одговарајући ефекти. Најчешће ћемо подешавати следећа својства: Align - положај лабеле у односу на рубове форме Alignment - уређење текста у оквиру лабеле AutoSize - аутоматско подешавање величине лабеле Color - боја лабеле Caption - текст који је исписан на лабели Font - врста слова, начин исписа, величина, боја и ефекти Height - висина објекта Layout - вертикално уређење текста у лабели Left - растојање објекта од левог руба форме Name - име објекта Top - растојање објекта од врха форме Transparent - провидност позадине лабеле Visible - видљивост објекта Width - ширина објекта WordWrap - пренос текста на лабели у нови ред оквир за уношење и приказивање текста (Edit) Едит или оквир за текст (Edit) је компонента која омогућава двосмерну комуникацију на релацији програм-корисник, односно, помоћу ове компоненте програм може да саопштава поруке кориснику и корисник може да се обраћа програму уносом одговарајућих података; кориснику се програмом може дозволити или забранити измена садржаја ове компоненте. Када је ова компонента у жижи у њеном оквиру трепери курсор. Компонента се налази на листићу Standard на петом месту (мала слова аб). Најчешће ћемо подешавати следећа својства: CharCase - исписивање малих и великих слова у едиту Color - боја едита Enabled - да ли је дозвољено приступити едиту Font - врста слова, начин исписа, величина, боја и ефекти Left - растојање објекта од левог руба форме MaxLength - максимални број карактера који се може уписати Name - име објекта ReadOnly - да ли је дозвољено мењање садржаја едита TabOrder - редни број објекта Text - садржај едита Top - растојање објекта од врха форме Visible - видљивост објекта Width - ширина објекта дугме (Button) Тастер, дугме или батон (Button) је компонента којом се корисник обавештава о могућности извршења неке акције у програму за коју је потребна конкретна активност корисника, односно, кликом мишем на ову компоненту корисник програму саопштава да жели да се нека акција изврши; корисник нема права да мења изглед и функцију ове компоненте јер је то програмом дефинисано. Компонента се налази на листићу Standard на седмом месту (сличица са словима ОК). Најчешће ћемо подешавати следећа својства: Caption - текст који је исписан на тастеру Enabled - да ли је дозвољено приступити тастеру Font - врста слова, начин исписа, величина, боја и ефекти Height - висина тастера Left - растојање објекта од левог руба форме Name - име објекта TabOrder - редни број објекта Top - растојање објекта од врха форме Visible - видљивост објекта Width - ширина објекта WordWrap - пренос текста на тастеру у нови ред 29
29 Мемо поље (Memo) Мемо поље (Memo) је компонента којом се омогућава унос и приказивање вишередног текста. Ова компонента представља неки облик елементарног едитора текста без могућности напредног уређивања текста. Компонента се налази на листићу Standard на шестом месту (сличица која подсећа на лист папира из свеске). Најчешће ћемо подешавати следећа својства: Align - положај објекта у односу на рубове форме Alignment - уређење текста у оквиру поља Color - боја позадине поља за текст Enabled - да ли је дозвољено приступити пољу Font - врста слова, начин исписа, величина, боја и ефекти Height - висина објекта Left - растојање објекта од левог руба форме Lines - садржај мемо поља MaxLength - максимални број карактера који се може уписати Name - име објекта ReadOnly - да ли је дозвољено мењање садржаја мемо поља TabOrder - редни број објекта Top - растојање објекта од врха форме Visible - видљивост објекта Width - ширина објекта WordWrap - пренос текста у нови ред Комбобокс (ComboBox) Комбиновани оквир, комбобокс (ComboBox) је компонента којом се кориснику омогућава унос директним уносом податка или избором из падајуће листе. Користи се нарочито у ситуацијама када је врло битан начин исписа податка који се уноси или ако су подаци који се уносе јако компликовани, а могућности (број различитих уноса) су ограничене. Компонента се налази на листићу Standard на једанаестом месту (сличица едита са спуштеном листом за избор). Најчешће ћемо подешавати следећа својства: AutoComplete - аутоматско исписивање податка који одговара унетом првом слову (или групи слова) AutoDropDown - аутоматско спуштање листе када објекат постане активан CharCase - исписивање малих и великих слова у оквиру Color - боја позадине поља за текст Enabled - да ли је дозвољено приступити тастеру Font - врста слова, начин исписа, величина, боја и ефекти Height - висина објекта ItemHeight - висина податка са листе ItemIndex - редни број податка са листе који је изабран Items - листа података Left - растојање објекта од левог руба форме MaxLength - максимални број карактера који се може уписати Name - име објекта Sorted - да ли су подаци на листи уређени TabOrder - редни број објекта Text - податак који је исписан у главном оквиру Top - растојање објекта од врха форме Visible - видљивост објекта Width - ширина објекта часовник (Timer) Компонента која омогућава извршавање програмских елемената периодично, тј. у тачно одређеном тренутку у односу на њено активирање. Може да се користи код симулација кретања као и код других аудио и визуелних ефеката који треба да се појављују у једнаким временским интервалима. Једна компонента може да контролише само једну програмску целину. Дозвољена је употреба произвољног броја ових компоненти. Пошто су на извршном екрану невидљиве, ове компоненте неће нарушити уређење излазне форме апликације колико год да их је активирано. Компонента се налази на листићу System на првом месту (часовник). Подешаваћемо следећа својства: Enabled - да ли је тајмер активан, укључен Interval - период у милисекундама који активира неки догађај Name - име тајмера оквир за графички објекат (Image). Излазни екран (лице) апликације може бити ефикасније ако се додају различити графички објекти, цртежи или слике. Да би се омогућило такво опремање форме потребно је искористити компоненту оквир за слику - Image. Компонента се налази на листићу Additional на шестом месту (плави пејзаж). 30
30 Најчешће ћемо подешавати следећа својства: Align - положај слике у односу на рубове форме AutoSize - аутоматско подешавање величине оквира слике Center - центрираност слику у оквиру Enabled - да ли је дозвољено приступити оквиру слике Height - висина оквира слике Left - растојање од левог руба форме Name - име оквира за слику Picture - слика која се приказује у оквиру Stretch - да ли слика испуњава оквир за слику Transparent - провидност оквира за слику Top - растојање од врха форме Visible - видљивост оквира са сликом Width - ширина оквира за слику Постоје и друге једноставне, а врло занимљиве и корисне компоненте (ListBox, ChechBox, RadioButton, Panel, BitBtn, SpeedButton, Bevel, Shape, DateTimePicker) које ћемо ређе користити, па ћемо их упознавати по потреби, приликом решавања појединих задатака Својства компоненти и њихово подешавање. Селектовањем неке компоненте, у Object Inspector-у на листићу Properties можемо изабрати и подесити одговарајућу карактеристику те компоненте. Карактеристике компоненти могу се подешавати и из саме апликације у току извршавања, ако се у програмски код угради одговарајућа рутина. Већина карактеристика може се из апликације подесити простом нардбом: компонента.карактеристика:=вредност Догађаји компоненти и обрада догађаја. У објектно оријентисаном програмирању тежиште је на објектима (као што и само име каже) и оно што може да се догоди са или око објеката, односно различити догађаји. Шта може бити догађај? Све што урадимо директном акцијом помоћу миша или тастатуре, али и све што је последица извршавања програма или неког његовог дела, може бити догађај. Клик мишем или само притисак или отпуштање тастера на мишу, прелазак показивача миша преко објекта, превлачење објекта, промена димензија, притисак неког тастера на тастатури, унос неке вредности, појава или нестајање објекта и друго, све су то неки догађаји који се могу "осетити" или не у зависности од врсте објекта. Задатак програмера је да одлучи на које догађаје ће, поједини објекти који су саставни део апликације реаговати, односно, на које догађаје ће бити "осетљиви" и какво ће бити њихово понашање, тј. шта ће се дешавати. Ако ниједан догађај није обрађен, онда написани програм неће радити ништа, тј. он је бескористан. Неки од важнијих могућих догађаја објеката су: OnActivate - када објекат постане активан OnClick - када се мишем кликне изнад објекта OnClose - када се објекат затвори OnCreate - када се објекат креира OnDblClick - када се двапут кликне мишем изнад објекта OnDeactivate - када објекат престане да уде активан OnDestroy - када се објекат избрише OnDragDrop - када се објекат превуче и отписти OnDragOver - када се објекат довлачи OnHide - када се објекат сакрије, тј. објекат још увек постоји, али се не види. OnKeyDown - када се на тастатури притиска било који тастер OnKeyPress - када је на тастатури откуцан неки тастер OnKeyUp - када се на тастатури отпишта неки тастер OnMouseDown - када се миш креће на доле преко објекта OnMouseMove - када се миш креће преко објекта OnMouseUp - када се миш креће на горе преко објекта OnMouseWheel - када се покрене точкић на мишу OnMouseWheelDown - када покрећемо точкић на мишу према себи OnMouseWheelUp - када покрећемо точкић на мишу од себе OnResize - када се објекту мења величина Наравно, не могу сви објекти реаговати на све догађаје. Неки објекти су "осетљивији", тј. могу да реагују на више догађаја, а неки, опет, нису, тј. реагују на врло мали број догађаја. Пажљивим одабиром објеката и дефинисањем њихове "осетљивости" могу се направити врло атрактивне апликације (наравно, да би то било успешно треба имати много искуства, знања, маште, воље и времена, али се исплати). Код обраде догађаја, пошто неки могу бити сложени и састојати се из неколико других догађаја, мора се водити рачуна да једна реакција не поништава другу. Може се десити и да једна реакција производи други 31
31 догађај, па се поништи претходна реакција или се програм заблокира. Зато треба бити јако пажљив и, пре писања неке реакције, добро размислити о свим последицама које реакција може произвести, а то је већ уметност програмирања Питања на која треба обратити пажњу > Објектно оријентисано програмирање, основни концепти > Изглед развојног окружења делфи пакета > Елементи главног прозора делфи пакета > Функције помоћних прозора и рад са њима > ObjectTreeView, карактеристике > ObjectInspector, карактеристике и функције > Подешавање својстава форме пројекта > Чување новог пројекта > Отварање новог и постојећег пројекта > Рад са палетом са компонентама > Најчешће коришћене компоненте и њихова својства > Додавање компоненти на форму пројекта > Селектовање компоненте > Врсте догађаја на које компоненте могу да реагују 32
32 4. Типови података Подела типова података Програми се пишу да би се обрадили неки подаци који могу бити бројеви, речи или нешто друго. У зависности од типа података дозвољене су различите операције са њима. Не могу се две речи помножити или бројеви делити на слогове. Програмски језици су, углавном, строги у односу на типове података и не дозвољавају њихово мешање. Типови података могу да се деле разне начине, а најчешћа подела је на: стандардне и изведене. Стандардни типови су они који су уграђени и дефинисани у структури програмског језика и могу се одмах и увек користити у свим програмима. Изведени тип података, по потреби, дефинише корисник у свом програму и важи само у том програму, тј. ако га желимо користити у неком другом пограму морамо га у том програму поново дефинисати. Тип података се дефинише именом које се не сме поклапати са неком од резервисаних речи програмског језика и навођењем свих елемената који припадају том типу. Након дефиниције неког типа у програму он се може користити као стандардни, али само у том програму. Друга подела типова података (која не искључује прву) је на: просте, стрингове, структурне и показиваче. Просте типове података чине: уређени типови и реални тип. За уређене типове (ordinal types) карактеристично је да се за сваки њихов елемент зна који је испред, а који иза њега. Деле се на: char - слова или у општем случају, карактери јер и симболе 1, 2, 3, *, / и друге можемо третирати као словни податак, а нико за њих неће рећи да су слова; integer - цели бројеви (..., -2, -1, 0, 1, 2,...); boolean - логички тип, (вредности true и false); набројани тип и интервални тип Прва три уређена типа су стандардни типови података, а последња два немају унапред задати домен већ се дефинишу у зависности од потребе корисника. Структурни типови су: Set - скуповни тип; Array - низовни тип; Record - слоговни тип; File - датотечни тип; Class - класе Структурни типови могу да се користе као стандардни ако је њихова примена могућа без посебно дефинисаног имена, али врло често се дефинишу у складу са захтевима програма. Важно је напоменути да у оквиру појединих од поменутих типова података постоје подтипови који се међусобом разликују по броју елемената и прецизности, а за све подтипове истог типа важе исте операције и у неким случајевима дозвољено је њихово мешање, односно, у неким случајевима променљивама једног подтипа могу се додељивати вредност променљивих другог подтипа истог типа података Целобројни тип (integer) Integer је прости уређени тип података чије вредности могу бити сви цели бројеви који се могу представити у меморији рачунара. Добро је уређен, тј. за било који елемент овог типа зна се који елемент је испред и који елемент је иза њега. Опсег целобројног типа У оквиру типа integer постоје бројни подтипови. Основни су: Integer , тј Овај подтип има и позитивни и негативни део бројне праве Cardinal , тј Овај подтип има само позитивни део бројне праве. 33
33 Остали подтипови типа integer приказани су у таблици. Они могу да се поделе у две групе, прва четири подтипа имају и позитивне и негативне врености, а последња три имају само позитвине вредности. Ако се у програму захтева неки од ужих подтипова, а унесе се број ван дозвољеног опсега програмски преводилац нас упозорава на грешку типа. Најчешће се у задацима користе променљиве типа Integer јер је то довољна прецизност за већину проблема са којима се сусрећемо. Погледајмо сада табеларни приказ подтипова целобројног типа: подтип распон вредности подтипа меморија ShortInt битова Smallint битова Longint бита Int бита Byte битова Word битова LongWord бита Аритметичке операције и стандардне функције Дозвољене операције са овим типом података су: Pred претходни Succ следећи + сабирање - одузимање * множење Div целобројно дељење Mod остатак при целобројном дељењу Abs апсолутна вредност Sqr квадрат броја Дељење (/) није затворено у односу на скуп целих бројева, јер се може десити да количник два цела броја не буде цео број, зато ова операција није дозвољена унутар целобројног типа. Целе бројеве је дозвољено делити, али резултат дељења не може се доделити целобројној променљивој, чак ни ако смо сигурни да ће резултат бити цео број. Ради затворености операција претходни и следећи по дефиницији испред првог елемента је последњи елемент, а иза последњег је први елемент. Због затворености операција +, - и * у овом скупу као резултати њихове примене могу се добијати чудни резултати ако се не води рачуна о величини резултата ових операција, наиме, када резултат пређе преко највеће могуће вредности целог броја враћа се преко негативног дела потребан број пута. На пример, ако је највећи дозвољени број 127 и ми на њега додамо 1, програм се неће прекинути и пријавити грешку, већ ће као резултат исписати -128 што представља најмањи број у овом случају. Приоритет операција наслеђен је из математике, тј. најпре се извршавају једночлане операције и све су истог приоритета, а затим двочлане, при чему су множење и дељење вишег приоритета у односу на сабирање и одузимање. Када домен и кодомен функције није исти скуп података, такве функције зовемо претварачким. Такве су: Ord - редни број, која за аргумент има променљиву типа карактер, а као вредност даје редни број тог карактера у ASCII табели, односно, број од 0 до 255 и Chr - карактер, која за аргумент има број од 0 до 255, а као резултат даје карактер из ASCII табеле чији је редни број једнак аргументу функције. Програмски језик са којим радимо, не дозвоља унос и исписивање нумеричких података. Зато, да би се могли уносити нумерички подаци и исписивати резултати примене различитих операција над њима, морају постојати функције које нумерички податак претварају у текст. И овакве функције су, такође, претварачке јер претварају текст у број или обрнуто. Са целобројним типом постоје три такве функције и то су: StrToInt(tekst) - функција којом се унети текст претвара у цео број. Једноставна функција, али има и својих мана. Ако је текст празан или не може да се преведе у цео број преводилац ће регистровати грешку и програм ће се прекинути. Да би се ово избегло потребно је направити рутину која ће обрађивати такве грешке. Мада то није посебно тешко, овде се тиме нећемо бавити. StrToIntDef(tekst,broj) - функција којом се текст претвара у цео број с тим да је уведена аутоматска контрола исправности уноса, тј. ако унети текст не може да се претвори у цео број (јер садржи неки карактер који није цифра) или је празан као вредност функције узима се задати број (као предефинисана вредност, најчешће се узима 0 или 1, али то није обавезно). IntToStr(broj) - функција којом се нумерички податак претвара у текстуални. У овом случају не може доћи до грешке приликом претварања јер сваки број може да се посматра и као неки текст. 34
34 Осим функција, за претварање нумеричких података у текстуалне и обрнуто могу се користити и две стандардне процедуре: Str(broj, tekst) - процедура којом се нумерички податак из променљиве broj претвара у текстуални податак у променљивој tekst. Аргумент broj може бити променљива, неки израз или конкретна вредност, а аргумент tekst мора бити променљива типа текст. Код ове процедуре не може доћи до грешке (јер сваки број може да се посматра и као неки текст), а главна разлика у односу на одговарајућу функцију, је могућност форматирања текста, али о томе ћемо касније, када нам та предност буде затребала. Val(tekst, broj, kod_greske) - процедура којом се текстуални податак из променљиве tekst претвара у нумерички податак у променљивој broj. Ако је текст празан или нема структуру целог броја преводилац ће регистровати грешку и њен редни број записати у променљиву kod_greske, али програм се неће прекидати (наравно добијени резултати, у случају грешке, неће бити коректни). Зато се у овом случају мора тестирати вредност променљиве kod_greske и у зависности од те вредности бирати наредне кораке у програму. Ни ово није тешко, али захтева увођење питања и условних корака о чему ће бити речи мало касније. У задацима који следе биће неопходно да користимо и неке променљиве које, да би се смеле користити, морају бити претходно декларисане. Декларација променљивих целобројног типа може изгледати овако: var a,b,c,d:integer; декларација може изгледати и овако: var a:integer; b:integer; c:integer; d:integer; или овако: var a:integer; b:integer; c:integer; d:integer; а може и овако: var a:integer; var b:integer; var c:integer; var d:integer; Али никако не може овако: var a: integer; b: integer; a:integer; јер је променљива а декларисана два пута (променљива се не сме два пута декларисати), а ни овако: var a: integer; b: integer; a:char; јер је променљива а декларисана са два типа (променљива може бити само једног типа). Променљиве могу бити: глобалне, тј. могу се користити у читавом програму, свуда могу добијати и мењати вредност и локалне, тј. могу се користити само у функцијама и процедурама у којима су декларисане. Глобалним променљивама се може доделити иницијална, почетна вредност приликом саме декларације, тј. не мора се чекати акција корисника којом се променљивој додељује вредност. var a: integer = 5; Глобалној променљивој а додељена је почетна вредност 5. Међутим, групно иницијализовање променљивих није дозвољено, односно, групи променљивих не може се доделити почетна вредност на следећи начин: var x,y,z: integer = 1; Свакој променљивој мора се посебно додељивати почетна вредност (без обзира на то што је иницијална вредност иста за све променљиве), овако: var x: integer = 1; y: integer = 1; z: integer = 1; Локалним променљивама није дозвољено додељивати почетне вредности Реални тип (rеаl) Реални тип је прости тип података кога чине сви реални бројеви који се могу представити у меморији рачунара. Реални бројеви се у меморији рачунара памте у експоненцијалном запису, тј. као: mantisae±eksponent e e e e+3 Мантиса и експонент се чувају у посебним меморијским локацијама, зато реални тип података заузима више меморије од целобројног. За чување експонента резервисано је увек два бајта меморије (без обзира на 35
35 величину експонента), а за мантису се користи различита количина меморије у зависности од величине бројева који се памте. Опсег реалног типа Основни тип real обухвата бројеве у распону од 5.0 x x са максимално значајних децимала. У оквиру реалног типа разликујемо неколико подтипова. У следећој таблици они су дати са количинама меморије коју захтевају и максималним бројем значајних децимала: подтип распон вредности подтипа децимала меморија Real x x бајтова Single 1.5 x x бајта Double 5.0 x x бајтова Extended 3.6 x x бајтова Comp ( ) бајтова Currency бајтова Real48 треба избегавати јер није у складу са архитектуром интелових процесора, па знатно умањује перформансе рачунара у току извршавања програма. Single и Double се најчешће користе, нарочито у једноставнијим програмима у којима немамо потребу за превеликим или премалим вредностима и прецизношћу. Extended подтип даје већу прецизност од осталих подтипова, али са њим долазе и проблеми са преносивошћу програма на различите рачунарске платформе. Comp је најприроднији за интелове процесоре и мада представља 64 - воробитни цео број припада реалном типу јер се не понаша као уређени (ordinal) тип већ као реални без децимала. Пошто се вредности овог типа чувају као целобројне нема дела меморије резервисаног за чување експонента (зато овај тип заузима мање меморије од претходног). Currency је реални тип који је због мањих грешака код заокругљивања посебно прилагођен програмима везаним за финансијско пословање и банкарство. Подаци овог типа се чувају у фиксном зарезу, тј. нема дела меморије за чување експонента. Подаци овог типа увек имају четири децимале (Вредности су исте као код претходног типа само подељене са ). И код реалног типа важи да се ужи подтипови не могу мешати са ширим (променљивој типа Single не сме се доделити вредност из Extended типа). Реални бројеви који се могу представити у рачунару чине низ интервала на бројној правој, тј. није могуће у меморији представити све реалне бројеве са бројне праве. Вредности у таблици за све подтипове обухватају само позитивни део реалне праве, а подразумева се да је у рангу и негативни део реалне праве симетричан датом позитивном делу. Изузетак од овог правила је подтип comp који из у таблици датог интервала бројева узима само целобројне вредности. Колона у таблици у којој је дат број цифара подразумева задату математичку прецизност израчунавања са одређеним подтипом при чему се на екрану приказује највише 15 цифара и експонент, тј. једна цифра испред децималног зареза, 14 децимала и експонент са четири цифре. Пошто сви ови типови у основи имају реални број могу се међусобно упоређивати и могу се вредности преносити са ужег на шири (овде је и обрнути пренос вредности дозвољен, али се при томе мора водити рачуна о рангу, у противном се у превођењу пријављује грешка, тј. програм неће радити или ће оног тренутка када вредност променљиве изађе изван ранга програм бити прекинут). Наравно, у формалном исписивању вредности променљивих ових подтипова неће бити никакве разлике, уколико се ради о вредностима које су у рангу свих променљивих, односно, ако се ради о вредностима изван ранга, разлика ће се појављивати само на граничним децималама. Аритметичке операције и стандардне функције Дозвољених операција/функција са реалним типом има јако пуно, неке су стандардне и могу се увек користити, а неке су смештене у посебну библиотеку математичких функција Math и могу се користити само када jе та библиотека укључена у програм (дописана у реду који почиње са uses у датотеци Unit.pas). Овде ћемо поменути само стандардне функције јер се најчешће користе. То су: + сабирање - одузимање * множење / дељење frac издваја децимални део броја, резултат је реални број чији је целобројни део 0 int издваја целобројни део, без заокругљивања, резултат је реални број без децимала 36
36 abs апсолутна вредност броја sin синус угла датог у радијанима cos косинус угла датог у радијанима arctan угао у радијанима чији је тангенс дати број ln природни логаритам броја exp степен броја е датим бројем sqr квадрат броја sqrt квадратни корен броја random генерише псеудослучајан број између 0 и 1 (не рачунајући граничне). Код формирања (генерисања) псеудослучајних бројева у паскалу, приметићемо да се на свим рачунарима у истом програму добијају увек исти бројеви и увек истим редоследом. Да се то не би дешавало употребићемо паскал процедуру Randomize која мења основу за формирање случајних бројева. Ова процедура се мора употребити једном у програму и то пре прве употребе функције Random. Претварачке функције са реалним типом су: round заокругљени целобројни део реалног броја trunc издваја целобројни део, без заокругљивања, резултат је цео број Да би се реални бројеви могли уписивати и исписивати у делфију користићемо следеће претварачке (конверзионе) функције: FloatTo Str - функција која реални број претвара у текст (стринг) да би се он могао исписати у едиту, лабели или неком другом објекту за приказивање текстова. StrToFloat - функција која текст написан у едиту претвара у реалан број, при чему сва ограничења поменута код функције StrToInt важе и овде. StrToFloatDef - функција која текст написан у едиту претвара у реалан број, при чему све напомене и сва ограничења поменута код функције StrToIntDef важе и овде. Стандардне процедуре које имају исту сврху (и које су исте као и већ поменуте код целобројног типа): Str(broj, tekst) - процедура којом се нумерички податак из променљиве broj претвара у текстуални податак у променљивој tekst. Аргумент broj може бити променљива, неки израз или конкретна вредност, а аргумент tekst мора бити променљива типа текст. Код ове процедуре не може доћи до грешке (јер сваки број може да се посматра и као неки текст), а главна разлика у односу на одговарајућу функцију, је могућност форматирања текста, али о томе ћемо касније, када нам та предност буде затребала. Val(tekst, broj, kod_greske) - процедура којом се текстуални податак из променљиве tekst претвара у нумерички податак у променљивој broj. Ако је текст празан или нема структуру целог броја преводилац ће регистровати грешку и њен редни број записати у променљиву kod_greske, али програм се неће прекидати (наравно добијени резултати, у случају грешке, неће бити коректни). Зато се у овом случају мора тестирати вредност променљиве kod_greske и у зависности од те вредности бирати наредне кораке у програму. Ни ово није тешко, али захтева увођење питања и условних корака о чему ће бити речи мало касније. Код слагања разних операција, такође, као и код целобројног типа, треба водити рачуна о приоритету операција да би програм радио оно што се од њега очекује. Као једночлане, операције Frac, Int, Round, Trunc, Abs, Sin, Cos, ArcTan, Ln, Exp, Sqr и Sqrt су највишег приоритета, затим операције множење и дељење да би, на крају, биле операције сабирање и одузимање које су најнижег приоритета. Уколико нам приоритет операција не одговара, редослед извршавања ћемо променити заградама ( ). У задацима које ћемо решавати ћемо променљиве декларисати основним типом. Декларација може изгледати овако: var a,b,c,d:real; декларација може изгледати и овако: var a:real; b:real; c:real; d:real; или овако: var a:real; b:real; c:real; d:real; а може и овако: var a:real; var b:real; var c:real; var d:real; Корисно је још знати и да је у програмски језик стандардно уграђена константа пи (π) која се врло често користи у задацима са тригонометријским функцијама, задацима везаним за круг и делове круга и сличним и треба је користити јер има много тачнију вредност од приближне 3,14: ознака pi - користи се као реална константа π чија је вредност
37 4. 4. Логички тип (boolean) Код неких програма које ћемо писати биће нам важније да ли је нешто тачно или не, а мање важно ће нам бити шта је или колика је вредност променљиве. Када се говори о таквим односима између података онда се ради о њиховим логичким вредностима. Неке задатке, које ћемо касније решавати, без логичког типа не бисмо никако могли испрограмирати (било да се користе логичке променљиве или само логички изрази). Логички тип је прости уређени тип података који има две вредности, true и false. И логички тип има четири подтипа, то су: Boolean (заузима 1 бит, тј. има две могуће вредности, 0 и 1), ByteBool (заузима 8 битова или 1 бајт меморије, тј. има 256 вредности), WordBool (заузима 16 битова, 2 бајта или једну реч меморије, тј. има вредности) и LongBool (заузима 32 бита, 4 бајта или две речи меморије, тј. има вредности). Но, сви они имају исте вредности (false је 0, а true све остале вредности), а направљени су да би се обезбедио интегритет података у раду са виндоус апликацијама. У виндоус апликацијама логичке променљиве могу добијати вредности различите од 0 и 1, па су зато неопходни различити подтипови у складу са целобројним типом, тако су подтипови Boolean и ByteBool осмобитни, WordBool је шеснаестобитни, а LongBool тридесетдвобитни, но како постоје само две логичке константе, то се константи false придружује вредност 0, а све остале вредности се придружују константи true. У задацима које ћемо радити ћемо користити само подтип Boolean. Стандардне логичке функције Са подацима овог типа дозвољене су следеће операције/функције: not негација, има вредност true ако исказ није тачан or дисјункција, има вредност true ако је бар један од исказа тачан and конјункција, има вредност true ако су оба исказа тачна xor ексклузивна дисјункција, има вредност true ако је само један од исказа тачан pred претходни succ наредни Претварачке функције са подацима овог типа су: odd непарно, има вредност true ако је аргумент непаран број у противном је false. ord редни број, при чему је Ord(false) = 0 и Ord(true) = 1. BoolToStr претвара логичку вредност у текст. StrToBool претвара текст у логичку вредност. StrToBoolDef претвара текст у логичку вредност уз могућност корекције уноса. Релације са подацима овог типа су: < мање <= мање или једнако <> различито = једнако >= веће или једнако > веће Релација in повезује скуповни тип са логичким, тачна је ако неки елемент припада скупу. Приоритет операција је стандардан: једночлане операције Not, Odd, Pred, Succ и Ord су истог, највишег приоритета, затим је операција And, па операције Or и Xor које су истог најнижег приоритета. Логичке релације <, <=, <>, =, >=, > и in приоритет добијају одговарајућим ограничавањем заградама. Важно је напоменути да операције Not, And, Or и Xor раде само са простим уређеним типовима података (Char, Integer и Boolean), набројаним и интервалним типом. Можда би било корисно запамтити следеће релације: false < true Succ(false) = true, Pred(false) = true Pred(true) = false, Succ(true) = false У задацима које ћемо решавати променљиве које будемо користили морају бити претходно декларисане. Декларација може изгледати овако: var a,b,c,d:boolean; декларација може изгледати и овако: var a:boolean; b:boolean; c:boolean; d:boolean; или овако: var a:boolean; b:boolean; c:boolean; d:boolean; 38
38 а може и овако: var a:boolean; var b:boolean; var c:boolean; var d:boolean; Знаковни тип (char) Карактер тип (char) је прости уређени тип података чије вредности могу бити сви знаци из ASCII табеле (односно сви елементи азбуке програмског језика). За било који елемент овог типа зна се који елемент је испред, а који иза њега. Редослед елемената одређује њихов код или редни број из ASCII табеле. Ради затворености операција претходни и следећи, по дефиницији, испред првог елемента је последњи елемент, а иза последњег је први елемент. Овај тип има 256 елемената. Стандардне карактер функције Са подацима типа карактер дозвољене следеће операције/функције: Pred - претходни која одређује елемент који претходи елементу који је аргумент функције, Succ - наредни која одређује елемент који следи иза елемента који је аргумент функције и UpCase - велико слово, која као резултат даје велико слово ако је аргумент функције мало слово. Претварачке функције су оне код којих су област дефинисаности и скуп вредности функције различитог типа. Претварачке функције са подацима овог типа су: Ord - редни број, која за аргумент има променљиву типа карактер, а као вредност даје редни број знака у ASCII табели, односно, број од 0 до 255 и Chr - карактер, која за аргумент има број од 0 до 255, а као резултат даје знак из ASCII табеле чији је редни број једнак аргументу функције. Све променљиве које се користе у паскалском програму морају бити претходно декларисане. У општем случају променљиве се декларишу на следећи начин: var ImePromenljive:TipPromenljive; У овом случају декларација променљивих може изгледати овако: var a,b,c:char; декларација може изгледати и овако: var a:char; b:char; c:char; или овако: var a:char; b:char; c:char; а може и овако: var a:char; var b:char; var c:char; Али никако не може овако: var a: char; b: char; a: char; јер је променљива а декларисана два пута (променљива се не сме два пута декларисати) Низовни тип Код рада са већом количином података врло често се јавља потреба за великим бројем променљивих које би чувале потребне вредности. У већини таквих случајева број неопходних променљивих је или јако велики или се и не зна колико променљивих ће бити употребљено у програму. Да би се олакшало решавање оваквог типа проблема уводи се појам низа. Низ је уређени скуп података једног типа са заједничким именом које се назива именом низа. Тип низ има следеће особине: Садржи коначан, унапред одређен број чланова (низ може имати произвољно много чланова, што засвиси од потреба проблема који се решава и од расположиве меморије) Сви чланови једног низа морају бити истог типа Сваки члан се означава именом низа и својим индексом (редним бројем) Индекси чланова једног низа морају бити истог типа. Да би се низ могао користити у програму мора бити претходно дефинисан (имплицитно или експлицитно). Експлицитна дефиниција подразумева да се дефинише нови тип података који има своје име. Имплицитна дефиниција се користи када не желимо да измишљамо име новом типу података, него га само описујемо кроз декларацију променљивих које му припадају. Декларација променљиве типа низ се састоји у давању имена низа и одређивању типа индекса и типа чланова низа. Тип индекса мора бити интервални подтип уређених простих типова (boolean, char, integer, набројани). Тип чланова низа може бити било који дефинисани тип. 39
39 Декларацијом низа резервише се количина меморије потребна за чување свих његових елемената без обзира да ли ће се сви они користити у програму или не. ARRAY[1..100] of REAL низ може имати највише сто чланова који су реални бројеви, резервише се меморија за чување сто реалних бројева, а у програму можемо користити, рецимо, само првих 15 елемената низа ARRAY['a'..'z'] of INTEGER низ може имати највише 26 чланова који су целобројних и чији индекси су мала слова енглеске абецеде, резервише се меморија за чување 26 целих бројева Службена реч array је обавезна код декларације низовног типа. Ако се некој речи придружи декларација низовног типа онда она постаје нови, дефинисани (изведени) тип и може се употребљавати као да је стандардни тип (експлицитна дефиниција иза). TYPE NIZ=ARRAY[1..50] of INTEGER; дефинишемо нови тип података који се зове NIZ и представља низ који може имати највише педесет целобројних елемената ZNAK=(pik,karo,herc,tref); дефинишемо набројани тип са именом ZNAK са четири елемента који су наведени у загради BROJ=1..14; дефинишемо интервални тип са именом BROJ са четрнаест елемента који су дати у облику интервала SPIL=ARRAY[znak] of broj; дефинишемо нови тип података који се зове SPIL и представља низ који може имати највише четири елемента који могу бити цели бројеви од 1 до 14 Када смо дефинисали нове типове података, помоћу њих можемо да дефинишемо променљиве које ћемо користити у програму на уобичајен начин: VAR a:integer; b:niz; karta:spil; Све операције које су дозвољене у раду са променљивама типа којег су чланови низа дозвољене су и у раду са члановима тог низа. Два низа се могу упоређивати ако су им једнаки типови. У том случају кажемо да су два низа једнака ако имају једнак број елемената и одговарајући чланови су им једнаки (први са првим, други са другим, итд) Стринг тип У раду са знаковним, карактер подацима чешће се срећемо са подацима који се састоје из више од једног знака. Такви подаци могу се обрађивати знак по знак, али би то додатно оптерећивало програм. Уместо једне променљиве радили бисмо са низом променљивих што оптерећује и компликује писање програма. Зато је у паскал стандардно уведен тип String (енгл. string - ниска, низ карактера, реч). Максималан број карактера који може бити вредност променљиве типа String у паскалу је 255. У делфију постоји још неколико подтипова овог типа: ShortString који се поклапа са паскалским типом String (максимална дужина 255), AnsiString има максималну дужину 2 31 карактера, WideString има максималну дужину 2 30 карактера и има подршку за националне симболе (Unicode). Подтипови типа стринг могу да се мешају и размењују вредности, али се мора водити рачуна о њиховим специфичностима приликом позива функција и процедура. Подаци овог типа се памте као низови карактера с тим што је, будући да је ово стандардни тип података, програмском језику остављено да води рачуна о дужини низа. Код декларације променљивих овог типа могуће је унапред дефинисати максималну дужину низа или задржати уграђену дужину (правила за декларацију променљивих су иста као и код претходних типова података само се овде појављују у две варијанте): VAR a:string; декларисали смо променљиву типа String која може имати највише 255 карактера дужине, тј. може имати мање, али не може имати више од 255 карактера, рачунајући и размаке и специјалне знакове VAR b:string[11]; декларисали смо променљиву типа String која може имати највише 11 карактера дужине, тј. може имати мање, али не може имати више од 11 карактера, рачунајући и размаке и специјалне знакове Променљивама типа String може се додељивати вредност која не одговара њиховој декларацији, тј. променљивој а може се доделити вредност која има више од 255 карактера дужине, а променљивој b вредност која има више од 11 карактера и програмски преводилац неће пријављивати грешку, али ће се у меморији сачувати само вредност декларисане дужине, остали карактери неће се памтити и са њима програм неће радити. Зато у раду са овим типом треба пажљиво осмислити декларацију променљивих како не бисмо добијали чудне, односно, неочекиване резултате. 40
40 Стандардне функције/операције и процедуре Са подацима овог типа дозвољене су следеће функције: + слепљивање, надовезивање стрингова, вредност функције се мора доделити некој стринг променљивој (на пример: а:=b+c+d; а:=а+b+c+d;) copy(a,n,m) функција за копирање дела стринга, из стринга а се од позиције n копира m карактера, вредност функције се мора доделити некој стринг променљивој; применом ове функције стринг а остаје непромењен length(a) функција за одређивање дужине, броја карактера стринга а може имати вредности од 0 до 255 pos(b,a) функција за одређивање позиције стринга b у стрингу а, вредност функције је цео број 0 ако се b не налази у стрингу а или цео број ако b почиње од карактера са тим редним бројем у стрингу а (ова функција је осетљива на мала и велика слова, па треба о томе водити рачуна код писања програма) LowerCase функција којом се сва велика слова енглеске абецеде у речи која је аргумент функције замењују малим словима (функција не реагује на слова других националних абецеда) UpperCase функција којом се сва мала слова енглеске абецеде у речи која је аргумент функције замењују великим словима (функција не реагује на слова других националних абецеда) Стандардне процедуре за рад са подацима типа стринг су: concat(a,b,...) - процедура којом се надовезују стрингови (слично као +), први аргумент процедуре мора бити променљива на коју се надовезују вредности осталих аргумената који могу бити функције и променљиве (на пример: Concat(a,b,c) исто је што и а:=а+b+c) delete(a,n,m) - процедура за брисање дела стринга, из стринга а се од позиције n брише m карактера, тј. стринг а се мења. insert(b,a,n) - процедура за уметање стринга у стринг, стринг b се умеће у стринг а од позиције n. val(tekst, broj, kod_greske) - процедура за претварање стринга у број (процедура је иста као код типа Integer и Real где је и детаљно објашњена) str(broj, tekst) - процедура за претварање броја у стринг (процедура је иста као код типа Integer и Real где је и детаљно објашњена) Код рада са стринговима задате дужине морамо водити рачуна да њиховим слепљивањем не изгубимо део њиховог значења јер ако се добије стринг дужине веће од декларисане узима се само почетни део стринга до декларисане дужине Набројиви тип и интервални тип Када решавамо неке типове задатака, може се десити да нам стандардни типови нису довољни. У таквом случају можемо сами дефинисати нови тип података тако што ћемо му дати име и навести све елементе који му припадају. Такав тип зове се набројиви (јер су сви елементи који му припадају набројани у дефиницији). Спада у уређене типове, а редослед података дефинисан је редоследом навођења елемената у дефиницији типа. Примери: Type DaniUNedelji=(pon, uto, sre, cet, pet, sub, ned); Type Godina=(jan, feb, mart,apr, maj, jun, jul, avg, sept, okt, nov, dec); Type Boje=(pik, karo, herc, tref); Када смо дефинисали неки тип, у даљем раду, понашамо се као да је тај тип одувек постојао, тј. можемо помоћу њега декларисати променљиве. Променљиве се могу декларисати и директним навођењем елемената набројивог типа, без претходне дефиниције типа: Var dan:daniunedelji; Var mesec:godina; Var znak:boje; Var boja:(crvena,zuta,zelena,plava); Са набројивим типом радимо као и са другим, стандардним типовима података. Да бисмо исписали вредност променљиве овог типа у делфи апликацији морамо дефинисати функцију која ће овај тип конвертовати у тип стринг. Стандардне операције Са подацима овог типа дозвољене су само следеће три функције: Pred претходни која одређује елемент који претходи елементу који је аргумент функције, 41
41 Succ наредни која одређује елемент који следи иза елемента који је аргумент функције и Ord редни број елемента у дефинисаном типу Друге операције, које би нам, евентуално, могле затребати, морамо претходно сами да дефинишемо. Када желимо да постигнемо неке специјалне ефекте приликом решавања појединих задатака можемо елементе стандардно дефинисаних уређених типова издвојити у посебан тип. Ако су елементи узастопни онда ће такав тип бити интервални. Пошто настаје од уређених типова овај тип је, такође, уређен. Редослед података наслеђује се од основног типа, а такође и дозвољене операције и све друге особине. Предност увођења овог типа је незнатна уштеда меморије за чување података и лепша (???) структура програма. Примери: Type Jednocifreni=0..9; Type Minut=0..59; Cas=0..23; Type Godina=1..365; Када смо дефинисали неки тип, у даљем раду, понашамо се као да је тај тип одувек постојао, тј. можемо помоћу њега декларисати променљиве. Променљиве се могу декларисати и директним навођењем елемената интервалног типа, без претходне дефиниције типа: Var cifra:jednocifreni; Var m:minut;c:cas; Var dan:godina; Var LotoBroj:1..39; Скуповни тип У задацима са издвајањем појединих слова користићемо појам скуп или колекција - сет (set). И други задаци могу се елегантније решавати коришћењем овог типа. Скуповни тип је посебна врста података. То је скуп свих подскупова скупа вредности основног типа. Основни тип скупа може бити било који прости уређени тип података boolean, char, integer или набројани тип. Максималан број елемената у скупу је 255 (то значи не могу ни сви цели бројеви бити елементи скупа). У раду са скуповним подацима важе правила алгебре скупова. Елементи скупа се не могу понављати. Скуповни тип се дефинише у делу за декларације и дефиниције на следећи начин: TYPE slova = SET OF 'a'..'z'; cifre = SET OF 0..9; mesec = (jan,feb,mart,apr,maj,jun,jul,aug,sept,okt,nov,dec); godina = SET OF mesec; Променљива скуповног типа се декларише помоћу претходно дефинисаног скуповног типа или директно: VAR a:slova; cifra:cifre; znak:set OF (pik,karo,herc,tref); ceobroj:set OF ; Стандардне функције и релације Основне операције са подацима скуповног типа су: унија (ознака +), пресек (ознака *) и разлика (ознака -) Основне релације над подацима скуповног типа су: једнако (ознака =), неједнако (ознака <>), подскуп (ознака < или <=) и надскуп (ознака > или >=) елемент скупа (ознака in) Празан скуп дефинише се командом: с:=[]; Додавање елемента е неком скупу с остварује се командом: с:=с+[е]; Ако су два скупа декларисана истим типом то никако не значи да су им елементи аутоматски придружени и да су скупови једнаки. Елементи се морају придружити скуповима у програму и тек онда можемо говорити о једнакости та два скупа. Додељивање елемената скупу може се извршити вишеструком употребом команде за додавање елемената скупу или њиховим директним навођењем: с:=[ А, Е, И, О, У ]; Наравно, два скупа су једнака ако се састоје из истих елемената, односно, сви елементи једног скупа су сви елементи другог скупа (ознака a=b), у противном, тј. ако постоји бар један елемент било ког од та два 42
42 скупа који није елемент другог скупа, та два скупа су неједнака (ознака a<>b). Неки скуп је подскуп другог (ознака a<b или a<=b) ако је сваки његов елемент уједно и елемент другог скупа. У том случају кажемо да је други скуп надскуп првог скупа (ознака a>b или a>=b). Неки скуп је прави подскуп (ознака a<b) другог ако су сви елементи првог скупа елементи другог и осим њих, други скуп има бар још један елемент. Неки скуп је прави надскуп другог (ознака a>b) ако постоји бар један елемент првог скупа који није елемент другог и сви елементи другог скупа су истовремено и елементи првог скупа Класа и методе класе основни појмови Објектни језици полазе од податка као доминантног концепта и уз податак везују операције то представља објекат. Објекат може бити, на пример, број 5 са свим операцијама које се могу применити на њега, на пример Додај(параметар), Одузми(параметар), Помножи(параметар), Подели(параметар), али објекат може бити и нека сложена структура на пример ОСОБА, па и цео програмски систем са скупом свих операција које се на њега могу применити. Класа представља апстрактну слику скупа неких објеката који имају исте особине. То је структурирани кориснички дефинисани тип података који обухвата податке (атрибуте) који описују стање објеката класе и функције којима се дефинишу операције над подацима класе. Објекат класе је један примерак класе, а функције које су део класе називају се методе. Класа се дефинише навођењем података и функција које јој припадају. Класа је скуп објеката са истим својствима (тзв. инстанцним променљивим које се могу се замислити као поља неке сложене структуре), и понашањем, односно, операцијама. На пример, Integer може бити једна класа. Сваки објекат је примерак неке класе. Објекти између себе комуницирају порукама којима се од објекта који их прима захтева да изврши неку од операција дефинисаних у класи којој припада. Поруке су догађаји на које објекти могу да реагују. Објекат на примљену поруку одговара извршавањем методе, односно, операције за коју само објекти из те класе знају како се извршава (само је њима позната имплементација методе). Подаци могу бити дефинисани (иницијализација) или само декларисани и не могу бити типа класе која се помоћу њих дефинише (јер би то била циркуларна дефиниција), али могу бити било којег другог типа, па и нека друга, претходно, дефинисана класа. Исто важи и за функције, тј. могу бити само декларисане (наводи се само заглавље) или дефинисане (имају и заглавље и тело са наредбама). Ако су само декларисане, онда мора постојати и њихова дефиниција која се налази негде изван дефиниције класе. Аргументи и резултат функције могу бити било којег типа, па и тип класе која се дефинише. Класа мора бити дефинисана тамо где се и користи, тј. мора бити саставни део кода програма у коме се користи. Пример класе коју користимо сваки пут када пишемо било коју апликацију: type TForm1 = class(tform) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } Као што видимо, иза резервисане речи class следе објекти, елементи који припадају класи, а ту могу бити наведене и методе (под методама, у овом тренутку, подразумевамо и функције и процедуре) које припадају класи. У деловима означеним са private (приватне, односно, невидљиве) и public (јавне, односно, видљиве) наводимо декларације функција које припадају класи. У овом тренутку неће нам бити значајна карактеристика видљивост методе, па када будемо писали апликације нећемо размишљати о томе где ћемо писати декларацију методе коју додељујемо класи. Општи метод ће бити да функције и процедуре које представљају реакцију на неки догађај декларишемо у делу изнад резервисане речи private (зато што их делфи аутоматски исписује на том месту), а оне које дефинишемо независно од неког догађаја писаћемо изнад резервисане речи public (односно, биће приватне, не зато што тако мора него само да бисмо направили визуелну разлику између ове две врсте функција и процедура). Резервисана реч обавезна је на крају дефиниције класе и иза ње можемо писати друге декларације и дефиниције које су нам потребне у програму. У објектном моделу примењује се скривање информација, тј. објекту се може приступити само преко порука тј. метода које су дефинисане за класу којој објекат припада. Сама структура објекта, односно, његова својства (инстанцне променљиве) нису видљиве другим објектима. Објектни модел карактерише учаурење података и операција у објекат што омогућује једноставну измену структуре објекта и класе и имплементације операција без ефекта на апликације које тај објекат користе (све док су дефиниције операција непромењене, тј. са истим називима и параметрима). Нова класа може се дефинисати као подкласа већ дефинисане класе (своје надкласе). Подкласа наслеђује операције и својства од своје надкласе, али може имати и своје сопствене. 43
43 На пример, за дефинисану класу ОСОБА може се дефинисати подкласа СТУДЕНТ, која има сва својства класе ОСОБА, али и нека своја специфична. Програми које ћемо писати у оквиру овог курса неће захтевати увођење нових класа Питања на која треба обратити пажњу > Подела типова података > Целобројни тип и операције са целим бројевима > Подтипови целобројног типа > Реални тип и операције са реалним бројевима > Подтипови реалног типа > Карактер тип и операције са подацима тог типа > Подтипови типа карактер > Логички тип, операције и релације > Подтипови логичког типа > Низови као тип података > Набројани тип > Интервални тип > Скуповни тип > Декларација променљивих > Конверзија типова података > Дефинисање новог типа података > Шта је класа > Комуникација између објеката > Public декларације > Private декларације > Однос између класе и подкласе 44
44 5. Наредбе и изрази Синтакса и семантика израза. Свака група карактера чини некакав израз, а да би тај израз имао смисла и значење морају се поштовати нека правила. Правила на основу којих се граде изрази у неком програмском језику дефинисана су синтаксом. Правила којима се одређује значење синтаксно исправног израза дефинисани су семантиком. Код писања програма синтаксна правила морају бити задовољена да бисмо могли тестирати и користити програм. Ова правила су једноставна и лако је проверити да ли смо их испоштовали или не. Најједноставнија правила за формирање израза у програмирању заснована су на устаљеним правилима у математици која су прилагођена одговарајућем програмском језику. Нека од основних правила су: Свака отворена заграда мора бити затворена. Два знака операције (или више њих) не могу се наћи непосредно један поред другога. Израз не може стајати самостално у програму. Вредност израза израчунава се аутоматски приликом доделе вредности параметрима Аритметички и логички изрази Изрази који се могу наћи у оквиру програма могу бити аритметички или логички. Аритметички изрази своју вредност имају у оквиру неког од нумеричких типова података, а логички имају истиносну вредност тачно или нетачно. Основна правила за креирање аритметичких и логичких израза су истоветна и морају се поштовати. a+*b није синтаксно исправан израз јер су + и * један за другим a+b=c је синтаксно исправан логички израз који је тачан ако су променљиве a, b и c истог типа и збир прве две вредности је идентичан трећој a+b:=c није синтаксно исправан израз јер се изразу не може додељивати вредност на овакав начин 2*(a+b)-c је аритметички израз који је синтаксно исправан a(b+c) није синтаксно исправан израз јер испред отворене заграде, а иза променљиве a мора стајати ознака неке операције, нема подразумеваних операција у програмирању Наредбе програмског језика Према нивоу сложености, наредбе можемо поделити на просте и структурисане. Просте наредбе су: празна наредба наредба додељивања процедуралне наредбе (наредбе улаза и излаза) GOTO наредба Структурисане наредбе су: наредба састављања наредбе гранања (If наредба, Case наредба) наредбе циклуса (For, Repeat, While) Празна наредба је наредба која нема ефекта на извршавање програма. Користи се само у случајевима када нека структурисана наредба захтева извршење неке програмске наредбе, али алгоритамски нема потребе за било каквом извршном наредбом. У програмима ћемо најчешће користити наредбу додељивања. Структура ове наредбе је: promeljiva := vrednost; Ознака := је знак доделе и не може се изоставити. На левој страни је име променљиве којој се додељује вредност, а на десној страни је конкретна вредност, израз или функција чија се вредност додељује променљивој. Променљива са леве стране знака додељивања и вредност са десне стране морају се слагати по своме типу, у противном, преводилац пријављује грешку и програм се не може покренути. Наредбе улаза и излаза (Read, Write) се користе у паскалу за унос података и издавање резултата. У делфију се користе само специјални облици ових наредби за рад са секвенцијалним датотекама и то врло ретко јер се и датотеке овог типа користе врло ретко у модерним програмима, а за унос података и приказивање резултата користе се одговарајуће текст компоненте. Наредба GOTO постоји у готово свим програмским језицима, па и овде, али се не користи јер није у складу са правилима структурног програмирања. Представља безусловни прелазак (скок) на неку наредбу програма не водећи рачуна о структури која се тренутно извршава. Добар програмер никада нема потребу за 45
45 овом наредбом јер се алгоритмом може предвидети структура програма која нема потребу за прескакањем дела алгоритамских корака без неког посебног разлога. Структурисане наредбе су сложене наредбе. У своју синтаксну дефиницију уграђују и неке друге просте или структурисане наредбе које се извршавају. Најпростија структурисана наредба је наредба састављања. Ова наредба почиње службеном речи Begin, а завршава службеном речи End. У оквиру наредбе састављања може се појавити било која наредба, па и друга наредба састављања. У ширем смислу, читав програм можемо сматрати једном наредбом састављања. Општи облик ове наредбе је: begin <naredbe> Програмски преводилац аутоматски сваком елементу Begin придружује одговарајући елемент End, у фази превођења, и у случају грешке, односно, ако неки од елемената недостаје или се појављује вишак неког од елемената даје одговарајућу поруку. Остале структурисане наредбе су нешто компликованије, па ћемо им посветити посебна поглавља Конверзија типова података. Конверзија типова података подразумева да се подаци једног типа преводе у податке другог типа. Најчешће се конверзија врши између стрингова и бројева. Оправдање за ово је принцип рада визуелних програмских језика. Наиме, у делфи програм се, као улазне величине, не могу унети нумерички подаци, већ се уносе низови карактера који се, да би се користили за израчунавање, претварају у одговарајуће нумеричке податке. Отуда потреба да постоје функције и процедуре које ће неки текст покушати да преведу у цео или реалан број. Исто тако, нумерички резултати рада делфи програма се не могу приказати, већ се морају претворити у стринг, низ карактера који личи на нумерички податак, а затим се тај стринг приказује као резултат рада програма. Отуда потреба да постоје функције и процедуре које ће нумеричке податке превести у текстуалне податке. Понекад и неки други разлози стварају потребу за конверзијом једног типа података у други. Рецимо, ако треба над неким податком извршити неку операцију која није дозвољена у оквиру типа података коме припада, онда је потребно тај податак конвертовати у податак другог типа са којим је та операција дозвољена. Функције за конверзију имају једноставну синтаксу. Аргумент функције је податак типа који се конвертује, а вредност функције је податак типа у који се конвертује. Највећи број конверзионих функције има име које подсећа на врсту конверзије, односно, састоји се из: Симбола који представља тип података који се конвертује (Str, Int, Float, Bool,...), Енглеске речи ТО која означава смер конверзије и Симбола који представља тип података у који се конвертује (Str, Int, Float, Bool,...). Већ смо се упознали са неким конверзионим функцијама, па ћемо их сада само исписати ради подсећања, а без поновног објашњавања значења: StrToInt, StrToFloat, StrToBool, IntToStr, FloatToStr, BoolToStr, Уношење и приказивање података. Да би се програм извршио морају се унети почетне вредности. Пошто се подаци уносе као низови карактера, за унос било ког податка морамо на форму програма поставити текст компоненте у које ће се они уписивати. Најчешће се за унос података користи компонента едит (Edit - оквир за текст), али је могуће користити и неке друге компоненте. Компонента едит може прихватити произвољно дуг низ карактера, али са ограничењем да се уписије само у једном реду. Да би програм приказао резултате рада, на форму се морају поставити компоненте које приказују низ карактера. Најчешће се за приказивање резултата користе компоненте лабела (Label - налепница) и едит (Edit - оквир за текст), али је могуће користити и неке друге компоненте у зависности од врсте и количине података који се исписују. Могуће је унос и исписивање података остварити и помоћу неких компоненти које се стандардно не користе за то (на пример: дугмад (Button), панели (Panel) и слично), али у таквом случају се морају писати посебне рутине којима ће се омогућити приказивање података на таквим компонентама. Ово није увек једноставно, али је, у неким ситуацијама, или неопходно или даје посебан изглед програму. Ако то није случај, онда нема оправдања за такав начин уноса и приказивања података. Ако је алгоритамски захтев такав да се захтева унос једног од неколико унапред познатих података, за унос се могу користити компоненте избора (RadioButton, CheckBox, ComboBox, ListBox,...). Коју ћемо од компоненти избора употребити зависи од тога колико дозвољених вредности има и да ли је дозвољено изабрати само једну или можемо унети више вредности по неком захтеву. Компоненте избора смањују могућност погрешног уноса вредности јер кориснику није дозвољено да уписује податак и погреши, већ бира један или више података од понуђених. 46
46 5. 6. Алгоритам размене вредности две променљиве. Врло често, нађемо се у ситуацији таквој да имамо две променљиве које треба међусобно да размене своје вредности. У неким програмским језицима, за то постоји посебна функција (Swap). У делфију (и у свим другим, паскалоликим програмским језицима) таква функција не постоји, већ се проблем решава алгоритмом размене вредности уз коришћење помоћне променљиве. Помоћна променљива има задатак да на почетку привремено сачува вредност једне променљиве како би она могла да преузме вредност друге, а на крају се другој променљивој додељује вредност помоћне. Овај стандардни алгоритам, покушаћемо да објаснимо следећом таблицом: програм a b pom шта се стварно дешава pom:=a; помоћној променљивој додељује се вредност прве a:=b; првој променљивој додељује се вредност друге b:=pom; другој променљивој додељује се вредност прве која је сачувана у помоћној Програмирање израчунавања по једноставним математичким формулама. Свака математичка формула може се написати у облику неког израза у духу програмског језика. Програм којим се израчунава вредност израза састоји се из три корака: Унос почетних вредности параметара који учествују у формули Израчунавање вредности по формули Исписивање добијених вредности Приказаћемо овај поступак на конкретном примеру одређивања обима и површине правоугаоника са страницом a и дијагоналом d. Најпре ћемо написати формуле за обим и површину: O=2(a+b) P=ab ову математичку формулу у програму ћемо написати овако: o:=2*(a+b); ову математичку формулу у програму ћемо написати овако: p:=a*b; Пошто у овим обрасцима учествују обе странице правоугаоника, а у условима задатака је дата једна страница и дијагонала, извешћемо другу страницу на основу познатих параметара: 2 2 b= d a ову математичку формулу у програму ћемо написати овако: b:=sqrt(d*d-a*a); Даље можемо да се понашамо на два начина: 1. као математичари: добијену формулу за другу страницу уврстићемо у обрасце за површину и обим правоугаоника и добити формуле за израчунавање обима и површине правоугаоника помоћу странице и дијагонале: O=2(a+ d P=a d a 2 2 a ) - у програму ћемо написати овако: o:=2*(a+sqrt(d*d-a*a)); 2 2 у програму ћемо написати овако: p:=a*sqrt(d*d-a*a); 2. као програмери: добијену формулу написаћемо испред формула за израчунавање површине и обима: b:=sqrt(d*d-a*a); o:=2*(a+b); p:=a*b; Уносом улазних параметара a, d добићемо и по једном и по другом методу исте резултате за O, P које ћемо затим исписати. У првом случају имамо једну променљиву мање, па је утрошак меморије ефикаснији, у другом случају формуле су једноставније за разумевање и за унос. У другом случају имамо једну мање 47
47 операцију кореновања, па је процес добијања резултата бржи (мада се ради о делићима мили секунде јер је проблем прилично једноставан, много је већа уштеда у времену за извођење и исписивање формула) Питања на која треба обратити пажњу > Синтакса израза > Семантика израза > Правила за формирање израза > Врсте израза по типу података > Подела наредби > Просте наредбе > Празна наредба > Наредба додељивања > Процедуралне наредбе > Структурисане наредбе > Наредба састављања > Конверзија типова података > Компоненте за унос података > Компоненте за приказивање података > Алгоритам замене вредности две променљиве > Исписивање математичких формула у програмима 48
48 6. Наредбе гранања Под гранањем у програмирању подразумевамо ситуацију када се једна или више наредби може, али и не мора извршити у зависности од неког услова. Наредбе гранања се, често, зову и наредбама преласка, па у том смислу, оне могу бити условне и безусловне. Ако извршење неке наредбе или групе наредби зависи од неког услова онда је то наредба условног преласка, у противном је то наредба безусловног преласка. Наредба безусловног преласка је GOTO наредба, али она није структурисана. Наредбе условног преласка су структурисане и могу бити: If наредба Case наредба Синтакса наредбе If If наредба је наредба гранања са највише две гране, док Case наредба може имати највише 256 грана. Наредба If је општија, односно, сваки задатак са гранањем може се решити њеним коришћењем. Обрнуто не важи, тј. постоје задаци који се могу решити коришћењем If наредбе, а не могу се решити помоћу Case наредбе. IF наредба се користи када у зависности од неког услова треба извршити један од највише два посла. Наредба If може бити потпуна и непотпуна. Потпуна је ако има обе гране, а непотпуна ако има само једну грану. Општи облик наредбе је: IF <uslov> THEN <naredba> ELSE <naredba>; ако је потпуна или IF <uslov> THEN <naredba>; ако је непотпуна. Then грана се не може изоставити. Ако је потребно да се изврши група наредби иза службене речи Then и/или иза службене речи Else онда је обавезно употребити наредбу састављања за спајање те групе наредби, односно: IF <uslov> THEN Begin <naredbe> End ELSE Begin <naredbe> End; или IF <uslov> THEN Begin <naredbe> End; У случају да је услов испуњен извршава се наредба или група наредби иза службене речи Then, а ако услов није испуњен извршава се наредба или група наредби иза службене речи Else. Ако нема потребе да се изврши нека наредба у случају неиспуњења услова иза службене речи Else стоји празна наредба или се овај део наредбе изоставља. Ако нема потребе да се изврши нека наредба у случају испуњења услова иза службене речи Then обавезно стоји празна наредба или се услов преформулише тако да изостане потреба за службеном речи Else. Другим речима службена реч Then је обавезна, док се службена реч Else може и изоставити, ако се тиме не утиче на даљи ток програма. Непосредно пре резервисане речи Else не сме се употребити граничник ; већ се као граничник наредбе употребљава размак. Након извршења наредбе или групе наредби иза службене речи Then прелази се на прву наредбу испод IF наредбе, тј. не постоји начин да се изврши наредба или група наредби које стоје иза Then, а затим и наредба или група наредби која стоји иза Else. У оквиру наредби било које од грана IF наредбе може се наћи друга или више других IF наредби. У том случају треба водити рачуна о томе да се програмски преводилац, када наиђе на службену реч Else, враћа све до прве претходне службене речи IF и затвара је. Ако су све IF наредбе потпуне неће бити проблема са ужљебљењем. Али ако су неке од наредби непотпуне, (код програмера) може доћи до забуне (што може довести до алгоритамске грешке или до добијања чудних, неочекиваних резултата у раду програма). У таквим случајевима, ужљебљене непотпуну IF наредбу у Then грани, обавезно, треба писати у оквиру наредбе састављања (без обзира на то што се у тој грани извршава само једна наредба): IF <uslov1> THEN Begin IF <uslov2> THEN <naredba1>; End ELSE <naredba2>; <naredba3>; 49
49 Ако би се изоставила наредба састављања у случају да није испуњен <услов2> извршила би се <наредба2> иза службене речи Else, а у случају неиспуњења првог услова извршила би се прва наредба испод службене речи Else што би било логичка грешка и довело би до грешке у неким резултатима програма, овако, у случају да тај <услов2> није испуњен, прелази се на <наредбу3>. У случају да се непотпуна IF наредба налази иза службене речи Else наредба састављања није неопходна (али се може користити), јер је онда сасвим јасно која се наредба извршава у случају да неки од услова није испуњен: IF <uslov> THEN <naredba1> ELSE IF < uslov2 > THEN <naredba2>; <naredba3>; Синтакса наредбе Case Када је услов за гранање сложенији, тј. када захтева неколико грана (више од две) јер има више случајева који захтевају извршење различитих наредби, проблем се може решити вишеструком употребом IF наредбе уз преформулисање самог услова у неколико једноставнијих услова, али је, увек, много лакше, практичније и једноставније употребити наредбу CASE. Општи облик ове наредбе је: CASE <izraz> OF <slucaj1> : <naredba1>; <slucaj2> : <naredba2>; <slucaj3>, <slucaj4>,..., <slucajk> : <naredba3>; <slucajk+1>.. <slucajk+m> : <naredba4>; : <slucajn> : <naredbam>; ELSE <naredba>; END; Службена реч End, на крају CASE наредбе је обавезна и не сме се изоставити. Број случајева зависи од броја вредности израза које захтевају различите активности (наредбе), а највише их може бити 255. У случају да израз селектор може имати више од 255 вредности морамо комбиновати две или више CASE наредби. У CASE наредби податак <izraz> мора бити простог, уређеног типа (boolean, char, integer), а случајеви тј. вредности <izraz>-а могу бити задате као појединачне вредности (<slucaj1>, <slucaj2>), групе (<slucaj3>, <slucaj4>,..., <slucajk>) или интервали вредности (<slucajk+1>.. <slucajk+m>). Код групних случајева морају се навести све вредности које захтевају извршење исте наредбе. Код интервала се подразумева да се наредба извршава за све вредности од почетне до крајње вредности интервала, тј. не могу се изузимати неке врдности из унетог интервала. Else грана обухвата све случајеве који нису претходно поменути. Важно је поменути да вредности у случајевима не морају бити уређени у растући или опадајући поредак, али није дозвољено да се нека вредност појављује у два или више случајева. Ако у неким од случајева (појединачним, групама или интервалима) треба извршити више од једне наредбе онда те наредбе, обавезно, групишемо наредбом састављања: CASE <izraz> OF <slucaj1> : <naredba1>; <slucaj2> : Begin <naredbe>; End; <slucaj3>, <slucaj4>,..., <slucajk> : Begin <naredbe>; End;. : <slucajn> : <naredban>; ELSE Begin <naredbe>; End END; Ако потребе алгоритма захтевају, може се у оквиру једне CASE наредбе наћи још једна или више CASE наредби, но како свака од ових наредби има своје END не може доћи до забуне који случај припада којем изразу. До забуне (код програмера) може доћи само код комбиноване употребе CASE и непотпуне IF наредбе у последњем случају CASE наредбе, када се Else грана може схватити као део CASE наредбе или као део IF наредбе. Проблем се разрешава тако што се пре Else гране које припада CASE наредби обавезно ставља као граничник ; што у IF наредби није дозвољено, а може се и непотпуна IF наредба писати у оквиру наредбе састављања: 50
50 CASE <izraz> OF <slucaj1> : CASE <izraz> OF <slucaj1> : <naredbe>; <slucaj2> : <naredbe>;... <slucajn> : <naredbe>; ELSE <naredbe>; END; <slucaj2> : <naredbe>;... <slucajn> : If <uslov> then <naredba> else <naredba>;... <slucajn> : If <uslov> then <naredba>; ELSE <naredbe>; END; Алгоритми са гранањем одређивање минимума и максимума два и три броја Одређивање већег или мањег од два уписана броја је најједноставнији пример употребе If наредбе. Може се решити коришћењем додатне променљиве min (max) или без ње. Једноставније је објаснити пример са додатном променљивом. Одређивање већег од два броја: If a>b then max:=a else max:=b; Одређивање мањег од два броја: If a<b then min:=a else min:=b; Ако треба одредити и мањи и већи од два броја онда ћемо спојити ове две наредбе у једну: If а>b then begin max:=a;min:=b; end else begin min:=a;max:=b; Нешто је тежи случај када треба одредити најмањи или највећи од три уписана броја јер се морају упоређивати три броја сваки са сваким. То значи да у овом случају имамо најмање две If наредбе. И овде ћемо користити додатну променљиву јер је поступак једноставније објаснити. Одређивање највећег од три броја: If а>b then max:=a else max:=b; // већи од бројева a и b проглашавамо највећим If c>max then max:=c; // проверавамо да ли је трећи број већи од највећег Одређивање најмањег од три броја: If a<b then min:=a else min:=b; // мањи од бројева a и b проглашавамо најмањим If c<min then min:=c; // проверавамо да ли је трећи број мањи од најмањег Ако треба одредити и најмањи и највећи од три броја онда ћемо то урадити на следећи начин: If а>b then begin max:=a;min:=b; end else begin min:=a;max:=b; // већи од бројева a и b проглашавамо највећим, а мањи најмањим If c>max then max:=c // проверавамо да ли је трећи број већи од највећег else If c<min then min:=c; // проверавамо да ли је трећи број мањи од најмањег Могући су и другачији алгоритми, али се чини да је овај најједноставнији и прилично разумљив. 51
51 уређивање два и три броја у монотоно неопадајући или нерастући поредак Ако је потребно три броја уредити по величини онда није довољно само упоредити сваки са сваким, већ се морају и размењивати вредности између променљивих које нису у жељеном поретку. Зато је овај пример комбинација одређивања максимума и минимума и размене вредности два броја. Проблем ћемо решити тако што ћемо, најпре, упоређивати два броја и наместити да први буде мањи од другог, а затим ћемо трећи број упоређивати са сваким од претходна два и, по потреби, размењивати вредности. Записаћемо то овако: If a>b then If a>c then If b>c then begin pom:=a;a:=b;b:=pom; begin pom:=a;a:=c;c:=pom; begin pom:=b;b:=c;c:=pom; Овакво уређење чини растући (прецизније, неопадајући поредак јер нико не гарантује да неки од ова три броја нису једнаки). Посматрајмо то на једноставном, конкретном примеру у табели у којој сваки ред представља један алгоритамски корак: a b c шта се дешава упоређујемо прва два броја и пошто је први већи мењамо им места упоређујемо први и трећи број и пошто је трећи већи ништа се не мења упоређујемо други и трећи број и пошто је други већи мењамо им места Ако би требало бројеве уредити у опадајући (односно, нерастући) поредак, једина измена била би промена релације веће у мањен (или се бројеви уреде као у претходном примеру, а исписују се обрнутим редоследом). Следећи низ наредби уређује бројеве у такав поредак: If a<b then If a<c then If b<c then begin pom:=a;a:=b;b:=pom; begin pom:=a;a:=c;c:=pom; begin pom:=b;b:=c;c:=pom; одређивање сутрашњег и јучерашњег датума Код задатака са датумима мора се водити рачуна о томе да немају сви месеци једнак број дана и да је број дана у години ограничен на 365, односно, 366 код преступне године. Максимални број дана у месецу сви знамо, зато ћемо се подсетити правила која дефинишу да ли је година преступна. Већина би сваку четврту годину прогласила преступном, односно, ако је година дељива са ћетири она је преступна. Међутим то је погрешно, јер је познато да је година број који је дељив са 4, али та година није била преступна. Зато није довољно проверити да ли је година дељива са 4 да би се утврдило да ли је преступна, већ не сме бити последња година века, тј. не сме бити дељива са 100. Но и то није комплетан услов јер је година дељива са 100, а била је преступна. Зато, комплетан услов, да би нека година била преступна, гласи: година је преступна ако је дељива са 4 и није дељива са 100 или ако је дељива са 400. Када смо ово утврдили можемо одредити сутрашњи датум ако је дат данашњи. У већини случајева, сутрашњи датум је за један дан већи од данашњег. Ово правило не важи само ако је данас последњи дан у месецу. У том случају сутра је први дан следећег месеца. Да бисмо знали да ли је последњи дан у месецу морамо тестирати редни број месеца и редни број дана из данашњег датума. Редни број месеца може да се повећа за један само ако данашњи датум није неке године. У том случају сутрашњи датум је 1.1. следеће године. Сада ћемо написати, уз објашњења у коментарима, главни део програма који прати описани алгоритам: If (g mod 4=0) // ако је година дељива са 4 and(g mod 100<>0) // и ако није дељива са 100 or(g mod 400=0) // или ако је дељива са 400 then p:=1 else p:=0; // година је преступна // година није преступна // одредили смо да ли је година преступна или не // сада одређујемо максимални број дана у месецу 52
52 Case m of 2 : bd:=28+p; // ако је фебруар има 28 или 29 дана 4,6,9,11 : bd:=30; // четири месеца у години имају по 30 дана else bd:=31; // остали месеци имају по 31 дан d:=d+1; // сутрашњи датум је за 1 већи If d>bd // ако је редни број дана већи од максималног броја дана then begin d:=1; // прешли смо у други месец, односно, датум је 1. m:=m+1; // у том случају месец је за 1 већи If m>12 // ако смо добили редни број месеца већи од 12 then begin m:=1; // прешли смо у другу годину, односно, месец је 1. g:=g+1; // у том случају година је за 1 већа Сада треба исписати сутрашњи датум : d, m, g. Алгоритам за одређивање јучерашњег датума ћемо исписати без објашњења јер је прилично јасан, ако смо овај претходни добро разумели: If (g mod 4=0) and(g mod 100<>0) or(g mod 400=0) then p:=1 else p:=0; Case m-1 of 2 : bd:=28+p; 4,6,9,11 : bd:=30; else bd:=31; d:=d-1; If d<1 then If m<1 then begin d:=bd;m:=m-1; begin m:=12;g:=g-1; Case наредбу коју смо користили у оба алгоритма, лако смо могли заменити са две If наредбе, али је овакво решење ефектније. У проблемима са датумима требало би, пре извршења приказаних и сличних алгоритама, тестирати унете податке. Било би бесмислено тражити сутрашњи или јучерашњи датума ако је унети датум било које године. приказ назива дана у недељи на основу учитаног редног броја дана Овај пример је демонстрација предности Case у односу на If наредбу (у сличним ситуацијама). Редни број дана у недељи једнозначно одређује назив дана. Будући да је ово врло једноставан пример, нећемо се задржавати на непотребним објашњењима, али ћемо навести прво решење са Case, а затим и са If наредбом ради упоређења. Case rb of 1 : ime:='prvi dan u nedelji je ponedeljak.'; 2 : ime:='drugi dan u nedelji je utorak.'; 3 : ime:='treci dan u nedelji je sreda.'; 4 : ime:='cetvrti dan u nedelji je cetvrtak.'; 5 : ime:='peti dan u nedelji je petak.'; 6 : ime:='sesti dan u nedelji je subota.'; 7 : ime:='sedmi dan u nedelji je nedelja.'; else ime:='pogresan unos rednog broja dana u nedelji.'; If rb=1 then ime:='prvi dan u nedelji je ponedeljak.' else If rb= 2 then ime:='drugi dan u nedelji je utorak.' else If rb= 3 then ime:='treci dan u nedelji je sreda.' else If rb= 4 then ime:='cetvrti dan u nedelji je cetvrtak.' else If rb= 5 then ime:='peti dan u nedelji je petak.' else If rb= 6 then ime:='sesti dan u nedelji je subota.' else If rb= 7 then ime:='sedmi dan u nedelji je nedelja.' else ime:='pogresan unos rednog broja dana u nedelji.'; 53
53 приказ назива дана у недељи на основу учитаног редног броја дана Овај пример је још једна демонстрација предности Case у односу на If наредбу. Редни број месеца у години једнозначно одређује назив месеца. Будући да је ово врло једноставан пример, нећемо се задржавати на непотребним објашњењима, али ћемо и овде навести прво решење са Case, а затим и са If наредбом ради упоређења. Case rb of 1 : ime:='prvi mesec u godini je januar.'; 2 : ime:='drugi mesec u godini je februar.'; 3 : ime:='treci mesec u godini je mart.'; 4 : ime:='cetvrti mesec u godini je april.'; 5 : ime:='peti mesec u godini je maj.'; 6 : ime:='sesti mesec u godini je jun.'; 7 : ime:='sedmi mesec u godini je jul.'; 8 : ime:='osmi mesec u godini je avgust.'; 9 : ime:='deveti mesec u godini je septembar.'; 10: ime:='deseti mesec u godini je oktobar.'; 11: ime:='jedanaesti mesec u godini je novembar.'; 12: ime:='dvanaesti mesec u godini je decembar.'; else ime:='pogresan unos rednog broja meseca u godini.'; If rb=1 then ime:='prvi mesec u godini je januar.' else If rb= 2 then ime:='drugi mesec u godini je februar.' else If rb= 3 then ime:='treci mesec u godini je mart.' else If rb= 4 then ime:='cetvrti mesec u godini je april.' else If rb= 5 then ime:='peti mesec u godini je maj.' else If rb= 6 then ime:='sesti mesec u godini je jun.' else If rb= 7 then ime:='sedmi mesec u godini je jul.' else If rb= 8 then ime:='osmi mesec u godini je avgust.'; else If rb= 9 then ime:='deveti mesec u godini je septembar.'; else If rb= 10 then ime:='deseti mesec u godini je oktobar.'; else If rb= 11 then ime:='jedanaesti mesec u godini je novembar.'; else If rb= 12 then ime:='dvanaesti mesec u godini je decembar.'; else ime:='pogresan unos rednog broja meseca u godini.'; У примерима са редним бројевима дана и месеца, тестирали смо исправност унетих података Питања на која треба обратити пажњу > Шта је гранање? > Врсте гранања. > Синтакса If наредбе > Ужљебљене If наредбе > Непотпуна If наредба > Else грана у If наредби > Синтакса Case наредбе > Селектор у Case наредби > Случајеви у Case наредби > Else грана у Case наредби > Case наредба у Case наредби > If наредба у Case наредби 54
54 7. Компоненте избора и контејнерске компоненте Компоненте избора Коришћење програма подразумева унос неких почетних података чијом би се обрадом добили жељени резултати. Унос података може се остварити тако што се кориснику дозволи слободни унос, тј. корисник може унети било шта или се кориснику унос ограничи на неколико података од којих треба да изабере један. У првом случају, за унос се користе едити и мемо поља, у другом случају, за унос се користе компоненте избора. Радио-дугме (RadioButton) Радио дугме је компонента која дозвољава унос једне вредности од понуђених. Ако постоји само једно дугме, корисник може изабрати тај податак или га не изабрати. Много чешће се радио дугмад групишу, па се кориснику дозвољава шири избор, тј. од више понуђених података може изабрати један. Контрола избора је на програму, тј. избором једног податка аутоматски се поништава претходни избор. На слици је приказана радио група којом би се могао унети одговор на питање: На којој планети живимо. Могуће је изабрати само један од понуђених одговора. Радио дугмад могу бити распоређена хоризонтално, верикално или у облику табеле. Код радио дугмета најчешће се подешавају следеће карактеристике: Caption - наслов (назив опције) Color - боја позадине Top - удаљеност од горње ивице форме Left - удаљеност од леве ивице форме Width - ширина компоненте, ако је краћа од дужине наслова део наслова се неће видети Height - висина компоненте Font - врста фонта који се користи на панелу (може да се преноси на све компоненте које се стављају на панел) Checked - дефинише да ли је опција селектована или не Оквир за потврду (CheckBox) Оквир за потврду је компонента која дозвољава унос једног или више података од понуђених. Као и у претходном случају, може постојати више података при чему се кориснику допушта да изабере један или више података. На слици је приказана група оквира за потврду којом би се могао унети одговор на питање: Коју бисте планету волели да посетите. Могуће је изабрати један или више од понуђених одговора. Оквири могу бити распоређени хоризонтално, верикално или у облику табеле. Код оквира за потврду најчешће се подешавају следеће карактеристике: Caption - наслов (назив опције) Color - боја позадине Top - удаљеност од горње ивице форме Left - удаљеност од леве ивице форме Width - ширина компоненте, ако је краћа од дужине наслова део наслова се неће видети Height - висина компоненте Font - врста фонта који се користи на панелу (може да се преноси на све компоненте које се стављају на панел) Checked - дефинише да ли је опција селектована или не Оквир с листом (ListBox) Оквир са листом је компонента помоћу које можемо изабрати више од понуђених одговора, опција. Број понуђених опција није ограничен. Вишеструки избор омогућен је комбинованом употребом миша и тастера Shift или Ctrl. Помоћу првог тастера селектујемо све одговоре од првог селектованог до другог селектованог, а помоћу другог тастера можемо селектовати одговоре који нису један поред другога. Ако на листи има више одговора него што може стати у оквир са десне стране се појављује клизач којим се могу откривати одговори који се тренутно не виде. Код оквира са листом најчешће се подешавају следеће карактеристике: Color - боја позадине Top - удаљеност од горње ивице форме Left - удаљеност од леве ивице форме Width - ширина оквира Height - висина оквира Font - врста фонта који се користи у оквиру Border Style - врста ивице оквира Items - опције, ставке у листи MultiSelect - дозвољава или забрањује вишеструкоселектовање опција листе ItemIndex - редни број опције у листи (бројање почиње од 0) Sorted - дефинише да ли ће опције бити абецедно уређене 55
55 Комбиновани оквир (ComboBox) Комбиновани оквир је компонента која личи на компоненту edit. тј. састоји се из оквира у који се може уписати податак, али је на крају оквира додата и стрелица којом се отвара контејнер у који су смештени подаци које је дозвољено унети. Контејнер може бити ограничавајући или информативни. У првом случају кориснику се не дозвољава да унесе ништа осим понуђеног, а у другом случају корисник може изабрати нешто од понуђеног или уписати нешто друго. Падајућа листа може бити сакривена и по потреби се отвара, а може бити и стално видљива. Ако број понуђених одговора не може да стане у предвиђени оквир падајуће листе са десне стране се појављује клизач који се могу откривати тренутно невидљиви одговори. Најчешће коришћене карактеристике смо већ набројали Контејнерске компоненте Контејнерске компоненте се користе за визуелно издвајање и груписање компоненти које су повезане неким поступком, особином или чине посебну целину у програму. Овим компонентама се постиже боља прегледност маске за унос и приказивање података и ефикаснија контрола компоненти из програма. Оквир за групу (GroupBox) Када желимо да неколико истих или различитих компоненти повежемо јер су део једног процеса или акције која треба да се изврши онда користимо компоненту оквир за групу. Оквир за групу има своје име, а димензије могу да се мењају како би се компоненте које се повезују распоредиле тако да следе природни ток алгоритма. Могу се повезивати разнородне компоненте, радио дугмад, дугмад, едити, лабеле, чек боксови и други. Доступност компоненти из програма можемо да контролишемо преко оквира за групу. На тај начин можемо једном командом да искључимо све компоненте у групи или да их привремено уклонимо са форме и у погодном тренутку поново вратимо. Специјална врста оквира је RadioGroup коју чине само радио дугмад. Код оквира за групу најчешће се подешавају следеће карактеристике: Caption - наслов који објашњава функцију компоненти унутар оквира Color - боја позадине Top - удаљеност од горње ивице форме Left - удаљеност од леве ивице форме Width - ширина оквира Height Font - висина оквира - врста фонта који се користи у оквиру (ако је дефинисан, може да се преноси на све компоненте које се стављају на оквир, а може и да се наслеђује од компоненте на којој се налази) Плоча (Panel) Када желимо да постигнемо специјалне ефекте, да маске за унос и приказивање података начинимо ефектнијим користимо панеле. Панел може да се распростре по читавој форми или да заузима само део ње, може да има рубове који дају утисак тродимензионалности, могу да се покрећу, да се појављују или нестају, да буду доступни или не. Све компоненте које су смештене на једном панелу деле судбину панела. Панели се могу да користе увек, али се најчешће користе код мало сложенијих програма у којима има јако пуно компоненти и опција које не би требале истовремено да се приказују јер би форма била пренатрпана. А понекад се користе и за добијање специјалних ефеката, на пример, код приказа слика, помоћу панела, можемо додати рам за слику. Ако су два или више панела истовремено на форми могу се неке компоненте визуелно раздвајати и груписати по својим функцијама и употреби. Код панела најчешће се подешавају следеће карактеристике: Caption - наслов (најчешће се оставља празно, односно, нема наслова) Color - боја позадине Top - удаљеност од горње ивице форме Left - удаљеност од леве ивице форме Width - ширина панела Height - висина панела Font - врста фонта који се користи на панелу (може да се преноси на све компоненте које се стављају на панел) Align - позиција, поравњање панела у односу на форму BevelInner - изглед унутрашњег дела оквира панела BevelOuter - изглед спољашњег дела оквира панела BevelWidth - дебљина оквира панела BorderStyle - врсте ивица панела BorderWidth- дебљина ивице панела 56
56 8. Наредбе за организацију циклуса Када у алгоритму за решавање неког проблема имамо потребу да се нека наредба изврши више пута са променом почетних вредности или са истим вредностима онда имамо потребу за наредбама циклуса (вишеструког извршавања). У зависности од тога да ли унапред знамо број извршења циклуса или тај број зависи од неког услова разликујемо: бројачке циклусе и циклусе са условом Бројачки циклус је For циклус. Код њега се тачно зна колико пута ће се извршити нека наредба или група наредби. Циклус извршења наредби се не може прекинути пре извршења унапред задатог броја понављања. Циклуси са условом се извршавају произвољан број пута, а извршење циклуса наредби се прекида када се постигне неки услов. Циклуси са условом могу бити: циклуси са условом на крају (Repeat... until <uslov>) и циклуси са условом на почетку (While <uslov> do...) Синтакса наредби за организацију циклуса. Циклус For... do... Циклус For... do... је најједноставнија наредба циклуса. Користи се када је број понављања извршења наредбе или групе наредби унапред познат, односно, тачно одређен. Ова наредба има два општа облика: FOR <promenljiva> := <n1> TO <n2> DO <naredba>; и FOR <promenljiva> := <n1> DOWNTO <n2> DO <naredba>; <promenljiva> је бројачка променљива циклуса, а број извршења циклуса је разлика између бројева <n1> и <n2>, тачније, број извршења циклуса добија се по формули n1-n2 +1. Иза службене речи do никада не стоји тачка-зарез јер ту није крај наредбе циклуса. Ако се, ипак, стави онда се подразумева да је циклус празан, односно, у циклуси се неће извршити ни једна наредба. Бројачка променљива циклуса мора бити простог типа, односно, типа boolean, integer или char (или неког од њих изведеног), а <n1> и <n2> морају се по типу слагати са бројачком променљивом циклуса. Ако је вредност променљиве <n1> мања употребљава се службена реч to, а ако је вредност променљиве <n2> мања службена реч downto. Ако иза службене речи do треба да стоји више од једне наредбе оне се повезују наредбом састављања, односно: FOR <promenljiva> := <n1> TO <n2> DO Begin <naredbe>; End; FOR <promenljiva> := <n1> DOWNTO <n2> DO Begin <naredbe>; End; У случају када је иза do само једна наредба, наредба састављања није обавезна, али је дозвољена, односно, може се употребити ако то желимо, али је синтаксно непотребна. REPEAT - циклус са условом на крају Када неки посао треба обавити више пута, али се не зна тачан број понављања већ тај број зависи од неког услова може се употребити For наредба. Међутим, њена употреба би захтевала и употребу комбинације наредби условног и безусловног преласка, чиме би структура програма била јако оштећена. Да би се и овакви задаци могли једноставније решити уведена је наредба Repeat... until... која се извршава све док се услов који одређује број понављања не испуни. Општи облик ове наредбе је: REPEAT <naredba1>; <naredba2>;... <naredban>; UNTIL <uslov>; Број наредби унутар циклуса није ограничен, тј. у случају да у циклусу треба да се изврши више од једне наредбе нема потребе за писањем наредбе састављања, али је она дозвољена (уколико неко баш воли да је пише може је додати и то ће бити без последица и без нарушавања структуре програма само ће се програм, непотребно, компликовати). 57
57 Сваки задатак решен наредбом For може се решити исто тако једноставно наредбом Repeat. Обрнуто не важи. Тачније, сваки задатак решен Repeat наредбом може се решити и For наредбом, али то није увек и једноставно. Услов који одређује број извршавања циклуса може бити прост или сложен, односно, састављен од неколико простих услова повезаних логичким операцијама. У случају сложеног услова важе сва правила логичког закључивања, а сваки од простих услова, из којих се он састоји, ставља се између заграда: REPEAT <naredbe>; UNTIL (uslov1)or(uslov2)and(uslov3); Да би се изашло из циклуса мора бити испуњен први услов или истовремено друга два услова (могу бити испуњена и сва три услова). REPEAT <naredbе>; UNTIL ((uslov1)or(uslov2))and(uslov3); Да би се изашло из циклуса мора бити испуњен бар један од прва два услова и трећи услов (могу бити испуњена и сва три услова). У оквиру једне repeat наредбе може бити других repeat наредби или других наредби циклуса. У таквим случајевима мора се водити рачуна да не дође до нарушавања структуре програма. Наиме, није дозвољено да се неки циклус делимично налази унутар другог циклуса, а делимично изван њега. Циклус може бити у другом циклусу с тим да му и почетак и крај буду унутар тог другог циклуса или су циклуси један за другим, тј. почетак другог је иза краја првог циклуса. У циклусу може бити гранања, при чему не сме доћи до нарушавања структуре, тј. не може се десити да једна грана if наредбе (на пример then грана) буде у циклусу, а друга изван циклуса, нити неки случајеви case наредбе могу бити у циклусу, а други изван њега. WHILE - циклус са условом на почетку Ако број извршавања циклуса одређује услов који треба да се испуни користи се наредба Repeat. Међутим, врло често број извршавања наредби циклуса зависи од услова који је већ испуњен. У том случају циклус се извршава све док је тај услов испуњен. Тада је природније употребити While... do... наредбу. Општи облик ове наредбе је: WHILE <uslov> DO <naredba>; односно: WHILE <uslov> DO Begin <naredbe>; End; Ако иза службене речи do треба да стоји више од једне наредбе, оне се обавезно везују наредбом састављања, јер ако се то не уради у циклусу ће се извршавати само прва у том низу наредби што може довести до формирања бесконачног циклуса (ако се у тој првој наредби вредност услова не мења) или до проласка кроз циклус потребан број пута, али без резултата, ако се услов мења у првој наредби, а остале радње извршавају у наредним. И у једном и у другом случају циклус није оправдао своје постојање, па зато треба водити рачуна о овоме. У случају када иза до треба да стоји само једна наредба, наредба састављања није обавезна, али је дозвољена, односно, може се употребити, али за њом нема потребе. Сваки задатак који подразумева циклус може се једноставно решити овом наредбом, тј. While наредба може да замени и For и Repeat наредбу. Обрнуто не важи. Тачније, не може се сваки задатак са циклусом једноставно решити без коришћења наредбе While. Услов који одређује број извршавања циклуса може бити прост или сложен, тј. састављен од неколико простих услова. У случају сложеног услова важе правила логичког закључивања, а сваки од простих услова ставља се између заграда: WHILE (uslov1)or(uslov2)and(uslov3) DO <naredba>; да би се изашло из циклуса не сме бити испуњен први услов и бар један од друга два услова. WHILE ((uslov1)or(uslov2))and(uslov3) DO <naredba>; да би се изашло из циклуса не сме бити испуњен ниједан од прва два услова или трећи услов Примена наредби break и continue у циклусима Наредба break користи се за превремени завршетак циклуса for, while и repeat. Ова наредба се мора налазити у границама тела циклуса. У случају њеног извршења, прекида се извршавање циклуса који је непосредно обухвата и предаје контрола наредби која следи непосредно иза циклуса. Наредба break омогућава излазак само из текућег циклуса, а не и из свих циклуса унутар којих се налази, ако је текући угњежден у неки други циклус. 58
58 Наредба continue прекида извршавање текуће итерације (прескакањем преосталих наредби тела циклуса) оног циклуса који је непосредно обухвата и обавља прелазак на следећу итерацију, ако су задовољени услови за њено извршавање (провером вредности излазних критеријума наредбе циклуса); у противном, циклус се прекида. Continue наредба присиљава прескакање преосталих наредби унутар циклуса и прелазак на почетак циклуса, на следећу итерацију циклуса. Continue наредба скаче само на почетак текућег циклуса, а не и на почетак свих циклуса унутар којих се налази, ако је текући угњежен у неки други циклус. Важно: Наредбе break и continue нису у духу структурног програмирања јер ломе структуру програма и као такве их треба избегавати. Добар програмер увек може организовати циклус тако да коришћење ових наредби није потребно. Зато, у задацима које будемо решавали нећемо користити ове наредбе Неки алгоритми са циклусима Следи неколико примера урађених уз коришћење циклуса while, а затим и repeat циклуса. Обратите пажњу код преласка са решења са циклусом repeat на решење са циклусом while услов у задатку мора бити супротан, тј. < прелази у, > прелази у, прелази у >, прелази у <, or прелази у and, а and прелази у or. табелирање вредности функција Ако је потребно израчунати вредности неких функција за серију почетних вредности аргумената онда се за то могу користити циклуси. Који циклус ће се користити зависи од односа између вредности аргумената. Ако постоји неко правило на основу којег се аргументи мењају и то тако да се унапред зна број вредности аргумената можемо користити било коју врсту циклуса. Ако се не може унапред знати колико пута ће се рачунати вредност функције онда ћемо користити неки од циклуса са условом. Нека треба исписати вредности тригонометријских функција sin и cos на интервалу од a o до b o степени са кораком од c o. Задатак ћемо решити применом циклуса while. Као почетну вредност аргумента функције узећемо број a, одредити вредност функције и исписати је, а затим повећавати аргумент док не стигнемо до броја b. Потребно је водити рачуна о томе да тригонометријске функције раде са угловима у радијанима. ug:=a/180*pi; // претварамо степене у радијане While ug<=b/180*pi do // проверавамо да ли је угао у интервалу који приказујемо begin vred:=sin(ug); // одређујемо вредност функције синус vred:=cos(ug); // одређујемо вредност функције косинус ug:=ug+c/180*pi; // одређујемо нову вредност аргумента Задатак је једноставно могуће решити и коришћењем циклуса repeat уз услов да корисник упише да је a<b, а ако није, пре примене решења, треба заменити вредности променљивих. Решење помоћу циклуса for није тако једноставно. ug:=a/180*pi; // претварамо степене у радијане Repeat vred:=sin(ug); // одређујемо вредност функције синус vred:=cos(ug); // одређујемо вредност функције косинус ug:=ug+c/180*pi; // одређујемо нову вредност аргумента until ug>b/180*pi; // проверавамо да ли је угао у интервалу који приказујемо израчунавање сума и производа Ако је потребно рачунати суме или производе неке групе бројева који имају неку функционалну зависност, углавном могу се користити све врсте циклуса, али се најчеђће користи циклус for јер је такво решење најједноставније (осим у неким специфичним случајевима). Нека треба сабрати све парне бројеве од a до b. Најједноставније решење је: suma:=0; // почетна вредност за збир је 0 јер не утиче на коначан резултат For i:=(a+1)div 2 // пошто треба сабирати само парне бројеве почетна вредност броја // је половина броја а, користимо операцију div јер се ради о // целим бројевима, а (а+1) због тога што а може бити непаран број // па је у том случају 2*(а div 2)<а, тј. не сабира се to b div 2 do // крај сабирања је када број буде половина броја b јер је // 2*(b div 2)<=b suma:=suma+2*i;// сабирамо све парне бројеве зато i множимо са 2 Овакав задатак је лакше решити помоћу циклуса са условом: suma:=0; // почетна вредност је иста a:=(a+1)div 2*2; // намештамо да а буде паран број While a<=b do // крај сабирања је када број a буде једнак броју b begin suma:=suma+а; // сабирамо паран број а са претходнима а:=а+2; // узимамо следећи паран број 59
59 Наравно, постављање почетног броја на паран број већи или једнак броју a могло се извести и помоћу једне If наредбе, али то је већ ствар "укуса": If Odd(a) then a:=a+1; suma:=0; // почетна вредност је иста a:=(a+1)div 2*2; // намештамо да а буде паран број If a<=b then // проверавамо да ли је а мање или једнако b Repeat suma:=suma+а; // сабирамо паран број а са претходнима а:=а+2; // узимамо следећи паран број until a>b; // крај сабирања је када број a буде једнак броју b На исти начин би се решавали и задаци са производом бројева. Ако би требало сабирати или множити бројеве који нису цели, онда би требало користити циклусе са условом јер је решење једноставније него са бројачким циклусима (а понекад и једино могуће). испитивање својстава целих бројева Проблеми типа: одредити да ли је број прост, исписати све просте делиоце броја, исписати савршене бројеве до n, исписати Армстронгове бројеве до n и слични, могу се решавати било којом врстом циклуса, а често се користи и комбиновање различитих врста, да би се решење поједноставило. Приказаћемо први алгоритам. Број је прост ако осим 1 и самог себе нема других делиоца, зато ћемо избројати такве делиоце: bd:=0; // број делиоца различитих од 1 и самог броја је на почетку 0 For del:=2 to broj-1 do // почињемо тестирање од 2 до првог мањег броја If broj mod del=0 then bd:=bd+1; // ако је број дељив увећавамо број делилаца за 1 If bd>0 then // исписати број није прост else // исписати број је прост У алгоритму има пуно непотребних тестирања, па је неефикасан и не треба га користити. Било који број, осим самог себе, нема делиоца који су већи од његове половине. Број није прост ако има бар једног делиоца различитог од 1 и самог себе, па нема потребе тражити све такве делиоце. Бољи алгоритам се прекида чим се пронађе први такав делилац: del:=2; // за првог делиоца узимамо 2 While (broj mod del<>0) // проверавамо да ли је број дељив њиме and(del<=sqrt(broj)) do // проверавамо да ли је делилац већи од корена броја del:=del+1; // увећавамо делиоца за 1 If del>sqrt(broj) then // исписати број није прост else // исписати број је прост del:=1; // за првог делиоца узимамо 2 Repeat del:=del+1; // увећавамо делиоца за 1 until (broj mod del=0) // проверавамо да ли је број дељив њиме or(del>sqrt(broj)) do // проверавамо да ли је делилац већи од корена броја If del>sqrt(broj) then // исписати број није прост else // исписати број је прост Први услов у циклусу је јасан. Објаснићемо други. Алгоритам је замишљен да се циклус прекида чим се наиђе на првог делиоца који је већи од 1. То значи, ако је број дељив са 2 нема потребе проверавати да ли је дељив са својом половином; ако је број дељив са 3 нема потребе проверавати да ли је дељив својом трећином и тако даље до неког броја n. Да бисмо ронашли који је то број формирамо низ парова делилаца који као производ дају тај број, односно: 2 * broj/2, 3 * broj/3, 4 * broj/4,... Први делилац стално расте, други се стално смањује и први је увек мањи од другог. Јасно је да први делилац не може бити већи од корена тог броја (јер ако је већи мора се помножити са бројем који је мањи од њега да би се добио broj). Значи, последњи делилац у овом низу је корен почетног броја, зато је то последњи број за који проверавамо да ли може бити делилац почетног и ако је del већи од корена броја значи да нисмо нашли ниједног делиоца, па је почетни број прост Питања на која треба обратити пажњу > Шта је циклус > Врсте циклуса > Синтакса бројачког циклуса > Број извршења бројачког циклуса > Тип бројача циклуса > Циклуси са условом > Синтакса циклуса са условом > Примена циклуса > Сложени услов у циклусима > Наредба састављања у циклусима 60
60 9. Опис класе Опис методе класе (функције и процедуре). Класа, осим објеката, садржи и методе, односно, операције које су дефинисане са објектима те класе. Операције морају да се декларишу и дефиниши. Декларација мора садржати тип операције, назив и параметре са којима ради. Као метода може се дефинисати функција или процедура. Једним именом функције и процедуре зовемо потпрограмима зато што имају структуру било којег програма, али не могу да стоје самостално, јер су везане за објекат класе и извршавају се као реакција на неки догађај објекта. Потпрограми могу бити дефинисани и изван класе и не морају бити ни у каквој вези са објектима класе. Зато ћемо овде обрадити и функције и процедуре које нису методе класе. Структура је потпуно иста, разлика је само у власнику и параметрима функције или процедуре и у начину позивања. Методе класе позивају се као реакција на неки догађај, а позиви других функција или процедура пишу се у оквиру неке наредбе или су независне наредбе програма. Врло често програм који пишемо постаје јако компликован, при чему се неки делови програма понављају са истим или сличним вредностима. Да би се поједноставило писање, читање и разумевање програма делови програма се издвајају у посебне релативно независне целине које се називају потпро- грамима. Потпрограмима се придружује симболичко име помоћу којег ће се позивати из програма кад год је потребно извршити издвојене радње. Потпрограми имају исту структуру као и сам програм, тј. имају заглавље и тело са наредбама. Потпрограми морају да се деклариши и дефинишу. Декларација се пише у заглављу програма, у делу за декларације, а дефиниције се пишу у делу за дефиниције (после службене речи implementation). Разликујемо две врсте потпрограма: функције и процедуре. Функције су једноставније. Декларишу се службеном речи function, именом, аргументима и својим типом, на пример: function Stepen(b,e:real):real; Функција може имати произвољан број аргумената који могу, а не морају бити истог типа. Они се називају још и улазним параметрима или улазним променљивама зато што вредност добијају у главном програму и ту вредност преносе у функцију. Осим улазних постоје и излазни параметри који своју вредност преносе из функције у главни програм. Функција има само један излазни параметар и то је име функције (зато функција мора имати декларисан тип). Да би се вредност из функције пренела у главни програм имену функције се бар једном мора доделити вредност. Постоје просте и рекурзивне функције. У телу са наредбама просте функције име функције не сме да се нађе са десне стране знака додељивања (јер би то било рекурзивно позивање функције, па би то онда била рекурзивна функција). Рекурзивне функције су нешто компликованије и обрадићемо их само кроз неколико примера када довољно добро савладамо формирање простих функција. Функција мора да се дефинише да би могла да се користи у програму. Дефиниција функције се састоји из заглавља које мора бити идентично декларацији функције и тела функције са наредбама, на пример: function TForm1.Stepen(b,e:real):real; var s:real; begin s:=1; While e>0 do begin s:=s*b; e:=e-1; stepen:=s; Процедуре је издвојени низ радњи који представља логичку целину посебно именовану ради позивања и извршавања по позиву у било којем делу програма. Процедуре се декларишу службеном речи procedure, именом процедуре и улазним и излазним параметрима, на пример: procedure Stepen(b,e:real;VAR s:real); Процедура може имати произвољан број улазних и излазних параметара. Излазни се од улазних параметара одвајају службеном речи VAR. Излазни параметри процедуре своју вредност могу добити у главном програму и мењати је у процедури, а своју вредност преносе у главни програм. Улазни параметри вредност преносе из главног програма и ту вредност могу мењати у процедури, али се њихова вредност се не преноси у главни програм. Улазни параметри могу бити променљиве којима су додељене вредности у претходним наредбама програма или конкретне вредности, а излазни параметри морају бити променљиве. Постоје просте и рекурзивне процедуре. У телу са наредбама просте процедуре не сме се наћи име процедуре (јер би то било рекурзивно позивање процедуре, па би то онда била рекурзивна процедура). Рекурзивне процедуре су нешто компликованије и обрадићемо их само кроз неколико примера када довољно добро савладамо формирање простих процедура. Процедура мора да се дефинише да би могла да се користи у програму. Дефиниција процедуре састоји се из заглавља које мора бити идентично декларацији процедуре и тела процедуре са наредбама, на пример: 61
61 procedure TForm1.Stepen(b,e:real; VAR s:real); begin s:=1; While e>0 do begin s:=s*b; e:=e-1; Формални и стварни параметри методе Променљиве b и e у декларацији и дефиницији функције Stepen и променљиве b, e и s у декларацији и у заглављу дефиниције процедуре Stepen су формални параметри, тј. њихова функција је задовољење форме и немају никакву вредност. Када се функција или процедура позива из главног програма позива се са стварним, конкретним вредностима и зато се променљиве у позиву функције или процедуре зову стварни параметри. Функција се позива из главног програма навођењем имена и стварних параметара УВЕК из неке друге наредбе. Стварни параметри могу бити променљиве којима су додељене вредности у претходним наредбама програма, неке друге функције или конкретне вредности. Процедура се позива из главног програма навођењем имена и стварних параметара УВЕК као независна наредба програма. Стварни параметри могу бити променљиве којима су додељене вредности у претходним наредбама програма, претходно дефинисане функције или конкретне вредности. Синтакса позива методе Позив функције није независна наредба програма и не може се наћи са леве стране знака додељивања. Примери позива функције: a:=stepen(b,n); <- одређује н-ти степен броја б a:=stepen(b,3); <- одређује трећи степен броја б a:=stepen(2,4); <- одређује четврти степен броја 2 Позив процедуре је независна наредба програма и не може се наћи у оквиру било које друге наредбе програма. Примери позива процедуре: Stepen(b,n,s); <- одређује н-ти степен броја б Stepen(b,3,s); <- одређује трећи степен броја б Stepen(2,4,s); <- одређује четврти степен броја 2 У функцијама и/или процедурама могу се позивати друге функције и процедуре и користити њихове вредности да би се добили неки други резултати. Сваки задатак који може да се реши помоћу једне функције може да се реши и помоћу једне процедуре. Ако је задатак решен помоћу процедуре онда се он може решити и са онолико функција колико има излазних резултата у процедури, али то понекад није ни мало једноставно. Зато се понекад каже да су функције специјална врста процедуре које описују рачунање са једним излазним резултатом, а које се могу непосредно користити у формулама за израчунавање других вредности. Тело методе Тело функције или процедуре почиње службеном речи begin, а завршава службеном речи end између којих се налази потребан број наредби. Сва правила везана за тело програма важе и у овом случају, само што се, на крају програма сравља симбол тачка, а на крају функције или процедуре симбол тачка-зарез. Локалне променљиве методе Променљиве које се користе у оквиру неке функције или процедуре могу бити глобалне, ако су декларисане у главном програму или локалне ако су декларисане у заглављу функције или процедуре. Глобалне променљиве своју вредност могу добијати и мењати било где у програму и преносе је из функције или процедуре у било који део програма. Ово, понекад, није практично јер се може десити да нам вредност променљиве добијена негде у програму треба и након повратка из функције или процедуре. Зато се чешће користе локалне променљиве. Оне своју вредност добијају у функцији или процедури у којој су декларисане и могу се користити само ту. Ако имамо више функција или процедура и у свима су декларисане променљиве истог имена њихове вредности су независне, не мешају се. Изван функције или процедуре немају никакву вредност и не могу се користити. Поља класе Поља класе дефинишу стање сваког објекта класе. Поља која одражавају стање које је јединствено називају се променљиве примерка. Када је декларисано, поље се може иницијализовати додељивањем вредности одговарајућег типа. Иницијализатор не мора бити константа, већ може бити друго поље, позив методе или неки израз који садржи ова два елемента, док год одговарају по типовима. Различите класе могу имати различит број и врсте поља. Вредности поља могу се дефинисати у фази израде апликације, али и касније, у фази извршавања, ако је алгоритамски предвиђено, односно, ако се та промена не би могла лоше одразити на ток извршења алгоритма. На пример, било би прилично непрофесионално дозволити кориснику да у току извршавања програма обрише едит за унос података или дугме за излазак из програма. 62
62 Примери једноставнијих функција Факторијел унетог броја Улазни параметар функције је број - граница за који се рачуна факторијел. Због ограничења скупа целих бројева не можемо израчунати факторијел за сваки цео број. То ограничење треба уградити у главни програм, а функција треба да рачуна факторијел само за бројеве за које не прелази преко границе за целе бројеве. function TForm1.Fakt(n:Integer):Int64; var f:int64; i:integer; begin f:=1; For i:=1 to n do f:=f*i; fakt:=f; За бројеве веће од 20 функција не даје тачан резултат. Да бисмо решили проблем са ограничењем целих бројева, можемо резултат прогласити реалним: function TForm1.Fakt(n:integer):Real; var f:real; i:integer; begin f:=1; For i:=1 to n do f:=f*i; fakt:=f; Али ни ово нам не помаже да добијемо тачан резултат код већих бројева јер факторијел неограничено расте, а меморија рачунара је ограничена. Степеновање унетог броја другим унетим бројем Улазни параметри функције су број који се степенује (основа) и број којим се степенује (експонент). Због ограничења меморије не може се израчунати степен за сваки број на било који експонент. Разликујемо два случаја, када је експонент цео број и када је експонент реалан број. Прво решење је очигледније: function TForm1.Step(a:Real; n:integer):real; var s:real; i:integer; begin s:=1; For i:=1 to n do s:=s*a; step:=s; Друго решење подразумева коришћење логаритама и експоненцијалне функције јер се у програмирању не може израчунати корен било којег реда: function TForm1.Step(a,b:Real):Real; begin step:=exp(b*ln(a)); Друго решење је општије, али користи експоненцијалну функцију и логаритме који се одређују са извесном грешком, може се десити да се добије резултат који је приближно тачан. Утврђивање да ли је уписани број прост Улазни параметар је број који тестирамо, а резултат је логичка вредност true ако је број прост или false ако број није прост: function TForm1.Prost(n:Integer):boolean; var d:integer; begin If n<4 then prost:=true // сви мањи од 4 су прости бројеви else If not Odd(n) then prost:=false else // парни бројеви већи од 2 нису прости // тражимо делиоце броја n, пошто су бројеви непарни // не могу бити дељиви парним бројем зато је d:=3 // најмањи потенцијални делилац. У циклусу // проверавамо да ли је d делилац броја и да ли је // мањи или једнак корену броја (јер је корен броја // највећи делилац који не треба множити већим од // њега да би се добио број). Број је прост ако нисмо // нашли неки његов делилац док није d>sqrt(n) begin d:=3; While (n mod d<>0)and(d<=sqrt(n)) do d:=d+2; prost:=d>sqrt(n); Написаћемо сада и одговарајуће процедуре без њиховог објашњавања јер је алгоритам исти само је начин записивања и употребе мало измењен (процедуре су поступци, па се другачије позивају). 63
63 Примери једноставнијих процедура Факторијел procedure TForm1.Fakt(n:Integer; Var f:int64); var i:integer; begin f:=1; For i:=1 to n do f:=f*i; или procedure TForm1.Fakt(n:Integer; Var f:real); var i:integer; begin f:=1; For i:=1 to n do f:=f*i; Степен procedure TForm1.Step(a:Real; n:integer; Var s:real); var i:integer; begin s:=1; For i:=1 to n do s:=s*a; или procedure TForm1.Step(a,b:Real; Var s:real); begin s:=exp(b*ln(a)); Прост број procedure TForm1.Prost(n:Integer; Var p:boolean); var d:integer; begin If n<4 then p:=true else If not Odd(n) then p:=false else begin d:=3; While (n mod d<>0)and(d<=sqrt(n)) do d:=d+2; p:=d>sqrt(n); Питања на која треба обратити пажњу > Шта су методе класе? > Декларација и дефиниција методе. > Врсте функција. > Шта су процедуре? > Врсте процедура. > Разлика између функција и процедура. > Параметри код функција. > Параметри код процедура. > Позивање функције. > Позивање процедуре. > Локалне променљиве. 64
64 10. Тип низа Једнодимензионални низови. Линеарно уређени низ једноиндексних променљивих чини једнодимензионални низ. При декларацији сваког низа преводилац резервише потребну количина меморије за чување вредности свих елемената низа, без обзира да ли се они користе или не у програму, зато максималан број чланова једнодимензионалног низа (исто тако и сваког другог низа) зависи од расположиве количине радне меморије рачунара. У случају да нема довољно меморије за чување декларисаног низа добићемо једну од следећих порука: "Error 22: Structure too large" или "Error 96: Too many variables" Грешке се отклањају смањењем дужине низова или променом типа елемената низова или се другачијим алгоритмом број низова смањи и ослободи довољна количина меморије. У делфију програм може користити целокупну слободну RAM меморију, па се овакве грешке неће јављати, али и овде важе нека ограничења, међутим у задацима са којима ћемо се сретати у животу обичних смртника нећемо имати проблема са недостатком меморије за чување вредности чланова низа. Примери декларација једнодимензионалних низова Декларација променљиве типа низ (тип низ је имплицитно дефинисан, нема своје име и не може се користити као тип података улазних и излазних параметара функција и процедура): VAR x:array[1..20] of REAL; једнодимензионални низ од највише двадесет реалних бројева. VAR slovo:array[1..55] of CHAR; једнодимензионални низ типа карактер са највише 55 елемената. Експлицитно дефинисани тип низ и декларација променљивих типа низ помоћу њега (овако дефинисан тип низ може се користити за декларацију улазних и излазних параметара функција и процедура): TYPE rniz=array[1..20] of REAL; cniz=array[1..55] of CHAR VAR x:rniz; једнодимензионални низ од највише двадесет реалних бројева. VAR slovo:cniz; једнодимензионални низ типа карактер са највише 55 елемената Основне операције са низовима израчунавање просечне вредности Ако треба одредити просечну вредност елемената низа то значи да треба сабрати све елементе низа и поделити тај збир са бројем елемената низа. Као и увек, код рачунања збирова у циклусу, морамо за почетну вредност узети неки број који неће утицати на решење проблема, у овом случају то ће бити 0. Затим ћемо у циклусу for сабирати све елементе низа. На крају ћемо исписати тражени резултат. zbir:=0; // почетна вредност за збир елемената низа For i:=1 to n do // n je број елемената низа begin // овде треба унети нови елемент низа a[i] zbir:=zbir+a[i]; // нови елемент низа се сабира са свим претходним arsred:=zbir/n // одређује се просечна вредност елемената низа, наравно, // треба водити рачуна o декларисаним типовима променљивих Нешто је већи проблем ако се низ уноси све до испуњења неког услова, односно, низ има највише 100 елемената (на пример, не мора бити 100, може бити било који унапред задати број), а елементи се уносе све док се не унесе 0 (када се унесе 0 то није елемент низа, већ то значи да су унети сви елементи низа). Тада би овај задатак морао да се решава помоћу циклуса са условом, најбоље са while. zbir:=0; // почетна вредност за збир елемената низа n:=0; // број елемената низа је 0 јер још није унет ни један // овде треба унети вредност помоћне променљиве broj While broj<>0 do // ако није унета 0 формира се неки елемент низа begin n:=n+1; // редни број елемента низа увећава се за један a[n]:=broj; // додаје се нови елемент низа zbir:=zbir+a[n]; // нови елемент низа се сабира са свим претходним // овде треба унети нову вредност помоћне променљиве broj arsred:=zbir/n // одређује се просечна вредност елемената низа, наравно, // треба водити рачуна o декларисаним типовима променљивих 65
65 израчунавање минималне / максималне вредности низа Код одређивања максималне и минималне вредности низа користићемо две помоћне променљиве које ће на почетку имати вредност првог елемента низа, а затим ћемо их упоређивати са осталим елементима низа и кад год пронађемо елемент који је већи од прве променљиве доделићемо јој ту вредност, односно, када нађемо елемент низа који је мањи од друге променљиве доделићемо јој ту вредност. min:=a[1]; max:=a[1]; For i:=2 to n do // циклус креће од 2 јер нема потребе тестирати први елемент If a[i]>max then max:=a[i] // ако је елемент низа већи од највећег, онда је он највећи else If a[i]<min then min:=a[i]; // ако је елемент низа мањи од најмањег, онда је он најмањи За почетну вредност променљивих min и max не мора се узети први елемент низа, сасвим би исправно радио програм и ако бисмо узели било који елемент низа, али је овако једноставније. претраживање у низу Претраживање у низу који није уређен своди се на претходни пример, разлика је само што не тражимо највећи или најмањи елемент низа већ елемент који садодољава неки услов, већи је или је мањи од неког задатог броја или је једнак неком броју. Програм би нам могао дати одговор да ли такав елемент постоји и колико је таквих елемената у низу. Ако треба одредити редни број елемента у уређеном низу који испуњава неки услов онда можемо применити различите методе претраживања, али је најједноставније користити методу половљења. Проверавамо да ли је елемент на средини низа тражени, па ако није одређујемо у којој половини низа се он налази, делимо низ на пола и узимамо половину низа у којој се налази тражени елемент. Сада ту половину низа посматрамо као неки низ и понављамо претходни поступак. Овако организован програм би могао дати одговор да ли постоји одговарајући елемент и који је његов редни број, али и колико таквих елемената има. сортирање низа Код сортирања низа потребно је упоређивати узастопне елементе и наместити да свака два узастона елемента буду у одговарајућем поретку. Низ може бити уређен у растућем или опадајућем поретку. Но, ова два поретка, строго математички гледано, подразумевају да у низу нема истих елемената. Пошто ми унапред не знамо да ли ће у низу бити истих елемената или не, уместо појма растући користимо појам неопадајући, а уместо појма опадајући користимо појам нерастући. Размотримо случај неопадајућег поретка (јер читањем неопадајућег низа од краја према почетку добијамо нерастуће поређане елементе низа). Да бисмо били сигурни да је низ уређен у неопадајући поредак није довољно једном проћи кроз низ и наместити да сваки други од два узастопна елемента буде већи или једнак првом јер не знамо какав је однос претходних елемената низа са мањим од ова два. Показаћемо то на простом примеру: Нека је дат низ 2, 3, 1. Упоређиваћемо први са другим и други са трећим. Пошто је први мањи од другог ништа се не мења, а пошто је други већи од трећег заменићемо им места. Добили смо низ 2, 1, 3 који, очигледно, није неопадајући јер је први елемент низа већи од другог. Зато, код уређивања низа морамо сваки елемент низа упоређивати са свима иза њега. То ћемо остварити двоструким циклусом. Први циклус ће почети од првог елемента низа и извршаваће се све док не стигнемо до претпоследњег, тј. узимаће први елемент у пару елемената низа. Други циклус почиње са првим следећим елементом и извршаваће се док не стигнемо до последњег, тј. редни број другог елемента у пару биће увек већи од редног броја првог елемента. Затим ћемо упоређивати ова два елемента, једног из првог циклуса и једног из другог, и кад год нам њихов редослед не одговара заменићемо им места. Практично ћемо то записати овако: // нека је n укупан број елемената у низу For i:=1 to n-1 do // i је редни број првог у пару елемената низа For j:=i+1 to n do // ј је редни број другог у пару елемената низа If a[i]>a[j] // проверавамо да ли је нарушен поредак елемената низа then begin // ако јесте елементима мењамо места p:=a[i]; // вредност првог елемента чувамо у помоћној променљивој р a[i]:=a[j]; // први елемент преузима вредност другог елемента низа a[j]:=p; // други елеменат преузима вредност првог сачувану у помоћној Уређивање у нерастући поредак остварило би се на исти начин, једино би се уместо релације веће од користила релација мање од: // нека је n укупан број елемената у низу For i:=1 to n-1 do // i је редни број првог у пару елемената низа For j:=i+1 to n do // ј је редни број другог у пару елемената низа If a[i]<a[j] // проверавамо да ли је нарушен поредак елемената низа 66
66 then begin // ако јесте елементима мењамо места p:=a[i]; // вредност првог елемента чувамо у помоћној променљивој р a[i]:=a[j]; // први елемент преузима вредност другог елемента низа a[j]:=p; // други елеменат преузима вредност првог сачувану у помоћној Постоје и други алгоритми за сортирање низа. Овај је најефикаснији када низ има мањи број елемената Дводимензионални низови Дводимензионалним низом зовемо низ двоиндексних променљивих. Ова врста низова обично се назива матрица или таблица, хоризонтални елементи чине редове, а вертикални колоне матрице. Индекси низа имају своје границе, али оне не морају бити једнаке. Ако су границе једнаке матрицу зовемо квадратном. Елементи од горњег левог до доњег десног у квадратној матрици чине главну, а елементи од горњег десног до доњег левог споредну дијагоналу. Типови индекса не морају да буду једнаки, тј. један индекс може бити цео број, а други, на пример, типа карактер. Укупан број декларисаних променљивих, за које се резервише меморија, код дводимензионалног низа добија се када се највећи редни бројеви оба индекса помноже. TYPE MATRICA=ARRAY [1..10,1..20] of INTEGER; дефинише се тип дводимензионални низ са 10 * 20 = 200 целобројних чланова. TYPE FIGURA=(prazno,pesak,top,konj,lovac,kralj,dama); SAHTABLA=ARRAY['a'..'h',1..8] of FIGURA; VAR mesto:sahtabla; дефинишу се типови фигура и шахтабла и декларише се дводимензионални низ са 8 * 8 = 64 елемената типа фигура. Аналогно би се могао дефинисати низ са више индекса, на пример троиндексни низ је низ троиндексних променљивих, итд. Начин рада са таквим, вишедимензионалним низовима, би био аналоган раду са једнодимензионалним или дводимензионалним низовима. Низ се најпре декларише, члановима се доделе неке вредности и обави се задатак због којег је низ формиран. Но, мора се признати да се врло ретко јавља потреба за низовима са више од три димензије (индекса), али добро је знати да је и то могуће. Наравно са повећањем броја димензија низа повећава се потреба за меморијом, па се смањује максимална, реално могућа, дужина таквих низова Алгоритми за израчунавања и трансформације на табели и њеним деловима. Збир два дводимензионална низа Најједноставнија операција са два дводимензионална низа је одређивање њиховог збира. Збир је дводимнезионални низ чији се елементи добијају сабирањем одговарајућих елемената оба низа. Да би се два низа могла сабирати морају да имају исте димензије, односно, број редова и колона једног мора бити једнак броју редова и колона другог низа (не морају бити квадратни као на слици). Алгоритам за сабирање ћемо записати на следећи начин: For i:=1 to n do For j:=1 to m do c[i,j]:=a[i,j]+b[i,j]; Производ два дводимензионална низа Да би се два дводимензионална низа могла помножити обавезно мора број колона првог бити једнак броју редова другог низа (број редова првог и број колона другог дводимензионалног низа не морају обавезно бити једнаки као на слици). Производ два дводимензионална низа је дводимензионални низ чији се елементи добијају као збир производа елемената одговарајућег првог низа и елемената одговарајућег другог низа. Алгоритам за множење низова ћемо записати на следећи начин: For i:=1 to n do For j:=1 to m do begin c[i,j]:=0; For k:=1 to p do c[i,j]:=c[i,j]+a[i,k]*b[k,j]; Додавање колоне или реда Нека треба додати један ред дводимензионалном низу димензија N x M, после његовог к-тог реда. То значи да ћемо имати нови низ са димензијама (N+1) x M. Додавање реда ћемо остварити тако што ћемо редове од k+1 до n преписати у редове k+2 do n+1, a на место k+1 ћемо уметнути нови ред низа. Ради једноставнијег записа алгоритма, посматраћемо ред који треба уметнути као једнодимензионални низ. 67
67 Алгоритам за додавање реда ћемо записати на следећи начин: For j:=1 to m do begin For i:=n+1 downto k+2 do a[i,j]:=a[i-1,j]; a[k+1,j]:=b[j]; n:=n+1; Алгоритам за додавање колоне ћемо записати на следећи начин: For i:=1 to n do begin For j:=m+1 downto k+2 do a[i,j]:=a[i,j-1]; a[i,k+1]:=b[i]; n:=n+1; Брисање колоне или реда Нека треба обрисати један ред дводимензионалном низу димензија N x M, на пример к-ти ред. То значи да ћемо имати нови низ са димензијама (N-1) x M. Брисање реда ћемо остварити тако што ћемо редове од k+1 до n преписати у редове k do n-1. Алгоритам за брисање реда ћемо записати на следећи начин: For j:=1 to m do For i:=k to n-1 do a[i,j]:=a[i+1,j]; n:=n-1; Алгоритам за брисање колоне ћемо записати на следећи начин: For i:=1 to n do For j:=k to m-1 do a[i,j]:=a[i,j+1]; m:=m-1; Визуелна компонента за табеларни приказ текста. За приказивање елемената дводимензионалног низа може се користити мемо поље, при чему морамо форматизовати сваки елемент и сваки ред низа како бисмо добили табелу, или можемо користити компоненту StringGrid (види слику). Карактеристике које би требало подесити су: Align - положај грида у односу на рубове форме ColCount - број колона Color - боја позадине DefaultColWidth - предефинисана ширина колона DefaultRowHeight - предефинисана висина редова Enabled - доступност активностима корисника FixedColor - боја непокретних поља (на слици црвено обојена) FixedCols - број непокретних колона FixedRows - број непокретних редова Font - врста фонта којим се попуњава грид GridLineWidth - дебљина линија које ограничавају поља грида Height - висина грида Left - рстојање од левог руба форме Name - име грида RowCount - број редова грида ScrollBars - да ли се приказују хоризонтални и вертикални клизач ако сва поља грида нису видљива Top - растојање од врха форме Visible - да ли је видљивост грид Width - ширина грида Ако желимо да дводимензионални низ буде исписан у гриду, онда морамо знати да је први аргумент редни број колоне, а други реда (супротно од дводимензионалног низа). Попуњавање остварујемо са: For i:=1 to 6 do For j:=1 to 7 do StringGrid1.Cells[j,i]:=IntToStr(a[i,j]); StringGrid се може користити и за табеларно приказивање текста. У том случају могу се користити и непокретни ред и непокретна колона да би се дефинисало заглавље табеле. Непокретни ред има редни број 0, као и колона. На слици је приказан део распореда часова. 68
налазе се у диелектрику, релативне диелектричне константе ε r = 2, на међусобном растојању 2 a ( a =1cm
1 Два тачкаста наелектрисања 1 400 p и 100p налазе се у диелектрику релативне диелектричне константе ε на међусобном растојању ( 1cm ) као на слици 1 Одредити силу на наелектрисање 3 100p када се оно нађе:
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА МАТЕМАТИКА ТЕСТ
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА МАТЕМАТИКА ТЕСТ УПУТСТВО ЗА ОЦЕЊИВАЊЕ ОБАВЕЗНО ПРОЧИТАТИ ОПШТА УПУТСТВА 1. Сваки
Теорија електричних кола
др Милка Потребић, ванредни професор, Теорија електричних кола, вежбе, Универзитет у Београду Електротехнички факултет, 7. Теорија електричних кола i i i Милка Потребић др Милка Потребић, ванредни професор,
1.2. Сличност троуглова
математик за VIII разред основне школе.2. Сличност троуглова Учили смо и дефиницију подударности два троугла, као и четири правила (теореме) о подударности троуглова. На сличан начин наводимо (без доказа)
Tестирање хипотеза. 5.час. 30. март Боjана Тодић Статистички софтвер март / 10
Tестирање хипотеза 5.час 30. март 2016. Боjана Тодић Статистички софтвер 2 30. март 2016. 1 / 10 Монте Карло тест Монте Карло методе су методе код коjих се употребљаваjу низови случаjних броjева за извршење
СИСТЕМ ЛИНЕАРНИХ ЈЕДНАЧИНА С ДВЕ НЕПОЗНАТЕ
СИСТЕМ ЛИНЕАРНИХ ЈЕДНАЧИНА С ДВЕ НЕПОЗНАТЕ 8.. Линеарна једначина с две непознате Упознали смо појам линеарног израза са једном непознатом. Изрази x + 4; (x 4) + 5; x; су линеарни изрази. Слично, линеарни
2.3. Решавање линеарних једначина с једном непознатом
. Решимо једначину 5. ( * ) + 5 + Провера: + 5 + 0 5 + 5 +. + 0. Број је решење дате једначине... Реши једначину: ) +,5 ) + ) - ) - -.. Да ли су следеће једначине еквивалентне? Провери решавањем. ) - 0
7. ЈЕДНОСТАВНИЈЕ КВАДРАТНЕ ДИОФАНТОВE ЈЕДНАЧИНЕ
7. ЈЕДНОСТАВНИЈЕ КВАДРАТНЕ ДИОФАНТОВE ЈЕДНАЧИНЕ 7.1. ДИОФАНТОВА ЈЕДНАЧИНА ху = n (n N) Диофантова једначина ху = n (n N) има увек решења у скупу природних (а и целих) бројева и њено решавање није проблем,
2. Наставни колоквијум Задаци за вежбање ОЈЛЕРОВА МЕТОДА
. колоквијум. Наставни колоквијум Задаци за вежбање У свим задацима се приликом рачунања добија само по једна вредност. Одступање појединачне вредности од тачне вредности је апсолутна грешка. Вредност
Анализа Петријевих мрежа
Анализа Петријевих мрежа Анализа Петријевих мрежа Мере се: Својства Петријевих мрежа: Досежљивост (Reachability) Проблем досежљивости се састоји у испитивању да ли се може достићи неко, жељено или нежељено,
Скупови (наставак) Релације. Професор : Рака Јовановић Асиситент : Јелена Јовановић
Скупови (наставак) Релације Професор : Рака Јовановић Асиситент : Јелена Јовановић Дефиниција дуалне скуповне формуле За скуповне формулу f, која се састоји из једног или више скуповних симбола и њихових
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ НА КРАЈУ ОСНОВНОГ ОБРАЗОВАЊА И ВАСПИТАЊА школска 01/01. година ТЕСТ
РАЧУНАРСТВО И ИНФОРМАТИКА 3. разред
ДЕВЕТА БЕОГРАДСКА ГИМНАЗИЈА Михаило Петровић Алас РАЧУНАРСТВО И ИНФОРМАТИКА 3. разред РЕШАВАЊЕ ПРОБЛЕМА ПОМОЋУ РАЧУНАРА Милена Марић 2014. година www.alas.matf.bg.ac.rs/~mm97045/programiranje Циљ предмета
предмет МЕХАНИКА 1 Студијски програми ИНДУСТРИЈСКО ИНЖЕЊЕРСТВО ДРУМСКИ САОБРАЋАЈ II ПРЕДАВАЊЕ УСЛОВИ РАВНОТЕЖЕ СИСТЕМА СУЧЕЉНИХ СИЛА
Висока техничка школа струковних студија у Нишу предмет МЕХАНИКА 1 Студијски програми ИНДУСТРИЈСКО ИНЖЕЊЕРСТВО ДРУМСКИ САОБРАЋАЈ II ПРЕДАВАЊЕ УСЛОВИ РАВНОТЕЖЕ СИСТЕМА СУЧЕЉНИХ СИЛА Садржај предавања: Систем
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ НА КРАЈУ ОСНОВНОГ ОБРАЗОВАЊА И ВАСПИТАЊА школска 013/014. година ТЕСТ
Положај сваке тачке кружне плоче је одређен са поларним координатама r и ϕ.
VI Савијање кружних плоча Положај сваке тачке кружне плоче је одређен са поларним координатама и ϕ слика 61 Диференцијална једначина савијања кружне плоче је: ( ϕ) 1 1 w 1 w 1 w Z, + + + + ϕ ϕ K Пресечне
Упутство за избор домаћих задатака
Упутство за избор домаћих задатака Студент од изабраних задатака области Математике 2: Комбинаторика, Вероватноћа и статистика бира по 20 задатака. Студент може бирати задатке помоћу програмског пакета
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ И НАУКЕ ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ И НАУКЕ ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ НА КРАЈУ ОСНОВНОГ ОБРАЗОВАЊА И ВАСПИТАЊА школска 011/01. година ТЕСТ МАТЕМАТИКА УПУТСТВО
2. EЛЕМЕНТАРНЕ ДИОФАНТОВЕ ЈЕДНАЧИНЕ
2. EЛЕМЕНТАРНЕ ДИОФАНТОВЕ ЈЕДНАЧИНЕ 2.1. МАТЕМАТИЧКИ РЕБУСИ Најједноставније Диофантове једначине су математички ребуси. Метод разликовања случајева код ових проблема се показује плодоносним, јер је раздвајање
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ У ОСНОВНОМ ОБРАЗОВАЊУ И ВАСПИТАЊУ школска 0/06. година ТЕСТ МАТЕМАТИКА
Аксиоме припадања. Никола Томовић 152/2011
Аксиоме припадања Никола Томовић 152/2011 Павле Васић 104/2011 1 Шта је тачка? Шта је права? Шта је раван? Да бисмо се бавили геометријом (и не само геометријом), морамо увести основне појмове и полазна
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ У ОСНОВНОМ ОБРАЗОВАЊУ И ВАСПИТАЊУ школска 014/01. година ТЕСТ МАТЕМАТИКА
ТРАПЕЗ РЕГИОНАЛНИ ЦЕНТАР ИЗ ПРИРОДНИХ И ТЕХНИЧКИХ НАУКА У ВРАЊУ. Аутор :Петар Спасић, ученик 8. разреда ОШ 8. Октобар, Власотинце
РЕГИОНАЛНИ ЦЕНТАР ИЗ ПРИРОДНИХ И ТЕХНИЧКИХ НАУКА У ВРАЊУ ТРАПЕЗ Аутор :Петар Спасић, ученик 8. разреда ОШ 8. Октобар, Власотинце Ментор :Криста Ђокић, наставник математике Власотинце, 2011. године Трапез
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ТЕСТ МАТЕМАТИКА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ТЕСТ МАТЕМАТИКА УПУТСТВО ЗА ОЦЕЊИВАЊЕ ОБАВЕЗНО ПРОЧИТАТИ ОПШТА УПУТСТВА 1. Сваки
b) Израз за угиб дате плоче, ако се користи само први члан реда усвојеног решења, је:
Пример 1. III Савијање правоугаоних плоча За правоугаону плочу, приказану на слици, одредити: a) израз за угиб, b) вредност угиба и пресечних сила у тачки 1 ако се користи само први члан реда усвојеног
г) страница aa и пречник 2RR описаног круга правилног шестоугла јесте рац. бр. јесу самерљиве
в) дијагонала dd и страница aa квадрата dd = aa aa dd = aa aa = није рац. бр. нису самерљиве г) страница aa и пречник RR описаног круга правилног шестоугла RR = aa aa RR = aa aa = 1 јесте рац. бр. јесу
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ПРОБНИ ЗАВРШНИ ИСПИТ школска 016/017. година ТЕСТ МАТЕМАТИКА УПУТСТВО ЗА ПРЕГЛЕДАЊЕ
КРУГ. У свом делу Мерење круга, Архимед је први у историји математике одрeдио приближну вред ност броја π а тиме и дужину кружнице.
КРУГ У свом делу Мерење круга, Архимед је први у историји математике одрeдио приближну вред ност броја π а тиме и дужину кружнице. Архимед (287-212 г.п.н.е.) 6.1. Централни и периферијски угао круга Круг
Једна од централних идеја рачунарства Метода која решавање проблема своди на решавање проблема мање димензије
Рекурзија Једна од централних идеја рачунарства Метода која решавање проблема своди на решавање проблема мање димензије Рекурзивна функција (неформално) је функција која у својој дефиницији има позив те
3.1. Однос тачке и праве, тачке и равни. Одређеност праве и равни
ТАЧКА. ПРАВА. РАВАН Талес из Милета (624 548. пре н. е.) Еуклид (330 275. пре н. е.) Хилберт Давид (1862 1943) 3.1. Однос тачке и праве, тачке и равни. Одређеност праве и равни Настанак геометрије повезује
6.2. Симетрала дужи. Примена
6.2. Симетрала дужи. Примена Дата је дуж АВ (слика 22). Тачка О је средиште дужи АВ, а права је нормална на праву АВ(p) и садржи тачку О. p Слика 22. Права назива се симетрала дужи. Симетрала дужи је права
ЗАШТИТА ПОДАТАКА Шифровање јавним кључем и хеш функције. Diffie-Hellman размена кључева
ЗАШТИТА ПОДАТАКА Шифровање јавним кључем и хеш функције Diffie-Hellman размена кључева Преглед Биће објашњено: Diffie-Hellman размена кључева 2/13 Diffie-Hellman размена кључева први алгоритам са јавним
ОБЛАСТИ: 1) Тачка 2) Права 3) Криве другог реда
ОБЛАСТИ: ) Тачка ) Права Jov@soft - Март 0. ) Тачка Тачка је дефинисана (одређена) у Декартовом координатном систему са своје две коодринате. Примери: М(5, ) или М(-, 7) или М(,; -5) Jov@soft - Март 0.
1. 2. МЕТОД РАЗЛИКОВАЊА СЛУЧАЈЕВА 1
1. 2. МЕТОД РАЗЛИКОВАЊА СЛУЧАЈЕВА 1 Метод разликовања случајева је један од најексплоатисанијих метода за решавање математичких проблема. У теорији Диофантових једначина он није свемогућ, али је сигурно
Школска 2010/2011 ДОКТОРСКЕ АКАДЕМСКЕ СТУДИЈЕ
Школска 2010/2011 ДОКТОРСКЕ АКАДЕМСКЕ СТУДИЈЕ Прва година ИНФОРМАТИЧКЕ МЕТОДЕ У БИОМЕДИЦИНСКИМ ИСТРАЖИВАЊИМА Г1: ИНФОРМАТИЧКЕ МЕТОДЕ У БИОМЕДИЦИНСКИМ ИСТРАЖИВАЊИМА 10 ЕСПБ бодова. Недељно има 20 часова
Први корак у дефинисању случајне променљиве је. дефинисање и исписивање свих могућих eлементарних догађаја.
СЛУЧАЈНА ПРОМЕНЉИВА Једнодимензионална случајна променљива X је пресликавање у коме се сваки елементарни догађај из простора елементарних догађаја S пресликава у вредност са бројне праве Први корак у дефинисању
Вектори vs. скалари. Векторске величине се описују интензитетом и правцем. Примери: Померај, брзина, убрзање, сила.
Вектори 1 Вектори vs. скалари Векторске величине се описују интензитетом и правцем Примери: Померај, брзина, убрзање, сила. Скаларне величине су комплетно описане само интензитетом Примери: Температура,
ДИПЛОМИРАНИ ИНФОРМАТИЧАР (И0)
ДИПЛОМИРАНИ ИНФОРМАТИЧАР (И0) Назив студијског програма Основне академске студије Дипломирани информатичар Ниво и врста студија Oсновне академске (четворогодишње студије) Стручни назив Дипломирани информатичар
Cook-Levin: SAT је NP-комплетан. Теодор Најдан Трифунов 305M/12
Cook-Levin: SAT је NP-комплетан Теодор Најдан Трифунов 305M/12 1 Основни појмови Недетерминистичка Тјурингова машина (НТМ) је уређена седморка M = (Q, Σ, Γ, δ, q 0,, ) Q коначан скуп стања контролног механизма
Предмет: Задатак 4: Слика 1.0
Лист/листова: 1/1 Задатак 4: Задатак 4.1.1. Слика 1.0 x 1 = x 0 + x x = v x t v x = v cos θ y 1 = y 0 + y y = v y t v y = v sin θ θ 1 = θ 0 + θ θ = ω t θ 1 = θ 0 + ω t x 1 = x 0 + v cos θ t y 1 = y 0 +
Катедра за рачунарску технику и информатику. Програмирање 1
Катедра за рачунарску технику и информатику Синтаксне нотације Програмирање 1 ЕТФ - Београд Катедра за рачунарску технику и информатику 1/37 ЕТФ - Београд Катедра за рачунарску технику и информатику 2/37
РЕШЕЊА ЗАДАТАКА - IV РАЗЕД 1. Мањи број: : x,
РЕШЕЊА ЗАДАТАКА - IV РАЗЕД 1. Мањи број: : x, Већи број: 1 : 4x + 1, (4 бода) Њихов збир: 1 : 5x + 1, Збир умањен за остатак: : 5x = 55, 55 : 5 = 11; 11 4 = ; + 1 = 45; : x = 11. Дакле, први број је 45
Универзитет у Београду, Саобраћајни факултет Предмет: Паркирање. 1. вежба
Универзитет у Београду, Саобраћајни факултет Предмет: Паркирање ОРГАНИЗАЦИЈА ПАРКИРАЛИШТА 1. вежба Место за паркирање (паркинг место) Део простора намењен, технички опремљен и уређен за паркирање једног
Факултет организационих наука Центар за пословно одлучивање. PROMETHEE (Preference Ranking Organization Method for Enrichment Evaluation)
Факултет организационих наука Центар за пословно одлучивање PROMETHEE (Preference Ranking Organization Method for Enrichment Evaluation) Студија случаја D-Sight Консултантске услуге за Изградња брзе пруге
ТЕСТ МАТЕМАТИКА УПУТСТВО ЗА ПРЕГЛЕДАЊЕ
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ТЕСТ МАТЕМАТИКА ПРИЈЕМНИ ИСПИТ ЗА УЧЕНИКЕ СА ПОСЕБНИМ СПОСОБНОСТИМА ЗА ИНФОРМАТИКУ
ЛИНЕАРНА ФУНКЦИЈА. k, k 0), осна и централна симетрија и сл. 2, x 0. У претходном примеру неке функције су линеарне а неке то нису.
ЛИНЕАРНА ФУНКЦИЈА 5.. Функција = a + b Функционалне зависности су веома значајне и са њиховим применама често се сусрећемо. Тако, већ су нам познате директна и обрнута пропорционалност ( = k; = k, k ),
Објектно орјентисано програмирање. Владимир Филиповић Александар Картељ
Објектно орјентисано програмирање Владимир Филиповић Александар Картељ kartelj@matf.bg.ac.rs Типови података у Јави Владимир Филиповић Александар Картељ kartelj@matf.bg.ac.rs Типови података у Јави 3/33
8. ПИТАГОРИНА ЈЕДНАЧИНА х 2 + у 2 = z 2
8. ПИТАГОРИНА ЈЕДНАЧИНА х + у = z Један од најзанимљивијих проблема теорије бројева свакако је проблем Питагориних бројева, тј. питање решења Питагорине Диофантове једначине. Питагориним бројевима или
5.2. Имплицитни облик линеарне функције
математикa за VIII разред основне школе 0 Слика 6 8. Нацртај график функције: ) =- ; ) =,5; 3) = 0. 9. Нацртај график функције и испитај њен знак: ) = - ; ) = 0,5 + ; 3) =-- ; ) = + 0,75; 5) = 0,5 +. 0.
Количина топлоте и топлотна равнотежа
Количина топлоте и топлотна равнотежа Топлота и количина топлоте Топлота је један од видова енергије тела. Енергија коју тело прими или отпушта у топлотним процесима назива се количина топлоте. Количина
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ И НАУКЕ ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ И НАУКЕ ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ НА КРАЈУ ОСНОВНОГ ОБРАЗОВАЊА И ВАСПИТАЊА школска 2011/2012. година ТЕСТ 3 МАТЕМАТИКА УПУТСТВО
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ У ОСНОВНОМ ОБРАЗОВАЊУ И ВАСПИТАЊУ школска 016/017. година ТЕСТ МАТЕМАТИКА
Вежба 4. Графика. Наредба има облик plot(x,y) Аргументи x и y су вектори, који морају имати исти број елемената.
Вежба Графика У МATLAB-у постоји много команди за цртање графика. Изглед графика може се подешавати произвољним избором боје, дебљине и врсте линија, уношењем мреже, наслова, коментара и слично. У овој
6. ЛИНЕАРНА ДИОФАНТОВА ЈЕДНАЧИНА ах + by = c
6. ЛИНЕАРНА ДИОФАНТОВА ЈЕДНАЧИНА ах + by = c Ако су а, b и с цели бројеви и аb 0, онда се линеарна једначина ах + bу = с, при чему су х и у цели бројеви, назива линеарна Диофантова једначина. Очигледно
ВИСОКА ТЕХНИЧКА ШКОЛА СТРУКОВНИХ СТУДИЈА У НИШУ
ВИСОКА ТЕХНИЧКА ШКОЛА СТРУКОВНИХ СТУДИЈА У НИШУ предмет: ОСНОВИ МЕХАНИКЕ студијски програм: ЗАШТИТА ЖИВОТНЕ СРЕДИНЕ И ПРОСТОРНО ПЛАНИРАЊЕ ПРЕДАВАЊЕ БРОЈ 2. Садржај предавања: Систем сучељних сила у равни
8.2 ЛАБОРАТОРИЈСКА ВЕЖБА 2 Задатак вежбе: Израчунавање фактора појачања мотора напонским управљањем у отвореној повратној спрези
Регулциј електромоторних погон 8 ЛАБОРАТОРИЈСКА ВЕЖБА Здтк вежбе: Изрчунвње фктор појчњ мотор нпонским упрвљњем у отвореној повртној спрези Увод Преносн функциј мотор којим се нпонски упрвљ Кд се з нулте
ВОЈИСЛАВ АНДРИЋ МАЛА ЗБИРКА ДИОФАНТОВИХ ЈЕДНАЧИНА
ВОЈИСЛАВ АНДРИЋ МАЛА ЗБИРКА ДИОФАНТОВИХ ЈЕДНАЧИНА ВАЉЕВО, 006 1 1. УВОД 1.1. ПОЈАМ ДИОФАНТОВЕ ЈЕДНАЧИНЕ У једној земљи Далеког истока живео је некад један краљ, који је сваке ноћи узимао нову жену и следећег
У н и в е р з и т е т у Б е о г р а д у Математички факултет. Семинарски рад. Методологија стручног и научног рада. Тема: НП-тешки проблеми паковања
У н и в е р з и т е т у Б е о г р а д у Математички факултет Семинарски рад из предмета Методологија стручног и научног рада Тема: НП-тешки проблеми паковања Професор: др Владимир Филиповић Студент: Владимир
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ И НАУКЕ ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Тест Математика Република Србија МИНИСТАРСТВО ПРОСВЕТЕ И НАУКЕ ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ НА КРАЈУ ОСНОВНОГ ОБРАЗОВАЊА И ВАСПИТАЊА школска 00/0. година ТЕСТ МАТЕМАТИКА
Семинарски рад из линеарне алгебре
Универзитет у Београду Машински факултет Докторске студије Милош Живановић дипл. инж. Семинарски рад из линеарне алгебре Београд, 6 Линеарна алгебра семинарски рад Дата је матрица: Задатак: a) Одредити
Хомогена диференцијална једначина је она која може да се напише у облику: = t( x)
ДИФЕРЕНЦИЈАЛНЕ ЈЕДНАЧИНЕ Штa треба знати пре почетка решавања задатака? Врсте диференцијалних једначина. ДИФЕРЕНЦИЈАЛНА ЈЕДНАЧИНА КОЈА РАЗДВАЈА ПРОМЕНЉИВЕ Код ове методе поступак је следећи: раздвојити
4. Троугао. (II део) 4.1. Појам подударности. Основна правила подударности троуглова
4 Троугао (II део) Хилберт Давид, немачки математичар и логичар Велики углед у свету Хилберту је донело дело Основи геометрије (1899), у коме излаже еуклидску геометрију на аксиоматски начин Хилберт Давид
ТЕСТ МАТЕМАТИКА УПУТСТВО ЗА ПРЕГЛЕДАЊЕ
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ТЕСТ МАТЕМАТИКА ПРИЈЕМНИ ИСПИТ ЗА УЧЕНИКЕ СА ПОСЕБНИМ СПОСОБНОСТИМА ЗА ИНФОРМАТИКУ
6.5 Површина круга и његових делова
7. Тетива је једнака полупречнику круга. Израчунај дужину мањег одговарајућег лука ако је полупречник 2,5 сm. 8. Географска ширина Београда је α = 44 47'57", а полупречник Земље 6 370 km. Израчунај удаљеност
Објектно орјентисано програмирање. Владимир Филиповић Александар Картељ
Објектно орјентисано програмирање Владимир Филиповић Александар Картељ kartelj@matf.bg.ac.rs Елементарне конструкције у Јави Владимир Филиповић Александар Картељ kartelj@matf.bg.ac.rs У елементарне конструкције
ЗАШТИТА ПОДАТАКА. Шифровање јавним кључем и хеш функције. Diffie-Hellman размена кључева
ЗАШТИТА ПОДАТАКА Шифровање јавним кључем и хеш функције Diffie-Hellman размена кључева Преглед Биће објашњено: Diffie-Hellman размена кључева 2 Diffie-Hellman размена кључева први алгоритам са јавним кључем
ИНФОРМАТИКА У ЗДРАВСТВУ
ИНФОРМАТИКА У ЗДРАВСТВУ ОСНОВНЕ СТРУКОВНЕ СТУДИЈЕ СТРУКОВНА МЕДИЦИНСКА СЕСТРА СТРУКОВНИ ФИЗИОТЕРАПЕУТ ДРУГА ГОДИНА СТУДИЈА школска 2017/2018. Предмет: ИНФОРМАТИКА У ЗДРАВСТВУ Предмет се вреднује са 3
I Наставни план - ЗЛАТАР
I Наставни план - ЗЛААР I РАЗРЕД II РАЗРЕД III РАЗРЕД УКУО недељно годишње недељно годишње недељно годишње годишње Σ А1: ОАЕЗНИ ОПШЕОРАЗОНИ ПРЕДМЕИ 2 5 25 5 2 1. Српски језик и књижевност 2 2 4 2 2 1.1
Теорија одлучивања. Анализа ризика
Теорија одлучивања Анализа ризика Циљеви предавања Упознавање са процесом анализе ризика Моделовање ризика Монте-Карло Симулација Предности и недостаци анализе ризика 2 Дефиниција ризика (квалитативни
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ И НАУКЕ ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ И НАУКЕ ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ НА КРАЈУ ОСНОВНОГ ОБРАЗОВАЊА И ВАСПИТАЊА школска 2010/2011. година ТЕСТ 3 МАТЕМАТИКА УПУТСТВО
6.1. Осна симетрија у равни. Симетричност двеју фигура у односу на праву. Осна симетрија фигуре
0 6.. Осна симетрија у равни. Симетричност двеју фигура у односу на праву. Осна симетрија фигуре У обичном говору се често каже да су неки предмети симетрични. Примери таквих објеката, предмета, геометријских
Закони термодинамике
Закони термодинамике Први закон термодинамике Први закон термодинамике каже да додавање енергије систему може бити утрошено на: Вршење рада Повећање унутрашње енергије Први закон термодинамике је заправо
Могућности и планови ЕПС на пољу напонско реактивне подршке. Излагач: Милан Ђорђевић, мастер.ел.тех.и рачунар. ЈП ЕПС Производња енергије
Могућности и планови ЕПС на пољу напонско реактивне подршке Излагач: Милан Ђорђевић, мастер.ел.тех.и рачунар. ЈП ЕПС Производња енергије 1 Обавезе ЈП ЕПС као КПС... ЗАКОН О ЕНЕРГЕТИЦИ ЧЛАН 94. Енергетски
8.5 ЛАБОРАТОРИЈСКА ВЕЖБА 5 Задатак вежбе: PI регулација брзине напонски управљаним микромотором једносмерне струје
Регулација електромоторних погона 8.5 ЛАБОРАТОРИЈСКА ВЕЖБА 5 Задатак вежбе: регулација брзине напонски управљаним микромотором једносмерне струје Увод Simulik модел На основу упрошћеног блок дијаграма
4.4. Паралелне праве, сечица. Углови које оне одређују. Углови са паралелним крацима
50. Нацртај било које унакрсне углове. Преношењем утврди однос унакрсних углова. Какво тврђење из тога следи? 51. Нацртај угао чија је мера 60, а затим нацртај њему унакрсни угао. Колика је мера тог угла?
Aлати и основне функције
Bежба 1 Aлати и основне функције 1.1. КАКО ПОЧЕТИ РАД У MATLAB У MATLAB се дистрибуира у компримованом формату на CD-овима. Инсталацијом, датотеке са ових CD-ова премештају се на диск, декомпримују се
Универзитет у Крагујевцу Факултет за машинство и грађевинарство у Краљеву Катедра за основне машинске конструкције и технологије материјала
Теоријски део: Вежба број ТЕРМИЈСКА AНАЛИЗА. Термијска анализа је поступак који је 903.год. увео G. Tamman за добијање криве хлађења(загревања). Овај поступак заснива се на принципу промене топлотног садржаја
Теорија електричних кола
Др Милка Потребић, ванредни професор, Теорија електричних кола, вежбе, Универзитет у Београду Електротехнички факултет, 7. Теорија електричних кола Милка Потребић Др Милка Потребић, ванредни професор,
Писмени испит из Метода коначних елемената
Београд,.0.07.. За приказани билинеарни коначни елемент (Q8) одредити вектор чворног оптерећења услед задатог линијског оптерећења p. Користити природни координатни систем (ξ,η).. На слици је приказан
4. ЗАКОН ВЕЛИКИХ БРОЈЕВА
4. Закон великих бројева 4. ЗАКОН ВЕЛИКИХ БРОЈЕВА Аксиоматска дефиниција вероватноће не одређује начин на који ће вероватноће случајних догађаја бити одређене у неком реалном експерименту. Зато треба наћи
I Линеарне једначине. II Линеарне неједначине. III Квадратна једначина и неједначина АЛГЕБАРСКЕ ЈЕДНАЧИНЕ И НЕЈЕДНАЧИНЕ
Штa треба знати пре почетка решавања задатака? АЛГЕБАРСКЕ ЈЕДНАЧИНЕ И НЕЈЕДНАЧИНЕ I Линеарне једначине Линеарне једначине се решавају по следећем шаблону: Ослободимо се разломка Ослободимо се заграде Познате
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА
Република Србија МИНИСТАРСТВО ПРОСВЕТЕ, НАУКЕ И ТЕХНОЛОШКОГ РАЗВОЈА ЗАВОД ЗА ВРЕДНОВАЊЕ КВАЛИТЕТА ОБРАЗОВАЊА И ВАСПИТАЊА ЗАВРШНИ ИСПИТ У ОСНОВНОМ ОБРАЗОВАЊУ И ВАСПИТАЊУ школска 017/018. година ТЕСТ МАТЕМАТИКА
Математички модел осциловања система кугли око равнотежног положаја под утицајем гравитационог поља
Универзитет у Машински факултет Београду Математички модел осциловања система кугли око равнотежног положаја под утицајем гравитационог поља -семинарски рад- ментор: Александар Томић Милош Живановић 65/
TAЧКАСТА НАЕЛЕКТРИСАЊА
TЧКАСТА НАЕЛЕКТРИСАЊА Два тачкаста наелектрисања оптерећена количинама електрицитета и налазе се у вакууму као што је приказано на слици Одредити: а) Вектор јачине електростатичког поља у тачки А; б) Електрични
Штампарске грешке у петом издању уџбеника Основи електротехнике, 1. део, Електростатика
Штампарске грешке у петом издању уџбеника Основи електротехнике део Страна пасус први ред треба да гласи У четвртом делу колима променљивих струја Штампарске грешке у четвртом издању уџбеника Основи електротехнике
7.3. Површина правилне пирамиде. Површина правилне четворостране пирамиде
математик за VIII разред основне школе 4. Прво наћи дужину апотеме. Како је = 17 cm то је тражена површина P = 18+ 4^cm = ^4+ cm. 14. Основа четворостране пирамиде је ромб чије су дијагонале d 1 = 16 cm,
ПОВРШИНа ЧЕТВОРОУГЛОВА И ТРОУГЛОВА
ПОВРШИНа ЧЕТВОРОУГЛОВА И ТРОУГЛОВА 1. Допуни шта недостаје: а) 5m = dm = cm = mm; б) 6dm = m = cm = mm; в) 7cm = m = dm = mm. ПОЈАМ ПОВРШИНЕ. Допуни шта недостаје: а) 10m = dm = cm = mm ; б) 500dm = a
2.1. Права, дуж, полуправа, раван, полураван
2.1. Права, дуж, полуправа, раван, полураван Човек је за своје потребе градио куће, школе, путеве и др. Слика 1. Слика 2. Основа тих зграда је често правоугаоник или сложенија фигура (слика 3). Слика 3.
ЗАВРШНИ РАД КЛИНИЧКА МЕДИЦИНА 5. школска 2016/2017. ШЕСТА ГОДИНА СТУДИЈА
ЗАВРШНИ РАД КЛИНИЧКА МЕДИЦИНА 5 ШЕСТА ГОДИНА СТУДИЈА школска 2016/2017. Предмет: ЗАВРШНИ РАД Предмет се вреднује са 6 ЕСПБ. НАСТАВНИЦИ И САРАДНИЦИ: РБ Име и презиме Email адреса звање 1. Јасмина Кнежевић
МАСТЕР РАД УНИВЕРЗИТЕТ У БЕОГРАДУ МАТЕМАТИЧКИ ФАКУЛТЕТ. Тема: ГОРЊА И ДОЊА ГРАНИЧНА ВРЕДНОСТ НИЗА И НИЗА СКУПОВА И ЊИХОВЕ ПРИМЕНЕ У РЕЛНОЈ АНАЛИЗИ
УНИВЕРЗИТЕТ У БЕОГРАДУ МАТЕМАТИЧКИ ФАКУЛТЕТ МАСТЕР РАД Тема: ГОРЊА И ДОЊА ГРАНИЧНА ВРЕДНОСТ НИЗА И НИЗА СКУПОВА И ЊИХОВЕ ПРИМЕНЕ У РЕЛНОЈ АНАЛИЗИ МЕНТОР: КАНДИДАТ: Проф. др Драгољуб Кечкић Милинко Миловић
1. Стандард бинарног кодовања ненумеричких података је: а) BCD код б) ASCII код в) PCI код г) Не знам
. Стандард бинарног кодовања ненумеричких података је: а) BCD код б) ASCII код в) PCI код. Од наведених цифара, бинарном бројном систему не припада цифра: а) б) в) 0 3. Од наведених знакова, не представља
Ротационо симетрична деформација средње површи ротационе љуске
Ротационо симетрична деформација средње површи ротационе љуске слика. У свакој тачки посматране средње површи, у општем случају, постоје два компонентална померања: v - померање у правцу тангенте на меридијалну
ВЕЖБЕ ИЗ ОСНОВА РАЧУНАРСКЕ ТЕХНИКЕ 1
ВЕЖБЕ ИЗ ОСНОВА РАЧУНАРСКЕ ТЕХНИКЕ ВЕРЗИЈА. Електротехнички факултет Универзитета у Београду Основи рачунарске технике АНАЛИЗА И СИНТЕЗА КОМБИНАЦИОНИХ ПРЕКИДАЧКИХ МРЕЖА Анализа комбинационих мрежа је поступак
АНАЛОГНА ЕЛЕКТРОНИКА ЛАБОРАТОРИЈСКЕ ВЕЖБЕ
ЕЛЕКТРОТЕХНИЧКИ ФАКУЛТЕТ У БЕОГРАДУ КАТЕДРА ЗА ЕЛЕКТРОНИКУ АНАЛОГНА ЕЛЕКТРОНИКА ЛАБОРАТОРИЈСКЕ ВЕЖБЕ ВЕЖБА БРОЈ 2 ПОЈАЧАВАЧ СНАГЕ У КЛАСИ Б 1. 2. ИМЕ И ПРЕЗИМЕ БР. ИНДЕКСА ГРУПА ОЦЕНА ДАТУМ ВРЕМЕ ДЕЖУРНИ
Математика и језик, II
ISSN (p) 2303-4890, ISSN (o) 1986 518X ISTRAŽIVANJE MATEMATIČKOG OBRAZOVANJA http://www.imvibl.org/dmbl/meso/imo/imo2.htm Vol. VII (2015), Broj 13, 13 19 Stručni rad Математика и језик, II Данијела Митровић
Писмени испит из Теорије површинских носача. 1. За континуалну плочу приказану на слици одредити угиб и моменте савијања у означеним тачкама.
Београд, 24. јануар 2012. 1. За континуалну плочу приказану на слици одредити угиб и моменте савијања у означеним тачкама. dpl = 0.2 m P= 30 kn/m Линијско оптерећење се мења по синусном закону: 2. За плочу
Математика Тест 3 Кључ за оцењивање
Математика Тест 3 Кључ за оцењивање ОПШТЕ УПУТСТВО ЗА ОЦЕЊИВАЊЕ Кључ за оцењивање дефинише начин на који се оцењује сваки поједини задатак. У општим упутствима за оцењивање дефинисане су оне ситуације
МАТРИЧНА АНАЛИЗА КОНСТРУКЦИЈА
Београд, 21.06.2014. За штап приказан на слици одредити најмању вредност критичног оптерећења P cr користећи приближан поступак линеаризоване теорије другог реда и: а) и један елемент, слика 1, б) два
Погодност за одржавање, Расположивост, Марковљеви ланци
Погност за ржавање, Расположивост, Марковљеви ланци Погност за ржавање Одржавање обухвата све радње (осим рутинског сервисирања у току рада као што је замена горива или сличне мање активности) чији је
Терминирање флексибилних технолошких процеса
ИНТЕЛИГЕНТНИ ТЕХНОЛОШКИ СИСТЕМИ АТ-8 Терминирање производно-технолошких ентитета Терминирање флексибилних технолошких процеса Терминирање (енгл. scheduling) представља процес планирања машинске обраде,