You are on page 1of 28

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

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

Prevoenje programa .................................................................................................................................. 14


Analiza programa ........................................................................................................................................ 16
Analiza vitiastih i okruglih zagrada ........................................................................................................................ 16
Pregled svih struktura u programu ............................................................................................................................ 19

Prekidi ......................................................................................................................................................... 19
Postavljanje prekidnih toaka u programu ................................................................................................................ 20
Kratka uputa u vezi upotrebe prekida ....................................................................................................................... 21

Izlazna programska datoteka....................................................................................................................... 21


PROVJERA KONTROLNE SUME ........................................................................................................................... 22
SAMOPROVJERA VERIFIKATORA ....................................................................................................................... 23
LOGIKA PROVJERA PROGRAMA ............................................................................................................ 24
KONTROLNE TOKE ZA TESTIRANJE PROGRAMA ............................................................................................... 25
SUELJE ZA TESTIRANJE .................................................................................................................................... 26
TUTOR ................................................................................................................................................................ 26
KADA TUTOR POMAE? ..................................................................................................................................... 27
ZAKLJUAK...................................................................................................................................................... 28

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

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:

Slika 1: Statiki pogled na program


Dakle, program moemo promatrati kao niz programskih redaka koji trebaju rezultirati
izvrnim kodom.

Kako doi do programa?


Ako izuzmemo mogunosti da do izvornog koda programa doemo kopiranjem postojeeg
programa ili njegovim generiranjem pomou nekog generatora, ostaje nam da ga pokuamo
sami napisati. U jednostavnom sluaju, kad je program malen i jednostavan, a mi smo vjeti
programeri, moemo jednostavno upisati kod i prevesti ga. Eventualne pogreke tada emo
lako ispraviti i doi do izvrnog koda. No, to ako je program sloeniji?

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:

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Slika 2: Razvoj programa od poetnog jednostavnog do programa sa svim traenim


funkcionalnostima
Prilikom razvoja programa potrebno je voditi rauna o visini pojedinih stepenica, odnosno o
priblinom broju novih redaka programskog koda, odnosno instrukcija, izmeu dviju
kontrolnih toki. Premda taj broj ovisi o logikoj i sintaksnoj sloenosti odreenog dijela
programskog koda, kojim je programer zaokupljen u odgovarajuoj fazi razvoja programa,
uvijek je poeljno da taj broj ne bude prevelik, npr. ne vei od 10. Unutar prevelikog broja
novih instrukcija moe doi do znaajnog broja sintaksnih i logikih pogreki koje se tada
teko ispravljaju. Takoer, nije uvijek mogue prevesti program kojem je dodana samo jedna
instrukcija - npr. ako je otvoren programski blok pomou znaka '{' , nee ga biti mogue
prevesti tako dugo dok se programski blok ne zatvori pomou '}'.
Problem broja programskih redaka, odnosno instrukcija izmeu dvije kontrolne toke u
razvoju programa moemo slikovito zamisliti kao problem make koja skae, odnosno pada.
U naelu, maka bi se trebala uvijek doekati na noge. Meutim, ako pada s premale visine,
nee se moi okrenuti. Takoer, maka ne smije pasti ni s prevelike visine (ak i ako se
doeka na noge!).
Zbog toga je preporuljivo programirati s kontrolnim tokama unutar najvie 10 instrukcija,
odnosno redaka programskog koda. Je li to mogue postii u razvoju svakog programa? Da,
ako se potuje redoslijed u razvoju programa!

Redoslijed u razvoju programa


Redoslijed u razvoju programa proizlazi iz logikih odnosa izmeu pojedinih njegovih
dijelova. Npr. koritenje neke varijable uvjetovano je njenom deklaracijom, a kraj
programskog bloka njegovim poetkom. Nadalje, ispis teksta na ekranu uvjetovan je
ukljuenjem odgovarajue biblioteke za rad s ulaznim i izlaznim tokovima, kao to je
iostream, a koritenje (ili ne) naredbe return za povratak iz funkcije oznakom tipa u zaglavlju
funkcije ...
U nastavku ovog materijala dati su osnovni primjeri zavisnosti meu pojedinim dijelovima
programskog koda iz kojih proizlazi i poeljan redoslijed u razvoju programa.

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Osnovna struktura programa


