Docsity
Docsity

Prepare for your exams
Prepare for your exams

Study with the several resources on Docsity


Earn points to download
Earn points to download

Earn points by helping other students or get them with a premium plan


Guidelines and tips
Guidelines and tips

Principles of Programming in C++, Cheat Sheet of Information Technology

An in-depth exploration of the fundamental principles of programming, with a focus on the c++ programming language. It delves into the challenges and nuances of programming, highlighting the importance of problem-solving strategies, algorithm design, and the translation of human-readable code into machine-executable instructions. Topics such as the history of software development, the differences between direct and inverse problems, the importance of reviewing solutions, and the characteristic structures found in algorithms. It also discusses the role of compilers in transforming high-level programming languages into machine-readable code. This comprehensive guide aims to equip readers with a solid understanding of the core concepts and best practices in programming, making it a valuable resource for students, developers, and anyone interested in the field of computer science.

Typology: Cheat Sheet

2021/2022

Uploaded on 12/27/2023

denis-kukuljac
denis-kukuljac 🇺🇸

2 documents

1 / 17

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
Željko Jurić: Principi programiranja /kroz programski jezik C++/
1. OSNOVNA STRUKTURA C++ PROGRAMA
Uobičajeno je da svaka priča o programskom jeziku C++ počinje opisom kratkog programa koji
ispisuje pozdravnu poruku na ekranu. Stoga će naš prvi program izgledati ovako:
// Ovaj program ispisuje pozdravnu poruku
#include <iostream>
using namespace std;
int main()
{
cout << "Zdravo narode!";
return 0;
}
U poglavlju 1.5. upoznali smo se sa aplikativnim softverom, koji je, kao što već znamo, namijenjen
za rješavanje stvarnih problema sa kojima se susreće korisnik. Stoga je prvi korak koji će poduzeti
korisnik računara, kada se susretne sa nekim praktičnim problemom, potraga za aplikativnim softverom
koji rješava taj problem. Međutim, ne može se očekivati da postoji napisan aplikativni softver za svaki
problem sa kojim se korisnik može susresti. Konačno, ni aplikativni softver ne postoji od postanka
svijeta, nego je i taj softver morao neko napisati. Zbog toga je neophodno upoznati se, barem u
elementarnim okvirima, sa metodologijom rješavanja problema uz pomoć računara, što je osnovni
preduvjet za pisanje aplikativnog softvera. O pisanju programa detaljno ćemo govoriti u trećem dijelu
ovog udžbenika.
Danas je situacija za korisnika računara mnogo povoljnija nego prije dvadesetak godina. Autor ovog
udžbenika se sjeća da je u njegovim srednjoškolskim danima (prije otprilike dvadesetak godina)
aplikativnog softvera bilo veoma malo, tako da je korisnik za većinu problema sa kojima se susretao
morao da piše programe sam. Drugim riječima, gotovo svaki korisnik računara morao je da zna
programiranje (odnosno, postupak pisanja programa za računar). Stoga je u to vrijeme bilo malo
korisnika računara, pa su računari doživljavani kao neke misteriozne sprave sa kojima znaju rukovati
samo vrhunski naučnici. Danas se situacija drastično promijenila, jer za rješavanje ogromnog broja
stvarnih problema već postoje gotovi vrhunski programi koje su napisali vrhunski stručnjaci, i koji su
krajnje jednostavni za korištenje. Stoga, većina ljudi koji danas koriste računar ne pišu svoje vlastite
programe. Umjesto toga, oni koriste gotove programe koji se mogu kupiti na tržištu (obično pohranjeni
na diskovima), ili programe koje su napisali profesionalni programeri u njihovoj radnoj organizaciji.
Iz izloženog moglo bi se pogrešno zaključiti da danas poznavanje programiranja nije potrebno
nikome osim manjem broju računarskih specijalista. Taj zaključak je pogrešan zbog nekoliko razloga.
Prvo, korisnici koji poznaju programiranje mnogo će bolje poznavati principe rada računara i šta se od
računara može, a šta ne može očekivati. Stoga će takvi korisnici mnogo efikasnije koristiti računar od
korisnika koji ne poznaju programiranje i neće od njega očekivati nemoguće stvari. Drugo, ljudi koji
naručuju izradu softvera od profesionalnih programera često postavljaju sasvim nerealistična očekivanja
od softvera iz prostog razloga što ne znaju šta se može, a šta ne može izvesti. Ovi problemi bi se veoma
smanjili kada bi naručioci softvera (ovdje prvenstveno mislimo na poslovne ljude, rukovodioce
preduzeća itd.) poznavali barem elementarne osnove programiranja, što bi omogućilo postavljanje
realističnijih zahtjeva, kao i saradnju naručioca programa sa programerima u toku izrade projekta, što bi
dovelo do krajnjeg programa koji je mnogo prilagođeniji potrebama naručioca. Treće, svaki korisnik će
se prije ili kasnije susresti sa nekim problemom za koji ne postoji adekvatan aplikativni softver, a koji je
dovoljno jednostavan da korisnik može sam sastaviti program za rješavanje tog problema. Konačno,
danas je programiranje mnogo lakše nego što je bilo nekada. Danas postoje specijalizirani programski
jezici koji su posebno prilagođeni rješavanju neke specifične klase problema, ali koji su zbog toga
mnogo jednostavniji za razumijevanje i upotrebu od programskih jezika opće namjene.
I – 1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Partial preview of the text

Download Principles of Programming in C++ and more Cheat Sheet Information Technology in PDF only on Docsity!

1. OSNOVNA STRUKTURA C++ PROGRAMA

