Upload
schweini31
View
10
Download
0
Embed Size (px)
DESCRIPTION
aefeafe
Citation preview
1
1 ALGORITAM
Pojam algoritma predstavlja temelj za razumijevanje računarstva općenito.
Međutim algoritmi nisu ograničeni samo na računarstvo ili tehničke aktivnosti. Pomoću
algoritma možemo opisati mađioničarski trik ili neku svakodnevnu aktivnost.
Mnogi istraživači vjeruju da je bilo koja aktivnost ljudskog uma, uključujući zamišljanje,
kreativnost i donošenje odluka, u osnovi rezultat izvođenja nekog od algoritama što je za
posljedicu imalo razvoj znanstvene discipline poznate pod imenom Umjetna inteligencija.
Algoritam možemo definirati kao skup jednoznačnih točno utvrđenih koraka koji služe za
postizanje željenog cilja.
1.1 Porijeklo naziva
Naziv algoritam dolazi od imena arapskoga matematičara Muhammad ibn Musa Al
Horezmija (790 - 850). On je razradio i u svom djelu Al Jabr dao opću metodu za nalaženje
dva rješenja kvadratne jednadžbe. U latinskom prijevodu njegove knjige ime je s vremenom
pretvorenu u Algorithmus, a naziv djela u algebra.
U prvo vrijeme sa algoritmima nazivana samo pravila računanja s brojevima, a zatim u
periodu sve do sredine 20. stoljeća samo matematička pravila za obavljanje raznih zadataka.
Tek s pojavom računala pojam se rasprostranio, najprije u područje računarstva, a zatim i u
druge djelatnosti. Riječ algoritam danas se sve više susreće u raznim prilikama
svakodnevnog života jer se obavljanje raznih poslova svodi na obavljanje pojedinih osnovnih
operacija zadanim redoslijedom.
2
1.2 Svojstva algoritma
Postoje tri značajna svojstva koje svaki algoritam mora imati.
Uz svaki algoritam moraju biti jasno definirani početni objekti nad kojima se
obavljaju operacije.
Algoritam se mora sastojati od konačnog broja koraka koji ukazuju na slijed operacija
koje treba obaviti nad početnim objektima kako bi se dobili završni objekti ili rezultati.
Svaki korak se opisuje instrukcijom. Obavljanje algoritma naziva se algoritamskim
procesom. Tijekom odvijanja algoritamskog procesa i postupne izgradnje završnog
objekta mogu se pojaviti i neki međurezultati.
za obavljanje algoritma potreban je izvoditelj algoritma, netko ili nešto tko razumije
algoritam i zna točno obaviti svaki korak algoritma. Trajanje algoritamskog procesa
određeno je brzinom kojom izvoditelj obavlja korake algoritma.
1.3 Vrsta logaritama
Algoritme možemo podijeliti na specijalizirane i općenite algoritme.
Specijalizirani algoritmi mogu se primijeniti samo na pojedine početne objekte i nisu
upotrebljivi za ostale kombinacije tih objekata.
Općeniti algoritmi dozvoljavaju upotrebu različitih vrijednosti početnih objekata. Za
njih definiramo klasu ulaznih objekata koji su dozvoljeni i nad kojima se algoritam
ispravno izvodi i rezultira klasom izlaznih objekata.
1.4 Cilj programiranja
Osnovni cilj programiranja je osmisliti općeniti algoritam čiji će izvoditelj biti računalo.
3
1.5 Programski jezici
Algoritmi i dozvoljeni objekti algoritama mogu se opisati prirodnim govornim jezikom, ali je
isto tako moguće sačiniti i umjetne jezike za zapisivanje algoritma. Oni moraju biti dovoljno
dobro izgrađeni da bi se njima mogli opisati raznovrsni algoritmi.
Ako želimo da algoritam automatski obavlja računalo, onda ga moramo prevesti u program
sastavljen od instrukcija koje služe za upravljanje strojem koje računalo razumije i može
izvesti. Taj jezik naziva se strojni jezik.
Strojni jezik je teško razumljiv i neprikladan za čovjeka. Zbog toga su sačinjeni umjetni jezici
za zapisivanje algoritama razumljivi čovjeku. Ti jezici nazivaju se višim programskim
jezicima. Algoritam zapisan u nekom programskom jeziku naziva se program.
1.6 Način zapisivanja algoritma
Vidjeli smo da je algoritam općeniti pojam definiran izvan specifičnog programskog jezika.
Zbog toga uvodim i načine njegovog zapisivanja koji nisu vezani niti za jedan programski
jezik. Takvih načina ima više. Spomenut ćemo pseudokod i dijagram toka.
Pseudokod je algoritam zapisan riječima. Naziv dolazi kao kombinacija riječi pseudo (grč.
laž, lažni, tobožnji) i kod (skup dogovorenih znakova kojima možemo oblikovati neku poruku,
komunicirati). U programiranju se pod kodom razumijeva izvorni program napisan u nekom
programskom jeziku. Prema tome, pseudokod bi bio "lažni" program u kojem upute ne
pišemo u nekom od programskih jezika nego iste ili slične korake algoritamskog procesa
opisujemo uvijek istim dogovorenim riječima i znakovima iz govornog jezika.
Dijagram toka je grafički prikaz algoritma. Takav način zapisivanja ima nekoliko prednosti
pred pseudokodom. Zapisivanje se vrši međunarodno dogovorenim simbolima i ne ovisi o
govornom jeziku onoga koji sastavlja algoritam. Grafički prikaz je jednostavan, pregledan,
lako se pronalaze greške. Nadalje, problem se može jednostavno analizirati, usporediti s
nekim drugim problemom, skratiti vrijeme pronalaženja rješenja. Simboli koje koristi dijagram
toka su:
simbol za početak i kraj programa
4
simbol za ulaz i izlaz podataka
simbol za izvršne instrukcije, u pravilu
pridruživanje
simbol za uvjetno grananje, u ovisnosti o
ispunjenosti testiranog
uvjeta algoritam izvođenje
nastavlja jednim od alternativnih tijekova
algoritma
spojna točka alternativnih tijekova algoritma
tijek izvođenja algoritma
1.7 Tipovi podataka
Razlikujemo tri osnovna tipa algoritma:
algoritam slijeda (linijski algoritam),
algoritam grananja,
algoritam petlje.
Njihova osnovna svojstva pokazat ćemo na sljedećim primjerima.
5
Primjer 1.
Zadatak 1: Napravi algoritam za unos dva broja i ispis njihovog zbroja.
Napomena: Ovo je primjer algoritma slijeda kod kojeg se instrukcije uvijek izvode jedna za
drugom, unaprijed određenim redoslijedom bez obzira na vrijednosti podataka s kojima
algoritam radi.
Primjer 2.
Zadatak 2. Napravi algoritam za unos jednog broja i ispis njegove apsolutne vrijednosti.
Napomena: Ovo je primjer algoritma grananja kod kojeg se ispituje određeni uvjet i, ovisno o
njegovoj ispunjenosti, algoritam usmjerava jednim od dva alternativna tijeka.
6
Primjer 3.
Zadatak 3. Napravi algoritam za unos jednog broja i ispis njegovih prvih 10 potencija.
Napomena: Ovo je primjer algoritma petlje kod kojeg se određeni skup instrukcija ponavlja
više puta.
7
2 PODACI
Osnovna funkcija računala je obrada podataka.
Svaki računalni program obrađuje podatke smještene u memoriji računala. Njih mo�žemo
podijeliti na
nepromjenjive podatke, tj. konstante,
promjenjive podatke, tj. varijable.
Računalo za svaki podatak predviđa i rezervira mjesto u memoriji za njegovu pohranu.
Svako rezervirano mjesto u memoriji ima svoju jedinstvenu memorijsku adresu.
Memorijske adrese su višeznamenkasti binarni brojevi. Korisnicima je označavanje varijabli
višeznamenkastim binarnim brojevima neprikladno, pa im se zato dodjeljuju simbolička
imena. Simboličko ime je ime koje se sastoji od slova engleskog alfabeta, znamenki i znaka
podcrtavanja. Svaki put kad program naiđe na simboličko ime, povezuje ga s pripadajućim
podatkom.
2.1 Tipovi podataka
S obzirom da se različite klase podataka obrađuju na različite načine, nužno je da svaki
podatak koji se u programu javlja ima dodijeljenu oznaku tipa, koja govori o tome
kako se dotični podatak pohranjuje u memoriju računala,
koji su njegovi dozvoljeni rasponi vrijednosti,
kakve su operacije moguće s tim podatkom i sl.
Ove klase nazivamo tipovima podataka. Najčešće susrećemo sljedeće tipove:
logički podaci (eng. Boolean) - mogu sadržavati samo dvije vrijednosti istinu i laž
(eng. true i false)
cijeli brojevi (eng. integers) - često u programskim jezicima postoji nekoliko tipova
podataka koji služe za čuvanje cijelih brojeva, a međusobno se razlikuju po broju
bajtova koje zauzimaju, po tome mogu li pamtiti negativne brojeve ili ne i sl.,
realni brojevi (eng. floating point numbers) - u računalu realizirani kao brojevi s
pomičnom decimalnom točkom, također se decimalni brojevi koji se zapisuju
korištenjem plutajuće točke, također vrlo često realizirani kroz nekoliko tipova
podataka,
8
znakovi (eng. characters) - služe za zapis jednog znaka.
tekst (eng. string) - niz znakova koji možemo promatrati kao cjelinu.
2.2 Cjelobrojni tipovi podataka
U programskom jeziku C++ postoji cijeli niz cjelobrojnih tipova podataka. Oni se međusobno
razlikuju po količini memorije koju zauzimaju, kao i po tome zapisuju li samo pozitivne
(unsigned) ili i pozitivne i negativne brojeve (ovo je podrazumijevani tip, ali može se staviti i
prefiks signed).
Na slici se mogu vidjeti podaci o nazivu tipova, količini zauzete memorije i rasponu podataka
za svaki od cjelobrojnih tipova podataka u C++. Treba napomenuti da ove veličine ovise o
okruženju u kojem se C++ program izvodi.
2.3 Tipovi podataka za zapis realnih brojeva
U programskom jeziku C++ postoji cijeli i nekoliko tipova podataka za zapis realnih brojeva u
formatu broja sa plutajućom decimalnom točkom. Oni se međusobno razlikuju po količini
memorije koju zauzimaju.
Na slici se mogu vidjeti podaci o nazivu tipova, količini zauzete memorije i rasponu podataka
za svaki od realnih tipova podataka u C++. I ovdje treba napomenuti da veličine ovise o
okruženju u kojem se C++ program izvodi.
9
2.4 Tipovi podataka za zapis teksta
U programskom jeziku C++ postoje i dva tipa podataka koja služe za zapis pojedinačnog
znaka. Oni se međusobno razlikuju po količini memorije koju zauzimaju, kao i po kodu koji
koriste za zapis znakova u računalu. Također postoji i tip podataka koji služi za pohranu
teksta, odnosno niza znakova koje možemo promatrati i tretirati kao cjelinu.
Na slici se mogu vidjeti podaci o nazivu tipova, količini zauzete memorije i rasponu podataka
za oba znakovna tipa podataka u C++.
2.5 Identifikatori
Mnogim elementima računalnog programa (konstantama, varijablama, funkcijama, klasama)
potrebno je dati određeno ime. U tu svrhu koriste se identifikatori, tj. simbolička imena kod
čijeg zadavanja imamo dosta slobode.
U programskom jeziku C++ broj znakova identifikatora nije ograničen. Prilikom njegovog
izbora imamo dosta slobode, ali ipak je potrebno poštivati nekoliko osnovnih pravila:
identifikator mo�e biti sastavljen od kombinacije slova engleskog alfabeta (A - Z, a -
z), znamenki (0 - 9) i znaka za podcrtavanje ’_’ (eng. underscore),
prvi znak mora biti slovo ili znak za podcrtavanje,
10
identifikator ne smije biti jednak nekoj od ključnih riječi ili nekoj od alternativnih
oznaka operatora
treba izbjegavati nazive identifikatora koji sadrže dvostruke znakove podcrtavanja
(__) ili koji započinju znakom podcrtavanja i velikim slovom, jer su takve oznake
rezervirane za C++ implementacije i standardne biblioteke.
C++ razlikuje velika i mala slova pa su npr. xy, Xy, xY i XY četiri različita
identifikatora.
Osim ovih nekoliko pravila kod zadavanja imena mo�žemo pustiti maš�ti na volju pa svoje
varijable i funkcije nazivati svakojako. Pri tome je ,zbog razumljivosti koda, pož�eljno imena
odabirati tako da odra�žavaju stvarno značenje varijabli. Ako se oblikuje ime sastavljeno od
više riječi, uobičajeno je riječi odvajati znakom podcrtavanja ili ih pisati spojeno tako da je
svako prvo slovo u riječi veliko (npr. ime_ od_vise_rijeci ili ImeOdViseRijeci).
11
2.6 Varijable
Varijable su podaci čija se vrijednost u tijeku izvođenja programa može mijenjati. Svaku
varijablu koju u programu koristimo moramo deklarirati (najaviti programu njeno postojanje).
Opći oblik deklaracije varijable je:
tip_podatka identifikator [= inicijalna_vrijednost];
za pojedinačnu varijablu, odnosno
tip_podatka identifikator[dimenzija] [= {skup inicijalizatora}];
za niz podataka istog tipa.
Istom deklaracijskom instrukcijom moguće je najaviti i više varijabli istog tipa, npr.
int b1, b2 = 4, b3[5], b4[5] = {1, 2, 3, 4, 5};
Deklaraciju varijable u kojoj se varijabli istovremeno dodjeljuje i inicijalnu vrijednost nazivamo
inicijalizacija varijable.
2.7 Konstante
Konstante su podaci čija se vrijednost zadaje u samom kodu i u tijeku izvođenja programa
ne može se mijenjati. Svaku konstantuu koju u programu koristimo moramo definirati.
Postoje dva načina definicije konstanti u C++, pretprocesorskom naredbom #define čiji je
opći oblik:
#define identifikator inicijalna_vrijednost
ili na slično varijablama uz prefiks const:
const tip_podatka identifikator = inicijalna_vrijednost;
12
3 OPERATORI
U svim programskim jezicima postoji cijeli niz operatora koji simbolički predstavljaju
određene operacije koje se nad podacima mogu obavljati.
Operatori programskog jezika C++ su:
operator pridruživanja: =
aritmetički operatori:
o unarni: +, -, ++, --
o binarni: +, -, *, /, %
relacijski operatori: >, >=, <, <=, ==, !=
logički operatori: ! (logičko NE), && (logičko I), || (logičko ILI)
bitovni operatori: ~ (komplement), & (binarni I), | (binarni ILI), ^ (isključivo ILI),
<< (pomak ulijevo), >> (pomak udesno)
operator dodjele tipa: static_cast<tip_podatka>
4 KONTROLA TIJEKA PROGRAMA
Uobičajeno je da se naredbe u programu izvršavaju u onom poretku u kojem su napisane
(sekvencijalno). Naravno, često se javlja potreba da se naredbe izvršavaju u nekim drugom
poretku. Stoga postoje naredbe koje omogućavaju programu da odredi koja će biti sljedeća
naredba u programu koja će se izvršiti, neovisno o tome je li upravo ta naredba sljedeća u
poretku izvršavanja.
Naredbe koje to omogućuju kontroliraju tijek kojim će se izvršavati naš program te se stoga
te naredbe zovu naredbe kontrole tijeka programa. Programske strukture koje kontroliraju
tijek izvođenja programa su:
grananja,
petlje.
Grananje nam omogućuje izvršavanje jednog od navedenih blokova naredbi u ovisnosti o
ispunjenosti testiranih uvjeta ili o vrijednosti testiranog izraza.
Petlja omogućuje višestruko izvršavanje bloka naredbi. Blok naredbi će se izvršavati sve dok
je uvjet povratka u petlju ispunjen.