elimo li napisati najjednostavniji mogui program u C++, to bi izgledalo ovako:
int main(){}
Taj program, naravno, ne radi nita, ali moe se prevesti, barem pomou onih prevoditelja
koji toleriraju da funkcija main ne mora vratiti vrijednost pomou return (neki dozvoljavaju i
da funkcija main bude oznaena s void, ime takoer otpada potreba za return). Ako na
prevoditelj ipak inzistira da funkcija main ima tip i vraa vrijednost, tada e na program (koji
jo uvijek ne radi nita!) izgledati ovako:
int main(){
return 0;
}
elimo li barem neto ispisati na ekran, morat emo ovaj primjer proiriti (koraci proirenja
nalaze se u komentaru). Najprije emo ukljuiti biblioteku iostream, pa odgovarajui imenik
(std), pa tek tada koristiti cout za ispis teksta:
#include<iostream>
// 1.
using namespace std;
// 2.
int main(){
cout << "Radi!" << endl; // 3.
return 0;
}
Ovaj program barem neto ispisuje na ekranu, ali ispis bi nam mogao "pobjei" ako odvijanje
programa privremeno ne zaustavimo, to se moe postii tako da se zatrai od korisnika unos
nekog podatka. To moemo ostvariti pomou cin, ali i za to postoje preduvjeti:
- treba nam biblioteka iostream (to smo rijeili u prethodnom koraku!)
- treba nam varijabla, iju vrijednost emo unositi (treba je deklarirati)
- treba korisniku ispisati tekst, da zna da program stoji jer se oekuje unos podatka
(ovo bi nam prevoditelj, dodue, "oprostio", ako bi ba silom htjeli izbjei)
Tako smo, u tri koraka, doli do osnovne strukture programa, koju emo dalje proirivati:
#include<iostream>
using namespace std;
int main(){
int a;
// 1.
cout << "Radi!" << endl;
cout << "Unesi a (cijeli broj):"; // 2.
cin >> a;
// 3.
return 0;
}

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

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

(3) Selekcija tipa switch:


int izbor; cout<<"Izbor=";
cin >> izbor;
switch (izbor)
{

// 0. priprema podataka!
// 1. zaglavlje bloka
// 2. {

case 1: <opcija 1>; break;// 5. opcije*


case 2: <opcija 2>; break;
default: <opcija 3>;
// 4. opcija default
// 3. } (kontrolna toka!)

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

* 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!)

(5) Iteracija tipa while:


int i=1;
while (i<=10)
{
// sadraj bloka
i++;
}
(6) Iteracija tipa do-while:
int i=1;
do
{
// sadraj bloka
i++;
} while (i<=10)

* u sluaju da se zaboravi kontrolna varijabla, stanje logikog izraza ostaje nepromijenjeno, a


petlja postaje beskonana!
Dakle osnovno pravilo pri upotrebi programskog bloka je sljedee:
- pripremiti podatke koji se koriste unutar bloka (deklaracija i inicijalizacija)
- upisati zaglavlje bloka
- postaviti vitiaste zagrade
- <kontrolna toka: ovdje treba kod prevesti i uvjeriti se da nema pogreki>
- upisati sadraj bloka (ili dio sadraja!) i ponovo prevesti kod

Varijable
Svaka varijabla mora prije upotrebe biti deklarirana. Da bi se mogla koristiti, potrebno joj je
zadati poetnu vrijednost (tj. govorimo o inicijalizaciji varijable).

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Primjer (aritmetika sredina 5 brojeva):


int i;
float suma,prosjek,unos; // 1.
suma=0;
// 2.
//
for (i=1;i<=5;i++)
// 3.
{
// 4.
cout << "broj:";
// 6.
cin >> unos;
suma+=unos;
}
// 5.

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

Koritenje strukturnih varijabli:


cout << "Maticni broj:";
cin >> student.mat_br;

// 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

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

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;

// 4. uklanjanje (=dealokacija) polja

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

Zato je poziv potprograma prije sadraja? Najprije provjeravamo "formalnu stranu"


(=sintaksnu ispravnost), a zatim sadraj!

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

(2) potprogram s argumentima koji vraa vrijednost:


#include<iostream>
// 0.
using namespace std;
float zbroj(float p1,float p2) //1.
{
// 2.
float s;
// 4.
s = p1 + p2;
// 8.
return s;
// 5.
};
// 3.
int main(){
// 0.
float a,b,suma;
// 6.
cout << "a = ";
cin >> a;
cout << "b = ";
cin >> b;
suma = zbroj(a,b);
// 7.
cout << "suma = " << suma; // 9.
return 0;
// 0.
}

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.

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