Uobičajeno je da svaka priča o programskom jeziku C++ počinje opisom kratkog programa koji ispisuje pozdravnu poruku na ekranu. Stoga će naš prvi program izgledati ovako: // Ovaj program ispisuje pozdravnu poruku #include using namespace std; int main() { cout << "Zdravo narode!"; return 0; } U poglavlju 1.5. upoznali smo se sa aplikativnim softverom , koji je, kao što već znamo, namijenjen za rješavanje stvarnih problema sa kojima se susreće korisnik. Stoga je prvi korak koji će poduzeti korisnik računara, kada se susretne sa nekim praktičnim problemom, potraga za aplikativnim softverom koji rješava taj problem. Međutim, ne može se očekivati da postoji napisan aplikativni softver za svaki problem sa kojim se korisnik može susresti. Konačno, ni aplikativni softver ne postoji od postanka svijeta, nego je i taj softver morao neko napisati. Zbog toga je neophodno upoznati se, barem u elementarnim okvirima, sa metodologijom rješavanja problema uz pomoć računara, što je osnovni preduvjet za pisanje aplikativnog softvera. O pisanju programa detaljno ćemo govoriti u trećem dijelu ovog udžbenika. Danas je situacija za korisnika računara mnogo povoljnija nego prije dvadesetak godina. Autor ovog udžbenika se sjeća da je u njegovim srednjoškolskim danima (prije otprilike dvadesetak godina) aplikativnog softvera bilo veoma malo, tako da je korisnik za većinu problema sa kojima se susretao morao da piše programe sam. Drugim riječima, gotovo svaki korisnik računara morao je da zna programiranje (odnosno, postupak pisanja programa za računar). Stoga je u to vrijeme bilo malo korisnika računara, pa su računari doživljavani kao neke misteriozne sprave sa kojima znaju rukovati samo vrhunski naučnici. Danas se situacija drastično promijenila, jer za rješavanje ogromnog broja stvarnih problema već postoje gotovi vrhunski programi koje su napisali vrhunski stručnjaci, i koji su krajnje jednostavni za korištenje. Stoga, većina ljudi koji danas koriste računar ne pišu svoje vlastite programe. Umjesto toga, oni koriste gotove programe koji se mogu kupiti na tržištu (obično pohranjeni na diskovima), ili programe koje su napisali profesionalni programeri u njihovoj radnoj organizaciji. Iz izloženog moglo bi se pogrešno zaključiti da danas poznavanje programiranja nije potrebno nikome osim manjem broju računarskih specijalista. Taj zaključak je pogrešan zbog nekoliko razloga. Prvo, korisnici koji poznaju programiranje mnogo će bolje poznavati principe rada računara i šta se od računara može, a šta ne može očekivati. Stoga će takvi korisnici mnogo efikasnije koristiti računar od korisnika koji ne poznaju programiranje i neće od njega očekivati nemoguće stvari. Drugo, ljudi koji naručuju izradu softvera od profesionalnih programera često postavljaju sasvim nerealistična očekivanja od softvera iz prostog razloga što ne znaju šta se može, a šta ne može izvesti. Ovi problemi bi se veoma smanjili kada bi naručioci softvera (ovdje prvenstveno mislimo na poslovne ljude, rukovodioce preduzeća itd.) poznavali barem elementarne osnove programiranja, što bi omogućilo postavljanje realističnijih zahtjeva, kao i saradnju naručioca programa sa programerima u toku izrade projekta, što bi dovelo do krajnjeg programa koji je mnogo prilagođeniji potrebama naručioca. Treće, svaki korisnik će se prije ili kasnije susresti sa nekim problemom za koji ne postoji adekvatan aplikativni softver, a koji je dovoljno jednostavan da korisnik može sam sastaviti program za rješavanje tog problema. Konačno, danas je programiranje mnogo lakše nego što je bilo nekada. Danas postoje specijalizirani programski jezici koji su posebno prilagođeni rješavanju neke specifične klase problema, ali koji su zbog toga mnogo jednostavniji za razumijevanje i upotrebu od programskih jezika opće namjene.

Postupak pisanja programa, sve dok se čovjek ne navikne na njega, nije jednostavan zadatak. Logika kojom radi računar gotovo da nema ništa zajedničko sa logikom ljudskog razmišljanja. Komunikacija između čovjeka i računara nije ni izdaleka tako prirodna kao komunikacija između ljudi. Ljudi često mogu da bez većih problema razumiju nepotpune i nedovoljno precizne informacije, i da djeluju u skladu sa njima. Međutim, računari uvijek izvršavaju samo ono što im je naređeno , ni manje ni više od toga. Računar nije sposoban da razmišlja i da zaključuje šta je korisnik htio da kaže. Često se kaže da je programiranje teško zbog činjenice da računar ne radi ono što mi želimo da on uradi , nego ono što smo mu rekli da treba da uradi. Naime, mnogi ljudi znaju tačno šta hoće, ali ne znaju kako da to precizno iskažu. Interesantno je da je nekim ljudima programiranje izuzetno jednostavan i logičan posao, dok s druge strane neki ljudi nikada ne uspijevaju da savladaju niti najosnovnije programerske tehnike. Jednostavno, ti ljudi imaju nedostatak sposobnosti preciznog razmišljanja i jasnog iskazivanja misli, kao što neki ljudi nemaju dara za slikarstvo ili muziku. Zbog toga se programiranje smatra jednom od disciplina za koje je neophodan određeni talenat. Razmotrimo na jednom primjeru činjenicu da računari, za razliku od ljudi, izvršavaju samo ono što je eksplicitno naređeno. Pretpostavimo da u nekom receptu za kuhanje čovjek na kraju recepta pročita da lonac u koji je prethodno stavio neophodne sastojke treba staviti na štednjak, i da se sa tom informacijom recept završava. Čovjek bi sigurno stavio lonac na grijaću ploču štednjaka , i uključio štednjak (preciznije, odgovarajuću ploču na štednjaku). Robot-kuhar koji bi radio po ponuđenom receptu stavio bi lonac negdje na štednjak (ne nužno na grijaću ploču) nakon čega bi se zaustavio, jer je došao do kraja recepta (programa). Zbog čega robot ne bi stavio lonac upravo na ploču i uključio ploču kada se to podrazumijeva? Odgovor je jednostavan: te činjenice ne pišu u receptu, a mašine ne mogu ništa da podrazumijevaju. Pretpostavimo dalje da je neki šaljivdžija u recept ubacio informaciju da u lonac treba ubaciti pola kilograma eksera. Svaki čovjek koji bi čitao ovakav recept sigurno bi ovu informaciju shvatio kao šalu (vjerovatno inspirisanu bosanskom narodnom pripovijetkom "klin-čorba"), i ignorirao bi primljenu informaciju. Robot-kuhar u ovakvoj naredbi ne bi primijetio ništa čudno i izvršio bi je bez pogovora. Upravo je zbog ove činjenice računare moguće programirati da rade destruktivne stvari. Računaru naredbe koje nalažu brisanje svih podataka sa hard diska ili upisivanje besmislenog sadržaja u Flash BIOS nisu ništa manje logične od naredbi kojima se traži računanje koliko je 2+2. Nažalost, ovu činjenicu obilato zloupotrebljavaju tvorci računarskih virusa. Posmatrano površno, pisanje programa se sastoji samo od zadavanja niza naredbi, koje posmatrane same za sebe obično nisu komplicirane, tako da programiranje može izgledati kao jednostavan posao. Jednom su prilikom pitali jednog čuvenog američkog pijanistu da li je teško svirati klavir. Njegov odgovor je glasio: "Ne, sasvim je jednostavno: sve što trebate uraditi je pritisnuti pravu tipku u pravo vrijeme.". Slično, programiranje zahtijeva da se "prava naredba upotrijebi na pravom mjestu". Međutim, upravo tu nastaje problem. Računari, suprotno onome što se obično misli, ne poznaju veoma veliki broj različitih naredbi. Naredbe tipa "riješi jednačinu" ili "nacrtaj slona na ekranu" računar, sam po sebi, ne poznaje. Računari poznaju isključivo mnogo primitivnije naredbe, pa je zahtjeve korisnika neophodno preformulirati koristeći isključivo takve naredbe. Postupak se može grubo uporediti sa pokušajem objašnjavanja šta je nuklearna elektrana petogodišnjem djetetu (koje posjeduje prilično ograničen rječnik, i nikakvo predznanje o toj materiji). Dalji problemi sa kojima se susreću ljudi koji pišu programe je neophodnost preciznog definiranja svih neophodnih koraka , kao i neophodnost vođenja računa o svim detaljima problema , što nije tako jednostavno (mada se, vremenom, čovjek navikne na takav način razmišljanja). Zbog toga je prije samog postupka pisanja programa potrebno temeljito razmotriti problem koji se rješava, uključujući sve njegove specifičnosti. Nakon toga je potrebno razraditi metodologiju rješavanja posmatranog problema, neovisno od toga da li će se problem rješavati na računaru ili ne. Tek kada je u detalje razrađena strategija rješavanja problema, pristupa se pisanju programa. Prilikom razvoja programa, najteža je upravo ova prva, pripremna faza, koju nazivamo i faza rješavanja problema. Druga faza, u kojoj se razrađena strategija rješavanja pretvara u konkretan program, naziva se faza implementacije , i ona je najčešće prilično rutinski posao uz pretpostavku da je strategija rješavanja problema obavljena dobro. Velika greška koju često prave početnici u programiranju je što pokušavaju da odmah pišu program , bez prethodne razrade problema. Na takav način programe mogu pisati samo iskusni programeri, koji su

