59
1  УНИВЕРЗИТЕТ У БАЊОЈ ЛУЦИ МАШИНСКИ ФАКУЛТЕТ П Р О Г Р А М И Р А Њ Е Скрипта Дио I Симо Јокановић Април, 2012.

Programiranje Skripta 2012.05

  • Upload
    -

  • View
    25

  • Download
    0

Embed Size (px)

DESCRIPTION

Visual Basic

Citation preview

Page 1: Programiranje Skripta 2012.05

1  

УНИВЕРЗИТЕТ У БАЊОЈ ЛУЦИ МАШИНСКИ ФАКУЛТЕТ

П Р О Г Р А М И Р А Њ Е Скрипта – Дио I

Симо Јокановић

Април, 2012.

Page 2: Programiranje Skripta 2012.05

2  

САДРЖАЈ: С А Д Р Ж А Ј Увод: Програмски језици . . .

Page 3: Programiranje Skripta 2012.05

3  

УВОД: Програмски језици Језик је средство за комуникацију. У комуникацији људи настали су природни

језици. Програмски језици су вјештачки језици за комуникацију између људи и рачунара. Они се пројектују тако да буду што ближе природном језику човјека, а истовремено што подеснији за превођење у језик рачунара. Ради се о дијаметрално супротним захтјевима које није лако помирити. С једне стране је језик човјека, превише богат и недовољно прецизан да би био прихватљив за рачунар. С друге стране је прецизан и поуздан језик рачунара, али због оскудног скупа симбола (0 и 1) сувише непрегледан да би био прихватљив за човјека. Еволуција програмских језика одвија се у правцу све већег приближавања човјеку. Наравно да тај приступ изазива сложеније (теже) поступке превођења. Проблеми превођења се настоје ублажити развојем напредније грађе рачунара односно њихових (машинских) језика.

Кокнкретније речено, од програмског језика се тражи: да пружи што већи комфор за човјека при преношењу алгоритама на

рачунар, да омогући лагано праћење програмског алгоритма од стране више

особа, да омогући формално (прецизно, једнозначно дефинисана правила)

превођење на машински језик. Иако су много сиромашнији од природних, програмски језици се граде на

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

Скуп симболи саставља се од енглеске абецеде, знакова за цифре, знакова интерпункције и неких специјалних знакова:

A, B, C, … x, y, z, 0, 1, 2, -, /, :, #, $, !, ^, <, >, =, … Низањем симбола састављају се ријечи. Неке ријечи су унапријед утврђене: DOUBLE, DO, LOOP, WHILE, IF, THEN, ELSE, SIN, COS, ... Унапријед утврђене (резервисане) ријечи називају се кључним ријечима и

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

Page 4: Programiranje Skripta 2012.05

4  

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

Нивои програмских језика Да би се могао извршавати на рачунару програм написан у вишием програмском језику мора бити преведен у машински језик.

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

- компајлери и - интерпретери.

Компајлери су такви програми преводиоци који одједанпут преводе цио програм из вишег програмског језика у машински језик. Као резултат превођења настаје нови фајл са програмом у машинском језику. Тај се фајл назива извршним програмом јер се може извршавати на датом рачунару. Одатле долази његова екстензија, односно тип .exe. Да би се добијени програм могао извршавати на рачунару другог типа, са различитим микропроцесором, он се мора поново превести. На срећу, тај задатак обавља компајлер, изворни код не мора да се мијења. Компајлер се приликом учитавања (инсталације) прилагођава датом типу рачунара, али одређена подешавања мора да направи и програмер. Представници језика са овим типом преводиоца су: FORTRAN, Pascal, C, C++, Java итд. Преводиоци интерпретерског типа преводе дио по дио програма и преведени дио одмах извршавају. Превођење се изводи сваки пут кад се покрене програм. Такви програми спорије раде, али су корисни у току писања програма, јер корисник често прави измјене и испробава различита рјешења и идеје. У ову групу језика спадају Basic, Lisp, MatLab.

  

Виши програмски језик 

 Преводилац 

Машински језик 

Page 5: Programiranje Skripta 2012.05

5  

На самим почецима рачунарства програми су се писали у машинском језику. Сваки мокропроцесор, односно централна процесорска јединица (CPU) рачунара, има сопствени скуп микрооперација које извршава. При машинском програмирању те операције се, као и подаци са којима раде, бинарно кодирају и називају микроинструкције. Писање програма у машинском језика подразумијевало је писање бинарних кодова микроинструкција и података. Програм би се потом, помоћу посебних уређаја, уносио у оперативну меморију рачунара. Покретањем програма, микропроцесор редом чита и извршава једну по једну инструкцију. То је био заморан посао који је захтијевао пуно концентрације, памћења и познавање архитектуре рачунара. Да би се избјегле потешкоће у бинарном кодирању инструкција уведене су за поједине микроинсструкције ознаке које је лакше памтити, такозване мнемоничке ознаке. Нпр. сабирање, помјерање и скок у програму се означавају са Add, Mov и Jmp, респективно. Поред тога и регистрима микропроцесора додјељују се словне ознаке, да се лакше памте. Тако се добија прегледнији, али и даље дугачак програм, јер свака микропроцесорска операција захтијева посебну инструкцију у програму. Овако писани програм назива се асемблер. Потребно је његово превођење у машински језик. Програм преводиоц носи исто име - асемблер. Сљедећи корак био је развој виших програмских језика. Они су још више прилагођени човјеку. Користе енглеске ријечи и већ прихваћене концепте података, структура података, математичко-логичких операција, функција итд. Програми писани у вишем програмском језику су много разумљивији, прегледнији и краћи. Једна команда вишег програмскогх језика замјењује низ команди, понекад на стотине команди, машинског језика. Да би програмирао у вишем програмском језику програмер не мора познавати детаље архитектуре рачунара (мада му то није на одмет), задатак је преводиоца да програм прилагоди конкретном рачунару. Програм написан у вишем програмском језику може се извршавати на сваком рачунару који посједује преводилац за тај језик.

На сљедећем испису дат је упоредни преглед три изложене генерације програмских језика. Ради се о оригиналном резултатима насталим превођењем малог броја команди програмског језика C++ у асемблерски и машински код.

Page 6: Programiranje Skripta 2012.05

6  

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[]) { int i =2, j=-3, z; z=i+j; printf("Zbir je: %d", z); return 0; } C++  Асемблер  Машински језик 

(хексадецимално кодиран) int i =2, j=-3, z;

   

004113AE mov dword ptr [i],2 004113B5 mov dword ptr [j],0FFFFFFFDh

0x004113AE c7 45 f8 02 00 00 00 0x004113B5 c7 45 ec fd ff ff ff 

z=i+j;   004113BC mov eax,dword ptr [i]

004113BF add eax,dword ptr [j] 004113C2 mov dword ptr [z],eax

0x004113BC 8b 45 f8 0x004113BF 03 45 ec 0x004113C2 89 45 e0 

     

 

Код инструкције Меморијска локација Податак 

Page 7: Programiranje Skripta 2012.05

7  

ПРОГРАМСКИ ЈЕЗИК “VISUAL BASIC”

Елементи језика

Програми се граде од наредби. Jедна je приказана nа сљедећој слици. Она 'наређује' да се израчуна вриједност израза на десној страни знака једнакости и да се добијена вриједност додијели варијабли са именом Obim.

Наведена наредба обавља сасвим конкретан задатак. Њен резултат биће обим кружнице радијуса r. Подразумијева се да ће вриједност радијуса r на неки начин бити задата. За уношење података у Visual Basic-у на располагању је подпрограм InputBox().

Резултат израчунавања је ваљда некоме потребан, иначе чему труд око рачунања. Макар о њему треба обавијестити корисника. Најефикасније средство да се то обави представља подпрограм MsgBox(). Комплетан програм приказан је на сљедећем испису:

r = InputBox("") Obim = 2 * r * 3.14159 MsgBox(Obim)

