Upload
ljubobvb
View
222
Download
0
Embed Size (px)
Citation preview
8/19/2019 Predavanja iz C++2009
1/152
UNIVERZITET CRNE GORE
ELEKTROTEHNÎ KI FAKULTET
VI[A RA^UNARSKA [KOLA
dr Milutin Ostoji}
mr Boris Markovi}
8/19/2019 Predavanja iz C++2009
2/152
2
1. Integrisano okru`enje Borland Builder v. 3.0
Forma nakoju se"postavljaju"komponente
Editor ukojem se pi{ekod vezan zadoga|aje kojise de{avajunad objektima.
Palete saraspolo`ivimkomponentama
Objekt
inspektor ukojem sepode{avajuosobinekomponenti ipomo}u kojegse generi{e
kod potrebanza povezivanjekomponenti sadoga|ajima
^estokori{}enefunkcije menija
Padaju}i meniji
Start aplikacije
Integrisano okru`enje generi{e kod aplikacije neophodanza povezivanje sa operativnim sistemom itd.
8/19/2019 Predavanja iz C++2009
3/152
3
2. Kreiranje aplikacije
2.1. Postavljanje komponenti na formu i pode{avanje osobina komponenti
U objekt inspektoruse pode{avajuosobine trenutnoodabrane(selektovane)komponente.
Osobine koje semogu pode{avatisamo u dobakreiranja aplikacijenazivaju se stati~keosobine.
Osobine koje semogu mjenjati i utoku izvr{avanjaaplikacije nazivaju sedinami~ke osobine.
Postavljanjekomponentena formu
8/19/2019 Predavanja iz C++2009
4/152
4
2..2. Programiranje doga|aja, pode{avanje osobina i pozivanje metoda komponenti
U objekt inspektoruse odabiraju doga|ajina koje treba da"reaguje" selektovanakomponenta.
C++ kod kojidopisujeprogramer
Definicija funkcije za podrazumjevani doga|aj nad komponentomse mo`e generisati i dvoklikom nad komponentom.
Dvoklikom nadpraznim poljemdesno od opisamogu}eg doga|ajanad komponentom,integrisano okru`enjegeneri{e praznufunkciju povezanu samogu}im doga|ajemnad objektom
Funkcija koja }e seizvr{iti kad se desidoga|aj nadkom onentom
8/19/2019 Predavanja iz C++2009
5/152
5
Programiranje doga|aja:
Na prethodnoj slici je prikazano kreiranje aplikacije u kojoj je doga|aj "klik" mi{em (Click) na
komponentu taster (Button1), koji se nalazi na formi (Form1), povezan sa funkcijom koju jegenerisalo integrisano okru`enje:
U prazno tijelo funkcije TForm::Button1Click(TObject *Sender) programer upisuje svoj kodkoji }e se izvr{iti svaki put kad se desi doga|aj "klik" (Click) nad objektom taster (Button1):
//-------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){ }//-------------------------------------------------------------
//-------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){ Edit1->Text="Test program"; // promjena teksta u komponenti Edit1 ListBox1->Clear(); // brisanje sadrzaja u ListBox1
ListBox1->Items->Add(Edit1->Text); // upisivanje u ListBox1 teksta iz Edit1}//-------------------------------------------------------------
8/19/2019 Predavanja iz C++2009
6/152
6
Pode{avanje osobina:
Komponente imaju stati~ke i dinami~ke osobine. Stati~ke osobine se pode{avaju samo u objekt inspektoru za vrijeme kreiranja aplikacije. Dinami~ke osobine se pode{avaju i u objekt inspektoru za vrijeme kreiranja aplikacije i
pozivanjem odgovaraju}ih naredbi za dodjelu vrijednosti dinami~kim osobinama u tokuizvr{avanja aplikacije.
Primjer pode{avanja dinami~ke osobine komponente Edit1 je promjena teksta upisanog u tuosobinu za vrijeme izvr{avanja aplikacije:
Edit1->Text="Test program"; // promjena teksta u komponenti Edit1
Pozivanje metoda:
Funkcije koje su ugra|ene u komponente i koje pri pozivanju izvr{e neku akciju nadkomponentom, nazivaju se metodama.
Primjer pozivanja metoda koje rade nad objektom ListBox1 i koje bri{u sadr`aj te komponente idopisuju novi sadr`aj u nju:
ListBox1->Clear(); // brisanje sadrzaja u ListBox1ListBox1->Items->Add(Edit1->Text); // upisivanje u ListBox1 teksta iz Edit1
8/19/2019 Predavanja iz C++2009
7/152
7
2.3. Brisanje komponente i koda pridru`enog komponenti
Komponenta se bri{e tako {to se selektuje, a zatim se odradi akcija Cut ili Delete iz menijaEdit, ili tako {to se selektuje komponenta a zatim pritisne taster Ctrl+Del ili samo taster Del.
Kod koji je programer upisao u funkciju koju je generisalo integrisano okru`enje za obrisanukomponentu, treba obrisati.NE SMIJE se brisati kod koji programer nije sam napisao Taj kod }e integrisano okru`enjesamo obrisati. U protivnom, integrisano okru`enje }e prijaviti gre{ke...
2.4. Startovanje aplikacije
Aplikacija se startuje klikom na ikonicu Run, pritiskom na taster F9 ili odabirom opcije Run izRun padaju}eg menija.
Startovanjem projekta koji je do sada opisivan, dobija se sljede}a aplikacija:
8/19/2019 Predavanja iz C++2009
8/152
8
2.5. Kreiranje izvr{ne aplikacije
Snimanjem projekta na disk i njegovim startovanjem, na disku }e se kreirati izvr{na aplikacija(tipa EXE) u istom direktorijumu u kojem je snimljen projekat i sa imenom koje je dato projektu.
2.6. Otkrivanje i ispravljanje gre{aka
Spisak gre{aka kojeeventualno postoje ukodu aplikacije sedobija pri njenom
startovanju.
Ukoliko gre{kepostoje, aplikacijane}e biti startovana,ve} }e integrisanookru`enje generisatilistu gre{aka na dnu
prozora u kojem senalazi kod aplikacije.
Pronala`enje gre{keu kodu se radi tako{to se dvaput kliknena opis gre{ke u listi.
8/19/2019 Predavanja iz C++2009
9/152
9
3. Slu`bene rije~i programskog jezika "C++" (Borland C++ Builder)
Va`i za verziju programskog jezika "C++" koja se koristi u okviru prevodioca Borland C++ Builder.
SLU@BENE RIJE^I PROGRAMMSKOG JEZIKA "C++" (Borland C++ Builder)
__asm _asm asm auto __automated break bool case
catch __cdecl _cdecl cdecl char class __classid __closure
const const_cast continue __declspec default delete __dispid do
double dynamic_cast else enum __except explicit _export __export
extern false __fastcall _fastcall __finally float for friend
goto if __import _import inline int __int8 __int16
__int32 __int64 long mutable namespace new operator __pascal
_pascal pascal private protected __property public __published register
reinterpret_cast return __rtti short signed sizeof static static_cast
__stdcall _stdcall struct switch template this __thread throwtrue __try try typedef typename typeid union using
unsigned virtual void volatile wchar_t while
8/19/2019 Predavanja iz C++2009
10/152
10
4. Komentari
U jeziku C komentari se stavljaju izme|u znakova /* i */
Komentarom u jeziku C++ se smatra sve {to se nalazi iza znakova // i kraja reda. Tako|e jezadr`an i na~in obilje`avanja komentara iz jezika C.
int i; // ovo je C++ komentar // C++ komentar je tekst koji se nalazi izme|u znakova // i kraja reda
void fun(void) /* ovo je nacin obiljezavanja komentara koriscen u jeziku C*/
{ /* C komentar pocinje
znacima /* izavrsava znacima */
}
8/19/2019 Predavanja iz C++2009
11/152
11
5. Identifikatori
Identifikatori su imena koja se mogu koristiti u okviru programskog jezika "C++" za imenovanje: objekata, promjenjivih, funkcija...
Za identifikatore va`i sljede}e: ne smiju se koristiti slu`bene rije~i, ne smiju po~injati sa brojem,
ne smiju sadr`ati razmake ili specijalne znakove osim znaka "_",Specijalni znakovi su: ~`!@#$%^&*(){}[];:'"\|?/., moraju po~eti slovom ili znakom "_", mala i velika slova u identifikatorima se me|usobno razlikuju,
Primjeri regularnih identifikatora:
i _ime i1 xmax yMin x_sred _1_2 _XxXx Mirko Janko7
Primjeri neregularnih identifikatora:
i me f*name 5xyz ime() void static pascal Janko# 90_x x_y+z
8/19/2019 Predavanja iz C++2009
12/152
12
6. Tipovi promjenjivih
Osnovni tipovi su:
char –cjelobrojni (znakovni) tip podatka int –cjelobrojni tip podatka float –realni tip podatka jednostruke ta~nosti double –realni tip podatka dvostruke ta~nosti
Primjenom modifikatora signed (ozna~en), unsigned (neozna~en), short (kratak) i long (dug) naosnovne tipove, dobijaju se novi tipovi podataka.
OZNAKA TIPA
SKRA]ENA
OZNAKA
OPIS Bajtova OPSEG
unsigned char neozna~eni znak 1 0 -- 255signed char char ozna~eni znak 1 -128 -- 127unsigned short int unsigned short neozna~eni kratki cijeli broj 2 0 -- 65535signed short int short ozna~eni kratki cijeli broj 2 -32768 -- 32767unsigned int neozna~eni cijeli broj 4 0 -- 4294967295signed int int ozna~eni cijeli broj 4 -2147483648 -- 2147483647
unsigned long int unsigned long neozna~eni dugi cijeli broj 4 0 -- 4294967295signed long int long ozna~eni dugi cijeli broj 4 -2147483648 -- 2147483647float realni broj 4 3.4E-38 -- 3.4E+38
double realni broj dvostruke ta~nosti 8 1.7E-308 -- 1.7E+308long double dugi realni broj dvostruke ta~nosti 10 3.4E-4932 -- 1.1E+4932
8/19/2019 Predavanja iz C++2009
13/152
13
7. Operatori
Prvo su navedeni operatori programskog jezika C, a zatim operatori koji su dodati u programskom
jeziku C++. Operatori su pore|ani po redosljedu kojim }e se u~iti.Sa "p" }e se ozna~avati pointer (pokaziva~), tj. promjenjiva koja sadr`i memorisku adresu nekepromjenjive odgovaraju}eg tipa.
Slijede operatori programskog jezika C:TIP OPERATOR OPIS PRIMJER / OBJA[NJENJE
za funkcije
()Navodi se pri pozivu funkcije i uokviru njega se predaju argumenti
float x=StrToFloat("10.123");
aritmeti~ki
* Mnozenje x=y*z;/ Dijeljenje x=r/t;% Moduo (ostatak) x=z%y;+ Sabiranje i=j+k;- Oduzimanje i=j-k;+ Unarni plus i=+5;- Unarni minus i=-5;
za dodjelu
= Dodjela vrijednosti a=3; b=15;
aritmeti~ki i
dodjela vrijednosti
+= Sabiranje i dodjela i+=4; // i=i+4;-= Oduzimanje i dodjela i-=3; // i=i-3;*= Mno`enje i dodjela i*=5; // i=i*5;/= Djeljenje i dodjela i/=9; // i=i/9;%= Djeljenje sa ostatkom i dodjela i%=2; // i=i%2;
++ Inkrementiranjei++; // i=i+1;++i; // i=i+1;
-- Dekrementiranjei--; // i=i-1;--i; // i=i-1;
8/19/2019 Predavanja iz C++2009
14/152
14
TIP OPERATOR OPIS PRIMJER / OBJA[NJENJE
logi~ki
< Manje od if ( i < 3 ) j=6;
Add(IntToStr(niz[i]));
> Vece od while(i>3){...}>= Vece od ili jednako do {...} while(i>=10);== Jednako if(i==j){...}!= Razlicito if(i!=j){...}&& Logicko I if( (ix; // z=str.x;
za veli~inu
sizeof Velicina tipa i=sizeof(float); // i==4 (4B)
8/19/2019 Predavanja iz C++2009
15/152
15
TIP OPERATOR OPIS PRIMJER / OBJA[NJENJE
bitski
(nad bitovima)
0j=i>>3; // j=i/2/2/2; ako je i>0
~ Komplement nad bitovima(00010110)=~(11101001)0x16 =~ 0xE9;
& I nad bitovima(00001010)=(10101010)&(00001111)0x0A = 0xAA & 0x0F;
^ Iskljucivo ILI(10100101)=(10101010)^(00001111)0xA5 = 0xAA ^ 0x0F;
| ILI nad bitovima(10101111)=(10101010)|(00001111)0xAF = 0xAA | 0x0F;
bitski i dodjela
vrijednosti
&= I nad bitovima i dodjela i&=0x0F; // i=i&0x0F|= ILI nad bitovima i dodjela i|=0xA0; // i=i|0xA0^= Iskljucivo ILI i dodjela i^=0x56; // i=i^0x562
uslovni
?: Uslovni operator (i>3) ? {j++;} : {j--;a=c;}// if(i>3) {j++;} else {j--;a=c;}
8/19/2019 Predavanja iz C++2009
16/152
16
Slijede operatori dodati u programskom jeziku C++:
TIP OPERATOR OPIS PRIMJER / OBJA[NJENJE
odre|enje dosega
:: razrje{enje dosega
int x=1; // globalno x
void fun(){int x=2; // lokalno x ::x=x; // globalno x (::x) dobija} // vrijednost lokalnog x
rad sa
memorijom
new dodjela memorije dinaki~kom objektuint *p = new int;*p=55;
deleteosloba|anje memorije dodjeljenedinami~kom objektu
int *p = new int;*p=55;delete p;
za pristup
elementima
objekata,
struktura i unija
.*pristup ~lanu objekta pomo}upokaziva~a
class Tklasa { ... public: int x; ... };
Tklasa a,*pk; // deklaracija objekta a // i pokazivaca pk na
// objekat tipa Tklasa
int Tklasa::*pi; // deklaracija pokazivaca // na "int" element klase // Tklasa
pk=&a; //pi=&Tklasa::x;
a.*pk=100; // isto kao a.x=100;
pk->*pi=200; // isto kao a.x=200;
->*pristup pokazivanom ~lanu objekta
pomo}u pokaziva~a
8/19/2019 Predavanja iz C++2009
17/152
17
8. Kodiranje doga|aja –tipi~na struktura funkcije ~ije je izvr{avanje povezano sa doga|ajem...
Algoritam
funkcije
Start
Stop
Obrada podataka
Prihvatanje vrijednosti promjenjivih
Ispisivanje rezultata prora~una
// Ovo je komentar
void __fastcall TForm1::Button1Click(TObject *Sender){
/*deklaracija lokalnih promjenjivih*/
/*ucitavanje vrijednosti za promjenjive*/
/*obrada podataka*/
/*ispisivanje rezultata rada funkcije*/
}
Funkcja koja }e se izvr{itikad se desi doga|aj "Click"nad objektom "Button1"
Pseudo-kod
funkcije
Deklaracija rezervisanjemjesta u memoriji zapromjenjive koje se koriste
Objekat "Button1" nad kojim}e se desiti doga|aj "Click"(mi{em)
8/19/2019 Predavanja iz C++2009
18/152
18
9. Deklaracija lokalnih promjenjivih i dodjeljivanje vrijednosti
Pod deklaracijom promjenjivih (varijabli) podrazumjeva se navo|enje naredbi kojima se u memorijira~unara rezervi{e prostor u kojem }e se smje{tati njihove vrijednosti.
Blok naredbi se defini{e postavljanjem zagrada "{" na po~etku i zagrade "}" na kraju blokanaredbi.
Deklarisanje lokalnih promjenjivih se radi bilo gdje u bloku naredbi prije prvog kori{}enjapromjenjive.
Deklaracija promjenjivih se radi tako {to se navede tip jedne ili vi{e promjenjivih koje trebadeklarisati a zatim imena promjenjivih razdvojena zarezima.
U okviru naredbi deklaracije mo`e se izvr{iti inicijalno dodjeljivanje vrijednosti promjenjivim.
{int x;int y,z,k=45,j=0;
float a,b,c=11.22;/* ... naredbe ... */
unsigned long int t=k+j;
/* ... naredbe ... */}
Lokalne promjenjive su vidljive samounutar bloka naredbi u kojem su
deklarisane (od mjesta deklaracije dokraja bloka) i postoje samo dok seizvr{avaju naredbe iz tog bloka naredbi.Nemaju inicijalnu vrijednost.
8/19/2019 Predavanja iz C++2009
19/152
8/19/2019 Predavanja iz C++2009
20/152
20
10.1. U~itavanje i ispisivanje String-a (AnsiString-a):
Doga|aj "Click" nad objektom "Button1"
je iskodiran sljede}om funkcijom:
//---------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{Label1->Caption = Edit1->Text;
}//---------------------------------------------------
Poslije "klika" na taster, rezultat je sljede}i:
Objekat tipa Form:
Name = "Form1"Form1->Caption = "I/O"
Objekat tipa Edit:
Name = "Edit1"Edit1->Text == "Edit1"
Objekat tipa Label:
Name = "Label1"Label1->Caption = "Label1"
Objekat tipa Button:
Name = "Button1"Button1->Caption = "Ucitaj i Ispisi"
8/19/2019 Predavanja iz C++2009
21/152
21
10.2. U~itavanje / ispisivanje vrijednosti tipa String, cijeli broj i realni broj:
Kod koji u~itava i ispisuje
String:
//----------------------------void __fastcallTForm1::Button1Click(TObject *Sender)
{String s;s=Edit1->Text;Label1->Caption= "String: " + s;}//----------------------------
Kod koji u~itava i ispisuje
cijeli broj:
//----------------------------void __fastcallTForm1::Button1Click(TObject *Sender)
{int i;i=StrToInt(Edit1->Text);Label1->Caption= "i: "+IntToStr(i);}//----------------------------
Kod koji u~itava i ispisuje
realni broj:
//----------------------------void __fastcallTForm1::Button1Click(TObject *Sender)
{double f;f=StrToFloat(Edit1->Text);Label1->Caption=
"f: "+FloatToStr(f);}//----------------------------
8/19/2019 Predavanja iz C++2009
22/152
22
10.3. Upisivanje vi{e vrijednosti tipa String u listu:
Doga|aj "Click" nad objektom "Button1"
je iskodiran sljede}om funkcijom:
//--------------------------------------void __fastcallTForm1::Button1Click(TObject *Sender){ ListBox1->Items->Add(Edit1->Text);}//--------------------------------------
Doga|aj "Click" nad objektom "Button2"
je iskodiran sljede}om funkcijom:
//--------------------------------------void __fastcallTForm1::Button2Click(TObject *Sender){ ListBox1->Clear();}//--------------------------------------
Objekat tipa ListBox:
Name = "ListBox1"
8/19/2019 Predavanja iz C++2009
23/152
8/19/2019 Predavanja iz C++2009
24/152
24
Primjer upisivanja formatiranog teksta u promjenjivu tipa String:
Po{to je Caption osobina komponente Label1 tipa String, prethodni primjer se mo`e uraditi i nasljede}i na~in:
#include // zbog funkcije sprintf()
void __fastcall TForm1::Button1Click(TObject *Sender){ float X=12.3456789, Y=98.7654321; char temp[100]; String poruka;
sprintf(temp,"X=%6.2f Y=%6.2f",X,Y); poruka=temp;
Label1->Caption=poruka;
}
#include // zbog funkcije sprintf()void __fastcall TForm1::Button1Click(TObject *Sender){ float X=12.3456789, Y=98.7654321; char temp[100];
sprintf(temp,"X=%6.2f Y=%6.2f",X,Y);
Label1->Caption=temp;}
8/19/2019 Predavanja iz C++2009
25/152
25
Znakovni niz se iz promjenjive tipa String (AnsiString) mo`e dobiti kori{}enjem funkcije (metoda)c_str() koji se koristi kao u sljede}em primjeru:
#include void __fastcall TForm1::Button1Click(TObject *Sender){ String poruka; char zniz[100];
poruka=Edit1->Text; strcpy(zniz, poruka.c_str()); // kopiranje sadrzaja Stringa u znakovni niz
Label1->Caption=zniz;
8/19/2019 Predavanja iz C++2009
26/152
26
11. Jednostavna aplikacija
Prakti~an primjer: Kreirati program koji ra~una sumu dva cijela broja.
Algoritam
funkcije
Start
Stop
z=x+y
x, y
z
Izvorni kod
funkcije
Doga|aj "Click" nad objektom "Button1"
je iskodiran sljede}om funkcijom:
//--------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){int x,y,z;
x=StrToInt(Edit1->Text);y=StrToInt(Edit2->Text);
z=x+y;
Label3->Caption=IntToStr(z); // umjasto z moze x+y}//--------------------------------------------------
Deklaracija (rezervisanje mjesta umemoriji ra~unara) za promjenjivekoje }e se koristiti
Panel1Label3
8/19/2019 Predavanja iz C++2009
27/152
27
12. Grupisanje naredbi u blokove
Blok naredbi se defini{e postavljanjem zagrada "{" na po~etku i zagrade "}" na kraju bloka
naredbi. Blokovi naredbi mogu biti ugnje`deni, tj. jedan blok naredbi mo`e u sebi sadr`ati vi{e"podblokova naredbi". Mogu}e je vi{estruko ugnje`davanje blokova naredbi.
{ ########
{
########} ########
########{
########{
########}
########}
########}
Blokovi naredbi
########
8/19/2019 Predavanja iz C++2009
28/152
28
13. Tok izvr{avanja naredbi unutar funkcija
Naredbe u funkcijama se izv{avaju redno (pravolinijski) –tj. jedna za dugom onim redosljedom
kojim su navedene u funkciji.
Redno izvr{avanje naredbi funkcije se primjenjuje uglavnom za rje{avanje najjednostavnijihzadataka.
Za rje{avanje slo`enijih zadataka ~esto je neophodno ostvarivati izvr{avanje naredbi koje nijeredno, tj. omogu}iti da se poslije izvr{avanje jedne naredbe izvr{i neka koja se u kodu nalazi vi{emjesta ispred ili vi{e mjesta iza upravo izvr{ene.
Naredbe koje "remete" redni tok izvr{avanja naredbi u funkcijama djele se na: Naredbe koje vr{e grananje unaprijed u zavisnosti od vrijednosti upravlja~kog izraza. Nazivaju
se naredbama izbora (dono{enja odluke). Naredbe koje izazivaju grananje unazad u zavisnosti od vrijednosti upravlja~kog izraza.
Nazivaju se naredbama ponavljanja (petlje). Naredbe koje navode da izvr{avanje programa naglo (bezuslovno) sko~i na neku precizno
odre|enu naredbu koja nije napisana sljede}a po redu. Nazivaju se naredbe skoka.
Naredbe izbora i naredbe ponavljanja svoje izvr{avanje odre|uju logi~kom ta~no{}u upravlja~kogizraza.
Za izraze u "C++" programskom jeziku jo{ va`i da je 1 == TA^NO i 0 == NETA^NO.Tako|e va`i da se sve vrijednosti razli~ite od 0 podrazumjevaju kao ta~ne.
8/19/2019 Predavanja iz C++2009
29/152
29
14. Naredbe izbora
Naredba izbora bira jednu od dvije ili vi{e mogu}ih putanja izvr{avanja programa. Koriste se kao
naredbe za dono{enje odluka.
Osnovna naredba izbora u jeziku "C++" je naredba " if".
Prakti~an primjer: Kreirati program koji u~itava dva realna broja (djeljenik i djelilac) i {tampa
rezultat njihovog djeljenja ukoliko je djelilac razli~it od nule.
izraz
naredba iliblok naredbiif (izraz)
naredba iliblok naredbi
DANE
void __fastcallTForm1::Button1Click(TObject *Sender){ float a=StrToFloat(Edit1->Text); float b=StrToFloat(Edit2->Text);
if(b==0) Label1->Caption="Djeljenje sa nulom!");
if(b!=0) { float c=a/b; Label1->Caption=FloatToStr(c); }}
stop
a,b
b == 0
b != 0
c=a/b
Djeljenje sa nulom!!!
a/b=c
start
DA
DANE
NE
8/19/2019 Predavanja iz C++2009
30/152
30
Naredba "if" ima mogu}nost kori{}enja ~lana "else" koji pru`a ve}u fleksibilnost potrebnu zarealizaciju logike dono{enja odluke.
Prakti~an primjer: Kreirati program koji u~itava dva realna broja (djeljenik i djelilac) i {tampa
rezultat njihovog djeljenja ukoliko je djelilac razli~it od nule.
if (izraz)naredba1 iliblok naredbi1
elsenaredba2 iliblok naredbi2
izraz
naredba2 iliblok naredbi2
NE
naredba1 iliblok naredbi1
DA
void __fastcallTForm1::Button1Click(TObject *Sender){ float a=StrToFloat(Edit1->Text); float b=StrToFloat(Edit2->Text);
if(b==0) Label1->Caption="Djeljenje sa nulom!");
else { float c=a/b; Label1->Caption=FloatToStr(c); }} stop
a,b
b == 0c=a/b
Djeljenje sa nulom!!!
a/b=c
start
DA NE
8/19/2019 Predavanja iz C++2009
31/152
31
U jeziku "C++" omogu}eno je i vi{esmjerno grananje kori{}enjem ugnj`dene (uklopljene) uslovnenaredbe "if" odnosno naredbe "switch"
if(izraz==slucaj1)naredba1 ili blok naredbi1;
else if (izraz==slucaj2)naredba2 ili blok naredbi2;
else if (izraz==slucaj3)naredba3 ili blok naredbi3;
.............................else
naredbaN ili blok naredbiN;
switch (izraz) { case slucaj1 :
naredba1 ili blok naredbi1;break;case slucaj2 :
naredba2 ili blok naredbi2;break;case slucaj3 :
naredba3 ili blok naredbi3;break; ......................................
default :naredbaN ili blok naredbiN;
}
naredbaN iliblok naredbiN
izraz==slu~a1NE naredba1 ili
blok naredbi1
DA
izraz==slu~a2NE naredba2 ili
blok naredbi2
DA
izraz==slu~a3NE naredba3 iliblok naredbi3DA
................
8/19/2019 Predavanja iz C++2009
32/152
32
Prakti~an primjer: Kreirati program koji u~itava broja x i ispisuje "x==1" ukoliko je x jednako 1,"x==2" ukoliko je x jednako 2, "x==3" ukoliko je x jednako 3 odnosno "x 3" ukoliko je x manje od 1 ili ve}e od 3.
void __fastcallTForm1::Button1Click(TObject *Sender){int x;
x=StrToInt(Edit1->Text);
if(x==1) Label1->Caption="x==1";else if(x==2) Label1->Caption="x==2";else if(x==3) Label1->Caption="x==3";else Label1->Caption="x3";
}
void __fastcallTForm1::Button1Click(TObject *Sender){int x;
x=StrToInt(Edit1->Text);
switch (x) {
case 1 : Label1->Caption="x==1";break; case 2 : Label1->Caption="x==2";break; case 3 : Label1->Caption="x==3";break; default: Label1->Caption="x3"; }}
stop
x
start
x == 1
"x==1"
DANE
x == 2
"x==2"
DANE
x == 3
"x==3"
DANE
"x < 1 ili x > 3"
8/19/2019 Predavanja iz C++2009
33/152
33
Napomene za naredbu switch:
Poslije svakog "slu~aja" ("case") unutar naredbe "switch" potrebno je navesti naredbu"break" koja omogu}ava prekid daljeg izvr{avanja naredbe "switch". Ukoliko se izostavi
"break" iz nekog od "slu~aja", dolazi do pojave "propadanja", tj. izvr{avaju se bezuslovnosve naredbe do prve pojave naredbe "break" (ili ukoliko u naredbi "switch" nema "break",do kraja naredbe "switch").
Iza naredbe ili bloka naredbi koji prati "slu~aj" "default" ne treba stavljati "break" naredbu.
switch (izraz) { case slucaj1 :
naredba1 ili blok naredbi1;break;case slucaj2 :
naredba2 ili blok naredbi2;case slucaj3 :
naredba3 ili blok naredbi3;break; ......................................
default :
naredbaN ili blok naredbiN; }
naredbaN iliblok naredbiN
izraz==slu~a1NE
naredba1 iliblok naredbi1
DA
izraz==slu~a2NE naredba2 ili
blok naredbi2
DA
izraz==slu~a3NE naredba3 ili
blok naredbi3
DA
................
"propadanje"hvali "break" na kraju "slu~aja"
8/19/2019 Predavanja iz C++2009
34/152
34
15. Naredbe ponavljanja (petlje tj. cikli~ne naredbe)
15.1. Petlja "while"
Namjena naredbe (petlje) "while" je da obezbjedi izvr{avanje tijela naredbe sve dok upravlja~kiizraz ima vrijednost ta~no (tj. razli~ito od nule).
Prakti~an primjer:Kreirati program koji u ListBox upisuje cijelebrojeve od 0 do 9.
while (izraz)naredba ili blok naredbi;
izraz
naredba iliblok naredbi
DA
NE
void __fastcallTForm1::Button1Click(TObject *Sender){int i=0,granica=10;
while(iItems->Add(IntToStr(i)); i++; }}
stop
i< ranica
i++
i
start
DANE
i=0,granica=10
8/19/2019 Predavanja iz C++2009
35/152
35
15.2. Petlja "do"
Namjena naredbe (petlje) "do" je da obezbjedi izvr{avanje tijela naredbe barem jedanput, a zatim
da ponavlja izvr{avanje sve dok upravlja~ki izraz ima vrijednost ta~no (tj. razli~ito od nule).
Prakti~an primjer:
Kreirati program koji u ListBox upisujecijele brojeve od 0 do 9.
donaredba iliblok naredbi;
while (izraz);
void __fastcallTForm1::Button1Click(TObject *Sender){int i=0,granica=10; do
{
ListBox1->Items->Add(IntToStr(i)); i++; }while(i
8/19/2019 Predavanja iz C++2009
36/152
36
15.3. Petlja "for"
"for" petlja za razliku od "while" i "do" petlji na svom po~etku smje{ta upravlja~ke informacije.
Prakti~an primjer
: Kreirati program koji u ListBoxupisuje cijele brojeve od 0 do 9.
void __fastcallTForm1::Button1Click(TObject *Sender){int i,granica=10;
for(i=0; iItems->Add(IntToStr(i)); }}
stop
i< ranica
i++
i
start
DANE
granica=10
i=0
for(izraz1; izraz2; izraz3)naredba ili blok naredbi;
izraz2
naredba iliblok naredbi
DA
NE
izraz3
izraz1
8/19/2019 Predavanja iz C++2009
37/152
37
16. Naredba za zapo~injanje sljede}eg ciklusa petlje prije normalnog zavr{etka prethodnog ciklusa i
naredba za prinudno napu{tanje izvr{avanja ciklusa petlje:
Naredba "continue" unutar petlje primorava petlju da zapo~ne svoje sljede}e ponavljanje. Svenaredbe u tijelu petlje iza naredbe "continue" se preska~u. Naredba "break" unutar tijela petlje prekida rad petlje i sljede}a naredba koja se izvr{ava
poslije poziva naredbe "break" je prva naredba iza petlje.
Napomene za petlje:
Pod ciklusom petlje podrazumjevamo izvr{avanje naredbi sadr`anih u tijelu petlje.
Petlje "for", "while" i "do" su me|usobno kompatibilne po pitanju posla koji se sa njima mo`eodraditi. Petlja "for" je predvi|ena za slu~ajeve gdje imamo precizno zadat broj ponavljanja. Petlje "while" i "do" koristimo u slu~ajevima gdje je potrebno ponavljati odre|eni kod sve dok je uslov koji se u njima ispituje zadovoljen.
Razlika izme|u petlji while i do je u tome {to }e se kod iz tijela petlje "do" izvr{iti barem jednom bez obzira da li je uslov ispunjen, dok kod petlje "while" to nije slu~aj. Ovo jeposljedica razli~itih mjesta na kojem se ispituje uslov kod petlji "while" i "do".
Unutar pojednih izraza u "for" petlji, naredbe se razdvajaju zarezima: for(i=0,j=0; i
8/19/2019 Predavanja iz C++2009
38/152
38
17. Naredba skoka "goto"
Naredba skoka "goto" je bezuslovna. Naredba ska~e na mjesto u kodu koje je obilje`eno sa
odgovaraju}om labelom. Labela predstavlja mjesto u kodu programa koje ima svoje ime.
Napomene u vezi naredbe "goto":
Skakanje sa jednog mjesta u kodu programa na drugo kori{}enjem naredbe "goto" dozvoljeno je samo u okviru jednog bloka naredbi. U protivnom program ne}e raditi ispravno!!!
Ime labele mo`e biti bilo koji regularni "C++" identifikator. Upotrebu naredbe "goto" treba izbjegavati {to je vi{e mogu}e iz razloga ~itljivosti ipreglednosti programa.
naredbe1;
goto labela1;
naredbe2;labela1:
naredbe3;
naredbe1
naredbe2
naredbe3
8/19/2019 Predavanja iz C++2009
39/152
39
18. Funkcije –osnovni pojmovi
Svaka funkcija predstavlja blok naredbi koji ima svoje ime i koji se mo`e se izvr{iti pozivom
funkcije po imenu.
Koriste se radi optimizacije veli~ine koda programa u slu~ajevima kada je isti blok naredbi potrebnoponoviti vi{e puta u okviru programa (~esto i nad razli~itim podacima).
Od grupa srodnih funkcija mogu se praviti biblioteke funkcija koje omogu}avaju pozivanje tihfunkcija i u drugim programima.
fun(){
/* blok naredbi koji cini funkciju fun() */}
void __fastcall TForm1::Button1Click(TObject *Sender)
{ /* grupa naredbi 1 */
fun(); /* poziv bloka naredbi koji cini funkciju fun() */
/* grupa naredbi 2 */}
8/19/2019 Predavanja iz C++2009
40/152
40
18.1. Funkcije sa argumentima predatim po vrijednosti
Svaka funkcija preko svog imena mo`e vratiti vrijednost ~iji je oblik specificiran tipom funkcije.
Vrijednost koju funkcija vra}a preko svog imena zadaje se naredbom "return" koja se ujedno mo`ekoristiti i kao prisilni zavr{etak izvr{avanja bloka naredbi unutar funkcije. Ukoliko nije potrebno dafunkcija vrati vrijednost preko svog imena, funkcija se defini{e tako da joj je tip "void".
Vrijednosti argumenata se funkciji predaju unutar zagrada pri pozivu same funkcije.Funkcija prihvata predate vrijednosti i eventualno ih obra|uje.
U ovakvom slu~aju funkcija ne mo`e izmjeniti vrijednosti njoj predatih argumenata unutar
pozivaju}e funkcije.tip fun(tip argument_1, tip argument_2, ....){/* blok naredbi koji cini funkciju fun() */
return neka_vrijednost; /* dodjeljivanje vrijednosti imenu funkcije */}
void fun0(){tip argument1;tip argument2;
............../* grupa naredbi 1 */
x = fun(argument1, argument2, ....); /* poziv funkcije fun() */
/* grupa naredbi 2 */}
8/19/2019 Predavanja iz C++2009
41/152
41
18.2. Primjeri kori{}enja funkcija sa argumentima predatim po vrijednosti
Prakti~an primjer: Kreirati program na programskom jeziku "C" koji za dva cijela broja kori{}enjem
funkcije prora~unava njihov zbir i {tampa rezultat.
int suma(int a, int b){int c; c=a+b;
return c;}
void fun0()
{int a=2, b=5,c;c=suma(a,b);
Form1->Label1->Caption= IntToStr(c);}
int suma(int x, int y){int z; z=x+y;return z;
}
void fun0()
{int a=2, b=5,c;c=suma(a,b);
Form1->Label1->Caption= IntToStr(c);}
int suma(int x, int y){return x+y;
}
void fun0(){int a=2, b=5;
Form1->Label1->Caption= IntToStr(suma(a,b));}
Ove dvije promjenjive su potpuno nezavisne.Jedino {to im je zajedni~ko je vrijednost koja se pri pozivu
funkcije (suma()) prekopira iz promjenjive vidljive upozivaju}oj funkciji (fun0()) u promjenjivu koja je vidljivasamo u pozvanoj funkciji (suma()).
void suma(int x, int y)
{Form1->Label1->Caption= IntToStr(x+y);}
void fun0(){int a=2, b=5;suma(a,b);}
8/19/2019 Predavanja iz C++2009
42/152
42
18.3. Funkcije sa argumentima predatim po referenci
Funkcija mo`e da izmjeni vrijednost predatog argumenta, ukoliko je taj argument predat pozvanoj
funkciji po referenci.
Ukoliko je argument predat po referenci, isti memorijski prostor koji koristi argument u pozivaju}ojfunkciji bi}e dodjeljen odgovaraju}oj promjenjivoj u pozvanoj funkciji i na taj na~in je omogu}eno dapozvana funkcija promjeni vrijednost argumenta u pozivaju}oj funkciji.
U ovakvom slu~aju funkcija mo`e izmjeniti vrijednosti njoj predatih argumenata unutar pozivaju}efunkcije. tip fun(tip &argument_1, tip &argument_2, ....)
{/* blok naredbi koji cini funkciju fun() */
return neka_vrijednost; /* dodjeljivanje vrijednosti imenu funkcije */}
void fun0(){tip argument1;tip argument2;..............
/* grupa naredbi 1 */
x = fun(argument1, argument2, ....); /* poziv funkcije fun() */
/* grupa naredbi 2 */}
argument_1 i argument_2 su reference na promjenjiveargument1 i argument2, tj djele isti memorijski prostor (samo{to se u razli~itim blokovima naredbi druga~ije nazivaju)
8/19/2019 Predavanja iz C++2009
43/152
43
18.4. Primjeri kori{}enja funkcija sa argumentima predatim po referenci
Prakti~an primjer: Kreirati program na programskom jeziku "C" koji za dva cijela broja kori{}enjem
funkcije prora~unava njihov zbir i {tampa rezultat.void suma(int &x, int y){x+=y;
}
void fun0(){int a=2, b=5;
suma(a,b);
Form1->Label1->Caption= IntToStr(a);}
void suma(int a,int b,int &c){ c=a+b; return;}
void fun0(){int a=2, b=5,c;suma(a,b,c);
Form1->Label1->Caption= IntToStr(c);}
void suma(int x,int y,int &z){ z=x+y;return;
}
void fun0(){int a=2, b=5,c;suma(a,b,c);
Form1->Label1->Caption= IntToStr(c);}
Ove dvije promjenjive imaju isti memorijski prostor, iizmjena reference u pozvanoj funkciji }e promjeniti
vrijednost predatog argumenta u pozivaju}oj funkciji.
8/19/2019 Predavanja iz C++2009
44/152
44
18.5. Neposredno ugra|ivanje naredbi iz tijela funkcije u kod programa
Ukoliko se ispred definicije funkcije navede slu`bena rije~ inline, prevodilac }e poku{ati (ukoliko jemogu}e) da sve naredbe iz tijela funkcije umetne direktno na mjesto poziva funkcije. Na ovaj na~inse ubrzava izvr{avanje programa (nema gubljenja vremena pri pozivu funkcija) ali se veli~inaprograma naj~e{}e zna~ajno uve}ava.
18.6. Podrazumjevane vrijednosti argumenata funkcija
Ukoliko se argumentima pri definisanju funkcije daju podrazumjevane vrijednosti, onda ih pri pozivunije potrebno navoditi osim ukoliko se `eli promjeniti podrazumjevana vrijednost argumenata.
Argumenti sa podrazumjevanim vrijednostima se navode poslije ostalih argumenata u definicijifunkcije.void fun(int i,int j=2, int k=3){}//---------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){int a=100,b=200,c=300;
fun(a,b,c); // kao da je pozvana funkcija fun(100,200,300)
fun(a,b); // kao da je pozvana funkcija fun(100,200, 3)
fun(a); // kao da je pozvana funkcija fun(100, 2, 3)
// fun(); // javlja gresku jer argument i nema podrazumjevanu vrijednost}
8/19/2019 Predavanja iz C++2009
45/152
45
18.7. Preklapanje imena funkcija
Programski jezik C++ omogu}ava definisanje vi{e funkcija koje imaju isto ime, ali razli~iti broj i/ili
tip argumenata. Koja }e se funkcija konkretno pozvati, zavisi od broja i tipa predatih argumenata.// Primjer preklapanja imena funkcija
void fun(float a,float b){}
void fun(int i,int j){}
void fun(int i)
{}
void fun(){}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){int i=1,j=2;float x=3.0,y=4.0;
fun();
fun(i);
fun(i,j);
fun(x,y);}
8/19/2019 Predavanja iz C++2009
46/152
46
18.8. Prototipovi funkcija
U programima napisanim na programskom jeziku "C++" mogu}e je definiciju neke funkcija smjestiti
prije ili poslije njihovog poziva.
Ukoliko se definicija funkcije smje{ta poslije njenog poziva, potrebno je "C++" prevodiocu prijeprvog poziva prototipom funkcije sao{titi tip funkcije i tip argumenata koji joj se predaju.Prethodno je neophodno da bi kompajler na ispravan na~in interpretirao poziv funkcija.
Prototip funkcije je isti kao i zaglavlje funkcije, sa tim {to nije neophodno navoditi imenaargumenata, ve} samo njihove tipove.
int suma(int,int); // prototip funkcije suma()
void fun(){int x,y,z;
z=suma(x,y); // poziv funkcije suma()}
int suma(int a,int b) // defincija funkcije suma()
int c; c=a+b;return c;
}
8/19/2019 Predavanja iz C++2009
47/152
47
19. Globalne i lokalne promjenjive (opseg va`enja)
Karakteristike promjenjivih:
Svaka promjenjiva ima dvije karakteristike: opseg (vidljivost) trajanje
Opseg ili vidljivost defini{e koji dio koda programa ima priustup promjenjivoj.
Trajanje specificira koliko dugo se promjenjiva zadr`ava u memoriji u toku izvr{avanja programa.
Globalne i lokalne promjenjive:
Promjenjive se mogu deklarisati (i inicijalizovati) prije bilo koje funkcije, ili u bloku naredbi prijenjihovog prvog pozivanja. Sa tog aspekta promjenjive dijelimo na globalne i lokalne.
Globalne promjenjive se deklari{u prije koda funkcija i vidljive su od mjesta deklarisanja dokraja koda programa. Postoje sve dok traje izvr{avanje programa. Imaju inicijalnu vrijednost 0ukoliko se druga~ije ne inicijalizuju.
Lokalne promjenjive su vidljive samo unutar bloka naredbi u kojem su deklarisane i to odmjesta deklaracije do kraja bloka. Postoje samo dok se izvr{avaju naredbe iz tog blokanaredbi. Nemaju inicijalnu vrijednost.
8/19/2019 Predavanja iz C++2009
48/152
48
int x=0; // globalna promjenjiva x je vidljiva u cijelom programu od// ovog mjesta pa do kraja programa
void fun(int z){ int y=1; // u funkciji fun() vidljive su globalna promjenjiva} // x (x==0) i lokalne promjenjive y (y==1) (od mjesta
// deklaracije do kraja bloka naredbi f-je fun()) i// z (z==2 zbog prenosa vrijednost 0+2 (x+y) iz// funkcije fun0())
void fun0(){int y=2; // u funkciji fun0() vidljive su globalna promjenjiva
// x (x==0) i lokalna promjenjiva y (y==2) (od mjesta // deklaracije do kraja bloka naredbi f-je fun0())
{int z=3; // u ovom "ugnjezdenom" bloku naredbi vidljive su// globalna promjenjiva x (x==0) i lokalne
} // promjenjive y (y==2) i z (z==3)
// poslije "ugnjezdenog" bloka naredbi unutar funkcijefun(x+y); // fun0() vidljive su globalna promjenjiva x (x==0)
// i lokalna promjenjiva y (y==2)}
8/19/2019 Predavanja iz C++2009
49/152
49
19.1. Zasjenjivanje globalih i lokalnih promjenjivih
Globalne i lokalne promjenjive mogu biti zasjenjene (redeklarisane) unutar nekog bloka naredbi
ukoliko se u tom bloku naredbi izvr{i deklaracija nove promjenjive sa istim imenom kao {to je imeve} postoje}e (vidljive) promjenjive.
U slu~aju redeklaracije neke promjenjive, nova promjenjiva sa istim imenom postoji dok seizvr{avaju naredbe iz bloka u kojem je deklarisana, a po zavr{etku rada sa tim blokom naredbi,nova promjenjiva nestaje i rad se mo`e nastaviti sa starom promjenjivom (i njenom neizmjenjenomvrijedno{}u).
int x=0; // globalna promjenjiva x (x==0) je vidljiva u cijelom programu// osim u blokovima naredbi u kojima je zasjenjena
void fun(int x) // lokalna promjenjiva x (x==3) zasjenjuje globalnu{ // promjenjivu x (x==0) unutar bloka naredbi funkcije fun()}
void fun0(){int x=1; // lokalna promjenjiva x (x==1) zasjenjuje globalnu promjenjivu
// x (x==0) unutar bloka naredbi funkcije fun0()
{int x=2; // lokalna promjenjiva x (x==2) u ugnjezdenom bloku naredbi// zasjenjuje lokalnu promjenjivu x (x==1) iz bloka naredbi
} // funkcije fun0()fun(3);}
8/19/2019 Predavanja iz C++2009
50/152
50
19.2. Pristup globalnoj zasjenjenoj promjenjivoj
Zasjenjenoj globalnoj promjenjivoj se mo`e pristupiti kori{}enjem operatora :: za razrje{enjedosega.
Primjer:
int x = 101; // globalno x
void fun()
{int x=202; // lokalno x int a,b;
a = x; // a==202
b = ::x; // b==101}
8/19/2019 Predavanja iz C++2009
51/152
51
20. Stati~ke i dinami~ke lokalne promjenjive
20.1. Dinami~ke (automatske) promjenjive:
Dinami~ke promjenjive su lokalne promjenjive koje nastaju u operativnoj memoriji izvr{avanjemnaredbe za nihovu deklaraciju.
Dinami~ke promjenjive nestaju zavr{etkom bloka naredbi u kojem su deklarisane. Inicijalna vrijednost dinami~kih promjenjivih je neodre|ena (zavisi od prethodnog sadr`aja
memorije koja im je dodjeljena za ~uvanje vrijednosti). Sve lokalne promjenjive su dinami~ke ukoliko se pri deklaraciji slu`benom rije~ju st ti ne
proglase stati~kim.
20.2. Stati~ke promjenjive:
Sve globalne promjenjive su stati~ke. Lokalne promjenjive koje ispred naredbe za deklaraciju imaju slu`benu rije~ st ti su stati~ke. Stati~ke promjenjive pri prvom deklarisanju imaju inicijalnu vrijednost jednaku nuli. Lokalne stati~ke promjenjive pri ponovnom deklarisanju u okviru nekog bloka naredbi (koji se
izvr{ava vi{e puta) zadr`avaju vrijednost koju su imale prilikom prethodnog zavr{etka togbloka.
8/19/2019 Predavanja iz C++2009
52/152
52
// primjer koriscenja statickih promjenjivih
void semafor(void)
{static int brojac=100,s=0; // nepotrebno je zadavati inicijalnu vrijednost 0
Form1->ListBox1->Items->Add( IntToStr(s%2) + " " + IntToStr(brojac) ); s++;brojac++;}
void fun(){int i; for(i=0;iListBox1->Items->Add( IntToStr(s%2) + " " + IntToStr(brojac) );
s++; brojac++;}
void fun(){int i; for(i=0;i
8/19/2019 Predavanja iz C++2009
53/152
53
21. Konverzija vrijednosti razli~itih tipova promjenjivih
Postoje dvije vrste konverzije vrijednosti razli~itih tipova promjenjivih:
eksplicitna konverzija implicitna konverzija
21.1. Eksplicitna konverzija
Eksplicitna konverzija se radi kori{}enjem operatora eksplicitne konverzije kao {to je prikazano usljede}em primjeru:
// Primjer demonstrira eksplicitnu konverziju
void fun(){float x=123.456, y=234.567;int i;
i=(int)x; // poslije ove naredbe i ima vrijednost 123
Form1->Label1->Caption=IntToStr((int)y); // ovom naredbom ce se u Label1 // ispisati cijeli broj 234
}
Operatori eksplicitne konverzijeU ovom slu~aju vr{e konverzijurealnih vrijednosti u cjelobrojne.
8/19/2019 Predavanja iz C++2009
54/152
54
21.2. Implicitna (automatska) konverzija:
Implicitnu konverziju vr{i programski jezik "C++" automatski ukoliko je mogu}e po utvr|enimpravilima. Na primjer, pri dodjeljivanju neke vrijednosti jednog tipa promjenjivoj drugog tipa, ukoliko
je mogu}e, vr{i se konvertovanje te vrijednosti u tip promjenjive kojoj se ta vrijednost dodjeljuje.
Primjer implicitne konverzije dat je u sljede}em primjeru:
// Primjer demonstrira implicitnu konverziju
void fun(){float x=123.456, y;
int i;
i=x; // poslije ove naredbe i ima vrijednost 123y=i; // poslije ove naredbe y ima vrijednost 123.000000
}
8/19/2019 Predavanja iz C++2009
55/152
55
Konverzija vrijednosti promjenjivih pri aritmeti~kim operacijama
C++ kompajler pri aritmeti~kim operacijama automatski konvertuje vrijednosti sljede}ih promjenjivih: Sve vrijednosti promjenjivih tipa char, unsigned char, signed char i short int pretvaraju se u
int. Vrijednosti promjenjivih unsigned short pretvaraju se u unsigned int. C++ jezik (kompajler) uvjek manji tip podatka pretvara u ve}i.
Primjer: Pri sabiranju promjenjive tipa int i promjenjive tipa float, vrijednost promjenjive tipa int sekonvertuje u vrijednost tipa float.
// primjer logicke greske pri djeljenju koja je posljedica nevrsenja konverzijevoid fun(){int i=5;float x;
x=i/2; // posto su sve vrijednosti u aritmetickom dijelu naredbe// cjelobrojne, prvo se vrsi aritmeticki dio naredbe (cjelobrojno// djeljenje) pa tek poslije toga konverzija rezultata u float// zbog dodjeljivanja
Form1->Label1->Caption=FloatToStr(x); // ovom naredbom u Label1 ce se // upisati vrijednost 2.000000}
8/19/2019 Predavanja iz C++2009
56/152
56
// primjer djeljenja bez logicke greskevoid fun()
{int i=5;float x; x=i/2.0; // prije aritmetickog dijela naredbe vrsi se konverzija prvog
// opranda u float, (drugi – 2.0 je vec zapisan u float formatu)// pa tek onda djeljenje dvije float vrijednosti
Form1->Label1->Caption=FloatToStr(x); // ovom naredbom u Label1 ce se // upisati vrijednost 2.500000}
// primjer djeljenja bez logicke greskevoid fun(){int i=5;float x; x=(float)i/2; // prije aritmetickog dijela naredbe vrsi se eksplicitna
// konverzija prvog opranda u float, (drugi – 2 je zapisan// u int formatu), zatim, implicitna konverzija vrijednoti// drugog operanda u float (2-->2.0) pa tek onda djeljenje
// dvije float vrijednosti
Form1->Label1->Caption=FloatToStr(x); // ovom naredbom u Label1 ce se // upisati vrijednost 2.500000}
8/19/2019 Predavanja iz C++2009
57/152
57
22. Definisanje sopstvenih tipova podataka
Definisanje sopstvenih tipova podataka se radi naredbom typedef.
23. Simboli~ke konstante - modifikator tipa podataka "const"
U programskom jeziku C++ dodavanjem kvalifikatora const na po~etku naredbi za definisanje(deklaraciju + inicijalizaciju) promjenjivih dobijaju se prave konstante, za razliku od programskog
jezika C u kojem su se dobijale promjenjive ~ije vrijednosti ne mogu da se promjene.
typedef int cijeli_broj;
void fun(){cijeli_broj i=55; // i je tipa "cijeli_broj" odnosno "int"}
// Primjer kori{}enja simboli~kih konstanti
const int DIM = 50;double niz[DIM];
8/19/2019 Predavanja iz C++2009
58/152
58
24. Tip podataka "void"
Funkcija koja ne treba da vrati vrijednost preko svog imena je tipa void. Ukoliko se izostavi tip
funkcije, podrazumjeva se tip int.
Funkciji koja nema argumente, u zagradama iza njenog imena se stavlja slu`bena rije~ void,mada to nije obavezno.
Neke funkcije vra}aju vrijednost tipa void koju je potrebno eksplicitno konvertovati u odgovaraju}i
tip podataka. Primjeri }e biti odra|eni kad se bude obra|ivalo dinami~ko alociranje memorije.
void fun(void) /* kod funkcije fun() */{Form1->Label1->Caption="Pozdrav!!!";
}
void fun0(void){fun(); /* poziv funkcije fun() */
}
8/19/2019 Predavanja iz C++2009
59/152
59
25. Pointeri (pokaziva~i)
25.1. Definicija pointera
Pointer je promjenjiva u koju se mo`e upisati adresa neke promjenjive (memorijskog objekta).Koriste se za indirektno pristupanje memoriji ra~unara, odnosno, za indirektno pristupanjememorijskim objektima.
25.2. Deklaracija pointera:
Pointer se deklari{e naredbom: tip_podatka * ime_pointera; Na primjer:
25.3. Dodjeljivanje vrijednosti pointerima:
NAPOMENA: Pointer treba da bude istog tipa kao i promjenjiva ~ijoj }e se vrijednosti indirektnopristupati pomo}u tog pointera. Druga~ije re~eno: pointer treba da bude istog tipa kao i promjenjiva~iju adresu taj pointer sadr`i –(tj. na koju taj pointer pokazuje).
void fun(){int i=15,*p;p=&i; // p "pokazuje" na i, tj. sadrzi adresu od iForm1->Lebel1->Caption=IntToStr(*p); // ispis onoga sto se nalazi na adresi
// upisanoj u p, a to je vrijednost// varijable i
*p=1155; // u memorijsku lokaciju cija se adresa sadrzi u promjenjivoj p,} // (tj., u promjenjivu i) upisuje se vrijednost 1155
int *p; // u promjenjivu p se moze upisati adresa neke int promjenjivefloat *p_float, *fptr;
8/19/2019 Predavanja iz C++2009
60/152
60
25.4. Primjer demonstrira direktan pristup vrijednosti upisanoj u promjenjivu preko imena
promjenjive i indirektan pristup vrijednosti promjenjive preko pointera koji sadr`i adresu promjenjive:
int i=55, *p, j;void fun(){p=&i;j=i;j=*p;
}
55 100
i pAdresa memorijskelokacije "i" je 100
"p" je promjenjiva (pointer)u koju je upisana adresapromjenjive "i"
U promjenjivu "p" je upisana adresa promjenjive "i"
"*p" predstavlja sadr`aj memorijske lokacije ~iji je adresaupisana u promjenjivu "p", a to je sadr`aj promjenjive "i"
8/19/2019 Predavanja iz C++2009
61/152
61
26. Funkcije sa pointerima kao argumentima, Simuliranje predaje argumenata po referenci
U programskom jeziku "C++" predaja argumenata funkcijama se vr{i po vrijednosti i po referenci.
Simulacija predaje argumenata po referenci se mo`e ostvariti kori{}enjem pointera, odnosnopredajom adresa memorijskih objekata ~ije vrijednosti funkcije eventualno mogu mjenjati.
// program racuna sumu dva broja koriscenjem funkcije// kojoj se neki od argumenata predaju kao pointeri
void funkcija(int a,int b,int *p_suma) // funkcija preko imena
{ // ne vraca vrijednost
*p_suma=a+b; // na adresu memorijske lokacije upisanu u// pointer p_suma upisuje se vrijednost (a+b)
return;}
void fun(){int x=12, y=15, z;
// z je promjenjiva ciju vrijednost funkcija
// treba da promjeni. Zbog toga se funkcijifunkcija(x, y, &z); // predaje adresa promjenjive z kako bi
// funkcija indirektno koriscenjem pointera// (u koji ce biti upisana adresa promjenjive z)// mogla izmjeniti sadrzaj promjenjive z.
Form1->Label1->Caption=IntToStr(z);}
8/19/2019 Predavanja iz C++2009
62/152
62
27. Reference (upu}iva~i)
Referenca u jeziku C++ je alternativno ime za neki memorijski objekat. Reference se pri definisanju
moraju inicijalizovati nekim objektom jer same nisu memorijski objekti, ve} samo "drugo" ime zaneki ve} postoje}i objekat.
Glavna primjena referenci je prenos argumenata u funkcije "po referenci" (tj. po adresi) iomogu}avanje mijenjanja vrijednosti tih argumenata.
NAPOMENA: U prethodnom primjeru se javlja preklapanje funkcija (imaju isto ime, ali razli~iteargumente).
void inkrement(int &a) {a++;} // predaja argumenta po referenci
void inkrement(int *a) {(*a)++;} // simuliranje predaje argumenta po // referenci koriscenjem pointeravoid fun(){ int x=1; int &r=x; // definisanje reference
r=101; // isto kao i x=101;
inkrement(&x); // x==102
inkrement(x); // x==103
}
8/19/2019 Predavanja iz C++2009
63/152
63
28. Nizovi promjenjivih (jednodimenzioni, dvodimenzioni . . . )
28.1. Jednodimenzioni nizovi podataka:
Deklarisanje jednodimenzionih nizova podataka:int niz[10];float f_niz[5];
Pristupanje pojedinim elementima jednodimenzionalnog niza se radi preko indeksa:niz[5]=255;f_niz[3]=123.456;
Deklaracija i inicijalizacija jednodimenzionih nizova podataka:int niz[10]={9,8,7,6,5,4,3,2,1,0};float f_niz[5]={123.456, 234.567, 345.678, 456.789, 567.890};
28.2. Dvodimenzioni nizovi podataka:
Deklarisanje dvodimenzionalnog niza podataka:int niz[3][4];
Pristupanje pojedinim elementima dvodimenzionalnog niza se radi preko indeksa:niz[2][1]=255;
Deklaracija i inicijalizacija dvodimenzionih nizova podataka:int niz[3][4]={{11, 10, 9, 8},{ 7, 6, 5, 4},{ 3, 2, 1, 0}};
8/19/2019 Predavanja iz C++2009
64/152
64
NAPOMENA: Indeks niza koji ima n elemenata u programskom jeziku C ima opseg od 0 do n-1.
// primjer generisanja niza slucajnih brojeva, njegovog sortiranja i ispisivanja
const int MAX=10; // simboli~ka konstanta MAX ima vrijednost 10int niz[MAX]; // deklaracija niza cijelih brojeva kao globalne promjenjive
void fun(){int i,j,t; randomize(); // inicijalizacija generatora slucajnih brojeva for(i=0;i0;i--) // sortiranje nizafor(j=0;jAdd(IntToStr(niz[i]));}
GENERISANO ListBox1:0192837465
9876543210
8/19/2019 Predavanja iz C++2009
65/152
65
29. Jednodimenzioni nizovi i pointeri:
Za nizove va`i da je ime niza jednako adresi prvog elementa niza.
Ukoliko se izvr{i deklaracija i naredba dodjeljivanja vrijednosti pointeru:
Va`i da je:
Gdje su: niz[i] - i-ti element niza (i je indeks koji ide od 0 do n-1 gdje je n broj elemenata niza)*(niz+i) - vrijednost koja se nalazi na memorijskoj lokaciji ~ija je adresa jednaka adresi po~etnog
elementa niza uve}anoj za veli~inu i elemenata niza
*(ptr+i) - vrijednost koja se nalazi na memorijskoj lokaciji ~ija je adresa jednaka adresi po~etnogelementa niza uve}anoj za veli~inu i elemenata niza ptr[i] - ukoliko je ime niza "niz" jednako adresi prvog elementa niza, po analogiji se mo`e
iskoristiti pointer ptr (~ija je vrijednost jednaka adresi prvog elementa niza) koji saindeksom i u srednjim zagradama iza imena pointera dohvata vrijednost i-tog elementaniza.
int niz[10];int *ptr;
ptr=niz; /* Ova naredba je identicna sa : ptr=&niz[0] jer je (niz == &niz[0]) */
niz[i] == *(niz+i) == *(ptr+i) == ptr[i]
8/19/2019 Predavanja iz C++2009
66/152
66
Prakti~na demonstracija upotrebe pointera u radu sa nizovima je data u primjeru:
void fun(){int niz[2]={10,11};
int *ptr;
ptr=niz;
// slijedi ispisivanje istog niza na cetiri razlicita nacina Form1->ListBox1->Items->Add(IntToStr( niz[0])+" "+IntToStr( niz[1]) ); Form1->ListBox1->Items->Add(IntToStr(*(niz+0))+" "+IntToStr(*(niz+1)) ); Form1->ListBox1->Items->Add(IntToStr(*(ptr+0))+" "+IntToStr(*(ptr+1)) ); Form1->ListBox1->Items->Add(IntToStr( ptr[0])+" "+IntToStr( ptr[1]) );
}
UPISANO U ListBox1:10 11
10 1110 1110 11
8/19/2019 Predavanja iz C++2009
67/152
67
30. Strukture podataka
30.1. Definicija strukture
Strukture predstavljaju slo`ene tipove promjenjivih (memorijske objekte) sastavljene od jednostavnijih tipova promjenjivih.
Definicija strukture, inicijalizacija i dodjela vrijednosti elementima struktura se radi kao u primjeru:
struct str // DEFINICIJA tipa strukture nazvanog "str"{ char c;
int i; };
str s1,s2={'A',123}; // DEKLARACIJA dvije strukture (s1 i s2) tipa "str" // i inicijalizacija strukture s2
void fun(){
s1.c='A';s1.i=s2.i+321; // DODJELA VRIJEDNOSTI pojednim elementima struktura
}
8/19/2019 Predavanja iz C++2009
68/152
68
30.2. Pristupanje elementima strukture kori{}enjem pointera na strukturu se radi kao u primjeru:
30.3. Pristupanje elemntima pojedinih struktura koje sa~injavaju niz struktura se radi kao u
primjeru:
struct str // Deklaracija strukture s i pointera na strukturu sp
{ char c; // tipa "str"int i; } s, *sp;void fun(){char cc,ii;
s.c='A'; s.i=1; cc=s.c; ii=s.i; // direktan pristup elementima strukture
sp=&s; // u pointer sp upisuje se adresa strukture s
cc=sp->c; ii=sp->i); // posredan pristup elementima strukture } // preko pointera na strukturu
struct str // Deklaracija niza struktura niz_s tipa "str"
{ char c; int i; } niz_s[2];void fun(){
niz_s[0].c='A'; niz_s[0].i=1; niz_s[1].c='B'; niz_s[1].i=2;}
8/19/2019 Predavanja iz C++2009
69/152
8/19/2019 Predavanja iz C++2009
70/152
70
32. Fizi~ki prikaz deklarisanih promjenjivih u memoriji
short i, j;float x=12.3, *p_float;struct S3D {
char c; short i; float x; } s, *s_ptr;
i j x p_float s.c s.i s.x s_ptr
short n [10], *p;
n[0] n[1] n[2] n[3] n[4] n[5] n[6] n[7] n[8] n[9] p
8/19/2019 Predavanja iz C++2009
71/152
71
33. Datoteke
33.1. Pointer na datoteku
Ponter na datoteku predstavlja promjenjivu kojoj se mo`e dodjeliti fizi~ka datoteka na disku. Poslijedodjeljivanja datoteke pointeru, sva dalja manipulacija sa datotekom se odvija kori{}enjem pointera.
Deklaracija pointera na datoteke se radi naredbom:FILE *fp, *file, *datoteka, *fpinput, *fpoutput, *fpappend, ... ;
33.2. Funkcije za otvaranje / kreiranje datoteka
Otvaranje / kreiranje datoteke i dodjela datoteke pointeru na datoteku se radi naredbom:fp=fopen(ime_datoteke,mod);
"ime_datoteke" je string koji sadr`i fizi~ku adresu datoteke (na pr.: " C:\\TEMP\\TEST.DAT ")"mod" je string koji se sastoji od sljede}ih znakova:
- r Otvaranje za ~itanje- w Kreiranje za upis- a Dopisivanje na kraj datoteke- + Simbol dodavanja koji omogu}ava pristup za ~itanje i upis- b Otvaranje u binarnom modu- t Otvaranje u tekst modu
Ukoliko je vrijednost pointera "fp" razli~ita od vrijednosti NULL, datoteka je otvorena / kreirana.
8/19/2019 Predavanja iz C++2009
72/152
72
33.3. Funkcije za upisivanje u datoteku:
fputc(c,fp) Upisuje znak "c" u datoteku kojoj je pridru`en pointer "fp".
fprintf(fp,format,argumenti) Vr{i formatirani upis u datoteku kojoj je pridru`en pointer"fp". Sadr`aj datoteke je sli~an sadr`aju ekrana poslijeispisa funkcijom printf().
33.4. Funkcije za ~itanje iz datoteke:
fgetc(fp) Preko svog imena vra}a teku}i znak iz datoteke kojoj jepridru`en pointer "fp".
fscanf(fp,format,adrese_argumenata) ^ita vrijednosti iz datoteke kojoj je pridru`enpointer "fp" i dodjeljuje ih argumentima u skladusa stringom "format". Radi sli~no funkcijiscanf().
33.5. Funkcije za zatvaranje datoteka:
fclose(fp) Zatvara datoteku kojoj je pridru`en pointer "fp"
fcloseall() Zatvara sve otvorene datoteke
8/19/2019 Predavanja iz C++2009
73/152
73
33.6. NAPOMENE za rad sa datotekama:
Preporu~je se upotreba sljede}ih funkcija u parovima:
fputc() i fgetc()
fprintf() i fscanf()
...
Prethodno zna~i da ukoliko je u datoteku vr{en upis kori{}enjem fprintf, najlak{e je is~itatifunkcijom fscanf itd.
Ukoliko je datoteka otvorena za ~itanje ili upisivanje, teku}a pozicija u datoteci se nalazi napo~etku datoteke, a ukoliko je otvorena za dopisivanje, teku}a pozicija se nalazi na kraju datoteke.
Upis i ~itanje iz datoteke se vr{i po~ev{i od teku}e pozicije u datoteci.
Svakim upisivanjem ili ~itanjem datoteke vr{i se pomjeranje teku}e pozicije iza upisanog ilipro~itanog sadr`aja.
Teku}a pozicija se mo`e mjenjati funkcijama kao {to su: rewind(), fseek() itd...
Zadnji znak datoteke je EOF (End of File).
8/19/2019 Predavanja iz C++2009
74/152
74
33.7. Formatirani upis u datoteke i formatirano ~itanje iz datoteka
fprintf() - Formatirani upis u datoteku Navodi se u sljedecem obliku:
fprintf (fp, " format ", argument1, argument2, ..... );
fp je pokaziva~ na strukturu FILE, tj. na datoteku
" format " je niz znakova koji }e biti upisan u datoteku sa tim {to }e svi specijalni znaci u njemubiti zamjenjeni ili svojim zna~enjem ili vrijednostima odgovaraju}ih argumenta navedenih poredosljedu u listi argumenata iza " format " niza znakova.
Argument je promjenjiva (njena vrijednost) koja se predaje funkciji.
Neki od specijalnih znakova su na primjer: Specijalni znaci za formatiranje teksta:
\n - prelazak u novi red\t - preskakanje 8 mjesta (znak TAB).....
Specijalni znaci za ispis odgovarajucih argumenata: %c - za ispis jednog slova (znaka - karaktera) %s - za ispis niza znakova (terminirani niz char-ova)
%d - za ispis cijelih brojeva %f - za ispis realnih brojeva %10.3f - za formatirani ispis realnih brojeva (za prikaz cijelog realnog broja je rezervisano
ukupno 10 mjesta ra~unaju}i i decimalnu ta~ku. Za decimalni dio je rezervisano 3 mjesta) %e - za eksponencijalni ispis realnih brojeva %g - za ispis realnih brojeva
8/19/2019 Predavanja iz C++2009
75/152
75
%x - za ispis heksadecimalnih brojeva %o - za ispis oktalnih brojeva %p - za ispis adresa memoriskih lokacija (tj. za pointere) .....
PRIMJERI KORI[]ENJA NAREDBE "fprintf()" UPISANO U DATOTEKU:
fprintf(fp,"Pozdrav studentima ETF-a"); Pozdrav studentima ETF-a
fprintf(fp," Pozdrav \n studentima \n ETF-a");PozdravstudentimaETF-a
fprintf(fp,"%d",101); 101
fprintf(fp,"Vrijednost broja iznosi %d",101); Vrijednost broja iznosi 101
int x=101;fprintf(fp,"Vrijednost broja x iznosi %d",x);
Vrijednost broja x iznosi 101
int x=101,y=23;fprintf(fp,"x=%d y=%d z=%d",x,y,123);
x=101 y=23 z=123
fprintf(fp,"Ime=%s broj=%d \n pol=%c koef=%f",
"Janko", 55, 'M', 5.5 );
Ime=Janko broj=55
pol=M koef=5.500000
fprintf(fp,"X=%f \n", 123.456789);fprintf(fp,"X=%.0f", 123.456789);
X=123.456789X=123
fprintf(fp,"X=%10.2f \n", 123.456789);fprintf(fp,"I=%10d", 123);
X= 123.45I= 123
8/19/2019 Predavanja iz C++2009
76/152
76
fscanf() - Formatirano u~itavanje iz datoteke
Navodi se u sljedecem obliku:
fscanf ( fp, " format ", & argument1, & argument2, ..... );
fp je pokaziva~ na strukturu FILE, tj. na datoteku
" format " je niz znakova koji je isti kao i " format " kori{}en pri upisu u naredbi "fprintf()".
Funkciji "fscanf()" se ne predaju argumenti, ve} njihove adrese u radnoj memoriji ra~unara. To seostvaruje operatorom "&".
"&argument" je adresa promjenjive kojoj }e funkcija "fscanf()" dodjeliti une{enu vrijednost.Neki od specijalnih znakova koji se koriste u formatu funkcije "fscanf()" su na primjer:
%c - za u~itavanje jednog slova (znaka - karaktera) %s - za u~itavanje niza znakova (terminirani niz char-ova) %d - za u~itavanje vrijednosti cijelog broja %f - za u~itavanje vrijednosti realnog broja
"fscanf()" u~itava vrijednosti iz datoteke, konvertuje ih u oblik naveden specijalnim znakom unutarformata i dodjeljuje ih argumentima ~ije su adrese navedene iza formata po redosljedu.
Funkcija "fscanf()" o~ekuje da dobije vrijednosti ba{ kao {to je to definisano formatom. Ukoliko seunesu neo~ekivani podaci, program mo`e po~eti da se "~udno" pona{a!!!
8/19/2019 Predavanja iz C++2009
77/152
77
PRIMJERI KORI[]ENJA NAREDBE
"fscanf()"
SADR@AJ DATOTEKE
KOJI SE UPRAVO ^ITA
REZULTAT IZVR[AVANJA
NAREDBE
int i;
fscanf(fp,"%d", &i);
10 i ima vrijednost 10
int i,j;fscanf(fp,"%d %d", &i, &j);
1020
i ima vrijednost 10 j ima vrijednost 20
int i,j;fscanf(fp,"%d %d", &i, &j);
10 20i ima vrijednost 10
j ima vrijednost 20
char znak;fscanf(fp,"%c",&znak);
M znak ima vrijednost 'M'
float x;fscanf(fp,"%d", &x);
123.456 x ima vrijednost 123.456000
8/19/2019 Predavanja iz C++2009
78/152
78
33.8. Primjer kreiranja datoteke za upis
void fun(){FILE *fp; // deklarisanje pokazivaca na datoteku
fp=fopen("C:\\TEMP\\OUTPUT.DAT"," w");// kreiranje (otvaranje) datoteke// "C:\TEMP\OUTPUT.DAT" za upis
if(fp== NULL) // provjera ispravnosti kreiranja datoteke{
Label1->Caption="Nemoguce kreiranje datoteke"; return; }
fprintf(fp,"Probna datoteka\n"); /*upis u datoteku */ fprintf(fp,"Zdravo !!!\n"); fprintf(fp,"%d + %d = %d\n",123,234,123+234); fputc('A',fp); fprintf(fp,"\nKraj upisa u datoteku...");
fclose(fp); /*zatvaranje datoteke */}
SADRZAJ DATOTEKE
C:\TEMP\OUTPUT.DAT:Probna datotekaZdravo !!!123 + 234 = 357AKraj upisa u datoteku...
8/19/2019 Predavanja iz C++2009
79/152
79
33.9. Primjer ~itanja iz postoje}e datoteke
void fun(){int i;float x;char niz[31],znak;FILE *fp; // deklarisanje pokazivaca na datpteku
fp=fopen("C:\\TEMP\\INPUT.DAT","r"); // otvaranje postojece datoteke// "C:\TEMP\INPUT.DAT" za citanje
if(fp== NULL) // provjera ispravnosti otvaranja datoteke{
Label1->Caption="Nemoguce otvaranje datoteke"; return; }
fscanf(fp,"%d %f\n",&i,&x); // citanje iz datotekeznak=fgetc(fp);
fclose(fp); // zatvaranje datoteke}
SADRZAJ DATOTEKE
C:\TEMP\INPUT.DAT:123 123.456A
PROMJENJIVA VRIJEDNOSTi 123x 123.456znak 'A'
8/19/2019 Predavanja iz C++2009
80/152
8/19/2019 Predavanja iz C++2009
81/152
8/19/2019 Predavanja iz C++2009
82/152
82
34. Dinami~ko alociranje (zauzimanje) i dealociranje (osloba|anje) memorije
Alokacija memorije predstavlja obezbje|ivanje potrebnih memorijskih lokacija u koje se mogu
upisivati podaci.Dianmi~ko alociranje memorije se radi u toku izvr{avanja programa tako {to program odoperativnog sistema tra`i i ukoliko je mogu}e dobija zahtijevanu koli~inu memorije. Po zavr{etkukori{}enja dinami~ki alocirane memorije, ona biva dealocirana tj. vra}ena operativnom sistemu.
Dinami~ko alociranje memorije u "C++" programskom jeziku se mo`e uraditi na dva na~ina: implicitno – deklarisanjem lokalnih (i privremenih) promjenjivih.
eksplicitno – tra`enjem memorije od operativnog sistema kori{}enjem operatora new ilifunkcije malloc().
Dealokacija (osloba|anje) dinami~ki alocirane memorije se mo`e uraditi na dva na~ina –uzavisnosti od na~ina kako je alocirana:
implicitno – ukoliko je memorija alocirana deklarisanjem lokalnih promjenjivih, ona }e bitidealocirana zavr{etkom bloka u kojem su promjenjive deklarisane.
eksplicitno – ukoliko je memorija alocirana kori{}enjem operatora new dealocira seoperatorom delete a ukoliko je memorija alocirana funkcijom malloc() dealocirase funkcijom free().
8/19/2019 Predavanja iz C++2009
83/152
83
U C++ programskom jeziku se za dinami~ko alociranje memorije preporu~uje upotreba operatoranew i delete, mada se i dalje mogu koristiti funkcije malloc() i free().
NAPOMENA: Memorija alocirana sa operatorom new ne smije se dealocirati funkcijom free(), kao{to se ni memorija alocirana funkcijom malloc() ne smije dealocirati operatorom delete. Uprotivnom, mo`e do}i do "neo~ekivanog" pona{anja programa i/ili operativnog sistema.
// Primjer implicitne alokacije memorije// koriscenjem deklaracije lokalnih promjenjivih
main(){char buffer[1000]; // deklaracija lokalnih promjenjivihint niz[500]; // koje "nastaju" deklaracijom i
// "nestaju" zavrsetkom bloka naredbibuffer[321]='A'; // u kojem su deklarisaneniz[123]=505;}
8/19/2019 Predavanja iz C++2009
84/152
84
34.1. Funkcije za dinami~ku alokaciju/dealokaciju memorije (malloc() i free())
Funkcija malloc() dinami~ki alocira koli~inu memorije ~ija se veli~ina u Bajtima predaje funkciji kaoargument, a funkcija vra}a pointer na alociranu memoriju tipa void* koju treba eksplicitno
konvertovati u potreban tip memorije.Ukoliko funkcija malloc() preko svog imena vrati vrijednost NULL, to zna~i da ne postoji raspolo`ivakoli~ina memorije koju je mogu}e alocirati.
// Primjer eksplicitne alokacije memorije koriscenjem funkcija malloc() i free()void fun(){char *buffer; int *niz;
buffer=(char *)malloc(1000*sizeof(char)); // dinamicka alokacija memorije
if (buffer==NULL) // provjera dali je memorija alocirana{ Label1->Caption="Nemoguca alokacija memorije";
return;}
niz = (int *)malloc( 500*sizeof(int) ); // dinamicka alokacija memorijeif (niz==NULL) // provjera dali je memorija alocirana
{ free(buffer); // dealokacija prethodno alocirane memorijeLabel1->Caption="Nemoguca alokacija memorije";return;
} buffer[321]='A'; niz[123]=505;free(buffer); // dealokacija (osloba|anje) dinamickifree(niz); // alocirane memorije}
85
8/19/2019 Predavanja iz C++2009
85/152
85
34.2. Operatori za dinami~ku alokaciju/dealokaciju memorije (new i delete)
Operator new i delete imaju zna~ajne prednosti nad funkcijama malloc() i free():
veli~ina dodjeljenog prostora kod kori{}enja operatora new se automatski odre|uje na osnovuveli~ine objekta koji se formira (kod funkcije malloc() veli~ina mora da se navede...)
tip vrijednosti operatora new je uvjek pokaziva~ na upravo formirani objekat (kod funkcijamalloc() povratni tip je void* koji se zatim eksplicitno konvertuje)
operatorom new mogu}e je postaviti po~etne vrijednosti formiranim objektima po `elji (funkcijamalloc() ne mo`e da inicijalizuje novoformirani memorijski objekat)
operatorom new mogu}e je formirati i nizove objekata, ali ih nije mogu}e inicijalizovati. ukoliko poku{aj alokacije memorije ne uspije (tj. operator new pointeru dodjeli vrijednost
NULL), dealokacija operatorom delete primjenjena nad pointerom (==NULL) je "bezopasna" (zaprogram i operativni sistem).
86
8/19/2019 Predavanja iz C++2009
86/152
86
// Primjer eksplicitne alokacije memorije koriscenjem operatora new i delete
void fun(){ int *broj = new int (123); // dinamicka alokacija memorije
// sa inicijalizacijom za// memorijski objekat tipa int (*broj==123)
char *buffer = new char[1000]; // dinamicka alokacija memorije za znakovni niz // inicijalizacija je nemoguca za nizove
int *niz = new int[500]; // dinamicka alokacija memorije za cjelobrojni niz
if (broj==NULL || buffer==NULL || niz==NULL) // provjera dali je memorija{ // alocirana
Label1->Caption="Nemoguca alokacija memorije";delete broj; // dealokacija "eventualno" alocirane
delete [] buffer; // memorije. Ukoliko neki od pointera delete [] niz; // ima vrijednost NULL, pokusaj dealokacije return; // nece izazvati nikakvu "stetu"
}
buffer[321]='A'; // "koriscenje" dinamicki alocirane memorije niz[123]=*broj; //
delete broj; // dealokacija memorije za pojedine (proste ili slozene)// dinamicki alocirane podatke
delete [] buffer; // dealokacija (oslobadjanje) dinamickidelete [] niz; // alocirane memorije za nizove podataka}
87
8/19/2019 Predavanja iz C++2009
87/152
87
NAPREDNI ULAZ / IZLAZ
Pregled ~esto kori{}enih komponenti (kontrola)
88
8/19/2019 Predavanja iz C++2009
88/152
88
1. Palete komponenti (kontrola)
Komponente su grupisane u paletama:
Standard Additional Win32 System Internet
Data Accsee Data Controls Decision Cube QReport Dialogs
Win 3.1 Samples ActiveX
Komponenta se postavlja na formu tako {to se: selektuje mi{em u paleti, a zatim se na povr{ini
forme pritiskom na lijevi taster mi{a i povla~enjem pritisnutog mi{a defini{e povr{ina koju }epostavljena komponenta zauzimati na formi.
Borland Builder Help za komponentu se dobija selektovanjem `eljene komponente i pritiskom nataster 'F1'.
Pojmovi: komponenta i kontrola
Sve kontrole su komponente, ali sve komponente nisu kontrole. Kontrole u odnosu na komponente imaju neke dodatne mogu}nosti kao {to su na pr.
prikazivanje podataka (Edit, Label, ListBox...).
Primjer komponente koja nije kontrola je Timer komponenta iz sistemske palete.
89
8/19/2019 Predavanja iz C++2009
89/152
89
2. "Standard" paleta komponenti:
Opis Standard komponenti:
1. MainMenu Kreira glavni meni bar za formu i njegove padaju}e (DropDown) menije
2. PopupMenu Kreira PopUp meni za komponente koje ga mogu pozvati3. Label Ispisuje tekst na formu
4. Edit Jednostavni linijski editor teksta
5. Memo Jednostavni vi{elinijski editor teksta
6. Button Taster kontrola
7. CheckBox Omogu}ava odabir ili odbacivanje neke opcije
8. RadioButton Omogu}ava odabir samo jedne od ponu|enih opcija
9. ListBox Lista zapisa u kojoj je mogu}e selektovati, dodavati i brisati zapise i kretati se kroz nju skrolovanjem
10. ComboBox Komponenta nastala kombinovanjem Edit komponente i padaju}e ListBox komponente.
11. ScrollBar Pomjeranjem kliza~a omogu}ava linearni odabir vrijednosti u zadatom opsegu
12. GroupBox Grupisanje logi~ki povezanih komponenti iscrtavanjem okvira sa porukom oko njih
13. RadioGroup Grupisanje radio tastera (samo jedan mo`e biti aktivan) iscrtavanjem okvira sa porukom oko njih
14. Panel Grupisanje logi~ki povezanih komponenti iscrtavanjem okvira oko njih
1 2 3 4 5 11 12 137 8 9 10 14
90
8/19/2019 Predavanja iz C++2009
90/152
90
2.1. MainMenu komponenta (Standard paleta)
MainMenu komponenta kreira glavni meni bar i njegove padaju}e (DropDown) menije za formu.
Pojedina polja glavnog injegovih padaju}ih menija seimenuju u osobini Items.
Povezivanje izbora iz menija safunkcijom se radi dvoklikom naizbor menija u prozoru povezanimsa osobinom Items ili u formi.
91
8/19/2019 Predavanja iz C++2009
91/152
91
2.2. PopupMenu komponenta (Standard paleta)
PopupMenu komponenta kreira PopUp meni za komponente koje ga mogu pozvati.
Pojedina polja PopUp menija (PopupMenu1) seimenuju u okviru osobine Items.Povezivanje izbora iz menija sa funkcijom se radisli~no kao i kod MainMenu konponente..
Desnom kliku mi{em nad
formom Form1 pridru`uje sePopUp meni PopupMenu1
92
8/19/2019 Predavanja iz C++2009
92/152
92
2.3. Label komponenta (Standard paleta)
Label komponenta se koristi za ispisivanje teksta na formu.
Pode{avanje sadr`aja ispisa se radi dinami~kom osobinom Caption:
void fun(void){ // "Form1->" je potrebno dodati u skoro
// svim funkcijama koje je kreiraoForm1->Label1->Caption = "TEST"; // korisnik da bi se moglo ispravno
// pristupiti Label1 komponenti// koja se nalazi na Form1 formi
}
93
8/19/2019 Predavanja iz C++2009
93/152
93
2.4. Edit komponenta (Standard paleta)
Edit komponenta se koristi kao jednostavni linijski editor teksta.
Osobina Text ove komponente sadr`i tekstualni niz znakova tipa String (AnsiString).
U ovu komponentu se mo`e vr{iti i upis tako|e kori{}enjem osobine Text.
Onemogu}avanje mjenjanja sadr`aja upisanog u Edit komponentu se posti`e upisivanjem vrijednostiFalse u osobinu Enabled.
void fun(){String poruka[30] = Form1->Edit1->Text;
}
94
8/19/2019 Predavanja iz C++2009
94/152
94
2.5. Memo komponenta (Standard paleta)
Memo komponenta se koristi kao jednostavni vi{elinijski editor teksta
Izmjena sadr`aja Memo komponente se najlak{e ostvaruje kori{}enjem metoda (funkcije) SelectAll()i osobina SelStart, SelLength i SelText.
Osobina Lines se koristi za zadavanjeinicijalnog sadr`aja Memo komponente.
void fun(void) // funkcija prepisuje u promjenjivu poruka sadrzaj Memo komponente{String poruka; // deklarisanje promjenjive tipa String (znakovni niz)Form1->Memo1->SelectAll(); // SelectAll() selektuje cijeli sadrzaj Memo komponenteporuka=Form1->Memo1->SelText;// upisivanje selektovanog teksta u promjenjivu poruka}
95
8/19/2019 Predavanja iz C++2009
95/152
Tekst u Memo komponenti se mo`e selektovati: kori{}enjem mi{a, kori{}enjem metoda (funkcije) SelectAll() (selektuje cijeli sadr`aj Memo komponente),
kori{}enjem osobina SelStart (od kojeg znaka po~inje selekcija) i SelLength (kolika je du`inaselekcije).
Selektovani tekst se mo`e dobiti kori{}enjem osobine SelText.
Selektovani tekst se mo`e zamjeniti novim tekstom ukoliko se osobini SelText dodjeli neki znakovniniz.
Dopisivanje na mjestu kursora u Memo kontroli se radi
dodjeljivanjem osobini SelText nekog znakovnog niza.
Brisanje sadr`aja Memo komponente se ostvaruje metodom Clear().
NAPOMENA za Edit komponentu:
Metode: SelectAll() i Clear() i osobine: SelStart, SelLength i SelText obja{njene za Memokomponentu postoje i za Edit komponentu.
void fun(void) // funkcija cita sadrzaj od 10-og// do 20-og znaka iz Memo komponente
{String poruka; // deklarisanje promjenjive tipa String (znakovni niz)Form1->Memo1->SelStart=10; // pocetak selekcije (prvi znak je na nultoj poziciji)Form1->Memo1->SelLength=10; // selekcija je dugacka 10 znakova (od 10-og do 20-og)poruka=Form1->Memo1->SelText; // poruka dobija vrijednost selektovanog teksta
poruka
96
8/19/2019 Predavanja iz C++2009
96/152
Upisivanje redova teksta u Memo komponentu se ostvaruje metodom Lines— >Add() kao usljede}em primjeru:
U~itavanje sadr`aja datoteke u Memo komponentu se ostvaruje metodomLines— >LoadFromFile():
void fun(void){String poruka="Pozdrav studentima VRS";
Form1->Memo1->Lines->Add (poruka); // upis teksta poruke u prvu liniju Form1->Memo1->Lines->Add (""); // upis "prazne" linije Form1->Memo1->Lines->Add ("0123456789");// upis niza znakova}
void fun(void){ // ucitavanje datoteke u Memo komponentu Form1->Memo1->Lines->LoadFromFile("C:\\AUTOEXEC.BAT");}
97
8/19/2019 Predavanja iz C++2009
97/152
Upisivanje sadr`aja Memo komponente u datoteku se ostvaruje metodomLines— >SaveToFile():
void fun(void){ // upisivanje sadrzaja Memo komponente u datoteku Form1->Memo1->Lines->SaveToFile("C:\\TEMP\\TEST.TXT");}
OVAJ TEKST CE BITI UPISAN U DATOTEKUC:\TEMP\TEST.TXT.
01234567890123456789001234567890
Sadr̀ a datoteke C:\TEMP\TEST.TXT:
98
8/19/2019 Predavanja iz C++2009
98/152
2.6. Button komponenta (Standard paleta)
Button komponenta je naj~e{}e kori{}ena komponenta za koju se vezuju u Windows okru`enjukorisni~ke aktivnosti. Naj~e{}i doga|aj za na koji se odaziva ova komponenta je "Click" mi{em.
Dvoklik na taster generi{e sljede}i kod (u kojem se mo`e smjestiti korisni~ki kod):
//---------------------------------------------------------------------------void __fastcall TForm1::Button4Click(TObject *Sender)
{// mjesto za korisnicki kod...
Button4->Caption="OK"; // ...// ...
}//---------------------------------------------------------------------------
Pode{avanje tipa ikarakteristika font-aza tekst upisan uCaption osobinu.
99
8/19/2019 Predavanja iz C++2009
99/152
2.7. CheckBox komponenta (Standard paleta)
Komponenta CheckBox omogu}ava odabir ili odbacivanje neke opcije.
void __fastcall TForm1::Button1Click(TObject *Sender){ if(CheckBox1->Checked==True) // ako je CheckBox cekiran Button1->Caption="CheckBox == Checked"; else // inace (CheckBox necekiran) Button1->Caption="CheckBox == UnChecked";}
100
8/19/2019 Predavanja iz C++2009
100/152
2.8. RadioButton komponenta (Standard paleta)
RadioButton komponenta omogu}ava odabir samo jedne od ponu|enih RadioButton opcija.
void __fastcall TForm1::Button1Click(TObject *Sender){ if(RadioButton1->Checked==True)Button1->Caption="RadioButton 1"; if(RadioButton2->Checked==True)Button1->Caption="RadioButton 2"; if(RadioButton3->Checked==True)Button1->Caption="RadioButton 3";}
101
8/19/2019 Predavanja iz C++2009
101/152
2.9. ListBox komponenta (Standard paleta)
ListBox komponenta mo`e da sadr`i listu zapisa u kojoj je mogu}e selektovati, dodavati i brisatizapise i kretati se kroz nju skrolovanjem
Kori{}enjem osobine Items mogu}e je zadati inicijalni sadr`aj liste.
102
8/19/2019 Predavanja iz C++2009
102/152
Metode (funkcije): Items->Add() - koristi se za dodavanje novog zapisa u ListBox. Items->Delete(i) - koristi se za brisanje i-tog novog zapisa iz ListBox-a. Prvi zapis i=0
Clear() - slu ì za brisanje sadr`aja ListBox-a.Osobina: ItemIndex - ima vrijednost pozicije selektovanog zapisa u listi. Sorted - omogu}ava da sadr`aj ListBox-a bude sortiran prema Engleskoj
abecedi.
void __fastcall TForm1::Button1Click(TObject *Sender) {
ListBox1->Clear(); // brisanje sadrzaja liste
ListBox1->Items->Add(" c) zapis_c "); // upis u listu ListBox1->Items->Add(" b) zapis_b "); // ListBox1->Items->Add(" a) zapis_a "); // }
void __fastcall TForm1::Button2Click(TObject *Sender){ ListBox1->Sorted=True; //sortiranje liste po abecedi}
103
8/19/2019 Predavanja iz C++2009
103/152
Primjer kori{}enja ItemIndex:
void __fastcall TForm1::OnFormCreate(TObject *Sender){ ListBox1->MultiSelect = false; Button1->Caption = "Selektuj stavku i pomjeri je napocetak"; for (int i = 1; i Items->Add("Item " + IntToStr(i));}void __fastcall TForm1::Button1Click(TObject *Sender)
{ ListBox1->Items->Move(ListBox1->ItemIndex, 0);}
104
8/19/2019 Predavanja iz C++2009
104/152
2.10. ComboBox komponenta (Standard paleta)
ComboBox komponenta je nastala kombinovanjem Edit komponente (u koju se ne mo`e upisivati) ipadaju}e ListBox komponente.
Omogu}ava da se iz padaju}e ListBox komponente odabere jedan od zapisa koji biva smje{ten uEdit komponentu.
Inicijalno zadavanje zapisa u Edit komponenti koja pripadaComboBox komponenti se posti`e upisom zapisa u osobinu Text.
Inicijalno zadavanje sadr`ajapadaju}e ListBox komponente kojapripada ComboBox komponenti seposti`e pomo}u osobine Items.
105
8/19/2019 Predavanja iz C++2009
105/152
Izabrana vrijednost (tipa String) u ComboBox komponenti se nalazi zapisana u Edit komponenti(koja pripada ComboBox komponenti) i dobija se iz osobine Text.
Dodavanje novog zapisa u padaju}u ListBox komponentu ComboBox komponente se ostvarujekori{}enjem metoda Items->Add().
Brisanje sadr`aja Edit komponente i padaju}e ListBox komponente koje pripadaju ComboBoxkomponenti se ostvaruje kori{}enjem metoda Clear().
void fun(void){ String poruka=Form1->ComboBox1->Text;}
106
8/19/2019 Predavanja iz C++2009
106/152
2.11. ScrollBar komponenta (Standard paleta)
ScrollBar komponenta pomjeranjem kliza~a omogu}ava linearni odabir vrijednosti u zadatomopsegu.
Donja granica, gornja granica i teku}a pozicija ScrollBar kliza~a se zadaju pomo}u osobina Min iMax i Position
.
Donja i gornja granica ScrollBar kliza~ase zadaju pomo}u osobina Min i Max.
Teku}a pozicija ScrollBar kliza~a sezadaje pomo}u osobine Position.
107
8/19/2019 Predavanja iz C++2009
107/152
void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
{ Label2->Caption=ScrollBar1->Position;}
Dvoklikom na ScrollBar komponentu,Borland Builder generi{e funkciju koja}e biti pozvana prilikom svekepromjene vrijednosti ScrollBar kliza~a.
108
8/19/2019 Predavanja iz C++2009
108/152
2.12. GroupBox komponenta (Standard paleta)
GroupBox komponenta omogu}ava grupisanje logi~ki povezanih komponenti iscrtavanjem okvira saporukom oko njih.
GroupBox komponenta omogu}ava formiranje vi{e razli~itih me|usobno nezavisnih grupa radiotastera na jednoj formi. Prethodno je bitno jer u okviru jedne grupe radio tastera samo jedan radiotaster mo`e biti "uklju~en".
GroupBox komponenta ima uglavnom estetsku ulogu...
109
8/19/2019 Predavanja iz C++2009
109/152
2.13. RadioGroup komponenta (Standard paleta)
RadioGroup komponenta omogu}ava grupisanje radio tastera (samo jedan mo`e biti aktivan)iscrtavanjem okvira sa porukom oko njih
Informacija o aktiviranom radio tasteru u RadioGroup komponenti se dobija ItemIndex osobinom.
Sadr`aj RadioGroup komponentese pode{ava osobinom Items.
110
8/19/2019 Predavanja iz C++2009
110/152
void __fastcall TForm1::Button1Click(TObject *Sender){ Button1->Caption=RadioGroup1->ItemIndex;}
111
8/19/2019 Predavanja iz C++2009
111/152
2.14. Panel komponenta (Standard paleta)
Panel komponenta omogu}ava grupisanje logi~ki povezanih komponenti iscrtavanjem panela ispodnjih. Funkcija Panel komponente je sli~na funkciji GroupBox komponente.
Panel komponenta (kao i GroupBox komponenta) mo`e da grupi{e RadioButton komponente.Grupe radio tastera koje su grupisane u razli~itim Panel komponentama i na formi, pona{aju seme|usobno nezavisno.
Panel komponenta ima uglavnom estetsku ulogu...
112
8/19/2019 Predavanja iz C++2009
112/152
3. "Additional" paleta komponenti:
Opis Additional komponenti:
1. BitBtn Taster kontrola (komponenta) koja mo`e sadr`ati sliku na svojoj povr{ini
2. Image Komponenta koja mo`e prikazati grafi~ku sliku na svojoj povr{ini
1 2
113
8/19/2019 Predavanja iz C++2009
113/152
3.1. BitBtn komponenta (Additional paleta)
BitBtn je taster kontrola (komponenta) koja mo`e sadr`ati bitmapiranu (BMP) sliku na svojojpovr{ini
Po svim ostalim osobinama, identi~na je sa Button komponentom.
Inicijalno zadavanje slike nakomponenti (tasteru) BitBtn se
radi osobinom Gluph
114
8/19/2019 Predavanja iz C++2009
114/152
void __fastcall TForm1::BitBtn1Click(TObject *Sender){
BitBtn1->Glyph->LoadFromFile("C:\\Windows\\Black Thatch.bmp");}
115
8/19/2019 Predavanja iz C++2009
115/152
3.2. Image komponenta (Additional paleta)
Komponenta Image se koristi za prikazivanje slika tipa BMP, ICO, EMF, WMF...
void __fastcall TForm1::Button1Click(TObject *Sender){Image1->Stretch = true; //za smjestanje cijele slike na povrs Image-a
//ucitavanje s