Problemi za dokazivanje mogu biti posebno teški za rješavanje, pogotovo ukoliko ne postoji jasna ideja koja ukazuje na postupak njihovog rješavanja. Na primjer, problem "Ispitati da li se na svakoj geografskoj karti regije mogu obojiti pomoću samo četiri različite boje tako da ne postoje dvije susjedne regije koje su obojene istom bojom." postavljen je prije više od 200 godina, a uspješno je riješen (potvrdnim odgovorom) tek prije nekoliko godina. Mnogi filozofi, poput Descartesa , Leibniza i drugih, smatrali su da mora postojati neka univerzalna metodologija rješavanja problema, koja bi se mogla mehanički primjenjivati na sve tipove problema. Nažalost, polovinom prošlog vijeka, zahvaljujući pretežno radovima Alana Turinga , otkriveno je da ovakva univerzalna metodologija ne postoji. Međutim, u pokušaju da pronađu ovu univerzalnu metodologiju, mnogi naučnici su došli do važnih djelimičnih rješenja, od kojih su mnoga korisna upravo u oblasti informatike i računarske tehnike. Veoma korisne upute za pristup metodologiji rješavanja problema dao je poznati mađarski matematičar i vrhunski metodičar Georg Pólya. Po njegovim uputama, globalna strategija rješavanja problema odvija se u četiri etape: razumijevanje problema , razrada plana akcija , realizacija akcija i osvrt na rješenje. U nastavku ćemo detaljnije razmotriti ove četiri etape. U etapi razumijevanja problema , na prvom mjestu je potrebno jasno definirati problem , tj. utvrditi šta se zapravo traži. Bez jasne definicije problema, sav dalji trud je uzaludan. Potrebno je sagledati šta su ulazi, izlazi i početni uvjeti problema. Nakon što je problem jasno definiran, bitno je utvrditi kakve su veze između ulaznih i izlaznih veličina, što često nije jednostavan zadatak. Veoma često je problem takav da veze između ulaznih i izlaznih veličina nisu vidljive na prvi pogled. U tom slučaju, potrebno je problem razbiti na više manjih potproblema, i pokušati analizirati svaki od njih. Postupak razbijanja po potrebi treba obavljati više puta, sve dok se ne dobiju problemi kod kojih su veze između ulaznih i izlaznih veličina jasne. Sve dok se etapa razumijevanja problema ne obavi kako treba, ne treba ni pomišljati na druge etape rješavanja problema. Važno je da znamo da ukoliko mi kao inteligentna bića ne razumijemo suštinu nekog problema, sigurno je neće razumjeti ni računar, tako da od njega nećemo imati nikakvu korist. Ovo ne treba pogrešno protumačiti. Da bi se neki problem mogao riješiti pomoću računara, barem neki čovjek ovaj problem mora shvatiti u potpunosti (to ne moramo nužno biti mi). Problemi čiju suštinu ni jedan čovjek ne razumije, ne mogu se rješavati niti pomoću računara! Najteža etapa u rješavanju problema je razrada plana akcija. Situacija je krajnje jednostavna ukoliko je problem koji se rješava odranije poznat. Na primjer, problem nalaženja površine kruga zadanog poluprečnika ni jedan učenik srednje škole neće smatrati teškim, jer se sa formulom P = r^2  koja predstavlja ključ za rješavanje ovog problema već susreo mnogo puta. Međutim, nekome ko se nikada nije susreo sa ovom formulom, isti problem bi bio jako težak, i mnogo bi se truda moralo uložiti za otkrivanje ove formule. Stoga, prilikom razrade plana akcija, prvi korak bi trebao da bude provjera da li je rješenje poznato odranije , da bi se izbjeglo "ponovno otkrivanje tople vode". Nažalost, u praksi se često dešava da se mnogo truda uloži da se otkrije rješenje nekog problema koje je od ranije poznato, samo što rješavači problema toga nisu bili svjesni. Za plan akcija možemo reći da je razrađen tek kada su detaljno definirani svi koraci (uključujući i tačan redoslijed njihovog izvođenja) koje je potrebno preduzeti nad ulaznim podacima da bi se dobili željeni izlazni podaci. Na primjer, plan akcija "Pronaći najveći broj u spisku od 100 brojeva na papiru." ne može se smatrati razrađenim planom akcija, jer iz ovog plana nije jasan postupak kako pronaći taj najveći broj. Da bismo formirali razrađeni plan akcija, moramo razmisliti kako bismo mi taj problem riješili ukoliko bi nam ga neko postavio. Nakon malo razmišljanja, mogli bismo doći do sljedećeg razrađenog plana akcija : Zapamtimo prvi broj na spisku. Zatim posmatramo svaki sljedeći broj u spisku. Ukoliko ustanovimo da je posmatrani broj veći od zapamćenog broja, umjesto do tada zapamćenog broja pamtimo posmatrani broj. Postupak ponavljamo dok ne pregledamo sve brojeve u spisku. Posljednji broj koji smo zapamtili predstavlja upravo traženi najveći broj.