Да креирате овај програм потребно је да направите двоструки клик на Visual Basic форму. Добићете прву и посљедњу наредбу. То је оквир за писање. Немојте за сада о томе водити рачуна. Између тих двају редака уметните приказани код програма.

Кад испишете програм покрените га са командом RunStart (F5 или дугме ). Добићете прозор у којем ће бити исписан резултат. Не брините пуно о подпрограмима InputBox()и MsgBox(). То су подпрограми које су творци

Obim = 2*r*3.14159

варијабле 

подаци 

симболи за операције (оператори) 

израз 

наредба 

Page 8: Programiranje Skripta 2012.05

8  

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

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

Const Pi = 3.14159265358979

У Visual Basic-у постоји један број унутрашњих или системски дефинисаних константи које је врло корисно познавати. Њихова имена почињу са vb. Напримјер, константа са симболичким именом vbRed има вриједност бројчаног еквивалента црвене боје, а константа vbCr ASCII кода типке enter (carriage return). Изрази (expressions) су било које комбинације варијабли, оператора и података којa су исправне у смислу да дају употребљиве резултате. Изразима је такође својствен тип. Он се подудара са типом њиховог резултата. Израз не може самостално стајати у програму већ само као дио наредбе.

Page 9: Programiranje Skripta 2012.05

9  

Наредбе (statement) су самосталне програмске конструкције од којих састављамо програм. Помоћу наредби прописујемо операције које рачунар треба да изврши. Помоћу наредби преносимо и додатна обавјештења неопходна за обликовање програма. Напред приказан програм састоји се од три наредбе. Типови података, варијабли и израза Под типом података подразумијева се врста података са којима се ради. У програмским језицима користе се бројчани, знаковни, логички и још неки подаци. Бројчани подаци имају чак и своје под типове: цјелобројне и реалне (бројеви са цијелим и разломљеним дијелом). Од типа податка зависи колико ће се меморије одвојити за његово чување. Још је важније што су и операције са различитим типовима података различите сложености. Треба увијек бирати најједноставнија рјешења. Ако се нпр. зна да операције са бројчаним подацима (бројевима) неће изићи из скупа цијелих бројева онда терба радити са подацима и варијаблама цјелобројног типа, јер су операције у скупу цијелих бројева једноставније, не само за човјека већ и за процесор рачунара, а поред тога цјелобројни подаци заузимају мање меморије. Преглед основних типова података дат је у сљедећој табели:

Тип податка

Сибол *Утрошак меморије

[бајта] Опсег вриједности Опис

Integer % 2 -32768 до 32767 Цио број

Single ! 4 -3.403·1038 до 3.403·1038 корак: 1.401·10-45

Реалан број обичне (стандардне) прецизности

Double # 8 -1.798·10308 до 1.798·10308 корак: 4.941·10-324

Реалан број двоструке(повишене) прецизности

Boolean 2 Тrue (истина) = -1 False (неистина) = 0

Логичка величина

String $ број

знакова 1 до ~65000 Низ знакова

* У овој колони дат је симбол за имплицитно проглашење типа Цио број се представља са 16 бита што даје 216 = 65536 комбинација, односно различитих бројева. Половина или 32768 комбинација отпада на негативне, а половина на позитивне бројеве (32767 и 0). Први бит с лијева служи за предзнак броја, 1 означава минус (–), а 0 плус (+). У ствари, негативни бројеви се записују као

Page 10: Programiranje Skripta 2012.05

10  

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

2 . Нпр. за број 1001, алгебарски комплемент двојке је

10000- 1001

0111 Лакше је до правог алгебарског комплемента доћи преко неправог, тј. преко комплемента до највеће цифре, у случају бинарног бројног система то је јединица. За претходни примјер броја 1001, алгебарски комплемент јединице је

1111- 1001

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

2 1 1, односно

1, то значи да је комплемент двојке за 1 већи од комплемента јединице. Ово упућује на то да се до комплемента двојке може доћи тако што се најприје нађе комплемент јединице (јер га је лако наћи једноставним инвертовањем цифара) па да се на добијену вриједност дода 1. Према томе: бинарна репрезентација негативног цијелог броја добије се тако што се инвертују цифре бинарне репразентације истог али позитивног броја и на добијену вриједност дода 1. Нпр. бинарна репрезентација број -3(10) добије се када се бинарној репрезентацији броја 3(10) инвертују цифре и на резултат дода 1, што је приказано на сљедећој шеми.

3 00113 1100

+ 1-3 1101

Page 11: Programiranje Skripta 2012.05

11  

Шири преглед везе позитивних и негативних бинарних бројева илуструје сљедећа шема, урађена за 16-битну репрезентацију.

Децимални запис

Бинарани запис

127 01---1111... ... 3 00---00112 00---00101 00---00010 00---0000-1 11---1111-2 11---1110-3 11---1101

11---1100...

-128 10---0000 Пошто је памћење и записивање цијелих бројева у бинарном облику тешко и непрегледно често се користи хексадецимални запис, тј. запис у бројном систему са базом 16. У том систему је потребно 16 симбола за цифре, па су, поред 10 симбола децималног бројног система, уведена још слова A,B,C,D,E и F, да се направи допуна до 16, како је приказано у сљедећој таблици d: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 h: F E D C B A 9 8 7 6 5 4 3 2 1 0 b: 1111 1110 1101 1100 1011 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001 0000

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

⋯ претварамо у децимални по познатој формули за вриједност броја у позиционом бројном систему.

∙ 2 ∙ 2 ⋯ ∙ 2 ∙ 2 ∙ 2 ∙ 2

Page 12: Programiranje Skripta 2012.05

12  

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

1101 1111 0010 1010D F 2 A

Да је ово тачно показаћемо аналитички.

⋯ ∙ 2 ∙ 2 ⋯ ∙ 2 ∙ 2 ∙ 2 ∙ 2

∙ 2 ∙ 2 ∙ 2 ∙ 2 ∙ 2

∙ 2 ∙ 2 ∙ 2 ∙ 2 ∙ 2 ∙ 2 ∙ 2 ∙ 2 ∙ 2 ∙ 2

∙ 2 ∙ 2 ∙ 2 ∙ 2

∙ 16 ∙ 16 ∙ 16 ∙ 16

Репрезентација реалних бројева је другачија и сложенија. О тој репрезентацији ћемо говорити касније. За сада ћемо само нагласити да је разлика између двију репрезентација (Single и Double) у прецизности записа. Single тип се користи у приликама кад вриједности излазе из скупа цијелих бројева, али није потребна изузетна прецизност, док се Double тип користи у ситуацијама наглашене потребе за прецизношћу података. Он омогућује запис бројева са преко 300 децимала и врло прецизна инжењерска и научна израчунавања. Репрезентација логичких величина. У скупу логичких величина постоје само двије вриједности: True (истина) и False (лаж, неистина). За чување логичких вриједности троше се 2 бајта меморије. Истина се предстаља са -1, тј. са бинарним бројем код кога је свих 16 бита постављено на 1. Лаж се представља са 0 – сви битови постављени на 0. Тако стоје ствари што се тиче репрезентације, али треба знати да се и бројчане величине, које нису унапријед проглашене логичким, могу тумачити као логичке

Page 13: Programiranje Skripta 2012.05

13  

вриједности. При томе вриједи сљедеће правило: „Свака вриједност различита од 0 тумачи се као истина, а само вриједност једнака 0 као неистина (лаж). Репрезентација знаковних података Знаковни подаци представљају се помоћу својих бројчаних еквивалената или кодова. За чување појединог знака одваја се један бајт меморије. За кодирање знакова на дигиталним рачунарима опште је прихваћен тзв. ASCII код (American Standard Code for Information Interchange). ASCII кодови за првих 127 знакова приказани су у сљедећој табели.

ASCII Знак

ASCII Знак

ASCII Знак

ASCII Знак

Dec Hex Dec Hex Dec Hex Dec Hex 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

