You are on page 1of 50

ALGORITMIISTRUKTUREPODATAKA Predavanje17/1/2010 11.

UvoduC++

http://www.riteh.hr/zav_katd_sluz/zr/nastava/asp

Prolapredavanja

Ponavljanje:pokazivaiuCu Analizaalgoritama Osnovnitipovipodataka

ADT:lista,stog,red

Rekurzijaiiteracija Sortiranjepodataka Stabla Grafovi

Grafovi Aplikacijeiprimjeri Definicijeiterminologija Implementacije Obilazakgrafa Pretraivanjeprvou irinu(BFS) Pretraivanjeprvou dubinu(DFS)

Sadrajpredavanja

UvoduC++

NekepromjeneuodnosunaC

komentari lokacijazadeklariranjevarijabli inicijalizacija promjenesapokazivaima tipbool referencakaoparametarfunkcije defaultparameters

C++standardinputandoutputprimjeri

Objektnoorijentiranoprogramiranje(OOP)

UvoduC++

C++

BjarneStroustrup(BellLabs,1979) upoetkunadogradnjaiproirenjeCjezika dodanesunovekorisnefunkcije danasjetozasebanjezik C++dobivaimepo++operatoru uvodiobjektnoorijentiranoprogramiranje(OOP),ali podravaidrugestiloveprogramiranja (multiparadigmprogramminglanguage)

UvoduC++

Preporuenaliteratura:
1)BjarneStroustrup:TheC++ProgrammingLanguage (ThirdEditionandSpecialEdition) TojereferentnaknjigaodautoraC++.

2)BruceEckel:ThinkinginC++ (knjigajedostupnabesplatnonawebu,googlearound...)

NekepromjeneuodnosunaC

KomentariuC++

Moesekoristitidosadanjioblikkomentara

/*komentar*/ prilikomprevoenjakadasretne//prevodiocignoriraostatak reda vrijedisamozatajred primjeri...

Poredtogamoesekoristiti//oblik

Deklariranjevarijabli

UC++varijablenemorajubitideklariranenapoetku bloka,prijekoda

moemomijeatideklaracijeikod

primjeri... Varijablebrojaiunutarpetlji

mogusedeklariratiunutarsekcijezainicijalizacijuforpetlje dobrapraksasvakiputkadasebrojakoristisamounutar petlje for (int i = 0; i < 5; i++) { printf(%d\n,i); }

varijablanepostojiizvanpetlje!

Inicijalizacijaelemenatapolja

Prilikomzadavanjapoetnelistevrijednostielemenata poljamogusekoristitiizrazi Vrijednostiseizraunajuzavrijemeizvravanja(runtime), prijeinicijalizacije Primjeri:


void main() { int n1, n2, n3; int *nptr[] = { &n1, &n2, &n3 };

Promjenesapokazivaima

void*

uCujedozvoljenoprebacivanjepokazivaadrugogtipau tipvoid*,uC++zaprebacivanjesemoraeksplicitnokoristiti castingnaredbainicijalizacije

primjeri:
int N; int *P = &N; void *Q = P; // nije dozvoljeno u C++ void *R = (void *) P; // ok

Promjenesapokazivaima

NULL

UC++sevienekoristivrijednostNULLveseuvijek jednostavnokoristi0(brojnula) primjer:

int *P = 0; // isto kao *P=NULL; if (!P) ... else ... // P je 0 (NULL) // P nije 0 (nije NULL)

bool

UCnepostojieksplicitnitippodatakazatrue/false (istinite/lane)vrijednosti C++uvoditippodatakabool

dodajusekonstantetrue(1)ifalse(0).

Realizirajuseimplicitnekonverzijeizostalihtipova podataka(int,char,...)usituacijamakadajetomogue:

vrijednostirazliiteod0sekonvertirajuutrue 0sekonvertirajuufalse

Operatori&&,||,!,==,!=,<,><=,>=kaoinekiizraziu naredbama(if,for,while...)traeivraajuvrijednostitipa bool

Referencakaoparametarfunkcije

C++uvodimogunostslanjaparametarafunkcijisa referencom

moguejepromijenitivarijablukojanijediofunkcijebezda jeistaposlanaprekopokazivaa parametarfunkcijejereferencaakostavimoudefiniciji funkcijenakontipaznak&(ne*) Type&pName

Parametarpostajedrugoimeistevarijable
void utrostruci(int& num) { // num postaje sinonim num = 3*num; // za varijablu u pozivu } int x = 5; utrostruci(x); // num postaje drugo ime za x

Referencanapokaziva

Sareferencamanemoramovieslatipokazivana pokaziva Primjer:


void InitList(LLStruct*& start) { start = 0; } LLStruct *ListStart; InitList(ListStart);

Referencanastrukturu

Mozemoistotakoimatireferencenastrukture Primjer:
struct TIME { int hours, minutes, seconds; }; void springForward(TIME& thetime) { thetime.hours += 1; } TIME currtime = {0, 0, 0}; springForward(currtime);

Predodreene(default)vrijednostiparametara

UC++semogudefiniratipredodreenevrijednosti parametrimafunkcija

pripozivufunkcijemoguseizostavitivrijednostizaneke parametrezakojesudefiniranedefaultvrijednosti namjestotihvrijednostikoristitieseonepredodreeneiz definicije moguejedaklepozvatifunkcijusapromjenjljivimbrojem argumenata PredodreenaVrijednostmoebitiiizraz(nesamokonstanta) moguimativieparametarasapredodreenomvrijednosti,ali morajubitizadnjiparametriufunkciji bitanjeredoslijed(moguizostavitiodnekogparametrado kraja,neusredini)

Format:TypeImeParametra=PredodreenaVrijednost

Pravila:

Predodreene(default)vrijednostiparametara
primjer

void fun(int a, float b = 2.0, int c = 3) { cout << a << << b << << c << endl; }

fun(1); fun(1,4.0); fun(1,5.0,6);

// Ispis 1 2.0 3 // Ispis 1 4.0 3 // Ispis 1 5.0 6

"Helloworld"uC

#include <stdio.h> int main() { printf("Hello, world!\n"); return 0; }

"Helloworld"uC++

#include <iostream> using namespace std; int main() { cout << "Hello, world!" << endl; return 0; }

C++standardinputandoutputprimjeri

#include<iostream> using namespace std; int main() { char Yes = y'; cout << Yes; return 0; }

C++standardinputandoutputprimjeri

#include<iostream> using namespace std; int main() { cout <<"Ovaj "<<"ispis "<<"je samo<< proba; return 0; }

C++standardinputandoutputprimjeri

#include<iostream> using namespace std; int main() { cout <<"Ovaj "<<"ispis "<<"je samo<< proba.; cout <<"Idemo u novi red.\n"; cout <<"Idemo u novi red." << endl; return 0; }

C++standardinputandoutputprimjeri

#include<iostream> using namespace std; int main() { int moj_int; cout << "Ubaci cijeli broj: "; cin >> moj_int; cout << "Ubacio si broj: " << moj_int << "\n"; }

C++standardinputandoutputprimjeri

#include<iostream> #include<string> using namespace std; int main() { string ime; cout << "Kako se zoves? "; cin >> ime; cout << "Bok " << ime << "\n"; return 0; }

Objektnoorijentiranoprogramiranje(OOP)

Uvodnenapomene

Razvojsoftvera

fazekojeseprolazetijekomrazvoja primjerprocesa premafunkcionalnosti premaobjektima Kojeproblemerjeava?

Kakostrukturiratisoftver?

ZatoOOP?

Razvojsoftvera

Uvodnenapomene

Razvojsoftvera a

source:FrancoGasperoni,http://www.adacore.com/http://libre.adacore.com/

Primjer

Razvojsoftvera a

source:FrancoGasperoni,http://www.adacore.com/http://libre.adacore.com/

Strukturasoftvera

Zatostrukturiratisoftver

Softversestrukturiraiorganiziradabi:

dijeliliposaonaviegrupaljudi olakalirazumijevanjepostojeegkoda omoguiliispravkesoftvera omoguilievolucijusoftvera ... slabavezameukomponentamasoftvera


Karakteristikeidealnesoftverskearhitekture

omoguavadijeljenjezadaa recikliranjekomponenti

nemaponavljanjafunkcionalnostiikoda(minimalna redundancija) minimiziranepotrebezaizmjenomkodakrozevolucijusoftvera minimiziranepotrebezaponovnimtestiranjemkrozevoluciju softvera

Zatostrukturiratisoftver

Zastvaranjenovogsoftveraidentificirajuse:

Strukturepodataka Operacije okooperacija>strukturiranoprogramiranje(SP) okostrukturapodataka>objektnoorijentiranoprogramiranje (OOP) razlikapostajevanaprilikomizmjeneinadogradnjesoftvera tosedogadakadatrebadodatinoveoperacijei/ilistrukture podatakauSPiliOOPprogram? zapromjeneuoperacijamaboljiizborjeSP zapromjeneustrukturamapodatakaboljiizborjeOOP

Softversemoestrukturirati:

SPvsOOP

Primjernaploi

SPvsOOP

Strukturiranoprogramiranje

programjeskupmanjihcjelina(funkcija)kojeizvravajuneki zadatak lowlevel,bliehardveru manjeapstraktno Variablesobjects Typesclasses orijentiranona'akciju'

Objektnoorijentiranoprogramiranje

programjeskuppojedinanihdijelova(objekata)kojisurauju jedansdrugim highlevel apstraktnije odgovaranapitanje'toraditi'ane'kakoraditi'

Razlikeukodu

slijed'procedura'
intmain() { intx,y,z; inta,b,c; a=f1(x); b=f2(y); c=f3(z); } intf1() { } intf2() { }

slijed'objekata'
intmain() { Aa; Bb; Cc; a.f1(); b.f2(); c.f3(); } ClassA { Intx; Intf1(); } ClassB { Inty; Intf2() } ClassC { Intz; Intf3(); }

intf3() { }

Proceduralprogramming
while(programming==art){ incr(pleasure); decr(bugs); incr(portability); incr(maintainability); incr(quality); incr(salary); }//livehappilyeverafter

source:http://www.compapp.dcu.ie/~renaat/

OOP

Osnovnipojmovi

Objekt Klasa Enkapsulacija(uahurivanje,omatanje) Nasljeivanje Polimorfizam

Terminologija

objekt

paketkojisadripodatkeiprocedure(metode) procedureuklasi,pruajunekuusluguvezanuuzobjekt zahtjevobjektudaizvrimetodu specifikacijazastvaranjeobjekata objektkojipripadaklasi skrivanjeinformacijaodstraneobjekta

metode

poruke(messages)

klasa

instanca

uahurivanje(encapsulation)

Primjer

NapisatiprogramkojieprihvaatitemperaturuuCelsiusi Fahrenheittermometarskojskaliteeispisivatiistuuobje skale Ulazfunkcijif()odprogramabitiedvaargumenta: stupnjevaiskala


double stupnjeva = 0.0; char skala = 'F';

Pozivfunkcije:
f(stupnjeva, skala);

Ispis:

cout << stupnjeva << skala;

Objektnoorijentiranorjeenje

Jednostavna'klasa':
classTemperatura{ public: doublestupnjeva; charskala; };

Dvijelanskevarijable(membervariables): stupnjevaiskala OvajednostavnaklasajeekvivalentnastrukturiuCu:


structTemperatura{ doublestupnjeva; charskala; };

Koritenjenoveklase

KlasaTemperaturasemoekoristitiistokaoistructuCu:
doublecelsius(Temperaturatemp){ doublecel; if(temp.skala==F)cel=(temp.stupnjeva32.0)/1.8; elsecel=temp.stupnjeva; returncel; } doublefahrenheit(Temperaturatemp){ doublefa; if(temp.skala==C)fa=temp.stupnjeva*1.8+32.0; elsefa=temp.stupnjeva; returnfa; }

Boljerjeenje

Problem:

lanskevarijablesuidaljeodvojeneodfunkcijakoje manipulirajutimvarijablama tefunkcijesuinstrinsinovezaneuznovitippodatka Temperatura

Rjeenjejespojitilanskevarijableifunkcijezajedno:
class Temperatura { public: void ispisi(); // member functions double celsius(); double fahrenheit(); double stupnjeva; char skala; // member variables

};

Pristuplanovimaklase

Istokaoikodstruct,koristiseoperator'.',alisadasemoe pristupatinesamojavnimvarijablamaobjekta,veijavnim funkcijama Primjer:


Temperatura t1; double a; a=t1.celsius(); t1.ispisi();

Funkcijasesadanazivametodaodobjekta Pozivfunkcijesesadanazivaslanjeporukeobjektu ispisi(t1)jesadapostalot1.ispisi();

Definicijalanskihfunkcija

Zadefiniranjelanskefunkcijeklase(classmemberfunction) koristiseoperator'::'
double Temperatura::celsius() { double cel; If (skala==F) cel= (skala-32.0)/1.8; else cel=stupnjeva; return cel; }

Temperatura::celsiusjepunoimefunkcije

Modifikatorividljivosti

Dosadasmoimalijavne(public)lanoveklase Javnimlanovimaklasemoesepristupatiiizvana,tj.ne samoudjelukodaunutarklase Modifikatorividljivosti:


public private protected

onjemunekidrugiput

'privatne'lanoveklasemogukoristitisamofunkcijekojesu lanoviklase.Drugdjenisuvidljive!

Zatitaiskrivanjepodataka(INFORMATIONHIDING,DATA PROTECTION) netoslinosmoprijemoglipokuatisalokalnim("privatnim")i globalnim("javnim")varijablama.

Novorjeenje

class Temperatura { public: void ispisi(); // member functions double celsius(); double fahrenheit(); private: double stupnjeva; char skala; };

// member variables

Modifikatorividljivosti

varijablastupnjevajeprivatnajersenalaziu'private'sekciji moejojsepristupatisamoulanskimfunkcijama:
doubleTemperatura::celsius(){ doublecel; if(skala==F)cel=(stupnjeva32.0)/1.8;//ok elsecel=stupnjeva; //ok returncel; }

nijemogue:
Temperatura t1; double a; a=t1.stupnjeva; // nije dozvoljeno

Indirektanpristupprivatnimpodacima

Mogusedefiniratijavnelanskefuncijezapristupprivatnim podacima:
class Temperatura { public: char getSkala(); void set(double noviStupnjeva, char noviSkala); void print(); double celsius(); double fahrenheit(); private: double stupnjeva;

// member functions

double getStupnjeva();

// member variables

char skala; };

lanskefunkcije
double Temperatura::getStupnjeva() { return stupnjeva; }

double Tempratura::getSkala() { return skala; }

double Temperatura::set(double d, char s) { stupnjeva = d; skala = s; }


Vidjelismodosada
klasajeskuplanskihfunkcijailanskihvarijabla objektjeinstancaklase nastructsemoegledatikaonaklasukojasadrisamo varijableitojavne javnimlanovimasemoepristupatiizvanasoperatorom'.' privatnilanovisevidesamoulanskimfunkcijama operator'::'sezoveScoperesolutionoperator

You might also like