Razrada plana akcija je postupak koji traži izvjesnu vještinu. Nesumnjivo je da bi svaki čovjek normalne inteligencije znao da pronađe najveći broj u zadanom spisku brojeva, ali je iznenađujuće koliki procenat ljudi nije u stanju da jasno i precizno opiše postupak kojim su našli taj broj. Veoma često rješavanje nekog problema ukaže i na način rješavanja nekih drugih problema. Na primjer, nakon što smo razradili postupak nalaženja najvećeg broja u spisku, jasno je da se sličan postupak može primijeniti i na nalaženje najmanjeg broja u spisku. Ovakvo rješavanje problema naziva se rješavanje po analogiji. Nakon razrade plana akcija, slijedi etapa realizacije akcija. U ovoj etapi je potrebno da razlučimo da li nam je za problem potreban računar ili ne. Na primjer, za nalaženje površine kruga zadanog poluprečnika računar nam nije potreban: običan džepni kalkulator dobro će poslužiti za isti posao. Međutim, ukoliko je potrebno da saberemo recipročne vrijednosti svih prirodnih brojeva od 1 do 1000 (tj. da izračunamo zbir 1/1 + 1/2 + 1/3 + ... + 1/1000), računar će nam biti od velike koristi, jer bi nam za ovaj posao uz pomoć džepnog kalkulatora trebalo nekoliko sati, a uz pomoć računara svega nekoliko minuta (u ovo vrijeme je uključeno i vrijeme potrebno da napišemo program za rješavanje ovog problema). Ukoliko smo zaključili da nam za rješavanje problema ne treba računar, prelazimo neposredno na izvršenje planiranih akcija, dok se u slučaju problema za čije nam rješavanje treba računar, realizacija akcija svodi na prevođenje razrađenog plana akcija u program za računar, o čemu ćemo kasnije detaljnije govoriti. Konačno, nakon realizacije akcija, veoma bitna etapa je osvrt na rješenje (odnosno "pogled unazad"). Veoma česta situacija je da nakon što nađemo neko rješenje problema, detaljnija analiza pokazuje da se problem mogao riješiti znatno efikasnije (Pólya je poznat po tvrdnji da je metodološki mnogo korisnije jedan isti problem riješiti na 10 različitih načina, nego 10 različitih problema na isti način). Na primjer, posmatrajmo problem nalaženja zbira svih prirodnih brojeva od 1 do 1000 (tj. zbira 1 + 2 + 3 + ... + 1000). Na prvi pogled, za rješavanje ovog problema treba nam računar, jer bi rješavanje uz pomoć džepnog kalkulatora ili papira i olovke trajalo predugo. Međutim, uz malo razmišljanja, problem se može riješiti napamet. Ukoliko saberemo prvi i posljednji broj, zatim drugi i pretposljednji broj, zatim treći broj i treći broj odozada, itd. primijetićemo da se uvijek dobija isti rezultat 1001 (1 + 1000 = 1001, 2 + 999 = 1001, 3 + 998 = 1001, itd.). Kako ovakvih parova ima 1000/2 = 500, očigledno je ukupni zbir 1001  500 = 500500. Jednostavno, zar ne? Moguće je ovo rješenje uopćiti, i zaključiti da je zbir svih prirodnih brojeva od 1 do N jednak N  (N + 1) / 2. Ovo rješenje otkrio je čuveni matematičar Karl Friedrich Gauss još dok je bio učenik osnovne škole. Osvrt na rješenje često pomaže da se mnogi postupci rješavanja problema učine mnogo efikasnijim. Na primjer, posmatrajmo sljedeći problem: "Naći prirodan broj X između 1 i 5000 koji ima osobinu da je njegov proizvod sa istim brojem umanjenim za 2000 jednak broju 5135529.". Prvo rješenje koje se odmah nameće je da ispitujemo jedan po jedan broj X iz opsega od 1 do 5000, i da ispitujemo da li je proizvod X  (X – 2000) jednak 5135529. Rješavanje pri kojem se testiraju sve moguće dozvoljene kombinacije nekih veličina u potrazi za rješenjem naziva se rješavanje metodom grube sile (engl. brute force solving ). Za mnoge probleme veoma je lako sastaviti postupak rješavanja metodom grube sile. Međutim, ovakvo rješavanje za većinu praktičnih problema traje nedopustivo dugo čak i ukoliko se za rješavanje koristi računar, pogotovo ukoliko je opseg u kojem se može kretati tražena veličina velik. Zbog toga, prvo treba razmotriti da li se nekako može suziti opseg testiranja. U našem primjeru, pošto je veličina X pozitivna, produkt X  (X – 2000) može biti jednak pozitivnom broju 5135529 samo ukoliko je i X – 2000 pozitivan broj, odnosno ukoliko je X > 2000. Samim tim, brojeve u opsegu od 1 do 2000 uopće ne moramo testirati. U ovom slučaju je osvrt na rješenje doveo do znatnog poboljšanja efikasnosti postupka. Međutim, ovo ni izdaleka nije najbolji metod da se riješi ovaj problem. Pokažimo kako se ovaj problem može riješiti uz malo dosjetki i poznavanja elementarne matematike svega u nekoliko koraka: X  (X – 2000) = 5135529 X^2 – 2000  X = 5135529

