Professional Documents
Culture Documents
ДЕЛФИ
П Р В И К О Р А Ц И
(програмирање од А до Ш)
Београд, 2014.
Програмирање није само написати програм који решава одређени проблем.
Програмирање је више од тога, много више.
Програмирање је уметност.
Сваки, па био то и најједноставнији задатак може се решити тако да буде на ваш начин занимљив,
необичан, привлачан, заводљиво оригиналан, ...
Ако желите да се бавите програмирањем радите то из љубави, нека сваки програмски ред буде стих
у поеми вашег живота, мисао која плени духом.
Ако и не будете програмери у свом будућем животу, чак и тада посао који обављате нека буде
прављење најлепшег букета који ћете поклањати свету.
Скуповни тип . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Класа и методе класе – основни појмови . . . . . . . . . . . . . . . . . . . . . . . . . 57
Питања на која треба обратити пажњу . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Наредбе и изрази . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Синтакса и семантика израза. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Аритметички и логички изрази . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Наредбе програмског језика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Конверзија типова података. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Уношење и приказивање података. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Алгоритам размене вредности две променљиве. . . . . . . . . . . . . . . . . . . . . . . . 61
Програмирање израчунавања по једноставним математичким формулама.. . . . 61
Питања на која треба обратити пажњу . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Уводни задаци . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Задаци за самосталан рад . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Наредбе гранања . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Синтакса наредбе If . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Синтакса наредбе Case. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Алгоритми са гранањем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Питања на која треба обратити пажњу . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Задаци са гранањем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Неке занимљиве компоненте . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Задаци за самосталан рад. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Наредбе за организацију циклуса . . . . . . . . . . . . . . . . . . . . . . . 151
Синтакса наредби за организацију циклуса. . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Примена наредби break и continue у циклусима . . . . . . . . . . . . . . . . . . . . . . . 153
Неки алгоритми са циклусима . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Питања на која треба обратити пажњу . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Задаци са циклусима. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Задаци за самосталан рад. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Опис методе класе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Примери једноставнијих функција . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Примери једноставнијих процедура . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Примери рекурзивних функција и процедура. . . . . . . . . . . . . . . . . . . . . . . . . . 207
Питања на која треба обратити пажњу . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Задаци са функцијама и процедурама . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Задаци за самостални рад . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Тип низ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Једнодимензионални низови. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Основне операције са низовима . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Дводимензионални низови. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Алгоритми за израчунавања и трансформације на табели и њеним деловима. . 241
Визуелна компонента за табеларни приказ текста. . . . . . . . . . . . . . . . . . . . 242
Задаци са низовима . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Задаци за самосталан рад. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Тип слог и датотеке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Тип слог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Датотеке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Формирање датотеке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Упис података, читање и претраживање датотеке . . . . . . . . . . . . . . . . . . . 273
Уређивање података датотеке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Брисање података или датотеке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Задаци са слоговима и датотекама . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Задаци за самосталан рад. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
5 Рачунарство и информатика за трећи разред гимназије 5
Рачунари се, у данашње време, могу применити у готово свим областима људског
деловања и од њих се очекује да решавају све проблеме на које се може наићи. Међутим,
потребно је знати да рачунар сам не може решити ни један (и најједноставнији) проблем. Он
само извршава низ инструкција које му корисник задаје. Према томе, само ако корисник
разуме проблем и познаје пут за решавање тог проблема до најситнијих детаља, он ће бити у
стању да тај пут представи преко низа инструкција које рачунар може да разуме и прихвати.
Тек тада можемо очекивати од рачунара да тај низ инструкција веома брзо и тачно изврши и
да дође до резултата који су потребни. То значи да рачунар не олакшава кориснику рад на
решавању проблема, већ само извршава задати програм и у веома кратком времену даје
одговарајуће резултате.
Када се процес решавања неког проблема спроводи без рачунара, о сваком кораку се
мисли непосредно у тренутку када тај корак треба да се спроведе, тј. када покушавамо да
решимо неки проблем ми не знамо унапред шта ћемо све радити док не дођемо до решења, већ
одлучујемо само о првом следећем кораку. Међутим, када се за решавање проблема користи
рачунар, тада цео низ корака које тај процес обухвата мора бити прецизно одређен и унапред
задат са свим могућностима које могу да се појаве у току извршавања у зависности од задатих
почетних вредности. Тај низ корака мора бити прецизно дефинисан у облику веза и логичких
услова. То значи да се, пре него што се приступи коришћењу рачунара за решавање неког
проблема, мора написати програм. Са написаним програмом и улазним подацима, који
одређују вредности низа параметара који се јављају у програму, рачунар може да добије
резултате задатка који се решава.
Основи алгоритмизације
језика, тиме пружајући структурне описе различитих израза који чине исправне ниске језика.
Синтакса се бави само формом и структуром симбола језика без било каквих разматрања у
вези са њиховим значењем. За разлику од природних језика, сваки програмски језик има скуп
строго дефинисаних правила којима се описује поступак писања програма. Пошто се ради о
језику за комуникацију са рачунаром и најмања двосмисленост доводи до грешака. Синтакса
програмског језика се описује помоћу метајезика. Синтаксне дефиниције се често задају
помоћу специјалне металингвистичке симболике која је позната под именом Проширени
Бекус-Науров запис (Extended Backus- Naur Form) или скраћено EBNF. EBNF омогућава врло
прецизан и компактан опис елементарних језика, коришћењем неколико симбола специјалне
намене – метасимбола. Најпростији појмови су симболи и резервисане речи језика. Они се
називају терминални симболи или терминали и пишу се између наводника. Сви остали
појмови, нетерминали, се постепено изводе из терминалних помоћу специјалних
металингвистичких формула и стављају се између угластих заграда. За опис синтаксе језика,
због веће прегледности, користе се и синтаксни дијаграми. Они се састоје из кружића, овалних
симбола и правоугаоника повезаних у одређеном поретку. Кружићи или овали означавају
терминале. Правоугаоници означавају конструкције које се накнадно дефинишу
(нетерминале), тј. које се ослањају на друге синтаксне дијаграме. Између EBNF и синтаксних
дијаграма постоји веза која омогућава представљање појмова који су записани у EBNF преко
синтаксних дијаграма и обрнуто.
Семантика придружује значење синтаксно исправним нискама језика. За природне
језике, ово значи повезивање реченица са неким специфичним објектима, мислима и
осећањима. За програмске језике, семантика описује понашање рачунара током извршавања
програма написаног на неком језику. Ово понашање може се описати релацијама између улаза
и излаза програма или корак-по-корак објашњењем како ће се програм извршавати на
стварној или апстрактној машини.
програмског језика алгол 60 начини језик који би био задовољавајући у сваком погледу. На
самом почетку заједничког рада радна група се распала на два табора, јер је дошло до
неслагања у погледу сложености новог програмског језика. Из редова бројнијег табора
изникла је нова верзија програмског језика алгол позната под именом алгол 68 (1968. године
је објављена прва верзија овог језика). Остатак групе је, нешто касније, 1969/70. године
представио потпуно нов програмски језик који је назван паскал по презимену француског
математичара, физичара и филозофа Паскала (Blaise Pascal, 1623-1662.) који је један од првих
конструктора механичких машина за сабирање. Конструктор програмског језика паскал је
професор Високе техничке школе у Цириху (Swiss Federal Institute of Technology) Никлаус
Вирт (Niclaus Wirth), поборник структурираног програмирања.
Структурирано програмирање је скуп техника за израду програма са јасном и лако
разумљивом структуром, уз коришћење података са јасно дефинисаним структурама. Овај
процес карактерише модуларност и техника писања програма одозго на доле.
- Модуларност значи да се у оквиру програма разликују одговарајуће целине, које се
даље могу разлагати на мање и тако даље све до елементарних целина. Свака целина се може
представити у облику потпрограма. На овај начин се један велики, компликовани програм
може разделити на неколико релативно независних целина - модула. Сваки од модула је
релативно лако анализирати и открити евентуалне грешке. На овај начин се избегавају
бескрајна проверавања програма за различите полазне податке.
- Програмирање одозго на доле подразумева писање програма од општег ка појединачном.
Проблем се рашчлани на потпроблеме и сваки од њих се решава као независни проблем. За
сваки се пише одговарајући потпрограм који се, затим, повезују у структурни програм.
Програмски језик паскал подржава ове принципе свим својим основним управљачким
структурама (селекције и циклуси) и структурираним типовима података (низови, записи,
скупови, датотеке). За њега постоји и међународни (ISO) стандард. Са појавом паскала
остварила се идеја структурираног програмирања, али и формалног доказивања коректности
програма. По својој универзалности, једноставности и разумљивости паскал је далеко испред
свих до тада познатих програмских језика. Паскал краси и изражајност, преносивост и
језгровитост. Популарност коју је стекао не опада ни до данашњих дана. Готово да нема
области делатности где се паскал не може применити и где се не примењује.
Стандардна верзија паскала је званично објављена 1979. године. То је језик са једноставном
и логичном структуром и због тога се доста лако учи. Врло је погодан за почетнике, за
савлађивање основних принципа програмирања, као и за усвајање организованог и разумљивог
начина размишљања и изражавања. Стандардни паскал има и неколико озбиљних мана које га
чине неподесним за писање великих програмских система. Пре свега, захтева се да целокупан
текст изворног програма, укључујући и све потпрограме, буде у једној датотеци. Основна идеја
је да се преводиоцу омогући да проверава исправност позивања потпрограма. Једна од
најнепријатнијих врста грешака у програмима, које се и врло тешко проналазе у сложеним
програмским системима, управо је неслагање типова стварних аргумената потпрограма на
местима позивања са типовима формалних аргумената у дефиницији потпрограма. Поред
тога, ова мера требала је и да онемогући паметним програмерима да свесно наведу стварне
аргументе другачијих типова од очекиваних, постижући тиме неке специјалне, нестандардне
(и сумњиве) ефекте. Такви програми се косе са једним од основних принципа структурираног
програмирања - тешко их је разумети. Друга мана су врло ограничене могућности рада са
датотекама. Стандардни паскал предвиђа само секвенцијалне, датотеке са секвенцијалним
приступом. Релативне датотеке са директним приступом не постоје, а још мање индексне
датотеке које би омогућавале приступ помоћу кључа. Да ситуација буде још гора, имена
датотека које програм треба да обрађује, не могу да се бирају у току извршавања програма,
нити су уграђена у сам програм. Датотеке се у програмима представљају симболичким именима
и препуштено је оперативном систему рачунара на који ће начин та имена повезати са физичким
датотекама. На избор датотека корисник, евентуално, може да утиче командама оперативног
система пре почетка извршавања програма. Трећа мана је нефлексибилност потпрограма при
раду са низовима као аргументима. Бројеви елемената низова приликом сваког позивања морају
да буду исти као бројеви елемената предвиђених у дефиницији потпрограма. Чему правити
засебан потпрограм за сортирање низова од по 100 елемената као и засебан за оне од по 500
елемената? Стандардни паскал, такође, нема ни могућност графичког приказивања резултата.
Поред стандардне верзије паскала у то време се користе и турбо верзије. Програмски
језик Turbo Pascal производ софтверске куће Borland појавио се на персоналним рачунарима
под оперативним системом DOS (Disk Operating System) са извесним бројем нестандардних
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
13 Рачунарство и информатика за трећи разред гимназије 13
Аугуста Ада Бајрон, грофица од Лавлејса (Augusta Ada (Byron) King, Countess of
Lovelace) је кћи Ана Изабеле Милбанке (Anna Isabella Milbanke) и Џорџа Гордона Ноел
Бајрона (George Gordon Noel Byron), рођена je 10. децембра 1815. године у Лондону, Енглеска.
Ада своја прва знања из области математике добија од Августа Де Моргана (Augustus
DeMorgan, 1806-1871.). Адина мајка је хтела да пробуди интерес за математиком и охрабри
рационалне аспекте њеног карактера насупрот романтичним утицајима њеног оца. Када је
имала 18 година, Ада је слушала предавање о диференцијалној машини коју је дизајнирао
Чарлс Бебиџ (Charles Babbage, 1791-1871.). Почевши писмом од 18. јануара 1836., па све до
своје смрти, Ада је водила дуготрајну кореспондецију са Бебиџом. У октобру 1842, Луиђи
Федерико Менабреа (Luigi Federico Menabrea, 1809-1896.), италијански професор на
Универзитету машинства у Торину објавио је рад којим описује функцију и теорију Бебиџове
аналитичке машине. Ада је превела овај рад са француског на енглески и додала сопствене опсежне коментаре.
Превод је објављен 1843. године. И сам Бебиџ био је импресиониран неким компликованим програмима које је Ада
написала, најсложенији од њих био је одређивање низа Бернулијевих бројева. Тако је Ада стекла репутацију првог
компјутерског програмера (иако су и Бебиџ и неки други, такође, написали бројне програме за никад завршену
аналитичку машину). Оптерећена коцкарским дуговима и раком материце, Ада је умрла у 37. година, 27. новембра
1852. године, а сахрањена је, на лични захтев, поред свога оца у породичној гробници у цркви Свете Марије
Магдалене у Хакналу (Church of St. Mary Magdalene in Hucknall, Nottingham).
Никлаус Емил Вирт (Niklaus Emil Wirth), рођен 15. фебруара 1934. године у
Винтертуру (Winterthur) у Швајцарској је швајцарски информатичар. Звање инжењера
електронике је стекао на Швајцарском универзитету технологије у Цириху 1959. а
докторирао је на Калифорнијском универзитету Беркли 1963. Сматра се изузетним
стручњаком из области рачунарства, а најпознатији је као творац програмског језика
Паскал. Осим паскала пројектовао је и програмске језике Euler, Algol W, Pascal, Modula,
Modula-2, Oberon, Oberon-2, Oberon-07. За свој рад је 1984. године добио Тјурингову награду.
Предавао је на универзитету Станфорд на катедри за рачунарске науке (1963 - 1967.) као и
на Швајцарском технолошком универзитету. 1975. године је написао књигу „Алгоритми +
структуре података = програми“ (Algorithms + Data Structures = Programs). Од априла
1999. jе у пензији.
"Шта је човек у васиони, између две бесконачности: бескрајно великог и бескрајно малог? Ништавило у
погледу на бескрајност; све у погледу на ништавило; средина између ничега и свег." - Блез Паскал.
Блез Паскал (Blaise Pascal, 1623 - 1662.) је био француски математичар, физичар и
филозоф. Још од малена показивао је интересовање за науку, па је већ са 18 година
конструисао прву математичку машину, механички сабирач како би помогао свом оцу у
пословању. 1650. године напушта свет науке и окреће се религији, односно како је он написао
„разматрању величине и мистерије човека“. Блез Паскал рођен је 19. јуна у Клермон Ферану
(Clermont-Ferrand), у Француској. као треће дете Етјена Паскала (Etienne Pascal) и
Антоанете Бегон (Antoinette Begon). Мајка му је умрла када је имао само три године,
остављајући га са две сестре – Гилберт и Жаклин. Године 1631. породица Паскал напушта
Клермон и сели се у Париз. Децембра 1639. године, Паскалова породица је напустила Париз да
би живела у Руану где је Етјен био примљен као скупљач пореза за горњу Нормандију. Брзо по
смештању у Руану, Блез је написао свој први рад назван Есеј о конусним пресецима, издат
фебруара 1640. године. Исте године Паскал је изумео и први дигитални калкулатор са намером да помогне своме
оцу у прикупљању пореза и такси. Догађаји 1646. године су били врло значајни за младог Паскала. Те године је његов
отац повредио ногу и морао је да се опоравља код куће. О њему су се бринула његова млађа браћа, који су били у
религиозном покрету из Руана. Они су имали дубок утицај на Блеза и он је постао јако религиозан. Етјен Паскал је
умро у септембру 1651. године. После очеве смрти, Блез је писао једној од својих сестара, давајући, при томе смрти
једно дубоко хришћанско значење; и за њега је очева смрт била нешто посебно. Тада је оформио своје идеје које су
послужиле као основа за његова писма, обједињена у филозофски рад под називом Мисли (Пенсеес). После овога,
Паскал је посетио јансенски манастир Порт Ројал де Шамп, који се налазио око 30 км југозападно од Париза. Почео
је да издаје анонимна дела на тему религије. 18 провинцијалних писама је било издато у периоду између 1656. године
до почетка 1657. године. Све је то било писано као знак одбране од његовог пријатеља Антоана и великог
противника Језуита и браниоца јансенизма, који је иначе пре својих студија теологије у Паризу, био осуђиван због
свог контраверзног религиозног рада. Паскалов најпознатији рад из филозофије је Мисли, а на издању о својим
личним мислима везаним за људску патњу, судбину и Бога, којем је приступио касне 1656. године, наставио је да
ради током 1657. и 1658. године. Овај рад садржи и Паскалову опкладу као доказ да је веровање у Бога разумно само
са пратећим аргументима. Ако Бог не постоји, онај ко не верује у њега неће изгубити ништа, а ако, пак, Бог постоји,
тај исти човек ће изгубити све зато што није веровао у њега. Паскал је у својој опклади користио математичке
аргументе и аргументе из вероватноће, али његова главна реченица је: …ми смо сви присиљени да се коцкамо.
Под одвлачењем мишем подразумева се померање прозора по екрану или промена величине
прозора. Изводи се тако што се показивач миша доведе изнад натписа прозора, притисне се
леви тастер миша, помера се показивач миша уз притиснути леви тастер на неко друго место и
отпусти се тастер миша. Ако се на тај начин мишем ухвати ивица или угао прозора, померањем
показивача помериће се ивица или угао са суседним ивицама, чиме се мења величина прозора.
У зависности од апликације, на овај начин понекад могу да се померају и компоненте унутар
прозора, да им се промени величина или да се постигну неки други ефекти.
Осим мишем, радом апликације може да се управља и преко тастатуре. Основна употреба
тастатуре је уношење текста у оквире за текст. Место у тексту на коме може нешто да се
промени обележава се показивачем текста, text cursor. То је, обично, вертикална трептећа
линија која се увек налази између два знака у тексту. Треба јасно разликовати показивач миша
од показивача текста. Показивач миша може да се помера помоћу миша по целом екрану, док
се показивач текста помера тастерима са стрелицама на тастатури само унутар текста.
Притиском мишем на оквир за текст у некој тачки, показивач текста може да се премести на
тренутни положај показивача миша. Под неким условима, и преко тастатуре могу да се
производе ефекти притиска мишем. За то могу да се користе одређени тастери са словима у
комбинацији са тастером Alt или Ctrl, као и тастери Enter и Esc. За компоненту која на овај
начин може да се активира каже се да јој је придружен знак пречица (ShortCut) - accelerator
character. Знакови пречице приказују се подвучено у натписима компоненти којима су
придружени у менијима, а често се дешава и да је на крају описа у менију исписана и
комбинација тастера које треба откуцати, нарочито ако је пречица другачија од уобичајених
или ако не постоји други начин да се учини видљивом кориснику апликације.
• Ознака - label. Приказује текст, натпис ознаке - Caption који може да буде нека порука
кориснику или опис намене друге компоненте. Корисник апликације не може да делује
на ознаке помоћу миша.
• Дугме - button. Корисник може мишем да га притисне и тиме да сигнал за неку акцију.
Натпис на дугмету означава његову намену. Уношење података у прозоре за дијалог
обично се завршава притиском на једно од дугмади.
• Оквир за текст - edit box. Корисник у овај оквир уноси произвољан текст преко тастатуре.
Постоје оквири који могу да садрже само један ред текста и оквири који могу да садрже
више редова текста.
• Оквир за потврду - check box. Мали квадрат поред натписа овог оквира може да садржи
знак за потврду () или да буде празан. Присуство знака за потврду означава да особина
у натпису важи, а одсуство да не важи. Левим кликом миша мења се стање из
непотврђеног у потврђено, и обрнуто.
• Радио-дугме - radio button. Мали круг поред натписа ове компоненте може да садржи
црну тачку () или да буде празан (). Користи се у групама с тим да само једно дугме у
групи може да има попуњен кружић. Те групе се користе за избор једне од неколико,
медусобно искључивих, могућности.
Неке од компоненти у прозору или неке ставке менија могу да буду привремено
недоступне. Такве компоненте обично се приказују бледо - dimmed.
Сваког тренутка само је један од тренутно видљивих прозора на екрану активан. За такав
прозор се каже да је у жижи (focus). Од осталих прозора се разликује видљиво по другачијој
боји траке са натписом прозора и текста у њој. Корисник може да активира прозоре по
произвољном редоследу, осим ако је тренутно активан прозор условљени прозор, простим
притиском мишем на било коју тачку која припада жељеном прозору. У тренутно активном
прозору сваког тренутка је само једна компонента активна. За ту компоненту се каже да је у
жижи. Компонента која је у жижи, обично се видљиво разликује од других компоненти исте
врсте. Три карактеристична начина разликовања су:
• натпис компоненте уоквирен правоугаоником од танке испрекидане линије, за компоненте
које имају натписе;
• трептећи показивач текста унутар оквира за текст или
• уоквирена једна од ставки унутар оквира са листама.
Притиском на неку компоненту мишем или одабирањем помоћу знака пречице, жижа се
помери на ту компоненту. Поред тога, жижа може да се помери са једне компоненте на другу
према одређеном редоследу, притискањем тастера Tab () на тастатури, односно, комбинације
тастера Shift + Tab по обрнутом редоследу. Редослед померања жиже са компоненте на компоненту
на овај начин зависи од апликације и корисник не може да утиче на његову промену. У добро
пројектованој апликацији редослед померања жиже са компоненте на компоненту следи логичан
ток уношења података, примерен датој ситуацији. Такође, у добрим апликацијама компоненте
су тако распоређене да логичан редослед њиховог обиласка на екрану буде слева удесно и одозго
надоле (ово није обавезно, али кориснику у великој мери олакшава коришћење апликације).
Све апликације засноване на прозорима могу да се поделе у две групе:
• Апликације за рад са једним документом (Single Document Interface Applications - СДИ
апликације). Могу истовремено да обрађују само један документ (текст, слику итд.). У
главном прозору се обрађује један документ (текст, слика или други скуп података), а
евентуални остали прозори у апликацији служе само као подршка за остваривање те обраде.
Сви су прозори обични, у смислу да међу њима нема прозора родитеља нити прозора деце.
• Апликације за рад са више докумената (Multiple Document Interface Applications - МДИ
апликације). Могу одједном да обрађују више докумената. Главни прозор је прозор
родитељ који садржи барем један прозор дете. Сваки прозор дете садржи по један
документ који се обрађује у апликацији. Апликација може да има и известан број обичних
прозора који служе као подршка за обраду докумената. Појединим радњама у апликацији
делује се на документ у прозору детету који је тог тренутка активан.
Делфи је апликација заснована на прозорима, а са друге стране, делфи служи за израду
апликација заснованим на прозорима. Препорука пројектантима је да се труде да своје
апликације што више уклопе у опште прихваћену шему јер тиме повећавају изгледе да њихов
производ лакше прихвате будући корисници. Делфи у потпуности подржава и потпомаже
пројектовање стандардних и атрактивних апликација за оперативни систем Windows.
• Button (тастер, дугме) - може се поставити било где на форми, користи се за потврду
почетка неке акције.
• Memo (мемо поље, оквир за вишередни текст) - користи се за приказ и унос вишередног
текста.
садржи више независних целина, тј. јунита, десни део овог прозора ће имати посебне листиће
за сваки од њих, а прелазак из једног у други листић је стандардни клик левим тастером миша
над његовим именом. Прелазак из прозора јунита у прозор форме и обрнуто омогућава тастер
F12. Уколико имамо више прозора са јунитима прелазак из једног у други омогућава
комбинација Ctrl+F12, а ако имамо више прозора са формама прелазак из једног у други
омогућава Shift+F12. Наравно, ако су ови прозори видљиви или бар неки њихов део, из једног у
други можемо прећи и једноставним кликом миша на неки од њих. Јунит нема карактеристике
јер је невидљив када се програм покрене, а назив јунита се даје приликом чувања пројекта.
Лево од ова два прозора (мада се распоред прозора може по жељи мењати, али говоримо
о стандардном, изворном распореду прозора - пре било какве акције корисника) су још два
стандардно отворена прозора:
• Object Tree View и
• Object Inspector.
За разлику од претходних прозора, ови се не могу ни минимизирати нити максимизирати
помоћу стандардних тастера. Можемо их увећавати или смањивати повлачењем ивица уз
помоћ миша или затворити левим кликом на X. Но, то не представља њихов недостатак с
обзиром да су то помоћни прозори са дефинисаним садржајем који програмер не може мењати.
У случају да су намерно или грешком затворени притиском тастера X или другачије отварају се
притиском тастера F11 (Object Inspector) и Shift+Alt+F11 (Object TreeView) или одговарајућим
командама из Edit менија.
Object TreeView је помоћни прозор у коме се виде називи свих
употребљених компоненти програма, њихова повезаност са главном
формом и, евентуална, припадност неким другим компонентама које се
налазе на главној форми програма. Нарочито је значајан када се пишу
компликованији програми са више панела или форми, програми у којима
се поједине компоненте, односно, објекти који су постављени на форму
преклапају тако да неки чак и нису видљиви (јер су прекривени другим
компонентама), па их је зато немогуће селектовати ради постављања
или измене њихових карактеристика. Да бисмо селектовали један такав
скривени објекат довољно је да једноставно кликнемо на његово име у
Object TreeView прозору и онда можемо, иако га не видимо, да мењамо
његове карактеристике (наравно, морамо тачно знати који се ефекат
постиже изменом неке карактеристике, нарочито ако се она односи на
спољашњи изглед објекта који не видимо).
Object Inspector је врло користан помоћни прозор у коме за активну компоненту, тј.
објекат чије име се исписује у првом оквиру, дефинишемо карактеристике и његово реаговање
на разне догађаје. Овај прозор има два листића: Properties и Events.
Листић Events садржи листу свих догађаја на које одређени објекат може “реаговати”.
Двокликом у оквир десно од назива догађаја аутоматски се отвара процедура коју треба да
напише програмер, а која ће представљати реакцију објекта на тај догађај. У случају да је
програмер већ дефинисао неке процедуре које могу бити реакција на изабрани догађај, левим
кликом на стрелицу на десном крају оквира тог догађаја ће се отворити листа са њиховим
именима из које се може изабрати само једно, тј. на један догађај се може реаговати само на
Project Manager је прозор у коме се виде групе пројеката и пројекти у оквиру групе
пројеката и омогућава навигацију, кретање кроз пројектне датотеке. Овај прозор можемо
користити и код додавања или брисања пројеката из групе као и за активацију пројекта у
оквиру групе. Везано за пројекат, помоћу њега се додају, бришу, чувају и копирају датотеке које
припадају том пројекту. Овде се могу видети називи свих jунита и припадајућих форми у
оквиру пројекта или групе пројеката.
Align - помаже код уређења положаја објеката, леви клик миша на
одговарајуће дугме у овом прозору док су селектовани неки објекти на
форми помериће некe у смеру стрелице на дугмету до постизања
жељеног положаја).
Осим поменутих прозора могу се отварати и други.
На пример, разни Debug прозори отварају се, на захтев,
код превођења програма, у њима се исписују евентуалне
грешке у програмском коду, у прозору Evaluate/Modify
могу се исписивати и мењати вредности променљивих у
појединим фазама програма, у прозору Watch могу се
исписивати вредности променљивих или израза у току
извршавања програма и слично што програмеру може
помоћи да тестира понашање и отклони недостатке
програма. Ове прозоре нећемо сада објашњавати јер нису
неопходни за рад на почетку дружења са делфијем.
Уз програмски пакет Delphi иде детаљно упутство за
радознале и оне који би да науче о овом пакету више него
што је обимом ове књиге предвиђено. Упутство је
прилагођено раду под оперативним системом XP, а да би
се користило под новијим оперативним системом треба
инсталирати програмски додатак са сајта његовог
произвођача (www.microsoft.com).
Празан пројекат.
Отворићемо датотеку 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 }
end;
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 = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
end
Покретање ове празне, као и било које друге апликације, остварује се избором команде
Run из одговарајућег менија, кликом на тастер у облику зеленог троуглића (плеј дугме) или
коришћењем пречице - функцијски тастер F9. Пре покретања апликације, добро је сачувати је
како нам се не би десило да изгубимо свој труд у случају непланираног и неконтролисаног
напуштања делфи апликације било услед грешке у програмском коду, било из неког другог,
спољашњег разлога (код новијих оперативних система, нарочито ако су 64-воробитни, програм је
обавезно сачувати да би се могао покренути). Опште правило у раду са рачунаром је да би
требало свој рад чувати често и у фази израде и касније код сваке измене. Учесталост чувања се,
обично, одређује обимом посла, тј. кад год урадимо нешто што не бисмо желели да радимо још
једном, колико год то било, треба то и сачувати. Празан пројекат је полазна основа у изградњи
било које апликације. Наравно, када радимо неки пројекат који мање или више личи на неки
претходни, не морамо кренути од празног пројекта и губити време на подешавање истих
карактеристика, писање истих или сличних програмских кодова, већ можемо искористити
постојећи. У таквом случају, одмах по отварању пројекта који желимо да искористимо за
креирање новог потребно је сачувати га са другим именом, како не бисмо изгубили претходни.
Једна од важнијих ствари које морамо научити пре писања било ког програмског кода је
како сачувати свој пројекат. Пошто се сваки пројекат састоји из већег броја датотека морамо, пре
чувања пројекта, креирати нови фолдер, па тек онда у њега сачувати свој пројекат. Фолдер се
може креирати пре отварања новог пројекта или у току рада на новом пројекту. Објаснићемо
други начин (јер се претпоставља да је први познат од раније).
Из менија File изабраћемо команду Save All. Отвориће се прозор за дијалог Save Unit1 As.
Када први пут чувамо пројекат, најпре ћемо креирати нови фолдер кликом на сличицу
фолдера са звездицом у горњем десном углу или десним кликом у празни део прозора и
избором опције New -> Folder. Фолдеру треба дати име које ће нас подсећати на проблем који
се тим програмом решава овим пројектом (на пример: ResavanjePravouglogTrougla). Име
фолдера не треба да садржи размаке, интерпункцијске знаке ни наша слова (сва ћирилична ни
латинична слова ш, ђ, ч, ћ, ж). У новим верзијама оперативног система употреба ових
карактера неће представљати никакав проблем, али због евентуалног преношења нашег
програма на рачунаре са различитим верзијама оперативног система, треба поштовати
препоруку). Затим треба отворити тај фолдер, двокликом на његову иконицу или кликом на
дугме Open (које ће се исцртати уместо дугмета Save). У оквиру означеном са File name: треба
уписати име програма (ово није обавезно, тј. име јунита не мора се мењати, може се оставити
понуђено Unit1, јер ће у овом фолдеру бити само један јунит). Код давања имена јуниту не би
требало користити размаке, знаке интерпункције, латинична слова ш, ђ, ч, ћ, ж нити наша
ћирилична слова. Када смо дали име јуниту кликнућемо на дугме Save.
Сада се отвара нови дијалошки прозор Save Project1 As у којем треба уписати име
пројекта (ово, такође, није обавезно, тј. име пројекта не мора се мењати, може се оставити
понуђено Project1, јер ће у овом фолдеру бити само један задатак, односно, само један
пројекат). За име пројекта важе исте напомене као и за име јунита, а име пројекта не би
требало да буде исто као име јунита.
Код сваке значајне измене програма, без обзира да ли смо на форму додали нове
компоненте или смо мењали програмски код, треба сачувати пројекат помоћу команде Save
All при чему се претходни прозори више неће отварати (само ћемо себи уштедети мало
времена и много нерава у случају да се нешто непредвиђено деси са рачунаром, па да писање
програм не морамо да почнемо од почетка).
У случају да нисмо отворили нови пројекат, већ користимо постојећи за креирање новог
(јер има случну форму или се део програмског кода преклапа са новим или из било којег другог
разлога) применом команди Save или Save All преко старог пројекта сачуваћемо нови. На тај
начин бисмо изгубили претходни пројекат. Да се то не би десило, у оваквом случају поступак
чувања пројекта биће другачији. Из менија File изабраћемо прво команду Save As. Отвориће се
прозор за дијалог као на првој слици и сачуваћемо јунит како је раније описано (креираћемо
нови фолдер и у њему са истим или промењеним именом сачувати јунит). Затим ћемо из
менија File изабрати команду Save Project As. Отвориће се прозор за дијалог као на другој
слици и сачуваћемо пројекат како је описано.
Компонента у жижи.
Компонента може бити у жижи и тада јој се могу мењати карактеристике. Да бисмо знали
која је компонента активна довољно је да погледамо на врх прозора Object Inspector-а. Њено
име је исписано у првом оквиру. Активна компонента је означена и са осам црно обојених
квадратића, на угловима и срединама страница.
У извршној верзији апликације, такође, битно је знати
која је компонента тренутно активна, односно, у жижи. Када
се програм покрене, нема Object Inspector-а, а нема ни црних
тачкица на рубовима компоненте и тада активну компоненту
можемо препознати по неким другим карактеристикама које
зависе од врсте компоненте. Ако се ради о текст компоненти,
она је у жижи ако у њој трепери курсор. Ако се ради о
графичкој компоненти, она је у жижи ако је око натписа на
њој видљив испрекиданим линијама исцртан правоугаоник.
На слици је чекбокс компонента у жижи (што препознајемо по
тачкицама исцртаном оквиру око текста).
У једном тренутку, само једна компонента може бити у жижи. Жижу са компоненте на
компоненту премештамо тастером Tab на тастатури или кликом миша на изабрану компоненту.
Неке компоненте не могу бити у жижи. Да би компонента могла бити у жижи мора поседовати
карактеристику TabStop. Карактеристиком TabStop дефинишемо редослед постављања
компоненти у жижу. Овај, природни, редослед може се пореметити кликом мишем на
одговарајућу компоненту. Добро организовани програм има редослед доласка компоненти у
жижу који прати алгоритамско решење.
Једноставне компоненте
Натпис (Label)
Label, натпис је компонента која омогућава једносмерну комуникацију на релацији
програм-корисник, односно, помоћу ње се кориснику програма саопштава нешто; корисник не
може да мења садржај лабеле нити на било који начин да утиче на њен изглед и величину осим
када је то програмом дефинисано, односно, када је испрограмирано да се на неки начин
промене карактеристике задате у фази дизајнирања програма. Када се програм извршава, ова
компонента не може бити у жижи. Компонента се налази на листићу Standard на четвртом
месту (велико слово А). Као и сваки други објекат, лабела има одређене особине које се могу
подешавати како би се постигли одговарајући ефекти. Најчешће ћемо подешавати следећа
својства:
Align - положај лабеле у односу на рубове форме
Alignment - уређење текста у оквиру лабеле
AutoSize - аутоматско подешавање величине лабеле
Дугме (Button)
Button, тастер или дугме је компонента којом се корисник обавештава о могућности
извршења неке акције у програму за коју је потребна конкретна активност корисника,
односно, кликом мишем на ову компоненту корисник програму саопштава да жели да се нека
акција изврши; корисник нема права да мења изглед и функцију ове компоненте јер је то
програмом дефинисано. Компонента се налази на листићу Standard на седмом месту (сличица
са словима ОК). Најчешће ћемо подешавати следећа својства:
Caption - текст који је исписан на тастеру
Enabled - да ли је дозвољено приступити тастеру
Font - врста слова, начин исписа, величина, боја и ефекти
Height - висина тастера
Left - растојање објекта од левог руба форме
Name - име објекта
TabOrder - редни број објекта
Top - растојање објекта од врха форме
Visible - видљивост објекта
Width - ширина објекта
WordWrap - пренос текста на тастеру у нови ред
Часовник (Timer)
Компонента која омогућава извршавање програмских елемената периодично, тј. у тачно
одређеном тренутку у односу на њено активирање. Може да се користи код симулација
кретања као и код других аудио и визуелних ефеката који треба да се појављују у једнаким
временским интервалима. Једна компонента може да контролише само једну програмску
целину. Дозвољена је употреба произвољног броја ових компоненти. Пошто су на извршном
екрану невидљиве, ове компоненте неће нарушити уређење излазне форме апликације
колико год да их је активирано. Компонента се налази на листићу System на првом месту
(часовник). Подешаваћемо следећа својства:
Enabled - да ли је тајмер активан, укључен
Interval - период у милисекундама који активира неки догађај
Name - име тајмера
Компоненте избора
Радио-дугме (RadioButton)
Радио дугме је компонента која дозвољава унос једне вредности од понуђених.
Ако постоји само једно дугме, корисник може изабрати тај податак или га не
изабрати. Много чешће се радио дугмад групишу, па се кориснику дозвољава шири
избор, тј. од више понуђених података може изабрати један. Контрола избора је на
програму, тј. избором једног податка аутоматски се поништава претходни избор. На
слици је приказана радио група којом би се могао унети одговор на питање: На којој
планети живимо?. Могуће је изабрати само један од понуђених одговора. Радио
дугмад могу бити распоређена хоризонтално, верикално или у облику табеле.
Најчешће се подешавају следеће карактеристике:
Caption - наслов (назив опције)
Color - боја позадине
Top - удаљеност од горње ивице форме
Left - удаљеност од леве ивице форме
Width - ширина, ако је краћа од дужине наслова део наслова се неће видети
Height - висина компоненте
Font - врста фонта који се користи за испис опција
Checked - дефинише да ли је опција селектована или не
одговора него што може стати у оквир са десне стране се појављује клизач којим се могу
откривати одговори који се не виде. Најчешће се подешавају следеће карактеристике:
Color - боја позадине
Top - удаљеност од горње ивице форме
Left - удаљеност од леве ивице форме
Width - ширина оквира
Height - висина оквира
Font - врста фонта који се користи у оквиру
Border Style - врста ивице оквира
Items - опције, ставке у листи
MultiSelect - дозвољава или забрањује вишеструко селектовање опција листе
ItemIndex - редни број опције у листи (бројање почиње од 0)
Sorted - дефинише да ли ће опције бити абецедно уређене
Контејнерске компоненте
• GroupBox и
• Panel.
Плоча (Panel)
Када желимо да постигнемо специјалне ефекте, да маске за
унос и приказивање података начинимо ефектнијим
користимо панеле. Панел може да се распростре по читавој
форми или да заузима само део ње, може да има рубове који
дају утисак тродимензионалности, могу да се покрећу, да се
појављују или нестају, да буду доступни или не. Све
компоненте које су смештене на једном панелу деле судбину
панела. Панели се могу да користе увек, али се најчешће
користе код мало сложенијих програма у којима има јако пуно
компоненти и опција које не би требале истовремено да се
приказују јер би форма била пренатрпана. А понекад се користе и за добијање специјалних
ефеката, на пример, код приказа слика, помоћу панела, можемо додати рам за слику. Ако су два
или више панела истовремено на форми могу се неке компоненте визуелно раздвајати и
груписати по својим функцијама и употреби. Најчешће се подешавају следеће карактеристике:
Caption - наслов (најчешће на панелу нема наслова)
Color - боја позадине
Top - удаљеност од горње ивице форме
Left - удаљеност од леве ивице форме
Width - ширина панела
Height - висина панела
Font - врста фонта који се користи на панелу (ако је дефинисан, може да се преноси
на све компоненте које се стављају на панел, а може и да се наслеђује од
компоненте на којој се налази)
Align - позиција, поравњање панела у односу на форму
BevelInner - изглед унутрашњег дела оквира панела
BevelOuter - изглед спољашњег дела оквира панела
BevelWidth - дебљина оквира панела
BorderStyle - врсте ивица панела
BorderWidth- дебљина ивице панела
Визуелно издвајање компоненти на форми може се постићи и коришћењем компоненте
Bevel (оквир), али ово није контејнерска компонента јер само уоквирава компоненте, али не
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
43 Рачунарство и информатика за трећи разред гимназије 43
Типови података
Азбуку програмског језика чине сви дозвољени знаци који се користе приликом
кодирања програма и то су:
• велика и мала слова енглеске абецеде
• цифре декадног бројног система: 0,1,2,3,4,5,6,7,8,9
• специјални знаци: + - * / = ^ < > () [] {} . ,: ; ‘ # $
За математичка израчунавања се користе ознаке:
* за множење
/ за дељење
+ за сабирање
- за одузимање
() за промену приоритета извршења операција
У конструкцији програма се користе ознаке:
:= у наредбама додељивања
. ознака краја програма
; ознака краја наредбе
# ASCII кодови
$ хексадецимални бројеви
(* *) или
{} коментар или директива преводиоцу
+ укључење директиве преводиоца
- искључење директиве преводиоца
‘ почетак или крај карактера или стринга
, граничник између две променљиве
За упоређивање или тестирање се користе
= једнако
< мање од
> веће од
<= мање или једнако
>= веће или једнако
<> различито
За структуру података се користе:
^ показивач или контролни кодови са тастатуре
(. .) или [ ] индексирање и димензионисање низова
() листа параметара
. граничник записа поља
.. распон (интервал)
Резервисане речи су интегрални део језика и оне се не могу редефинисати ни користити
као имена променљивих или константи у програму. Резервисане речи у делфију су:
And, Array, As, Asm, Begin, Constructor, Case, Class, Const, Div, Destructor, Dispinterface, Do, Downto, Else, End,
Except, Exports, File, Finalization, Finally, For, Function, Goto, If, Implementation, In, Inline, Inherited, Initialization,
Interface, Is, Label, Library, Mod, Nil, Not, Object, Of, Or, Out, Packed, Procedure, Program, Property, Raise, Record,
Resourcestring, Repeat, Set, Shl, Shr, String, Then, Thread, Var, To, Try, Type, Unit, Until, Uses, Var, While, With, Xor
Стандардни идентификатори су речи дефинисане у програмском језику, али се могу и
редефинисати, мада их је боље користити у изворном облику да не би долазило до забуне. На
пример, можемо дефинисати integer као скуп речи, али је нормалније оно што је дефинисано
програмским језиком, да integer представља целе бројеве.
Граничници су симболи који служе за раздвајање појединих елемената језика. Дозвољени
граничници у делфију су:
; ознака за крај наредбе
, крај идентификатора у набрајању
. крај програма или поља у слогу
eol (end-of-line, крај реда) не види се на екрану - означава се притиском тастера
Ентер
// коментар у једном реду
{ ... } вишередни коментар
space (празнина) означава се притиском размакнице
Програмска линија је низ идентификатора максималне дужине 255 карактера рачунајући
и празнине. У паскалу, све иза 255-ог карактера се игнорише, у делфију програмски ред може
бити и дужи од 255 карактера, али се тако записани програми тешко читају.
Структура програма
Наравно, програмер може и сам да осмисли начин на који ће написати назив програма,
али је овако читљивији.
У делфију су велика и мала слова равноправна тако да то да ли наредбе пишемо великим
или малим или великим почетним, а осталим малим зависи само од укуса програмера и ефекта
који се жели постићи када се само баци око на програм. Наравно, треба бити доследан у
коришћењу неког начина записивања програма јер на тај начин помажемо и себи код тражења
неких детаља или грешака у програму.
Део за декларације и дефиниције садржи:
• Одељак за декларација типова, почиње резервисаном речи type.
• Одељак за декларација променљивих, почиње резервисаном речи var.
• Одељак за дефинисање константи, почиње резервисаном речи const.
• Одељак за дефинисање лабела, почиње резервисаном речи label.
• Одељак за дефинисање кориснички дефинисаних функција, почиње резервисаном речи
function.
• Одељак за дефинисање кориснички дефинисаних процедура, почиње резервисаном речи
procedure.
Редослед одељака није битан, важно је само да декларације и дефиниције налазе испред
тела програма, односно, пре програмског реда који почиње резервисаном речи begin.
Тело програма почиње почетком (begin), а завршава крајем (end):
begin {овде се пишу наредбе, а ово је коментар}
...
end.
Тачка на крају програма се не сме изоставити. Испред тела програма (функције или
процедуре) не смеју се писати никакве наредбе. Програмске наредбе се једна од друге
раздвајају знаком ; који се може изоставити само у специјалним случајевима које ћемо
нагласити касније, када се са њима будемо сусретали. Будући да је делфи креиран тако да сам
гради основну структуру програма, нећемо морати много да бринемо о њеном поштовању.
Програми се пишу да би се обрадили неки подаци који могу бити бројеви, речи или нешто
друго. У зависности од типа података дозвољене су различите операције са њима. Не могу се
две речи помножити или бројеви делити на слогове. Програмски језици су, углавном, строги у
односу на типове података и не дозвољавају њихово мешање.
Типови података могу да се деле разне начине, а најчешћа подела је на:
• стандардне и
• изведене.
Стандардни типови су они који су дефинисани и уграђени у структуру програмског језика
и могу се одмах и увек користити у свим програмима. Изведени тип података, по потреби,
дефинише корисник у свом програму и важи само у том програму, тј. ако га желимо користити у
неком другом програму морамо га у том програму поново дефинисати. Тип података се
дефинише именом које се не сме поклапати са неком од резервисаних речи програмског језика и
навођењем свих елемената који припадају том типу. Након дефиниције неког типа у програму
он се може користити као стандардни, али само у том програму.
Друга подела типова података (која не искључује прву) је на:
• просте,
• стрингове,
• структурне и
• показиваче.
Просте типове података чине:
• уређени типови и
• реални тип.
За уређене типове (ordinal types) карактеристично је да се за сваки њихов елемент зна
који је испред, а који иза њега. Деле се на:
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
48 Рачунарство и информатика за трећи разред гимназије 48
• char - слова или у општем случају, карактери (јер и симболе 1, 2, 3, *, / и друге можемо
третирати као словни податак, а нико за њих неће рећи да су слова);
• integer - цели бројеви (... , -2, -1, 0, 1, 2, ...);
• boolean - логички тип, (вредности true и false);
• набројани тип и
• интервални тип
Прва три уређена типа су стандардни типови података, а последња два немају унапред
задати домен већ се дефинишу у зависности од потребе корисника.
Структурни типови су:
• Set - скуповни тип;
• Array - низовни тип;
• Record - слоговни тип;
• File - датотечни тип;
• Class - класе
Структурни типови могу да се користе као стандардни ако је њихова примена могућа без
посебно дефинисаног имена, али врло често се дефинишу у складу са захтевима програма.
Важно је напоменути да у оквиру појединих од поменутих типова података постоје
подтипови који се међусобом разликују по броју елемената и прецизности, а за све подтипове
истог типа важе исте операције и у неким случајевима дозвољено је њихово мешање, односно, у
неким случајевима променљивама једног подтипа могу се додељивати вредност променљивих
другог подтипа истог типа података.
ћемо касније решавати, без логичког типа не бисмо никако могли испрограмирати (било да се
користе логичке променљиве или само логички изрази).
Логички тип је прости уређени тип података који има две вредности, true и false.
И логички тип има четири подтипа, то су:
• Boolean (заузима 1 бит, тј. има две могуће вредности, 0 и 1),
• ByteBool (заузима 8 битова или 1 бајт меморије, тј. има 256 вредности),
• WordBool (заузима 16 битова, 2 бајта или једну реч меморије, тј. има 65536 вредности) и
• LongBool (заузима 32 бита, 4 бајта или две речи меморије, тј. има 4294967296 вредности).
Но, сви они имају исте вредности (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
У задацима које ћемо решавати променљиве ћемо декларисати основним типом boolean.
Декларација може изгледати овако:
var a,b,c,d:boolean; // листа променљивих са заједничким типом
var a:boolean; b:boolean; c:boolean; d:boolean; // свака променљива са својим типом
var a:boolean; // свака променљива са својим типом, сваака у новом реду
b:boolean;
c:boolean;
d:boolean;
var a:boolean; // испред сваке променљиве са својим типом пише се службена реч var
var b:boolean;
var c:boolean;
var d:boolean;
Стринг тип
У раду са знаковним, карактер подацима чешће се срећемо са подацима који се састоје из
више од једног знака. Такви подаци могу се обрађивати знак по знак, али би то додатно
оптерећивало програм. Уместо једне променљиве радили бисмо са низом променљивих што
оптерећује и компликује писање програма. Зато је уведен тип String (енгл. string - ниска, низ
карактера, реч). Максималан број карактера који може бити вредност променљиве типа
String у паскалу је 255.
У делфију постоји још неколико подтипова овог типа:
ShortString који се поклапа са паскалским типом String (максимална дужина 255),
AnsiString има максималну дужину 231 карактера,
WideString има максималну дужину 230 карактера и има подршку за националне симболе
(Unicode).
Подтипови типа стринг могу да се мешају и размењују вредности, али се мора водити
рачуна о њиховим специфичностима приликом позива функција и процедура. Подаци овог
типа се памте као низови карактера с тим што је, будући да је ово стандардни тип података,
програмском преводиоцу остављено да води рачуна о дужини.
Код декларације променљивих овог типа могуће је унапред дефинисати максималну
дужину низа или задржати уграђену дужину (правила за декларацију променљивих су иста
као и код претходних типова података само се овде појављују у две варијанте):
VAR a:STRING;
{декларисали смо променљиву типа String која може имати највише 255 карактера
дужине, тј. може имати мање, али не може имати више од 255 карактера, рачунајући
и размаке и специјалне знакове}
VAR b:STRING[11];
{декларисали смо променљиву типа String која може имати највише 11 карактера
дужине, тј. може имати мање, али не може имати више од 11 карактера, рачунајући
и размаке и специјалне знакове}
Променљивама типа String може се додељивати вредност која не одговара њиховој
декларацији, тј. променљивој а може се доделити вредност која има више од 255 карактера
Скуповни тип
У задацима са издвајањем појединих слова користићемо појам скуп или колекција - сет
(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 0..255;
Основне операције са подацима скуповног типа су:
+ унија,
* пресек и
- разлика.
Основне релације над подацима скуповног типа су:
= једнако ,
<> неједнако ,
< или <= подскуп,
> или >= надскуп и
in елемент скупа.
Празан скуп дефинише се командом:
с:=[];
Додавање елемента е неком скупу с остварује се командом:
с:=с+[е];
У овом тренутку неће нам бити значајна карактеристика видљивост методе, па када будемо
писали апликације нећемо размишљати о томе где ћемо писати декларацију методе коју
додељујемо класи. Општи метод ће бити да функције и процедуре које представљају реакцију на
неки догађај декларишемо у делу изнад резервисане речи private (зато што их делфи аутоматски
исписује на том месту), а оне које дефинишемо независно од неког догађаја писаћемо изнад
резервисане речи public (односно, биће приватне, не зато што тако мора него само да бисмо
направили визуелну разлику између ове две врсте функција и процедура).
Резервисана реч end; обавезна је на крају дефиниције класе и иза ње можемо писати
друге декларације и дефиниције које су нам потребне у програму.
У објектном моделу примењује се скривање информација, тј. објекту се може
приступити само преко порука тј. метода које су дефинисане за класу којој објекат припада.
Сама структура објекта, односно, његова својства (инстанцне променљиве) нису видљиве
другим објектима. Објектни модел карактерише учаурење података и операција у објекат
што омогућује једноставну измену структуре објекта и класе и имплементације операција без
ефекта на апликације које тај објекат користе (све док су дефиниције операција непромењене, тј.
са истим називима и параметрима). Нова класа може се дефинисати као подкласа већ
дефинисане класе (своје надкласе). Подкласа наслеђује операције и својства од своје надкласе,
али може имати и своје сопствене.
На пример, за дефинисану класу ОСОБА може се дефинисати подкласа СТУДЕНТ, која има
сва својства класе ОСОБА, али и нека своја специфична. Програми које ћемо писати у оквиру
овог курса неће захтевати увођење нових класа.
Наредбе и изрази
promeljiva := vrednost;
Ознака := је знак доделе и не може се изоставити. На левој страни је име променљиве
којој се додељује вредност, а на десној страни је конкретна вредност, израз или функција чија
се вредност додељује променљивој. Променљива са леве стране знака додељивања и вредност
са десне стране морају се слагати по своме типу, у противном, преводилац пријављује грешку и
програм се не може покренути.
Наредбе улаза и излаза (Read, Write) се користе у паскалу за унос података и издавање
резултата. У делфију се користе само специјални облици ових наредби за рад са
секвенцијалним датотекама и то врло ретко јер се и датотеке овог типа користе врло ретко у
модерним програмима, а за унос података и приказивање резултата користе се одговарајуће
текст компоненте.
Наредба GOTO постоји у готово свим програмским језицима, па и овде, али се не користи
јер није у складу са правилима структурног програмирања. Представља безусловни прелазак
(скок) на неку наредбу програма не водећи рачуна о структури која се тренутно извршава.
Добар програмер никада нема потребу за овом наредбом јер се алгоритмом може предвидети
структура програма која нема потребу за прескакањем дела алгоритамских корака без неког
посебног разлога.
Структурисане наредбе су сложене наредбе. У своју синтаксну дефиницију уграђују и
неке друге просте или структурисане наредбе које се извршавају.
Најпростија структурисана наредба је наредба састављања. Ова наредба почиње
службеном речи Begin, а завршава службеном речи End. У оквиру наредбе састављања може се
појавити било која наредба, па и друга наредба састављања. У ширем смислу, читав програм
можемо сматрати једном наредбом састављања. Општи облик ове наредбе је:
begin <naredbe>
end;
Програмски преводилац аутоматски сваком елементу Begin придружује одговарајући
елемент End, у фази превођења, и у случају грешке, односно, ако неки од елемената недостаје
или се појављује вишак неког од елемената даје одговарајућу поруку.
Остале структурисане наредбе су нешто компликованије, па ћемо им посветити посебна
поглавља.
1. као математичари:
добијену формулу за другу страницу уврстићемо у обрасце за површину и обим правоугаоника
и добити формуле за израчунавање обима и површине помоћу странице и дијагонале:
O=2(a+ d 2 a 2 ) у програму ћемо написати овако: o:=2*(a+Sqrt(d*d-a*a));
P=a d 2 a 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 које ћемо затим исписати. У првом случају имамо једну променљиву мање, па је утрошак
меморије ефикаснији, у другом случају формуле су једноставније за разумевање и за унос. У
другом случају имамо једну мање операцију кореновања, па је процес добијања резултата
бржи (мада се ради о делићима милисекунде јер је проблем прилично једноставан, много је
већа уштеда у времену за извођење и исписивање формула).
• Синтакса израза
• Семантика израза
• Правила за формирање израза
• Врсте израза по типу података
• Подела наредби
• Просте наредбе
• Празна наредба
• Наредба додељивања
• Процедуралне наредбе
• Структурисане наредбе
• Наредба састављања
• Конверзија типова података
• Компоненте за унос података
• Компоненте за приказивање података
• Алгоритам замене вредности две променљиве
• Исписивање математичких формула у програмима
Уводни задаци
Први задаци су примери реаговања објеката у делфију на спољашне догађаје. Основна функција им је да
читаоци ових редова схвате да се у програмирању можемо понашати слободно и опуштено, односно, да
програмирање може бити и забава, али да и за тако нешто морамо имати некакво знање о програмском
језику. Урађени су на најједноставнији начин јер у овом тренутку немамо довољно програмерског
искуства да лепршамо непрегледним пространствима и поигравајући се заводљиво освајамо свет.
• Саставити програм који са тастатуре прихвата име и исписује га уз поздрав.
Отварањем делфи окружења отворили смо празан пројекат. Активни прозор требало би да буде форма.
У случају да је, из неког разлога, активни прозор делфи програм едитор на форму се прелази кликом
мишем на било који део форме или, једноставније, притиском на функцијски тастер Ф12 на тастатури.
Прилагодићемо форму према својој замисли, на пример овако:
BorderIcons = [biSystemMenu], BorderStyle = bsSingle, Caption = МОЈ ПРВИ ПРОГРАМ, ClientHeight = 360,
ClientWidth = 380, Color = clMoneyGreen
Кад год је могуће, у подешавањима ћемо користити ћирилично писмо. Искошеним словима су исписане
карактеристике које ћемо подешавати на листићу Properties прозора ObjectInspector. У зависности од
карактеристике која се подешава, вредност ћемо уписивати, изабрати мишем из падајућег менија који
се отвара кликом на поље вредности карактеристике или на тастер у облику стрелице на доле или
подесити у прозору за дијалог који се отвори кликом мишем на одговарајући тастер у облику три тачке.
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
63 Рачунарство и информатика за трећи разред гимназије 63
• Саставити програм који приказује два тастера на форми који нестају и појављују се
наизменично, на клик мишем на неки од тастера.
Идеја је да се на форми прикаже један тастер на који треба кликнути мишем. У том тренутку овај тастер
нестаје и појављује се други тастер на некој другој позицији на форми на који сада треба кликнути. Сада
тај тастер нестаје, а појављује се поново први и тако у круг све док се не кликне на тастер за крај. Да би
се тастери појављивали и нестајали, користићемо њихову карактеристику Visible. Ова карактеристика
може имати две вредности: True - тастер је видљив и False - тастер је невидљив. Примена подешене
карактеристике не види се у фази дизајнирања, већ само у фази извршења програма.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = [biSystemMenu]; BorderStyle = bsSingle; Caption = ИГРА
СА ДВА ТАСТЕРА; ClientHeight = 360; ClientWidth = 380; Color = clMoney
Green; Font =PalatinoLynotype, Bold, 18; Position = poScreenCenter.
На форму ћемо поставити три тастера и, затим, подесити њихове
карактеристике на следећи начин:
Caption = Кликни ме; Height = 40; Left = 50; Top = 50; Visible = False;
Width = 150;
Caption = Кликни ме; Height = 40; Left = 190; Top = 270; Visible = Truе;
Width = 150.
Caption = Х; Font = Courier New, 22; Height = 40; Left = 340; Top = 0;
Width = 40.
Сачуваћемо дизајнирану форму у креирани фолдер DvaTastera, а
затим дефинисати реакције на клик сваког од тастера.
Двоклик на први тастер:
procedure TForm1.Button1Click(Sender: TObject);
begin Button1.Visible:=false;
Button2.Visible:=true;
end;
Двоклик на други тастер:
procedure TForm1.Button2Click(Sender: TObject);
begin Button1.Visible:=true;
Button2.Visible:=false;
end;
Двоклик на трећи тастер:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
• Саставити програм који кружић у центру екрана помера за две тачке у правцу
стрелице на притиснутом тастеру.
Да бисмо решили овај задатак потребно нам је елементарно сналажење у Декартовом координатном
систему. Координатни почетак у делфију је горњи леви угао форме, а координатне осе су Left -
растојање од левог и Top - растојање од горњег руба форме.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = [biSystemMenu]; BorderStyle = bsSingle;
Caption = ИГРА - ПОМЕРАЊЕ КРУЖИЋА; ClientHeight
= 800; ClientWidth = 1000; Color = clMoneyGreen; Font
= Wingdings 3, Bold, 28; Position = poScreenCenter.
На форму ћемо поставити лабелу за кружић који ће
се кретати, девет тастера са стрелицама и тастер за
крај рада. Почетне координате лабеле ћемо добити
када од координата центра форме (половина ширине
и висине радног прозора) одузмемо половину ширине
и висине лабеле након подешавања фонта. Тастере
ћемо поређати у доњем десном углу форме како би
мање ометали доживљај. Координате одговарајућих
тастера се добијају тако што се редом узимају један
број из left и један број из top карактеристике (сваки
са сваким), а стрелице се добијају уносом редом по
једног слова са листе.
Лабела:
Caption = o; Font =Arial Black, Bold, 9; Left = 495; Top =
392.
Стрелице:
Caption = j, h, k, f, P, g, l, i, m; Height = 40; Left = (875, 915, 955); Top = (635, 675, 715); Width = 40.
Крај рада:
Caption = Крај рада; Font =PalatinoLynotype, Bold, 16; Height = 40; Left = 875; Top = 745; Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Tackica, а затим, двокликом редом на сваки од
тастера са стрелицама, дефинисаћемо процедуре којима се лабела помера у правцу стрелице на тастеру
за две тачке, односно, враћа се на почетни положај, ако се кликне на средњи тастер. У прве четири
процедуре једна координата је константна, па је нисмо користили.
procedure TForm1.Button4Click(Sender: TObject);
begin Label1.Left:=Label1.Left-2; // тастер лево
end;
procedure TForm1.Button6Click(Sender: TObject);
begin Label1.Left:=Label1.Left+2; // тастер десно
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Label1.Top:=Label1.Top-2; // тастер горе
end;
procedure TForm1.Button8Click(Sender: TObject);
begin Label1.Top:=Label1.Top+2; // тастер доле
end;
procedure TForm1.Button1Click(Sender: TObject);
begin Label1.Top:=Label1.Top-2; // тастер горе-лево
Label1.Left:=Label1.Left-2;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin Label1.Top:=Label1.Top+2; // тастер доле-десно
Label1.Left:=Label1.Left+2;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Label1.Top:=Label1.Top-2; // тастер горе-десно
Label1.Left:=Label1.Left+2;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin Label1.Top:=Label1.Top+2; // тастер доле-лево
Label1.Left:=Label1.Left-2;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin Label1.Top:=392; // тастер за повратак
Label1.Left:=495;
end;
Двокликом на тастер за крај рада дефинисаћемо процедуру којом се излази из програма:
procedure TForm1.Button10Click(Sender: TObject);
begin Application.Terminate;
end;
Следе нешто мање занимљиви, али релативно лагани задаци. Помоћу њих ћемо увежбавати коришћење
различитих типова података и писање стандардних операција са њима у делфију и још боље се упознати
са простом линијском алгоритамском структуром. Објаснићемо и неке карактеристике објеката.
• Саставити програм који за унети карактер исписује претходни и следећи.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = [] - карактеристика дефинише који ће се тастери
приказивати у траци са називом; кликом на плус испред назива
карактеристике отвара се подмени са називима икона; треба за
сваку од четири иконе: системски мени - biSystemMenu (сличица
испред назива и тастер за затварање прозора), тастери за
минимизацију - biMinimize, максимизацију - biMaximize и помоћ
- biHelp изабрати false.
BorderStyle = bsSingle - карактеристика дефинише да ли је
кориснику дозвољено мењање величине прозора хватањем за
рубове и повлачењем лево-десно, горе-доле; овако дефинисана
карактеристика забрањује кориснику измену величине прозора.
Caption = КАРАКТЕР ТИП; ClientHeight = 400; ClientWidth = 430;
Color = Teal; Font = Palatino Linotype, BoldItalic, 16, Aqua;
FormStyle = fsStayOnTop - дефинише понашање прозора у односу
на остале отворене прозоре; овако дефинисана карактеристика
одређује да ће прозор апликације увек бити на врху свих отворених
прозора; у фази тестирања програма ову карактеристику не би
требало користити јер у случају грешке у програму дијалошки
прозор са описом те грешке биће испод прозора апликације, па
нећемо видети шта смо погрешили.
Position = poScreenCenter - дефинише како ће се прозор распоредити на десктопу, овако дефинисана
карактеристика говори да ће прозор апликације бити центриран на екрану.
На форму ћемо ставити лабелу за наслов, три лабеле за комуникацију са корисником, едит за унос, два
едита за испис резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop - лабела ће се поставити на врх форме од левог до десног руба.
Alignment = taCenter - текст исписан у лабели биће центриран.
AutoSize = False - у случају промене текста или фонта лабела неће аутоматски мењати димензије.
Caption = Претходни и наредни; Font = 22, Lime; Height = 50;
Layout = tlCenter - текст у лабели ће бити вертикално центриран.
Едит за унос:
Font = Bold, Black; Left = 300; MaxLength = 1 - максимална дужина податка који се уноси;
Top = 100; Width = 50.
Едити за испис:
Font = Bold, Black; Left = 300; ReadOnly = True - дефинише да корисник нема права да мења садржај едита;
Top = (240, 310); Width = 50.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (Упишите карактер, Претходни карактер, Наредни карактер); Height = 36;
Layout = tlCenter; Left = 80; Top = (100, 240, 310); Width = 220.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (10, 150, 190);Top = 170; Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер PredSucc, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit3.Clear;
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var k,p,n:char;
begin k:=Edit1.Text[1];
p:=Pred(k);Edit2.Text:=p;
n:=Succ(k);Edit3.Text:=n;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Командом Edit1.Text[1] из текста унетог у оквир узима се само прво слово. Овако смо решили и проблем
са типом података, на левој страни је променљива типа карактер, а Edit1.Text је стринг, па додељивање
не би било могуће.
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
67 Рачунарство и информатика за трећи разред гимназије 67
• Саставити програм који за унето мало слово исписује велико и њихове редне бројеве у
ASCII табели.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = КАРАКТЕР ТИП;
ClientHeight = 400; ClientWidth = 430; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, четири лабеле за
комуникацију са корисником, едит за унос, три едита за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
ASCII кодови; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едит за унос:
Font = Bold, Black; Left = 300; MaxLength = 1;Top = 100; Width = 50;
CharCase = ecLowerCase - велика слова уноси као мала.
Едити за испис:
Font = Bold, Black; Left = 300; ReadOnly = True; Top = (220, 280, 340);
Width = (70, 50, 70).
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (Упишите мало слово, ASCII код малог слова, Велико слово, ASCII код
великог слова); Height = 36; Layout = tlCenter; Left = 50; Top = (100, 220, 280, 340); Width = 250.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (10, 150, 290); Top = 160; Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер OrdUpCase, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit2.Clear;
Edit3.Clear;Edit4.Clear;
Edit1.ReadOnly:=false;
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a,b:char;
begin a:=Edit1.Text[1];
Edit2.Text:=IntToStr(Ord(a));
b:=UpCase(a);Edit3.Text:=b;
Edit4.Text:=IntToStr(Ord(b));
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује збир, разлику и производ два цела броја.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = ЦЕЛОБРОЈНИ ТИП;
ClientHeight = 400; ClientWidth = 430; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, пет лабела за кому-
никацију са корисником, два едита за унос, три едита за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Арит
метичке операције; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (90, 280);Top = 100; Width = 100.
Едити за испис:
Font = Bold, Black; Left = 180; ReadOnly = True; Top = (220, 280, 340);
Width = 150.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (a =, b =, a + b =, a - b =, a * b =); Height = 36;
Layout = tlCenter; Left = (50, 240, 100, 100, 100); Top = (100, 100, 220, 280, 340); Width = (40, 40, 80, 80, 80).
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (10, 150, 290); Top = 160; Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер AOper, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit4.Clear;Edit5.Clear;
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject); // тастер одреди
var a,b,z,r,p:integer;
begin a:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(a);
b:=StrToIntDef(Edit2.Text,0);Edit2.Text:=IntToStr(b);
z:=a+b;Edit3.Text:=IntToStr(z);
r:=a-b;Edit4.Text:=IntToStr(r);
p:=a*b;Edit5.Text:=IntToStr(p);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује количник и остатак при целобројном дељењу два
уписана цела броја.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = ЦЕЛОБРОЈНИ ТИП;
ClientHeight = 400; ClientWidth = 430; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, четири лабеле за кому-
никацију са корисником, два едита за унос, два едита за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Арит
метичке операције; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (90, 280);Top = 100; Width = 100.
Едити за испис:
Font = Bold, Black; Left = 180; ReadOnly = True; Top = (240, 310);
Width = 150.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (a =, b =, a div b =, a mod b =); Height = 36;
Layout = tlCenter; Left = (50, 240, 80, 80); Top = (100, 100, 240, 310); Width = (40, 40, 100, 100).
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (10, 150, 290); Top = 170; Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер AOper, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit4.Clear;
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject); // тастер одреди
var a,b,k,o:integer;
begin a:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(a);
b:=StrToIntDef(Edit2.Text,0);Edit2.Text:=IntToStr(b);
k:=a div b;Edit3.Text:=IntToStr(k);
o:=a mod b;Edit4.Text:=IntToStr(o);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Сачуваћемо дизајнирану форму у креирани фолдер Trocifren, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var n,s,p,d,t:integer;
begin n:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(n);
p:=n mod 10; // цифра јединица
d:=n div 10 mod 10; // цифра десетица
t:=n div 100; // цифра стотица
s:=p+d+t;Edit2.Text:=IntToStr(s);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује збир два угла датог у степенима минутима и
секундама.
Да би се коректно решио задатак потребно је увести контролу уноса минута и секунди. За ове контроле
потребно је знати наредбе гранања. Зато ћемо претпоставити да је унос коректан. Углове ћемо
претворити у секунде, сабрати их и затим секунде претворити у степене, минуте и секунде.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = ЦЕЛОБРОЈНИ ТИП;
ClientHeight = 350; ClientWidth = 430; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, три лабеле за комуни-
кацију са корисником, шест едита за унос, три едита за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Сабирање углова; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (200, 260, 310); MaxLength = (3, 2, 2); Top =
(100, 150); Width = (50, 40, 40).
Едит за испис резултата:
Font = Bold, Black; Left = (200, 260, 310); ReadOnly = True; Top = 200; Width = (50, 40, 40).
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (Први угао :, Други угао :, Збир углова :); Height = 36; Layout = tlCenter; Left =
60; Top = (100, 150, 200); Width = 140.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (20, 155, 290); Top = 270; Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер ZbirUglova, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Edit4.Clear;Edit4.ReadOnly:=false;
Edit5.Clear;Edit5.ReadOnly:=false;
Edit6.Clear;Edit6.ReadOnly:=false;
Edit7.Clear;Edit8.Clear;Edit9.Clear;
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a1,a2,a3,b1,b2,b3,c1,c2,c3:integer;
begin a1:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(a1);
a2:=StrToIntDef(Edit2.Text,0);Edit2.Text:=IntToStr(a2);
a3:=StrToIntDef(Edit3.Text,0);Edit3.Text:=IntToStr(a3);
b1:=StrToIntDef(Edit4.Text,0);Edit4.Text:=IntToStr(b1);
b2:=StrToIntDef(Edit5.Text,0);Edit5.Text:=IntToStr(b2);
b3:=StrToIntDef(Edit6.Text,0);Edit6.Text:=IntToStr(b3);
c3:=a1*3600+a2*60+a3+b1*3600+b2*60+b3;
c1:=c3 div 3600;Edit7.Text:=IntToStr(c1);
c2:=c3 mod 3600 div 60;Edit8.Text:=IntToStr(c2);
c3:=c3 mod 60; Edit9.Text:=IntToStr(c3);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Edit4.ReadOnly:=true;Edit5.ReadOnly:=true;Edit6.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који на случајан начин формира број мањи од 100, заокругљује га
на две децимале, а затим замењује целобројни и разломљени део.
Задатак не захтева никакав унос података јер се почетни број формира на случајан начин, зато би на
почетку требало да у жижи буде тастер Одреди. То се постиже тако што се на форму као први објекат
постави тај тастер или се пре извршења програма карактеристика TabOrder овог објекта постави на 0.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = РЕАЛНИ ТИП; ClientHeight = 370; ClientWidth = 430;
Color = Teal; Font = Palatino Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
p:=a*a*Sqrt(3)/4+3*a*h1/2;Edit5.Text:=Format('%9.3f',[p]);
v:=a*a*Sqrt(3)/4*h/3; Edit6.Text:=Format('%9.3f',[v]);
Edit1.ReadOnly:=true;
Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује истиносну вредност исказа: Број а је дељив бројем б,
где су а и б дати цели бројеви.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = ЛОГИЧКИ ТИП;
ClientHeight = 330; ClientWidth = 380; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, три лабеле за комуни-
кацију са корисником, два едита за унос, едит за испис резултата
и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Дељи
вост бројева; Font = BoldItalic, 22; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = 70; Top = (100, 150); Width = 120;
Едит за испис резултата:
Font = Bold, Black; Left = 70; ReadOnly = True; Top = 200; Width =
120.
Лабеле за комуникацију
AutoSize = False; Caption = (a =, b =, t =); Height = 34; Layout = tlCenter; Left = 30; Top = (100, 150, 200);
Width = 40.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 220; Top = (100, 150, 250); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Logika2, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var t:boolean;
a,b:integer;
begin a:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(a);
b:=StrToIntDef(Edit2.Text,1);Edit2.Text:=IntToStr(b);
t:=a mod b = 0;Edit3.Text:=BoolToStr(t,true);
Edit1.ReadOnly:=true;
Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који са тастатуре прихвата једну реч и једно слово, а затим
одређује дужину уписане речи и редни број уписаног слова ако је у речи.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = ЛОГИЧКИ ТИП; ClientHeight = 320; ClientWidth = 360;
Color = Teal; Font = Palatino Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, четири лабеле за комуникацију са корисником, два едита за
унос, два едита за испис резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Дужина речи и позиција; Font = BoldItalic,
22; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = 180; Top = (80, 130); Width = (170, 40);
Едити за испис резултата:
Font = Bold, Black; Left = 180; ReadOnly = True; Top = (200, 250); Width = 40.
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
89 Рачунарство и информатика за трећи разред гимназије 89
Лабеле за комуникацију
AutoSize = False; Caption = (Упишите реч, Упишите слово, Број
слова у речи, Редни број слова); Height = 34; Layout = tlCenter; Left
= 10; Top = (80, 130, 200, 250); Width = 170.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left =
230; Top = (130, 190, 270); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер String1, а
затим, двокликом мишем на тастере редом дефинисаћемо све
неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit4.Clear;
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a,b:string;
c,d:integer;
begin a:=Edit1.Text;
b:=Edit2.Text;
c:=Length(a);Edit3.Text:=IntToStr(c);
d:=Pos(b,a); Edit4.Text:=IntToStr(d);
Edit1.ReadOnly:=true;
Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који са тастатуре прихвата једну реч и цео број, а затим из
унете речи издваја са почетка и са краја речи унети број слова.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = ЛОГИЧКИ ТИП;
ClientHeight = 320; ClientWidth = 360; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, четири лабеле за кому-
никацију са корисником, два едита за унос, два едита за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Издвајање подстрингова; Font = BoldItalic, 22; Height = 50; Layout =
tlCenter.
Едити за унос:
Font = Bold, Black; Left = 180; Top = (80, 120); Width = (170, 40);
Едити за испис резултата:
Font = Bold, Black; Left = 180; ReadOnly = True; Top = (180, 220);
Width = 170.
Лабеле за комуникацију
AutoSize = False; Caption = (Упишите реч, Упишите број, Слова с почетка, Слова с краја); Height = 34;
Layout = tlCenter; Left = 10; Top = (80, 130, 200, 250); Width = 170.
Тастери за управљање:
Caption = (Издвоји, Обриши, Крај рада); Font = Bold; Height = 40; Left = (230, 50, 230); Top = (130, 270, 270);
Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер String2, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit4.Clear;
Edit1.SetFocus;
end;
• Саставити програм који са тастатуре прихвата једну реч и два слова, а затим у
унетој речи на клик тастера прво уписано слово (ако постоји у речи) замењује другим
уписаним словом.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = ЛОГИЧКИ ТИП;
ClientHeight = 320; ClientWidth = 360; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, четири лабеле за кому-
никацију са корисником, три едита за унос, едит за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Издвајање подстрингова; Font = BoldItalic, 22; Height = 50; Layout
= tlCenter.
Едити за унос:
Font = Bold, Black; Left = 180; Top = (70, 120, 170); Width = (170, 40, 40);
Едит за испис резултата:
Font = Bold, Black; Left = 180; ReadOnly = True; Top = 220; Width = 170.
Лабеле за комуникацију
AutoSize = False; Caption = (Упишите реч, Мења се слово, Мења се слово, Нова реч); Height = 34; Layout =
tlCenter; Left = 10; Top = (80, 130, 200, 250); Width = 170.
Тастери за управљање:
Caption = (Замени, Обриши, Крај рада); Font = Bold; Height = 40; Left = 230; Top = (120, 170, 270); Width =
120.
Сачуваћемо дизајнирану форму у креирани фолдер String3, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit3.Clear;Edit4.Clear;
Edit1.SetFocus;
end;
Двоклик на тастер Замени:
procedure TForm1.Button1Click(Sender: TObject);
var b,c:string;
n,m:integer;
begin b:=Edit2.Text;c:=Edit3.Text;
m:=Length(a); n:=Pos(b,a);
Delete(a,n,1);Insert(c,a,n);
a:=Copy(a,length(a)-m+1,m);Edit4.Text:=a;
Button2.SetFocus;
end;
Реч a мора да се чита изван радне процедуре, иначе ће се само прво појављивање
изабраног слова мењати другим словом. То ћемо остварити процедуром која представља
реакцију на излазак из првог едита - Edit1Exit, кликнемо једном на први едит, па у прозору
Object Inspector на листићу Events пронађемо догађај OnExit. Двокликом у поље вредности
дефинисаћемо процедуру:
procedure TForm1.Edit1Exit(Sender: TObject);
begin a:=Edit1.Text;
Edit1.ReadOnly:=true;
end;
Да би се вредност променљиве a преносила из процедуре у процедуру она мора бити глобална, тј. на
почетку програма у делу за декларације који почиње службеном речи Var треба да додамо декларацију:
a:string;
• Саставити програм који са тастатуре прихвата једну реч, а затим на клик тастера
у унетој речи прво слово премешта на крај речи.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = ЛОГИЧКИ ТИП;
ClientHeight = 240; ClientWidth = 360; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, лабелу за комуни-
кацију са корисником, едит за унос и испис резултата и три
тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Пре
мештање слова; Font = BoldItalic, 22; Height = 50; Layout = tlCenter.
Едит за унос и испис:
Font = Bold, Black; Left = 180; Top = 70; Width = 170;
Лабеле за комуникацију
AutoSize = False; Caption = Упишите реч; Height = 34; Layout = tlCenter; Left = 10; Top =70; Width = 170.
Тастери за управљање:
Caption = (Премести, Обриши, Крај рада); Font = Bold; Height = 40; Left = (60, 230, 230); Top = (120, 120, 180);
Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер String4, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit1.SetFocus;
end;
Двоклик на тастер Премести:
procedure TForm1.Button1Click(Sender: TObject);
var a:string;
begin a:=Edit1.Text;
Edit1.ReadOnly:=true;
a:=Copy(a,2,length(a)-1)+Copy(a,1,1);
Edit1.Text:=a;
Button2.SetFocus;
end;
Сачуваћемо дизајнирану форму у креирани фолдер String5, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двоклик на тастер Крај рада:
procedure TForm1.Button4Click(Sender: TObject);
begin Application.Terminate;
end;
Двоклик на тастер Обриши:
procedure TForm1.Button3Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;
Button1.Visible:=true;
Button2.Visible:=false;
Label3.Caption:='Сва велика';
Edit1.SetFocus;
end;
Двоклик на тастер Button1 у прозору ObjectTreeView (јер је овај тастер можда преклопљен другим):
procedure TForm1.Button1Click(Sender: TObject);
var a:string;
begin a:=Edit1.Text;
Edit1.ReadOnly:=true;
a:=UpperCase(a);Edit2.Text:=a;
Button1.Visible:=false;
Button2.Visible:=true;
Label3.Caption:='Сва велика';
Button3.SetFocus;
end;
Двоклик на тастер Button2 у прозору ObjectTreeView (јер је овај тастер можда преклопљен првим):
procedure TForm1.Button2Click(Sender: TObject); // тастер одреди2
var a:string;
begin a:=Edit1.Text;
Edit1.ReadOnly:=true;
a:=LowerCase(a);Edit2.Text:=a;
Button1.Visible:=true;
Button2.Visible:=false;
Label3.Caption:='Сва мала';
Button3.SetFocus;
end;
Наредбе гранања
Под гранањем у програмирању подразумевамо ситуацију када се једна или више наредби
може, али и не мора извршити у зависности од неког услова.
Наредбе гранања се, често, зову и наредбама преласка, па у том смислу, оне могу бити
условне и безусловне. Ако извршење неке наредбе или групе наредби зависи од неког услова
онда је то наредба условног преласка, у противном је то наредба безусловног преласка.
Наредба безусловног преласка је GOTO наредба, али она није структурисана.
Наредбе условног преласка су структурисане и могу бити:
• If наредба
• Case наредба
If наредба је наредба гранања са највише две гране, док Case наредба може имати
највише 256 грана. Наредба If је општија, односно, сваки задатак са гранањем може се решити
њеним коришћењем. Обрнуто не важи, тј. постоје задаци који се могу решити коришћењем If
наредбе, а не могу се решити помоћу Case наредбе. IF наредба се користи када у зависности од
неког услова треба извршити један од највише два посла.
Синтакса наредбе If
Наредба If може бити потпуна и непотпуна. Потпуна је ако
има обе гране, а непотпуна ако има само једну грану.
Општи облик потпуне If наредбе је:
IF <uslov> THEN <naredba>
ELSE <naredba>;
Општи облик непотпуне If наредбе је:
IF <uslov> THEN <naredba>;
Ако је потребно да се изврши група наредби иза службене речи 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.
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
94 Рачунарство и информатика за трећи разред гимназије 94
У оквиру наредби било које од грана IF наредбе може се наћи друга или више других IF
наредби. У том случају треба водити рачуна о томе да се програмски преводилац, када наиђе
на службену реч Else, враћа све до прве претходне службене речи IF и затвара је. Ако су све IF
наредбе потпуне неће бити проблема са ужљебљењем. Али ако су неке од наредби непотпуне,
(код програмера) може доћи до забуне (што може довести до алгоритамске грешке или до
добијања чудних, неочекиваних резултата у раду програма). У таквим случајевима,
ужљебљене непотпуну IF наредбу у Then грани, обавезно, треба писати у оквиру наредбе
састављања (без обзира на то што се, можда, у тој грани извршава само једна наредба):
IF <uslov1>
THEN Begin IF <uslov2>
THEN <naredba1>;
End
ELSE <naredba2>;
<naredba3>;
Ако би се изоставила наредба састављања у случају да није испуњен <услов2> извршила
би се <наредба2> иза службене речи Else, а у случају неиспуњења првог услова извршила би се
прва наредба испод службене речи Else што би било логичка грешка и довело би до грешке у
неким резултатима програма, овако, у случају да тај <услов2> није испуњен, прелази се на
<наредбу3>.
У случају да се непотпуна IF наредба налази иза службене речи Else наредба састављања
није неопходна (али се може користити), јер је онда сасвим јасно која се наредба извршава у
случају да неки од услова није испуњен:
IF <uslov>
THEN <naredba1>
ELSE IF <uslov2>
THEN <naredba2>;
<naredba3>;
Алгоритми са гранањем
• одређивање минимума и максимума два и три броја
Одређивање већег или мањег од два уписана броја је најједноставнији пример употребе
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;
end;
Нешто је тежи случај када треба одредити најмањи или највећи од три уписана броја јер
се морају упоређивати три броја сваки са сваким. То значи да у овом случају имамо најмање
две If наредбе. И овде ћемо користити додатну променљиву јер је поступак једноставније
објаснити.
• Одређивање највећег од три броја:
If а>b // већи од бројева a и b проглашавамо највећим
then max:=a
else max:=b;
Ако би требало бројеве уредити у опадајући (односно, нерастући) поредак, једина измена
била би промена релације веће у мање (или се бројеви уреде као у претходном примеру, а
исписују се обрнутим редоследом). Следећи низ наредби уређује бројеве у такав поредак:
If a<b
then begin pom:=a;a:=b;b:=pom;
end;
If a<c
then begin pom:=a;a:=c;c:=pom;
end;
If b<c
then begin pom:=b;b:=c;c:=pom;
end;
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.';
end;
Задаци са гранањем
Сачуваћемо дизајнирану форму у креирани фолдер Paran, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Label4.Caption:=' ';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a:string;
b,c:integer;
begin b:=StrToIntDef(Edit1.Text,0); Edit1.Text:=IntToStr(b);
c:=StrToIntDef(Edit2.Text,0); Edit2.Text:=IntToStr(c);
If b mod c=0
then a:='Број '+IntToStr(b)+' је дељив бројем '+IntToStr(c)+'.'
else If c mod b=0
then a:='Број '+IntToStr(c)+' је дељив бројем '+IntToStr(b)+'.'
else a:='Бројеви нису дељиви.';
Label4.Caption:=a;
Edit1.ReadOnly:=true;
Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Едит за унос:
Font = Bold, Black; Left = 200; MaxLength = 2; Top = 80; Width = 120.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ;
Font = 22, Lime; Height = 80; Layout = tlCenter.
Лабела за комуникацију са корисником:
AutoSize = False; Caption = Упишите цео број; Height = 36; Layout =
tlCenter; Left = 20; Top = 80; Width = 190.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40;
Left = (20, 210, 210); Top = (150, 150, 210); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Prestupna, а
затим, двокликом мишем на тастере редом дефинисаћемо све
неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом
се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Label3.Caption:=' ';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a:string;g:integer;
begin g:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(g);
If (g mod 4=0)and(g mod 100<>0)or(g mod 400=0)
then a:=IntToStr(g)+'. година'+#13+'је преступна.'
else a:=IntToStr(g)+'. година'+#13+'није преступна.';
Label3.Caption:=a;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Edit2.Clear;Edit2.ReadOnly:=false;
Label4.Caption:=' ';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a:string;
b,c:real;
begin b:=StrToFloatDef(Edit1.Text,1);Edit1.Text:=FloatToStr(b);
c:=StrToFloatDef(Edit2.Text,2);Edit2.Text:=FloatToStr(c);
a:=Format('%-27s'+#13+'%1.2f',['Једначина',b])+#183+'х';
If c>=0 then a:=a+' + ';
a:=a+Format('%1.2f',[Abs(c)])+' = 0'+#13;
If b=0
then If c=0
then a:=a+'је неодређена.'
else a:=a+'је немогућа.'
else a:=a+'има решење х = '+Format('%1.2f',[-c/b]);
Label4.Caption:=a;
end;
У испису решењу смо користили ASCII кодове #13, за прелазак у нови ред и #183 за ознаку множења.
као и формат '%-30s' за лево уређење стринга.
• Саставити програм који одређује решење система од две линеарне једначине са две
непознате.
Посматраћемо систем од две линеарне једначине са две непознате у општем a1 x b1 y c1
облику. За налажење решења применићемо методу детерминанти (исте
формуле за решење добијају се и применом неке друге методе, али је овако a 2 x b 2 y c 2
једноставније објаснити поступак решавања система). a1 b1
Ако је детерминанта система различита од нуле (D0) D a1 b 2 a 2 b1
a2 b2
систем има јединствено решење: x = Dx / D и y = Dy / D.
Ако је детерминанта система једнака нули (D = 0) и бар једна од детерминанти c1 b1
Dx c1 b 2 c2 b1
по х или по у је различита од нуле (Dx 0 или Dy 0) c2 b2
систем је немогућ, односно, нема решења, у противном систем је
неодређен, односно, има бесконачно много решења. a1 c1
Dy a1 c2 a 2 c1
Подесићемо карактеристике форме на следећи начин: a 2 c2
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 380; ClientWidth = 400; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, шест лабела за комуни-
кацију са корисником, шест едита за унос, лабелу за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Линеарни систем; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (65, 190, 315); Top = (80, 120); Width = 70.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ;
Font = 22, Lime; Height = 170; Layout = tlCenter.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (a1 =, b1 =, c1 =, a2 =, b2 =, c2 =); Height = 36;
Layout = tlCenter; Left = (20, 145, 270); Top = (80, 120); Width = 40.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (15, 140, 265); Top = 170; Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Sistem, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Edit4.Clear;Edit4.ReadOnly:=false;
Edit5.Clear;Edit5.ReadOnly:=false;
Edit6.Clear;Edit6.ReadOnly:=false;
Label8.Caption:=' ';
Edit1.SetFocus;
end;
• Саставити програм који одређује решење система од три линеарне једначине са три
непознате.
Посматраћемо систем од три линеарне једначине са три непознате a1 x b1 y c1 z d1
у општем облику: a2 x b2 y c2 z d 2
За налажење решења система применићемо методу детерминанти. a x b y c z d
3 3 3 3
Одредићемо детерминанту система и детерминанте променљивих. a1 b1 c1
Ако је детерминанта система различита од нуле (D 0) систем b c b c b c
D a2 b2 c2 a1 2 2 a2 1 1 a3 1 1
има јединствено решење. b3 c3 b3 c3 b2 c2
a3 b3 c3
Ако је детерминанта система једнака нули (D = 0) и бар једна од
детерминанти Dx, Dy и Dz је различита од нуле (Dx 0, Dy 0 или d1 b1 c1
b c b c b c
Dz 0) систем је немогућ. Dx d 2 b2 c2 d1 2 2 d2 1 1 d3 1 1
b3 c3 b3 c3 b2 c2
Ако је детерминанта система једнака нули (D = 0) и ако су све d3 b3 c3
детерминанте променљивих једнаке нули (Dx = 0, Dy = 0 и Dz = 0) a1 d1 c1
онда се мора применити метода елиминације (Гаусова или нека d c d c d c
Dy a2 d2 c2 a1 2 2 a2 1 1 a3 1 1
друга) да би смо утврдили да ли систем има бесконачно решења a3 d3 c3
d3 c3 d3 c3 d 2 c2
или нема решења. Овај део анализе је (у овом тренутку за нас)
мало теже испрограмирати, па ћемо у том случају само исписати a1 b1 d1
b d2 b d b d
поруку да систем нема једнозначно решење, односно, да је можда Dz a2 b2 d 2 a1 2 a2 1 1 a3 1 1
b3 d3 b3 d3 b2 d 2
неодређен или немогућ. a3 b3 d3
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 380; ClientWidth = 400; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, дванаест лабела за
комуникацију са корисником, дванаест едита за унос, лабелу за
испис резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Линеарни систем; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (55, 160, 265, 370); Top = (80, 120, 160);
Width = 50.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ;
Font = Lime; Height = 150; Layout = tlCenter.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (a1 =, b1 =, c1 =, d1 =, a2 =, b2 =, c2 =, d2 =, a3 =, b3 =, c3 =, d3); Height = 36; Layout
= tlCenter; Left = (10, 115, 220, 315); Top = (80, 120, 160); Width = 45.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (15, 140, 265); Top = 170; Width =
120.
Сачуваћемо дизајнирану форму у креирани фолдер Sistem, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit2.Clear;Edit3.Clear;
Edit4.Clear;Edit5.Clear;Edit6.Clear;
Edit7.Clear;Edit8.Clear;Edit9.Clear;
Edit10.Clear;Edit11.Clear;Edit12.Clear;
Label14.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3,d,dx,dy,dz:real;
begin a1:=StrToFloatDef(Edit1.Text,1); Edit1.Text:=FloatToStr(a1);
b1:=StrToFloatDef(Edit2.Text,2); Edit2.Text:=FloatToStr(b1);
c1:=StrToFloatDef(Edit3.Text,3); Edit3.Text:=FloatToStr(c1);
d1:=StrToFloatDef(Edit4.Text,4); Edit4.Text:=FloatToStr(d1);
a2:=StrToFloatDef(Edit5.Text,5); Edit5.Text:=FloatToStr(a2);
b2:=StrToFloatDef(Edit6.Text,6); Edit6.Text:=FloatToStr(b2);
c2:=StrToFloatDef(Edit7.Text,7); Edit7.Text:=FloatToStr(c2);
d2:=StrToFloatDef(Edit8.Text,8); Edit8.Text:=FloatToStr(d2);
a3:=StrToFloatDef(Edit9.Text,9); Edit9.Text:=FloatToStr(a3);
b3:=StrToFloatDef(Edit10.Text,1);Edit10.Text:=FloatToStr(b3);
c3:=StrToFloatDef(Edit11.Text,2);Edit11.Text:=FloatToStr(c3);
d3:=StrToFloatDef(Edit12.Text,3);Edit12.Text:=FloatToStr(d3);
s:=Format('%-30s'+#13+'%1.2f',['Линеарни систем',a1])+#183+'х';
If b1>=0 then s:=s+'+';
s:=s+Format('%1.2f'#183'y',[b1]);
If c1>=0 then s:=s+'+';
s:=s+Format('%1.2f'#183'z=%1.2f'#13'%1.2f'#183'х',[c1,d1,a2]);
If b2>=0 then s:=s+'+';
s:=s+Format('%1.2f'#183'y',[b2]);
If c2>=0 then s:=s+'+';
s:=s+Format('%1.2f'#183'z=%1.2f'#13'%1.2f'#183'х',[c2,d2,a3]);
If b3>=0 then s:=s+'+';
s:=s+Format('%1.2f'#183'y',[b3]);
If c3>=0 then s:=s+'+';
s:=s+Format('%1.2f'#183'z=%1.2f'#13,[c3,d3]);
d:=a1*b2*c3-a1*b3*c2-a2*b1*c3+a2*b3*c1+a3*b1*c2-a3*b2*c1;
dx:=d1*b2*c3-d1*b3*c2-d2*b1*c3+d2*b3*c1+d3*b1*c2-d3*b2*c1;
dy:=a1*d2*c3-a1*d3*c2-a2*d1*c3+a2*d3*c1+a3*d1*c2-a3*d2*c1;
dz:=a1*b2*d3-a1*b3*d2-a2*b1*d3+a2*b3*d1+a3*b1*d2-a3*b2*d1;
If d=0
then If (dx<>0)or(dy<>0)or(dz<>0)
then s:=s+'је немогућ.'
else s:=s+'је неодређен или немогућ.'
else s:=s+Format('%-30s'#13'х=%1.2f'#13'y=%1.2f'#13'z=%1.2f',
['има решење',dx/d,dy/d,dz/d]);
Label3.Caption:=s;
end;
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (10, 140, 250); Top = (130, 130,
180); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Kvadratna, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Label5.Caption:=' ';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
a,b,c,d,x:real;
begin a:=StrToFloatDef(Edit1.Text,1); Edit1.Text:=FloatToStr(a);
b:=StrToFloatDef(Edit2.Text,2); Edit2.Text:=FloatToStr(b);
c:=StrToFloatDef(Edit3.Text,1); Edit3.Text:=FloatToStr(c);
s:=Format('%-27s'#13'%1.2f'#183'х2',['Решења једначине',a]);
If b>=0 then s:=s+'+';
s:=s+Format('%1.2f'#183'x',[b]);
If c>=0 then s:=s+'+';
s:=s+Format('%1.2f = 0'#13,[c]);
d:=b*b-4*a*c; x:=Sqrt(Abs(d));
If d=0
then s:=s+Format('%-27s'#13'%-10s%1.2f',['су реална и једнака:','х1 = x2 =',-b/2/a])
else If d>0
then s:=s+'су реална и различита: '+#13+' х1 = '
+Format('%1.2f'#13' х2 = %1.2f',[(-b+x)/2/a,(-b-x)/2/a])
else s:=s+'су коњуговано комплексна: '+#13+' х1 = '
+Format('%1.2f+%1.2f'#183'i'#13' х2 = ',[-b/2/a,x/2/a])
+Format('%1.2f-%1.2f'#183'i',[-b/2/a,x/2/a]);
Label5.Caption:=s;
Edit1.ReadOnly:=true;
Edit2.ReadOnly:=true;
Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује квадрант у коме се налази дата тачка у равни.
Раван је двема ортогоналним правама подељена на четири дела, квадранта. У зависности од знака
координата тачке пронаћи ћемо њен положај.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 300; ClientWidth = 380; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, две лабеле за комуни-
кацију са корисником, два едита за унос, лабелу за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Координатна раван; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = 70; Top = (80, 130); Width = 50.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ; Font = Lime; Height = 70; Layout = tlCenter.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (х =, у =); Height = 36; Layout = tlCenter; Left = 30; Top = (80, 130); Width = 40.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (150, 150, 250); Top = (80, 130,
180); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Kvadranti, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Label3.Caption:='';
Edit1.SetFocus;
end;
• Саставити програм који одређује октант у коме се налази дата тачка у простору.
Простор је трима ортогоналним равнима подељен на осам делова, октанта. У пресеку сваке две равни
налазе се координатне осе. У зависности од знака координата тачке одредићемо и записати њен положај
у координатном простору.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 300; ClientWidth = 380; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, три лабеле за комуни-
кацију са корисником, три едита за унос, лабелу за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Координатни простор; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = 70; Top = (80, 130, 180); Width = 50.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ;
Font = Lime; Height = 70; Layout = tlCenter.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (х =, у =, z =); Height = 36; Layout = tlCenter; Left = 30; Top = (80, 130, 180); Width
= 40.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (150, 150, 250); Top = (80, 130,
180); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Oktanti, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Label5.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a:string;
x,y,z:real;
begin x:=StrToFloatDef(Edit1.Text,1); Edit1.Text:=FloatToStr(x);
y:=StrToFloatDef(Edit2.Text,2); Edit2.Text:=FloatToStr(y);
z:=StrToFloatDef(Edit3.Text,3); Edit3.Text:=FloatToStr(z);
a:=Format('Тачка А(%1.2f;%1.2f;%1.2f)'#13'налази се ',[x,y,z]);
If x=0
then If y=0
then If z=0
then a:=a+'у координатном почетку.'
else a:=a+'на z-оси.'
else If z=0
then a:=a+'на у-оси.'
else a:=a+'у y-z равни.'
else If y=0
then If z=0
then a:=a+'на x-оси.'
else a:=a+'у x-z равни.'
else If z=0
then a:=a+'у x-y равни.'
else If z>0
then If x>0
then If y>0
then a:=a+'у првом октанту.'
else a:=a+'у другом октанту.'
else If у>0
then a:=a+'у четвртом октанту.'
else a:=a+'у трећем октанту.'
else If x>0
then If y>0
then a:=a+'у петом октанту.'
else a:=a+'у шестом октанту.'
else If у>0
then a:=a+'у осмом октанту.'
else a:=a+'у седмом октанту.';
Label5.Caption:=s;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који три унета броја уређује у неопадајући (нерастући) поредак.
Да бисмо решили овај задатак одредићемо најпре најмањи од унетих бројева, а затим ћемо преостала
два уредити по величини. Идеја је да најмањи број буде први, зато ћемо упоређивати први и други, па, ако
је први већи од другог, заменићемо им места. Затим ћемо упоређивати први и трећи и, ако је први већи,
заменићемо им место. Сада је први број са најмањи (јер је мањи и од другог и од трећег), па сада треба
упоређивати други и трећи број и, ако је други већи од трећег, заменићемо им места. За размену
вредности две променљиве користићемо помоћну променљиву која ће привремено чувати вредност
прве променљиве да би она могла преузети вредност друге, а да се при томе не изгуби њена првобитна
вредност. То значи да се замена вредности две променљиве обавља кроз три наредбе: (помоћна
променљива узима вредност прве променљиве) p:=a; (прва променљива узима вредност друге
променљиве) a:=b; (друга променљива узима вредност помоћне променљиве, тј. претходну вредност
прве променљиве) b:=p; Ово је стандардна процедура замене вредности две променљиве.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 300; ClientWidth = 380; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, три лабеле за комуника-
цију са корисником, три едита за унос, лабелу за испис резултата
и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Сортирање; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = 70; Top = (80, 130, 180); Width = 50.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ;
Font = Lime; Height = 70; Layout = tlCenter.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (a =, b =, c =); Height = 36; Layout = tlCenter; Left = 30; Top = (80, 130, 180); Width
= 40.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (150, 150, 250); Top = (80, 130,
180); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Rastuci, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Label5.Caption:='';
Edit1.SetFocus;
end;
Све променљиве које смо употребили декларисане су као глобалне у заглављу програма:
var
Form1: TForm1;
sp,mp,sk,mk,t:integer;
Контролу уноса времена остварили смо у процедурама које су реакција на излазак из одговарајућег едита
(селектујемо сваки едит, у прозору ObjectInspector на листићу Events двоклик на поље вредности догађаја
OnExit декларише одговарајућу процедуру коју дефинишемо):
procedure TForm1.Edit1Exit(Sender: TObject);
begin sp:=StrToIntDef(Edit1.Text,0);
If (sp<0)or(sp>23)
then begin Edit1.Clear;Edit1.SetFocus;
end
else Edit1.Text:=IntToStr(sp);
end;
procedure TForm1.Edit2Exit(Sender: TObject);
begin mp:=StrToIntDef(Edit2.Text,0);
If (mp<0)or(mp>59)
then begin Edit2.Clear;Edit2.SetFocus;
end
else Edit2.Text:=IntToStr(mp);
end;
procedure TForm1.Edit3Exit(Sender: TObject);
begin sk:=StrToIntDef(Edit3.Text,0);
If (sk<0)or(sk>23)
then begin Edit3.Clear;Edit3.SetFocus;
end
else Edit3.Text:=IntToStr(sk);
end;
procedure TForm1.Edit4Exit(Sender: TObject);
begin mk:=StrToIntDef(Edit4.Text,0);
If (mk<0)or(mk>59)or(sp=sk)and(mp>mk)
then begin Edit4.Clear;Edit4.SetFocus;
end
else Edit4.Text:=IntToStr(mk);
end;
Уведене контроле нису толерантне. Податак који се уноси мора бити логично исправан у односу на
претходно унете, чак и ако је претходни податак погрешно унет. Тек када се унесе исправан податак
може се променити претходни.
• Саставити програм који одређује комплемент и суплемент угла датог у степенима
минутима и секундама.
Да би се коректно решио задатак потребно је увести контролу уноса угла (мора бити мањи или једнак
90 степени да би се могао наћи комплемент). Угао ћемо претворити у секунде, а затим ћемо комплемент
добити као допуну до 90*3600 секунди. Суплемент је за 90 степени већи.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 330; ClientWidth = 370; Color = Teal; Font
= Palatino Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop;
Position = poScreenCenter.
На форму ћемо ставити лабелу за наслов, три лабеле за комуни-
кацију са корисником, три едита за унос, шест едита за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Комп
лемент и суплемент; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (170, 230, 270); MaxLength =2; Top = 80;
Width = (50, 40, 40).
Едит за испис резултата:
Font = Bold, Black; Left = (170, 230, 270); ReadOnly = True; Top =
(130, 180); Width = (50, 40, 40).
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (Угао :, Комплемент :, Суплемент :); Height = 36; Layout = tlCenter; Left = 20;
Top = (80, 130, 180); Width = 150.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (20, 150, 230); Top = (230, 230,
280); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер KompSup, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
• Дата су три угла у степенима минутима и секундама. Саставити програм који одређује
да ли они могу бити углови троугла и ако могу да ли је троугао оштроугли, правоугли
или тупоугли.
Први услов који три угла морају испуњавати је да им је збир 180
степени, али то није довољно. Да би био оштроугли троугао сва
три угла морају бити оштра. Да би троугао био правоугли један
угао мора бити прав, а остала два оштра. Да би троугао био
тупоугли један угао мора бити туп, а остала два оштра. Код уноса
углова није потребно уводити претходну контролу уноса јер је
садржана у каснијим условима.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 330; ClientWidth = 370; Color = Teal; Font
= Palatino Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop;
Position = poScreenCenter.
На форму ћемо ставити лабелу за наслов, три лабеле за комуни-
кацију са корисником, девет едита за унос, лабелу за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Три угла; Font = 22, Lime; Height = 50;
Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (170, 230, 270); MaxLength = (3, 2, 2); Top = (80, 130, 180); Width = (50, 40, 40).
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ; Font = Lime; Height = 70; Layout = tlCenter.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (a =, b =, g =); Font = Symbol; Height = 36; Layout = tlCenter; Left = 20; Top = (80,
130, 180); Width = 50.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 230; Top = (80, 130, 220); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Uglovi, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Edit4.Clear;Edit4.ReadOnly:=false;
Edit5.Clear;Edit5.ReadOnly:=false;
Edit6.Clear;Edit6.ReadOnly:=false;
Edit7.Clear;Edit7.ReadOnly:=false;
Edit8.Clear;Edit8.ReadOnly:=false;
Edit9.Clear;Edit9.ReadOnly:=false;
Label5.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
a1,b1,c1,a2,b2,c2,a3,b3,c3:integer;
begin a1:=StrToIntDef(Edit1.Text,60);Edit1.Text:=IntToStr(a1);
a2:=StrToIntDef(Edit2.Text,0); Edit2.Text:=IntToStr(a2 mod 60);
a3:=StrToIntDef(Edit3.Text,0); Edit3.Text:=IntToStr(a3 mod 60);
b1:=StrToIntDef(Edit4.Text,60);Edit4.Text:=IntToStr(b1);
b2:=StrToIntDef(Edit5.Text,0); Edit5.Text:=IntToStr(b2 mod 60);
b3:=StrToIntDef(Edit6.Text,0); Edit6.Text:=IntToStr(b3 mod 60);
c1:=StrToIntDef(Edit7.Text,60);Edit7.Text:=IntToStr(c1);
c2:=StrToIntDef(Edit8.Text,0); Edit8.Text:=IntToStr(c2 mod 60);
c3:=StrToIntDef(Edit9.Text,0); Edit9.Text:=IntToStr(c3 mod 60);
a3:=a1*3600+a2*60+a3;
b3:=b1*3600+b2*60+b3;
c3:=c1*3600+c2*60+c3;
s:='Не могу бити углови троугла.';
If a3+b3+c3=180*3600
then If (a3=90*3600)and(b3<90*3600)and(c3<90*3600)xor
(a3<90*3600)and(b3=90*3600)and(c3<90*3600)xor
(a3<90*3600)and(b3<90*3600)and(c3=90*3600)
then s:='Могу бити углови троугла,'+#13+'- правоугли.'
else If (a3>90*3600)and(b3<90*3600)and(c3<90*3600)xor
(a3<90*3600)and(b3>90*3600)and(c3<90*3600)xor
(a3<90*3600)and(b3<90*3600)and(c3>90*3600)
then s:='Могу бити углови троугла,'+#13+'- тупоугли.'
else If (a3<90*3600)and(b3<90*3600)and(c3<90*3600)
then s:='Могу бити углови троугла,'+#13+'- оштроугли.';
Label5.Caption:=s;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Edit4.ReadOnly:=true;Edit5.ReadOnly:=true;Edit6.ReadOnly:=true;
Edit7.ReadOnly:=true;Edit8.ReadOnly:=true;Edit9.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује да ли три уписана броја могу бити мерни бројеви
страница троугла и ако могу, какав је тај троугао.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ ГРАНАЊА; ClientHeight = 350; ClientWidth =
350; Font = Palatino Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position = poScreenCenter.
На форму ћемо ставити лабелу за наслов, три лабеле за комуникацију са корисником, три едита за унос,
лабелу за испис резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Сортирање; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = 80; Top = (80, 130, 180); Width = 100.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ;
Font = Lime; Height = 80; Layout = tlCenter.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (a =, b =, c =); Height = 36; Layout =
tlCenter; Left = 40; Top = (80, 130, 180); Width = 40.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40;
Left = 200; Top = (80, 130, 180); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Stranice, а
затим, двокликом мишем на тастере редом дефинисаћемо све
неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Label5.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a:string;
b,c,d,p:real;
begin b:=StrToFloatDef(Edit1.Text,1);Edit1.Text:=FloatToStr(b);
c:=StrToFloatDef(Edit2.Text,3);Edit2.Text:=FloatToStr(c);
d:=StrToFloatDef(Edit3.Text,2);Edit3.Text:=FloatToStr(d);
If (b+c>d)and(c+d>b)and(d+b>c)
then begin If b>c
then begin p:=c;c:=b;b:=p;
end;
If c>d
then begin p:=c;c:=d;d:=p;
end;
If d*d<c*c+b*b
then a:='Ово су странице оштроуглог троугла.'
else If d*d=c*c+b*b
then a:='Ово су странице правоуглог троугла.'
else a:='Ово су странице тупоуглог троугла.';
end
else a:='Не могу бити странице троугла.';
Label3.Caption:=a;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује трећу страницу, два висине и углове троугла ако су
дате две странице и висина на једну од њих.
Применићемо Питагорину теорему за два правоугла троугла на које почетни троугао дели висина и
добићемо трећу страницу. Одредићемо висине троугла из обрасца за површину. а затим и обим и
површину троугла. За углове ћемо прво одредити sin и cos, а затим помоћу ArcTan углове у секундама.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = РЕАЛНИ ТИП; ClientHeight = 370; ClientWidth = 440;
Color = Teal; Font = Palatino Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position = poScreenCenter.
На форму ћемо ставити лабелу за наслов, четрнаест лабела за комуникацију са корисником, три едита
за унос, седамнаест едита за испис резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Решавање троугла; Font = 22, Lime; Height
= 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = 75; Top = (70, 110, 150); Width = 70.
Едити за испис страница и висина:
Font = Bold, Black; Left = (215, 345); ReadOnly = True; Top = (70,
110, 150); Width = 70.
Едити за испис обима и површине:
Font = Bold, Black; Left = (215, 335); ReadOnly = True; Top = 190;
Width = 80.
Едити за испис углова:
Font = Bold, Black; Left = (215, 270, 315); ReadOnly = True; Top =
(230, 270, 310); Width = (50, 40, 40).
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (a =, b =, ha =, a =, b =, c =, ha =, hb =, hc =,
O =, P =); Height = 36; Layout = tlCenter; Left = (75, 150, 270); Top =
(70, 110, 150, 70, 110, 150, 70, 110, 150, 190, 190); Width = 35.
Лабеле углова:
AutoSize = False; Caption = (a =, b =, g =); Font = Symbol, BoldItalic, 16, Aqua; Height = 36; Layout = tlCenter;
Left = 180; Top = (230, 270, 310); Width = 35.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 30; Top = (205, 255, 305); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер DveStranice, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Edit4.Clear;Edit5.Clear;Edit6.Clear;Edit7.Clear;Edit8.Clear;
Edit9.Clear; Edit10.Clear;Edit11.Clear;Edit12.Clear;
Edit13.Clear;Edit14.Clear;Edit15.Clear;Edit16.Clear;
Edit17.Clear;Edit18.Clear;Edit19.Clear;Edit20.Clear;
Edit1.SetFocus;;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,h1,h2,h3,p,o,x,y:real;
a1,a2,a3,b1,b2,b3,c1,c2,c3:integer;
begin a:=StrToFloatDef(Edit1.Text,6);Edit1.Text:=FloatToStr(a);
b:=StrToFloatDef(Edit2.Text,6);Edit2.Text:=FloatToStr(b);
h1:=StrToFloatDef(Edit3.Text,3);Edit3.Text:=FloatToStr(h1);
If b<h1 // страница b је хипотенуза у помоћном троуглу и мора бити већа од катета
then begin Application.MessageBox('Не може бити троугао!','ГРЕШКА У УНОСУ',0);
Button2.Click;
end
else begin x:=Sqrt(b*b-h1*h1); // одсечци на које висина дели страницу a
y:=a-x;
Edit4.Text:=Format('%7.3f',[a]);
Edit5.Text:=Format('%7.3f',[b]);
c:=Sqrt(y*y+h1*h1);Edit6.Text:=Format('%7.3f',[c]);
Edit7.Text:=Format('%7.3f',[h1]);
h2:=a*h1/b;Edit8.Text:=Format('%7.3f',[h2]);
h3:=a*h1/c;Edit9.Text:=Format('%7.3f',[h3]);
o:=a+b+c;Edit10.Text:=Format('%7.3f',[o]);
p:=a*h1/2;Edit11.Text:=Format('%7.3f',[p]);
If y=0 // странице a и b су нормалне, угао је прав
then b3:=90*3600
else b3:=Round(ArcTan(h1/y)/pi*180*3600);
If x=0 // странице a и c су нормалне, угао је прав
then c3:=90*3600
else c3:=Round(ArcTan(h1/x)/pi*180*3600);
a3:=180*3600-b3-c3;
a1:=a3 div 3600; Edit12.Text :=IntToStr(a1);
a2:=a3 div 60 mod 60;Edit13.Text:=IntToStr(a2);
a3:=a3 mod 60; Edit14.Text:=IntToStr(a3);
b1:=b3 div 3600; Edit15.Text:=IntToStr(b1);
b2:=b3 div 60 mod 60;Edit16.Text:=IntToStr(b2);
b3:=b3 mod 60; Edit17.Text:=IntToStr(b3);
c1:=c3 div 3600; Edit18.Text:=IntToStr(c1);
c2:=c3 div 60 mod 60;Edit19.Text:=IntToStr(c2);
c3:=c3 mod 60; Edit20.Text:=IntToStr(c3);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
end;
• Саставити програм који одређује две странице, висину и углове троугла ако су дате
две висине и трећа страница троугла
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = РЕАЛНИ ТИП;
ClientHeight = 370; ClientWidth = 440; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, четрнаест лабела за
комуникацију са корисником, три едита за унос, седамнаест едита
за испис резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Решавање троугла; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = 75; Top = (70, 110, 150); Width = 70.
Едити за испис страница и висина:
Font = Bold, Black; Left = (215, 345); ReadOnly = True; Top = (70,
110, 150); Width = 70.
Едити за испис обима и површине:
Font = Bold, Black; Left = (215, 335); ReadOnly = True; Top = 190; Width = 80.
Едити за испис углова:
Font = Bold, Black; Left = (215, 270, 315); ReadOnly = True; Top = (230, 270, 310); Width = (50, 40, 40).
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (a =, hb =, hc =, a =, b =, c =, ha =, hb =, hc =, O =, P =); Height = 36; Layout = tlCenter; Left =
(75, 150, 270); Top = (70, 110, 150, 70, 110, 150, 70, 110, 150, 190, 190); Width = 35.
Лабеле углова:
AutoSize = False; Caption = (a =, b =, g =); Font = Symbol, BoldItalic, 16, Aqua; Height = 36; Layout = tlCenter;
Left = 180; Top = (230, 270, 310); Width = 35.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 30; Top = (205, 255, 305); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер DveVisine, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Edit4.Clear;Edit5.Clear;Edit6.Clear;Edit7.Clear;Edit8.Clear;
Edit9.Clear; Edit10.Clear;Edit11.Clear;Edit12.Clear;
Edit13.Clear;Edit14.Clear;Edit15.Clear;Edit16.Clear;
Edit17.Clear;Edit18.Clear;Edit19.Clear;Edit20.Clear;
Edit1.SetFocus;;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,h1,h2,h3,p,o,x,y:real;
a1,a2,a3,b1,b2,b3,c1,c2,c3:integer;
begin a:=StrToFloatDef(Edit1.Text,6);Edit1.Text:=FloatToStr(a);
h2:=StrToFloatDef(Edit2.Text,6);Edit2.Text:=FloatToStr(h2);
h3:=StrToFloatDef(Edit3.Text,3);Edit3.Text:=FloatToStr(h3);
If (a<h3)or(a<h2) // a је хипотенуза у помоћним троугловима и мора бити већа од катета
then begin Application.MessageBox('Не може бити троугао!','ГРЕШКА У УНОСУ',0);
Button2.Click;
end
else begin x:=Sqrt(a*a-h3*h3); // одсечак на страници c
y:=Sqrt(a*a-h2*h2); // одсечак на страници b
If x=0 // странице a и c су нормалне, угао је прав
then begin p:=pi/2-ArcTan(h2/y);
b3:=90*3600;
c3:=Round(ArcTan(h2/y)/pi*180*3600);
end
else If y=0 // странице a и b су нормалне, угао је прав
then begin p:=pi/2-ArcTan(h3/x);
b3:=Round(ArcTan(h3/x)/pi*180*3600);
c3:=90*3600;
end
else begin p:=pi-ArcTan(h3/x)-ArcTan(h2/y);
b3:=Round(ArcTan(h3/x)/pi*180*3600);
c3:=Round(ArcTan(h2/y)/pi*180*3600);
end;
Edit4.Text:=Format('%7.3f',[a]);
b:=h3/sin(p);Edit5.Text:=Format('%7.3f',[b]);
c:=h2/sin(p);Edit6.Text:=Format('%7.3f',[c]);
h1:=b*h2/a;Edit7.Text:=Format('%7.3f',[h1]);
Edit8.Text:=Format('%7.3f',[h2]);
Edit9.Text:=Format('%7.3f',[h3]);
o:=a+b+c;Edit10.Text:=Format('%7.3f',[o]);
p:=a*h1/2;Edit11.Text:=Format('%7.3f',[p]);
a3:=180*3600-c3-b3;
a1:=a3 div 3600; Edit12.Text :=IntToStr(a1);
a2:=a3 div 60 mod 60;Edit13.Text:=IntToStr(a2);
a3:=a3 mod 60; Edit14.Text:=IntToStr(a3);
b1:=b3 div 3600; Edit15.Text:=IntToStr(b1);
b2:=b3 div 60 mod 60;Edit16.Text:=IntToStr(b2);
b3:=b3 mod 60; Edit17.Text:=IntToStr(b3);
c1:=c3 div 3600; Edit18.Text:=IntToStr(c1);
c2:=c3 div 60 mod 60;Edit19.Text:=IntToStr(c2);
c3:=c3 mod 60; Edit20.Text:=IntToStr(c3);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
end;
• Саставити програм који одређује странице, две висине и трећи угао троугла ако су
дата два угла и висина из трећег темена троугла.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = РЕАЛНИ ТИП;
ClientHeight = 370; ClientWidth = 440; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, дванаест лабела за
комуникацију са корисником, седам едита за унос, једанаест
едита за испис резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Решавање троугла; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едит за унос висине:
Font = Bold, Black; Left = 65; Top = 150; Width = 70.
Едити за испис страница и висина:
Font = Bold, Black; Left = 255; ReadOnly = True; Top = (70, 110, 150,
190, 230, 270); Width = 70.
Едити за испис обима и површине:
Font = Bold, Black; Left =380; ReadOnly = True; Top = (70, 110); Width = 80.
Едити за унос и испис углова:
Font = Bold, Black; Left = (65, 115, 155, 65, 115, 155, 215, 270, 315); ReadOnly = True; Top = (70, 70, 70, 110,
110, 110, 310, 310, 310); Width = (50, 40, 40, 50, 40, 40, 50, 40, 40).
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (hc =, a =, b =, c =, ha =, hb =, hc =, O =, P =); Height = 36; Layout = tlCenter; Left = (20, 210,
335); Top = (150, 70, 110, 150, 190, 230, 270, 70, 110); Width = 45.
Лабеле углова:
AutoSize = False; Caption = (a =, b =, g =); Font = Symbol, BoldItalic, 16, Aqua; Height = 36; Layout = tlCenter;
Left = (20, 20, 210); Top = (70, 110, 310); Width = 45.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 20; Top = (205, 255, 305); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер DvaUgla, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Edit4.Clear;Edit5.Clear;Edit6.Clear;Edit7.Clear;Edit8.Clear;
Edit9.Clear; Edit10.Clear;Edit11.Clear;Edit12.Clear;Edit13.Clear;
Edit14.Clear;Edit15.Clear;Edit16.Clear;Edit17.Clear;Edit18.Clear;
Edit1.SetFocus;;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,h1,h2,h3,p,o:real;
a1,a2,a3,b1,b2,b3,c1,c2,c3:integer;
begin a1:=StrToIntDef(Edit1.Text,9);Edit1.Text:=IntToStr(a1 mod 180);
a2:=StrToIntDef(Edit2.Text,0);Edit2.Text:=IntToStr(a2 mod 60);
a3:=StrToIntDef(Edit3.Text,0);Edit3.Text:=IntToStr(a3 mod 60);
a3:=a1*3600+a2*60+a3;
b1:=StrToIntDef(Edit4.Text,9);Edit4.Text:=IntToStr(b1 mod 180);
b2:=StrToIntDef(Edit5.Text,0);Edit5.Text:=IntToStr(b2 mod 60);
b3:=StrToIntDef(Edit6.Text,0);Edit6.Text:=IntToStr(b3 mod 60);
b3:=b1*3600+b2*60+b3;
h3:=StrToFloatDef(Edit7.Text,0);Edit7.Text:=FloatToStr(h3);
c3:=180*3600-b3-a3;
If (c3<0)or(a3<=0)or(c3<=0)// збир два унутрашња угла троугла je мањи од 180 степени
then begin Application.MessageBox('Не може бити троугао!','ГРЕШКА У УНОСУ',0);
Button2.Click;
end
else begin a:=h3/Sin(b3/180/3600*pi);Edit8.Text:=Format('%7.3f',[a]);
b:=h3/Sin(a3/180/3600*pi);Edit9.Text:=Format('%7.3f',[b]);
c:=Sqrt(b*b-h3*h3)+Sqrt(a*a-h3*h3);Edit10.Text:=Format('%7.3f',[c]);
h1:=c*Sin(b3/180/3600*pi);Edit11.Text:=Format('%7.3f',[h1]);
h2:=c*Sin(a3/180/3600*pi);Edit12.Text:=Format('%7.3f',[h2]);
Edit13.Text:=Format('%7.3f',[h3]);
o:=a+b+c; Edit14.Text:=Format('%7.3f',[o]);
p:=a*h1/2;Edit15.Text:=Format('%7.3f',[p]);
c1:=c3 div 3600; Edit16.Text:=IntToStr(c1);
c2:=c3 div 60 mod 60;Edit17.Text:=IntToStr(c2);
c3:=c3 mod 60; Edit18.Text:=IntToStr(c3);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
end;
• Саставити програм који одређује странице и углове троугла ако су дате све три
висине троугла
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = РЕАЛНИ ТИП;
ClientHeight = 370; ClientWidth = 440; Color = Teal; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, четрнаест лабела за
комуникацију са корисником, три едита за унос, седамнаест едита
за испис резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Решавање троугла; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = 75; Top = (70, 110, 150); Width = 70.
Едити за испис страница и висина:
Font = Bold, Black; Left = (215, 345); ReadOnly = True; Top = (70,
110, 150); Width = 70.
Едити за испис обима и површину:
Font = Bold, Black; Left = (215, 335); ReadOnly = True; Top = 190; Width = 80.
Едити за испис углова:
Font = Bold, Black; Left = (215, 270, 315); ReadOnly = True; Top = (230, 270, 310); Width = (50, 40, 40).
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (ha =, hb =, hc =, a =, b =, c =, ha =, hb =, hc =, O =, P =); Height = 36; Layout = tlCenter; Left
= (75, 150, 270); Top = (70, 110, 150, 70, 110, 150, 70, 110, 150, 190, 190); Width = 35.
Лабеле углова:
AutoSize = False; Caption = (a =, b =, g =); Font = Symbol, BoldItalic, 16, Aqua; Height = 36; Layout = tlCenter;
Left = 180; Top = (230, 270, 310); Width = 35.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 30; Top = (205, 255, 305); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер TriVisine, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Edit4.Clear;Edit5.Clear;Edit6.Clear;Edit7.Clear;Edit8.Clear;
Edit9.Clear; Edit10.Clear;Edit11.Clear;Edit12.Clear;
Edit13.Clear;Edit14.Clear;Edit15.Clear;Edit16.Clear;
Edit17.Clear;Edit18.Clear;Edit19.Clear;Edit20.Clear;
Edit1.SetFocus;;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,h1,h2,h3,p,o:real;
a1,a2,a3,b1,b2,b3,c1,c2,c3:integer;
begin h1:=StrToFloatDef(Edit1.Text,5);Edit1.Text:=FloatToStr(h1);Edit7.Text:=Format('%7.3f',[h1]);
h2:=StrToFloatDef(Edit2.Text,5);Edit2.Text:=FloatToStr(h2);Edit8.Text:=Format('%7.3f',[h2]);
h3:=StrToFloatDef(Edit3.Text,5);Edit3.Text:=FloatToStr(h3);Edit9.Text:=Format('%7.3f',[h3]);
a:=1/h1;b:=1/h2;c:=1/h3; // странице троугла су обрнуто пропорционалне висинама
• Саставити програм који за унети редни број дана у недељи одређује његов назив.
Користићемо делфи функцију LowerCase да бисмо поједноставили тестирање уписаног стринга.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 250; ClientWidth = 350; Color = Teal; Font
= Palatino Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop;
Position = poScreenCenter.
На форму ћемо ставити лабелу за наслов, лабелу за комуни-
кацију са корисником, едит за унос, лабелу за испис резултата и
три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Дани у недељи; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едит за унос:
Font = Bold, Black; Left = 140; MaxLength = 1; Top = 90; Width = 50.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ; Font = Lime; Height = 50; Layout = tlCenter.
Лабела за комуникацију са корисником:
AutoSize = False; Caption = Редни број; Height = 36; Layout = tlCenter; Left = 20; Top = 90; Width = 120.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (210, 70, 210); Top = (90, 150, 150);
Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер ImeDana, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Label3.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди (варијанта са If-наредбом):
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
b:integer;
begin b:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(b);
If b=1 then s:='Први дан у недељи је понедељак.'
else If b=2 then s:='Други дан у недељи је уторак.'
else If b=3 then s:='Трећи дан у недељи је среда.'
else If b=4 then s:='Четврти дан у недељи је четвртак.'
else If b=5 then s:='Пети дан у недељи је петак.'
else If b=6 then s:='Шести дан у недељи је субота.'
else If b=7 then s:='Седми дан у недељи је недеља.'
else s:=IntToStr(b)+'. није редни број дана у недељи.';
Label3.Caption:=s;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Двоклик на тастер Одреди (варијанта са Case-наредбом):
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
b:integer;
begin b:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(b);
Case b of
1 : s:='Први дан у недељи је понедељак.'
2 : s:='Други дан у недељи је уторак.'
3 : s:='Трећи дан у недељи је среда.'
4 : s:='Четврти дан у недељи је четвртак.'
5 : s:='Пети дан у недељи је петак.'
6 : s:='Шести дан у недељи је субота.'
7 : s:='Седми дан у недељи је недеља.'
else s:=Edit1.Text+'. није редни број дана у недељи.';
Label3.Caption:=s;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Двоклик на тастер Одреди (варијанта са скупом и низом константи):
procedure TForm1.Button1Click(Sender: TObject);
const d:array[1..7]of string=('понедељак','уторак','среда','четвртак','петак','субота','недеља');
var s:string;
b:integer;
begin b:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(b);
If b in [1..7]
then s:=Edit1.Text+'. дан у недељи је '+d[b]+'.'
• Саставити програм који за унет назив дана у недељи одређује његов редни број.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 250; ClientWidth = 410; Color = Teal; Font
= Palatino Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop;
Position = poScreenCenter.
На форму ћемо ставити лабелу за наслов, лабелу за комуни-
кацију са корисником, едит за унос, лабелу за испис резултата и
три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Дани у недељи; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едит за унос:
Font = Bold, Black; Left = 140; CharCase = ecLowerCase; Top = 90;
Width = 120.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ; Font = Lime; Height = 50; Layout = tlCenter.
Лабела за комуникацију са корисником:
AutoSize = False; Caption = Назив дана; Height = 36; Layout = tlCenter; Left = 20; Top = 90; Width = 120.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (210, 140, 210); Top = (90, 150, 150);
Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер RBDana, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Label3.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди (варијанта са If-наредбом):
procedure TForm1.Button1Click(Sender: TObject);
var a,s:string;
begin s:=Edit1.Text;a:=LowerCase(s);
If a='понедељак' then s:=s+' је први дан у недељи.'
else If a='уторак' then s:=s+' је други дан у недељи.'
else If a='среда' then s:=s+' је трећи дан у недељи.'
else If a='четвртак' then s:=s+' је четврти дан у недељи.'
else If a='петак' then s:=s+' је пети дан у недељи.'
else If a='субота' then s:=s+' је шести дан у недељи.'
else If a='недеља' then s:=s+' је седми дан у недељи.'
else s:=s+' није дан у недељи.';
Label3.Caption:=s;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
напомена:
Функција LowerCase не ради са ћириличним словима, па овај програм неће радити ако дане у недељи
исписујемо малим и великим словима иако је алгоритамски коректан, зато смо поставили CharCase =
ecLowerCase што би требало да помогне да се називи дана могу да уписују само малим словима (зависи
од инсталираног оперативног система). Ако ово не ради, а желимо да направимо програм који ће коректно
тестирати низ унетих ћириличних слова да би се утврдио дан у недељи, морамо направити сами
одговарајућу функцију која ће сва велика ћирилична слова претворити у мала. Са знањем које у овом
тренутку поседујемо, то нисмо у могућности. Делимично решење проблема је да се уместо едита, за
унос података користи комбиновани оквир (ComboBox) из кога би се бирао назив дана. У том случају
• Саставити програм који за унети редни број месеца и годину исписује број дана у месецу.
Овде само треба водити рачуна о преступним годинама. За сада
важи, година је преступна ако је дељива са 4 и није последња
година века, односно, није дељива са 100 или ако је дељива са 400.
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Label3.Caption:='';
Edit1.SetFocus;
end;
Са If и Case
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
m,g,p,b:integer;
begin m:=StrToIntDef(Edit1.Text,10);
Edit1.Text:=IntToStr(m);
g:=StrToIntDef(Edit2.Text,2000);
Edit2.Text:=IntToStr(g);
If (m<1) or (m>12)
then s:='Погрешан унос месеца у години.'
else begin If (g mod 4=0)and(g mod 100<>0)or(g mod 400=0)
then p:=1
else p:=0;
Case m of
2 : b:=28+p;
4,6,9,11 : b:=30;
else b:=31;
end;
s:=IntToStr(b);
Case m of
1 : s:='Jaнуар има '+s+' дан.';
2 : s:='Фебруар има '+s+' дана.';
3 : s:='Март има '+s+' дан.';
4 : s:='Април има '+s+' дана.';
5 : s:='Мај има '+s+' дан.';
6 : s:='Jун има '+s+' дана.';
7 : s:='Jул има '+s+' дан.';
8 : s:='Август има '+s+' дан.';
9 : s:='Септембар има '+s+' дана.';
10: s:='Октобар има '+s+' дан.';
11: s:='Новембар има '+s+' дана.';
12: s:='Децембар има '+s+' дан.';
end;
end;
Label3.Caption:=s;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Обе Case наредбе у претходној процедури могу се заменити групом If наредби.
Са скуповним типом и контролом уноса
procedure TForm1.Edit1Exit(Sender: TObject);
begin If not (StrToIntDef(Edit1.Text,0) in [1..12])
then begin MessageBox(0,'Морате унети број од 1 до 12.','ГРЕШКА',MB_ICONERROR);
Edit1.Clear;Edit1.SetFocus;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const d:array[1..12] of string =('јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул',
'август', 'септембар', 'октобар', 'новембар', 'децембар');
var s:string;
m,g,p,b:integer;
begin m:=StrToIntDef(Edit1.Text,10); Edit1.Text:=IntToStr(m);
g:=StrToIntDef(Edit2.Text,1960);Edit2.Text:=IntToStr(g);
If (g mod 4=0)and(g mod 100<>0)or(g mod 400=0)
then p:=1
else p:=0;
Case m of
2 : b:=28+p;
4,6,9,11 : b:=30;
else b:=31;
end;
s:=d[m]+'има '+IntToStr(b)+' дана.';
Label3.Caption:=s;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 10; Top = (10, 140, 270); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Sutra, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Label3.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
d,m,g,p,bd:integer;
begin d:=StrToIntDef(Edit1.Text,31); Edit1.Text:=IntToStr(d);
m:=StrToIntDef(Edit2.Text,12); Edit2.Text:=IntToStr(m);
g:=StrToIntDef(Edit3.Text,2013);Edit3.Text:=IntToStr(g);
If (g mod 4=0)and(g mod 100<>0)or(g mod 400=0)
then p:=1
else p:=0;
Case m of
2 : bd:=28+p;
4,6,9,11 : bd:=30;
else bd:=31;
end;
If (d>bd)or(d<1)or(m>12)or(m<1)
then begin MessageBox(0,'Погрешан унос датума.','ГРЕШКА',0);
Button2.Click;
end
else begin If d<bd
then d:=d+1
else begin d:=1;
If m<12
then m:=m+1
else begin m:=1; g:=g+1;
end;
end;
s:=Format('Сутрашњи датум је: %1d.%1d.%4d.',[d,m,g]);
Label3.Caption:=s;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
end;
Case наредба за одређивање броја дана у месецу може се једноставно заменити двема If наредбама.
• Саставити програм који за унети датум одређује јучерашњи датум.
Променљива р биће преступни дан (0 ако година није преступна, 1 ако јесте). Ради лакше контроле
датума, увешћемо још једну променљиву bd која ће представљати број дана у месецу (28, 29, 30 или 31).
Након уноса датума прво ћемо извршити контролу унетог, а затим, ако је датум коректан, одредити
јучерашњи датум.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 250; ClientWidth = 400; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, лабелу за комуникацију
са корисником, три едита за унос, лабелу за испис резултата и
три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Јучерашњи датум; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (200, 250, 300); MaxLength = (2, 2, 4); Top = 80; Width = (40, 40, 60).
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ; Font = Lime; Height = 70; Layout = tlCenter.
Лабела за комуникацију са корисником:
AutoSize = False; Caption = Унесите датум; Height = 36; Layout = tlCenter; Left = 30; Top = 80; Width = 170.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 10; Top = (10, 140, 270); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Juce, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Label3.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
d,m,g,p,b:integer;
begin d:=StrToIntDef(Edit1.Text,1); Edit1.Text:=IntToStr(d);
m:=StrToIntDef(Edit2.Text,1); Edit2.Text:=IntToStr(m);
g:=StrToIntDef(Edit3.Text,2014);Edit3.Text:=IntToStr(g);
If (g mod 4=0)and(g mod 100<>0)or(g mod 400=0)
then p:=1
else p:=0;
If m=2
then bd:=28+p
else If m in [4,6,9,11]
then bd:=30
else bd:=31;
If (d>bd)or(d<1)or(m>12)or(m<1)
then s:='Погрешан унос датума.'
else begin If d>1
then d:=d-1
else begin m:=m-1;
If m=0
then begin m:=12; g:=g-1;
end;
Case m of
2 : d:=28+p;
4,6,9,11 : d:=30;
else d:=31;
end;
end;
s:=Format('Јучерашњи датум је: %1d.%1d.%4d.',[d,m,g]);
end;
Label3.Caption:=s;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
Две If наредбe за одређивање броја дана у месецу може се једноставно заменити Case наредбом.
• Саставити програм који за унети датум одређује редни број дана у години.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 250; ClientWidth = 400; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, лабелу за комуникацију
са корисником, три едита за унос, лабелу за испис резултата и
три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Редни
број дана у години; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (200, 250, 300); MaxLength = (2, 2, 4); Top = 80; Width = (40, 40, 60).
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ; Font = Lime; Height = 70; Layout = tlCenter.
Лабела за комуникацију са корисником:
AutoSize = False; Caption = Унесите датум; Height = 36; Layout = tlCenter; Left = 30; Top = 80; Width = 170.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 10; Top = (10, 140, 270); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер RBDanaUG, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Label3.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
d,m,g,p,b:integer;
begin d:=StrToIntDef(Edit1.Text,20); Edit1.Text:=IntToStr(d);
m:=StrToIntDef(Edit2.Text,10); Edit2.Text:=IntToStr(m);
g:=StrToIntDef(Edit3.Text,2010);Edit3.Text:=IntToStr(g);
p:=0;
If (g mod 4=0)and(g mod 100<>0)or(g mod 400=0) then p:=1
If m=2
then b:=28+p
else If m in [4,6,9,11]
then b:=30
else b:=31;
If (d>b)or(d<1)or(m>12)or(m<1)
then s:='Погрешан унос датума.'
else begin If m>1 then d:=d+31;
If m>2 then d:=d+28+p;
If m>3 then d:=d+31;
If m>4 then d:=d+30;
If m>5 then d:=d+31;
If m>6 then d:=d+30;
If m>7 then d:=d+31;
If m>8 then d:=d+31;
If m>9 then d:=d+30;
If m>10 then d:=d+31;
If m>11 then d:=d+30;
s:='Уписани датум је '+IntToStr(d)+'. дан у години.';
end;
Label3.Caption:=s;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
Процедура за тастер Одреди може се написати и овако:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
d,m,g,p,bd:integer;
begin d:=StrToIntDef(Edit1.Text,20); Edit1.Text:=IntToStr(d);
m:=StrToIntDef(Edit2.Text,10); Edit2.Text:=IntToStr(m);
g:=StrToIntDef(Edit3.Text,2010);Edit3.Text:=IntToStr(g);
If (g mod 4=0)and(g mod 100<>0)or(g mod 400=0)
then p:=1
else p:=0;
Case m of
2 : bd:=28+p;
4,6,9,11 : bd:=30;
else bd:=31;
end;
If (d>bd)or(d<1)or(m>12)or(m<1)
then s:='Погрешан унос датума.'
else begin Case m of
2 : d:=d+31; // прошао је јануар, додајемо 31 дан
3 : d:=d+31+28+p; // прошли су јануар и фебруар
4 : d:=d+31+28+p+31; // прошли су јануар, фебруар и март ...
5 : d:=d+31+28+p+31+30;
6 : d:=d+31+28+p+31+30+31;
7 : d:=d+31+28+p+31+30+31+30;
8 : d:=d+31+28+p+31+30+31+30+31;
9 : d:=d+31+28+p+31+30+31+30+31+31;
10 : d:=d+31+28+p+31+30+31+30+31+31+30;
11 : d:=d+31+28+p+31+30+31+30+31+31+30+31;
12 : d:=d+31+28+p+31+30+31+30+31+31+30+31+30;
end;
s:='Уписани датум је '+IntToStr(d)+'. дан у години.';
end;
Label3.Caption:=s;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који за унети редни број дана и годину одређује датум.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ ГРАНАЊА; ClientHeight = 250; ClientWidth =
400; Font = Palatino Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position = poScreenCenter.
На форму ћемо ставити лабелу за наслов, лабелу за комуникацију са корисником, два едита за унос,
лабелу за испис резултата и три тастера за управљање апликацијом.
Лабела за наслов:
• Саставити програм који за унета два броја и рачунску операцију одређује резултат.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 300; ClientWidth = 400; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, три лабеле за комуника-
цију са корисником, три едита за унос, лабелу за испис резултата
и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Калкулатор; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (60, 140, 170); MaxLength = (0, 1, 0); Top =
(80, 120, 160); Width = (120, 30, 120).
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ; Font = Lime; Height = 70; Layout = tlCenter.
Лабела за комуникацију са корисником:
AutoSize = False; Caption = (a =, Операција, b =); Height = 36; Layout = tlCenter; Left = (20, 30, 130); Top =
(80, 120, 160); Width = (20, 120, 20).
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 270; Top = (80, 130, 190); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Kalkulator, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Label3.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
a,b:real;
o:char;
begin a:=StrToFloatDef(Edit1.Text,1); Edit1.Text:=FloatToStr(a);
o:=Edit2.Text[1];
b:=StrToFloatDef(Edit3.Text,3); Edit3.Text:=FloatToStr(b);
s:=Edit1.Text+o+Edit3.Text+'=';
Case o of
'+':s:=s+FloatToStr(a+b);
'-':s:=s+FloatToStr(a-b);
'*':s:=s+FloatToStr(a*b);
'/':If b<>0
then s:=s+FloatToStr(a/b)
else s:='није дефинисано';
else s:='непозната операција';
end;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
Следеће три процедуре кориснуку олакшавају употребу програма анализом притиснутог тастера у
одговарајући едит. У првом и трећем дозвољено је користити тастере са цифрама, BackSpace, Delete и
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
132 Рачунарство и информатика за трећи разред гимназије 132
Enter што је дефинисано скупом. У другом едиту дозвољено је користити тастере +, -, *, /, BackSpace и
Enter што је такође, дефинисано скупом. Ако се употреби било који други тастер оквири ће се понашати
као да је притиснут тастер Esc, односно, неће се десити ништа.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Edit2.SetFocus
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Edit3.SetFocus
else If not (key in ['+','-','*','/',#8])
then key:=#27;
end;
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
Задатак се може решити и коришћењем комбобокса за унос
операција (на овај начин можемо додати и још неке једноставне
двочлане операције). Форма се незнатно мења, а као и програм,
па ћемо приказати само процедуру за тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
a,b:real;
begin a:=StrToFloatDef(Edit1.Text,1);
Edit1.Text:=FloatToStr(a);
b:=StrToFloatDef(Edit2.Text,3);
Edit2.Text:=FloatToStr(b);
s:=Edit1.Text+ComboBox1.Text+Edit2.Text+'=';
Case ComboBox1.ItemIndex of
1:s:=s+FloatToStr(a+b);
2:s:=s+FloatToStr(a-b);
3:s:=s+FloatToStr(a*b);
4:If b<>0
then s:=s+FloatToStr(a/b)
else s:='није дефинисано';
else s:='непозната операција';
end;
Label3.Caption:=a;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
ComboBox1.Enabled:=false;
Button2.SetFocus;
end;
Било би занимљивије направити верзију овог програма где би се и цифре бројева и
ознака рачунске операције уносили кликом на одговарајуће тастере - мало реалнија
симулација рада са калкулатором. Форма би могла бити дизајнирана као на слици.
Сви улазни и излазни подаци приказују се у едиту коме је кориснику забрањен
приступ (ReadOnly := true). Али, пошто је ово мало компликованије и алгоритамски и
за описивање, нека то буде задатак за оне који желе, могу и знају више.
• Бројна права је трима тачкама подељена на четири дела. Саставити
програм који одређује у ком делу се налази уписани број.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 300; ClientWidth = 400; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, лабелу за комуника-
цију са корисником, едит за унос, лабелу за испис резултата и три
тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Бројна
права и тачка; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едит за унос:
Font = Bold, Black; Left = 130; Top = 80; Width = 80.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ; Font = Lime; Height = 70; Layout = tlCenter.
Лабела за комуникацију са корисником:
AutoSize = False; Caption = Т =; Height = 36; Layout = tlCenter; Left = 90; Top = 80; Width = 40.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 270; Top = (80, 130, 190); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер BPrava, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Label3.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
const a=-3; b=1; c=7;
var s:string;
d:integer;
begin d:=StrToIntDef(Edit1.Text,4);Edit1.Text:=IntToStr(d);
s:='Тачка '+Edit1.Text+' ';
Case d of
-maxint..a-1:s:=s+'је испред тачке '+IntToStr(a);
a: s:=s+'се поклапа са тачком '+IntToStr(a);
a+1..b-1: s:=s+'је између тачака '+IntToStr(a)+' и '+IntToStr(b);
b: s:=s+'се поклапа са тачком '+IntToStr(b);
b+1..c-1: s:=s+'је између тачака '+IntToStr(b)+' и '+IntToStr(c);
c: s:=s+'се поклапа са тачком '+IntToStr(c);
c+1..maxint:s:=s+'је иза тачке '+IntToStr(c);
end;
Label3.Caption:=s;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Уместо Case наредбе могли смо употребити и комбинацију од
неколико If наредби, али је овако решење читљивије.
Подеоне тачке морају бити претходно дефинисане константе да
бисмо смели да употребимо Case наредбу. Ако желимо да се
подеоне тачке мењају у програму, онда се овај задатак може
решити само помоћу If наредбе. У том случају, најпре се подеоне
тачке морају уредити у растући поредак, а затим се одређује
положај унете тачке на бројној правој.
Приказаћемо само процедуру за тастер Одреди у оваквом случају.
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
a,b,c,d,p:integer;
begin a:=StrToIntDef(Edit2.Text,-3);Edit2.Text:=IntToStr(a);
b:=StrToIntDef(Edit3.Text,1);Edit3.Text:=IntToStr(b);
c:=StrToIntDef(Edit4.Text,7);Edit4.Text:=IntToStr(c);
If a>b
then begin p:=a;a:=b;b:=p;
end;
If a>c
then begin p:=a;a:=c;c:=p;
end;
If b>c
then begin p:=b;b:=c;c:=p;
end;
d:=StrToIntDef(Edit1.Text,4); Edit1.Text:=IntToStr(d);
s:='Тачка '+Edit1.Text+'';
If d=a
then s:=s+' се поклапа са тачком '+IntToStr(a)
else If d=b
then s:=s+' се поклапа са тачком '+IntToStr(b)
else If d=c
then s:=s+' се поклапа са тачком '+IntToStr(c)
else If d<a
then s:=s+' је испред тачке '+IntToStr(a)
else If d<b
then s:=s+' је између тачака '+IntToStr(a)+' и '+IntToStr(b)
else If d<c
then s:=s+' је између тачака '+IntToStr(b)+' и '+IntToStr(c)
else s:=s+' је иза тачке '+IntToStr(c);
Label3.Caption:=s;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit4.Clear;Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var h,s,a,p,v:real;
begin s:=StrToFloatDef(Edit1.Text,1);Edit1.Text:=FloatToStr(s); // бочна ивица
h:=StrToFloatDef(Edit2.Text,3);Edit2.Text:=FloatToStr(h); // бочна висина
a:=2*Sqrt(s*s-h*h); // основица
p:=3*a*a*Sqrt(3)/2+3*a*h; Edit3.Text:=Format('%1.2f',[p]);
v:=3*a*a*Sqrt(3)/2*Sqrt(s*s-a*a)/3;Edit4.Text:=Format('%1.2f',[v]);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Да би све било коректно, морамо обезбедити да подаци буду исправно унети. То ћемо урадити помоћу
следеће две процедуре за контролу уноса података у прва два едита:
procedure TForm1.Edit1Exit(Sender: TObject);
begin If StrToFloatDef(Edit1.Text,0)=0
then begin MessageBox(0,'Висина пирамиде мора бити'+#13+
'већа од нуле','ГРЕШКА У УНОСУ',0);
Edit1.Clear;Edit1.SetFocus;
end;
end;
procedure TForm1.Edit2Exit(Sender: TObject);
var a,s,h:real;
begin s:=StrToFloatDef(Edit1.Text,0);
h:=StrToFloatDef(Edit2.Text,0);
a:=4*h*h-3*s*s;
If StrToFloatDef(Edit2.Text,0)<=0
then begin MessageBox(0,'Бочна висина мора бити'+#13+
'већа од нуле','ГРЕШКА У УНОСУ',0);
Edit2.Clear;Edit2.SetFocus;
end
else If s<=h
then begin MessageBox(0,'Бочна висина мора бити'+#13+
'мања од бочне ивицe','ГРЕШКА У УНОСУ',0);
Edit2.Clear;Edit2.SetFocus;
end
else If a<=0
then begin MessageBox(0,'Бочна висина мора бити већа од уписане',
'ГРЕШКА У УНОСУ',0);
Edit2.Clear;Edit2.SetFocus;
end;
end;
• Саставити програм који одређује површину и запремину ваљка уписаног у купу ако је
дата изводница и полупречник основе купе, а висина ваљка и висина купе су у односу н:м.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 300; ClientWidth = 380; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, шест лабела за комуни-
кацију са корисником, четири едита за унос, два едита за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Ваљак у купи; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (60, 180); Top = (80, 130); Width = (70, 60).
Едити за испис резултата:
Font = Bold, Black; Left = 140; Top = (180, 230); Width = 100.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (s =, r =, n =, m =, P =, V =); Height = 36; Layout = tlCenter; Left = (20, 20, 140, 140,
100, 100); Top = (80, 130, 80, 130, 180, 230); Width = 40.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 250; Top = (80, 130, 250); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Valjak, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
• Саставити програм који одређује да ли су три тачке у равни колинеарне, па ако јесу
одређује тачку у средини, а ако нису израчунава висине троугла који оне формирају.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 300; ClientWidth = 380; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, шест лабела за комуни-
кацију са корисником, шест едита за унос, лабелу за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Колинеарне; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (70, 180); Top = (80, 130, 180); Width = 50.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ;
Font = Lime; Height = 80; Layout = tlCenter.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (x1 =, y1 =, x2 =, y2 =, x3 =, y3 =); Height = 36; Layout = tlCenter; Left = (20, 130);
Top = (80, 130, 180); Width = 50.
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 250; Top = (80, 130, 180); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Kolinearne, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Edit4.Clear;Edit4.ReadOnly:=false;
Edit5.Clear;Edit5.ReadOnly:=false;
Edit6.Clear;Edit6.ReadOnly:=false;
Label8.Caption:='';Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var x1,x2,x3,y1,y2,y3,p,h1,h2,h3:real;
a,b,c:string;
begin x1:=StrToFloatDef(Edit1.Text,1);Edit1.Text:=FloatToStr(x1);
y1:=StrToFloatDef(Edit2.Text,3);Edit2.Text:=FloatToStr(y1);
x2:=StrToFloatDef(Edit3.Text,5);Edit3.Text:=FloatToStr(x2);
y2:=StrToFloatDef(Edit4.Text,2);Edit4.Text:=FloatToStr(y2);
x3:=StrToFloatDef(Edit5.Text,4);Edit5.Text:=FloatToStr(x3);
y3:=StrToFloatDef(Edit6.Text,6);Edit6.Text:=FloatToStr(y3);
{ тачке су на истој правој ако су апсцисе или ординате све три тачке једнаке или ако су на
истом краку угла са теменом у једној од тачака. Услов у If обухвата све те случајеве јер:
ако су им једнаке апсцисе x1-x3=0=x1-x2; ако су им једнаке ординате y1-y2=0=y1-y3;
ако су на истом краку тангенс угла (теме у првој тачки) је (y1-y2)/(x1-x2)=(y1-y3)/(x1-x3) }
If Abs((y1-y2)*(x1-x3))=Abs((y1-y3)*(x1-x2))
then begin If (x1=x2)and(x2=x3) // уређујемо тачке према растојању од коо-почетка
then begin If y1>y2 then begin p:=y1;y1:=y2;y2:=p;end;
If y1>y3 then begin p:=y1;y1:=y3;y3:=p;end;
If y2>y3 then begin p:=y3;y3:=y2;y2:=p;end;
end
else begin If x1>x2 then begin p:=x1;x1:=x2;x2:=p;end;
If x1>x3 then begin p:=x1;x1:=x3;x3:=p;end;
If x2>x3 then begin p:=x3;x3:=x2;x2:=p;end;
end;
a:='('+FloatToStr(x1)+','+FloatToStr(y1)+')'; // координате прве тачке
b:='('+FloatToStr(x2)+','+FloatToStr(y2)+')'; // координате друге тачке
c:='('+FloatToStr(x3)+','+FloatToStr(y3)+')'; // координате треће тачке
Label8.Caption:='Тачка '+b+' је између'+#13+'тачака '+a+' и '+c+'.'
end
else begin h1:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2)); // дужина прве странице троугла
h2:=Sqrt(Sqr(x2-x3)+Sqr(y2-y3)); // дужина друге странице троугла
h3:=Sqrt(Sqr(x3-x1)+Sqr(y3-y1)); // дужина треће странице троугла
p:=Sqrt((h1+h2+h3)*(h1+h2-h3)*(h2+h3-h1)*(h3+h1-h2))/4; // површина - Херон
a:=Format('%1.3f',[2*p/h1]); // висина на прву страницу
b:=Format('%1.3f',[2*p/h2]); // висина на другу страницу
c:=Format('%1.3f',[2*p/h3]); // висина на трећу страницу
Label8.Caption:='Висине троугла су '+#13+a+'; '+b+' и '+c+'.'
end;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Edit4.ReadOnly:=true;Edit5.ReadOnly:=true;Edit6.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује да ли су три тачке у равни колинеарне, па ако нису
одређује тачку која са ове три чини темена паралелограма.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 300; ClientWidth = 380; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, шест лабела за комуни-
кацију са корисником, шест едита за унос, лабелу за испис
резултата и три тастера за управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Паралелограм; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (70, 180); Top = (80, 130, 180); Width = 50.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ;
Font = Lime; Height = 80; Layout = tlCenter.
Ако неке две тачке имају исту апсцису или ординату врло једноставно се одређују координате четврте
тачке. Представимо тачке у координатном систему и јасно видимо два решења, треће решење захтева
допуњавање слике до великог троугла, али није тешко открити га. Значи, постоје три тачке које
задовољавају услов задатка. Ако, међутим, никоје две тачке немају исту ни апсцису ни ординату онда
морамо применити мало аналитичке геометрије у равни. Нацртаћемо све три дужи које су одређене са
ове три тачке, а затим поставити праве паралелне са тим дужима које пролазе кроз трећу тачку (која
није на дужи). Таквих правих има три, секу се у три тачке које су решење задатка. Наравно, задатак је
изузетно тежак, ако немамо довољно знања из области аналитичке геометрије.
• Саставити програм који прихвата цену и количину производа и начин плаћања помоћу
радио групе, а затим одређује износ за плаћање. Ако се плаћа готовином одобрава се
попуст 10%, плаћање чековима је без попуста, а за куповину на кредит рачуна се
камата 15%. Предвидети да се проценти могу мењати.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 300; ClientWidth = 420; Font = Palatino
Linotype, BoldItalic, 16, Aqua; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, две лабеле за комуни-
кацију са корисником, четири едита за унос, радио групу за избор
врсте плаћања, лабелу за испис резултата и три тастера за
управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption =
Обрачун плаћања; Font = 22, Lime; Height = 50; Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = (160, 290, 115, 115); Top = (80, 80, 130, 184);
Width = (50, 120, 35, 35).
Радио група:
Caption = Плаћање; Columns = 1; Font = 12; Height = 110; Items = [готовина, чекови, кредит]; Left = 5; Top
= 110; Width = 105.
Лабела за испис резултата:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = ; Font = 22, Lime; Height = 80; Layout = tlCenter.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (Количина, Цена); Height = 36; Layout = tlCenter; Left = (50, 230); Top = 80;
Width = (110, 60).
Тастери за управљање:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = (160, 290, 290); Top = (130, 130,
180); Width = 120.
Сачуваћемо дизајнирану форму у креирани фолдер Naplata, а затим, двокликом мишем на тастере редом
дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
RadioGroup1.ItemIndex:=0;
Label4.Caption:='';
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure TForm1.Button1Click(Sender: TObject);
var kol,cena,pl:real;
p,k:integer;
begin kol:= StrToFloatDef(Edit1.Text,1);Edit1.Text:=FloatToStr(kol);
cena:=StrToFloatDef(Edit2.Text,3);Edit2.Text:=FloatToStr(cena);
p:=StrToIntDef(Edit3.Text,5);Edit3.Text:=IntToStr(p);
k:=StrToIntDef(Edit4.Text,2);Edit4.Text:=IntToStr(k);
{ ставке у радио групи броје се од 0, па је: 0 - готовина, 1 - чекови, 2 - кредит }
Case RadioGroup1.ItemIndex of
0 : pl:=kol*cena*(1-p/100); // 10% значи 10/100, а 1 је 100/100, па 1-10% даје 0,9
1 : pl:=kol*cena;
else pl:=kol*cena*(1+k/100); // 15% значи 15/100, а 1 је 100/100, па 1+15% даје 1,15
end;
Label4.Caption:='За плаћање '+Format('%1.0m',[pl]);
{ %1.0m (m - money) у формату дефинише испис реалног броја без децимала (.0) са поделом на
хиљаде и додатом ознаком валуте која је предефинисана у оперативном систему. Ако не желимо
ознаку валуте у испису резултата, онда уместо m треба ставити ознаку n (n - number) да бисмо
задржали поделу на хиљаде или f ( f - float) ако желимо да у испису буде само реалан број }
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који за унету брзину и угао одређује време лета, највећу висину и
удаљеност пада пројектила код косог хица. Брзину задавати у m/s или km/h, а угао у
степенима или у радијанима,
Да би се задатак што једноставније решио увешћемо радио групе
којима ће се дефинисати јединице за брзину и угао. Затим ћемо,
када је то потребно, конвертовати брзину у m/s и/или угао у
радијанима да не бисмо имали више формула него што нам је
потребно. Улазни подаци ће се, најпре, уносити у едите, а касније
ћемо показати и коришћење неких других компоненти којима се
олакшава унос података.
Подесићемо карактеристике форме на следећи начин:
BorderIcons = []; BorderStyle = bsSingle; Caption = НАРЕДБЕ
ГРАНАЊА; ClientHeight = 350; ClientWidth = 400; Font = Palatino
Linotype, BoldItalic, 13; FormStyle = fsStayOnTop; Position =
poScreenCenter.
На форму ћемо ставити лабелу за наслов, три лабеле за комуни-
кацију са корисником, два едита за унос, две радио групе за избор
типа података, три едита за испис резултата и три тастера за
управљање апликацијом.
Лабела за наслов:
Align = alTop; Alignment = taCenter; AutoSize = False; Caption = Коси хитац; Font = 22, Lime; Height = 50;
Layout = tlCenter.
Едити за унос:
Font = Bold, Black; Left = 270; Top = (75, 145); Width = 110;
Едити за исписивање резултата:
Font = Bold, Black; Left = 150; Text = ; ReadOnly = True; Top = (210, 255, 300); Width = 110.
Радио групe:
Caption = (Почетна брзина, Угао); Columns = 3; Height = 65; ItemIndex = 1; Items = ([km/h, m/s], [Степени,
Радијани]); Left = 5; Top = (55, 125); Width = 385.
Лабеле за комуникацију са корисником:
AutoSize = False; Caption = (Време лета, Даљина, Највећа висина); Height = 31; Layout = tlCenter. Left =
15; Top = (210, 255, 300); Width = 135.
Додаћемо три тастера са следећим карактеристикама:
Caption = (Одреди, Обриши, Крај рада); Font = Bold; Height = 40; Left = 270; Top = (200, 250, 300); Width =
120.
Резултати су уоквирени бевелом:
Height = 140; Left = 5; Shape = bsFrame; Style = bsRaised; Top = 200; Width = 260.
Сачуваћемо дизајнирану форму у креирани фолдер KosiHitac, а затим, двокликом мишем на тастере
редом дефинисаћемо све неопходне процедуре.
Двокликом на тастер Крај рада дефинисаћемо процедуру којом се прекида извршење програма.
Двоклик на тастер Обриши:
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=true;
Edit2.Clear;Edit2.ReadOnly:=true;
Edit3.Clear;Edit4.Clear;Edit5.Clear;
RadioGroup1.Enabled:=true;
RadioGroup2.Enabled:=true;
Edit1.SetFocus;
end;
Двоклик на тастер Одреди:
procedure Button1Click(Sender: TObject);
const g = 9.8062;
var V, Fi, T: Real;
begin V := StrToFloatDef(Edit1.Text,0);Edit1.Text:=FloatToStr(V);
Fi:= StrToFloatDef(Edit2.Text,0);Edit2.Text:=FloatToStr(Fi);
If RadioGroup1.ItemIndex=0
then V:=V/3.6;
If RadioGroup2.ItemIndex=0
then Fi:=Fi*Pi/180;
T:=2*V/g*Sin(Fi);Edit3.Text:=FloatToStr(T)+' s';
Edit4.Text:=FloatToStr(T*V*Cos(Fi))+' m';
Edit4.Text:=FloatToStr(T*V/4*Sin(Fi)) + ' m'
Edit1.ReadOnly:=true;RadioGroup1.Enabled:=false;
Edit2.ReadOnly:=true;RadioGroup2.Enabled:=false;
Button2.SetFocus;
end;
Избором јединица из радио група мора се извршити и конверзија података који су претходно унети у
одговарајуће едите. За то ћемо написати две процедуре које ће реаговати на клик мишем на радио групу:
procedure TForm1.RadioGroup1Click(Sender: TObject);
var V:real;
begin V:=StrToFloatDef(Edit1.Text,0);
If (V<>0)and(RadioGroup1.ItemIndex=1)
then Edit1.Text:=FloatToStr(V/3.6)
else Edit1.Text:=FloatToStr(V*3.6);
end;
procedure TForm1.RadioGroup2Click(Sender: TObject);
var Fi:real;
begin Fi:=StrToFloatDef(Edit2.Text,0);
If (Fi<>0)and(RadioGroup2.ItemIndex=1)
then Edit2.Text:=FloatToStr(Fi*Pi/180)
else Edit2.Text:=FloatToStr(Fi/Pi*180);
end;
За уношење почетне брзине и угла можемо користити
компоненту TrackBar (пета компонента на листићу Win32).
Компонента је мало сложенија, па ћемо навести само решење
проблема помоћи ње, а оставићемо за додатну активност
детаљније упознавање и употребу компоненте.
procedure TForm1.Odredi(Sender: TObject);
const g = 9.8062;
var V, Fi, T: Real;
begin V:=TrackBar1.Position;
If RadioButton1.Checked then V:=V/3.6;
If RadioButton4.Checked
then Fi:=TrackBar2.Position/100000
else Fi:=TrackBar2.Position*Pi/180;T:=2*V/g*Sin(Fi);
Edit3.Text:=Format('%5.2f s',[T]);
Edit4.Text:=Format('%5.2f m',[T*V*Cos(Fi)]);
Edit5.Text:=Format('%5.2f m',[T*V/4*Sin(Fi)]);
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin Label2.Caption:=IntToStr(TrackBar1.Position);
Odredi(Sender);
end;
procedure TForm1.TrackBar2Change(Sender: TObject);
begin if RadioButton4.Checked
then Label3.Caption:=FloatToStr(TrackBar2.Position/100000)
else Label3.Caption:=IntToStr(TrackBar2.Position);
Odredi(Sender);
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
var P: Integer;
begin if Label4.Caption='m/s' then
begin Label4.Caption:='km/h';
P:=Round(TrackBar1.Position*3.6);
TrackBar1.Max :=360;TrackBar1.Frequency:=50;
TrackBar1.Position:=P; TrackBar1Change(Sender);
end;
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
var P: Integer;
begin if Label4.Caption = 'km/h' then
begin Label4.Caption := 'm/s';
P:=Round(TrackBar1.Position/3.6);
TrackBar1.Max :=100;TrackBar1.Frequency:=10;
TrackBar1.Position:=P; TrackBar1Change(Sender);
end;
end;
procedure TForm1.RadioButton4Click(Sender: TObject);
var P: Integer;
begin if Label5.Caption='st' then
begin Label5.Caption:='rad';
P:=Round(TrackBar2.Position*Pi/0.00180);
TrackBar2.Max :=157079;TrackBar2.Frequency:=10000;
TrackBar2.PageSize:=10000; TrackBar2.LineSize :=1000;
TrackBar2.Position:=P; TrackBar2Change(Sender)
end;
end;
procedure TForm1.RadioButton3Click(Sender: TObject);
var P: Integer;
begin if Label5.Caption='rad' then
begin Label5.Caption:='st';
P:=Round(TrackBar2.Position/Pi*0.00180);
TrackBar2.Max :=90;TrackBar2.Frequency:=10;
TrackBar2.PageSize:=5; TrackBar2.LineSize :=1;
TrackBar2.Position:=P; TrackBar2Change(Sender);
end;
end;
Оквир за резултате у првом и трећем задатку је компонента Bevel (осма компонента на листићу
Additional), а листићи са варијантама трећег задатка су делови компоненте PageControl (друга
компонента на листићу Win32). Листићи на PageControl компоненти додају се десним кликом на мишу
и избором команде New Page из отвореног менија, а називи листића се уписују у Caption
карактеристику. На насловној страни колекције трећег задатка су три сличице троугла у три
компоненте Image (шеста компонента на листићу Additional), а сличице се додају кликом на
карактеристику Picture, отвара се едитор на коме треба кликнути на дугме Load, a затим, на уобичајен
начин, изабрати одговарајућу сличицу из отвореног дијалошког прозора. За прекривање основне боје
листића искоришћена jе лабела у белој боји која је постављена иза сличица и раширена по целом
листићу (Align = alClient). За унос логичких података у другом задатку коришћен је комбиновани оквир
(ComboBox, једанаеста компонента са листића Standard) да би се избегла потреба за коришћењем
услова за проверу исправности уноса. Логичка формула у наслову истог задатка исписана је са две
лабеле, основна је са нормалним фонтом, а преко ње је провидна лабела са фонтом Symbol. Код
решавања троугла, да би задатак био коректно решен, коришћена је If наредба код израчунавања
углова да би се избегло дељење нулом, ако је угао прав. Задатак би радио и без ове наредбе, осим ако је
један од углова или прав. Следи комплетан радни део програма.
// Збир природних бројева у низу
procedure TForm1.Button1Click(Sender: TObject); // Тастер одреди
var n,s:integer;
begin n:=StrToIntDef(Edit1.Text,9); Edit1.Text:=IntToStr(n);
s:=n*(n+1) div 2; Edit2.Text:=IntToStr(s);
s:=n*(n+1); Edit3.Text:=IntToStr(s);
s:=n*n; Edit4.Text:=IntToStr(s);
s:=Sqr(n div 2)+n div 2; Edit5.Text:=IntToStr(s);
s:=Sqr((n+1) div 2); Edit6.Text:=IntToStr(s);
Edit1.ReadOnly:=true; Button2.SetFocus;
end;
procedure TForm1.Button2Click(Sender: TObject); // Тастер обриши
begin Edit1.Clear; Edit2.Clear; Edit3.Clear;
Edit4.Clear; Edit5.Clear; Edit6.Clear;
Edit1.ReadOnly:=false; Edit1.SetFocus;
end;
p:=(a*a+b*b-c*c)/(2*a*b);
t1:=Sqrt(b*b+a*a/4-a*b*p); Edit40.Text:=Format('%7.3f',[t1]);
t2:=Sqrt(b*b/4+a*a-a*b*p); Edit41.Text:=Format('%7.3f',[t2]);
If p=0
then c3:=90*3600
else c3:=Abs(Round(ArcTan(Sqrt(1-p*p)/p)/pi*180*3600));
p:=(a*a-b*b+c*c)/(2*a*c);
t3:=Sqrt(a*a+c*c/4-a*c*p); Edit42.Text:=Format('%7.3f',[t3]);
If p=0
then b3:=90*3600
else b3:=Abs(Round(ArcTan(Sqrt(1-p*p)/p)/pi*180*3600));
a3:=180*3600-b3-c3;
a1:=a3 div 3600; Edit43.Text:=IntToStr(a1);
a2:=a3 mod 3600 div 60; Edit44.Text:=IntToStr(a2);
a3:=a3 mod 60; Edit45.Text:=IntToStr(a3);
b1:=b3 div 3600; Edit46.Text:=IntToStr(b1);
b2:=b3 mod 3600 div 60; Edit47.Text:=IntToStr(b2);
b3:=b3 mod 60; Edit48.Text:=IntToStr(b3);
c1:=c3 div 3600; Edit49.Text:=IntToStr(c1);
c2:=c3 mod 3600 div 60; Edit50.Text:=IntToStr(c2);
c3:=c3 mod 60; Edit51.Text:=IntToStr(c3);
Edit31.ReadOnly:=true; Edit32.ReadOnly:=true;
Edit33.ReadOnly:=true;
end;
procedure TForm1.Button8Click(Sender: TObject); // Тастер обриши a,b,ha
begin Edit31.Clear; Edit32.Clear; Edit33.Clear;
Edit34.Clear; Edit35.Clear; Edit36.Clear;
Edit37.Clear; Edit36.Clear; Edit39.Clear;
Edit40.Clear; Edit41.Clear; Edit42.Clear;
Edit43.Clear; Edit44.Clear; Edit45.Clear;
Edit46.Clear; Edit47.Clear; Edit48.Clear;
Edit49.Clear; Edit50.Clear; Edit51.Clear;
Edit52.Clear; Edit53.Clear;
Edit31.ReadOnly:=false; Edit32.ReadOnly:=false;
Edit33.ReadOnly:=false; Edit31.SetFocus;
end;
procedure TForm1.Button9Click(Sender: TObject); // Тастер одреди a,ha,hb
var a,b,c,h1,h2,h3,t1,t2,t3,p,o:real;
a1,a2,a3,b1,b2,b3,c1,c2,c3:integer;
begin a:=StrToFloatDef(Edit54.Text,4); Edit54.Text:=FloatToStr(a);
h1:=StrToFloatDef(Edit55.Text,3);Edit55.Text:=FloatToStr(h1);
h2:=StrToFloatDef(Edit56.Text,4);Edit56.Text:=FloatToStr(h2);
p:=a*h1/2; b:=2*p/h2;
c:=b-Sqrt(a*a-h2*h2); c:=Sqrt(c*c+h2*h2);
Edit57.Text:=Format('%7.3f',[a]);
Edit58.Text:=Format('%7.3f',[b]);
h3:=2*p/c; Edit59.Text:=Format('%7.3f',[c]);
Edit60.Text:=Format('%7.3f',[h1]);
Edit61.Text:=Format('%7.3f',[h2]);
Edit62.Text:=Format('%7.3f',[h3]);
Edit75.Text:=Format('%7.3f',[p]);
o:=a+b+c; Edit76.Text:=Format('%7.3f',[o]);
p:=(a*a+b*b-c*c)/(2*a*b);
t1:=Sqrt(b*b+a*a/4-a*b*p); Edit63.Text:=Format('%7.3f',[t1]);
t2:=Sqrt(b*b/4+a*a-a*b*p); Edit64.Text:=Format('%7.3f',[t2]);
If p=0
then c3:=90*3600
else c3:=Abs(Round(ArcTan(Sqrt(1-p*p)/p)/pi*180*3600));
p:=(a*a-b*b+c*c)/(2*a*c);
t3:=Sqrt(a*a+c*c/4-a*c*p); Edit65.Text:=Format('%7.3f',[t3]);
If p=0
then b3:=90*3600
else b3:=Abs(Round(ArcTan(Sqrt(1-p*p)/p)/pi*180*3600));
a3:=180*3600-b3-c3;
a1:=a3 div 3600; Edit66.Text:=IntToStr(a1);
a2:=a3 mod 3600 div 60; Edit67.Text:=IntToStr(a2);
a3:=a3 mod 60; Edit68.Text:=IntToStr(a3);
b1:=b3 div 3600; Edit69.Text:=IntToStr(b1);
b2:=b3 mod 3600 div 60; Edit70.Text:=IntToStr(b2);
b3:=b3 mod 60; Edit71.Text:=IntToStr(b3);
c1:=c3 div 3600; Edit72.Text:=IntToStr(c1);
c2:=c3 mod 3600 div 60; Edit73.Text:=IntToStr(c2);
c3:=c3 mod 60; Edit74.Text:=IntToStr(c3);
Edit54.ReadOnly:=true; Edit55.ReadOnly:=true;
Edit56.ReadOnly:=true;
end;
procedure TForm1.Button10Click(Sender: TObject); // Тастер обриши a,ha,hb
begin Edit54.Clear; Edit55.Clear; Edit56.Clear;
Edit57.Clear; Edit58.Clear; Edit59.Clear;
Edit60.Clear; Edit61.Clear; Edit62.Clear;
Edit63.Clear; Edit64.Clear; Edit65.Clear;
Edit66.Clear; Edit67.Clear; Edit68.Clear;
У понуди програмског окружења са којим радимо има још јако пуно занимљивих, а једноставних
компоненти, али њихова примена захтева познавање многих наредби које још нисмо научили и много
жеље и осећаја, али и времена проведеног уз рачунар на остварењу идеја. Неке од њих ћемо приказати
касније, када још нешто научимо и када се ослободимо страха и неверице или на додатној настави.
Следе задаци различите тежине које треба урадити да бисмо схватили где смо, на ком нивоу су наше
могућности, знање, интересовање .
Када у алгоритму за решавање неког проблема имамо потребу да се нека наредба изврши
више пута са променом почетних вредности или са истим вредностима онда имамо потребу за
наредбама циклуса (вишеструког извршавања). У зависности од тога да ли унапред знамо број
извршења циклуса или тај број зависи од неког услова разликујемо:
• бројачке циклусе и
• циклусе са условом
Бројачки циклус је For циклус. Код њега се тачно зна колико пута ће се извршити нека
наредба или група наредби. Циклус извршења наредби се не може прекинути пре извршења
унапред задатог броја понављања.
Циклуси са условом се извршавају произвољан број пута, а извршење циклуса наредби се
прекида када се постигне неки услов. Циклуси са условом могу бити:
• циклуси са условом на крају (Repeat ... until <uslov>) и
• циклуси са условом на почетку (While <uslov> do ...)
уведена је наредба Repeat ... until ... која се извршава све док се услов
који одређује број понављања не испуни.
Општи облик ове наредбе је:
REPEAT <naredba1>;
<naredba2>;
...
<naredbaN>;
UNTIL <uslov>;
Број наредби унутар циклуса није ограничен, тј. у случају да у циклусу треба да се изврши
више од једне наредбе нема потребе за писањем наредбе састављања, али је она дозвољена
(уколико неко баш воли да је пише може је додати и то ће бити без последица и без
нарушавања структуре програма само ће се програм, непотребно, компликовати).
Сваки задатак решен наредбом 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.
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
153 Рачунарство и информатика за трећи разред гимназије 153
Услов који одређује број извршавања циклуса може бити прост или сложен, тј. састављен
од неколико простих услова. У случају сложеног услова важе правила логичког закључивања,
а сваки од простих услова пише се између посебних заграда:
WHILE (uslov1)or(uslov2)and(uslov3) DO <naredba>;
да би се изашло из циклуса не сме бити испуњен први услов и бар један од друга два
услова.
WHILE ((uslov1)or(uslov2))and(uslov3) DO <naredba>;
да би се изашло из циклуса не сме бити испуњен ниједан од прва два услова или трећи
услов.
• Важно:
Наредбе break и continue нису у духу структурног програмирања јер ломе структуру
програма и као такве их треба избегавати. Добар програмер увек може организовати
циклус тако да коришћење ових наредби није потребно. Зато, у задацима које будемо
решавали нећемо користити ове наредбе.
Задаци са циклусима
Пошто смо до сада већ научили да дизајнирамо лепе форме у примерима који следе нећемо описивати
креирање форме, а нећемо ни писати процедуре за тастере Крај рада и Обриши, већ ћемо сву пажњу
посветити алгоритамском решењу проблема и приказивати само процедуре које описују алгоритам.
• Саставити програм који одређује збир првих n природних бројева.
Код задатака са циклусима важно је схватити механизам, односно, начин извршавања. На овом
примеру ћемо покушати да уђемо у штос. Од нас се тражи да саберемо неколико узастопних бројева.
Природно је овакво размишљање: сума = а1 + а2 + а3 + ... + аn, односно, напишемо све сабирке и затим два
по два сабирамо до коначног резултата. На рачунару се тако не може. Наиме, чак и када бисмо унапред
знали колико је бројева потребно сабрати не можемо овај природни запис превести у програм који ће
ефикасно радити. Овако ћемо размишљати: сума = (((...(а1) + а2) + а3) + ... + аn), а затим ћемо се
ослобађати заграда и сваки пут ћемо вредност заграде означавати неким симболом:
s1:=а1
s2:=а1+а2:=s1+а2
s3:=а1+а2+а3:=s2+а3
...
sn:=а1+а2+а3+...аn:=sn-1+а3
овај низ једнакости можемо поједностављено посматрати (приказати) и овако:
s1:=а1
s2:=s1+а2
s3:=s2+а3
...
sn:=sn-1+аn
сада замислимо да смо, грешком, испустили редне бројеве сума и добићемо:
s:=а1
s:=s+а2
s:=s+а3
...
s:=s+аn
односно, свака сума се израчунава тако што се претходној суми дода следећи елемент. Ако уместо
непознатих бројева а узмемо редом природне бројеве од 1 до n добићемо:
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
156 Рачунарство и информатика за трећи разред гимназије 156
s:=1
s:=s+2
s:=s+3
...
s:=s+n
Овакав низ израза може заменити изразом:
s:=1;
for i:=2 to n do s:=s+i;
Тако смо, коначно, дошли до решења овог задатка. Битно је
схватити да у изразу s:=s+i имамо s са леве стране знака
додељивања које представља променљиву којој се додељује
вредност и s са десне стране знака додељивања које представља
променљиву која има своју вредност добијену у претходном
кораку. Тако да, условно речено, ова два слова s не представљају
исту ствар, само се на исти начин записују. Код исписивања
програма изведену формулу ћемо модификовати због могућности
да корисник програма за n упише негативан број или нулу. Зато
ће почетна вредност за суму бити 0, а бројач i у циклусу ће
почети од 1. Контролу уноса смо могли остварити и на други
начин, на пример ако корисник унесе негативан број или 0 могли
смо дефинисати n као 1 или неки други природан број (ово је,
наравно, ствар избора програмера). Направимо сада форму за
овај задатак као на слици и напишимо комплетан програм.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
var n,i,s:integer;
begin n:=StrToIntDef(Edit1.Text,100);Edit1.Text:=IntToStr(n);
s:=0;
For i:=1 to n do
s:=s+i;
Edit2.Text:=IntToStr(s);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Написаћемо сада другу процедуру помоћу наредби repeat и while:
procedure TForm1.Button1Click(Sender: TObject);
var n,s:integer;
begin n:=StrToIntDef(Edit1.Text,1);
If n<1
then n:=1; // контрола је неопходна због почетне вредности суме
Edit1.Text:=IntToStr(n);
s:=n;
Repeat n:=n-1; // циклус for аутоматски мења вредност бројача, а repeat не
s:=s+n;
Until n<=1;
Edit2.Text:=IntToStr(s);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var n,s:integer;
begin n:=StrToIntDef(Edit1.Text,1);
// If n<1 then n:=1; ова контрола овде није неопходна јер је садржана у услову циклуса
Edit1.Text:=IntToStr(n);
s:=n;
While n>1 do
begin n:=n-1; // циклус for аутоматски мења вредност бројача, а while не
s:=s+n;
end;
Edit2.Text:=IntToStr(s);
Edit1.ReadOnly:=true;‚
Button2.SetFocus;
end;
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
157 Рачунарство и информатика за трећи разред гимназије 157
Приметили смо да је начин извршавања друга два циклуса нешто измењен. Наиме, сабирање се
извршава уназад, тј. од n до 1. Ово је учињено да би се уштедела једна променљива и то не би требало
битно да утиче на разумевање решења.
• Саставити програм који одређује збир првих n парних бројева.
Разлика између овог и претходног задатака је само у томе што
ћемо овде редом сабирати бројеве помножене са 2 да би били
парни.
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
var n,s,i:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
s:=0;
For i:=1 to n do
s:=s+2*i;
Edit2.Text:=IntToStr(s);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Написаћемо сада другу процедуру помоћу наредби repeat и while:
procedure TForm1.Button1Click(Sender: TObject);
var n,s:integer;
begin n:=StrToIntDef(Edit1.Text,1);
If n<1 then n:=1; // контрола је неопходна због почетне вредности суме
Edit1.Text:=IntToStr(n);
s:=2*n;
Repeat n:=n-1;
s:=s+2*n;
Until n<=1;
Edit2.Text:=IntToStr(s);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var n,s:integer;
begin n:=StrToIntDef(Edit1.Text,1);
// If n<1 then n:=1; ова контрола овде није неопходна јер је садржана у циклусу
Edit1.Text:=IntToStr(n);
s:=2*n;
While n>1 do
begin n:=n-1;
s:=s+2*n;
end;
Edit2.Text:=IntToStr(s);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
На сличан начин бисмо решили и сабирање првих n непарних бројева. Уместо s:=s+2*i, односно,
s:=s+2*n писали бисмо s:=s+2*i-1, односно, s:=s+2*n-1 и, наравно, у решењима са repeat и while почетна
вредност за суму била би s:=2*n-1.
• Саставити програм који одређује збир непарних бројева до n.
Разлика између овог и претходног задатака је у томе што ћемо овде сабирати сваки други број, почев од
броја један. Помоћу циклуса For пре сабирања броја треба проверити да ли је непаран, па ако јесте онда
ћемо га сабирати са претходним непарним. У циклусима са repeat и while немамо потребу за овим
тестирањем, већ ћемо подесити да корак буде 2, а почетна вредност бројача биће 1. Ако желимо решење
као у претходном задатку, тј. без променљиве бројача, онда треба наместити да n буде непаран број, а
затим сабирати уназад, сваки други број.
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Edit2.SetFocus;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
var m,n,i:integer;
s:real;
begin m:=Abs(StrToIntDef(Edit1.Text,1)); // Искључујемо негативне бројеве
n:=Abs(StrToIntDef(Edit2.Text,1)); // Искључујемо негативне бројеве
If m>n
then begin s:=m;m:=n;n:=s;
end;
If m=0 // Контролом мањег броја искључујемо могућност дељења нулом
then m:=1;
Edit1.Text:=IntToStr(m);
Edit2.Text:=IntToStr(n);
s:=0;
For i:=m to n do
s:=s+1/i;
Edit3.Text:=Format('%15.13f',[s]);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Функцијом Abs искључили смо негативне вредности граничних бројева, а дефинисали смо и да
границе не могу бити 0. Прво ограничење није неопходно, јер се могу сабирати и негативни бројеви,
али се поставља питање математичке исправности сабирања ако су границе супротног знака, а дељење
нулом се изостави из коначног резултата (На пример: ако се сабирају реципрочне вредности бројева од
-3 до 5 треба сабрати реципрочне вредности свих бројева, тј. не може се прескочити 0, а реципрочна
вредност за 0 није дефинисана). Функцијом Format дефинисали смо да се резултат испише на 15 места
као реалан број са 13 децимала. Исту процедуру написаћемо и помоћу циклуса repeat и while.
Погледајмо их и још једном уочимо разлику у начину размишљања код различитих врста циклуса.
procedure TForm1.Button1Click(Sender: TObject);
var m,n,p:integer;
s:real;
begin m:=Abs(StrToIntDef(Edit1.Text,1));
If m=0
then m:=1;
Edit1.Text:=IntToStr(m);
n:=Abs(StrToIntDef(Edit2.Text,1));
If n=0
then n:=1;
Edit2.Text:=IntToStr(n);
s:=1/n;
p:=(n-m)div Abs(n-m);
If m<>n then
Repeat s:=s+1/m;m:=m+p;
Until m=n;
Edit3.Text:=Format('%15.13f',[s]);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var m,n,p:integer;
s:real;
begin m:=Abs(StrToIntDef(Edit1.Text,1));
If m=0
then m:=1;
Edit1.Text:=IntToStr(m);
n:=Abs(StrToIntDef(Edit2.Text,1));
If n=0
then n:=1;
Edit2.Text:=IntToStr(n);
s:=1/n;
p:=(n-m)div Abs(n-m);
While m<>n do
begin s:=s+1/m;m:=m+p;
end;
Edit3.Text:=Format('%15.13f',[s]);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који исписује све троцифрене бројеве који су дељиви производом
својих цифара (водити рачуна да не дође до дељења са нулом).
Код овог задатака нећемо имати унос улазних података јер треба
проверити услов за све троцифрене бројеве. Зато ће и форма
бити нешто другачија, једноставнија. Комплетан програм ће се
аутоматски извршавати, без тастера Одреди и Обриши. За испис
резултата користићемо мемо поље које ће бити само за читање.
Тестирање ћемо започети од броја 111 јер сви претходни
троцифрени бројеви садрже цифру 0 и не могу бити дељиви
производом својих цифара, који је 0, па дељење нема смисла. У
прозору Object Tree View ћемо двокликом селектовати објекат
Form1 (или једним кликом на форму селектовати објекат, а
затим у Object Inspector-у на листићу Events два пута кликнути у
поље вредности догађаја OnCreate и написати процедуру:
procedure TForm1.FormCreate(Sender: TObject);
var i,c1,c2,c3,p:integer;
begin Memo1.Clear;
For i:=111 to 999 do
begin c1:=i mod 10;
c2:=i div 10 mod 10;
c3:=i div 100;
p:=c1*c2*c3;
If (p>0)and(i mod p=0) then Memo1.Text:=Memo1.Text+IntToStr(i)+' ';
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin Application.Terminate;
end;
Ако желимо да се бројеви исписују један испод другог, уместо команде:
Memo1.Text:=Memo1.Text+IntToStr(i)+' ';
унос у мемо поље остварићемо командом:
Memo1.Lines.Add(IntToStr(i)); или Memo1.Lines.Append(IntToStr(i));
Написаћемо ову процедуру и помоћу наредби repeat и while, али разлика је готово безначајна:
procedure TForm1.FormCreate(Sender: TObject);
var i,c1,c2,c3,p:integer;
begin Memo1.Clear; i:=111;
Repeat c1:=i mod 10;
c2:=i div 10 mod 10;
c3:=i div 100;
p:=c1*c2*c3;
If (p>0)and(i mod p=0) then Memo1.Lines.Text:=Memo1.Lines.Text+IntToStr(i)+' ';
i:=i+1;
until i=1000;
end;
procedure TForm1.FormCreate(Sender: TObject);
var i,c1,c2,c3,p:integer;
begin Memo1.Clear; i:=111;
While i<1000 do
begin c1:=i mod 10;
c2:=i div 10 mod 10;
c3:=i div 100;
p:=c1*c2*c3;
If (p>0)and(i mod p=0) then Memo1.Lines.Text:=Memo1.Lines.Text+IntToStr(i)+' ';
i:=i+1;
end;
end;
• Саставити програм који одређује да ли је број прост (број је прост ако осим себе самог
и јединице нема других делилаца).
Пошто су сви бројеви дељиви са 1 и самим собом те делиоце нећемо ни проверавати. У решавању задатка
можемо користити бројач делилаца - целобројну променљиву која ће се увећавати за 1 кад год нађемо
неки број који је делиоц уписаног броја. Ако је тај број различит од 0 број није прост. Друга могућност је
логичка променљива. Уписани број ћемо делити бројевима од 2 до половине уписаног броја, ако је неки
од бројева дели уписани број логичка променљива р ће добити вредност false, односно, број није прост
(почетна вредност променљиве р је true). Најпре ћемо креирати форму као на слици, а затим, написати
комплетан програм:
If d>Sqrt(b)
then Memo1.Lines.Add(Format('%5d',[b]));
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
или са двe наредбе циклуса while:
procedure TForm1.Button1Click(Sender: TObject);
var d,n,b:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
If n>0
then Memo1.Lines.Add(Format('%5d',[1]));
If n>1
then Memo1.Lines.Add(Format('%5d',[2]));
If n>2
then begin b:=3;
While b<=n do
begin d:=2;
While (d<=Sqrt(b))and(b mod d<>0) do
d:=d+1;
If d>Sqrt(b)
then Memo1.Lines.Add(Format('%5d',[b]));
b:=b+2;
end;
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Написаћемо ову процедуру и помоћу наредби repeat и while, али разлика је готово безначајна:
procedure TForm1.Button1Click(Sender: TObject);
var n,i:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
i:=n+1;
Repeat i:=i-1
until i*i<n;
Label3.Caption:='Trazeni broj je '+IntToStr(i);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
или:
procedure TForm1.Button1Click(Sender: TObject);
var n,i:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
i:=n;
While i*i>=n do i:=i-1;
Label3.Caption:='Trazeni broj je '+IntToStr(i);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује најмањи број чији је куб већи од уписаног броја.
Пустићемо циклус од уписаног броја до 1 и тестирати да ли је куб
бројача већи од уписаног броја и ако јесте исписаћемо га.
Последњи уписани број је тражени. Решење са циклусом for није
програмерски сасвим коректно јер, у ствари, исписује све кубове
веће од уписаног броја, а на крају се види само последњи (који
јесте најмањи и тражени) јер се сви они исписују у исту лабелу.
Коректно решење може да се добије без примене циклуса по
формули:
i:=Round(Exp(1/3*log(n)+0.51);
Међутим овде се трудимо да схватимо циклусе, па отуда и
овакво решење. Решења са циклусима repeat и while су коректна.
Најпре ћемо креирати форму, а затим написати и комплетан
програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Label3.Caption:='';
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
var n,i:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
For i:=n downto 1 do
If i*i*i>n then Label3.Caption:='Trazeni broj je '+IntToStr(i);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Написаћемо ову процедуру и помоћу наредби repeat и while, али разлика је готово безначајна:
procedure TForm1.Button1Click(Sender: TObject);
var n,i:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
i:=0;
Repeat i:=i+1;
Until i*i*i>n;
Label3.Caption:='Trazeni broj je '+IntToStr(i);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
или:
procedure TForm1.Button1Click(Sender: TObject);
var n,i:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
i:=0;
While i*i*i<=n do
i:=i+1;
Label3.Caption:='Trazeni broj je '+IntToStr(i);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
begin i:=i+1;
If n mod i=0
then Memo1.Lines.Add(Format('%5d,%5d',[i,n div i]));
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који уписани број исписује као производ простих делилаца.
Задатак је јако тешко решити помоћу циклуса for зато ћемо га решити само помоћу циклуса са условом,
прво уз помоћ циклуса repeat. У претходном задатку користили смо метод одређивања простих
делилаца дељењем док је број дељив са тим делиоцем, а исписивали смо га само једном. Сада ћемо,
сваки пут када се уписани број дели исписивати делилац све док је могуће делити број. Да би све то
личило на производ додаћемо * између сваког исписа делиоца. Резултат ћемо исписати у лабели на дну
форме. У решењу је коришћена стринг променљива р која се могла изоставити ако би се уместо ње
писало Label3.Caption, али овако је решење лепше. Најпре ћемо креирати форму, а затим написати и
комплетан програм:
begin n:=StrToIntDef(Edit1.Text,999);
If n<100
then n:=999;
Edit1.Text:=IntToStr(n);
For b:=100 to n do
begin c1:=b mod 10;
c2:=b div 10 mod 10;
c3:=b div 100;
z:=c1*c1*c1+c2*c2*c2+c3*c3*c3;
If b=z
then Memo1.Lines.Add(IntToStr(b));
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Јасно је да је овакво решење коректно, али су решења са циклусима са условом неупоредиво лепша и
ефектнија:
procedure TForm1.Button1Click(Sender: TObject);
var n,b,p,c,z:integer;
begin n:=StrToIntDef(Edit1.Text,999);
If n<100
then n:=999;
Edit1.Text:=IntToStr(n);
b:=100;
Repeat p:=b;z:=0;
Repeat c:=p mod 10;
z:=z+c*c*c;
p:=p div 10;
until p=0;
If b=z
then Memo1.Lines.Add(Format('%4d',[b]));
b:=b+1;
until b=n;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
или:
procedure TForm1.Button1Click(Sender: TObject);
var n,b,p,c,z:integer;
begin n:=StrToIntDef(Edit1.Text,999);
If n<100
then n:=999;
Edit1.Text:=IntToStr(n);
b:=1;
While b<>n do
begin p:=b;z:=0;
While p<>0 do
begin c:=p mod 10;
z:=z+c*c*c;
p:=p div 10;
end;
If b=z
then Memo1.Lines.Add(Format('%4d',[b]));
b:=b+1;
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var n,b,d,s:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
For b:=1 to n do
begin s:=1;
For d:=2 to b div 2 do
If b mod d=0
then s:=s+d;
If s=b
then Memo1.Lines.Add(Format('%4d',[b]));
end;
Edit1.ReadOnly:=true;Button2.SetFocus;
end;
Овакво решење је коректно и најједноставније, али написаћемо и решења са циклусима са условом:
procedure TForm1.Button1Click(Sender: TObject);
var n,b,d,s:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
b:=1;
Repeat s:=1;d:=2;
Repeat If b mod d=0
then s:=s+d;
d:=d+1;
until d>n div 2;
If s=b
then Memo1.Lines.Add(Format('%4d',[b]));
b:=b+1;
until b>n;
Edit1.ReadOnly:=true;Button2.SetFocus;
end;
или:
procedure TForm1.Button1Click(Sender: TObject);
var n,b,d,s:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
b:=1;
While b<=n do
begin s:=1;d:=2
While d<=b div 2 do
begin If b mod d=0
then s:=s+d;
d:=d+1;
end;
If s=b
then Memo1.Lines.Add(Format('%4d',[b]));
b:=b+1;
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује количник и остатак при целобројном дељењу два
уписана цела броја користећи само операције сабирања и одузимања.
Од првог броја одузимаћемо други. Сваки пут када одузмемо
други број, количник ћемо увећати за један. Када више не буде
могло да се одузима, односно, када први број постане мањи од
другог, број који је остао од почетног представља остатак при
целобројном дељењу. Задатак је немогуће решити помоћу
циклуса for јер треба од првог броја одузимати други све док се не
добије резултат који је мањи од првог броја, број одузимања је
непознат, па се не може поставити граница за бројач. Зато следе
само решења са циклусима repeat и while. Најпре ћемо креирати
форму, а затим написати и комплетан програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit4.Clear;
Edit1.SetFocus;
end;
• Саставити програм који исписује све просте бројеве мање од 1000 са две исте цифре.
Јасно је да, осим 11, нема двоцифрених простих бројева са две
исте цифре јер су сви такви дељиви баш са 11. Зато ћемо
тестирање почети од 101, а 11 ћемо исписати као почетну
вредност садржаја мемо поља. Задатак ћемо проширити тако да
граница не буде број 1000, већ да се може изабрати било која
граница. Јасно је да се до решења може доћи на више различитих
начина, а овде ће бити приказано једно од њих. За сваки број
већи од 100 проверићемо да ли је прост, па ако јесте одредићемо
његове цифре и од њих формирати скуп цифара. Код сваког
додавања цифре у скуп, прво ћемо проверити да ли се цифра
налази у скупу. Ако је цифра у скупу онда је испуњен услов
задатка, па ћемо га додати у мемо поље и одмах прелазимо на
тестирање следећег простог броја. Задатак ћемо решити
комбиновањем различитих наредби циклуса јер се тако добија
најефикасније решење. Циклусом repeat ћемо проћи кроз
непарне бројеве од 100 до уписаног броја, а циклусима while
ћемо одређивати да ли је број прост и да ли има бар две исте цифре. Задатак нећемо решавати помоћу
бројачког циклуса јер је спорији (зато што не можемо да искључимо из тестирања парне бројеве).
Најпре ћемо креирати форму, а затим написати и комплетан програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Memo1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
• Саставити програм који исписује све просте бројеве мање од 1000 са свим различитим
цифрама.
Јасно је да, осим 11, сви други прости бројеви до 100 не могу
имати исте цифре. Зато ћемо тестирање почети од 101, а све
претходне просте ћемо исписати као почетну вредност садржаја
мемо поља. Задатак ћемо проширити тако да граница не буде
број 1000, већ да се може изабрати било која граница. Јасно је да
се до решења може доћи на више различитих начина, а овде ће
бити приказано једно од њих. За сваки број већи од 100
проверићемо да ли је прост, па ако јесте одредићемо његове
цифре и од њих формирати скуп цифара. Код сваког додавања
цифре у скуп, прво ћемо проверити да ли се цифра налази у
скупу. Ако је цифра у скупу онда није испуњен услов задатка, па
га нећемо додати у мемо поље, већ тражимо следећи прост број.
Задатак ћемо решити са три while циклуса јер се тако добија
најефикасније решење. Првим циклусом ћемо проћи кроз
непарне бројеве од 3 до уписаног броја. Другим циклусом ћемо
одређивати да ли је број прост, а трећим да ли има истих цифара.
Задатак нећемо решавати помоћу бројачког циклуса јер је спорији (зато што не можемо да искључимо
из тестирања парне бројеве). Најпре ћемо креирати форму, а затим написати и комплетан програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Memo1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
var n,a,b,c,d:integer;
p:boolean;
sc:set of 1..9;
begin n:=StrToIntDef(Edit1.Text,1000);Edit1.Text:=IntToStr(n);
If n>0 then Memo1.Lines.Add(IntToStr(1));
If n>1 then Memo1.Lines.Add(IntToStr(2));
b:=3;
While b<=n do
begin d:=2;a:=b;
While (a mod d<>0)and(d<=Sqrt(a)) do d:=d+1;
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
179 Рачунарство и информатика за трећи разред гимназије 179
If d>Sqrt(a)
then If (b<100)and(b<>11)
then Memo1.Lines.Add(IntToStr(b))
else begin c:=a mod 10;
a:=a div 10;
sc:=[c];
p:=true;
While (a<>0)and(p) do
begin c:=a mod 10;
a:=a div 10;
If c in sc
then p:=false
else sc:=sc+[c];
end;
If p then Memo1.Lines.Add(IntToStr(b));
end;
b:=b+2;
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који одређује збир два цела броја са двадесет и више цифара.
Из услова задаткавиди се да ћемо сабирке унети као стрингове и затим карактер по карактер с десна у
лево претварати у бројеве, сабирати и формирати цифре резултата водећи при томе рачуна о
евентуалном преносу (када је збир две цифре већи од 9). Цифре резултата ћемо, такође, претварати у
стринг и тако памтити резултат. Да бисмо добили најједноставније решење најпре ћемо одредити која
реч је краћа (ако нису исте дужине), а затим ћемо ту реч допунити нулама са леве стране (да се збир не
би променио) тако да се добију две речи једнаке дужине. Задатак се може решити применом било које
наредбе циклуса, а најефикаснији је са for. Најпре ћемо креирати форму, а затим написати и комплетан
програм:
end;
If p>0 then c:=IntToStr(p)+c;
Edit3.Text:=c;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Занимљиво би било одредити разлику и производ оваквих бројева.
• Саставити програм који одређује количник два броја на најмање педесет децимала.
Да бисмо могли да испишемо број са педесет децимала морамо
резултат дељења да конвертујемо у стринг. Почетна вредност за
количник биће целобројни количник унетих бројева конвертован
у стринг, а затим ћемо у тај стринг додати децимални зарез и
целобројне количнике остатка при дељењу помноженог са десет
и другог броја. Поступак понављамо све док не добијемо
одговарајући број децимала. Најпре ћемо креирати форму, а
затим написати и комплетан програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Edit1.SetFocus;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
var c:string;
a,b,i,n:integer;
begin a:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(a);
b:=StrToIntDef(Edit2.Text,1);Edit2.Text:=IntToStr(b);
n:=50;
c:=IntToStr(a div b)+'.';
For i:=1 to n do
begin a:=a mod b*10;
c:=c+IntToStr(a div b);
end;
Edit3.Text:=c;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
или:
procedure TForm1.Button1Click(Sender: TObject);
var c:string;
a,b,n:integer;
begin a:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(a);
b:=StrToIntDef(Edit2.Text,1);Edit2.Text:=IntToStr(b);
n:=50;
c:=IntToStr(a div b)+'.';
Repeat a:=a mod b*10;
c:=c+IntToStr(a div b);
n:=n-1;
until n=0;
Edit3.Text:=c;
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
или:
procedure TForm1.Button1Click(Sender: TObject);
var c:string;
a,b,n:integer;
begin a:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(a);
b:=StrToIntDef(Edit2.Text,1);Edit2.Text:=IntToStr(b);
n:=50;
b:=b*(n-i+1)/i;
until i>=k;
Memo1.Lines.Add(IntToStr(Trunc(b)));
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
или:
procedure TForm1.Button1Click(Sender: TObject);
var n,k,i:integer;
b:real;
begin n:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(n);
k:=StrToIntDef(Edit2.Text,0);
If k>n
then k:=n;
Edit2.Text:=IntToStr(k);
b:=1;i:=0;
While i<k do
begin i:=i+1;
b:=b*(n-i+1)/i;
end;
Memo1.Lines.Add(IntToStr(Trunc(b)));
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
или:
procedure TForm1.Button1Click(Sender: TObject);
var n,k,i:integer;
b:real;
a:string;
begin n:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(n);
a:='';k:=0;
While k<=n do
begin b:=1;i:=0;
While i<k do
begin i:=i+1;
b:=b*(n-i+1)/i;
end;
a:=a+IntToStr(Trunc(b))+' ';
k:=k+1;
end;
Label3.Caption:=a;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
a:=a+Format('%4.0f',[b]);
k:=k+1;
until k>n;
Memo1.Lines.Add(a);
n:=n+1;
until n>p;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
или:
procedure TForm1.Button1Click(Sender: TObject);
var n,p,k,i:integer;
b:real;
a:string;
begin p:=StrToIntDef(Edit1.Text,0);Edit1.Text:=IntToStr(p);
n:=0;
While n<=p do
begin a:='1';k:=1;
While k<=n do
begin b:=1;i:=0;
While i<k do
begin i:=i+1;
b:=b*(n-i+1)/i;
end;
a:=a+Format('%4.0f',[b]);
k:=k+1;
end;
Memo1.Lines.Add(a);
n:=n+1;
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који на случајан начин формира n бројева, а затим одређује највећи
и најмањи број, њихове редне бројеве и аритметичку средину.
Задатак демонстрира рад са низом бројева, када није потребно
чувати вредности свих елемената низа. Генерисаћемо први број
и прогласити га највећим и најмањим, а затим ћемо формирати
остале бројеве и упоређивати са вредностима највећег и најмањег.
Кад год наиђемо на већи, прогласићемо нови највећи. Кад год
наиђемо на мањи, прогласићемо нови најмањи. Чуваћемо редне
бројеве највећег и најмањег елемента. Без обзира на величину
сабраћемо генерисани број са свим претходним. Аритметичку
средину ћемо одредити дељењем збира са n. Најпре ћемо креирати
форму, а затим написати и комплетан програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit3.Clear;Edit4.Clear;
Edit5.Clear;Edit6.Clear;
Memo1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
var x,m,rx,rm,s,b,n,i:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
Randomize;
If n>0 then
begin b:=Random(1000);
Memo1.Lines.Add(Format('%2d.%4d',[1,b]));
s:=b;
x:=b;rx:=1;
m:=b;rm:=1;
For i:=2 to n do
begin b:=Random(1000);s:=s+b;
If b>x
then begin x:=b;rx:=i;
end;
If b<m
then begin m:=b;rm:=i;
end;
Memo1.Lines.Add(Format('%2d.%4d',[i,b]));
end;
Edit2.Text:=IntToStr(x);Edit3.Text:=IntToStr(rx);
Edit4.Text:=IntToStr(m);Edit5.Text:=IntToStr(rm);
Edit6.Text:=FloatToStr(s/n);
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Циклус се користи само за бројање формираних елемената зато задатак нећемо решавати циклусима са
условом.
• Саставити програм који за два уписана броја одређује најмањи заједнички садржалац.
Постоји неколико алгоритама за одређивање најмањег заједничког
садржалца. Овде су приказана три:
- за нзс - бројач узимамо први број, а затим у циклусу
проверавамо да ли је бројач дељив са оба броја, ако јесте то је нзс,
ако није повећавамо бројач за један .
- за нзс узимамо један од уписаних бројева и проверавамо
да ли је други број његов делилац, ако јесте то је нзс, ако није
потенцијални нзс увећавамо за први број све док не нађемо прави.
- за нзс узимамо производ уписаних бројева, а затим тај
производ смањујемо за један све до једног од уписаних бројева и
проверавамо да ли је дељив са оба уписана броја, па ако јесте то
је нови нзс који исписујемо. Последњи исписани нзс је заиста то.
Други алгоритам је најефикаснији и њега треба запамтити.
Ако знамо нзд, онда нзс добијамо из формуле: nzs * nzd = a * b.
Најпре ћемо креирати форму, а затим написати и комплетан
програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Edit2.SetFocus;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject); // први алгоритам
var a,b,nzs,p:integer;
begin a:=StrToIntDef(Edit1.Text,3);Edit1.Text:=IntToStr(a);
b:=StrToIntDef(Edit2.Text,4);Edit2.Text:=IntToStr(b);
If a>b
then begin p:=a;a:=b;b:=p;
end;
nzs:=b;
While (nzs mod a<>0)or(nzs mod b<>0) do nzs:=nzs+1;
Edit3.Text:=IntToStr(nzs);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject); // други алгоритам
var a,b,nzs,p:integer;
begin a:=StrToIntDef(Edit1.Text,3);Edit1.Text:=IntToStr(a);
b:=StrToIntDef(Edit2.Text,4);Edit2.Text:=IntToStr(b);
If a>b
then begin p:=a;a:=b;b:=p;
end;
nzs:=b; // ако пођемо од већег броја добијамо на ефикасности алгоритма
While nzs mod a<>0 do
nzs:=nzs+b;
Edit3.Text:=IntToStr(nzs);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject); // трећи алгоритам
var a,b,nzs,p:integer;
begin a:=StrToIntDef(Edit1.Text,3);Edit1.Text:=IntToStr(a);
b:=StrToIntDef(Edit2.Text,4);Edit2.Text:=IntToStr(b);
p:=a*b+1;
Repeat p:=p-1;
If (p mod a=0)and(p mod b=0) then nzs:=p;
until nzs=b;
Edit3.Text:=IntToStr(nzs);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који за два уписана броја одређује највећи заједнички делилац.
Постоји неколико алгоритама за одређивање највећег заједничког
делиоца. Овде су приказана три:
- за нзд узимамо број 1, а затим у циклусу повећавамо бројач
до једног од два унета броја и проверавамо да ли је делилац оба
броја, па ако јесте постављамо њега за нови нзд. Последњи од
таквих бројева је тражени нзд.
- за нзд узимамо један од уписаних бројева и проверавамо
да ли је делилац другог броја, па ако јесте то је нзд, а ако није
потенцијални нзд смањујемо га за један све док не нађемо број
који је делилац оба броја.
- за нзд узимамо мањи од уписаних бројева и проверавамо
да ли је делилац већег, ако није од већег одузимамо мањи и мањи
проглашавамо потенцијалим нзд и поступак понављамо све док
не добијемо делилац већег броја који представља нзд.
Трећи алгоритам је најефикаснији, па га треба запамтити.
Ако знамо нзс, онда нзд добијамо из формуле: nzs * nzd = a * b.
Најпре ћемо креирати форму, а затим написати и комплетан програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Edit2.SetFocus;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject); // први алгоритам
var a,b,nzd,p:integer; // i:integer;
begin a:=StrToIntDef(Edit1.Text,3);Edit1.Text:=IntToStr(a);
b:=StrToIntDef(Edit2.Text,4);Edit2.Text:=IntToStr(b);
If a>b
then begin p:=a;a:=b;b:=p;
end;
p:=0;
Repeat p:=p+1;
If (a mod p=0)and(b mod p=0) then nzd:=p;
until p=b;
// решење са for је нешто мало једноставније, али су оба решења прилично неефикасна
// For i:=1 to a do
// If (a mod i=0)and(b mod i=0)
// then nzd:=i;
Edit3.Text:=IntToStr(nzd);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
189 Рачунарство и информатика за трећи разред гимназије 189
• Саставити програм који за текст написан у MemoBox-у одређује број речи дужине 5
карактера.
Граничник речи може бити размак, зарез, тачка, знак узвика или
знак питања, али и ознака краја реда (#13) и ознака прекида
реда (#10) и све ове карактер (ова последња два нису видљива)
треба пронаћи у тексту, а граница речи је први од њих.
Функцијом Pos() ћемо одредити позицију сваког од њих и
пронаћи најмањи број који представља крај речи. Овај поступак
ћемо користити у свим задацима где се траже речи са неким
карактеристикама, а мало модификован ће бити користан и за
одређивање реченице или неког специјалног низа карактера.
Променљивој r ћемо доделити ту реч и проверити да ли она има
одговарајућу дужину. У задатку се траже речи са 5 карактера,
али решење које приказујемо је општије и корисник може да
упише дужину коју жели, тако да је алгоритамски коректније.
Бројач d се увећава када је пронађена реч одговарајуће дужине и
исписује се на крају програма. Услов за крај претраживања је да
је остатак текста дужине 0 карактера и да има размака у тексту.
Овај други услов обезбеђује рад програма и у случају када се
текст састоји из само једне речи, па нема ниједног од карактера који ограничавају реч. Процедуром
Edit1KeyPress() смо заштитили први едит од уноса слова и знакова, а процедуром Edit1Enter() смо
дефинисали да се садржај оба едита брише када се курсор постави у први. Зато процедуру која се
извршава када се кликне тастер Обриши не треба користити ако желимо само да променимо дужину речи
да бисмо проверили колико има речи те друге дужине. Након креирања форме написаћемо комплетан
програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Memo1.Clear;Memo1.ReadOnly:=false;
Edit1.Clear;
Edit2.Clear;
Memo1.SetFocus;
end;
procedure TForm1.Edit1Enter(Sender: TObject);
begin Edit1.Clear;
Edit2.Clear;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
var s,r:string;
a,b,d,n:integer;
begin n:=StrToIntDef(Edit1.Text,5);Edit1.Text:=IntToStr(n);
s:=Memo1.Text+' ';
d:=0;
While (Length(s)>0)and(Pos(' ',s)<>0) do
begin a:=Pos(' ',s);
b:=Pos(#13,s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos(#10,s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos(',',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('.',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('!',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('?',s);
If (a>0)and(b>0)and(b<a) then a:=b;
r:=Copy(s,1,a-1); // формира реч
Delete(s,1,a); // брише реч из текста
If a=n+1 // проверава да ли је реч жељене дужине
then d:=d+1; // броји речи жељене дужине
end;
If Length(s)=n+1 // проверава да ли је остатак текста реч жељене дужине
then d:=d+1; // ако јесте убраја и њу
Edit2.Text:=IntToStr(d);// исписује резултат
Memo1.ReadOnly:=true;
end;
• Саставити програм који за текст написан у MemoBox-у одређује прву реч која завршава
малим словом а.
Разлика између овог и претходног задатка је у томе што се овде
тражи само прва реч која завршава задатим карактером. То
значи да треба увести променљиву показивач која ће променити
вредност оног тренутка када нађемо реч која задовољава услов
задатка. Ова променљива мора да учествује у услову циклуса
који претражује речи јер претраживање мора да се прекине чим
се реч пронађе. Други услов је да је комплетан текст претражен,
тј. да је остатак текста дужине 0 карактера. Услови да нешто
буде реч су они исти као у и претходним задацима. Након
креирања форме написаћемо комплетан програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Memo1.Clear;Memo1.ReadOnly:=false;
Edit1.Clear;Edit2.Clear;
Memo1.SetFocus;
end;
b:=Pos(',',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('.',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('!',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('?',s);
If (a>0)and(b>0)and(b<a) then a:=b;
r:=Copy(s,1,a-1);Delete(s,1,a);d:=d-1;
If (Length(r)>0)and(Pos(c,r)>0)
then For i:=1 to Length(r) do
If r[i]=c then n:=n+1;
end;
Edit3.Text:=IntToStr(n);
end;
• Саставити програм који за текст написан у MemoBox-у у други MemoBox исписује све
речи које не садрже симбол *.
Као и у неким ранијим задацима, одређиваћемо речи, затим
проверавати да ли се задати карактер налази у њима. Решење
које је приказано је општије од траженог условима задатка јер
дозвољава кориснику да изабере карактер који ће се тражити у
речима. Мемо поље у које исписујемо пронађене речи се брише
чим се промени карактер који се тражи. Након креирања форме
написаћемо комплетан програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Memo1.Clear;Memo1.ReadOnly:=false;
Edit1.Clear;Memo2.Clear;
Memo1.SetFocus;
end;
procedure TForm1.Edit1Enter(Sender: TObject);
begin Edit1.Clear;Memo2.Clear;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13 then Button1.Click;
end;
• Саставити програм који за текст написан у MemoBox-у у други MemoBox исписује све
речи које имају дужину више од три слова.
Као у неким ранијим задацима одређиваћемо речи, а онда ћемо
проверавати да ли су задате дужине. Решење које је приказано
општије је од траженог у условима задатка јер дозвољава
кориснику да изабере дужину речи које ће се тражити. Мемо
поље у које исписујемо пронађене речи се празни чим се
промени дужина речи које се траже. Након креирања форме
написаћемо комплетан програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Memo1.Clear;Memo1.ReadOnly:=false;
Edit1.Clear;Memo2.Clear;
Memo1.SetFocus;
end;
procedure TForm1.Edit1Enter(Sender: TObject);
begin Edit1.Clear;Memo2.Clear;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
var s,r:string;
a,b,n:integer;
begin s:=Memo1.Text+' ';
n:=StrToIntDef(Edit1.Text,3);Edit1.Text:=IntToStr(n);
While Length(s)>0 do
begin a:=Pos(' ',s);
b:=Pos(#13,s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos(#10,s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos(',',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('.',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('!',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('?',s);
If (a>0)and(b>0)and(b<a) then a:=b;
r:=Copy(s,1,a-1);
Delete(s,1,a);
If Length(r)>n
then Memo2.Lines.Add(r);
end;
end;
• Саставити програм који у уписаном стрингу одређује најдужи подниз који се састоји
само из цифара.
Овде нам нису потребне речи. Потребно је наћи низ узастопних
цифара и одредити његову дужину. Може се десити да у тексту има
више низова цифара и у том случају треба одредити који је најдужи,
или да цифара нема у тексту који анализирамо, у том случају
исписујемо одговарајућу поруку. Низ цифара може да почне
било којом цифром, па је услов почетка низа је компликованији.
Зато смо услов за одређивање почетка низа цифара представили
бројачким циклусом. Да бисмо утврдили да у тексту нема
цифара увели смо бројач n који је на почетку бројачког циклуса
0, тј. претпостављамо да цифре постоје у тексту, а затим, кад год
утврдимо да нека цифра не постоји, бројач увећавамо за један.
Ако је n=10 значи да нисмо пронашли ниједну цифру у тексту и
треба испразнити текст да бисмо изашли из претраживања. У
• Саставити програм који у уписаном стрингу одређује најдужу реч (низ карактера
ограничен размацима).
Задатак је само наизглед сличан претходном. Међутим, овде
прво треба одредити реч (као у неким претходним решењима), а
затим и њену дужину, па онда треба проверити и да ли је она
најдужа реч. Такође, треба предвидети и могућност да текст
буде празан, тј. да уопште нема речи. Након креирања форме
написаћемо комплетан програм:
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Memo1.Clear;Memo1.ReadOnly:=false;
Edit1.Clear;
Memo1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var s,r:string;
a,b,n:integer;
begin s:=Memo1.Text+' ';
n:=0;r:='';
While Length(s)>0 do
begin a:=Pos(' ',s);
b:=Pos(#13,s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos(#10,s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos(',',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('.',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('!',s);
If (a>0)and(b>0)and(b<a) then a:=b;
b:=Pos('?',s);
If (a>0)and(b>0)and(b<a) then a:=b;
If a-1>n
then begin n:=a-1;
r:=Copy(s,1,a-1);
end;
Delete(s,1,a);
end;
If n>0
then Edit1.Text:=r
else Edit1.Text:='Не постоји реч.';
end;
var n,i:integer;
s,p,z,x:real;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
x:=StrToFloatDef(Edit2.Text,1);
Edit2.Text:=FloatToStr(x);
s:=0; z:=1;
p:=sin(x);
For i:=1 to n do
begin z:=z*p; s:=s+z;
end;
Edit3.Text:=FloatToStr(s);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Много је ефектније и ефикасније следеће решење (јер не рачуна ни факторијеле и ни степене; идеја је
да се они напишу у развијеном облику, па се онда формирају производи количника):
procedure TForm1.Button1Click(Sender: TObject);
var n,i:integer;
s,p,x:real;
begin n:=StrToIntDef(Edit1.Text,5);Edit1.Text:=IntToStr(n);
x:=StrToFloatDef(Edit2.Text,1);Edit2.Text:=FloatToStr(x);
s:=1; p:=1;
For i:=1 to n do
begin p:=p*i/x;
s:=s+p;
end;
Edit3.Text:=FloatToStr(s);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Edit4.Text:=FloatToStr(a/b);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који исписује све троцифрене бројеве који су једнаки збиру
факторијела својих цифара.
• Саставити програм који за текст написан у MemoBox-у одређује:
- Прву реч која почиње великим словом К
- Број речи које почињу и завршавају истим словом
- Број великих слова у тексту
- Број појављивања речи Delphi и број појављивања речи Pascal
• Саставити програм који за текст написан у MemoBox-у у други MemoBox исписује:
- Све речи које завршавају малим словом е
- Све речи из текста у обрнутом поретку слова
- Све речи из текста са великим почетним словом
- Све речи које почињу и завршавају истим словом
- Исти текст, али из кога су избрисани сви симболи *
- Исти текст, али у коме су слова с замењена симболом *
• Саставити програм који одређује вредност суме:
1 1 1
a 1
1 1 1
1 2 1 2 3 1 2 13
1 1
n
• Саставити програм који одређује редни број првог елемента низа задатог формулом:
xn
an , x R, n N који је мањи од произвољног, унапред задатог броја .
n!
Стање сваког објекта класе дефинишу поља класе. Поља која одражавају стање које је
јединствено називају се променљиве примерка. Када је декларисано, поље се може
иницијализовати додељивањем вредности одговарајућег типа. Иницијализатор не мора бити
константа, већ може бити друго поље, позив методе или неки израз који садржи ова два
елемента, док год одговарају по типовима. Различите класе могу имати различит број и врсте
поља. Вредности поља могу се дефинисати у фази израде апликације, али и касније, у фази
извршавања, ако је алгоритамски предвиђено, односно, ако се та промена не би могла лоше
одразити на ток извршења алгоритма. На пример, било би прилично непрофесионално
дозволити кориснику да у току извршавања програма обрише едит за унос података или
дугме за излазак из програма.
Класа, осим објеката, садржи и методе, односно, операције које су дефинисане са
објектима те класе. Операције морају да се декларишу и дефинишу. Декларација мора
садржати тип операције, назив и параметре са којима ради. Као метода може се дефинисати
функција или процедура. Једним именом функције и процедуре зовемо потпрограмима зато
што имају структуру било којег програма, али не могу да стоје самостално, јер су везане за
објекат класе и извршавају се као реакција на неки догађај објекта. Потпрограми могу бити
дефинисани и изван класе и не морају бити ни у каквој вези са објектима класе. Зато ћемо овде
обрадити и функције и процедуре које нису методе класе. Структура је потпуно иста, разлика је
само у власнику и параметрима функције или процедуре и у начину позивања. Методе класе
позивају се као реакција на неки догађај, а позиви других функција или процедура пишу се у
оквиру неке наредбе или су независне наредбе програма.
Врло често програм који пишемо постаје јако компликован, при чему се неки делови
програма понављају са истим или сличним вредностима. Да би се поједноставило писање,
читање и разумевање програма делови програма се издвајају у посебне релативно независне
целине које се називају потпрограмима. Потпрограмима се придружује симболичко име
помоћу којег ће се позивати из програма кад год је потребно извршити те издвојене радње.
Потпрограми имају исту структуру као и сам програм, тј. имају заглавље и тело са наредбама.
Потпрограми морају да се деклариши и дефинишу. Декларација се пише у заглављу програма,
у делу за декларације, а дефиниције се пишу у делу за дефиниције (после службене речи
implementation). Разликујемо две врсте потпрограма: функције и процедуре.
Функције су једноставније. Декларишу се службеном речи function, својим именом,
аргументима са типом и типом функције, на пример:
function Stepen(b,e:real):real;
Декларација функције може да се напише у делу означеном са private или public.
Приватне декларације видљиве су само из класе којој припадају, а јавне декларације су
видљиве из читавог програма. Видљиве, значи да се могу позивати.
Функција може имати произвољан број аргумената који могу, а не морају бити истог
типа. Они се називају још и улазним параметрима или улазним променљивама зато што
вредност добијају у главном програму и ту своју вредност преносе у функцију. Осим улазних
постоје и излазни параметри који своју вредност преносе из функције у главни програм.
Функција може имати само један излазни параметар и то је само име функције (зато функција
мора имати декларисан тип јер се помоћу њеног имена нека вредност преноси у програм). Да би
се нека вредност из функције пренела у главни програм, имену функције се бар једном мора
доделити вредност. У телу са наредбама име функције не сме да се нађе са десне стране знака
додељивања нити у оквиру неке друге наредбе или израза, јер би то било позивање функције
из саме функције, па би то била рекурзивна функција. Рекурзивне функције су специфичне
функције које саме себе позивају. Коришћењем рекурзивних функција формално се избегава
коришћење наредби циклуса, али како оне саме представљају једну нову врсту циклуса, то
значи да њиховом употребом не избегавамо стварно коришћење циклуса, већ само користимо
једну другачију врсту циклуса. При креирању рекурзивних функција мора се водити рачуна да
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
204 Рачунарство и информатика за трећи разред гимназије 204
постоји најмање један коректан услов који ће одређивати колико пута ће она саму себе позивати.
Ако се напише некоректан или погрешан услов програм неће давати исправне резултате или
ће се ублокирати.
Функција мора да се дефинише да би могла да се користи у програму. Дефиниција функције
је навођење радњи које се врше над неким подацима ради добијања неког резултата.
Дефиниција функције се састоји из заглавља које мора бити идентично заглављу у декларацији
функције и тела функције са наредбама, на пример:
function TForm1.Stepen(b,e:real):real;
var s:real;
begin s:=1;
While e>0 do begin s:=s*b; e:=e-1;
end;
stepen:=s;
end;
Једина разлика је TForm1. ознака која нам говори коме припада дефинисана функција.
Улазне променљиве у заглављу дефиниције морају бити истог имена и типа и написане
истим редоследом као и у декларацији. Тип функције, такође мора бити идентичан типу функције
у декларацији.
Осим улазних параметара, у функцији се могу користити и локалне и глобалне променљиве.
Дефиниција функције се не сме преклапати са неком другом процедуром или функцијом, а име
функције не сме бити исто као име неке друге функције, процедуре или променљиве. Име
функције може се слободно изабрати при чему треба водити рачуна да се не користе
резервисане речи и стандардни идентификатори. Обавезно је да име почне словом енглеске
абецеде и не сме да садржи специјалне и знаке интерпункције.
Променљиве b и e у примеру декларације и дефиниције функције Stepen су формални
параметри, тј. њихова функција је задовољење форме и немају никакву вредност. Када се
функција позива из главног програма позива се са стварним, конкретним вредностима и зато
се променљиве у позиву процедуре зову стварни параметри.
Функција се позива из главног програма навођењем имена и стварних параметара УВЕК
из неке друге наредбе. Стварни параметри могу бити променљиве којима су додељене вредности
у претходним наредбама програма, позиви неке друге дефинисане функције или конкретне
вредности. Једини услов за стварне параметре је да се морају слагати по типу са формалним
параметрима. Позив функције није независна наредба програма, а не може се у програму наћи
ни са леве стране знака додељивања. Примери позива функције:
a:=Stepen(b,n); <- одређује н-ти степен броја б
a:=Stepen(b,3); <- одређује трећи степен броја б
a:=Stepen(2,4); <- одређује четврти степен броја 2
Процедура је издвојени низ радњи који представља логичку целину посебно именовану
ради позивања и извршавања по позиву у било којем делу програма. Процедуре се декларишу
службеном речи procedure, именом процедуре и улазним и излазним параметрима, на пример:
procedure Stepen(b,e:real;VAR s:real);
Процедура може имати произвољан број улазних и излазних параметара. Излазни се од
улазних параметара одвајају службеном речи Var. Улазни параметри вредност добијају у главном
програму и ту вредност преносе у процедуру, вредност могу мењати у процедури, али се њихова
нова вредност не преноси у главни програм. Излазни параметри процедуре своју вредност
могу добијати у главном програму и уносити је у процедуру, могу добијати и мењати вредност
унутар процедуре, а своју вредност преносе из процедуре у главни програм. Редослед параметара
није предефинисан, тј. не морају сви улазни параметри бити на почетку, а излазни на крају
листе. Могу се и наизменично писати један улазни, па један излазни, ако нам се тако свиђа, али
је при томе, обавезно, да испред сваке листе излазних променљивих које су истог типа
напишемо службену реч Var. Број улазних и излазних параметара није ограничен већ зависи
од тога шта се обрађује и шта је резултат обраде у процедури. У телу са наредбама процедуре
не сме се наћи име процедуре јер би то било позивање процедуре из саме процедуре, па би то
онда била рекурзивна процедура. Рекурзивне процедуре су специфичне процедуре које саме
себе позивају. Коришћењем рекурзивних процедура формално се избегава коришћење наредби
циклуса, али како саме те процедуре представљају једну нову врсту циклуса, то значи да њиховом
употребом не избегавамо стварно коришћење циклуса, већ само користимо једну другачију врсту
циклуса. При креирању рекурзивних процедура мора се водити рачуна да постоји најмање
један коректан услов који ће одређивати колико пута ће саму себе позивати. Ако се напише
некоректан или погрешан услов програм неће давати исправне резултате или ће се ублокирати.
променљива чије име се поклапа са именом неке глобалне променљиве онда се у тој функцији
или процедури не може користити вредност глобалне променљиве већ само локална и
вредност локалне променљиве се ни на који начин не одражава на вредност глобалне.
Задаци који следе биће урађени на два начина: први ће бити сирово решавање задатка уз минимално
коришћење уметничког надахнућа, а други начин ће бити покушај да неке од читалаца ових редова
убеди да свет програмирања може бити цветни аранжман који креирамо срцем и свом својом душом.
Задаци са функцијама и процедурама се решавају као и сви други, разлика је само што неке, погодне
делове програма замењујемо позивима функција или процедура и на тај начин олакшавамо писање,
читање и разумевање програма.
Први задатак ћемо објаснити детаљно да би се схватила суштина и предност коришћења кориснички
дефинисаних функција и процедура, док ћемо наредне задатке решавати у тишини, односно, са много
мање коментарисања, препуштајући читаоцима да сами дођу до неких, корисних закључака.
• Саставити програм који одређује n-ти степен уписног броја.
Након креирања форме написаћемо комплетан програм:
// двокликом на први едит декларише се процедура
// брише резултат ако се промени експонент
// ова процедура није неопходна јер се контрола уноса и
// исписа остварује помоћу ReadOnly контрола едита
procedure TForm1.Edit1Change(Sender: TObject);
begin Edit3.Clear;
end;
// у Object Inspector-у на листићу Events дефинишемо
// реакцију на догађај OnKeyPress
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['-','0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Edit2.SetFocus;
end;
// у Object Inspector-у на листићу Events дефинишемо реакцију на догађај OnChange тако што
// из падајућег менија изаберемо већ дефинисану процедуру Edit1KeyPress на тај начин смо
// дефинисали да се резултат брише и ако се основа промени
// у Object Inspector-у на листићу Events дефинишемо реакцију на догађај OnKeyPress
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
// двокликом на тастер Крај рада декларише се процедура
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
// двокликом на тастер Обриши декларише се процедура
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;
Edit1.SetFocus;
end;
// двокликом на тастер Одреди декларише се процедура
procedure TForm1.Button1Click(Sender: TObject);
var n,b:integer;
s:real;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
b:=StrToIntDef(Edit2.Text,1);Edit2.Text:=IntToStr(b);
s:=Stepen(b,Abs(n));
If n<0
then Edit3.Text:=Format('%1.5f',[1/s])
else Edit3.Text:=Format('%1.0f',[s]);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
Функцију Stepen(b,n) ћемо прво декларисати у делу за декларације (испод службене речи private). Ово
морамо да урадимо сами јер функција није реакција на неки догађај, па преводилац не може да је
препозна и декларише сам.
private
function Stepen(o,e:integer):integer;
Оваква декларација значи: функција има формалне целобројне параметре о - основа и е - експонент и
целобројна је. Сада функцију треба дефинисати. То можемо урадити било где у телу програма, а
најједноставније је пре самог краја програма (пре краја са тачком, испред end. додаћемо ред и уписати
дефиницију функције). Комплетну дефиницију, и заглавље и тело функције са наредбама, такође,
пишемо сами.
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
210 Рачунарство и информатика за трећи разред гимназије 210
else p:=d>Sqrt(a);
end;
// процедура која проверава да ли број има све различите цифре
procedure TForm1.Isto(a:integer;var p:boolean);
var c:integer;
sc:set of 0..9;
begin sc:=[a mod 10];
a:=a div 10;
p:=true;
Repeat c:=a mod 10;
a:=a div 10;
If c in sc
then p:=false
else sc:=sc+[c];
Until a=0;
end;
Процедуру и функцију Isto, такође, можемо написати као рекурзивне, али оне не постају ништа
једноставније, па на томе ни овог пута нећемо инсистирати.
• Саставити програм који одређује збир цифара савршених бројева до n.
Направићемо логичку функцију која одређује да ли је неки број
савршен и целобројну функцију која одређује збир цифара броја.
Најпре ћемо креирати форму као на слици, а затим написати
комплетан програм:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;
Memo1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var n,i,z:integer;
begin n:=StrToIntDef(Edit1.Text,1);Edit1.Text:=IntToStr(n);
z:=0;
For i:=1 to n do
If Savrsen(i)
then begin Memo1.Lines.Add(IntToStr(i));
z:=z+ZCifara(i);
end;
Edit2.Text:=IntToStr(z);
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
// функција која проверава да ли је број савршен
function TForm1.Savrsen(b:integer):boolean;
var s,d:integer;
begin s:=1;
For d:=2 to b div 2 do
If b mod d=0
then s:=s+d;
savrsen:=s=b;
end;
// функција која одређује збир цифара броја
function TForm1.ZCifara(b:integer):integer;
var s:integer;
begin s:=0;
Repeat s:=s+b mod 10;
b:=b div 10;
until b=0;
zcifara:=s;
end;
// рекурзивна функција која одређује збир цифара броја
function TForm1.ZCifara(b:integer):integer;
begin If b=0
then zcifara:=0
else zcifara:=b mod 10+zcifara(b div 10);
end;
Исто, са процедурама:
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
217 Рачунарство и информатика за трећи разред гимназије 217
For a:=1 to n do
begin ZDelilaca(a,b);
ZDelilaca(b,s);
If (s=a)and(a<b)
then Memo1.Lines.Add(Format('%5d%5d',[a,b]));
end;
end;
// процедура која одређује збир делилаца броја
procedure TForm1.ZDelilaca(b:integer;var s:integer);
var d:integer;
begin s:=1;
For d:=2 to b div 2 do
If b mod d=0 then s:=s+d;
end;
// рекурзивна процедура која одређује збир делилаца броја
procedure TForm1.ZDelilaca(b,d:integer;var s:integer);
begin If d<2 then s:=1
else begin ZDelilaca(b,d-1,s);
If b mod d=0 then s:=s+d;
end;
end;
Ако се користи рекурзивна процедура онда треба променити њене позиве у:
ZDelilaca(a,a div 2,b);
ZDelilaca(b,b div 2,s);
For n:=0 to p do
Memo1.Lines.Add(Red(n));
Edit1.ReadOnly:=false;
Button2.SetFocus;
end;
function TForm1.Red(n:integer):string;
var k:integer;
a:string;
begin a:='1';
For k:=1 to n do
a:=a+Format('%4d',[BK(n,k)]);
red:=a;
end;
function TForm1.BK(n,k:integer):integer;
var i:integer;
b:real;
begin b:=1;
For i:=1 to k do
b:=b*(n-i+1)/i;
bk:=Trunc(b);
end;
Функцију за одређивање биномног коефицијента можемо написати и као рекурзивну:
function TForm1.BK(n,k:integer):real;
begin If k=0
then BK:=1
else BK:=BK(n,k-1)*(n-k+1)/k;
end;
Задатак се може решити и са три функције, овако:
function TForm1.Red(n:integer):string;
var k:integer;
a:string;
begin a:='';
For k:=0 to n do
a:=a+Format('%1.0f',[BK(n,k)])+' ';
red:=a;
end;
function TForm1.BK(n,k:integer):real;
begin bk:=Fakt(n)/(Fakt(k)*Fakt(n-k));
end;
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;
end;
Функција за одређивање факторијела може бити и рекурзивна:
function TForm1.Fakt(n:integer):real;
begin If n=0
then fakt:=1
else fakt:=fakt(n-1)*n;
end;
коректно решење. Креираћемо форму као на слици, а затим написати комплетан програм. Неким
глобалним променљивама ћемо дати предефинисану вредност у заглављу програма:
var
k:integer = 0; s:integer = 0;
n:integer;
max:integer = -1; min:integer = maxint;
Form1: TForm1;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['0'..'9',#8,#13,#128])
then key:=#27
else If key=#13
then Button2.Click;
end;
Ове две процедуре можемо заменити једном, нешто мало компликованијом:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then If sender=edit1
then Button1.Click
else Button2.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27
end;
Пошто немамо тастер за брисање, његову фукцију ће преузети процедура - реакција на измену садржаја
првог едита:
procedure TForm1.Edit1Change(Sender: TObject);
begin Edit2.Clear;Edit3.Clear;Edit4.Clear;
Edit5.Clear;Edit6.Clear;Edit7.Clear;
Memo1.Clear;
k:=0;s:=0;
max:=-1;min:=maxint;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,1);
If n=0 then n:=1;
Edit1.Text:=IntToStr(n);
Edit1Change(sender);
Edit1.Enabled:=false;Button1.Enabled:=false;
Edit2.Enabled:=true; Button2.Enabled:=true;
Edit2.SetFocus;
end;
procedure TForm1.Button2Click(Sender: TObject);
var b,z:integer;
begin b:=StrToIntDef(Edit2.Text,0);Edit2.Text:=IntToStr(b);
Memo1.Lines.Add(Edit2.Text);
k:=k+1;s:=s+b;
z:=ZbirCifara(b);
If max<z // одређивање броја са највећим збиром цифара
then begin max:=z;
Edit3.Text:=IntToStr(b);
Edit4.Text:=IntToStr(k);
end;
If min>z // одређивање броја са најмањим збиром цифара
then begin min:=z;
Edit5.Text:=IntToStr(b);
Edit6.Text:=IntToStr(k);
end;
If n=k // крај уноса бројева јер су сви унешени
then begin Edit1.Enabled:=true; Button1.Enabled:=true;
Edit2.Enabled:=false;Button2.Enabled:=false;
Edit7.Text:=FloatToStr(s/n);
Edit1.SetFocus;
end
else begin Edit2.Clear;Edit2.SetFocus;
end;
end;
function TForm1.ZbirCifara(a:integer):integer;
var z:integer;
begin z:=0;
Repeat z:=z+a mod 10;
If p
then If q
then Label3.Caption:='Најближи прости су '+Format('%1d %1d',[b-i,b+i])
else Label3.Caption:='Најближи прост je '+IntToStr(b-i)
else If q
then Label3.Caption:='Најближи прост je '+IntToStr(b+i)
else i:=i+1;
end;
Edit1.ReadOnly:=true;
Button2.SetFocus;
end;
Логичка функција Prost тестира да ли је број прост:
function TForm1.Prost(n:integer):boolean;
var d:integer;
begin If n<4
then prost:=true
else If Odd(n)
then begin d:=3;
While (n mod d<>0)and(d<=Sqrt(n)) do d:=d+2;
prost:=d>Sqrt(n);
end
else prost:=false;
end;
Задатак се може решити и са процедуром уместо функције, али се не добија ништа једноставније. Такође,
задатак би се могао незнатно убрзати ако бисмо водили рачуна да ли је број паран или непаран, па да се
променљива мења за 2 уместо за 1. Но, све то не би битно поправило програм, али би га укомпликовало.
• Саставити програм који исписује n-ти елемент низа чија су прва два елемента дати
бројеви, а сваки следећи елемент се одређује као збир претходна два (Фибоначијев низ).
Ако би почетне вредности два броја биле 0 и 1 онда би то био
Фибоначијев низ у оригиналном опису. Овако само много личи.
Испис елемената низа у мемо поље није неопходан, али је згодно
видети шта програм ради. Елементе низа одредићемо уз помоћ
процедуре. Креираћемо форму као на слици, а затим написати
комплетан програм.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then If sender=edit1
then Edit2.SetFocus
else If sender=edit2
then Edit3.SetFocus
else Button1.SetFocus
else If not (key in ['0'..'9',#8,#128])
then key:=#27
end;
procedure TForm1.Edit2Enter(Sender: TObject);
var n:integer;
begin n:=StrToInt(Edit1.Text);
If n=0
then Edit1.SetFocus;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Edit4.Clear;Memo1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a,b,n:integer;
begin n:=StrToIntDef(Edit1.Text,2);Edit1.Text:=IntToStr(n);
a:=StrToIntDef(Edit2.Text,0);Edit2.Text:=IntToStr(a);
b:=StrToIntDef(Edit3.Text,1);Edit3.Text:=IntToStr(b);
Memo1.Lines.Add(IntToStr(a));
Memo1.Lines.Add(IntToStr(b));
Label8.Caption:=IntToStr(n);
Odredi(n,a,b);
Edit4.Text:=IntToStr(b);
Edit1.ReadOnly:=true;
Edit2.ReadOnly:=true;
Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који исписује просте бројеве од m до n код којих је цифра прва са
леве стране већа од 6, а прва са десне стране мања од 4, а затим исписати бројеве са
највећим и најмањим збиром цифара.
Задатак ћемо решити коришћењем две функције: логичке
функције Prost која одређује да ли је неки број прост и целобројне
функције ZbirC која одређује збир цифара броја. Измена садржаја
било ког од прва два едита брише садржаје друга два едита и
мемо поља. Креираћемо форму као на слици, а затим написати
комплетан програм.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then If sender=edit1
then Edit2.SetFocus
else Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin Edit3.Clear;Edit4.Clear;
Memo1.Clear;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit4.Clear;
Memo1.Clear;Edit1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i,m,n,p,mzc,bmzc,nzc,bnzc:integer;
begin m:=StrToIntDef(Edit1.Text,1);
n:=StrToIntDef(Edit2.Text,11);
If m>n
then begin p:=m; m:=n; n:=p;
end;
Edit1.Text:=IntToStr(m);
Edit2.Text:=IntToStr(n);
mzc:=0;
nzc:=maxint;
For i:=m to n do
If (IntToStr(i)[1]>'6')and(i mod 10<4)and(Prost(i))
then begin p:=ZbirC(i);
Memo1.Lines.Add(IntToStr(i));
If p>mzc
then begin mzc:=p; bmzc:=i;
end;
If p<nzc
then begin nzc:=p; bnzc:=i;
end;
end;
Edit3.Text:=IntToStr(bmzc);
Edit4.Text:=IntToStr(bnzc);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
function TForm1.Prost(b:integer):boolean;
var d:integer;
begin prost:=false;
If b<4
then prost:=true
else If Odd(b)
then begin d:=3;
While (b mod d<>0)and(d<=Sqrt(b)) do d:=d+2;
If d>Sqrt(b)
then prost:=true;
end;
end;
function TForm1.ZbirC(b:integer):integer;
var z:integer;
begin z:=0;
While b>0 do
begin z:=z+b mod 10;
b:=b div 10;
end;
zbirc:=z;
end;
• Саставити програм који одређује редни број првог елемента низа задатог формулом
xn
an , n N , x R који је мањи од произвољно малог унетог броја .
n!
Задатак ћемо решити коришћењем две већ познате функције
Fakt која одређује факторијел броја и Step која одређује степен
броја (факторијел ће бити реалан број да бисмо могли да радимо
са јако великим бројевима). Креираћемо форму као на слици, а
затим написати комплетан програм. У процедури Edit1KeyPress
ће можда бити потребно заменити #44, тј. ',' са #46, тј. '.' (у
зависности од постављених параметара оперативног система,
конкретно, ознаке за децимални зарез).
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then If sender=edit1
then Edit2.SetFocus
else Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Memo1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var e,x,a:real;n:integer;
begin x:=StrToFloatDef(Edit1.Text,1); Edit1.Text:=FloatToStr(x);
e:=StrToFloatDef(Edit2.Text,11);Edit2.Text:=Format('%1.10f',[e]);
Repeat n:=n+1;
a:=Step(x,n)/Fakt(n);
Memo1.Lines.Add(Format('%20.15f',[a]));
until a>e;
Edit3.Text:=IntToStr(n);
Edit1.ReadOnly:=true;Edit2.ReadOnly:=true;
Button2.SetFocus;
end;
function TForm1.Fakt(b:integer):real;
var f:real;
begin f:=b;
While b>1 do
begin b:=b-1;
f:=f*b;
end;
fakt:=f;
end;
• Саставити програм који за унети први члан и количник геометријског низа одређује
редни број последњег елемента који је већи од произвољно малог унетог броја .
Да би постојало решење потребно је да а0 буде веће од или да q
буде веће од 1 (ако је први члан низа мањи од границе и количник
је мањи од 1 сви елементи низа биће мањи од границе, па задатак
нема решења). Претпоставићемо да ће услови задатка бити
испуњени. Задатак ћемо решити коришћењем познате функције
Step која одређује степен броја. Креираћемо форму као на слици,
а затим написати комплетан програм. У процедури Edit1KeyPress
ће можда бити потребно заменити #44, тј. ',' са #46, тј. '.' (у
зависности од постављених параметара оперативног система,
конкретно, ознаке за децимални зарез). Исписивање елемената
низа у мемо поље није обавезно, али је згодно видети понашање
низа када се мења почетна вредност броја х.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then If sender=edit1
then Edit2.SetFocus
else If sender=edit2
then Edit3.SetFocus
else Button1.SetFocus
else If not (key in ['0'..'9',#8,#44,#128])
then key:=#27
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.ReadOnly:=false;
Edit2.Clear;Edit2.ReadOnly:=false;
Edit3.Clear;Edit3.ReadOnly:=false;
Edit4.Clear;Memo1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var e,q,a,c:real;n:integer;
begin a:=StrToFloatDef(Edit1.Text,1) ;Edit1.Text:=FloatToStr(a);
q:=StrToFloatDef(Edit2.Text,1) ;Edit2.Text:=FloatToStr(q);
e:=StrToFloatDef(Edit3.Text,11);Edit3.Text:=Format('%1.10f',[e]);
n:=0;Memo1.Lines.Add('%3d.%18.15f',[n,a]));
Repeat n:=n+1;c:=a*Step(q,n);
Memo1.Lines.Add('%3d.%18.15f',[n,c]));
until c<e;
Edit4.Text:=IntToStr(n-1);
Edit1.ReadOnly:=true;
Edit2.ReadOnly:=true;
Edit3.ReadOnly:=true;
Button2.SetFocus;
end;
• Саставити програм који од унете речи формира пешчани сат тако што у горњем
делу одузима, а у доњем делу додаје по једно слово са обе стране речи.
Једноставан задатак у коме треба формирати све речи које се од
почетне добијају одузимањем по једног слова са десне стране и
распоређивањем речи у облику два једнакокрака троугла са
заједничким врхом. Јасно је да испис мора имати 2*н-1 редова,
где је н број слова у унетој речи, зато је форма подешена да реч
има максимално 13 слова. Ако желимо да користимо дуже речи
морамо проширити мемо поље и повећати висину форме да би се
комплетна слика видела. Да се не би приказала два правоугла
троугла треба испис центрирати. Коришћењем карактеристике
мемо поља Alignment, може се подесити да се испис центрира.
Овде ћемо, међутим, приказати решење где се испис центрира
програмски. За испис слоја користићемо функцију Red која ће
формирати реч од почетне одузимањем потребног броја слова.
Креираћемо форму као на слици, а затим написати комплетан
програм.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.SetFocus;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Edit1.Clear;Edit1.Enabled:=true;
Memo1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var n,p:integer;
a:string;
begin a:=Edit1.Text;
p:=Length(a);
Memo1.Clear;
For n:=1 to (p+1) div 2 do // горњи део пешчаног сата
Memo1.Lines.Add(Red(a,n));
If p mod 2=0 // да се код речи парне дужине средња два слова не би исписивала дупло
then p:=p-1;
For n:=p div 2 downto 1 do // доњи део пешчаног сата је један ред краћи
Memo1.Lines.Add(Red(a,n));
Edit1.Enabled:=false;
Button2.SetFocus;
end;
function TForm1.Red(a:string;n:integer):string;
var k:integer;
b:string;
begin b:=Copy(a,n,Length(a)-2*n+2);
For k:=1 to n do
b:=' '+b;
red:=b;
end;
• Саставити програм који одређује које две од четири тачаке задате координатама у
равни су најближе.
Да бисмо решили овај задатак морамо знати како да одредимо
растојање између две тачке у кординатној равни. Ако нацртамо
у координатној равни две тачке са дужима које представљају
њихове апсисе и ординате, приметићемо правоугли троугао чија
су два темена на хипотенузи дате тачке. Према томе, растојање
између тачака је хипотенуза тог троугла. Катете троугла су
разлике апсциса и ордината тачака, па је формула за тражено
растојање:
d ( x 1 x2 )2 ( y1 y2 )2 .
Четири тачке одређују шест дужи. Јасно је да треба одредити
међусобна растојања сваке две тачке и, затим најкраће. За унос
координата тачака користићемо два едита, зато ће координате
бити глобалне променљиве. Упоређиваћемо увек само две дужи,
па нећемо имати потребе за превеликим бројем локални променљивих. Да бисмо приказали све тачке,
искористићемо мемо поље. Ако има више парова које су на истом, најкраћем растојању приказаћемо
све парове. Креираћемо форму као на слици, а затим написати комплетан програм.
Мирослав Илић Девета гимназија "Михаило Петровић Алас" Нови Београд
233 Рачунарство и информатика за трећи разред гимназије 233
var
Form1: TForm1;
x1,x2,x3,x4,y1,y2,y3,y4:real;
n:integer=0;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['-','0'..'9',#8,#13,#44,#128]) // уместо #44 -> , можда треба #46 -> .
then key:=#27
else If key=#13
then If sender=edit1
then Edit2.SetFocus
else Button1.Click;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Edit1.Clear;Edit1.Enabled:=true;
Edit2.Clear;Edit2.Enabled:=true;
Edit3.Clear;
Memo1.Clear;Memo1.Lines.Add('Тачке су:');
Edit1.SetFocus;
end;
procedure TForm1.Button2Click(Sender: TObject);
var n,p,q:integer;
d,dmin:real;
a,b,c:string;
begin a:=Memo1.Lines.Strings[1];
n:=Length(a);p:=Pos(' ',a);q:=Pos(';',a);
y1:=StrToFloat(Copy(a,q+2,n-q));
x1:=StrToFloat(Copy(a,p+1,q-p-1));
a:=Memo1.Lines.Strings[2];
n:=Length(a);p:=Pos(' ',a);q:=Pos(';',a);
y2:=StrToFloat(Copy(a,q+2,n-q));
x2:=StrToFloat(Copy(a,p+1,q-p-1));
a:=Memo1.Lines.Strings[3];
n:=Length(a);p:=Pos(' ',a);q:=Pos(';',a);
y3:=StrToFloat(Copy(a,q+2,n-q));
x3:=StrToFloat(Copy(a,p+1,q-p-1));
a:=Memo1.Lines.Strings[4];
n:=Length(a);p:=Pos(' ',a);q:=Pos(';',a);
y4:=StrToFloat(Copy(a,q+2,n-q));
x4:=StrToFloat(Copy(a,p+1,q-p-1));
a:='A12'; // претпостављамо да су најближе прве две тачке, па тражимо ближе од њих
dmin:=DD(x1,y1,x2,y2);Memo1.Lines.Add('A12: '+FloatToSTr(dmin));
d:=DD(x1,y1,x3,y3);Memo1.Lines.Add('A13: '+FloatToSTr(d));
If d<dmin
then begin dmin:=d;a:='A13';
end;
d:=DD(x1,y1,x4,y4);Memo1.Lines.Add('A14: '+FloatToSTr(d));
If d<dmin
then begin dmin:=d;a:='A14';
end;
d:=DD(x2,y2,x3,y3);Memo1.Lines.Add('A23: '+FloatToSTr(d));
If d<dmin
then begin dmin:=d;a:='A23';
end;
d:=DD(x2,y2,x4,y4);Memo1.Lines.Add('A24: '+FloatToSTr(d));
If d<dmin
then begin dmin:=d;a:='A24';
end;
d:=DD(x3,y3,x4,y4);Memo1.Lines.Add('A24: '+FloatToSTr(d));
If d<dmin
then begin dmin:=d;a:='A34';
end;
b:=FloatToSTr(dmin); // проверавамо да ли има више парова тачака на истом растојању
c:=Memo1.Lines.Strings[8]; // проверу почињемо од другог пара тачака
If (b=Copy(c,6,Length(c)-5))and(Copy(c,1,3)<>Copy(a,1,3))
then a:=a+', '+Copy(c,1,3);
c:=Memo1.Lines.Strings[9];
If (b=Copy(c,6,Length(c)-5))and(Copy(c,1,3)<>Copy(a,1,3))
then a:=a+', '+Copy(c,1,3);
c:=Memo1.Lines.Strings[10];
If (b=Copy(c,6,Length(c)-5))and(Copy(c,1,3)<>Copy(a,1,3))
then a:=a+', '+Copy(c,1,3);
c:=Memo1.Lines.Strings[11];
If (b=Copy(c,6,Length(c)-5))and(Copy(c,1,3)<>Copy(a,1,3))
then a:=a+', '+Copy(c,1,3);
c:=Memo1.Lines.Strings[12];
If (b=Copy(c,6,Length(c)-5))and(Copy(c,1,3)<>Copy(a,1,3))
then a:=a+', '+Copy(c,1,3);
Edit3.Text:=a;
Button3.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var x,y:real;
a:string;
begin x:=StrToFloatDef(Edit1.Text,1);
y:=StrToFloatDef(Edit2.Text,1);
n:=n+1;
a:='A'+IntToStr(n)+': '+FloatToStr(x)+'; '+FloatToStr(y);
Memo1.Lines.Add(a); // унос координата у мемо поље
If n=4 // провера да ли су унете координате све четири тачке
then begin Edit1.Enabled:=false;
Edit2.Enabled:=false;
Memo1.Lines.Add('');
Memo1.Lines.Add('Растојања су:');
Button2.SetFocus;
end
else begin Edit1.Clear;Edit2.Clear;
Edit1.SetFocus;
end;
end;
function TForm1.DD(x1,y1,x2,y2:real):real;
begin dd:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
end;
Задатак је мало компликованији, али смо научили да читамо унете податке из мемо поља и да их
конвертујемо у одговарајући тип и различите употребе стринг променљивих, па је веома корисно
добро га разумети због, евентуалне, касније примене.
• Саставити програм који за унети стринг одређује најдужу и најкраћу реч и одређује
која од њих се прва појављује.
Још један задатак где ће стрингови бити у жижи интересовања.
Јасно је да је тражење најдуже или најкраће речи исти посао,
треба само код услова за дужину речи ставити ознаку > или <.
Зато ћемо написати функцију која ће налазити и једну и другу
реч. Проблем код тражења речи је што се реч може ограничити
размаком или неким од интерпункцијских знакова и да ли ћемо
бројеве писане цифрама рачунати као речи или не (на пример:
да ли је 2000. година број и реч или две речи и ако се договоримо
да су то две речи да ли је 2000 реч или 2000. јер тачка мења
смисао броја). Ове проблеме треба да разреши онај ко прави
захтев за програмским решењима и ми немамо ништа са тим. Ми
само морамо да договорено преточимо у програмски код. У овом
случају, претпоставићемо да је унети стринг састављен само од
слова и интерпункцијских знакова без цртица за поделу и
пренос слогова речи у нови ред. За унос стринга и испис резултата
предвидећемо по једно мемо поље. Могуће је уносити текст и ћирилицом и латиницом. Креираћемо
форму као на слици, а затим написати комплетан програм.
// скуп дозвољених карактера обухвата ћирилична и латинична слова и знаке интерпункције
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin If not (key in ['a'..'z','A'..'Z','ђ'..'ш','Ђ'..'Ш','.',',','!','?',' ',#8,#13,#128])
then key:=#27
else If key=#13
then Button1.Click;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Memo1.Clear;Memo1.ReadOnly:=false;
Memo2.Clear;Memo1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var c,d:integer;
a,b:string;
begin a:=Memo1.Text+'.';
If Length(a)>1
then begin Naj(a,1,b,c);
Memo2.Text:='Најдужа реч је '+b;
Naj(a,0,b,d);
Memo2.Lines.Add('Најкраћа реч је '+b);
If c<d
then Memo2.Lines.Add('Најдужа је испред најкраће.')
else Memo2.Lines.Add('Најкраћа је испред најдуже.');
Memo1.ReadOnly:=true;
Button2.SetFocus;
end;
end;
// параметар с вредностима 1 и 0 одређује да ли се тражи најдужа или најкраћа реч
procedure TForm1.Naj(a:string;s:integer; Var b:string; Var n:integer);
var c:string;
g:integer;
begin a:=Obrisi(a); // брише водеће размаке и знакове интерпункције
g:=Duzina(a); // броји слова у првој речи унутар текста
n:=g-1; // прва реч се проглашава најдужом или најкраћом
b:=Copy(a,1,n); // памти се вредност прве речи
Delete(a,1,g); // брише се прва реч из унетог текста
a:=Obrisi(a); // брише водеће размаке и знакове интерпункције у новом тексту
While Length(a)>0 do // тражи се дужа или краћа реч све док има слова у тексту
begin g:=Duzina(a); // броји слова у првој речи унутар текста
c:=Copy(a,1,g-1); // памти се вредност нове речи
Delete(a,1,g); // брише се реч из текста
If (Length(c)>n)and(s=1) // проверава да ли је нова реч најдужа
or(Length(c)<n)and(s=0) // проверава да ли је нова реч најкраћа
then begin n:=g-1; // памти се нова најдужа или најкраћа дужина
b:=c; // памти се вредност речи
end;
a:=Obrisi(a); // брише водеће размаке и знакове интерпункције
end;
end;
//функција одређује број слова у следећој речи у унетом тексту
function TForm1.Duzina(a:string):integer;
var g:integer;
begin g:=Pos(' ',a);
If g=0 then g:=Length(a);
If (Pos(',',a)<g)and(Pos(',',a)>0)
then g:=Pos(',',a);
If (Pos('.',a)<g)and(Pos('.',a)>0)
then g:=Pos('.',a);
If (Pos('!',a)<g)and(Pos('!',a)>0)
then g:=Pos('!',a);
If (Pos('?',a)<g)and(Pos('?',a)>0)
then g:=Pos('?',a);
duzina:=g;
end;
// функција брише дупле размаке и удвојене знаке интерпункције
function TForm1.Obrisi(a:string):string;
begin While (Length(a)>0) and
(not (a[1] in ['a'..'z','A'..'Z','ђ'..'ш','Ђ'..'Ш'])) do
Delete(a,1,1);
obrisi:=a;
end;
• Саставити програм који за унети датум одређује датум који је био пре и који ће бити
после унетог броја дана.
• Саставити програм који одређује колико има бројева од m до n који нису прости и чија
је последња цифра мања од 6, а прва већа од 4, исписати их одредити збир њихових
цифара.
• Дати су бројеви: a, b, c, d. Формирају се два низа на следећи начин:
први низ: a, a+b, a+b+a, a+b+a+b, a+b+a+b+a, ...
други низ: c, c+d, c+d+c, c+d+c+d, c+d+c+d+c, ...
Саставити програм који одређује првих n елемената низова који су једнаки и
исписати њихове редне бројеве.
• Саставити програм који одредује збир непарних цифара бројева од м до н.
• Саставити програм који исписује двоцифрене бројеве код којих је цифра десетица
дељива цифром јединица.
• Саставити програм који одредује колико пута се цифра ц појаљује у бројевима од м до н.
• Саставити програм који одредује број од м до н који има највише делилаца.
• Саставити програм који исписује све двоцифрене бројеве чија се сума цифара не мења
при множењу бројевима од 2 до 9.
• Саставити програм који исписује све троцифрене бројеве код којих је сума цифара
једнака датом целом броју.
• Саставити програм који одређује које две од четири тачаке задате координатама у
простору су најближе.
• Саставити програм који за два уписана стринга одређује најдужи заједнички подниз
• Написати програм којим се одређују сви троцифрени бројеви који су једнаки суми
факторијела својих цифара.
• Кинески цар Циу Ши је развијао своје царство и свако село је било у обавези да му у
току године пошаље лопту од ћилибарда одређеног полупречника. Он је лопте слагао
на под у једној од својих одаја, тако да чине троугао једнаких страница.Када би освајао
села или оснивао нова увек је водио рачуна о броју и о томе да када те године добије по
лопту од свих села може да их дода на сваку страницу по један ред и да опет добије
троугао једнаких страница. Написати програм у коме се задаје тренутан број лопти
Н на једној страници троугла, а који израчунава колико села укупно цар мора да има
те године да би допунио свој троугао до новог троугла.
Тип низ
Код рада са већом количином података врло често се јавља потреба за великим бројем
променљивих које би чувале потребне вредности. У већини таквих случајева број неопходних
променљивих је или јако велики или се и не зна колико променљивих ће бити употребљено у
програму. Да би се олакшало решавање оваквог типа проблема уводи се појам низа. Низ је
уређени скуп података једног типа са заједничким именом које се назива именом низа. Тип
низ има следеће особине:
• Садржи коначан, унапред одређен број чланова (низ може имати произвољно много
чланова, што засвиси од потреба проблема који се решава и од расположиве меморије)
• Сви чланови једног низа морају бити истог типа
• Сваки члан се означава именом низа и својим индексом (редним бројем)
• Индекси чланова једног низа морају бити истог типа.
Да би се низ могао користити у програму мора бити претходно дефинисан (имплицитно или
експлицитно). Експлицитна дефиниција подразумева да се дефинише нови тип података који
има своје име. Имплицитна дефиниција се користи када не желимо да измишљамо име новом
типу података, него га само описујемо кроз декларацију променљивих које му припадају.
Декларација променљиве типа низ се састоји у давању имена низа и одређивању типа индекса
и типа чланова низа. Тип индекса мора бити интервални подтип уређених простих типова
(boolean, char, integer, набројани). Тип чланова низа може бити било који дефинисани тип.
Декларацијом низа резервише се количина меморије потребна за чување свих његових
елемената без обзира да ли ће се сви они користити у програму или не.
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;
Све операције које су дозвољене у раду са променљивама типа којег су чланови низа
дозвољене су и у раду са члановима тог низа.
Два низа се могу упоређивати ако су им једнаки типови. У том случају кажемо да су два
низа једнака ако имају једнак број елемената и одговарајући чланови су им једнаки (први са
првим, други са другим, итд).
Једнодимензионални низови.
Линеарно уређени низ једноиндексних променљивих чини једнодимензионални низ.
При декларацији сваког низа преводилац резервише потребну количина меморије за
чување вредности свих елемената низа, без обзира да ли се они користе или не у програму,
зато максималан број чланова једнодимензионалног низа (исто тако и сваког другог низа)
зависи од расположиве количине радне меморије рачунара. У случају да нема довољно
меморије за чување декларисаног низа добићемо једну од следећих порука:
"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 y:rniz;
једнодимензионални низ од највише двадесет реалних бројева.
VAR slovo:cniz;
једнодимензионални низ типа карактер са највише 55 елемената.
Променљиве x и y из претходних примера формално нису истог типа и не могу се
упоређивати или замењивати у позивима функција и процедура.
Нешто је већи проблем ако се низ уноси све до испуњења неког услова, односно, низ има
највише 100 елемената (на пример, не мора бити 100, може бити било који унапред задати
број), а елементи се уносе све док се не унесе 0 (када се унесе 0 то није елемент низа, већ то
значи да су унети сви елементи низа). Тада би овај задатак морао да се решава помоћу циклуса
са условом, најбоље са while.
zbir:=0; // почетна вредност за збир елемената низа
n:=0; // број елемената низа је 0 јер још није унет ни један
broj:=... // овде треба унети вредност помоћне променљиве broj
While (n<=100)and(broj<>0) do // ако није унета 0 формира се неки елемент низа
begin n:=n+1; // редни број елемента низа увећава се за један
a[n]:=broj; // додаје се нови елемент низа
zbir:=zbir+a[n]; // нови елемент низа се сабира са свим претходним
broj:=... // овде треба унети нову вредност помоћне променљиве broj
end;
arsred:=zbir/n // одређује се просечна вредност елемената низа, наравно,
// треба водити рачуна o декларисаним типовима променљивих
За почетну вредност променљивих 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; // други елеменат узима вредност првог сачувану у помоћној
end;
Уређивање у нерастући поредак остварило би се на исти начин, једино би се уместо
релације веће од користила релација мање од:
// нека је 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; // други елеменат узима вредност првог сачувану у помоћној
end;
Постоје и другачији алгоритми за сортирање низа. Овај је најефикаснији када низ има
мањи број елемената. У случају сортирања низа са јако великим бројем елемената треба
изабрати неки други алгоритам јер је овај прилично спор.
Дводимензионални низови
Дводимензионалним низом зовемо низ двоиндексних променљивих. Ова врста низова
обично се назива матрица или таблица, хоризонтални елементи чине редове, а вертикални
колоне матрице. Индекси низа имају своје границе, али оне не морају бити једнаке. Ако су
границе једнаке матрицу зовемо квадратном. Елементи од горњег левог до доњег десног у
квадратној матрици чине главну, а елементи од горњег десног до доњег левог споредну
дијагоналу. Типови индекса не морају да буду једнаки, тј. један индекс може бити цео број, а
други, на пример, типа карактер. Укупан број декларисаних променљивих, за које се
резервише меморија, код дводимензионалног низа добија се када се највећи редни бројеви
оба индекса помноже.
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 елемената типа фигура.
Аналогно би се могао дефинисати низ са више индекса, на пример троиндексни низ је
низ троиндексних променљивих, итд. Начин рада са таквим, вишедимензионалним низовима,
би био аналоган раду са једнодимензионалним или дводимензионалним низовима. Низ се
најпре декларише, члановима се доделе неке вредности и обави се задатак због којег је низ
формиран. Но, мора се признати да се врло ретко јавља потреба за низовима са више од три
димензије (индекса), али добро је знати да је и то могуће. Наравно са повећањем броја
димензија низа повећава се потреба за меморијом, па се смањује максимална, реално могућа,
дужина таквих низова.
Задаци са низовима
Претходни задаци решени су без коришћења типа низ и предности које он доноси. Следе задаци који ће
бити решавани са променљивама типа низ. Формирање низа може се остварити на три начина:
директним уписом преко тастатуре, генерисањем бројева помоћу функције Random или преузимањем
података из датотеке (мада се и та датотека мора некако попунити). У зависности од изабраног начина
формирања низа форма може бити дизајнирана на два начина: са делом за унос елемената низа или без
тог дела. Урадићемо први задатак са уносом елемената помоћу тастатуре, а све остале ћемо решавати
генерисањем елемената низа.
• Саставити програм који формира низ са највише 100 троцифрених бројева, а затим
одређује број и збир непарних и аритметичку средину парних елемената низа
За унос елемената помоћу тастатуре морамо предвидети: едит за
унос дужине низа и едит за унос елемената низа и тастере за
потврду оба уноса. Задатак ће бити решен онако како би
кориснику апликације било најједноставније. Креираћемо
форму као на слици, а затим написати комплетан програм.
Најпре ћемо дефинисати нови тип података - низ у делу за
дефиниције типова (на самом почетку јунита - глобални тип):
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
Затим ћемо декларисати глобалне променљиве n - број
елемената низа и k - бројач елемената низа, које су цели бројеви
и a - променљива типа низ у делу за декларације:
var
Form1: TForm1;
n,k:integer;
a:niz;
Да бисмо имали потпуну контролу над програмом, поставићемо следеће карактеристике објеката на
форми: Edit2.Enabled - false, Button2.Enabled - false, Edit3.ReadOnly - true, Edit4.ReadOnly - true,
Edit5.ReadOnly - true, Memo1.ReadOnly - true. Да не бисмо имали четири тастера на форми, уместо
тастера за брисање написаћемо процедуру која ће брисати претходни унос низа када се курсор постави
у први едит.
procedure TForm1.Edit1Enter(Sender: TObject);
begin Memo1.Clear;Edit1.Clear;
Edit2.Clear;Edit3.Clear;
Edit4.Clear;Edit5.Clear;
end;
Забранићемо кориснику да уноси слова и знакове у прва два едита.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then If sender=edit1
then Button1.Click
else Button2.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
Када се унесе дужина низа глобалне променљиве n и k добиће одговарајуће вредности.
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,10);
If n>100 // забрањујемо унос више од 100 елемената низа због дефинције низа
then n:=100;
Edit1.Text:=IntToStr(n);
Edit1.Enabled:=false; // забрањује се приступ едиту 1
Edit2.Enabled:=true; // дозвољава се приступ едиту 2
Button1.Enabled:=false; // забрањује се употреба тастера 1
Button2.Enabled:=true; // дозвољава се употреба тастера 2
k:=0; // бројач елемената низа постављамо на 0
Edit2.SetFocus; // курсор постављамо у други едит
end;
Сада се уносе елеменати низа помоћу тастатуре, уносе се у мемо поље, одређују се тражени резултати и
исписују у предвиђене едите.
procedure TForm1.Button2Click(Sender: TObject);
var par,zp,zn:integer;
begin k:=k+1;
a[k]:=StrToIntDef(Edit2.Text,100);
If a[k]<100 // забрањујемо унос једноцифрених и двоцифрених бројева
then a[k]:=100;
Edit2.Text:=IntToStr(a[k]);
Memo1.Lines.Add(IntToStr(k)+'. '+Edit2.Text); // исписујемо елемент низа у мемо поље
If k<n // припремамо унос следећег елемента
then begin Edit2.Clear;Edit2.SetFocus;
end
else begin Edit2.Enabled:=false; // забрањује се приступ едиту 2
Button2.Enabled:=false; // забрањује се употреба тастера 2
par:=0;zp:=0;zn:=0; // почетне вредности бројача и збирова
For k:=1 to n do
If Odd(a[k])
then zn:=zn+a[k] // сабирамо непарне елементе низа
else begin par:=par+1; // бројимо парне елементе
zp:=zp+a[k]; // сабирамо парне елементе
end;
Edit3.Text:=IntToStr(zn);
Edit4.Text:=IntToStr(n-par); // број непарних елемената
If par>0 // аритметичку средину тражимо ако има парних
then Edit4.Text:=Format('%1.5f',[zp/par])
else Edit4.Text:='0';
Button1.Enabled:=true; // дозвољава се употреба тастера 1
Edit1.Enabled:=true; // дозвољава се приступ едиту 1
Button3.SetFocus; // жижу постављамо на тастер крај рада
end;
end;
Још само недостаје процедура за крај рада.
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
• Саставити програм који генерише низ са највише 100 троцифрених бројева, а затим
одређује збир и број парних и аритметичку средину непарних елемената низа
Задатак је готово идентичан претходном, само што ћемо овде
генерисати троцифрене бројеве помоћу Random функције.
Креираћемо форму као на слици, а затим написати комплетан
програм. Најпре ћемо дефинисати нови тип података - низ у делу
за дефиниције типова (на самом почетку јунита - глобални тип):
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
Затим ћемо декларисати глобалне променљиве n - број
елемената низа и a - променљива типа низ у делу за декларације:
var
Form1: TForm1;
n:integer = 0;
a:niz;
Уносимо само број елемената низа, па су сви, осим тог едита
заштићени од уноса. Можемо додати тастер за брисање или задржати процедуру за брисање из
претходног задатка.
procedure TForm1.Edit1Enter(Sender: TObject);
begin Memo1.Clear;Edit1.Clear;
Edit2.Clear;Edit3.Clear;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.Button1Click(Sender: TObject);
var k:integer;
begin n:=StrToIntDef(Edit1.Text,10);
If n>100
then n:=100;
Edit1.Text:=IntToStr(n);
Edit1.Enabled:=false;
Button1.Enabled:=false;
Randomize;
For k:=1 to n do
begin a[k]:=Random(900)+100;
Memo1.Lines.Add(IntToStr(k)+'. '+IntToStr(a[k]));
end;
Button2.SetFocus;
end;
procedure TForm1.Button2.Click(Sender: TObject);
var nep,zp,zn,k:integer;
begin par:=0;
zp:=0;zn:=0;
For k:=1 to n do
If Odd(a[k])
then zp:=zp+a[k]
else begin nep:=nep+1;
zn:=zn+a[i]
end;
Edit2.Text:=IntToStr(zp);
Edit3.Text:=IntToStr(n-nep);
If par>0
then Edit4.Text:=Format('%1.5f',[zn/nep])
else Edit4.Text:='0';
Button1.Enabled:=true;
Edit1.Enabled:=true;
Button3.SetFocus;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
• Саставити програм који формира низ од 100 природних бројева, а затим одређује
редни број елемента који има највећи (најмањи) збир цифара, у случају да више
елемената има исти збир цифара исписује се најмањи (највећи).
Креираћемо форму као на слици, а затим написати комплетан
програм. Најпре ћемо дефинисати нови тип података - низ у делу
за дефиниције типова, затим ћемо декларисати глобалне
променљиве n - број елемената низа и a - променљива типа низ у
делу за декларације.
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
n:integer = 0;
a:niz;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin Memo1.Clear;
Edit2.Clear;Edit3.Clear;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,10);
If n>100 then n:=100;
Edit1.Enabled:=false;
Edit1.Text:=IntToStr(n);
FormirajNiz;
Button1.Enabled:=false;
Button2.Enabled:=true;
Button2.SetFocus;
end;
procedure TForm1.FormirajNiz;
begin k:=0;Randomize;
While k<n do
begin k:=k+1;a[k]:=Random(900)+100;
Memo1.Lines.Add(Format('%2d.%4d',[k,a[k]]));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin Button2.Enabled:=false;
Odredi(k);
Edit2.Text:=IntToStr(a[k]);
Edit3.Text:=IntToStr(k);
Button1.Enabled:=true;
Edit1.Enabled:=true;
Edit1.SetFocus;
end;
• Саставити програм који формира низ од 100 природних бројева, а затим одређује
редни број највећег и најмањег елемента, у случају да има више једнаких елемената
исписује се елемент са најмањим редним бројем.
Тражење екстремних вредности је једна од важнијих процедура
са низовима. Креираћемо форму као на слици, а затим написати
комплетан програм.
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
n:integer = 0;
a:niz;
procedure TForm1.Edit1Change(Sender: TObject);
begin Memo1.Clear;
Edit2.Clear;Edit3.Clear;
Edit4.Clear;Edit5.Clear;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.FormirajNiz;
var k:integer;
begin Randomize;
k:=0;
While k<n do
begin k:=k+1;
a[k]:=Random(1000); // уместо 1000 могао је бити било који други број
Memo1.Lines.Add(Format('%2d.%4d',[k,a[k]]));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,10);
If n>100
then n:=100;
Edit1.Text:=IntToStr(n);
FormirajNiz;
Edit1.Enabled:=false;
Button1.Enabled:=false;
Button2.Enabled:=true;
Button2.SetFocus;
end;
var
Form1: TForm1;
n:integer = 0;
a:niz;
• Саставити програм који формира низ од највише 100 целих бројева, а затим одређује
број парних и позитивних који имају непаран редни број.
Креираћемо форму као на слици, а затим написати комплетан
програм.
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
n:integer = 0;
a:niz;
procedure TForm1.Edit1Change(Sender: TObject);
begin Memo1.Clear;
Edit2.Clear;Edit3.Clear;
Edit4.Clear;Edit5.Clear;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.FormirajNiz;
var k:integer;
begin k:=0;Randomize;
While k<n do
begin k:=k+1;
a[k]:=Random(2001)-1000; // формира бројеве од -1000 до 1000
Memo1.Lines.Add(Format('%2d.%4d',[k,a[k]]));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,10);
If n>100
then n:=100;
Edit1.Text:=IntToStr(n);
FormirajNiz;
Edit1.Enabled:=false;
Button1.Enabled:=false;
Button2.Enabled:=true;
Button2.SetFocus;
end;
• Саставити програм који формира низ од највише 100 троцифрених бројева, а затим
га уређује у неопадајући или нерастући поредак.
Креираћемо форму као на слици, а затим написати комплетан
програм.
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
n:integer = 10;
k:integer = 0;
a:niz;
procedure TForm1.Button4Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Memo1.Clear;Memo2.Clear;
Edit1.Clear;Edit1.Enabled:=true;
Button1.Enabled:=true;
Button2.Enabled:=false;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,10);
If n>100
then n:=100;
Edit1.Text:=IntToStr(n);
FormirajNiz;
k:=0;
Edit1.Enabled:=false;
Button1.Enabled:=false;
Button2.Enabled:=true;
Button2.SetFocus;
end;
procedure TForm1.FormirajNiz;
begin Randomize;
k:=0;
While k<n do
begin k:=k+1;
a[k]:=Random(900)+100;
Memo1.Lines.Add(Format('%2d.%4d',[k,a[k]]));
end;
end;
• Саставити програм који формира низ од највише 100 двоцифрених бројева, а затим
од тог низа формира нови низ чији су сви елементи различити.
Креираћемо форму као на слици, а затим написати комплетан
програм.
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
n,k:integer;
a,b:niz;
procedure TForm1.Button4Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Memo1.Clear;Memo2.Clear;
Button1.Enabled:=true;
Edit1.Enabled:=true;
Edit1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,10);
If n>100
then n:=100;
Edit1.Enabled:=false;
Edit1.Text:=IntToStr(n);
FormirajNiz;
Button1.Enabled:=false;
Button2.Enabled:=true;
Button2.SetFocus;
end;
procedure TForm1.FormirajNiz;
begin Randomize;
k:=0;
While k<n do
begin k:=k+1;a[k]:=Random(90)+10;
Memo1.Lines.Add(Format('%2d.%4d',[k,a[k]]));
end;
end;
• Саставити програм који формира низ од највише 100 природних бројева, а затим
неуређујући низ исписује к највећих.
Овде ћемо приказати једну другачију процедуру за испис
елемената низа која као параметре има низ који се исписује, број
елемената који се исписују и редни број мемо поља у које ће се
исписати низ. Креираћемо форму као на слици, а затим написати
комплетан програм.
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
n,k:integer;
a,b:niz;
procedure TForm1.Button4Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Memo1.Clear;Memo2.Clear;
Button1.Enabled:=true;
Edit1.Enabled:=true;
Edit1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then If sender=edit1
then Button1.Click
else Button2.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,10);
If n>100
then n:=100;
Edit1.Text:=IntToStr(n);
FormirajNiz;
Edit1.Enabled:=false;
Button1.Enabled:=false;
Button2.Enabled:=true;
Edit2.Enabled:=true;
Edit2.SetFocus;
end;
procedure TForm1.FormirajNiz;
begin Randomize;
k:=0;
While k<n do
begin k:=k+1;
a[k]:=Random(900)+100;
end;
IspisiNiz(a,n,1);
end;
procedure TForm1.IspisiNiz(a:niz;n,k:integer);
var i:integer;
begin TMemo(FindComponent('Memo'+IntToStr(k))).Clear; // празни мемо поље број k
For i:=1 to n do
TMemo(FindComponent('Memo'+IntToStr(k))).Lines.Add(Format('%2d.%4d',[i,a[i]]));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin k:=StrToIntDef(Edit2.Text,10);
If k>n
then k:=n;
Edit2.Text:=IntToStr(k);
Najveci(k);
IspisiNiz(b,k,2);
Edit2.Enabled:=false;
Button2.Enabled:=false;
Button3.SetFocus;
end;
procedure TForm1.Najveci(k:integer);
var i,j,p:integer;
dodaj:boolean;
begin For i:=1 to k do
b[i]:=a[i]; // првих k елемената низа a формира низ b
For i:=k+1 to n do // проверавамо да ли има већих у остатку низа а
begin dodaj:=false;
j:=1;p:=1;
While j<=k do
begin If a[i]>b[j] // ако је већи елемент у остатку низа a
then begin dodaj:=true; // памтимо да треба додати елемент
If b[j]<b[p]
then p:=j; // тражи се најмањи у b
end;
j:=j+1;
end;
If dodaj
then begin For j:=p to k-1 do
b[j]:=b[j+1]; // брише најмањи у b
b[k]:=a[i]; // додаје се нови елемент на крај низа b
end;
end;
end;
Додавањем елемената на крај низа b учинили смо да се редослед k највећих елемената низа а не мења,
тј. поредак елемената у низу b је исти као у низу а.
• Саставити програм који формира низ од највише 100 троцифрених бројева, а затим
из низа издваја најдужи растући подниз.
Креираћемо форму као на слици, а затим написати комплетан
програм.
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
n,k:integer;
a,b:niz;
Задатак се врло лепо може решити и уз помоћ скупова. Тражи се најмањи елемент чији редни број се не
налази у скупу индекса и када се нађе његов редни број се смести у нови низ и дода у скуп индекса. У
овом случају почетни низ не мења вредности, па не мора бити улазни параметар процедуре (наравно,
није забрањено ако нам се то свиђа). Ево и овако организоване процедуре:
procedure TForm1.Odredi;
var i,p:integer;
si:set of 1..100;
begin k:=0;si:=[]; // број елемената низа b је 0 и скуп редних бројева је празан
While k<n do // циклус се завршава када се формира n елемената низа b
begin p:=0;
Repeat p:=p+1;
until not(p in si); // тражи се први редни број који недостаје скупу
For i:=1 to n do // тражи се најмањи елемент низа а
If not(i in si)and(a[i]<a[p]) // чији редни број није у скупу
then p:=i;
k:=k+1;b[k]:=p; // памти се редни број најмањег елемента низа а
Memo2.Lines.Add(Format('%3d.4d',[b[k],a[b[k]]])); // исписује низ b
si:=si+[p]; // редни број најмањег елемента се смешта у скуп
end;
end;
Ево још једног решење за које се може рећи да задовољава слободније тумачење услова задатака.
Формира се низ чије су вредности индекси првог низа, а затим новоформирани низ уредити у
неопадајући помоћу одговарајућих вредности првог низа. И овде се не мењају вредности почетног низа,
па га не морамо уводити као улазни параметар (наравно, није забрањено ако нам се то свиђа).
procedure TForm1.Odredi;
var i,ј,p:integer;
begin For i:=1 to n do b[i]:=i;
For i:=1 to n-1 do
For j:=i+1 to n do
If a[b[i]]>a[b[j]]
then begin p:=b[i];b[i]:=b[j];b[j]:=p;
end;
For i:=1 to n do
Memo2.Lines.Add(Format('%3d.4d',[b[k],a[b[k]]]));
end;
Има још различитих и лепих решења овог (као и сваког другог) задатка. Читаоцима се оставља на вољу
да истражују и пронађу бар још једно решење које им се чини лепим.
• Саставити програм који формира низ са највише 100 троцифрених бројева, а затим
елементе циклично помера за m места (mN).
Креираћемо форму као на слици, а затим написати комплетан
програм.
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
n,k:integer;
a,b:niz;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin Memo1.Clear;
Memo2.Clear;
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin Memo2.Clear;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button2.Click
else If not (key in ['-','0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.IspisiNiz(a:niz;n,k:integer);
var i:integer;
begin TMemo(FindComponent('Memo'+IntToStr(k))).Clear; // празни мемо поље број k
For i:=1 to n do
TMemo(FindComponent('Memo'+IntToStr(k))).Lines.Add(Format('%2d.%4d',[i,a[i]]));
end;
procedure TForm1.FormirajNiz;
begin Randomize;
k:=0;
While k<n do
begin k:=k+1;a[k]:=Random(900)+100;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,10);
If n>100
then n:=100;
Edit1.Text:=IntToStr(n);
FormirajNiz;IspisiNiz(a,n,1);
Button1.Enabled:=false;
Button2.Enabled:=true;
Edit1.Enabled:=false;
Edit2.Enabled:=true;
Edit2.SetFocus;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin k:=StrToIntDef(Edit2.Text,10);Edit2.Text:=IntToStr(k);
If k<0
then PomeriLevo(-k)
else PomeriDesno(k);
IspisiNiz(a,n,2);
Button1.Enabled:=true;
Button2.Enabled:=false;
Edit1.Enabled:=true;
Edit2.Enabled:=false;
Edit1.SetFocus;
end;
procedure TForm1.PomeriLevo(k:integer);
var i,j,p:integer;
begin For i:=1 to k do
begin p:=a[1];
For j:=2 to n do
a[j-1]:=a[j];
a[n]:=p;
end;
end;
procedure TForm1.PomeriDesno(k:integer);
var i,j,p:integer;
begin For i:=1 to k do
begin p:=a[n];
For j:=n downto 2 do
a[j]:=a[j-1];
a[1]:=p;
end;
end;
Процедуре за померање лево и десно могу се написати као једна ако се уведе помоћна променљива s са
вредностима s=0 за померање у лево, s=1 за померање у десно. Процедура је мало компликованија, али
много ефикаснија:
procedure TForm1.PomeriLevo(s,k:integer);
var i,j,p:integer;
begin For i:=1 to k do
begin p:=a[1+(n-1)*s];
For j:=1 to n-1 do
a[Abs((n+1)*s-j)]:=a[Abs((n+1)*s-j-1)];
a[n-(n-1)*s]:=p;
end;
end;
• Саставити програм који на случајан начин формира низ са највише 100 троцифрених
бројева, а затим од њега формира нови низ тако што цифре сваког елемента уређује
у растући поредак (на пример: 453 постаје 345), а затим исписује број елемената
другог низа који су једнаки неком елементу почетног низа.
Креираћемо форму као на слици, а затим написати комплетан
програм.
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
n,k:integer;
a,b:niz;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin Memo1.Clear;
Memo2.Clear;
Edit2.Clear;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.IspisiNiz(a:niz;n,k:integer);
var i:integer;
begin TMemo(FindComponent('Memo'+IntToStr(k))).Clear; // празни мемо поље број k
For i:=1 to n do
TMemo(FindComponent('Memo'+IntToStr(k))).Lines.Add(Format('%2d.%4d',[i,a[i]]));
end;
procedure TForm1.FormirajNiz;
begin Randomize;
k:=0;
While k<n do
begin k:=k+1;a[k]:=Random(900)+100;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,10);
If n>100
then n:=100;
Edit1.Text:=IntToStr(n);
Edit1Change(sender);
FormirajNiz;IspisiNiz(a,n,1);
Edit1.Enabled:=false;
Button1.Enabled:=false;
Button2.Enabled:=true;
Button2.SetFocus;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i,j,br:integer;
begin For i:=1 to n do
b[i]:=Rastuce(a[i]);
IspisiNiz(b,n,2);
br:=0;
For i:=1 to n do
For j:=1 to n do
If a[i]=b[j]
then br:=br+1;
Edit2.Text:=IntToStr(br);
Button1.Enabled:=true;
Button2.Enabled:=false;
Edit1.Enabled:=true;
Edit1.SetFocus;
end;
function TForm1.Rastuce(p:integer):integer;
var c1,c2,c3:integer;
begin c1:=p mod 10;
c2:=p div 10 mod 10;
c3:=p div 100;
If c1<c2
then begin p:=c1;c1:=c2;c2:=p;
end;
If c1<c3
then begin p:=c1;c1:=c3;c3:=p;
end;
If c2<c3
then begin p:=c3;c3:=c2;c2:=p;
end;
rastuce:=c1+c2*10+c3*100;
end;
• Саставити програм који формира низ од 80 троцифрених бројева који имају бар две
исте цифре, а затим га уређује у опадајући поредак.
Овде, наравно, треба променити до сада стандардну процедуру за
генерисање елемената низа. Други део задатка је већ решаван.
Креираћемо форму као на слици, а затим написати комплетан
програм.
type
niz=array[1..100] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
n,k:integer;
a:niz;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin Memo1.Clear;
Memo2.Clear;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then Button1.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.FormirajNiz;
begin Randomize;
k:=1;
While k<=n do
begin a[k]:=Random(900)+100;
If Iste(a[k]) then k:=k+1;;
end;
end;
function TForm1.Iste(p:integer):boolean;
var c1,c2,c3:integer;
begin c1:=p mod 10;
c2:=p div 10 mod 10;
c3:=p div 100;
iste:=(c1=c2)or(c2=c3)or(c3=c1);
end;
procedure TForm1.IspisiNiz(a:niz;n,k:integer);
var i:integer;
begin TMemo(FindComponent('Memo'+IntToStr(k))).Clear; // празни мемо поље број k
For i:=1 to n do
TMemo(FindComponent('Memo'+IntToStr(k))).Lines.Add(Format('%2d.%4d',[i,a[i]]));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin n:=StrToIntDef(Edit1.Text,10);
If n>100
then n:=100;
Edit1.Text:=IntToStr(n);
Edit1Change(sender);
FormirajNiz;IspisiNiz(a,n,1);
Edit1.Enabled:=false;
Button1.Enabled:=false;
Button2.Enabled:=true;
Button2.SetFocus;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i,j,p:integer;
begin For i:=1 to n-1 do
For j:=i+1 to n do
If a[i]<a[j]
then begin p:=a[i];a[i]:=a[j];a[j]:=p
end;
IspisiNiz(a,n,2);
Button1.Enabled:=true;
Button2.Enabled:=false;
Edit1.Enabled:=true;
Edit1.SetFocus;
end;
Има још пуно лепих и карактеристичних задатака са једнодимензионалним низовима, али не могу се
баш сви урадити и сервирати читаоцима, зато сада прелазимо на нешто сасвим ново, на групу од
четири задатка са дводимензионалним низовима да се упознамо са начином рада са њима и неким
лепим начинима размишљања у две димензије. Користићемо низове двоцифрених бројева и димензије
10х10 због лакшег исписа, а решења су универзална и могу се применити на било који низ елемената.
• Саставити програм који формира дводимензионални низ 10 x 10 двоцифрених бројева,
а затим одређује аритметичку средину и број елемената већих од ње.
За исписивање елемената дводимензионалног низа могу се користити компоненте Memo или ListBox.
У том случају редови дводимензионалног низа формирају стринг који се затим исписује у одговарајући
ред изабраног објекта. Ми ћемо за испис користити објекат StringGrid. Овај објекат подсећа на excel
табелу у којој колоне и редови нису означени (водимо рачуна код исписа низа да је у гриду прва
координата колона, а друга ред, супротно од уобичајеног). Најпре ћемо поставити неколико
стандардних карактеристика како би приказивање елемената низа било једноставније: Align = alRight
(подаци ће бити десно поравнати); BorderStyle = bsNone (нема оквира); ColCount = 11 (десет колона за
елементе низа и једна за редне бројеве); Color = clTeal (боја позадине); DefaultColWidth = 35
(предефинисана ширина колона); DefaultRowHeight = 27
(предефинисана висина редова); Enabled = False (корисник нема
права да мења садржај било којег поља); Font = Courier New,
Regular, 16; GridLineWidth = 0 (нема линија између редова и
колона); Height = 300; RowCount = 11 (десет редова за елементе
низа и један за редне бројеве); ScrollBars = ssNone (нема клизача
јер се сви елементи виде); Width = 385. У процедури FormCreate
ћемо попунити нулти ред и колону редним бројевима (додајемо
ознаке редова и колона да бисмо се лакше сналазили у низу, није
обавезно и овај ред и колона се могу искључити, ако тако желимо).
Креираћемо форму као на слици, а затим написати комплетан
програм.
type
niz=array[1..10,1..10] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
a:niz;
var
Form1: TForm1;
a:niz;
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin For i:=1 to 11 do
begin StringGrid1.Cells[0,i]:=Format('%2d',[i]);
StringGrid1.Cells[i,0]:=Format('%2d',[i]);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin Randomize;
For i:=1 to 10 do
For j:=1 to 10 do
begin a[i,j]:=Random(90)+10;
StringGrid1.Cells[j,i]:=Format('%2d',[a[i,j]]);
end;
Button1.Enabled:=false;
Button2.Enabled:=true;
Button2.SetFocus;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin For i:=1 to 10 do
begin a[i,11]:=Najveci(a,i,1);
StringGrid1.Cells[11,i]:=Format('%2d',[a[i,11]]);
a[11,i]:=Najveci(a,i,2);
StringGrid1.Cells[i,11]:=Format('%2d',[a[11,i]]);
end;
a[11,11]:=Najveci(a,1,3);
StringGrid1.Cells[11,11]:=Format('%2d',[a[11,11]]);
Button2.Enabled:=false;
Button1.Enabled:=true;
Button1.SetFocus;
end;
function TForm1.Najveci(a:niz; i,j:integer):integer;
var k,n:integer;
begin Case j of
1 : n:=a[i,1];
2 : n:=a[1,i];
else n:=a[1,1];
end;
For k:=2 to 10 do
begin If (j=1)and(a[i,k]>n) // тражимо највећи у реду i
then n:=a[i,k];
If (j=2)and(a[k,i]>n) // тражимо највећи у колони i
then n:=a[k,i];
If (j=3)and(a[k,k]>n) // трађимо највећи на главој дијагонали
then n:=a[k,k];
end;
najveci:=n;
end;
type
niz=array[0..3,0..3] of integer;
TForm1 = class(TForm)
...
var
Form1: TForm1;
a:niz;
slob:integer;
ch:char;
procedure TForm1.Button2Click(Sender: TObject);
begin Application.Terminate;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin For i:=0 to 3 do
For j:=0 to 3 do
begin a[i,j]:=0;
// почетно стање низа, сви елементи су на нули
If (i<3)and(j<3)
then StringGrid1.Cells[i,j]:='';
// празне се сва поља стринг грида
end;
slob:=9; // свих девет поља је слободно
ch:='r'; // на потезу је први играч
Timer1.Enabled:=true; // укључује се тајмер који контролише одигравање потеза
Button1.Enabled:=false;
Button2.Enabled:=true;
Button2.SetFocus;
end;
function TForm1.Kraj:char; // функција која одређује завршетак игре
var i,j,p:integer;
begin kraj:=' '; // нема победника
p:=0; // контрола споредне дијагонале
a[3,3]:=0; // контрола главне дијагонале
For i:=0 to 2 do
begin a[3,i]:=0; // контрола колона
a[i,3]:=0; // контрола редова
p:=p+a[i,3-i]; // збир елемената на споредној дијагонали
a[3,3]:=a[3,3]+a[i,i]; // збир елемената на главној дијагонали
For j:=0 to 2 do
begin a[3,i]:=a[3,i]+a[j,i]; // збирови елемената по колонама
a[i,3]:=a[i,3]+a[i,j]; // збирови елемената по редовима
end;
end;
For i:=0 to 3 do // проверава да ли је неко од играча победио
If (Abs(a[3,i])=3) // први играч је победио ако је збир неке колоне, реда или
or(Abs(a[i,3])=3) // дијагонале 3, а други ако је -3, зато користимо функцију Abs
or(Abs(p)=3)
then kraj:=ch; // ако јесте, проглашава победника
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var i,j:integer;
pl:string;
begin Randomize; // потези се бирају на случајан начин
slob:=slob-1; // број слободних поља се смањује након сваког потеза
Repeat i:=Random(3);
j:=Random(3);
Until a[i,j]=0; // одређује се потез
StringGrid1.Cells[j,i]:=ch; // исписује се потез играча
If ch='=' // одређује ко је на потезу и вредност потеза 1 или -1
then begin a[i,j]:=-1;ch:='r';
// вредност потеза једног играча је -1
end
else begin a[i,j]:=1;ch:='=';
// вредност потеза другог играча је 1
end;
If Kraj=ch // тестира да ли је игра завршена
then begin If ch='=' // ако јесте проглашава победника
then pl:='први'
else pl:='други';
Timer1.Enabled:=false;
Button1.Enabled:=true;
ShowMessage('Победио је '+pl+' играч');
end
else If slob=0 // ако нико није победио тестира да ли је завршено нерешено
then begin Timer1.Enabled:=false;
Button1.Enabled:=true;
ShowMessage('Нерешено!');
end;
// ако игра није завршена одиграва се следећи потез
end;
линији који су овде фиксни, па се на нижим резолуцијама може десити да се не види број потеза или
парова. Али, ово је само демонстрација дела могућности програмског окружења.
• Саставити програм који на случајан начин формира низа са највише 100 целих бројева
од -1000 до 1000, а затим формирати нови низ тако сто се члановима низа са парним
индексима промени знак , а чланови са непарним индексима се умање за свој индекс.
• Саставити програм који у несортираном низу одређује највећи и најмањи члан и
затим исписује низ без та два елемента.
• Саставити програм који формира низ од највише 100 троцифрених бројева, а затим
одређује колико пута у низу следећи елемент почиње цифром којом претходни
завршава.
• Саставити програм којим се уносе елементи низа од н елемената, а затим се од тога
низа формира матрица n x n која има елементе првог низа на главној дијагонали, а
сви остали су јединице.
• Саставити програм који у матрица са n врста и m колона налази и исписује највећи и
најмањи елемент матрице, као и врсту и колону где се они налазе.
• Саставити програм којим се уносе елементи низа са n2 елемената, затим се од тога
низа формира матрица која има n врста и n колона.
• Саставити програм који формира матрицу n x n, а затим израчунава која колона
има највећи збир и исписује колону и збир.
• Саставити програм којим се проверава да ли је збир две матрице n x n јединична
матрица.
• Саставити програм којим се проверава да ли је производ две матрице n x n јединична
матрица.
• Саставити програм који симулира игру Ханојске куле (три штапа и дискови који се
премештају).
• Саставити програм који симулира игру Otello (познатија као реверси).
• Саставити програм који симулира игру GoMoKo (као хох на табли 40х30 или више
поља).
• Саставити програм који симулира игру Потапање бродова.
• Саставити програм који симулира игру MasterMind ("Скочко", са бојама или
цифрама).
• Саставити програм који симулира игру Дама (на шаховској табли по 8 белих и црних
жетона).
• Саставити програм који симулира игру Мица (традиционална игра са зрнима пасуља и
кукуруза).
• Саставити програм који симулира игру Не љути се човече.
• Саставити програм који симулира игру Монопол.
• Саставити програм који симулира игру Јамб.
• Саставити програм који симулира игру Connect 4.
• Саставити програм који симулира игру Шах.
Тип слог
podatak1.adresa.ulica // поље ulica припада слогу adresa који је део слога podatak1.
Директно упоређивање слогова није дозвољено. Упоређују се само вредности појединих
поља у оквиру слогова. На пример, овако је дозвољено упоређивати слогове, односно, поједина
поља у оквиру слога:
ucenik1.prezime<ucenik2.prezime
podatak1.adresa.ulica<=podatak2.adresa.ulica
Али овакве релације нису дозвољене:
ucenik1<ucenik2
podatak1.adresa<=podatak2.adresa
Замена вредности између две променљиве истог слоговног типа се остварује једноставно:
VAR a,b,pom:slog;
...
pom:=a; a:=b; b:=pom;
Променљиве које мењају вредности и помоћна променљива морају бити декларисане и
истог типа. Замена вредности слоговних променљивих a и b врши се као и замена вредности
две променљиве било којег другог типа. Наредба додељивања pom:=a означава да се сваком
пољу слоговне променљиве pom додељује вредност одговарајућег поља слоговне променљиве
а (и исто тако у остале две наредбе додељивања).
Приликом рада са слоговима име слога се врло често понавља код уноса, код исписа, код
упоређивања или других обрада и то може да представља непотребно губљење времена,
нарочито ако је име слога предугачко. Да би се проблем решио уведена је наредба With којом
се ова незграпна понављања имена слога елиминишу. Тако се група наредби:
podatak1.prezime:=’Илић’;
podatak1.ime:=’Мирослав’;
podatak1.adresa:=’Улица и број’;
podatak1.telefon:=’011/123-45-67’;
може се заменити једном једноставнијом за писање наредбом:
with podatak1 do
begin prezime:=’Илић’;
ime:=’Мирослав’;
adresa:=’Улица и број’;
telefon:=’011/123-45-67’;
end;
Наравно, имена поља се не могу изоставити нити скратити. Код упоређивања два слога
ова наредба не помаже много, јер се не може применити на оба слога истовремено.
Датотеке
Формирање датотеке
Пре употребе, датотека се мора декларисати или дефинисати. Датотека се експлицитно
дефинише у делу за дефиниције типова:
TYPE imena=FILE OF string;
adresa=RECORD ulica:string;
broj:integer
END;
adrese=FILE OF adresa;
Тип текстуалне датотеке не мора бити посебно дефинисан јер постоји стандардни тип
TextFile који се може користити свуда у програму.
Да би се радило са датотеком, мора да се декларише променљива која ће бити повезана са
стварном датотеком смештеном на спољашњем носиоцу меморије. Променљива датотечког
типа се декларише у делу за декларације променљивих на уобичајени начин помоћу претходно
експлицитно декларисаног датотечког типа или директно као имплицитна дефиниција тог типа:
VAR imenik:imena;
adresar:adresa;
ceobroj:FILE OF integer;
slova:FILE OF char;
opis:TextFile;
последицу, имати појаву грешке код прве следеће улазно/излазне радње са датотеком (јер
датотека и даље не постоји). Зато, ако из неког разлога желимо да вредност функције IOResult
доделимо променљивој i онда би исправно било написати овај део кода на следећи начин:
{$I-} Reset(imenik); {$I+}
i:=IOResult;
If i<>0
then ReWrite(imenik);
посао тражења жељеног података. Тај податак треба пронаћи једноставније, програмски.
Посао претраживања датотеке организује се:
• ако знамо редни број податка (или података) који тражимо
• ако знамо део податка који тражимо
У првом случају користи се стандардна процедура Seek:
Seek(imenik,redbrpod); // поставља показивач на податак са редним бројем redbrpod
Read(imenik,ime); // чита изабрани податак
У другом случају читају се подаци из датотеке све док се не нађе одговарајући податак
или док се не дође до краја датотеке:
While not EOF(imenik)or(Pos(sifra,ime)0) do // sifra је део податка који је познат
Read(imenik,ime);
Наравно, ово је пример претраживања у случају када су подаци типа стринг, у другим
случајевима услов се другачије формулише. Код текстуалних датотека претраживање се може
вршити само на други начин, тј. читањем редом свих података у датотеци док се не дође до
жељеног.
Close(pom);
Erase(imenik);
Rename(pom,’imena.dat’);
У другом случају проблем би се решио овако:
Reset(imenik);
For i:=1 to FileSize(imenik) do
Begin Read(imenik,ime);
If ime<>sifra then
Begin Seek(imenik,i-1);
Write(imenik,ime)
End
End;
Seek(imenik,FileSize(imenik)-1);
Truncate(imenik);
У овом случају се преко податка који се брише уписује следећи податак, преко овога
следећи итд. На крају се последњи податак исписује на претпоследњу позицију и сада имамо
два једнака податка. Стандардна процедура Truncate брише податке од неког места до краја
датотеке, у овом примеру, брише се само последњи податак и тако смо елиминисали
непожељни податак из датотеке.
У неким верзијама програмског језика процедура Truncate не ради, па је корисно
упамтити и први начин као начин брисања непотребних података из датотеке, мада је други
начин нешто бржи. Други начин се никако не може применити на текстуалне датотеке (јер се у
раду са текстуалним датотекама не може користити процедура Seek).
У овом делу је употребљена и стандардна процедура Rename за промену имена датотеке.
Ради се о команди која ради са диском, тј. датотеци на диску се мења име.
Овим смо заокруглили рад са датотекама. Сада је потребно огледати се на конкретном
примеру и увежбати рад са датотекама. Наравно, теже је радити са датотекама чији су
елементи слогови са већим бројем поља, али принцип рада је исти. Сваки од проблема који смо
решавали треба уоквирити у одговарајућу процедуру и тако решити овај сложени посао. Следе
задаци који ће бити решавани са променљивама типа слог како бисмо научили њихову
употребу и припремили се за програмирање и употребу датотека, а касније и база података.
Сваки задатак може се решити и са низом слогова и са датотеком одговарајућег типа.
• Саставити програм који прихвата податке о датумима рођења ученика једног одељења
и уређује их по датуму.
Слогове ћемо формирати у оквиру процедуре
Button1Click, а затим ћемо, у посебној процедури Uredi,
уређивати унете слогове по датуму и исписивати их у
листбокс, зато ћемо дефинисати тип rodjendan и глобалне
променљиве a - низ слоговa и n - редни број слогa. Након
уноса сваког слога сортирају се сви до тада унети слогови.
Предвидели смо да у одељењу има највише 32 ученика.
Креираћемо форму као на слици, а затим написати
комплетан програм.
type rodjendan=record d,m,g:integer;
ime:string;
end;
podatak=array[1..32] of rodjendan;
...
procedure Uredi;
procedure FormCreate(Sender: TObject);
...
var
Form1: TForm1;
a:podatak;
n:integer;
procedure TForm1.FormCreate(Sender: TObject);
begin n:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin if n<32 then
begin n:=n+1;
a[n].ime:=Edit1.Text;
a[n].d:=StrToIntDef(Edit2.Text,1);
a[n].m:=StrToIntDef(Edit3.Text,1);
a[n].g:=StrToIntDef(Edit4.Text,1950);
Uredi;
end;
If n=32 then
begin Edit1.Enabled:=false;
Edit2.Enabled:=false;
Edit3.Enabled:=false;
Edit4.Enabled:=false;
Button1.Enabled:=false;
end;
end;
procedure TForm1.Uredi;
var i,j:integer;
pom:rodjendan;
begin for i:=1 to n-1 do
for j:=i+1 to n do
if(a[i].g>a[j].g)or(a[i].g=a[j].g)and(a[i].m>a[j].m)or
(a[i].g=a[j].g)and(a[i].m=a[j].m)and(a[i].d>a[j].d)
then begin pom:=a[i];a[i]:=a[j];a[j]:=pom;
end;
ListBox1.Clear;
ListBox1.Items.Add('П Р Е З И М Е И И М Е ДАТУМ РОЂЕЊА');
for i:=1 to n do
begin j:=30-Length(a[i].ime);
ListBox1.Items.Add(a[i].ime+Format('%*s%*d.%*d.%*d.',
[j,' ', 2,a[i].d,2,a[i].m,4,a[i].g]))
end;
end;
Код исписа смо искористили функцију Format за групно форматирање исписа у листбоксу,
а за испис презимена и имена смо резервисали 30 места. Између апострофа је низ формата са
звездицама уместо конкретних бројева места која се резервишу за испис података,а између [ ]
је низ бројева места и вредности које се на тим местима исписују. Променљива ј одређује
колико од резервисаних 30 није искоришћено за испис презимена и имена. У решењу задатка
није коришћена никаква контрола уписа, тј. корисник може уписати било шта као датум рођења
(на пример 45.52.1000). Коректне контроле уписа датума урађене су код једноставнијих
задатака са простим типовима података, овде би само искомпликовале програм, па би се теже
видео принцип рада са слоговима. Наравно, да би све било коректно одрађено ове контроле
треба додати.
Коришћењем наредбе With последње две процедуре се мењају у:
procedure TForm1.Button1Click(Sender: TObject);
begin if n<32 then
begin n:=n+1;
With a[n] do
begin ime:=LabeledEdit1.Text;
d:=StrToIntDef(LabeledEdit2.Text,1);
m:=StrToIntDef(Edit1.Text,1);
g:=StrToIntDef(Edit2.Text,1950);
end;
Uredi;
end;
If n=32 then
begin LabeledEdit1.Enabled:=false;Edit1.Enabled:=false;
LabeledEdit2.Enabled:=false;Edit2.Enabled:=false;
Button1.Enabled:=false;
end;
end;
procedure TForm1.Uredi;
var i,j:integer;
pom:rodjendan;
begin for i:=1 to n-1 do
for j:=i+1 to n do
with a[i] do if(g>a[j].g)or(g=a[j].g)and(m>a[j].m)or
(g=a[j].g)and(m=a[j].m)and(d>a[j].d)
then begin pom:=a[i];a[i]:=a[j];a[j]:=pom;
end;
ListBox1.Clear;
ListBox1.Items.Add('П Р Е З И М Е И И М Е ДАТУМ РОЂЕЊА');
for i:=1 to n do
with a[i] do
begin j:=30-Length(ime);
ListBox1.Items.Add(ime+format('%*s%*d.%*d.%*d.',
[j,' ', 2,a[i].d,2,a[i].m,4,a[i].g]))
end;
end;
// ********************************************
// *** Отвара датотеку са адресама ************
// ********************************************
procedure TForm1.FormCreate(Sender: TObject);
begin Label1.Caption:='МОЈ'+#13+'АДРЕСАР';
AssignFile(dat,'Adresar.dat');
{$I-} Reset(dat); {$I+}
If IOResult<>0
then ReWrite(dat);
CloseFile(dat);
end;
// ********************************************
// *** Крај рада са програмом *****************
// ********************************************
procedure TForm1.IzlazClick(Sender: TObject);
begin Application.Terminate;
end;
// ********************************************
// *** Унос података у датотеку ***************
// ********************************************
procedure TForm1.UnosClick(Sender: TObject);
begin PUnos.Visible:=true; // отвара панел за унос адреса
UnosP.Click;
end;
procedure TForm1.UnosKClick(Sender: TObject);
begin PUnos.Visible:=false; // затвара панел за унос адреса
end;
procedure TForm1.UnosPClick(Sender: TObject);
var i:integer;
begin For i:=0 to 11 do // празни све едите за нови унос
TEdit(FindComponent('U'+IntToStr(i))).Clear;
U0.SetFocus;
end;
procedure TForm1.U0KeyPress(Sender: TObject; var Key: Char);
var i:integer;
begin If key=#13 // дефинише прелазак на следећи објекат када
then begin For i:=0 to 10 do // се притисне Ентер
If sender=TEdit(FindComponent('U'+IntToStr(i)))
then TEdit(FindComponent('U'+IntToStr(i+1))).SetFocus;
If sender=U11
then UnosZ.SetFocus;
end;
end;
procedure TForm1.UnosZClick(Sender: TObject);
var n:integer;
begin Reset(dat); // смешта уписани податак у адресар
n:=FileSize(dat);
With a do
begin prezime:=U0.Text;ime:=U1.Text;
ulica:=U5.Text; broj:=U6.Text;
mesto:=U7.Text;pbroj:=U8.Text;
ftel:=U9.Text; mtel:=U10.Text;
email:=U11.Text; redbr:=n;
d:=StrToIntDef(U2.Text,1);
m:=StrToIntDef(U3.Text,1);
g:=StrToIntDef(U4.Text,2000);
end;
Seek(dat,n);Write(dat,a);
end;
// ********************************************
// *** Преглед података у датотеци ************
// ********************************************
procedure TForm1.PregledClick(Sender: TObject);
begin PPregled.Visible:=true; // отвара панел за преглед адреса
Reset(dat);Memo1.Clear;
While not Eof(dat) do // чита све податке из датотеке и преноси их у мемо
begin Read(dat,a);
With a do
begin Memo1.Lines.Add(Format('%3d. %1s %1s',[redbr,prezime,ime]));
Memo1.Lines.Add(' '+ulica+' '+broj);
Memo1.Lines.Add(' '+pbroj+' '+mesto);
Memo1.Lines.Add(Format('%7d.%2d.%4d.%13s%13s',[d,m,g,ftel,mtel]));
Memo1.Lines.Add(' '+email);
Memo1.Lines.Add('');
end;
end;
end;
procedure TForm1.PregledKClick(Sender: TObject);
begin PPregled.Visible:=false; // затвара панел за преглед адреса
end;
// ********************************************
// *** Брисање података из датотеке ***********
// ********************************************
procedure TForm1.BrisanjeClick(Sender: TObject);
begin PBrisi.Visible:=true; // отвара панел за брисање адреса
Reset(dat);Memo2.Clear; // чита све податке из датотеке
While not Eof(dat) do // и преноси их у мемо поље
begin Read(dat,a);
With a do
begin Memo2.Lines.Add(Format('%3d. %1s %1s',
[redbr,prezime,ime]));
Memo2.Lines.Add(' '+mesto+' '+ulica+
' '+broj);
Memo2.Lines.Add('');
end;
end;
end;
procedure TForm1.OBrisiClick(Sender: TObject);
var i,k:integer;
begin If MessageBox(0,'ДА ЛИ СТЕ СИГУРНИ?','ПАЖЊА',MB_OKCANCEL+MB_ICONQUESTION)=IDOK
then begin k:=StrToInt(Edit1.Text);
Reset(dat);
For i:=k+1 to FileSize(dat)-1 do
Begin Seek(dat,i);Read(dat,a);
a.redbr:=a.redbr-1;
Seek(dat,i-1);Write(dat,a)
End;
Seek(dat,FileSize(dat)-1);
Truncate(dat);
Brisanje.Click;
end;
end;
procedure TForm1.B1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13
then BrisiK.Click
else If not (key in ['0'..'9',#8,#128])
then key:=#27;
end;
procedure TForm1.BrisiKClick(Sender: TObject);
begin PBrisi.Visible:=false; // затвара панел за брисање адреса
end;
// ********************************************
// *** Брисање свих података из датотеке ******
// ********************************************
procedure TForm1.IsprazniClick(Sender: TObject);
begin If MessageBox(0,'!!!БРИСАЊЕ СВИХ ПОДАТАКА!!!'+#13+
'ДА ЛИ СТЕ САСВИМ СИГУРНИ???','ПАЖЊА',
MB_OKCANCEL+MB_ICONQUESTION)=IDOK
then begin ReWrite(dat);
CloseFile(dat);
MessageBox(0,'СВИ ПОДАЦИ СУ ОБРИСАНИ.','Адресар',
MB_OK+MB_ICONASTERISK);
end;
end;
// ********************************************
// *** Сортирање података у датотеци **********
// ********************************************
procedure TForm1.SortClick(Sender: TObject);
var b:podatak;
i,j,p:integer;
begin MessageBox(0,'ПРИТИСНИТЕ ОК ЗА ПОЧЕТАК.','Адресар',
MB_OK+MB_ICONASTERISK);
Reset(dat);
For i:=0 to FileSize(dat)-2 do
For j:=i+1 to FileSize(dat)-1 do
begin Seek(dat,i);Read(dat,a);
Seek(dat,j);Read(dat,b);
If a.prezime+a.ime>b.prezime+b.ime
then begin p:=a.redbr;
a.redbr:=b.redbr;
b.redbr:=p;
Seek(dat,j);Write(dat,a);
Seek(dat,i);Write(dat,b);
end
end;
MessageBox(0,'ПОДАЦИ СУ СОРТИРАНИ!','Адресар',
MB_OK+MB_ICONASTERISK);
end;
// ********************************************
// *** Претраживање података из датотеке ******
// ********************************************
procedure TForm1.PronadjiClick(Sender: TObject);
begin PNadji.Visible:=true; // отвара панел за претраживање
Memo3.Clear;
Memo3.Lines.Add('');
Memo3.Lines.Add(' УПИШИТЕ ПОДАТАК ИЛИ
ПОДАТКЕ КОЈЕ ЗНАТЕ!');
P1.SetFocus;
end;
procedure TForm1.NadjiKClick(Sender: TObject);
begin PNadji.Visible:=false; // затвара панел за претраживање
end;
procedure TForm1.PromeniClick(Sender: TObject);
begin p1.Clear;p2.Clear;
p3.Clear;p1.SetFocus;
end;
procedure TForm1.PronadjiPClick(Sender: TObject);
var br:integer;
begin Memo3.Clear;
If Length(P1.Text+P2.Text+P3.Text)=0
then MessageBox(0,'Морате уписати бар један податак за претраживање.','ПАЖЊА',
MB_OK+MB_ICONQUESTION)
else begin br:=0;
Reset(dat);
While not Eof(dat) do
begin Read(dat,a);
If Length(P1.Text)>0
then If a.prezime=P1.Text
then If Length(P2.Text)>0
then If a.ime=P2.Text
then If Length(P3.Text)>0
then If a.mesto=P3.Text // p1+p2+p3
then begin br:=br+1;Unesi;
end
else
else begin br:=br+1;Unesi; // p1+p2
end
else
else If Length(P3.Text)>0
then If a.mesto=P3.Text // p1+p3
then begin br:=br+1;Unesi;
end
else
else begin br:=br+1;Unesi; // p1
end
else
else If Length(P2.Text)>0
then If a.ime=P2.Text
then If Length(P3.Text)>0
then If a.mesto=P3.Text // p2+p3
then begin br:=br+1;Unesi;
end
else
else begin br:=br+1;Unesi; // p2
end
else
else If Length(P3.Text)>0
then If a.mesto=P3.Text // p1+p3
then begin br:=br+1;Unesi;
end
else
else;
end;
MessageDlg('Број пронађених података: '+IntToStr(br),mtInformation,[mbOk],0);
end;
Promeni.SetFocus;
end;
procedure TForm1.P1KeyPress(Sender: TObject; var Key: Char);
begin If key=#13 // дефинише прелазак на следећи објекат када се притисне Ентер
then If sender=P1
then P2.SetFocus
else If sender=P2
then P3.SetFocus
else If sender=P3
then PronadjiP.SetFocus;
end;
procedure TForm1.Unesi;
begin With a do
begin Memo3.Lines.Add(Format('%3d. %1s %1s',[redbr,prezime,ime]));
I0.SetFocus;
end;
end;
procedure TForm1.I1KeyPress(Sender: TObject; var Key: Char);
var i:integer;
begin If key=#13 // дефинише прелазак на следећи објекат када се притисне Ентер
then begin For i:=1 to 11 do
If sender=TEdit(FindComponent('I'+IntToStr(i)))
then TEdit(FindComponent('I'+IntToStr(i+1))).SetFocus;
If sender=I12
then IPamti.SetFocus;
end;
end;
Литература