U sljedeem koraku, klasu i funkciju main popunimo sadrajem:


#include<iostream>
using namespace std;
class cklasa
{
public:
float a,b;
float zbroj()

// 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

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

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

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Slika 3: Unos podataka na poetku rada s Verifikatorom


Polja za unos imena, prezimena, broja indeksa, naziv programa i opis zadatka se moraju
popuniti. Zavrno vrijeme unosi se ako postoji vremensko ogranienje za izradu programa
(npr. na laboratorijskim vjebama), dok se u suprotnom koristi gumbi Bez mjerenja vremena.
Pomou gumbia Dohvati vrijeme Verifikator dohvaa vrijeme s dostupnog vremenskog
posluitelja na Internetu ili, ako to nije mogue, sistemsko vrijeme na raunalu. Mjerenje
preostalog vremena za izradu programa poinje odmah nakon to Verifikator dohvati vrijeme,
a ispisuje se u traci naslova Verifikatora. Polja Datoteka 1 i Datoteka 2 su neobavezna i
koriste se za praenje stanja datoteka kod testiranja programa.
Nastavljamo klikom na gumbi "Zaponi s programiranjem", ime nae suelje prelazi u
sljedee (slika 4):

Slika 4: Suelje za programiranje


U gornjem dijelu prozora nalazi se podatak o datumu i vremenu poetka rada s programom, te
prezime i ime autora i naziv programa. Desno je polje za unos programa, a lijevo gumbii za
prevoenje i pokretanje programa. Preostalo vrijeme ne ispisuje se u adresnoj traci, ako
korisnik na poetku rada izabere nain rada bez mjerenja vremena.
12

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

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 5: Unos programa


Broje se novi redovi u programu, te znak ';'. Vrijednosti 0-4 su u podruju zelenog, 5-10 u
podruju utog, a 11 i vie u podruju crvenog, kad vie nije mogue prevesti programski kod
(slika 6).

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

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Slika 7: Nakon brisanja/stavljanja u komentar dijela koda prevoenje je opet dozvoljeno


Ogranienja pri unosu programa u Verifikatoru
Verifikator predstavlja obrazovno suelje za programiranje u C++, te zbog toga postavlja
odreena ogranienja pri unosu programa ime se nastoje sprijeiti odreene loe navike u
programiranju. Prvo takvo ogranienje, da nije dozvoljeno program prevesti kad vrijednost na
semaforu prijee 10 je ve spomenuto. Ostala ogranienja su sljedea:

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

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Slika 8: Prevoenje u sluaju kad nema pogreki


Moemo primijetiti da nam je semafor sada u podruju zelenog, i to na nuli! Time smo dobili
prostor za proirenje programa (pazei naravno, da opet ne uemo "u crveno"!). Ispis
upozorenja prevoditelja (eng. Warnings) je opcionalan, pomou odgovarajue kontrole u
prozoru za ispis pogreaka.
U sluaju da ima pogreaka u programu, dobit emo njihov ispis (slika 9):

Slika 9: Ispis pogreki


Vrijednost na semaforu se ne smanjuje tako dugo dok pogreke ne ispravimo! Klik na gumbi
"Detaljnije" oznait e nam programske retke u kojima je detektirana pogreka crvenom
bojom (slika 10).

15

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Slika 10: Detaljniji ispis pogreki

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).

Slika 11: Prozor za analizu programa

Analiza vitiastih i okruglih zagrada


Smjestimo kursor unutar funkcije main (unutar vitiastih zagrada) i kliknimo na gumbi '{}()'
unutar prozora "Analiza programa" (slika 12).
16

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Slika 12: Analiza programa na poziciji kursora


U prozoru za analizu programa ispisuje se sljedee:

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 vitiastih zagrada u programu. Da bi program bio


sintaksno ispravan, ta dva broja moraju biti jednaka!

ukupan broj lijevih i desnih okruglih zagrada. Broj mora biti jednak. Do pogreke
najee dolazi u aritmetikim i logikim izrazima.

popis otvorenih programskih struktura na poziciji kursora. Ovaj podatak moe


koristiti za lake snalaenje u programu, objasniti zato se neto izvrava samo
jednom, a trebalo bi biti unutar petlje, da li moda neka od prethodnih programskih
struktura nije zatvorena i sl.

Primjer: - u jednoj od prethodnih funkcija nije zatvorena jedna vitiasta zagrada