koja citira ovaj problem). Ona se nalazi oko 1159 metara sjeverno od južnog pola. Zaista, nakon jednog kilometra kretanja na jug dolazimo do tačke koja se nalazi 159 metara sjeverno od južnog pola. Kretanje na istok sa tog mjesta vodi nas po paraleli čiji je obim 2 159 m što iznosi tačno 1 km, odnosno na tom mjestu kretanje na istok vodi nas po krugu obima 1 kilometar, tako da se nakon pređenog kilometra vraćamo u istu tačku. Dakle, postoje dvije tačke na Zemlji na kojoj je kretanje opisano u postavci problema moguće. Međutim, u blizini Južnog pola nema nikakvog života, pa samim tim ni medvjeda. Stoga je opisani scenario moguć samo tačno na sjevernom polu. Zaključujemo da se radi o polarnom medvjedu , odnosno, boja medvjeda je bijela. Vidjeli smo da je najteža etapa u procesu rješavanja problema razrada plana akcija. Bilo bi poželjno kada bi se razrada plana akcija mogla prikazati u nekom formalnom zapisu, koji bi kasnije omogućio jednostavniju realizaciju plana akcija. Za tu svrhu uveden je pojam algoritma. Nije lako tačno definirati šta je zapravo algoritam. Dovoljno jednostavna i ujedno dovoljno precizna definicija glasi ovako: Algoritam je svaki jasan, precizan i nedvosmislen uređeni niz koraka, koji u konačnom vremenu vodi do rješenja nekog problema ukoliko problem ima rješenje, odnosno u konačnom vremenu daje odgovor da problem nema rješenja ukoliko problem nema rješenja. Sama riječ algoritam potiče od nepravilnog izgovaranja posljednje riječi u imenu srednjovjekovnog perzijskog matematičara čije je puno ime Abu Ja'far Mohammed ibn Musa al-Khowarizmi. Smatra se da je on prvi formulirao jasne i precizne postupke (odnosno algoritme) za obavljanje četiri osnovne računske operacije pomoću papira i olovke. Prilikom formiranja algoritama ne smiju ostati nikakve nejasnoće ili nepreciznosti. Na primjer, neka je dat problem koji glasi "Naći vrijednost x takvu da je a  x = b .". Iz postavljenog problema moglo bi se brzopleto zaključiti da rješenje problema glasi "Tražena vrijednost x jednaka je b / a .". Međutim, ovo rješenje je nepotpuno, jer ne govori šta raditi ukoliko je a = 0. Naime, nulom se ne može dijeliti. U slučaju da je a = 0, problem se svodi na nalaženje vrijednosti x takve da je 0  x = b. Odavde zaključujemo da ukoliko je b  0, tada problem nema rješenja, jer nula pomnožena bilo kojim brojem daje ponovo nulu kao rezultat. Međutim, ukoliko je i b = 0, tada se problem svodi na nalaženje vrijednosti x takve da je 0  x = 0. U tom slučaju, svaki broj x predstavlja rješenje problema. Algoritam za rješavanje opisanog problema treba da predvidi postupke za sve opisane slučajeve. Postoje razni načini na koje se mogu zapisivati algoritmi. Neki od načina koriste opis postupka govornim jezikom , dok drugi načini koriste grafički prikaz. U nastavku ćemo razmotriti neke od najvažnijih načina na koji se zapisuju algoritmi. Najstariji način zapisivanja algoritama je opis pojedinih koraka algoritma govornim jezikom, pri čemu se svaki od koraka označava rednim brojem od 1 nadalje. Ukoliko je potrebno da preskočimo određene korake prilikom realizacije algoritma (obično pod određenim uvjetom), ili da ponovimo određene korake algoritma, neophodna grananja iskazujemo pomoću iskaza oblika "idi na korak n" gdje je n redni broj koraka od kojeg izvršavanje algoritma treba da se nastavi. Na primjer, algoritam za rješavanje skupine jednačina oblika a  x = b (odnosno jednačina čiji smo postupak rješavanja detaljno razmotrili u prethodnom primjeru), korištenjem ovog zapisa bi se mogao prikazati ovako:

  1. Unesi vrijednosti brojeva a i b;
  2. Ukoliko je a jednako nuli, idi na korak 6;
  3. Podijeli b sa a;
  4. Ispiši da je rješenje jednačine jednako izračunatom količniku;
  5. Idi na korak 10;
  6. Ukoliko je b jednako nuli, idi na korak 9;
  7. Ispiši da jednačina nema rješenja;
  8. Idi na korak 10;
  9. Ispiši da je svaki broj x rješenje jednačine;
  10. Ukoliko ima još jednačina koje treba riješiti, idi na korak 1.

Ovakav način prikaza algoritama nazivamo prikaz sa numeriranim koracima. Kako je ovakav način prikaza prilično nepregledan, razvijeni su i drugi načini prikaza algoritama kod kojih se algoritmi prikazuju grafički. Najstariji način grafičkog prikazivanja algoritama predstavlja prikaz pomoću dijagrama toka ( organigrama ). Dijagram toka za pretjodni algoritam prikazan je na sljedećoj slici: U dijagramima toka pojedini koraci algoritma opisuju se raznim grafičkim simbolima , dok se tok prelaska sa jednog na drugi korak opisuje pomoću strelica. Simbol elipsa predstavlja granični blok i on označava početak ili kraj algoritma. U jednom dijagramu toka može biti samo jedna oznaka početka (odnosno jedna ulazna tačka), dok oznaka kraja (izlaznih tačaka) može biti više. Simbol paralelogram predstavlja ulazno-izlazni blok , i on označava korake u kojima se vrši unos ulaznih podataka, odnosno ispis izlaznih rezultata. Simbol pravougaonik predstavlja blok obrade podataka. U ovim blokovima navode se svi koraci u kojima se vrši neko izračunavanje ili, općenitije, ma kakva obrada podataka. Simbol deltoid predstavlja blok odluka. Ovi blokovi označavaju mjesta u dijagramu toka u kojima se donose odluke. Obično je u takvim blokovima upisan neki uvjet, a iz bloka vode dva puta: put u kojem se izvršavanje algoritma nastavlja ukoliko je uvjet tačan, i put u kojem se izvršavanje algoritma nastavlja ukoliko uvjet nije tačan. Pored ovih, osnovnih simbola, ponekad se susreću i drugi simboli, poput veznog simbola , koji ima oblik malog kruga. To je pomoćni simbol, koji služi za povezivanje pojedinih tačaka u velikim dijagramima toka, koji se ne mogu prikazati na jednoj stranici. Oznaka upisana unutar veznog simbola povezuje izlazni dio jednog dijela dijagrama toka i ulazni dio drugog dijela dijagrama toka, koji je zapisan na nekom drugom mjestu (npr. na drugoj stranici). Prikazi algoritama sa numeriranim koracima i prikazi pomoću dijagrama toka intenzivno su se koristili dugi niz godina za prikaz algoritama. Međutim, praksa je pokazala da ovi načini prikaza algoritama podstiču neke zastarjele metodologije rješavanja problema koje su u protivurječnosti sa modernim pristupima ovoj problematici. Stoga su u posljednjih petnaestak godina sve prisutnije težnje a  0? Još jednačina? Izračunaj x = b/a Ispiši x Unesi a, b b  0? Ispiši da nema rješenja POČETAK Ispiši "svako x je rješenje" KRAJ DA NE NE DA DA NE

