Увод+у+програмирање

= =

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

====** //__1. Поставка проблема__// ** - Неко захтева да му се реши проблем (не мора да зна да програмира, али није лоше да има одређену рачунарску писменост) - он је наручилац. Неко треба да напише програм који решава постављени проблем (не мора бити стручњак за област проблема, али није лоше да макар делимично познаје термине) - он је извршилац. Да би се посао коректно одрадио наручилац мора да дефинише свој проблем на језику који је подједнако разумљив и њему и извршиоцу. Веома је важно да формулација проблема буде потпуна и прецизна јер извршилац мора да зна шта се од њега тражи да би то и урадио. Није добро да се проблемски захтеви касније допуњавају или мењају јер то нарушава интегритет урађеног дела програма и доводи до великог кашњења у реализацији. ====

** //__2. Анализа__// ** - На основу захтева наручиоца дефинишу се улазни и излазни подаци, формално се описује проблем и ствара се математички модел решења.
====** //__3. Избор или израда алгоритма__// ** - На основу анализе проблема сада се дефинишу кораци који прецизно, једнозначно описује решавање проблема и дефинишу се формуле које ће се користити у програму, форме извештаја и друго. ==== ====** //__4. Пројектовање опште структуре програма__// ** - На основу врсте и карактеристика алгоритма извршилац треба да изабере програмски језик којим ће оптимално решити постављени проблем и помоћну програмску подршку у зависности од специфичности примене програмског језика. ====

** //__5. Кодирање__// ** - Запис алгоритма на програмском језику је најједноставнији део процеса решавања проблема. Од извршиоца се захтева да познаје методологију програмског језика и алгоритам.
====** //__6. Тестирање__// ** - Када је програм написан, пре него се испоручи, мора се извршити провера исправности и отклонити, евентуалне, грешке. Што више провера то је поузданост програма већа, при томе, тест примери треба да буду што разноврснији како би се провером обухватило што више случајева и избегло да се наручиоцу испоручи неисправан програм. Грешке се могу исправити, али се утисал о личности извршиоца не може поправити лако. ====
 * //__7. Анализа резултата извршавања програма __//** - Резултати који су добијени приликом тестирања треба да се поклапају са резултатаима у природном процесу (или да буду у границама дозвољеног одступања). У овој фази открива се већина грешака и отклони ако је анализа коректна.
 * //__8. Публиковање и испорука програма__//** - Тестирањем доказан програм се ставља на тржиште (ако је опште прихватљив и користан, тј. ако није уско специјализован) и испоручује наручиоцу.
 * //__9. Одржавање и модернизација програма__//** - Испоруком програма не завршава се процес решавања проблема. Наручилац или други корисници морају да се обуче. У току примене програма корисници морају да се консултују о раду програма, а програм може и мора да се ажурира, осавремењује како би увек био ефикасан.

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

__Врсте алгоритма:__
Алгоритам произвољне сложености може бити представљен комбинацијом три базне структуре: а) разгранати алгоритам са 1 граном б) разгранати алгоритам са 2 гране в) разгранати алгоритам са више грана а) FOR-циклус б) Циклус са предусловом (WHILE-циклус) в) Циклус са постусловом (REPEAT-циклус)
 * 1. линијске** - Линијским се називају алгоритми код којих се наредбе (или инструкције) извршавају секвенцијално једна за другом.
 * 2. разгранате** - Разграниатим се називају алгоритми код којих се у зависности од вредности логичког услова извршавање наставља једном од две гране.
 * 3. цикличке** - Цикличном се називају алгоритми који садрже низ инструкција (тело циклуса) које се могу понављати више пута.

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

4.Програмски језици
Алгоритам представљен у виду блок-шеме или текстуално није погодан за извршавање коришћењем процесора било ког уређаја (рачунара, робота итд.), јер процесор може "разумети" само апсолутно формалан запис, не толеришући на најмање непрецизности. Због тога се развијају посебни језици који омогућавају запис алгоритма коришћењем ограниченог скупа конструкција, које се не могу вишезначно и произвољно тумачити. Такви језици се називају програмски језици. Програмски језик је скуп средстава и правила представљања алгоритма у облику погодном за извршавање на рачунару Програм је запис (реализација) алгоритма на језику програмирања. Разликују се три нивоа програмирања, и то на: 1. машинском језику 2. Асемблеру 3. језицима високог нивоа

5.Класификација програмских језика
__Према степену зависности од рачунара програмски језици се деле на:__
 * машински зависне (на пр. машински језик, Assembler ) и
 * машински независне језике (на пр. Fortran, Pascal, Ada, Basic, C, C++, C#, Java).

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

__Према области примене, програмски језици се деле на:__
 * специјализоване (на пр. Fortran, Cobol, Refal, Lisp, Modula) и
 * универзалне (на пр.Basic, Pascal, C, C++, C#, Java).

__Према начину решавања проблема, деле се на:__
 * процедуралне (на пр. Fortran, Basic, Ada, Pascal, C, C++, C#, Java) и
 * непроцедуралне (на пр.Prolog, Lisp).