0 1 2 3 4 5 6 7 8 9 A B C D E F

NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F

DLEDC1DC2DC3DC4NAKSYNETBCANEM SUBESCFS GS RS US

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F

(space)

! " # $ % & ' ( ) * + , - . /

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F

0 1 2 3 4 5 6 7 8 9 : ; < = > ?

ASCII Знак

ASCII Знак

ASCII Знак

ASCII Знак

Dec Hex Dec Hex Dec Hex Dec Hex 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F

@ A B C D E F G H I J K L M N O

80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F

P Q R S T U V W X Y Z [ \ ] ^ _

96 97 98 99 100101102103104105106107108109110111

60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F

` a b c d e f g h i j k l m n o

112113114115116117118119120121122123124125126127

70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F

p q r s t u v w x y z { | } ~

Page 14: Programiranje Skripta 2012.05

14  

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

ASCII код Улога Опис 4 EOF Крај преноса. Користи се и да

означи крај секвенцијалног фајла. 9 TAB Типка “Tab” 10 LF Прелазак у нови ред (као “Enter”) 13 CR Типка “Enter”

(http://www.ascii-code.com/ даје опис контролних кодова) Знаковни подаци стављају се у наводнике, јер у противном преводилац не би знао ради ли се о имену неке варијабле или о знаковном податку. Нпр. наредбом Slovo = “A” варијабли слово придружиће се знаковна вриједност А. (Подразумијева се да је Slovo варијабла знаковног типа). Ако знамо ASCII код неког знака можемо тај знак добити и помоћу функције

Chr(ASCII код) Нпр. ако се изда команда

Slovo = Chr(65) добиће се исти резултат као у претходном примјеру - варијабли Slovo придружиће се знаковна вриједност A. Овај начин добијања знакова је нарочито важан за управљачке знакове, односно кодове. Они и не могу да се добију стављањем у наводнике јер њихов еквивалентан писани знак и не постоји. Међутим, можемо их активирати (изазвати) помоћу функције

Chr(ASCII код) За боље разумијевање размотрите примјер на страни 37. Декларисање варијабли

Page 15: Programiranje Skripta 2012.05

15  

Варијаблама у програму је корисно унапријед утврдити тип. Тај поступак назива се проглашењем типа или декларацијом варијабли. За декларисање варијабли обезбијеђена је команда Dim. Она има сљедећу синтаксу:

Dim ime_varijable As tip На мјесту tip наводи се један од важећих типова варијабли. Нпр.

Dim eps As Double Dim Slovo As String

У саставу једне Dim команде може се декларисати више варијабли, као у примјеру

Dim i As Integer, j As Integer, x As Double Dim представља скраћеницу енглеске ријечи Dimension што у преводу значи димензионисање тј. дефинисање величине. И овдје се ради о одређеном облику димензионисања – димензионисању меморије. Одреди ли се тип варијабле аутоматски је одређена и величина (количина) меморије која се датој варијабли додјељује (видите табелу типова). Декларација типа помоћу команде Dim назива се експлицитном декларацијом. Треба је изводити на почетку програма. Декларација варијабли није обавезна, али се тиме постиже сигурнији, разумљивији и ефикаснији програм и сви добри програми одликују се том карактеристиком. Уколико се тип неке варијабла не декларише експлицитно Visual Basic изводи такозвану имплицитну декларацију додјељујући варијабли такозвани тип Variant. Variant тип је специјалан Visual Basic концепт. То је флексибилан тип који може да замијени сваки од стандардних типова, али је неефикасан како у погледу утрошка меморије тако и у погледу брзине обраде. Детаљније о овом и још неким типовима података говорићемо у другом дијелу курса. За лијене програмере на располагању је још једна, лакша декларација типа. Она се изводи тако што се име варијабле заврши са специјалним симболом. У колони 2 табеле типова наведени су ти симболи за поједине типове података. (Примијетићете да није за све типове података обезбијеђен такав специјалан знак). Нпр. у команди

Page 16: Programiranje Skripta 2012.05

16  

eps# = 0.0000001 уводи се варијабла eps типа double. Знак за декларацију типа (#) довољно је навести само једанпут, приликом првог навођења варијабле, у накнадној употреби варијабле он се може изоставити. Нпр. у наредном дијелу кода могли би издати команду: x = eps + 2.05 Поред декларације, варијабле је корисно и иницијализирати. Прва употреба варијабле назива се иницијализацијом. У команди eps# = 0.0000001 истоверемено је изведена и декларација и иницијализацијан варијабле eps. У примјеру Dim x As Double, y# = x + 3.0 варијабла x је декларисана, али није иницијализирана. Када варијабле нису експлицитно иницијализиране (дефинисане) од стране програмера Visual Basic их имплицитно иницијализира. Бројчаним варијаблама се додјељује вриједност 0, а знаковним празан низ (""). Добра је, међутим, навика да се варијабле експлицитно иницијализирају. Записивање података За раздвајање цијелог и разломњеног дијела реалних бројева користи се тачка , а не зарез. За записивање реалних бројева може да се користи такозвана научна нотација. Нпр. број 0.15∙10-12 се записује као 0.15E-12. Хексадецимални бројеви записују се тако што се испред цифара броја ставља префикс &H. Нпр. број 249 може да се запише као &HF9. За окталне бројеве, бројеве са базом 8, користи се префикс &O. Знаковни подаци записују се у наводницима, нпр: ”francuski jezik”, “x:=”, “Cetinjska 35”, итд.

Page 17: Programiranje Skripta 2012.05

17  

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

аритметичке, логичке, операције поређења, знаковне операције и операције премијештања података.

Као и у математици и у програмирању су различитим операцијама додијељени различити симболи, само се они у програмирању код неких операција разликују. Аритметичке операције. Преглед аритметичких операција са одговарајућим симболима дат је у сљедећој табели. За операције чије значење није сасвим очигледно дати су примјери. Операција Симбол Примјер сабирање, + 23 програмира се овако: 2^3

Резултат цјелобројног дијељења је цијели дио количника, нпр. резултат израза 14\3 je 4. MOD операција даје остатак послије цјелобројног дијељења, нпр. резултат израза 14 MOD 3 је 2. (Припазите на празнину између оператора MOD и операнада.

одузимање, -

множење, *

дијељење  /

потенцирање ^

цјелобројно дијељење \

модуо (модулус) MOD

Логичке операције Логичке операције се изводе над логичким варијаблама. То су операције алгебре логике или Булове операције. Основне логичке операције су логичко множење ( коњукција), логичко сабирање (дисјункција) и негација. Поред ових трију основних постоји још један број додатних логичких операција, али се њихова употреба може заобићи јер се могу реализовати помоћу основних логичких операција. Логичке операције немају симболе веће се програмирају помоћу одговарајућих енглеских ријечи And, Or и Not, како је приказано у сљедећој табели:

Page 18: Programiranje Skripta 2012.05

18  

Операција Симбол ПримјерИ (Логичко множење,

коњукција) And Dim B1 As Boolean, B2 As Boolean,

Dim L As Boolean, L2 As Boolean B1 = True: B2 = False L = B1 And B2 (L добија вриједност False) L2 = Not L (L2 добија вриједност True)

Или (Логичко сабирање, дисјункција)

Or

Не (Негација) Not

Операције поређења. Операције поређења користе се за поређење двију вриједности. Њихови симболи су дати у сљедећој табели. Резултат операција поређења је логичка величина, тачно (True) или нетачно (False). Операција Симбол Примјер мање од < Dim B As Boolean

x% = 2.5 B = x^2 <= 9

(варијабла Б добија вриједност True, јер је x2 = 6.25, а то јесте мање од 9)

мање или једнако <=

веће од >

веће или једнако >=

јест једнако =

различито <>

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

Dim Log1 As Boolean A% = 10: B% = 20: C% = 30 Log1 = A < B And B < C D% = A < B And C

Коју ће вриједност попримити варијабла D. Знаковне операције Постоји само једна знаковна операција, то је операција повезивања (настављања) знаковних низова. Њен је симбол &. Напримјер, сљедећи код

Rijec1$ = ”Dobar”

Page 19: Programiranje Skripta 2012.05

19  

Rijec2$ = ”dan” Recenica$ = Rijec1 & ” ” & Rijec2 MsgBox(Recenica)

избациће на екран сљедећу поруку . Функције Поред операција у Visual Basic-у, као и у другим вишим програмским језицима, постоје и функције. Ради се о подпрограмима, функцијског типа, за израчунавање елементарних математичких функција као и подпрограмима за неке знаковне функције. Да би се дати подпрограми што лакше памтили, за њихова имена усвојена су имена математичких функција на које се односе, кад год је то било могуће. Из истог разлога ти подпрограми се кратко називају функцијама. За разлику од математичке нотације аргумент функције се ставља у загради. У сљедећој табели дат је преглед математичких функција Visual Basic функција

Математичка функција

Напомена Примјер

Sin(x) Аргумент x је у радијанима 

Dim pi As Double pi = 4*Atn(1) (Добија се вриједност броја ) z = Exp(1) (Исто што и ) Const e = 2.71828182845905y = log(e) (y поприма вриједност 1)

Cos(x) Tan(x) Atn(x) Резултат је у

радијанима, у интервалу

, ) Abs(x) | | Апсолутна

вриједност Sgn(x) Знак бројаSqr(x) √ Log(x) Природни

логаритам (по бази )

Exp(x)

Page 20: Programiranje Skripta 2012.05

20  

Знаковне функције оперишу над знаковним изразима. Најважније знаковне функције су сљедеће. Функција Образложење Примјер Len(x$) Рачуна број знакова (дужину)

низа L% = Len(”Program”) (L добија вриједност 7) T1$ = ”Razred” T2$ = Mid(T1,4,3) Варијабли T2 придружује се низ ”red” ) n% = InStr(3,”Kaladont”, ”a”) (Резултат: n = 4)

Mid(x$, n, m) Издваја из знаковног низаx$, m знакова, почињући од позиције n.

InStr([n,]x$, y$) Проналази у знаковном низуx$ позицију низа y$, почињући претраживање од позиције n.

Позиције знакова у низу броје се слијева у десно. Први знак има позицију 1, други 2 итд. Претварачке функције У програмским језицима постоји и функције, односно функцијски подпрограми, за претварање једног типа података у други. Та чињеница, вјероватно, не изненађује када су у питању бројчани подаци, али значајно је да конверзију, такође, можемо изводити између свих типова података међусобно. При конверзији у цио број реални број се заокружује. Уколико разломљени дио износи тачно 0.5 заокруживање се изводи на најближи паран број. Нпр. 0.5 ће се заокружити на 0, а 1.5 на 2. Уколико аргумент функције излази из опсега вриједности типа у који се изводи конверзија, тражена конверзија неће се моће извести и издаће се информација о грешки у програму. Нпр. конверзија Double вриједности 1.25E+305 у Single тип, као у сљедећем примјеру, неће се моћи извести.

X1# = 1.25E+305 X2! = CSng(X1)

Да би се знаковни податак могао конвертовати у бројчани податак дати низ знакова мора представљати ваљан запис броја. Нпр. знаковни податак ”-325.48” ће моћи да се претвори у бројчани, а ”-325;48” неће. Називи претварачких функција почињу словом C (од енглеске ријечи Convert) иза којег слијед скраћеница типа у који се изводи конверзија. У сљедећој табели наведено је 5 претварачких функција за 5 основних типова података које смо до сада обрадили.

Page 21: Programiranje Skripta 2012.05

21  

Функцијe Примјер CBool(x), CInt(x), CSng(x), CDbl(x), CStr(x)

Аргумент x представља вриједност која се претвара.

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

1. аритметичке, 2. операција повезивањa знаковних низова (&), 3. операције поређења и 4. логичке операције.

У скупу појединих операција приоритети су сљедећи: Аритметичке Знаковне Операције поређења Логичке

operacije ^ (потенцирање) & =, <, <=,>,>=,<> Not

- (негација) And

*, / Or \ Mod +,- Све операције поређења су истог приоритета. Употреба заграда може да буде рјешење у тренуцима недоумице или средство за експлицитно одређивање редосљеда операција.

Page 22: Programiranje Skripta 2012.05

22  

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

Формулација задатка 

Разрада рјешења 

Програмирање 

Тестирање 

Документовање 

Page 23: Programiranje Skripta 2012.05

23  

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

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

Page 24: Programiranje Skripta 2012.05

24  

Алгоритми се могу приказати текстуално, описом сваког алгоритамског корака, али се прегледнији приказ постиже израдом такозваног дијаграма тока. Они представљају графичке, шематске приказе алгоритама. Поред веће прегледности омогућују лакше откривање грешака, независност од изабраног програмског језика и рачунарског система. Ово посљедње је нарочито важно јер олакшава комуникацију између различитих профила стручњака - алгоритме могу разрађивати и користити и особе које нису вичне програмирању. За изараду дијаграма тока усвојени су сљедећи графички симболи. http://www.rff.com/flowchart_shapes.htm http://www.eng.iastate.edu/efmd/161algor.htm

Симбол Назив и опис

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

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

Одлука или корак с условом. У унутрашњост симбола уписује се услов чија се испуњеност провјерава. То може бити било који израз чија се вриједност може тумачити као логичка, тј. као тачна (TRUE) или нетачна (FALSE). Нпр. израз x >= 3 може представљати ваљан услов. Он ће бити испуњен (истинит) кад год x поприми вриједност већу од или једнаку 3. У зависности од тога да ли је израз тачан или није програм се усмјерава у једну или у другу грану.

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

ДА 

НЕ 

Page 25: Programiranje Skripta 2012.05

25  

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

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

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

Развијен је већи број симбола за израду дијаграма тока. Програми MS OFFICE пакета располажу са бројнијим скупом. Могу се прегледати поступком: Insert Shapes Flowchart (MS Office 2007). Међутим, употреба већег броја углавном се избјегава јер више отежава памћење него што помаже разумијевању алгоритма. За развој најсложенијих софтверских система развијени су нови симболи прилагођени датој технологији софтверског инжењерства. Међутим овај основни курс из програмирања неће никако задирати у те технологију. Примјер: Један комплетан дијаграм тока приказан је на сљедећој слици. Он описује алгоритам за рјешавање квадратне једначине 0. Присјетимо се да су рјешења ове једначине дата са:

,√ 42

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

, 2√ 4

2 2√2

Page 26: Programiranje Skripta 2012.05

26  

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

0 добијају се комплексна рјешења, јер је други члан имагинаран, па уз треба писати ознаку за имагинарну јединицу ( ). Иначе, тј. када услов 0 није испуњен, знак је да је дискриминанта позитивна па су рјешења реална и различита. и могу се сабрати, односно одузети да се добију вриједности за и . Треба примијетити да алгоритам може бити још профињенији. Наиме може се десити да се добију чисто имагинарна рјешења. У неким приликама то може бити интересантна информација. Размислите под којим условима ће се то појавити и проширите алгоритам тако да третира и ту специфичну ситуацију.

Page 27: Programiranje Skripta 2012.05

27  

 

DY=1

a,b,c

Rješenjasurealnaijednaka

DA

D b 4ac

POČETAK

D 0

D|D|

2a

D 0

a 0

Upitanjujelinearnajednačina

PP:LIN_JED

KRAJ

PrikazrješenjaX 

KRAJ

X B

NE

Rješenjasurealnairazličita

PrikazrealnihrješenjaX iX

2

X B DX B D

X B iD  

X B iD

Rješenjasukompleksna 

PrikazkompleksnihrješenjaX iX  

DA

NE

DA

NE

Page 28: Programiranje Skripta 2012.05

28  

ЕЛЕМЕНТАРНЕ АЛГОРИТАМСКЕ СТРУКТУРЕ Анализом алгоритамских структура показало се да се неке мустре структура редовно понављају. Те мустре назване су еплементарне алгоритамске структуре. Комбиновањем елементарних могу се добити сложеније структуре за рјешавање конкретног задатка. У елементарне алгоритамске структуре спадају:

1. Линијаска структура, 2. Структура са гранањем и 3. Цикличка структура

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

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

Почетак

Улаз 

Операција 1 

Операција 2 

Операција n 

Излаз 

Крај

⋮ 

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

Page 29: Programiranje Skripta 2012.05

29  

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

Ако вриједност израза у малој загради обиљежимом са , а израза у средњој са

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

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

Почетак

Улаз:  

Излаз:P

Крај

2: 21: 1

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

Наглашенисунајважнијикорациовоглинијскогалгоритма.

Page 30: Programiranje Skripta 2012.05

30  

Концепт који желимо увести везан је за операције додјељивања вриједности (=). У тим операцијама се вриједност израза на десној страни додјељује варијабли на лијевој страни. При томе, варијабла којој се додјељује вриједност може да се нађе и на десној страни. Таква је ситуација у сљедећојнаредби

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

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

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

понавља се исти поступак. По завршетку ће добити вриједност 38. Програмски код овог алгоритма дате је на сљедећем листингу.

Private Sub Form_Load() Dim P As Double, x As Double a3# = 2: a2# = -2: a1# = 1: a0# = -1 x = InputBox("x?")

⋮ 

⋮ 

…   

а3  2.0

а2  ‐2.0

а1  1.0

а0  ‐1.0

x  3.0

P  4.0

…   

1.

2.

3. P 13

Централнипроцесор Меморија

Page 31: Programiranje Skripta 2012.05

31  

P = a3 * x + a2 P = P * x + a1 P = P * x + a0 MsgBox ("P = " & P) End Sub

Примијетимо да су посљедње двије операције додјељивања вриједности врло сличне. Промијењен је само други сабирак израза на десној страни, а он представља одговарајући коефицијент полинома. Да је полином вишег степена сличан израз би се понављао више пута. Само би се смјењивали коефицијенти у опадајућем редосљеду. За висок ред полинома израз би се понављао велики број пута. Видјећемо касније (поглавље о цикличким структурама) да су на располагању програмске конструкције за скраћени запис оваквих процеса. Алгоритми са гранањем Основна карактеристика ове врсте алгоритамских структура је присуство једног алгоритамског корака одлуке, односно корака с условом. На том кораку програм се грана у двије линије тока. Једном линијом програм тече када је постављени услов испуњен (истинит, TRUE), а другом кад није испуњен (лажан, FALSE). Овај тип алгоритамске структуре омогућује уношење логике у програм, односно аутоматизацију резоновања што представља кључни предуслов за развој умјетне интелигенције. Као услов, на основу којег се одлучује о даљем току програма, може да се користи сваки израз који даје логичку вриједност или му се вриједност може тумачити као логичка. Логички изрази, изрази поређења и бројчани изрази (изрази који дају бројчане вриједности) испуњавају те критеријуме. Када су у питању бројчани изрази – вриједност различита од нуле тумачи се као истина, а нула као лаж. Најчешће се користе изрази поређења и логички изрази. Они директно дају логичке вриједности. Могу да се користе чак и знаковни изрази уколико је њихов резултат низ знакова који представља ваљан запис бројчане вриједности.

Page 32: Programiranje Skripta 2012.05

32  

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

Услов 

Блок2 

 Блок1 

ДА

НЕ

... If Uslov Then

Блок 1 Else

Блок 2 End If ...

Дијаграмтока Програмскаконструкција

Page 33: Programiranje Skripta 2012.05

33  

Комплетан програм би могао имати сљедећи изглед:

Private Sub Form_Load() Dim x As Double, y As Double x = InputBox("") If x < 0 Then y = -x Else y = x End If MsgBox ("Aps. vrijednost broja: " & x & " je: " & y) End Sub

Кад бисмо у овом програму за x унијели вриједност -3,55 по завршетку програма добили бисмо сљедећу поруку:

Почетак

Улаз:  

Излаз:  

Крај

... If x < 0 Then

y = -x Else

y = x End If ...

ДА

Page 34: Programiranje Skripta 2012.05

34  

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

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

If x < 0 Then x = -x End If MsgBox ("Aps. vrijednost broja je: " & x) ... Али, треба примијетити, да се у овом рјешењу губи стварна вриједност промјенљиве x. Она на крају садржи апсолутну вриједност броја па порука попут:

Apsolutna vrijednost broja -3,5 je: 3,5 не би могла да се изда. Када се, у структури условни блок, дати блок програма састоји само од једне команде та команда може да се запише у истом ретку са IF кључном ријечи, иза кључне ријечи THEN. Претходни алгоритам би могао да се програмира са само једном наредбом:

If x < 0 Then x = -x

Услов 

Блок1 

ДА

НЕ

Услов

Блок2  

ДА

НЕ

а Условниблок б Условнискок

Page 35: Programiranje Skripta 2012.05

35  

У овом случају нема потербе за END IF кључним ријечима. Структура са вишеструким гранањем Ова структура садржи више тачака (мјеста) одлуке, односно више алгоритамских корака са условом. Поред услова уз IF ријеч може се појавити још произвољан број додатних услова. Они се наводе уз ELSE IF кључне ријечи. Структура програма са више услова изгледа овако: IF Услов 1 THEN

Блок 1

ELSEIF Услов 2 THEN

Блок 2

...

ELSEIF Услов n THEN

Блок n

ELSE

Блок n+1

END IF Еквивалентан дијаграм тока овог алгоритма дат је на сљедећој слици. ELSE сегмент није обавезан, може да се изостави. Са слике се види да се при сваком извршавању програма може да изврши највише један блок структуре, онај чији је коресподентан услов испуњен. Ако ниједан услов није испуњен онда се извршава Блок n+1 уколико је присутан. Могућа је и ситуација у којој се не извршава ни један блок структуре. То ће се десити у случају када ELSE сегмент не постоји и када ниједан услов није испуњен.

Page 36: Programiranje Skripta 2012.05

36  

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

0 0

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

DD,

D

D

гдје је:

D – детерминанта система,

Услов1 

Блок1 

ДА

НЕ

Услов2 

Блок2

Условn 

БлокnБлокn 1 

... 

...

ДА

ДА

НЕ

НЕ

Page 37: Programiranje Skripta 2012.05

37  

D – детерминанта од и

D – детерминанта од .

Услов за постојање рјешења је да називник D у изразима за израчунавање и буде различит од нуле. То је знак да су праве паралелне. То је специфичан случај. Специфичан је и случај кад су и бројник и називник истовремено једнаки нули. То ће се десити кад су праве подударне. Програм не смије заказивати у тим специфичним ситуацијама, мора успјешно да се носи с њима. То се постиже уградњом дијелова кода који испитују евентуалну појаву специфичног случаја и одговарјућег одговора (поступања) када се он појави. Квалитет програма у великој мјери зависи од тога колико је програмер успио да предвиди и адекватно одговори на све могуће специфичне ситуације. Слиједи комплетан програм постављеног рјешења. Private Sub Form_Load() Dim a1 As Double, b1 As Double, c1 As Double Dim a2 As Double, b2 As Double, c2 As Double Dim ds As Double, dx As Double, dy As Double Dim x As Double, y As Double a1 = 1.1: b1 = 1: c1 = 3 a2 = 2: b2 = 2: c2 = 6.5 ds = a1 * b2 - b1 * a2 dx = -c1 * b2 + c2 * b1 dy = -a1 * c2 + a2 * c1 If ds = 0 And dx = 0 Then MsgBox ("Rjesenje je neodredjeno - prave su podudarne") ElseIf ds = 0 Then MsgBox ("Rjesenje je nemoguce - prave su paralelne") Else x = dx / ds y = dy / ds MsgBox ("x= " & x & Chr$(13) & "y= " & y) End If End Sub

Page 38: Programiranje Skripta 2012.05

38  

Образложење Да се постигне једноставније и брже тестирање програма, улазни подаци a1,b1, c1,a2,b2 и c2 су задани у самом програму. У ретку

If ds = 0 And dx = 0 Then тестира се израз

ds = 0 And dx = 0. То је логички израз настао примјеном операције логичког множења (коњукције) два израза поређења. Прво се изводе операције поређења - испитује се истинитост наведених једнакости. Као резултат добијају се логичке вриједности (TRUE или FALSE). На крају се над добијеним вриједностима изводи коњукција (And). Резултат је логичка вриједност. Уколико је она једнака истинита тј. ако јој је вриједност једнака TRUE наведени услов је испуњен и изводи се њему придружени блок програма. У противном испитује се сљедећи услов

ds = 0. То значи да се испитује да није случајно само називник једнак нули кад већ нису и бројник и називник истовремено једнаки нули. Ако је једнакост остварена услов је испуњен и изводи се придружени блок програма. Иначе (ELSE), тј. када ни један од наведених услова није испуњен, знак је да се нису појавили специјални случајеви па тражено рјешење постоји. Рачунају се координате пресјека и издаје информација о њиховим вриједностима■ У оквиру једне структуре са гранањем може да се смјести нова структура са гранањем. Каже се да се једна у другу угнијездила. Тај процес може да се настави све дубље и дубље, до произвољног броја нивоа. Користећи ту могућност могу да се добију прегледнији и разумљивији програми. Предњи задатак би могао да се програмира на сљедећи начин.

... If ds = 0 Then

If dx = 0 Then MsgBox ("Rjesenje je neodredjeno - prave su " & _ "podudarne ")

Else MsgBox ("Rjesenje je nemoguce - prave su paralelne")

End If Else x = dx / ds y = dy / ds MsgBox ("x= " & x & Chr$(13) & "y= " & y)

Page 39: Programiranje Skripta 2012.05

39  

End If ...

У првом блоку If ... End If структуре смјештена је нова If ... End If структура. Нацртајте еквивалентан дијаграм тока. У неком од блокова ове друге може се угнијездити сљедећа и тако произвољан број пута. У предњем примјеру уведене су двије нове технике. Једна јее примјењена у првој MsgBox() команди. Односи се на протезање команде на два ретка програма. То се једноставно постиже тако што се на крај појединог ретка уписује доња цртица ( _ ). То је знак да се команда наставља у сљедећем ретку. Али, постоји изузетак – преламање се не може изводити унутар знаковног низа, тј. податка типа String, јер знак _ може да се појави у знаковном низу, равноправно другим знаковима. У таквом случају рјешење је да се знаковни податак разбије на два податка на мјесту погодном за преламање. Након обраде структура са гранањем студент треба да је способан да састави програм за рјешавање квадратне једначине према алгоритму разрађеном раније (страна 27 ). Програмирање структуре са гранањем са Select Case командом За програмирање структура са гранањем на располагању је алтернативно Select Case ... End Select рјешење. Оно се не може примијенити у свим ситуацијама гранања, већ само у оним гранањима у којима се више пута испитује вриједност једне те исте варијабле или израза. Када је таква ситуација у питању Select Case ... End Select може дати прегледнији програм. Правила за примјену ове структуре објаснићемо на конкретном примјеру. Примјер: Саставити програм за израчунавање вриједности функције задане графом који је приказан на сљедећој слици.

Page 40: Programiranje Skripta 2012.05

40  

У овом примјеру тестира се вриједност варијабле x. Умјесто x може да стоји било који израз. Израчунала би се вриједност тог израза и поредила са вриједностима наведеним уз поједине Case клаузуле. Када се вриједности подударе извршава се блок придружен посматраној Case клаузули. Наш примјер би се превео на сљедећи начин: У случају да је x < 0 тада је y = 1, у случају да је x из интервала 0 до 1 тада се y израчунава по формули y = -x +1, а у свим осталим случајевима је y = 0. Из примјера се види да је могуће користити знакове неједнакости, али се не види, а треба знати, да спрезање знакова неједнакости, попут > 0 < 1 није могуће. За навођења интервала на располагању је To клаузула, као у случају друге Case клаузуле у нашем примјеру. Треба бити опорезан јер су граничне вриједности укључене у тако задани интервал. Уз сваку Case клаузулу могуће је навести више вриједности или израза, само се међусе требају раздвојити зарезом. Више примјера приказује сљедећи програм.

1

1

y

x

Dim x As Single Dim y As Single x = InputBox("") Select Case x Case Is < 0 y = 1 Case 0 To 1 y = -x + 1 Case Else y = 0 End Select MsgBox (y)

Page 41: Programiranje Skripta 2012.05

41  

Безусловни скок (GO TO)

1

1

y

x

‐1

‐2 ‐1

Select Case x Case -1, -2, 0 To 1 y = 1 Case Is < -2 y = 0 Case -2 To -1 y = -1 Case -1 To 0 y = x + 1 Case Else y = x End Select 

Page 42: Programiranje Skripta 2012.05

42  

ЦИКЛИЧКЕ АЛГОРИТАМСКЕ СТРУКТУРЕ Код ове врсте алгоритама постоји дио програма који се понавља више пута. Дио који се понављају назива се циклус или петља. Код циклуса мора да постоји неки услов при којем се понављање прекида. Према типу тог услова разликују се:

1. Цилуси са бројачем и 2. Циклуси са излазним критеријумом.

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

For i = n1 To n2 [Step n3] Тијело циклуса

Next [i]

Циклус са бројачем смјешта се између наредби For и Next. У првој линији подаци уз For клаузулу представљају информације о бројачу и то:

i - име варијабле, цјелобројног типа, која игра улогу бројачa, n1 – почетна вриједност бројача, n2 – крајња вриједност бројача и n3 – корак бројача.

На мјестима n1, n2 и n3 могу да стоје цјелобројни подаци или варијабле или изрази који дају цјелобројну вриједност. Корак бројача може да се изостави. У том случају подразумијева се корак од 1. Корак може бити и негативан. Посљедња клаузула Next служи само да постави доњу границу циклуса. Име бројача не мора да се наведе, а могућност да се наведе остављена је с циљем лакшег праћења програма. У преводу Next i значи „узми сљедећу вриједност бројача и понови циклус“. При сваком уласку у циклус провјерава се да ли је бројач достигао коначну вриједност и уколико се то потврди престаје се са понављањем циклуса и наствља са командом која слиједи непосредно иза клаузуле Next. Програмска конструкција циклуса са бројачем може да се прикаже сљедећим дијаграмом тока.

Page 43: Programiranje Skripta 2012.05

43  

Примјер: Саставити програм за израчунавање збира првих n природних бројева. Private Sub Form_Load() Dim i As Integer, n As Integer, Zbir As Integer n = InputBox("n?") Zbir = 0 For i = 1 To n Zbir = Zbir + i Next i MsgBox ("Zbir prvih " & n & " prirodnih brojeva je: " & _ Zbir) End Sub Примјер: Саставити програм за израчунавање факторијела броја n. (Ријешити као домаћи задатак).

i n2

Тијелоциклуса 

ДА

НЕ

Дијаграмтокациклусасабројачем

i i n3 

i n1 Постављањебројачанапочетнувриједност

Испитивањедалијебројачпрекорачиоконачнувриједност

Извршавањенизанаредбикојесеналазеуциклусу

Постављањебројачанасљедећувриједност

Враћањенапочетакциклуса

Престанакпонављањаипрелазакнасљедећунаредбу

Page 44: Programiranje Skripta 2012.05

44  

Примјер: Саставити програм који задану ријеч исписује унатраг.

Private Sub Form_Load() L% = Len(Rijec) Kontra_Rijec$ = "" For i% = L To 1 Step -1 Kontra_Rijec = Kontra_Rijec & Mid(Rijec, i, 1) Next i MsgBox (Kontra_Rijec) End Sub

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

Do

Тијело циклуса Loop Until Услов

У преводу ова програмска конструкција би гласила: „Изводи тијело циклуса (низ наредби) све док се не испуни задани услов“. Овој структури одговара сљедећи дијаграм тока:

Page 45: Programiranje Skripta 2012.05

45  

Постоји варијанти ове програмске конструкције у којој се циклус понавља док год је испуњен дати услов. Та варијанта има исти облик, само умјесто клаузуле Until користи клаузулу While. Њена програмска конструкција и еквивалентан дијаграм тока приказани су на сљедећој слици.

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

Услов 

Тијелоциклуса 

НЕДА

Do

Тијело циклуса Loop While Услов  

Услов

Тијелоциклуса 

ДАНЕ

Page 46: Programiranje Skripta 2012.05

46  

Do Until Услов

Тијело циклуса Loop

односно:

Do While Услов

Тијело циклуса Loop

Примјер: Саставити програм који исписује слово по слово унесене ријечи све док се не појави слово "s".

Private Sub Form_Load() Rec$ = InputBox("") i% = 1 Do Slovo$ = Mid(Rec$, i, 1) Debug.Print Slovo i = i + 1 Loop Until Slovo = "s" End Sub

Шта би се десило да се тражено слово уопште не налази у заданој ријечи? Боља варијанта овог програма морала би владати и том ситуацијом. То се може ријешити на више начина, а једно рјешење може бити да се нађе број слова у ријечи па да се прати до које позиције се при претраживању стигло, тј. да се испитује да ли се стигло до задњег слова. Рјешење је дато на сљедећем листингу. Додана је комнда L = Len(Rec)и промијењен је услов изласка из циклуса. Циклус се сада напушта било да се пронађе слово 's' (Or) било да се стигне до краја ријечи тј. када једнаскост i - 1 = L постане тачна.

Private Sub Form_Load() Rec$ = InputBox("") L = Len(Rec) i% = 1 Do

Page 47: Programiranje Skripta 2012.05

47  

Slovo$ = Mid(Rec$, i, 1) Debug.Print Slovo i = i + 1 Loop Until Slovo = "s" Or i - 1 = L End Sub

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

0 помоћу Њутновог метода тангенте. Овај метод служи се тангентом на криву која представља график задане функције

да од неког предпостављеног почетног рјешења , дође до тачног рјешења. У почетној тачки , повлачи се тангента на криву и тражи њена пресјечна тачка са осом. Тај пресјек је лако наћи јер је једначина тангенте линеарна:

па је за њен пресјек са осом потребно ријешити систем:

0

који се очигледно своди на: 0

и рјешење добија у једном потезу

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

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

Page 48: Programiranje Skripta 2012.05

48  

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

| | 10

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

Private Sub Form_Load() Dim x As Double, y As Double, y_pr As Double x = InputBox("Unesite pocetno rjesenje:") Do y = 2 * x * x - 3 * x - 5 y_pr = 4 * x - 3 x = x - y / y_pr Loop Until Abs(y) < 0.000001 MsgBox (x) End Sub

y

xx0x1x2

y0 f x0

y f x

y y0 f’ x0 x‐x0

Page 49: Programiranje Skripta 2012.05

49  

Програм је урађен за функцију: 2 3 5 (први ред иза клаузуле Do). У сљедећем реду дефинисан је њен први извод: 4 3. То је квадратна функција. Њени коријени су 2.5 и -1. Програм ће дати само једно рјешење, оно које је ближе почетном рјешењу. Добијање свих рјешења захтијева примјену такозване методе изолације коријена. То је математичка метода за откривање броја могућих рјешења и утврђивање интервала у којим се поједина рјешења налазе. Избором почетног рјешења из појединог интервала добија се дато рјешење. Примијетимо и то да се у услову за излазак из циклуса провјерава претпосљедња вриједност функције y, али то не представља проблем јер је посљедње рјешење још прецизније. Излазак из цикличких структура Стандардни начин завршавања циклуса са бројачем настаје када бројач достигне коначну вриједност, а циклуса са излазним критеријумом када се испуни задани услов. Поред ових стандардних начина може се програмирати напуштање циклуса тј. излазак из циклуса и под неким додатним условима. То се постиже помоћу команди:

- Exit For, за излазак из циклуса са бројачем( For циклуса) и - Exit Do, за излазак из циклуса са излазним критеријумом ( Do циклуса).

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

Private Sub Form_Load() Rec$ = InputBox("") L% = Len(Rec$) For i = 1 To L Slovo$ = Mid(Rec$, i, 1) If Slovo = "s" Then Exit For Debug.Print Slovo Next i End Sub

Page 50: Programiranje Skripta 2012.05

50  

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

Page 51: Programiranje Skripta 2012.05

51  

ПРОМЈЕНЉИВЕ СА ИНДЕКСИМА – НИЗОВИ

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

1, 3, 5, -7, 10 додијелимо име А, онда је

А0 = 1, А1 = 3, А3 = -7, итд. Низ представља уређени скуп ( n-торку података). У математици се углавном ради о низовима бројева, а у програмирању могу бити у питању и знаковни и логички подаци. У математици између елемената низа углавном постоји нека унутрашња веза, која је често изражена помоћу израза за i-ти члан низа, нпр.

а 11

, 1,⋯ ,

преко везе између елемената 2 ∗ , 1, 1,⋯ ,

или на неки други начин.

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

Низови могу бити једнодимензионални, дводимензионални и вишедимензионални. Највише се користе једнодимензионални и дводимензионални низови. Једнодимензионални низови називају се вектори, а дводимензионални матрице.

Нпр.

X=[1 5 8 13] – је цјелобројни вектор, а

Y ′ ′ ′ ′ ′ ′′ ′ ′ ′ ′ ′

- знаковна матрица (попуните празно мјесто испред

посљедњег B.

За приступ елеменатима елементима дводимензионалног низа потребна су два индекса, први одређује број врсте, а други број колоне у матрици. У VisualBASIC програму индекси се наводе у загради и међусобно одвајају зарезом. Стандардно, почетна вриједност индекса је 0.

Page 52: Programiranje Skripta 2012.05

52  

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

X(1) + 2* X(2)^2+3 или

Y(0,0)<=Y(1,2) Када би у радило о низовима из претходног примјера онда би резултат првог израза био 131, а другог 'TRUE’. Умјесто експлицитног навођења индекса могу се користити и аритметички изрази. Нпр.

i = ... j = ... Matrica_A(i, j+1) = 50 ...

Не треба посебно наглашавати да вриједности ових израза морају бити ваљане, што значи у интервалу између минималног и максималног индекса датог низа. Још једна важна разлика између низова и обичних промјенљивих је та што се низовима у меморији рачунара мора унапријед резервисати одговарајућа величина меморијског простора. То се чини да би оперативни систем могао обезбиједити компактан простор за цио низ. Рад са тако смјештеним низом је ефикаснији него кад би му елементи били расути широм меморије. Количина меморије потребна за меморисање низа зависи од типа и броја елемената низа. Резервисање меморије за смјештање типа назива се димензионисањем па jе и команда DIM намјењена за ту сврху скраћеница те енглеске ријечи ‘dimension’. У најпростијем облику ова команда има сљедећи облик

DIM ime_niza(m,n) АS tip

ime_niza произвољно корисничко име промјенљиве са индексом (низа), m,n су максималне вриједности индекса низа, што значи да су

димензије низа (m+1)х(n+1), а на мјесту tip наводи се којег су типа елеменати низа.

Page 53: Programiranje Skripta 2012.05

53  

Нпр. команда

DIM MAT(3,5) As Single

димензионише дводимензионални низ са именом MAT, тако да има 4 врсте и 6 колона, и декларише његове елементе типа Single тј. бројчане вриједности обичне прецизности. Пошто је за смјештање података типа Single потребно утрошити 4 бајта мемотије, укупан простор који ће се резервисати за овај низ (MAT) износи 96 бајта. У истој команди могуће је димензионисати и декларисати већи број низова, а и обичних промјенљивих. Нпр. DIM i AS Integer, Mat_A(2,2) AS Double, Vektor_Z(2) AS Double

У овом примјеру декларисан је промјенљива i типа Integer, дводимензионални низ Mat_A типа Double, са 3 врсте и 3 колоне, и једнодимензионални низ Vektor_Z, са три елемента типа Double. За име типа и имплицитну декларацију типа вриједе иста правила као и у случају обичних промијенљивих. Умјесто ријечи DIM могу да се користе команде PRIVATE, PUBLIC, PROTECT, али о том по том. Низови на улазу и излазу: InputBox()команда је практична за унос једне или неколико вриједности. Када су у питању низови требало би много таквих команди да се унесе један по један елемент низа, што би било непрактично и заморно. У пракси се то, међутим, не дешава јер се веће количине података не уносе ручно него на други начин - преузимају из фајлова, из неког другог програма, из базе података или директно из процеса као мјерне величине итд. За потребе учења језика и провјежбавања примјера уграђен је један механизам за једноставније уношење произвољног низа података. То је функција

ARRAY()

Page 54: Programiranje Skripta 2012.05

54  

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

duzine = ARRAY(107,55.5,213,42.5)

Уведена варијабла, у овом примјеру duzine, постаје низ. До његових елемената се приступа преко индекса. Тако, у овом примјеру, duzine(2) износи 213. (Варијабли duzine додјељује се такозвани тип Variant. То је специјано VisualBasic рјешење о којем ћемо говорити касније. Оно може да замијени сваки тип па чак и низ података одређеног типа, али троши више меморије него стандардни типови па га у коначним програмским рјешењима треба избјегавати). Функција ARRAY() представља начин да се у самом програму унесе низ података у једном потезу, а не средство за улаз података од стране корисника. Као такво, то је рјешење добро за вјежбу и тестирање програма, а не за практичну примјену. Примјер: Саставити програм који рачуна укупну површину просторија правоуглог облика чије су дужине и ширине дате помоћу функције ARRAY().

Private Sub Form_Load() Dim povrsina As Double duzina = Array(3.5, 12.0, 11.7, 1.3, 5.8) sirina = Array(2.4, 5.9, 7.3, 12.1, 5.5) povrsina = 0 For i = 0 To 4 povrsina = povrsina + duzina(i) * sirina(i) Next i MsgBox (povrsina) End Sub

Примјер: Саставити програм за множење сљедећих матрица

1 0 01 2 01 0 3

0 12 34 5

Напомена.

Page 55: Programiranje Skripta 2012.05

55  

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

, 1,

, 1, 0,⋯ ,2 Захваљујући овој једноставној вези могуће је елементима матрице придружити вриједности помоћу циклуса.

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

⋮⋯

⋯ ⋯

⋮∙

⋯⋮

⋮ј

⋮ ⋮⋯

⋮⋯ ⋯

Алгоритам: Елемент матрице ∙ на пресјеку i–те врсте и k–те колоне добија се тако што се множе, редом како слиједе, парови елементата из i–те врсте матрице A и k–те колоне матрице B и добијени умношци сабирају.

, 0,⋯ , ; 0,⋯ ,

Private Sub Form_Load() Dim A(2, 2) As Double, B(2, 1) As Double

Page 56: Programiranje Skripta 2012.05

56  

Dim C(2, 1) As Double Dim i As Integer, j As Integer For i = 0 To 2 A(i, 0) = 1 A(i, i) = i + 1 Next i For i = 0 To 2 For j = 0 To 1 B(i, j) = 2 * i + j Next j Next i For i = 0 To 2 For k = 0 To 1 C(i, k) = 0 For j = 0 To 2 C(i, k) = C(i, k) + A(i, j) * B(j, k) Next j Next k Next i MsgBox (C(0, 0) & " " & C(0, 1) & Chr(13) & C(1, 0) _ & " " & C(1, 1) & Chr(13) & C(2, 0) & " " & C(2, 1)) End Sub

Суштина прогрма представља дио исписан подебљаним текстом. Сав рачун рјешава један једини израз, а суштина је у циклусима. Од три угњеждена циклуса, два одговарају врстама и колонама матрице C, а трећи, најдубље смјештен, имплементира предњи алгоритам за рачунање појединог елемента матрице C. Прије уласка у тај циклус мемориски простор у којем се чува вриједност текућег елемена матрице C се иницијализира (очисти, нулира). Током циклуса се садржај тог простор акумулира додавајући му стално износ производа новог пара елеманата i–те врсте матрице A и k–те колоне матрице B, све док се не исцрпи и посљедњи пар, пар са унутрашњим индексом j=n. На овом примјеру се јасно види снага цикличких структура када су им бројачи спрегнути са индексима низова.

Примјер:

Page 57: Programiranje Skripta 2012.05

57  

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

Private Sub Form_Load() n% = 5 Dim a(5) As Single a(5) = 3: a(4) = 2: a(3) = 1:

a(2) = -1: a(1) = -2: a(0) = -3 x! = InputBox("x?") P! = 0 For i = 5 To 0 Step -1 P = P * x + a(i) Next i MsgBox ("P(" & x & ") = " & P) End Sub

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

Private Sub Form_Load() Dim n(10) As Integer, Lista As String ........ 5 For i% = 0 To 10 ....... 10 n(i) = Rnd() * 100 ....... 15 Lista = Lista & n(i) & ", " ....... 20 Next i ....... 25 Lista = Lista & vbCr ....... 30 For i = 0 To 9 ....... 35 For j% = i + 1 To 10 ....... 40 If n(i) > n(j) Then ....... 45 pom% = n(i) ....... 50 n(i) = n(j) ....... 55 n(j) = pom ....... 60

Page 58: Programiranje Skripta 2012.05

58  

End If ....... 65 Next j ....... 70 Next i ....... 75 For i = 0 To 10 ....... 80 Lista = Lista & n(i) & ", " ....... 85 Next i ....... 90 MsgBox (Lista) ....... 95 End Sub

Образложење: У циклусу датом у линијама 10 до 25 генерише се 11 цијелих бројева, елемената низа. Функција Rnd() у линији 15 је генератор случајних бројева. Она генерише реалне бројеве обичне прецизности (Single) у интервалу од 0 до 1. Пошто се у истој команди множење генерисаних вриједности са 100 добијају се реални бројеви у интервалу од нула до 100. Пошто се те вриједности додјељују елементима низа n, који је проглашен цјелобројним низом (Integer) Visual Basic изводи конверзију из типа Single у тип Integer заокруживањем добијених вриједности. У линији 20 формира се знаковна варијабла тако што јој се, при сваком проласку кроз циклус, придодаје нови елемент низа n и још један зарез за раздвајање елемната. У линији 30 додаје се знак за прелазак у нови ред у којег ће се слагати елементи сортираног низа, када се сортирање заврши. Суштина алгоритма је у линијама 35 до 75. Узима се један по један број из низа n(i) и пореди са свим осталим бројевима који слиједе послије њега n(j). У случају да се деси да је неки од бројева који слиједе n(j) мањи од тренутно посматраног n(i) знак је да он мора доћи напријед, па се та два броја једноставно замијене и поступак наставља. Приликом замјене, мора се увести помоћна варијабла која привремено чува један од елемената да се његов садржај при замјени не изгуби. Када се сортирање заврши, знаковној варијабли Lista додају се елементи сортираног низа n (линије 80 до 90). Елементи се додају у нови ред на који се прешло у линији 30. На крају се садржај варијабле Lista исписује помоћу подпрограма MsgBox()(линија 95). Добија се сљедећи садржај

Page 59: Programiranje Skripta 2012.05

59