Unesi vrijednosti brojeva a, b i c:Ukoliko je a veće od b onda:Ukoliko je a veće od c onda:Ispiši a;U suprotnom:Ispiši c;U suprotnom:Ukoliko je b veće od c onda:Ispiši b;U suprotnom:Ispiši c;Kraj. Prednost u odnosu na prikaz sa numeriranim koracima je očigledna. Bitno je napomenuti da dijagrami toka također mogu biti veoma pregledni. Na primjer, sljedeći dijagram toka sasvim pregledno prikazuje isti algoritam: Međutim, problem sa dijagramima toka je u tome što oni ni na kakav način ne prisiljavaju rješavača problema da piše pregledne dijagrame toka. Pored toga, proizvoljno napisani dijagrami toka se veoma teško prevode u moderne programske jezike. Stoga su razvijeni i drugi vidovi grafičkog prikaza algoritama. U posljednje vrijeme sve više se susreću strukturni dijagrami. Na primjer, na sljedećoj slici prikazan je strukturni dijagram algoritma za rješavanje skupine jednačina oblika a  x = b : DA a > b? Ispiši c Unesi a, b, c POČETAK KRAJ b > c? a > c? Ispiši a Ispiši b KRAJ (^) KRAJ DA NE NE DA NE rješenje je broj b/a (^) svaki broj x predstavlja rješenje problem nema rješenja b  0 DA^ a^ ^0 NE DA NE Unesi a, b Ponavljaj za svaku od jednačina:

Bitno je naglasiti da je česta greška prilikom definiranja algoritma zaboravljanje činjenice da algoritam mora da ponudi rješenje problema ili odgovor da problem nema rješenja za konačno vrijeme. Pretpostavimo da je dat sljedeći problem: "Ispitati da li postoji takav prirodan broj X za koji je 991  X^2 + 1 kvadrat nekog drugog prirodnog broja.". Neko bi mogao da pokuša da ispituje redom sve prirodne brojeve 1, 2, 3, 4 itd. odnosno da primjenom grube sile sastavi sljedeći "algoritam":

  1. Pretpostavi da je traženi broj 1;
  2. Kvadriraj pretpostavljeni broj, pomnoži ga sa 991, i dodaj 1 na rezultat;
  3. Ukoliko je kvadratni korijen iz rezultata cijeli broj, idi na korak 6;
  4. Povećaj pretpostavljeni broj za 1;
  5. Idi na korak 2;
  6. Ispiši da traženi broj postoji (i da je jednak trenutno pretpostavljenom broju);
  7. Kraj. Međutim, prikazani niz koraka, mada jasan, precizan i nedvosmislen, uopće nije algoritam! Primijetimo da će prikazani niz koraka, ukoliko je odgovor na postavljeni problem potvrdan, zaista nakon konačnog broja koraka pronaći traženi broj i dati potvrdan odgovor. Međutim, ukoliko problem nema rješenje, ovaj postupak će stalno ispitivati nove brojeve i nikada neće završiti. Neko bi mogao pomisliti da je dovoljno pustiti da se ovaj postupak izvodi izvjesno vrijeme, i ukoliko se za to vrijeme ne pronađe broj sa traženim svojstvom, zaključiti da je odgovor na postavljeni problem odrečan. Međutim, ovaj zaključak je posve pogrešan. Naime, postavljeni problem zaista ima potvrdno rješenje, ali bi i najbrži računari na svijetu danima tražili traženi broj, jer je najmanji broj sa traženim svojstvom broj sa čak 29 cifara (to je broj 12055735790331359447442538767)! Ovaj primjer naveo je poljski matematičar Waclaw Sierpinski. Odavde vidimo da algoritam nije svaki jasan, precizan i nedvosmislen niz koraka. Inače, za postavljeni problem, iako na prvi pogled izgleda prilično naivno, nije nimalo jednostavno sastaviti algoritam (za tu svrhu potrebno je poznavati naprednu teoriju brojeva i tzv. Pellove jednačine ). Postoje nizovi koraka za koje se čak ne zna da li su algoritmi ili nisu. Jedan takav primjer predložio je Lothar Collatz. Pogledajmo sljedeći niz koraka:
  8. Unesi neki prirodan broj;
  9. Ukoliko je broj paran podijeli ga sa 2, a u suprotnom, pomnoži ga sa 3 i dodaj 1 na rezultat;
  10. Ukoliko je novodobijeni broj različit od jedan, idi na korak 2;
  11. Kraj. Na primjer, ukoliko unesemo broj 7, ovaj postupak će proći kroz sljedeći niz međurezultata: 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2 i 1, nakon čega se zaustavlja. Do današnjeg dana nikome nije pošlo za rukom da potvrdi ili opovrgne da se ovaj postupak zaustavlja u konačnom broju koraka za svaki uneseni broj, iako je za rješenje problema čak raspisana velika nagrada! Važno je naglasiti da postoje mnogobrojni problemi sa kojima se čovjek susreće u svakodnevnom životu, a čije je rješavanje veoma teško, ili gotovo nemoguće iskazati u vidu algoritama. Na primjer, ukoliko posmatramo postupak koji ljekar koristi prilikom postavljanja dijagnoze, primijetićemo da je ovaj postupak veoma teško svesti na neki određeni algoritam. Ljekar donosi odluku o dijagnozi više na osnovu intuicije, iskustva, prethodno stečenog znanja, i uočavanja bitnih i nebitnih simptoma kod pacijenta, nego na osnovu nekih unaprijed precizno definiranih koraka. Svaki pokušaj definiranja algoritma za ovaj problem dovodi do nedozvoljenog pojednostavljivanja problema, pa prema tome i do nepotpunih odluka i netačnih rješenja. O ovome treba dobro voditi računa pri utvrđivanju da li se način rješavanja nekog problema može iskazati algoritmom ili ne. Međutim, problemi čije se rješavanje ne može iskazati pomoću algoritama, ne mogu se rješavati ni pomoću računara. Mada su računari u mnogim aspektima rješavanja problema (brzini izvršavanja, preciznosti, itd.) mnogo superiorniji u odnosu na čovjeka, neposjedovanje intuicije i inteligencije čini ih posve neprimjenljivim u situacijama koje se ne mogu predvidjeti unaprijed.

