Professional Documents
Culture Documents
Kako Programirati
Kako Programirati
Kako programirati?
Logiki razvoj programa
Sadraj
UVOD ..................................................................................................................................................................... 2
KAKO DOI DO PROGRAMA? ............................................................................................................................... 2
RAZVOJ PROGRAMA ....................................................................................................................................... 2
REDOSLIJED U RAZVOJU PROGRAMA ................................................................................................................... 3
Osnovna struktura programa ........................................................................................................................ 4
Programski blok ............................................................................................................................................ 5
Varijable ........................................................................................................................................................ 6
Strukturne varijable ....................................................................................................................................... 7
Pobrojenja ..................................................................................................................................................... 7
Dinamika polja ............................................................................................................................................ 8
Potprogrami .................................................................................................................................................. 8
Klase i objekti ................................................................................................................................................ 9
VERIFIKATOR .................................................................................................................................................. 10
INSTALACIJA VERIFIKATORA ............................................................................................................................ 10
RAD S VERIFIKATOROM .................................................................................................................................... 11
Unos programa ............................................................................................................................................ 13
Ogranienja pri unosu programa u Verifikatoru ....................................................................................................... 14
Prekidi ......................................................................................................................................................... 19
Postavljanje prekidnih toaka u programu ................................................................................................................ 20
Kratka uputa u vezi upotrebe prekida ....................................................................................................................... 21
Uvod
to je program? Statiki, moemo ga promatrati jednostavno kao niz programskih redaka,
neto to zavri u obinoj tekstualnoj datoteci, a to prevoditelj prepoznaje kao programski
kod (izvorni programski kod; eng. source code). Taj programski kod moe biti ispravan ili
neispravan, promatrano na razini sintakse, odnosno gramatikih pravila zadanog programskog
jezika. Ako je kod ispravan, moi e se uz pomo prevoditelja, doi do izvrnog programskog
koda (eng. execute code). Grafiki, statiki pogled dat je na slici 1:
Razvoj programa
Budui da teko moemo napisati vei i kompleksniji program "u jednom dahu", morat emo
ga razvijati, formirajui u toku razvoja odreene kontrolne toke, odnosno manje programe
koje emo provjeravati sintaksno (pomou prevoditelja) i logiki (testiranjem programa).
Postupak razvoja programa moemo grafiki predoiti na slici 2:
Naravno, dalje emo ovu osnovnu strukturu proirivati, dodajui joj postepeno (s novim
kontrolnim tokama) sve potrebno za ostvarivanje zadanih funkcionalnosti iz programskog
zadatka.
Programski blok
Programski blok je dio programskog koda koji se nalazi unutar pripadajuih vitiastih
zagrada, dakle, znakova '{' i '}'. Bitno je da u C++ za svaku lijevu vitiastu zagradu mora
postojati odgovarajua desna. Zbog toga je, da bi se program mogao prevesti unutar zadanih
nekoliko redaka, potrebno najprije postaviti obje vitiaste zagrade, pa tek nakon toga upisati
sadraj programskog bloka. Takoer, potrebno je obratiti panju na to da programski blok (da
bi imao smisla) mora imati svoje zaglavlje, dakle, postoji zaglavlje bloka.
Primjeri:
(1) Funkcija main:
int main()
{
// sadraj bloka
}
//
//
//
//
//
//
1. zaglavlje bloka
2. lijeva vitiasta zagrada
4. sadraj bloka (moe
sadravati nove blokove)
3. desna vitiasta zagrada
(kontrolna toka!)
Prema tome, bitno je da najprije postavimo zaglavlje bloka, a tek nakon toga moemo blok
popuniti sadrajem (instrukcijama)!
(2) Selekcija tipa if:
int a,b; a=1; b=2;
if (a<b)
{
// sadraj bloka 1
}
else
{
// sadraj bloka 2
}
//
//
//
//
//
//
//
//
//
0.
1.
2.
7.
3.
4.
5.
8.
6.
priprema podataka!
zaglavlje bloka
lijeva vitiasta zagrada
sadraj prvog bloka
desna vitiasta zagrada
zaglavlje drugog bloka
lijeva vitiasta zagrada
sadraj drugog bloka
desna vitiasta zagrada
// 0. priprema podataka!
// 1. zaglavlje bloka
// 2. {
* ako opcije ukljuuju pozive potprograma, varijable i sl., tada isti trebaju biti prethodno
definirani, jer pozivi ovise o postojanju odgovarajuih potprograma, a varijable o svojim
deklaracijama. Zbog toga opcije treba dodavati u redoslijedu kojim se ostvaruju potrebni
preduvjeti.
(4) Iteracija tipa for:
int i;
for (i=1;i<=10;i++)
{
// sadraj bloka
}
//
//
//
//
//
0.
1.
2.
4.
3.
priprema podataka!
zaglavlje bloka
{
sadraj bloka
} (kontrolna toka!)
//
//
//
//
//
//
0.
1.
2.
5.
4.
3.
priprema podataka!
zaglavlje bloka
{
sadraj bloka
kontrolna varijabla*
} (kontrolna toka!)
//
//
//
//
//
//
0.
1.
2.
5.
4.
3.
priprema podataka!
zaglavlje bloka
{
sadraj bloka
kontrolna varijabla*
} (kontrolna toka!)
Varijable
Svaka varijabla mora prije upotrebe biti deklarirana. Da bi se mogla koristiti, potrebno joj je
zadati poetnu vrijednost (tj. govorimo o inicijalizaciji varijable).
deklaracija varijabli
inicijalizacija
varijable*
zaglavlje bloka
{
sadraj bloka
} (kontrolna toka!)
* varijabla i se inicijalizira u zaglavlju iteracije for, unos unutar petlje, a prosjek pri raunanju
rezultata.
Strukturne varijable
Strukturne varijable nastaju grupiranjem vie varijabli pomou kljune rijei struct:
struct tstudent
{
int mat_br;
// 1. zaglavlje strukture
// 2. {
// 4. sadraj strukture
//
(kontrolna toka!)
char prez_ime[40];
int godina_stu;
};
// 3. }; toka-zarez
//
(kontrolna toka!)
Ovime je samo deklariran novi tip podataka, koji se naziva tstudent. Varijablu moemo
deklarirati u sljedeem koraku:
tstudent student, s1,s2;
// 6. deklaracije varijabli
// 7. unos podataka s
//
tipkovnice
Pobrojenja
Pobrojenja omoguuju zamjenu brojki slovnim oznakama (to bi trebalo omoguiti njihovo
lake pamenje). Za deklaraciju pobrojenja koristi se kljuna rije enum:
#include<iostream>
using namespace std;
int main(){
enum tdan{pon,uto,sri,
cet,pet,sub,ned};
tdan dan;
// 0. da se ne zaboravi!
// 1. tip podatka
// 2. dekl. varijable
dan=pet;
// 3. inicijalizacija var.
cout << "Dan="<<dan<<endl; // 4. ispis vrijednosti var.
return 0;
// 0.
}
Dinamika polja
U osnovi, razlika izmeu statikih i dinamikih polja je u tome to je ovim drugim njihov
"ivotni vijek" krai: nastaju u toku izvravanja programa (=dinamiki), a i nestaju iz radne
memorije prije nego to program zavri (takoer dinamiki!). Osim toga, takva polja
zahtijevaju eksplicitni pokaziva - posebnu varijablu sa samo jednim zadatkom: da zapamti
gdje se u radnoj memoriji nalazi dinamiko polje (jer bi isto u suprotnom bilo izgubljeno!).
Redoslijed operacija pri radu s dinamikim poljem je sljedei (kontrolna toka treba biti
nakon koraka 4):
int *polje;
int N=10;
polje=new int[N]
// 1. pokaziva na polje
// 2. broj elemenata polja
// 3. kreiranje (=alokacija) polja
//
(kontrolna toka!)
polje[3] = 55;
// 5. rad s poljem
delete [] polje;
Potprogrami
Potprogrami predstavljaju imenovane logike cjeline u programu. Neki su zamiljeni tako da
izraunaju svoju vrijednost i vrate je u pozivajui program (pomou instrukcije return), dok
drugi ne vraaju vrijednost (pa ne moraju koristiti return). Bitno za programiranje je da poziv
potprograma ovisi o postojanju istog (deklaracije i tijela potprograma), a ne obratno!
Primjeri:
(1) najjednostavniji potprogram koji ne vraa vrijednost:
#include<iostream>
using namespace std;
void potprogram()
{
cout <<"Potprogram"<<endl;
};
int main(){
potprogram();
return 0;
}
// 0. da se ne zaboravi!
//
//
//
//
//
//
//
1.
2.
5.
3.
0.
4.
0.
zaglavlje potprograma
{
sadraj potprograma
} (kontrolna toka!)
poziv potprograma
da se ne zaboravi!
zaglavlje potprograma
{
priprema podataka
sadraj potprograma
povratna vrijednost
} (kontrolna toka!)
priprema za poziv
poziv potprograma
rezultat potprograma
Klase i objekti
Pojednostavljeno, klase moemo promatrati kao proirene strukture. Razlika je u tome da one,
osim podataka, sadre i funkcije, koje tada nazivamo funkcijskim lanovima klase, odnosno
metodama, dok podatke definirane unutar klase nazivamo podatkovnim lanovima klase,
odnosno atributima. Kako nema potrebe da svi dijelovi klase budu dostupni iz ostalih
dijelova programa (= neto je "ispod haube", tj. zanima mehaniara kad neto ne radi kako
treba, ali ne i vozaa), postoje tzv. specifikatori pristupa (public, private i protected).
Specifikator public daje ona prava pristupa lanovima klase, koja inae vrijede za strukture
(=sve je dostupno iz svih dijelova programa). Naravno, klase se mogu nasljeivati, mogu biti
apstraktne, sadravati tzv. virtualne metode itd., ali o tome kasnije...
U ovom trenutku bitno nam je da klasa predstavlja tip (nisu vie samo podaci u pitanju!) koji
koristimo za deklaraciju objekta. Prema tome, da bi mogli deklarirati objekt, klasa mora biti
definirana, barem okvirno:
#include<iostream>
//
using namespace std;
class cklasa
//
{
//
// tijelo klase (kasnije!)
};
//
int main(){
//
cklasa objekt;
//
// priprema podataka i
// poziv metode
return 0;
//
}
0. da se ne zaboravi!
1. zaglavlje klase
2. {
3. } (kontrolna toka!)
0.
4. deklaracija objekta
0.
// 0. da se ne zaboravi!
//
//
//
//
1. prava pristupa i
podaci(kontrolna toka!)
3. metoda
(kontrolna toka!)
{
return a+b;
};
};
int main(){
cklasa objekt;
float suma;
cout << "a = ";
cin >> objekt.a;
cout << "b = ";
cin >> objekt.b;
suma = objekt.zbroj();
// 0.
//
//
//
//
//
//
cout << "suma = " << suma; //
return 0;
//
2. priprema podataka
ukljuujui atribute
objekta
(kontrolna toka!)
4. poziv metode
(kontrolna toka!)
5. ispis rezultata
0.
Verifikator
Verifikator je obrazovni program namijenjen uenju programiranja u C++. Funkcionira kao
suelje u kojem se moe pisati programski kod, te omoguuje poziv prevoditelja (potrebno je
prethodno instalirati DevC++), ispravljanje pogreki, te pokretanje programa. Osnovna ideja
programa je prisiliti programera da svoj program razvija u logikim cjelinama, umjesto da
slijedno upisuje programski kod od prvog retka do zadnjeg. Zbog toga je uveden semafor, koji
programera upozorava da otvorene programske cjeline, kao to su npr. programski blokovi,
funkcije i klase, treba zatvoriti, kako bi se kod mogao prevesti, provjeravajui na taj nain
njegovu ispravnost. Takav nain razvoja programa ne dozvoljava gomilanje pogreki i
zahtijeva poznavanje njegove strukture.
Instalacija Verifikatora
1. Potrebno je najprije instalirati DevC++ (besplatno suelje i prevoditelj za razvoj programa
u C++), koji je dostupan na adresama:
http://www.bloodshed.net/dev/devcpp.html (verzija 4.9.9.2.)
Kod instalacije DevC++ treba ostaviti ponueni direktorij (c:\Dev-Cpp). DevC++ 4.9.9.2. (i
starije verzije) ne radi na Windows 8 i ne podrava standard C++11 ali je najjednostavnija za
povezivanje s Verifikatorom, jer nisu potrebne nikakve prilagodbe.
10
http://www.softpedia.com/get/Programming/Coding-languages-Compilers/DEV-C.shtml
(aktualna verzija DevC++, u trenutku pisanja 5.4.2.)
Kod instalacije DevC++ treba zadati direktorij c:\Dev-Cpp umjesto ponuenog. Radi na
Windows 8 i podrana je veina mogunosti standarda C++11. Za povezivanje s
Verifikatorom potrebno je unutar
Control Panel/System/Advanced
Variables/Path
System
Properties/Environment
Variables/System
dodati stazu do prevoditelja (ovisno o tome radi li se o 32 ili 64-bitnoj verziji alata):
;C:\Dev-Cpp\MinGW32\bin\
ili
;C:\Dev-Cpp\MinGW64\bin\
(funkcionira nakon ponovnog pokretanja raunala!)
2. Zip datoteku s Verifikatorom treba raspakirati u novi direktorij. Osim toga, nije potrebna
posebna instalacija.
Postoje dvije programske datoteke:
- Verifikator.exe - omoguuje pisanje, prevoenje i pokretanje programa. Verifikator nakon
svakog prevoenja sprema izvorni kod programa u direktorij gdje se nalazi i na desktop. Kod
sadri MD5 kontrolnu sumu koja osigurava provjeru da je program stvarno napisan u
Verifikatoru!
- Provjera_MD5.exe - omoguuje provjeru ispravnosti kontrolne sume, te prevoenje i
pokretanje programa, ali bez modifikacija.
Osim te dvije datoteke, postoji jo:
- C++ Keywords.txt - sadri kljune rijei C++ to se koristi za osvjetljavanje sintakse.
- radne datoteke koje kreira Verifikator: izvrna datoteka (.exe), pogreke kod prevoenja itd.,
to se aurira u toku rada s Verifikatorom.
Rad s Verifikatorom
Verifikator najprije zahtijeva unos odreenih podataka o programeru i programu koji se
izrauje, kao to moemo vidjeti na slici 3:
11
Unos programa
Program se u Verifikator ne moe uitati, niti iskopirati, potrebno ga je utipkati! Nakon to
zaponemo unos programa, lijevo se pojavi semafor, pokazujui nam tako koliko jo moemo
pisati program, prije nego to ga prevedemo (slika 5). Broj unutar vitiastih zagrada
predstavlja broj programskih blokova od kojih se program trenutno sastoji.
Slika 6. Kod nije bio na vrijeme preveden, pa smo uli "u crveno"
to poduzeti kad uemo u crveno? Jednostavno, moramo neto programskog koda izbrisati (i
suzdrati nervozu kod toga!) ili privremeno staviti dio koda u komentar i tako ui barem u
podruje utog (slika 7).
13
ako broj redaka prijee 18 (=pri upisu programa otili smo daleko u "crveno"), ispisuje
se upozorenje da broj novih programskih redaka unutar kojih se program mora
prevesti iznosi 10.
ako se u programu nalazi vie od pet uzastopnih praznih redaka (ne raunajui
komentare), tada se pri pokuaju prevoenja ispisuje odgovarajua poruka ("Previe
uzastopnih praznih redaka"). Viak praznih redaka potrebno je obrisati!
u jednom retku ne smijemo upotrijebiti vie od jednog znaka ';' (toka-zarez),
odnosno, dozvoljeno je da u jednom programskom retku imamo samo jednu
instrukciju. Izuzetak su iteracija tipa for (dvije toke-zarez) i instrukcija break koja
smije biti u istom retku s prethodnom instrukcijom, odnosno, pojavljuju se dva znaka
toka-zarez. U sluaju previe instrukcija u jednom retku, ispisuje se prilikom
pokuaja prevoenja odgovarajua poruka, zajedno s brojem programskog retka gdje
je pronaena takva pogreka.
suvini reci u programu, takvi koji sadre samo znak ';' (toka-zarez) bez sadraja,
nisu doputeni i za njih se pri pokuaju prevoenja ispisuje odgovarajua poruka.
Prevoenje programa
Uz pretpostavku da je na semaforu zeleno ili uto, program moemo prevesti klikom na
gumbi "Prevedi". U sluaju da nema sintaksnih pogreki, rezultat e biti kao na slici 8:
14
15
Analiza programa
Analiza programa je alat koji pomae programeru u pronalaenju sintaksnih, ali posredno i
logikih pogreaka u programu, ponajprije onih vezanih uz programske strukture i upotrebu
vitiastih, odnosno, okruglih zagrada.
Prozor za analizu programa u Verifikatoru otvara se klikom na gumbi "Analiza" (slika 11).
ukupan broj lijevih i desnih vitiastih zagrada koritenih ispred pozicije kursora.
Prema tom podatku programer moe vidjeti nalazi li se kursor unutar neke
strukture (= broj lijevih vitiastih zagrada jednak je broju desnih vitiastih
zagrada)
ukupan broj lijevih i desnih okruglih zagrada. Broj mora biti jednak. Do pogreke
najee dolazi u aritmetikim i logikim izrazima.
17
// nedostaje }
};
int druga_funkcija(){
pozicija kursora 1
};
int treca_funkcija(){
pozicija kursora 2
};
int main(){
}
Sluaj 1: kursor je na poziciji 1
S kursorom na poziciji 1 dobije se sljedei rezultat analize programa:
Analiza vitiastih zagrada:
do kursora { = 3
}=1
u programu { = 5
}=4
Dakle, budui da je ukupan broj lijevih vitiastih zagrada u programu (5) vei od broja desnih
vitiastih zagrada u programu (4), oito je da jedna od struktura nije zatvorena. Kako se
kursor nalazi unutar druge funkcije, ta struktura nije zatvorena na toj poziciji, ali je takoer
vidljivo da je otvorena i prva funkcija, to ne bi smio biti sluaj, odnosno, postoji pogreka u
prvoj funkciji.
Sluaj 2: kursor je na poziciji 2
S kursorom na poziciji 2 dobije se sljedei rezultat analize programa:
Analiza vitiastih zagrada:
do kursora { = 4
}=2
u programu { = 5
}=4
Dakle, i u ovom sluaju utvren je manjak jedne desne vitiaste zagrade. Takoer, uoava se
da je prva funkcija ostala otvorena, tj. sadri pogreku.
18
Prekidi
Prekidi se koriste za pronalaenje i ispravljanje logikih pogreaka u programu (eng.
Debugging), a ukljuuju pomou odgovarajue kontrole na dnu programskog prozora.
Izvedemo li programski primjer koji je preveden uz ukljuene prekide, na poetku izvoenja
19
programa najprije e se ispisati osnovni podaci koje je korisnik unio te vrijeme kada je
program preveden (Slika 15).
20
Prekidne toke mogu uzrokovati pogreku u programu (=ne pojavljuje se pri iskljuenim
prekidima) u sljedeim sluajevima:
ako traimo ispis nepostojee varijable ili takve iju vrijednost ne moemo ispisivati s
cout,
ili
U svakom sluaju, ako pri ukljuenim prekidima doe do sintaksne pogreke (=program se ne
moe prevesti), tada program treba prevesti s iskljuenim prekidima. Ako tada nema
pogreaka, treba provjeriti prekidne toke u programu.
21
22
Samoprovjera Verifikatora
Za potrebe nastave potrebno je osigurati da svi studenti koriste istu verziju Verifikatora, da je
Verifikator pokrenut s iste staze (obino D:\Verifikator) i da su svi upisali isto zavrno
vrijeme (u obrascu koji treba ispuniti na poetku rada s Verifikatorom). U tu svrhu potrebno
je kao prvi redak u programu upisati sljedei komentar:
//upit:<troznamenkasti broj>
Upit nakon klika na gumbi Prevedi rezultira sliicom u donjem desnom dijelu programskog
prozora Verifikatora (Slika 18.).
23
24
Suelje za testiranje
U sluaju da je kod za testiranje ispravan, klikom na gumbi "Testiranje" otvara se
odgovarajue suelje, koje se sastoji od uobiajenom programskog prozora i prozora s
rezultatima testiranja (Slika 21). Osim podataka o pristupu pojedinim programskim
blokovima u toku izvoenja programa, ispisuju se i podaci o veliini izvrne programske
datoteke (.exe) te o zauzeu radne memorije unutar operacijskog sustava Windows na poetku
izvoenja programa te, posebno, veliina memorijskog prostora koju dinamiki alocira
program u toku izvoenja (npr. pomou operatora new). Za praene datoteke (u primjeru je to
datoteka tekst.txt) ispisuju se podaci o stanju datoteke (otvorena/zatvorena), datum i vrijeme
kreiranja i zadnjeg upisa, te veliina datoteke u bajtima.
Tutor
Tutor je zamiljen kao pomonik koji studentima poblie objanjava mogue sintaksne i
logike pogreke u programu. Njegove poruke su informativne, dakle, u nekim sluajevima
mogu se i zanemariti, slino kao i upozorenja (eng. Warnings) prevoditelja. Tutor se javlja u
prozoru za ispis pogreaka kod prevoenja (Slika 22).
26
27
Upute tutora su neobavezne (ponekad i pogrene!), ali mogu biti korisne u situacijama kad
poruke prevoditelja nisu dovoljno razumljive ili kad se pojavljuje logika greka u programu
koja naizgled izmie svakom analizi.
Zakljuak
Upotreba obrazovnog programa Verifikator treba omoguiti studentima bolje razumijevanje
programskog koda i logiki razvoj programa, umjesto jednostavnog sekvencijalnog upisivanja
programskog koda, to je primijeeno kao esta pogreka kod studenata. Pri razvoju programa
potrebno je odrediti kontrolne toke na kojima se program provjerava sintaksno i logiki. Na
taj nain izbjegava se preveliko gomilanje pogreki. Da bi se to postiglo, potrebno je voditi
rauna o zavisnostima unutar programa, npr. da upotreba neke varijable ovisi o njenoj
deklaraciji. Takoer, program je potrebno u toku razvoja povremeno testirati, kako bi se
utvrdila njegova logika ispravnost. U ovom materijalu objanjene su osnovne problemske
situacije u kojima se moe nai programer i poredak operacija koji omoguuje da se one
razrijee. Obrazovni program Verifikator namijenjen je za koritenje na laboratorijskim
vjebama, na pismenim provjerama, te izvanredno i za domae zadae studenata.
28