U sljedeem programskom kodu izostavljena je desna vitiasta zagrada koja zatvara iteraciju
tipa while:
#include<iostream>
using namespace std;
int prva_funkcija(){
int a=0;
while (a<10){
a++;

17

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

// 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

Otvorene strukture na poziciji kursora:


int prva_funkcija()
int druga_funkcija()

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

Otvorene strukture na poziciji kursora:


int prva_funkcija()
int treca_funkcija()

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

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Pregled svih struktura u programu


Unutar prozora "Analiza programa" kliknemo na gumbi "Sve strukture" (Slika 13).

Slika 13: Pregled svih programskih struktura u programu (1)


Dobije se pregled svih struktura u programu, te njihovu hijerarhiju (prikazanu uvlakama).
Osim kontrolnih struktura dobije se i pregled potprograma, te struktura definiranih pomou
kljunih rijei class, struct ili union. U sluaju da neka od struktura nije referencirana nigdje
u programu ( = ne koristi se), ispisuje se odgovarajua poruka (Slika 14.).

Slika 14. Pregled svih programskih struktura u programu (2)

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

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

programa najprije e se ispisati osnovni podaci koje je korisnik unio te vrijeme kada je
program preveden (Slika 15).

Slika 15. Poetak izvoenja programa u nainu rada s ukljuenim prekidima


Postavljanje prekidnih toaka u programu
Prekidne toke (eng. Breakpoints) koriste se u programu za zaustavljanje izvoenja programa
i oitavanje trenutnih vrijednosti varijabli. U Verifikatoru se prekidne toke postavljaju u
obliku komentara, koji mora biti na poetku programskog retka (bez uvlake):
//Prekid:var1 var2 varN
Time se na zadanoj toki zaustavlja izvoenje programa (do pritiska bilo koje tipke) i ispisuju
se vrijednosti varijabli var1, var2 i varN (nazivi varijabli moraju biti odvojeni razmakom).
Primjer:
int main(){
int a, i;
float b=4.557;
a=99;
for (i=0;i<5;i++){
//Prekid:a b i
};
}
U primjeru se prekidna toka nalazi unutar iteracije tipa for, a ispisuju se vrijednosti varijabli
a, b i i, kao to moemo vidjeti na slici 16.

20

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Slika 16: Primjer izvoenja programa uz ukljuene prekide


Kratka uputa u vezi upotrebe prekida
Osnovni zahtjev kod svakog programiranja je da program treba biti ispravan sintaksno i
logiki. Sintaksno se program provjerava uz pomo prevoditelja, koji ispisuje sintaksne
pogreke. Logike pogreke mogue je provjeravati tek kad su otklonjene sintaksne pogreke!
Zbog toga je u radu s prekidima potrebno postupiti na sljedei nain:

prevesti program pri iskljuenim prekidima,


ako je prevoenje uspjelo (=nema sintaksnih pogreaka), moemo ukljuiti prekide,
postaviti prekidne toke i ponovo prevesti program, te ga pokrenuti radi testiranja.
na kraju, naravno, trebamo prekidne toke iskljuiti, jer se time prekidne toke u
programu iskljuuju.

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,

ako pogrijeimo u sintaksi zadavanja varijabli za ispis (trebaju biti odvojene


razmakom).

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.

Izlazna programska datoteka

21

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Verifikator nakon svakog uspjenog prevoenja sprema programski kod na desktop, u


datoteku iji naziv sastavi iz prezimena i imena autora, te naziva programa. U primjeru,
kreirana je datoteka Markovi_Marko_Zadatak 1.cpp . Sadraj datoteke je sljedei:
// MD5:0xqxfH6i4r4tBFU7qQxFtA==
// Verifikator 3.19
// Program:Primjer
// Opis zadatka:Uvodni primjer
// Autor:Markovi Marko 31291
// Poetno vrijeme:7.10.2013. 11:01:21
// Zavrno vrijeme:7.10.2013. 11:31:28
// IP:fe80::c9ab:5518:2c45:1172%11 ( 5720 )
// #:#include<iostream>,#include <iostream>,
// Uspjenih/neuspjenih prevoenja:3/2
#include <iostream>
using namespace std;
int main(){
int a;
float b,c;
cout << "Unesi a:";
cin >> a;
}
Dakle, u datoteku su, u obliku komentara upisani razni podaci, od kojih je neke programer
unio na poetku rada s programom, dok su ostali upisani automatski. Potrebno je naglasiti da
je u prvi red datoteke upisana kontrolna suma (MD5). Taj podatak slui kao potvrda da je
programski kod stvarno kreiran pomou Verifikatora. Naravno, u sluaju promjene datoteke
izvan Verifikatora, kontrolna suma vie ne vrijedi!

Provjera kontrolne sume


Uz programsku datoteku Verifikator.exe nalazi se i Provjera_MD5.exe . Taj program
omoguuje uitavanje programske datoteke, provjeru kontrolne sume, prevoenje i pokretanje
programa, ali bez mogunosti modifikacije izvornog koda (slika 17)!

22

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Slika 17: Provjera kontrolne sume


Dakle, u sluaju da je kontrolna suma ispravna, programski kod se oboji zelenom bojom (u
suprotnom sluaju crvenom bojom), te ga je mogue prevesti i zatim pokrenuti.

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

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Slika 18: Samoprovjera Verifikatora

Logika provjera programa


Poetne verzije Verifikatora omoguavale su samo sintaksnu provjeru programa, dok je
logika provjera uvedena u verziji 2.95. U tu svrhu Verifikator je dobio jo jedan gumbi u
glavnom programskom prozoru, gumbi "Testiranje", a uz standardni semafor nalaze se sada i
podaci o trenutnom broju programskih blokova u programu (pripadajuih parova vitiastih
zagrada koje se odnose na procese, dakle, izuzimajui strukture definirane pomou kljunih
rijei struct, class i union), te o do sada provedenim testiranjima programa (Slika 19).

Slika 19: Suelje Verifikatora uz logiku provjeru programa.

24

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Rezultati testiranja odnose se na testiranja programa u pojedinim stupnjevima njegovog


razvoja, pri emu se stupnjevi razvoja odnose na broj programskih blokova u programu:
stupanj 1: 3-8 programskih blokova
stupanj 2: 9-14 programskih blokova
stupanj 3: 15-20 programskih blokova
---------------------------------------------(svaki daljnji stupanj odnosi se na sljedeih 5 programskih blokova)
Kod testiranja evidentira se ulazak u pojedine programske blokove, te se dostignuti
programski blokovi evidentiraju kao postotak u odnosu na ukupna broj programskih blokova
u programu. To znai da, ako program sadri nedostupne dijelove programskog koda (npr.
potprograme koji nisu referencirani), tada ukupan postotak testiranja ostaje ispod 100%.

Kontrolne toke za testiranje programa


Klikom na gumbi "Testiranje" kreira se na radnoj povrini Windowsa (Desktop) izvorni kod
programa koji sadri kontrolne toke na ulazu u svaki programski blok. Sam naziv datoteke
proiren je sufiksom "_test", a programski kod funkcijom za testiranje (test) i pozivom te
funkcije na ulazu u svaki programski blok u programu (Slika 20):

Slika 20: Programski kod proiren kontrolnim tokama i funkcijom za testiranje


Rezultati testiranja sadre dosegnute kontrolne toke u programu i nalaze se u datoteci
"testiranje.txt" (u radnom direktoriju Verifikatora).
25

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

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.

Slika 21: Suelje za testiranje


Odgovarajui postotak uz semafor aurira se po zavretku testiranja.

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

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

Slika 22: Tutor

Kada tutor pomae?


Tutor za sada prepoznaje sljedee situacije u programu, na koje upozorava odgovarajuim
porukama:
izostanak kljunih dijelova programa, poput biblioteke iostream, imenika std ili funkcije
main.
este greke studenata:
o izostanak znaka ';' iza desne vitiaste zagrade koja zatvara struct, class ili
union
o rasparene vitiaste zagrade (viak/manjak lijevih, odnosno desnih vitiastih
zagrada)
o izostanak desne vitiaste zagrade ispred while koja zatvara iteraciju do-while
o raspareni dvostruki navodnici kod znakovnih nizova
o rasparene okrugle zagrade
o izostanak okruglih zagrada kod logikih izraza uz if , while
o izostanak okruglih zagrada iza kljune rijei main
o koritenje operatora '=' u logikim izrazima uz if (umjesto '==')
o neispravna sintaksa kod iteracije tipa for
o deklaracija varijabli u zaglavlju iteracija for, odnosno while (nije poeljno)
o sintaksne pogreke kod pojedinih case-ova unutar selekcije tipa switch
potprogrami (funkcije/metode) koji nisu referencirani iz drugih dijelova programa (ne
pozivaju se).

27

Nastavni materijal za kolegije Programiranje I i II, D. Radoevi 2008-2013.

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

You might also like