Do kojeg nivoa treba razrađivati algoritam, zavisi od onoga ko taj algoritam treba da izvrši. Čak i sasvim malom djetetu normalne inteligencije koje zna da čita, ovaj algoritam bi bio dovoljan da pronađe traženi broj telefona. Međutim, svako ko se iole ozbiljnije bavio programiranjem računara, nedvojbeno je zaključio da su računari zapravo veoma glupe sprave. Razmotrimo kako bi se ovaj algoritam mogao razraditi (ova razrada bi mogla poslužiti ukoliko bismo kasnije ovaj algoritam trebali da pretvorimo u program za računar koji bi pretraživao brojeve telefona u nekoj bazi podataka, odnosno elektroničkom rokovniku). Može se primijetiti da su neki koraci, poput koraka "Nađi stranu sa početnim slovom prezimena osobe.", nedovoljno konkretni. Ovakvi koraci, koji traže dalju razradu, u dijagramima toka označavaju se blokovima sa dvostrukim okvirom. Pogledajmo kako bi se ovi koraci u navedenom primjeru mogli detaljnije razraditi. Razmislimo prvo kako bi mogao izgledati podalgoritam za nalaženje strane sa početnim slovom prezimena osobe:

  1. Kreni od prve stranice;
  2. Ukoliko je stranica obilježena traženim slovom, idi na korak 5;
  3. Pređi na sljedeću stranicu;
  4. Idi na korak 2;
  5. Kraj. Ovaj algoritam možemo iskazati i u obliku struktuiranog govornog jezika:  Kreni od prve stranice;Sve dok je slovo na stranici različito od traženog slova radi sljedeće:Pređi na sljedeću stranicu;Kraj. Prikažimo ovaj razrađeni dio i u vidu dijagrama toka: Razradimo sada podalgoritam za nalaženje imena i prezimena tražene osobe na nađenoj strani:
  6. Ukoliko je stranica prazna, idi na korak 7; Kreni od prve stranice POČETAK traženja stranice Odgovarajuće slovo? Pređi na sljedeću stranicu KRAJ traženja stranice DA NE
  1. Kreni od prvog imena i prezimena na stranici;
  2. Ukoliko je posmatrano ime i prezime jednako traženom imenu i prezimenu, idi na korak 9;
  3. Ukoliko nema više imena i prezimena na stranici, idi na korak 7;
  4. Pređi na sljedeće ime i prezime;
  5. Idi na korak 3;
  6. Nema podataka o traženoj osobi;
  7. Idi na korak 10;
  8. Pročitaj broj telefona nađene osobe;
  9. Kraj. Iskazan struktuiranim govornim jezikom, isti algoritam bi mogao glasiti ovako:  Pripremi se za čitanje prvog imena i prezimena na stranici (ukoliko nije prazna);Ponavljaj sljedeću skupinu koraka sve dok se ne ispitaju sva imena i prezimena na stranici ili dok se ne pronađe tražena osoba:Pređi na sljedeće ime i prezime;Ukoliko je posmatrano ime i prezime jednako traženom imenu i prezimenu, onda:Zapamti da je tražena osoba nađena;Ukoliko je tražena osoba nađena, onda:Pročitaj broj telefona nađene osobe;U suprotnom:Nema podataka o traženoj osobi;Kraj. Možemo primijetiti da je opis algoritma struktuiranim govornim jezikom nešto složeniji nego opis pomoću numeriranih koraka. Međutim, opis struktuiranim govornim jezikom mnogo je prilagodljiviji u slučaju potrebe za naknadnim promjenama, jer se u slučaju opisa numeriranim koracima prilikom dodavanja novih koraka često javlja potreba za izmjenom brojeva kojima se iskazuju grananja (poput "idi na korak n"). Prikažimo sada ovaj dio algoritma dijagramom toka: DA NE Kreni od početka stranice POČETAK traženja osobe Nema podataka o traženoj osobi KRAJ traženja osobe Pročitaj sljedeću osobu Odgovarajuća osoba? KRAJ traženja osobe Kraj stranice? DA NE

U ovom dijagramu toka upotrijebljene su neke skraćenice koje se često koriste u opisu algoritama. Tako, na primjer, skraćenice " Suma  0" i " Brojač  1" predstavljaju skraćeni zapis koraka "Postavi sumu na 0." i "Postavi brojač na 1.", dok skraćenice " SumaSuma + Broj " i " BrojačBrojač + 1" predstavljaju skraćeni zapis koraka "Nova vrijednost sume postaje jednaka staroj vrijednosti sume uvećanoj za broj." i "Nova vrijednost brojača postaje jednaka staroj vrijednosti brojača uvećanoj za 1.", odnosno, kraće iskazano, "Dodaj broj na sumu." i "Povećaj brojač za 1.". Kao što smo do sada vidjeli, etapa razrade plana akcija, odnosno etapa izrade algoritma, vrši se bez pomoći računara. Ostaje još da u kratkim crtama razmotrimo šta se dalje dešava ukoliko pretpostavimo da imamo napisan algoritam za rješavanje nekog problema, tj. kakav je put od algoritma do programa za računar. Kada smo u poglavlju 1.2 govorili o arhitekturi računara, vidjeli smo da računar zapravo zna izvršavati samo elementarne instrukcije koje se sastoje od nizova nula i jedinica, koje se nazivaju mašinske instrukcije. Stoga je krajnji oblik u koji svaki algoritam mora biti transformiran upravo taj niz nula i jedinica. Kod prve generacije računara, taj postupak prevođenja algoritama u mašinske instrukcije morao je obavljati čovjek. Da bismo stekli osnovni uvid koliko je ovo težak posao, pretpostavimo korak algoritma koji glasi "Izračunaj koliko je 14(11+15) i ispiši rezultat.". Vjerovali ili ne, čak i ovako prost korak računar ne zna izvršiti odjedanput. Razlozi za ovo su sljedeći:  Procesor zna raditi samo sa binarnim brojevima, tako da bi brojeve 14, 11 i 15 trebalo prvo pretvoriti u binarne brojeve.  Procesor razumije samo elementarne operacije, pa se sabiranje i množenje moraju izvesti u posebnim koracima. Da stvar bude još gora, sve donedavno procesori čak nisu poznavali ni operaciju množenja, pa bi se u takvim slučajevima množenje moralo realizirati svođenjem na prostije operacije (npr. na ponovljeno sabiranje).  Rezultat računanja procesor će opet zapisati u binarnom obliku, tako da je potrebno izvršiti i seriju instrukcija koje će ove binarne brojeve pretvoriti u takve signale upravljačkom sklopu monitora koji će uzrokovati da se na ekranu monitora ispiše traženi broj u decimalnom obliku. Kao što vidimo, neophodno je strahovito mnogo posla za tako jednostavan zadatak. Kada bismo zaista ispisali (po redovima) sve potrebne instrukcije (koje naravno predstavljaju kombinacije nula i jedinica) za obavljanje ovog zadatka, dobili bismo sljedeći program (uz pretpostavku da se koriste neki od Intelovih procesora ili njihovih klonova drugih proizvođača, i neke od standardnih grafičkih kartica za PC računare): 10110000 00001011 00000100 00001111 10110011 00001110 11110110 11100011 10111011 00000100 00000000 10111001 00000000 10111000 10001110 11011001 10110001 00001010 11110110 11110001 10000000 11000100 00110000 10001000 00100111 10000011 11101011 00000010 00110010 11100100 00001011 11000000 01110101 11110000 Užasno, zar ne? Na prvim generacijama računara, zaista se moralo ovako raditi. Ovi nizovi nula i jedinica unosili su se u memoriju pomoću prekidača, ili bušenih kartica, na kojima je raspored rupica određivao raspored nula i jedinica. Programiranje računara u to doba bilo je zaista noćna mora. Srećom, ovakvo programiranje je stvar davne prošlosti. Pokazalo se da računari ne mogu naći široku primjenu ukoliko se ne olakša način pisanja programa. Stoga su danas razvijeni specijalni programski jezici prilagođeni čovjeku, pomoću kojih je korake algoritma moguće na znatno jednostavniji način

prezentirati računaru. Na primjer, u programskom jeziku BASIC sa kojim ste se susreli u nastavi informatike u osnovnoj školi, dovoljno bi bilo napisati naredbu: PRINT 14(11+15) Ovo je, bez ikakve dileme, neuporedivo jednostavnije. Dakle, algoritmi se danas ne prevode u mašinske instrukcije, nego u neki od programskih jezika koji su znatno prihvatljiviji čovjeku. To su jezici u kojima je mnogo lakše opisati problem za koji je algoritam razrađen, bez ulaska u čisto tehničke detalje koje bi zahtijevao mašinski jezik. Većina ovih programskih jezika nastoji da se približi prirodnom ljudskom jeziku. Tako, na primjer, riječ PRINT na engleskom jeziku znači "ispiši". Što nam je na raspolaganju savršeniji programski jezik, to će proces prevođenja algoritma u programski jezik biti jednostavniji. Ostaje još da vidimo kakav je put od čovjeku razumljivih naredbi u nekom razumljivom programskom jeziku poput naredbe PRINT 14(11+15) do nizova nula i jedinica koje razumije računar. Programi u čovjeku razumljivijim programskim jezicima pišu se pomoću običnih editora teksta, o kojima smo već govorili. Ti programi, posmatrani sami za sebe, računaru ne predstavljaju ništa drugo nego obični tekstualni dokument, poput odlomka iz nekog romana Meše Selimovića, ili neke besmislene skupine znakova. Nakon što se program unese u editor teksta i sačuva na nekom od uređaja eksterne memorije (npr. disku), u pomoć se pozivaju posebni programi prevodioci, nazvani kompajleri. Ovi programi, koji spadaju u sistemski softver , iščitavaju tekstualni dokument u kojem je pohranjen program, analiziraju ga i, ukoliko je korektno napisan, pretvaraju ga u niz mašinskih instrukcija koje razumije računar. Dakle, kompajleri na sebe preuzimaju mukotrpan proces prevođenja razumljivih instrukcija poput PRINT 14*(11+15) u nerazumljivu skupinu nula i jedinica, koju smo maloprije ilustrirali. Dakle, tek pojavom prvih kompajlera proces programiranja je postao dostupan širem krugu korisnika. Treba naglasiti da su kompajleri veoma komplikovani programi, i da su prvi kompajleri morali biti pisani pomoću mašinskih instrukcija, jer na početku ništa drugo nije bilo na raspolaganju. Međutim, kada su napravljeni prvi kompajleri, oni su poslužili za pisanje složenijih kompajlera, koji su dalje iskorišteni za pisanje još složenijih kompajlera, pa sve do današnjih kompajlera, koji su dostigli nivo složenosti kakav autori prvih kompajlera nisu mogli ni naslutiti. Možemo zaključiti da se danas proces prevođenja algoritama u programe za računar odvija u dvije faze. Prva faza je prevođenje algoritma u program pisan u nekom čovjeku prihvatljivom programskom jeziku, što je za čovjeka koji dobro vlada odgovarajućim programskim jezikom najčešće rutinski posao. Druga faza je potpuno automatizirana, i sastoji se u prevođenju programa pisanog u čovjeku prihvatljivom programskom jeziku u nizove mašinskih instrukcija. Ovu fazu, kao što je već rečeno, obavljaju posebno pisani programi – kompajleri. Da bi se ove faze mogle realizirati, potrebno je poznavati barem jedan programski jezik. Tek tada je moguće algoritme prevesti u programe i koristiti računar kao sredstvo za rješavanje problema za koje nisu na raspolaganju već gotovi programi. Kako je čitav treći dio ovog udžbenika posvećen upravo programskim jezicima, kompajlerima, metodologiji programiranja i programiranju uz pomoć programskog jezika Pascal , sa ovom problematikom ćete imati prilike da se kasnije detaljnije upoznate.