US - Programski jezik C++ sa rešenim zadacima - Laslo Kraus

Embed Size (px)

Citation preview

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    1/413

    Programski jeziksa reenim zadacima

    Ranko Popovi

    Zona Kosti++C

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    2/413

    UNIVERZITET S INGIDUNUM

    Prof. dr Ranko Popovi

    Zona Kosti

    PROGRAMSKI JEZIK C++

    SA REENIM ZADACIMA

    Beograd, 2010.

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    3/413

    PROGRAMSKI JEZIK C++ SA REENIM ZADACIMA

    Autori:

    Prof. dr Ranko Popovi

    Zona Kosti

    Recenzenti:

    Prof. dr Dragan Cvetkovi

    Dr Boko Nikoli, docent

    Izdava:

    UNIVERZITET SINGIDUNUM

    Beograd, Danijelova 32www.singidunum.ac.rs

    Za izdavaa:

    Prof. dr Milovan Stanii

    Tehnika obrada:

    Ranko Popovi

    Dizajn korica:

    Aleksandar Mihajlovi

    Godina izdanja:

    2010.

    Tira:250 primeraka

    tampa:

    Mladost Grup

    Loznica

    ISBN: 978-86-7912-286-5

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    4/413

    Predgovor

    Knjiga Programski jezik C++ sa reenim zadacima, nastala je kaopratei materijal za kurseve koje su autori drali na UniverzitetuSingidunum (Fakultet za informatiku i raunarstvo i Fakultet zamenadment).

    Knjiga je orijentisana ka poslovnim aplikacijama i sadri veliki brojreenih zadataka sa objanjenjima.

    U dodatku knjige detaljno su opisana Microsoftova integrisanarazvojna okruenja Visual Studio C++ verzije 6 i 2008.

    Autori su uloili veliki napor da ova knjiga ne sadri greke. Svesugestije, korekcije i primedbe su vie nego dobrodole.

    - 3 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    5/413

    Sadraj

    Predgovor ....................................................................................................... 3Sadraj ........................................................................................................... 41. Uvod .......................................................................................................... 6

    1.1 Programski jezik C++ .......................................................................... 61.2 Proirenja programskog jezika C ......................................................... 71.3 Jednostavan C++ program ................................................................... 91.4 Celi brojevi i aritmetika ..................................................................... 16

    2. Realni brojevi, iteracije i donoenje odluka ............................................ 232.1 Realni brojevi ..................................................................................... 232.2 Iteracije (petlje) .................................................................................. 302.3 Donoenje odluke .............................................................................. 382.4 Pravila prioriteta ................................................................................ 42

    3. Koncept funkcije ...................................................................................... 493.1 Definicija funkcije ............................................................................. 493.2 Prosleivanje parametara po vrednosti .............................................. 523.3 Promenljive kao atributi .................................................................... 54

    4. Nizovi ...................................................................................................... 57

    4.1 Definicija niza .................................................................................... 574.2 Viedimenzionalni nizovi .................................................................. 645. Pokazivai ................................................................................................ 68

    5.1 Deklarisanje i inicijalizacija pokazivaa ........................................... 685.2 Pokazivai i nizovi ............................................................................. 71

    6. C-stringovi, pokazivai, nizovi, funkcije, korisniki definisani tipovipodataka i tabele .......................................................................................... 76

    6.1 Definicija i inicijalizacija stringa ....................................................... 766.2 String konstante i pokazivai ............................................................. 796.3 Nizovi stringova i pokazivaa ........................................................... 836.4 Pokazivai, reference na promenljive i funkcije ................................ 866.5 Nizovi i funkcije ................................................................................ 936.6 Stringovi i funkcije ............................................................................ 986.7. Korisniki definisani tipovi podataka i tabele ................................ 1106.8 Strukture .......................................................................................... 1126.9 Nizovi struktura: tabele .................................................................... 117

    7. Uvod u klase i objekte ........................................................................... 119

    7.1 Objekti, klase i objektno orijentisani sistemi ................................... 119

    - 4 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    6/413

    7.2 Uvod u string objekte ....................................................................... 1217.3 Donoenje odluka u radu sa stringovima ......................................... 1317.4 Funkcije i string objekti ................................................................... 1337.5 Primeri rada sa string objektima ...................................................... 1387.6 Nizovi stringova ............................................................................... 147

    8. Programerski definisane klase i objekti ................................................ 1488.1 Deklarisanje objekata i klasa............................................................ 1488.2 Konstruktor klase ............................................................................. 1508.3 Preklapanje konstruktora.................................................................. 1608.4 Destruktori ....................................................................................... 1648.5 Opte preklapanje funkcija i abloni funkcija .................................. 174

    9. Rad sa objektima .................................................................................... 1789.1 Korienje nizova, pokazivaa i dinamika alokacija memorije ..... 1789.2 Konstruktor kopije ........................................................................... 1859.3 Korienje rezervisane rei const u radu sa klasama ....................... 1979.4 Objekti, funkcije i pokazivai .......................................................... 2159.5 Dinamika alokacija objekata .......................................................... 2419.6 Statiki podaci lanovi i funkcije ..................................................... 247

    10. Nasleivanje ......................................................................................... 25610.1 Primeri nasleivanja i osnovna terminologija ................................ 25610.2 Polimorfizam .................................................................................. 27810.3 Apstraktne osnovne klase............................................................... 297

    11. Fajlovi .................................................................................................. 29911.1 Ulazno/izlazni tokovi ..................................................................... 29911.2 Procesiranje fajla karakter po karakter........................................... 32111.3 Sluajni pristup fajlu ...................................................................... 32511.4 Procesiranje binarnog fajla sekvencijalno...................................... 332

    12. Specijalne teme: Prijateljske funkcije, preklapanje operatora, makroi i

    inline funkcije ............................................................................................ 33812.1 Prijateljske (friend) funkcije .......................................................... 33812.2 Preklapanje osnovnih aritmetikih operatora ................................. 34412.3 Makroi i inline funkcije ................................................................. 359

    Dodatak A: Integrisano razvojno okruenje Microsoft Visual C++ .......... 365Dodatak B: Integrisano razvojno okruenje Microsoft Visual C++ 2008 . 394Reference: .................................................................................................. 412

    - 5 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    7/413

    1. Uvod

    1.1 Programski jezik C++

    Predmet Uvod u programiranje II uvodi u osnovne koncepteobjektno orijentisanog programiranja korienjem jezika C++.

    C++ jezik je jedan od najpopularnijih programskih jezika korienihza razvoj raunarskih aplikacija. Programski jezici se mogu svrstati u jezikeniskog i visokog nivoa. Jezici niskog nivoa su asembleri. Asembleridozvoljavaju programeru maksimalnu kontrolu raunarskog sistema.Asembleri se teko ue zato to su simboliki i programer mora da vodirauna o svim detaljima programa. Asemblerski programi su, takoe, tekiza odravanje i debagovanje. Asemblerski programi nisu portabilni, oni suspecifini za hardver i operativni sistem raunarske platforme za koju surazvijeni. Na primer, ne moe se direktno izvriti asemblerski programskijezik za PC na Macintosh platformi. Suprotno, jezici visokog nivoa, kao tosu COBOL, Visual Basic i Java su laki za uenje, odravanje i debagovanjeu odnosu na asemblere.

    C++ je jezik "srednjeg nivoa". Zadrava se kontrola nad raunaromkao kod asemblera i zadravaju se dobre strane jezika "visokog nivoa". C++

    je portabilan-prenosiv u smislu da se moe izvriti, sa minimalnimpromenama, na vie razliitih raunarskih sistema bez modifikacija. C++ je"mali" programski jezik. On ne sadri ugraene karakteristike prisutne udrugim programskim jezicima (npr. Visual Basic, ima oko 150 rezervisanihrei) koje dalje poveavaju portabilnost. C++ ima oko 70 kljunih rei.

    C++ je objektno orijentisano proirenje C programskog jezika.Dennis Ritchie je razvio C jezik u Bell-ovim laboratorijama 1972. godinekao pomo pri pisanju UNIX operativnog sistema za PDP-11 miniraunare.Bjarne Stroustrup je 1980. godine u AT&T Bell laboratorijama razvio C++jezik. Dok je C primer proceduralnog jezika, C++ vidi problem kao skupobjekata (svaki sa svojim osobinama i ponaanjima) koji meusobnointeraguju.

    Razlozi za uvoenje novog jezika bili su: zahtevi korisnika su sedratino poveali; bilo je neophodno poveati produktivnost programera;ponovna upotreba ranije napisanog koda; drastino poveani trokoviodravanja, ...

    Objektno orijentisano programiranje i C ++ kao odgovor daju:

    apstraktne tipove podataka, enkapsulaciju, nasleivanje, polimorfizam itd.

    - 6 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    8/413

    projektovanje nego na samu implementaciju (kodovanje). Razmilja senajpre o problemu, a tek naknadno o programskom reenju. Razmilja se o

    delovima sistema (objektima) koji neto rade, a ne o tome kako neto radi

    (obradu greaka). ANSI standard za jezik C++ usvojen je 1997. godine.

    Knjiga je podeljena na dva dela. U prvom delu, poglavlja od 1 do 6,dati su aspekti C++ jezika koji nisu objektno orijentisani. Ovo daje

    delu knjige, poglavlja od 7 do 12, uvode se objektno orijentisane ideje kroz

    razvoj objektno orijentisanog softvera. Na kraju knjige kao dodatak dat je

    kratak uvod u Microsoft Visual C++ okruenje kao integrisano razvojno

    6.0 i Visual studio 2008.

    1.2 Proirenja programskog jezika C

    Pored komentara /* i */ u jeziku C++ mogu da se koriste komentari

    biblioteci funkcija jezika C.

    Tip bool spada u grupu celobrojnih tipova, i postoji automatskabool

    false se pretvara u celobrojnu vrednost nula, a true u jedan.

    - 7 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    9/413

    Ako se promenljivoj tipa bool dodeljuje numerika vrednost, vrednost nulase pretvara u false, a bilo koja nenulta vrednost u true.

    Znakovne konstante, na primer A, u jeziku C++ su tipa chardok u

    jeziku C su tipa int. To dovodi do toga da se A i 65 razliito tretiraju, bezobzira to u sluaju korienja ASCII koda imaju istu brojanu vrednost. Ujeziku C te dve vrednosti ne mogu da se razlikuju ni pod kojim uslovima.

    U jeziku C++, dodavanjem modifikatora const na poetku naredbi zadefinisanje podataka dobijaju se prave konstante, pod uslovom da suinicijalizatori konstantni izrazi. Tako uvedeni identifikatori predstavljajusimbolike konstante koje mogu da se koriste i na mestima na kojima seizriito trae konstante.

    Deklarativne naredbe u jeziku C++ smatraju se izvrnim naredbama i

    mogu da se koriste bilo gde u programu gde su naredbe dozvoljene, a nesamo na poetku pojedinih blokova. Doseg uvedenih identifikatora seprotee od mesta definisanja do kraja bloka unutar kojeg su definisani.

    Identifikatori nabrajanja, struktura i unija u jeziku C++ mogu da sekoriste kao identifikatori tipa bez slubenih rei enum, struct, odnosno union,pod uslovom da su jedinstveni u svojim dosezima.

    Pokazivau na podatke poznatih tipova u jeziku C++ ne moe da sedodeli vrednost generikog pokazivaa (void*).

    U jeziku C argumenti su prenoeni funkciji iskljuivo po vrednosti.Da bi neka funkcija mogla da promeni vrednost neke spoljne promenljive,trebalo je preneti pokaziva na tu promenljivu. U jeziku C++ mogu je iprenos po referenci. Referenca ili upuiva je alternativno ime za nekipodatak. Reference mogu da budu formalni argumenti i vrednosti funkcije.

    Za potrebe dodele memorije u dinamikoj zoni memorije u vremeizvravanja programa, u jeziku C++ uvedeni su operatori new i delete.Veliina dodeljenog prostora pomou operatora new automatski se odreujena osnovu veliine podatka (kod funkcija iz C jezika malloc, calloc i realloc,

    veliina mora da se navede, obino primenom operatora sizeof).Za vrlo male funkcije, pozivanje funkcije i povratak iz funkcije moe

    da traje znatno due od izvravanja samog sadraja funkcije. Za takvefunkcije je efikasnije da se telo funkcije ugradi neposredno u kd na svakommestu pozivanja. To, pored utede u vremenu, esto znai i manji utroakmemorije. Treba dodati modifikatorinline na poetku definisanja funkcije.

    U jeziku C nije bilo mogue definisati dve funkcije sa istim imenom.Mehanizam preklapanja imena funkcija (eng.function overloading) u jeziku

    C++ omoguava da se srodnim funkcijama daju ista imena. Podpreklapanjem imena funkcija podrazumeva se definisanje vie funkcija sa

    - 8 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    10/413

    istim modifikatorima. Sve te funkcije mora da se meusobno razlikuju pobroju i/ili tipovima argumenata na nain koji obezbeuje njihovujednoznanu identifikaciju.

    Imenski prostori (namespace) slui za grupisanje globalnih imena uvelikim programskim sistemima u vie dosega.

    Objekat je neko podruje u memoriji podataka tokom izvravanjaprograma. To moe biti eksplicitno definisana promenljiva (globalna ililokalna), ili privremeni objekat koji nastaje pri izraunavanju izraza.Objekat je primerak nekog tipa (ugraenog ili klase), ali ne i funkcije.

    C++ je strogo tipizirani jezik, odnosno svaki objekat ima tanoodreeni tip. Kada se oekuje objekat jednog tipa, a koristi objekat drugog

    tipa, potrebno je izvriti konverziju tipova.1.3 Jednostavan C++ program

    Ciklus razvoja programa

    Da biste razvili program treba da uradite nekoliko koraka. Sledeihest koraka su tipini kada razvijate C++ program.

    Prvi korak: definisanje problema - veoma je vano da razumeteproblem koji pokuavate da reite. Budite sigurni da ste proitali paljivospecifikacije programa. Treba da znate koji su ulazni podaci i u kojoj formiti podaci treba da budu. Takoe, treba da znate kako treba procesiranje tihpodataka da bude uraeno. Na kraju treba da odredite koje oekivanerezultate i u kakvoj formi dobijate.

    - 9 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    11/413

    Drugi korak: dizajn programa - postoji vie naina da se opie dizajnprograma. Dva prosta metoda su dijagram toka i pseudokod. Dijagram tokaje grafiki opis dizajna programa koji koristi kombinaciju razliitih simbola.Pseudokod opisuje dizajn programa izbegavajui sintaksu programskogjezika naglaavajui dizajn reenja problema.

    Kada dizajnirate program, vano je da proverite njegovu logiku prenego to ponete da piete sam programski kd. Dizajner programa je estosuvie blizak sa dizajnom da bi video neke greke.

    Trei korak: pisanje koda - koraci 3, 4, 5 i 6 - se izvravaju u

    integrisanom razvojnom okruenju (eng. Integrated DevelopmentEnvironment, IDE). Primeri ovih okruenja su: Visual Studio.NET, BorlandEnterprise Studio (windows platforma), Code Forge (Linux okruenje),KDevelop (Unix okruenje).

    Pisanje koda programa u tekst editoru odgovarajueg programskogjezika, kao i kompajliranje, odnosno prevoenje izvornog programa ili sorskoda (eng.source) su sledei koraci.

    Korak 4: kompajliranje (prevoenje) i linkovanje (povezivanje)

    programa - jedini jezik koji dati raunar razume je njegov sopstvenimainski jezik. Instrukcije mainskog jezika su binarno kodirane instrukcije

    - 10 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    12/413

    (sastavljene od nula i jedinica) koje kau raunaru da treba da uradiodreeni zadatak, kao to je add (dodaj) 1 u registar. Svaki raunar ima svojsopstveni mainski jezik koji se meusobno razlikuju. Kako je mainskijezik binarni, teko je pisati kod i pronai greke u mainskomprogramskom jeziku. Poto raunar razume samo svoj sopstveni mainskijezik, on ne moe da direktno izvrava instrukcije programskih jezikasrednjeg i visokog nivoa. Raunar koristei program koji se zove kompajler(prevodilac), treba da prevede programe programskih jezika u ekvivalentneprograme mainskog jezika. PC bazirani C++ kompajler prevodi C++ u PCmainski jezik. Kompajler ne moe da prevede razliite jezike (kao to jeJava) i ne moe se koristiti na razliitim tipovima raunara (kao to je

    Macintosh).

    Kompajler ima dve glavne funkcije. Prvo, on proverava sintaksnegreke sors programa. Sintaksne greke su greke u pravopisu-gramatici

    - 11 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    13/413

    programskog jezika. Ako kompajler ne nae fatalne greke, on prevodisvaku instrukciju jezika visokog nivoa u jednu ili vie instrukcija mainskogjezika. Ova verzija sors programa na mainskom jeziku se zove objektni

    program.Mada je na mainskom jeziku, objektni program nije spreman zaizvrenje. Program moe da sadri reference, nazvane spoljne reference,prema drugim programima koje je korisnik napisao ili koje C++ kompajlerobezbeuje na korienje svim korisnicima sistema. U oba sluaja treba dakoristite program koji se zove linker da bi razreili ove spoljne reference.Linker nalazi druge programe koji su deo vaeg programa. Ovaj proces jelinkovanje-povezivanje. Linker proizvodi izvrivi kd (executable code).Ovo je program koji raunar izvrava.

    Korak 5: Izvravanje programa - kada se program kompajlira ilinkuje on moe i da se izvri preko ikone, menija ili komandne linije.

    Korak 6: testiranje i debagovanje programa - ak i kada se programizvrava ne znai da je korektan-ispravan. Program treba testirati podraznim uslovima i sa raznim podacima.

    Greke u ciklusu

    Greke koje se mogu pojaviti u razliitim koracima su: sintaksnegreke i upozorenja (eng. wornings), greke prilikom izvravanja (eng. run-time) i logike greke.

    Sledi kd prvog programa prikaz izlaza na displeju.

    // Vas prvi program u C++ koji ispisuje na monitoru (konzolni izlaz) tekstaulne//poruke

    #include using namespace std;

    int main(){

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    14/413

    Prve dve linije koda su komentari. Komentar poinje sa dvakaraktera // i nastavlja do kraja linije. Komentar nije izvrna naredba, sledi,kompajler ignorie sve od // do kraja linije.

    Prazne linije ili blank moete da postavite bilo gde u programu kako

    bi poveali preglednost programa.C++ program je kolekcija funkcija koje rade zajedno u cilju reenjaproblema. Svaki program mora da sadri funkciju main(). Ova funkcijakontrolie C++ program izvravajui C++ naredbe i druge funkcije. Re intkoja prethodi rei main() kae C++ kompajleru da main() proizvodi (vraa)celobrojnu vrednost.

    Svaki postupak se naziva izraz (eng. expression). Izraz koji sezavrava znakom taka-zapeta ";" naziva se naredba (eng. statement).Zanemarivanje znaka ; izaziva sintaksnu greku pri kompajliranju. Kada

    biste napisali glavni program na sledei nain, kompajler ne bi prijaviosintaksnu greku.

    int main(){ cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    15/413

    Poslednja naredba return zavrava izvrenje funkcije main() i aljeceo broj ija je vrednost 0 operativnom sistemu da bi pokazala da seprogram zavrio normalno.

    Kompajliranje C++ programa se izvodi u dva koraka. Prvo, programnazvan pretprocesor analizira C++ sors kod i izvrava sve pretprocesorskedirektive. Svaka direktiva poinje karakterom #. Drugi korak kompajliranjaje prevoenje programa u mainski kod.

    Direktiva #include kao rezultat ima zamenu linije koja sadri direktivu#include tekstom sadraja heder (eng. header) fajla koji je unutar zagrada < >,tako da on postaje deo vaeg programa i kao takav se prevodi sa naredbamavaeg programa.

    Heder fajlovi obino sadre informacije o konstantama, funkcijama,

    klasama i drugim C++ elementima koji se esto pojavljuju u C++programima. Heder fajl iostream (input/output stream), je jedan odstandardnih skupova sistemskih heder fajlova kojim je svaki od C++kompajlera snabdeven. Heder fajl iostream sadri informacije o standardnimulazno/izlaznim tokovima.

    Treba obratiti panju da se pretprocesorska direktiva

    #include

    ne zavrava sa ; zato to pretprocesorska direktiva nije naredba.

    Mehanizam prostora imena namespace (using namespace std)

    Kompajler C++ jezika koristi vie fajlova da bi napravio C++program koji se moe izvriti. Uz izvorni fajl, koji je program koji pieprogramer, kompajler koristi jedan ili vie heder fajlova, kao to je iostream ibiblioteke standardnih i korisniki definisanih funkcija za kreiranje izvrnog

    programa. Kako je mogue da vie programera uestvuju u pisanju koda,mogue je da koriste ista imena za potpuno razliite stvari. Ovo dovodi dokompajlerske greke. Da bi se to izbeglo, C++ obezbeuje mehanizamprostora imena namespace, koji deli imena koje programeri mogu da koristena dosege imena. Direktiva

    using namespace std;

    dozvoljava da koristimo u naim programima cout (i kasnije cin) bezpotrebe da piemo kd kao std::cout (i std::cin). Direktiva using u osnovi kae

    - 14 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    16/413

    da moemo direktno da koristimo sva imena unutarstd prostora imena (cout icin su dva takva imena).

    Sva standardom predviena zaglavlja sve globalne identifikatorestavljaju u imenski prostor std. Standardom je predviena mogunost dauskladitavanje standardnih zaglavlja ne bude (mada moe) u vidutekstualnih datoteka. Zbog toga imena standardnih zaglavlja ne sadreproirenja imena .h, to je uobiajeno u jeziku C.

    Rezervisane rei

    Do sada smo koristili rezervisane rei (kljune, slubene rei ili eng.

    keywords) kao to su int, using, namespace i return. One imaju posebno znaenjei predstavljene su u tri grupe:Prva grupa 32 slubene rei iz C jezika:

    auto const double float int short struct unsignedbreak continue else for long signed switch voidcase default enum goto register sizeof typedef volatilechar do extern if return static union while

    Sledea grupa 30 novih slubenih rei:asm dynamic_cast namespace reinterpret_cast trybool explicit new static_cast typeidcatch false operator template typenameclass friend private this usingconst_cast inline public throw virtualdelete mutable protected true wchar_t

    i poslednja grupa 11 slubenih rei koje se najee koriste za rad sa

    operatorima:

    and bitand compl not_eq or_eq xor_eqand_eq bitor not or xor

    Specijalne sekvence (escape sequences)

    Koristei endl kontroliemo prostor izmeu linija. Prostor izmeulinija moemo da kontroliemo koristei specijalnu sekvencu-simbol za novired. Svaka specijalna sekvenca poinje obrnutom kosom crtom (backslashcharacter \). Specijalna sekvenca koja postavlja kursor na poetak novog

    - 15 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    17/413

    reda na ekranu monitora je \n (eng. newline character). Sledee dve linijekoda proizvode isti efekat kao u prethodnom primeru:

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    18/413

    (ceo broj int, znak char i realni broj float i double) i korisniki definisanetipove. Iza tipa podatka dolazi ime promenljive i zavrni znak naredbe(taka zarez ";").

    Na primer, ovo je deklaracija promenljive:

    int i1;

    U ovoj deklaraciji, rezervisana re int znai da je promenljiva saimenom i1 tipa integer tj. ceo broj. Zavisno od platforme (platforma sesastoji od raunarskog hardvera, operativnog sistema i C++ kompajlera),ceo broj moe biti predstavljen sa dva bajta (16 bits, 216 = 65536 celih

    brojeva) ili sa etiri bajta (32 bits). Kod raunara koji skladite cele brojeveu etiri bajta, opseg int variabli je isti kao za tip long. Da bismo odredilikoliko bajtova raunar koristi za skladitenje promenljivih razliitig tipa,koristimo operatorsizeof.

    Promenljiva moe biti deklarisana bilo gde u programu pre njeneupotrebe.

    Vrednost promenljive je podatak uskladiten u odreenoj lokaciji umemoriji raunara. Deklarisanje promenljive ne daje promenljivoj odreenuvrednost. Deklarisanje samo rezervie prostor u memoriji za varijablu i

    pridruuje deklarisano ime toj lokaciji u memoriji. Pre nego to programsmesti podatke u promenljive, vrednost promenljive nije vana za program.U ovom sluaju, kaemo da varijabla sadri "ubre" (eng.garbage).

    Sledei program pita korisnika da ukuca ulazne vrednosti za celebrojeve, odradi odreenu aritmetiku i prikae rezultat na displeju. Programsadri sledee strukture: deklarie varijable, dobija podatke od korisnika,izvrava zahtevane aritmetike operacije sa podacima i prikazuje rezultate.

    // Ovaj program prikazuje koriscenje celih brojeva u C++.// Korisnik treba da ukuca ulazne vrednosti za 2 cela broja.// Rezultati aritmetickih operacija se prikazuju na izlazu.

    #include using namespace std;

    int main(){

    // Deklaracija promenljivihint i1,

    i2,sum,

    - 17 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    19/413

    difference,product,quotient,remainder;

    // Dobijanje podataka od korisnikacout > i1;cout > i2;

    // Izvrsavanje aritmetickih operacijasum = i1 + i2;difference = i1 - i2;product = i1 * i2;quotient = i1 / i2;

    remainder = i1 % i2;// Izlazni rezultaticout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    20/413

    operator, >>). Naredba cin >> i1; uzima ceo broj koji korisnik ukuca natastaturi kao odziv na prompt i smeta vrednost celog brojau varijablu i1.

    Celi brojevi koje korisnik ukuca na tastaturi se nealju odmah programu na procesiranje. Umesto togaraunar smesti karaktere u privremenu lokaciju zaskladitenje zvanu ulazni bafer. Raunar alje ove karaktereprogramu kada korisnik pritisne taster. Ovo nazivamopranjenje ulaznog bafera (eng.flushing the input buffer).

    Operator dodele ili pridruenja (eng. assignmentoperator) =, radi na sledei nain: raunar razvija izraz na

    desnoj strani operatora =, i dodeljuje rezultujuu vrednostvarijabli na levoj strani znaka =. Ime varijable mora dabude na levoj strani operatora dodele. Izraz na desnoj stranije celobrojna konstanta, koja moe biti pozitivna, negativnaili jednaka nuli.

    Aritmetiki operatori

    Izraz na desnoj strani operatora dodele ukljuuje jedan ili viearitmetikih operatora. Program koristi 5 osnovnih aritmetikih operatora:sabiranje (+), oduzimanje (-), proizvod (*), deljenje (/), i ostatak ili modul(%), iji su prioriteti i redosledi izraunavanja dati u sledeoj tabeli:

    Operatori Asocijativnost

    () sa leva na desno+ (unarni) - (unarni) sa desna na levo

    * / % sa leva na desno+ - sa leva na desno= sa desna na levo

    Reavanje problema sa celim brojevima

    // Napisati program koji izracunava ukupnu cenu delova i cenu rada

    #include #include using namespace std;

    - 19 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    21/413

    int main(){

    const int HOURLY_RATE = 44;int parts, // Cena delova

    hours, // Broj radnih satilabor, // Cena radatotal; // Ukupna cena za korisnika

    cout > parts;cout hours;cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    22/413

    prvo prikazuje string "Cena delova: " ("Cost of parts: ") sa blanko pozicijomnakon dvotake. Zatim, manipulator setw(5) kae cout-u da smesti sledeiuzorak u polje irine 5. Na taj nain variabla parts, ija je vrednost 239, jeprikazana u poslednje tri pozicije od pet pozicija polja kao na donjoj slici:

    Za drugu naredbu:

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    23/413

    using namespace std;

    int main(){

    const int HOURLY_RATE = 44;long parts, // cena delovahours, // broj radnih satilabor, // cena radatotal; // ukupna cena za korisnika

    // Unos ulaznih podatakacout parts;cout hours;// Izracunavanjelabor = HOURLY_RATE * hours;total = parts + labor;

    // Prikaz rezultatacout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    24/413

    2. Realni brojevi, iteracije i donoenje odluka

    2.1 Realni brojevi

    Realni broj, ili floating point, je broj koji ima decimalni deo, tj.decimalnu taku. Postoje dva tipafloating pointC++ podataka float i double.Sledee deklaracije definiu varijablu fl koja je tipa float i varijablu db koja jetipa double.

    float fl;double db;

    Dva floating point tipa se razlikuju u preciznosti (broj znaajnihcifara koje svaki tip skladiti) i koliini memorije koju svaki tip zahteva. Naveini raunara, promenljiva tipa float je veliine 4 bajta i ima preciznost od7 bitova. Promenljiva tipa double okupira 8 bajtova i ima preciznost 15cifara.

    Floating point promenljive mogu da se pojave u aritmetikimizrazima na isti nain kao i celobrojne varijable. Na primer, posmatrajmosledee deklaracije i dodele:

    double db1 = 3.14159,db2 = -83.01267,

    db3;db3 = 2 * db1 + db2;

    - 23 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    25/413

    Operator dodele daje varijabli db3 rezultat sa desne strane76.72949.Izraz sa desne strane operatora dodele sadri razliite tipove podataka. Prenego to uradi aritmetike operacije, raunar automatski konvertuje

    celobrojnu vrednost 2 u realan broj 2.0. Zatim raunar mnoi vrednost db1 sa2.0, to daje 6.28318. Konano, raunar dodaje ovaj rezultat vrednosti db2,to daje 76.72949. Raunar tada izvrava operaciju dodele vrednosti koja jena desnoj strani, promenljivoj db3 na levoj strani.

    Tip float ima preciznost samo sedam cifara, pa se ne moe tanoraditi sa vrednostima veim od 99.999,99. Zbog toga to veina modernihposlovnih transakcija ukljuuje brojeve vee od 100.000,00 evra, tip float jeneadekvatan.

    Problemi prilikom prikaza na displejudecimalnih brojeva koristei cout

    Objasniemo zbog ega se ukljuuju sledee tri linije koda.

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    26/413

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    27/413

    1728394.85

    1.65

    356.70

    Treba obratiti panju da ako je vrednost promenljive db 356.091,prikaz sa jednom decimalom ne utie na vrednost koja je uskladitena u db.Stvarna vrednost uskladitena u db je jo uvek 356.091.

    Napomena, preciznost i ios zastavice vae sve dok se ne resetuju. Dabismo promenili preciznost, prosto koristimo setprecision() ponovo sarazliitom vrednou. Da bismo resetovali ili ios::fixed ili ios::showpointflag,

    treba da postavimo resetiosflags(ios::fixed) ili resetiosflags(ios::showpoint) kod cout.// Ovaj program izracunava porez na promet i cenu stavke

    #include #include using namespace std;

    int main(){

    const double TAX_RATE = 0.0825;double base_price, // cena jednog delatax, // porez

    price; // prodajna cena (price + tax)

    //definisanje izlaza

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    28/413

    return 0;}

    Reavanje problema sa realnim brojevima

    // Ovaj program simulira jednostavnu kasu

    #include #include using namespace std;

    int main(){

    const double SALES_TAX_RATE = 0.0825;double meal_price, // cena obroka koju je uneo korisnik

    sales_tax, // iznos poreza na promettotal, // ukupno: meal_price + sales_taxamt_tendered, // iznos dobijen od korisnikachange; // kusur: amt_tendered - total

    // Definisanje izlazacout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    29/413

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    30/413

    Kada aritmetiki izraz sadri vie promenljivih tipa int ili long i viepromenljivih tipa float ili double, C++ automatski konvertuje sve promenljiveu tip double pre nego to izvri aritmetike operacije. Sledi, rezultat je tipadouble.

    Tip cast (nakon koga sledi izraz u malim zagradama) menja tippodatka vrednosti koja je ukljuena u odreeni tip, na primer

    int i = 5;double(i);

    kastuje-menja vrednost promenljive i, odnosno konvertuje vrednost i udouble 5.0.

    Kada se tip podatka sa desne strane znaka dodele razlikuje od tipapodatka promenljive sa leve strane, C++ konvertuje vrednost desne strane utip podatka varijable sa leve strane.

    Primeri iz aritmetike

    Svaki izraz u C++ ima numeriku vrednost.

    int h = 17;i,j,k;

    i = j = k = h;

    ili

    sum = (count = 0);sum = 0;

    Sloeni operatori dodele prikazani su: +=, -=, *= i /=.

    Operatori Asocijativnost

    () sa leva na desno+ (unarni) - (unarni) sa desna na levo

    * / % sa leva na desno

    + - sa leva na desno= += -= *= /= sa desna na levo

    - 29 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    31/413

    Operatori uveanja i umanjenja (eng. increment, decrement)poveavaju ili smanjuju vrednost promenljive za jedan. Mogu da se koristepre ili posle varijable sa prefiksom pre ili post. To su unarni operatori. Na

    donjoj slici je dat primer.Izraz

    j = 4 + -- i j = 4 + i --

    Inicijalna vrednost i je 7Upotrebljena vrednost i 6 7Dodeljena vrednostj 10 11Konana vrednost i 6 6

    2.2 Iteracije (petlje)

    Relacioni uslovi

    Razmotriemo sledee iteracije, odnosno petlje (while, do i for).Najprostiji tip uslova je relacioni uslov, koji uporeuje vrednosti dva

    operanda, koristei relacione operatore: ==, !=, =.U jeziku C++, ako je relacioni uslov true (tano), ceo uslov ima

    numeriku vrednost 1. Ako je relacioni uslovfalse (netano), ceo uslov imanumeriku vrednost 0. Sledi, C++ uzima svaku vrednost razliitu od nulekao true, a vrednost 0 kaofalse.

    Primer: koja vrednost promenljive rezult e biti odtampana nadispleju koristei donju tabelu?

    #include using namespace std;

    int main(){int i = 3,

    j = 8,k = 5,result;

    result = (i < j < k);cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    32/413

    Kompajler e upozoriti korisnika:

    warning C4804: '

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    33/413

    Beskonane petlje: while i do

    Petlja while

    Naredba ima sledei oblik:

    while (kontrolni-izraz)telo-petlje

    Kontrolni izraz, koji treba da bude u malim zagradama, moe bitibilo koji ispravan C++ izraz odnosno relacioni uslov. Telo petlje moe bitiprosta C++ naredba zavrena sa ";" ili moe biti sastavljeno iz vie naredbi

    koje se nalaze unutar velikih zagrada.Posmatramo sledei kd:

    int count = 0;while (count < 5){

    ++count;cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    34/413

    broji karaktere jedne linije koje korisnik unosi sa tastature. Linija je nizkaraktera zavrena sa return odnosno enter.Return nije deo linije i ne brojise kao karakter. Program ne zna unapred broj karaktera koje e korisnik daunese.

    Znakovna konstanta (eng. character constant) je prost karakterunutar jednostrukih znaka navoda. Na primer, 'A' i ';' su znakovne konstante.Moete da dodelite znakovnu konstantu promenljivoj tipa karakter (eng.character variable) na isti nain kao to se dodeljuje brojna konstantabrojnoj promenljivoj. Moete da incijalizujete promenljivu tipa karakter udeklaraciji

    char ch = 'A';

    Korienje cin.get()

    Ako deklariemo promenljivu tipa karakter

    char ch;

    Naredba koja pridruuje sledei karakter iz ulaznog toka varijabli ch

    je: ch = cin.get();

    Uslov u while naredbi odreuje kada petlja prestaje sa izvravanjem.U ovom programu, elimo da petlja prekine sa izvravanjem kada korisnikunese karakter za novi red '\n'. Sledi, petlja se izvrava sve dok je ispunjenuslov (ch != '\n').

    Prvi put kada program testira uslov petlje, promenljiva ch mora daima ispravno deklarisanu i definisanu vrednost.

    // Ovaj program broji karaktere sa ulaza koje korisnik unosi kao jednu liniju// Linija se zavrsava ukucavanjem return, koji se ne broji kao karakter

    #include using namespace std;

    int main(){

    char ch; // Koristi se da skladisti ulazni karakterint num_chars = 0; // Broji karakterecout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    35/413

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    36/413

    Proces se nastavlja sve dok izvrenje ch = cin.get() u telu petlje nedodeli ch karakter za novi red '\n', kada je uslovfalse.

    Efikasnije reenje umesto dela koda

    ch = cin.get(); // Uzima se prvi karakterwhile (ch != '\n'){

    ++num_chars;ch = cin.get();

    }

    je:

    while ( (ch = cin.get()) != '\n')++num_chars;

    do-while petlja

    while petlja testira uslov petlje pre nego to izvri telo petlje. Sledi,ako je uslov petlje netaan-false prvi put kada se testira, program nee daizvrava telo petlje. Ponekad je potrebno da se program izvri najmanje

    jednom pre nego to se testira uslov. Ova petlja se zove do-while, ili do,petlja.Format naredbe je:

    doloop bodywhile (uslov petlje);U prethodnom primeru deo koda napisan sa do-while naredbom je:

    do{ch = cin.get();++num_chars;

    }while (ch != '\n');--num_chars;

    Odreene petlje

    Kada se zna tano koliko esto program treba da izvrava telo petljekoristi se odreena iteraciona petlja, odnosno forpetlja.

    - 35 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    37/413

    for petlja

    Kada korisnik interaguje sa programom, ponekad je neophodno

    obrisati ekran monitora pre nastavka interakcije korisnika i programa.Jednostavan nain (koji nije i najbolji) je da se prikae onoliko novih linijakoliko treba da se pokrije ekran. Ako va monitor prikae 25 linija pomou25 karaktera za novi red reava se problem. Naalost, brojanje je jedininain da budemo sigurni da je sve u redu.

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    38/413

    Ugnjeene while petlje

    Telo petlje moe da sadri bilo koju C++ naredbu. Petlje suugnjeene kada telo petlje sadri drugu petlju.

    Kako da signaliziramo programu da ne elimo vie da unosimokataktere? C++ ima specijalnu simboliku konstantu EOF da bi se oznaiokraj ulaza koristei fajl. EOF je mnemonik koji znai "end of file, definisanu standardnom heder fajlu iostream. Vrednost EOF je sistemski zavisna, madaveina sistema koristi celobrojnu vrednost 1. U Windows-u, da bi se ubacilasa terminala korektna vrednost EOF, mora da ukucate ^Z; U UNIX/Linux-u,treba da ukucate ^D za vrednost EOF.

    // Ovaj program koristi ugnjezdjene while-petlje za brojanje// karaktera sa ulaza koje ukucava korisnik ali u vise linija

    #include using namespace std;

    int main(){

    int ch; // skladisti karakter koji unosi korisnik

    int num_chars = 0; // broji karaktere koji se unosecout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    39/413

    Promenljiva ch u koju se smeta karakter koji korisnik unosi prekotastature je tipa int umesto tipa char. Jedina razlika u skladitenju karakterarecimo 'a', u varijablu tipa int, umesto u varijablu tipa char, je da int varijabla

    zahteva 2 ili 4 bajta memorije dok promenljiva tipa karakter zahteva 1 bajt(dva bajta za Unicode karaktere) memorije. U oba sluaja karakter 'a' jeuskladiten kao ceo broj ija je vrednost 97.

    2.3 Donoenje odluke

    U jeziku C++ kd za donoenje odluke se pie koristei if naredbuiji je opti oblik:

    if (kontrolni-izraz)true-deoelse

    false-deo

    Rei if i else su C++ rezervisane rei. Takoe treba da ubacitekontrolni izraz u zagrade. True i false deo if naredbe moe biti bilo kojaprosta naredba zavrena sa ; ili sloena naredba.

    Sloeni uslovi koji sadre logike operatore

    Ponekad program mora da testira uslov koji je kombinacija drugihprostijih uslova. Moemo da kombinujemo proste uslove da bismo formiralisloene uslove koristei logike operatore, koji su dati u tabeli:

    Operator Znaenje! negacija

    && i ili

    - 38 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    40/413

    Operator not !

    Podsetimo se da vrednosti istinitosti izraza mogu biti ili true (bilokoja nenulta vrednost) ili false (nulta vrednost). Operator not ili negacija(eng. negation operator, "!") menja reverzno vrednosti operanda.Pretpostavimo da imamo sledee deklaracije i ifnaredbu

    int i = 7;char ch;

    if (!(i == 3))ch = 'A';

    elsech = 'B';

    Kako je vrednost i jednaka 7, uslov (i == 3) je false. Operator not !menja reverzno uslov u true. Zbog toga, if naredba dodeljuje vrednost 'A'varijabli ch.

    and operator && (konjukcija)

    Operatorand&& kombinuje dva uslova na sledei nain: (uslov 1) &&(uslov 2). Tablica istinitosti za operator konjukcije je true samo ako su obauslova true; inae, vrednost jefalse.

    Tablica istinitosti za (uslov 1) && (uslov 2)

    Uslov 1&& T F

    Uslov 2 TF T FF F

    Primer:

    if ( (salary >= 500.00) && (salary < 1000.00) )tax_rate = 0.22;

    Treba obratiti panju da ifnaredba sadri dve male zagrade u kojima

    se nalazi sloeni uslov i dva para zagrada u kojima se nalaze prosti uslovi.

    - 39 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    41/413

    Mada C++ esto ne zahteva to, treba da koristite zagrade za svaki prostuslov zbog jasnijeg prikaza koda.

    Sledei program pita korisnika da ukuca jedan karakter i zatim return.

    Program testira karakter da li je broj i prikazuje odgovarajuu poruku.// Ovaj program prikazuje koriscenje slozene if-naredbe// koja odlucuje da li je taster koji je korisnik pritisnuo numericki.// Program koristi cin.get() za unos jednog karaktera u jednom trenutku.

    #include using namespace std;

    int main()

    {char ch;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    42/413

    samo kada su oba uslova false. Donja tabela daje vrednosti istinitosti zadisjunkciju za razliite kombinacije uslova.

    Tablica istinitosti za (uslov 1) (uslov 2)

    Uslov 1 T F

    Uslov 2 TFT TT F

    Sledei primer, kao i prethodni, testira karakter koji korisnik unosi sa

    tastature da bi se videlo da li je on ceo broj (digit). Meutim, umesto da sekoristi and operator (&&) za testiranje opsega brojeva, koristi se operator|| zatestiranje da li je karakter izvan validnog opsega. Karakter koji korisnikunosi nije validan ako je on manji od '0' ili ako je vei od '9'.

    // Ovaj program prikazuje da li je uneti karakter ceo broj

    #include using namespace std;

    int main(){

    char ch;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    43/413

    2.4 Pravila prioriteta

    Prioritet i redosled izraunavanja

    Ranije smo dali tabele koje definiu prioritet i asocijativnostaritmetikih operatora, operatora dodele i relacionih operatora. Treba daubacimo i logike operatore u ovu hijerarhiju.

    Operatori Asocijativnost() sa leva na desno

    ! + (unarni) - (unarni) ++ -- sa desna na levo* / %

    sa leva na desno+ - sa leva na desno< >= sa leva na desno

    == != sa leva na desno&& sa leva na desno

    || sa leva na desno= += -= *= /= sa desna na levo

    Negacija je najveeg prioriteta zajedno sa ostalim unarnimoperatorima. Operator konjukcije && ima vei prioritet od operatoradisjunkcije ||, i oba operatora imaju asocijativnost sleva u desno.

    Kao primer, pogledajmo sledei kd:

    int i = 7,result;

    if ( (i != 0) && (i

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    44/413

    Ovaj primer pokazuje interesantan aspekt kako C++ razvija logikeizraze; C++ koristi razvojkratkog spoja (eng. short-circuit). Kada raunarzakljui da konjukcija (i != 0) && (i

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    45/413

    switch naredba

    U C++ jeziku switch naredba implementira case strukturu strukturnog

    programiranja, odnosno viestruka grananja. Na taj nain, switch naredba semoe iskoristiti u odreenim okolnostima umesto ugnjeenih naredbi.Naredba switch ima sledei format.

    switch (celobrojni izraz){

    case case-value-1:statement-body-1

    case case-value-2:statement-body-2

    ..

    .case case-statement-n

    statement-body-ndefault:

    default-statement-body}

    Najei celobrojni izraz je prosta int ili char varijabla. Telo switchnaredbe mora biti u velikim zagradama. Telo switch naredbe se sastoji odskupa sluajeva. Svaki sluaj poinje oznakom case, nakon toga sledi casevrednost i dvotaka. Vrednost sluaja je mogua vrednost koju celobrojniizraz moe da dobije. Program izvrava naredbe ako je vrednost celobrojnogizraza jednaka vrednosti sluaja koja je u case oznaci. Napomena, telonaredbe moe biti bez naredbe.

    Naredba default (opciona je) sadri naredbe koje program treba daizvri ako vrednost celobrojnog izraza nije jednaka bilo kojoj vrednosti sa

    oznakom case.// Ovaj program odredjuje vrstu prodaje nepokretnosti

    #include #include #include

    using namespace std;

    int main(){

    - 44 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    46/413

    const double RESIDENTIAL_RATE = 0.060;const double MULTIDWELLING_RATE = 0.050;const double COMMERCIAL_RATE = 0.045;

    int property_code;double sale_price,

    commission_rate,commission;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    47/413

    commission = sale_price * commission_rate;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    48/413

    break;++count;

    }

    if (ch == '\n'){

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    49/413

    {int ch, // uneti karakter

    count = 0; // broj unetih velikih slova

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    50/413

    3. Koncept funkcije

    Objasniemo prirodu funkcija i nauiti kako da deklariemo,definiemo i koristimo proste funkcije.

    3.1 Definicija funkcije

    Funkcija treba da izvri jedan dobro definisan zadatak. Da bi touradila funkcija moe da zahteva vie vrednosti, nazvanih argumenti, kojijoj se prosleuju kada je pozivajua funkcija. Funkcija moe i da ne sadriargumente. Kada funkcija kompletira svoj zadatak, ona moe da ne vrati

    vrednost ili da vrati jednu vrednost koja se zove povratna vrednost,pozivajuoj funkciji. Pozivajua funkcija moe onda da koristi povratnuvrednost u bilo kojoj od svojih naredbi.

    Definicija funkcije:

    return-type ime-funkcije(type parameter, type parameter, ...){telo fukcije}

    Funkcija se deklarie preko prototipa funkcije. Prototip ima sledeiformat:

    return-type ime-funkcije(argument type, argument type, . . .);

    return-type je tip podatka koji funkcija vraa.Prototip ne kae ta funkcija radi ili kako funkcija izvrava svoj

    zadatak. Prototip daje kompajleru informacije o funkciji tako da kompajler

    moe da proveri da li program koristi funkcije korektno. Na primer:

    double Calc_Sales_Tax(double, double); //prototip funkcijePrototip kae C++ kompajleru da funkcija koja izraunava porez na

    promet Calc_Sales_Tax() zahteva dva argumenta, koji su tipa double i vraavrednost koja je tipa double.

    - 49 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    51/413

    Korienje void u deklaraciji

    Ako funkcija ne vraa vrednost, koristi se rezervisana re void kao

    povratni tip u prototipu. Ako funkcija nema argumenata, onda se koristi voidza tip liste argumenata ili se zanemaruje lista tipova argumenata.

    #include using namespace std;

    void Print_10_Xs();

    int main(){

    int i;cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    52/413

    Argument/parametar

    Kada se argumenti prosleuju funkciji, prvom argumentu sedodeljuje prvi parametar u definiciji funkcije, i tako dalje. Na taj nainargumenti i parametri se podeavaju samo na osnovu pozicije, a ne podrugom znaenju.

    #include

    using namespace std;

    void Print_Char(char, int);

    int main(){

    int i,number_of_rows;

    char ch;

    cout > ch;

    cout number_of_rows;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    53/413

    3.2 Prosleivanje parametara po vrednosti

    // Ovaj program prikazuje kako se argument// prosledjuje po vrednosti.

    #include

    using namespace std;

    void PreInc(int);

    int main()

    {int i;

    // Promenljiva i je inicijalizovana na 5.

    i = 5;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    54/413

    ++parm;return;

    }

    Kada se izvrava PreInc(i) u glavnoj funkciji main(), vrednost i, koja

    iznosi 5, se prosleuje funkciji PreInc() i dodeljuje se parametru parm. Ufunkciji PreInc(), naredba ++parm; poveava vrednost parm. Zbog toga,vrednost i u glavnoj funkciji main() ostaje nepromenjena.

    C++ takoe dozvoljava prosleivanje argumenata po referenci. Kadase argumenti prosleuju po referenci, adrese argumenata u glavnoj memorijise prosleuju funkciji. Tako, funkcija moe da promeni vrednost argumentuu programu koji poziva funkciju.

    // Program izracunava konacne poene na osnovu poena sa kolokvijuma i// konacnog ispita

    // Koristi se funkcija Calc_Grade() za izracunavanje poena za konacnu ocenu// Funkcija vraca vrednost konacnih poena funkciji main().

    #include using namespace std;

    int Calc_Grade(int, int);

    int main(){

    int midterm_exam,final_exam,final_grade;

    cout > midterm_exam;cout final_exam;

    final_grade = Calc_Grade(midterm_exam, final_exam);

    - 53 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    55/413

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    56/413

    se deklarie promenljiva. Na taj nain, svaka funkcija ija definicija dolaziposle deklaracije globalne promenljive moe da promeni vrednost globalnepromenljive. Treba izbegavati korienje globalnih promenljivih deljenjempodataka izmeu funkcija koristei argumente i povratne vrednosti.

    Trajanje (duration)

    Klasa skladitenja promenljive (storage class) odreuje njeno trajanje.Klasa skladitenja promenljive je ili auto ili static. Lokalna promenljiva, kojapo default-u ima storage class auto (ponekad nazvana automatska varijabla) jealocirana memorija kada se funkcija u kojoj je ona deklarisana pone

    izvravati. Kada se promenljivoj dodeli memorija, raunar odvaja odreenukoliinu memorije (zavisno od tipa promenljive) za tu promenljivu ipovezuje ime promenljive sa tom lokacijom. Kada se zavri izvravanjefunkcije, dodeljena memorija automatskoj promenljivoj se dealocira imemorijski prostor se moe ponovo koristiti od strane raunara.Promenljiva u stvari prestaje da postoji. Ako main() ponovo pozove funkciju,varijabla se ponovo kreira, verovatno na drugoj lokaciji u memorijiraunara.

    Statikoj promenljivoj (static variable) je dodeljena memorija kadaprogram pone da se izvrava. Varijabla static postoji onoliko dugo koliko seprogram izvrava, nezavisno koja funkcija je trenutno aktivna. Globalnapromenljiva ima static klasu skladitenja po default-u. Mogue je kreiratilokalnu statiku varijablu ukljuujui rezervisanu re static u deklaracijivarijable. Takva varijabla je dostupna samo u funkciji u kojoj je deklarisana.Meutim, zbog njene klase skladitenja koja je statika, varijabla ostaje uvaenju i zadrava svoju vrednost nakon zavretka funkcije gde je onadeklarisana.

    Izlazni tokcerr

    Za prikaz poruke greke na monitoru koristi se cerr izlazni tok, kojine moe biti preusmeren.

    C++ biblioteka matematikih funkcija

    C++ sadri biblioteku matematikih funkcija. Ove funkcije ukljuujustandardne trigonometrijske funkcije (sin(), cos(), tan(), ...), eksponencijalne ilogaritamske funkcije (exp() i log()) ... Koristi se heder fajl .

    - 55 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    57/413

    Prikazaemo primere korienja dve proste matematike funkcije.Funkcija pow(osnova, eksponent) stepenuje prvi argument osnovu sa

    drugim argumentom tj. eksponentom. Oba argumenta moraju biti dvostruke

    preciznosti. Funkcija vraa double tip. Daklep = be .

    Naredba

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    58/413

    4. Nizovi

    4.1 Definicija niza

    Niz je kolekcija konanog broja objekata istog tipa, koji su smeteniu memoriji raunara sekvencijalno. Ovi objekti su elementi niza. Veliinaniza je fiksna za vreme trajanja programa. esto se nizovi zovu linearnestrukture podataka ili jednodimenzionalne strukture podataka.

    Deklarisanje niza

    Format prema kome se deklarie niz je oblika:

    tip-niza ime-niza [ velicina-niza ];

    Primer niza ije je ime rate, iji su elementi tipa double, koji moe damemorie 5 vrednosti je:

    double rate[5];

    Referenciranje i inicijalizacija elemenata niza

    Svaki elemenat niza je definisan svojim pomerajem (offset) odpoetka niza, koji se esto zove indeks (subscript ili index). Indeks prvogelementa niza je 0. Primer niza sa pet elemenata prikazan je preko sledeenaredbe:

    double rate[5] = {0.075, 0.080, 0.082, 0.085, 0.088};

    gde su lanovi niza rate[0], rate[1], rate[2], rate[3] i rate[4] saodgovarajuim vrednostima.

    U nizu veliine N, opseg ofseta je od 0 do N-1. Da bisteinicijalizovali niz u njegovoj deklaraciji, poetne vrednosti treba da smestiteu velike zagrade. Nakon svake vrednosti je zapeta, osim nakon poslednje.Ako lista ne sadri dovoljno vrednosti, kompajler e dopuniti preostalelanove liste nulama. Ako lista sadri vie elemenata od veliine niza,kompajler ignorie suvine elemente.

    Na primer, posmatrajmo sledeu deklaraciju:

    - 57 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    59/413

    double rate[5] = {0.075, 0.080, 0.082};

    C++ kompajler kreira niz rate[] i alocira dovoljno memorije za tano5 promenljivih tipa double. Nakon toga, kompajler inicijalizuje prva trielementa na 0.075, 0.080, i 0.082, i smeta double 0.0 u preostale elementeniza.

    Treba obratiti panju da niz moe da se inicijalizuje koristeiinicijalizacionu listu samo u deklaraciji, ne kasnije dodelom. Sledi, primerneispravne dodele

    double rate[5];rate[] = {0.075, 0.080, 0.082, 0.085, 0.088}; // pogresna dodela

    Sledea deklaracija inicijalizuje sve elemente niza na nulu.

    int grade[10] = {0};

    U sledeoj deklaraciji sedam vrednosti je na inicijalizacionoj listi, alije niz veliine 5. Sledi, kompajler smeta samo prvih pet brojeva u nizcustomer_count[].

    int customer_count[5] = {3, 4, 5, 6, 7, 8, 9};

    Ako inicijalizujete niz u deklaraciji niza i zanemarite veliinu niza,kompajler e ukljuiti veliinu sa liste elemenata. Na primer, sledeadeklaracija deklarie da veliina niza customer_count[] bude 5 zato to listasadri 5 elemenata:

    int customer_count[] = {3, 4, 5, 6, 7};

    U sluaju da izostavite veliinu niza, mora da inicijalizujete niz.Sledi primer nepravilne deklaracije:

    int customer_count[]; // pogresno deklarisanje niza

    Sledi jedan prost primer rada sa nizovima:

    // Ovaj program izracunava troskove dostave naloga za narudzbenice preko poste// na osnovu prodajne cene u regionu.

    // Program koristi broj regiona za pristup elementima niza

    - 58 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    60/413

    #include #include

    using namespace std;int Get_Valid_Region();

    int main(){

    // Sledeca deklaracija definise niz rate[] sa 5 celobrojnih vrednosti

    double rate[5] = {0.075, 0.080, 0.082, 0.085, 0.088};int region;

    double price,charge,total_price;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    61/413

    {cerr

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    62/413

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    63/413

    Sortiranje niza

    Sortiranje niza znai araniranje elemenata niza po rastuem ili

    opadajuem sistemu. Pretpostavimo da nakon unoenja deset ocena zastudenta, program treba da prikae ocene po rastuoj vrednosti. Odabraemobubble sort tehniku, koja se esto koristi za male nizove. Postoji vievarijacija ovog algoritma. Algoritam koji mi koristimo nije najefikasniji, aliradi i daje osnove tehnike.

    // Ovaj program prikazuje kako se sortiraju elementi niza koristeci// bubble sort algoritam.

    #include #include using namespace std;

    int main(){

    const int NUM_QUIZZES = 10;

    int grade[NUM_QUIZZES]; //niz za skladistenje ocena sa kvizaint quiz, // indeks niza grade[]

    temp, // za zamenu elemenata nizapass, // broj prolazalimit; // vodi evidenciju o broju prolaza

    // Unos ocena

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    64/413

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    65/413

    4.2 Viedimenzionalni nizovi

    Razmatraemo dvodimenzionalne nizove zato to ih programeri

    najvie koriste i laki su za opis.Kao primer, posmatraemo srednju ocenu sa kviza za pet studenata.Imamo ocene sa 10 kvizova za po pet studenata, ukupno 50 celobrojnihvrednosti. Moemo da klasifikujemo svaku ocenu prema dve kategorije:student kome ocena pripada i kviz na kome je ocena postignuta. Moemo dasmestimo takve podatke u dvodimenzionalni niz, ili matricu. Slika prikazujekako su ocene smetene u dvodimenzionalni niz class_grades.

    Podaci su grupisani u redove i kolone. Pet redova predstavljaju petstudenata u klasi. Deset kolona predstavlja deset ocena sa kviza. Veliinaniza je 5 x 10, odnosno 5 redova i 10 kolona sa indeksima za redove 0 do 4 ikolone od 0 do 9.

    Da biste deklarisali dvodimenzionalni niz, odredite tip niza i njegovu

    veliinu. Smestite u 2 srednje zagrade broj redova i broj kolona respektivno.Na primer:

    int class_grades[5][10];

    naredba se ita: class_grades je niz od 5 elemenata od kojih je svakiniz od deset celih brojeva.

    Jezik C++ skladiti elemente niza sekvencijalno po redovima.Mogue je inicijalizovati dvodimenzionalni niz u deklaraciji niza.

    - 64 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    66/413

    int class_grades[5][10] = {{50, 56, 87, 67, 98, 90, 68, 54, 67, 30},{70, 68, 64, 78, 97, 57, 68, 90, 67, 74},{64, 76, 87, 67, 95, 67, 56, 83, 60, 78},

    {76, 65, 84, 47, 86, 65, 46, 66, 87, 65},{76, 57, 65, 45, 90, 76, 76, 44, 67, 82}};

    Svi elementi jednog reda se nalaze unutar velikih zagrada, i odvojenisu zapetom. Zapetama su odvojeni i svi redovi osim poslednjeg. Svielementi se nalaze u velikim zagradama.

    Ako inicijalizator redova sadri manje elemenata, ostali elementireda se automatski inicijalizuju na nulu, a ako inicijalizator redova sadrivie elemenata, kompajler ekstra elemente reda ignorie.

    Procesiranje dvodimenzionalnih nizova

    Glavni alat za procesiranje dvodimenzionalnih nizova je ugnjeenaforpetlja. Pretpostavimo sledeu deklaraciju:

    int array[BR_REDOVA][BR_KOLONA];

    Da biste procesirali svaki element u ovom dvodimenzionalnom nizu,koristite ugnjeene forpetlje strukturirane na sledei nain:

    for (row = 0; row < BR_REDOVA; ++row)for (column = 0; column < BR_KOLONA; ++column)

    {procesiraj jedan elemenat niza array[row][column]}

    Spoljna for petlja ulazi u prvu iteraciju za prvi red niza (indeks 0).Unutranja petlja procesira svaki elemenat niza reda odreenog indeksomniza (u prvom sluaju 0), itd.

    // Ovaj program koristi dvodimenzionalni niz za skladistenje// rezultata kvizova studenata u nekoliko razreda. Program izracunava// srednju vrednost poena razlicitih kvizova za svakog studenta.

    #include #include

    using namespace std;

    int main(){

    - 65 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    67/413

    const int NUM_QUIZZES = 10;const int NUM_STUDENTS = 5;

    int class_grades[NUM_STUDENTS][NUM_QUIZZES];

    int student,quiz,quiz_sum;

    double quiz_average;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    68/413

    - 67 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    69/413

    5. Pokazivai

    U ovom poglavlju predstavljamo ideju pointera odnosno pokazivaa,

    kako ih deklarisati, inicijalizovati itd. Takoe, objasniemo kako se moemenjati vrednost promenljive.

    5.1 Deklarisanje i inicijalizacija pokazivaa

    Svaka promenljiva ima adresu, koja je broj koji odreuje lokacijuvarijable u glavnoj memoriji raunara. Pointer je promenljiva ija jevrednost adresa druge promenljive. Na slici je prikazana promenljiva i ijaje vrednost 5, a adresa (pretpostavimo) 004800. Promenljiva i_ptr je pointerija je vrednost adresa promenljive i (tj. 004800). Zato kaemo da i_ptrpokazuje na i.

    Kako adresa nije obian ceo broj, ne moemo ni pokaziva dadeklariemo kao obian ceo broj. Da bismo deklarisali pokaziva,poinjemo sa tipom podatka promenljive na koju e on pokazivati, za kojimsledi asterisk (*), za kojim sledi ime pokazivaa. Na primer:

    int* i_ptr; // i_ptr je pokazivac na promenljivu tipa ceo broj - intidzerint * i_ptr; // i_ptr je pokazivac na promenljivu tipa intidzerint *i_ptr; // i_ptr je pokazivac na promenljivu tipa intidzerdouble* d_ptr; // d_ptr je pokazivac na promenljivu tipa dabl

    Deklarisanje pokazivaa, kao i deklarisanje obine promenljive, ne

    daje pokazivau validnu vrednost. Pre korienja pokazivaa, budite sigurni

    - 68 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    70/413

    da ste dali validnu vrednost pokazivau dodelom adrese promenljive na kojuon pokazuje. Unarni operator adresa od (&), vraa adresu promenljive nakoju je primenjen, na primer, ako je i celobrojna promenljiva, onda je &injena adresa.

    Inicijalizacija pokazivaa

    Moete da dodelite vrednost pokazivau u deklaraciji, vodei raunada je promenljiva prethodno deklarisana.

    int i = 5;

    double d = 3.14;int* i_ptr = &i;double* d_ptr = &d;

    Sledei kd je pogrean zato to je i deklarisano nakon deklaracije iinicijalizacije i_ptr. U trenutku kada se i_ptr deklarie i inicijalizuje,kompajler ne zna nita o varijabli i.

    int* i_ptr = &i; // pogresna inicijalizacijaint i;

    Tip adrese treba da odgovara tipu pointera. Na primer:

    int i;double* d_ptr = &i; // pogresna inicijalizacija pokazivaca

    Ne moete direktno dodeliti celobrojnu vrednost pokazivacu:

    int* i_ptr = 004600; // pogresna dodela

    Jedini izuzetak je null pointer ija je vrednost 0. Moete koristiti iranije definisanu konstantuNULL umesto nule.NULL je definasan u nekolikoheder fajlova ukljuujui iostream. Sledi:

    int* i_ptr = 0; // ispravna dodelaint* j_ptr = NULL; // ispravna dodela

    Inicijalizacijom pokazivaa na nulu, pokaziva ne pokazuje ni na ta.Vrednost 0 se moe dodeliti pokazivau bilo kog tipa. Sledee deklaracije suispravne.

    - 69 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    71/413

    double* d_ptr = NULL;char* c_ptr = NULL;

    Memorijski prikaz rada sa pokazivaima:

    Operator indirekcije

    Deklariimo i i i_ptr:

    int i;

    int* i_ptr = &i;

    Direktna dodela je

    i = 17;

    dok je indirektna dodela koristei operator indirekcije *

    *i_ptr = 17;

    Operator indirekcije * je unarni operator. Sledi, ima isti prioritet iasocijativnost (sa desna-u-levo), kao i drugi unarni operatori. ita se kaotarget-cilj pokazivaa je promenljiva na koju on pokazuje.

    // Ovaj program ilustruje koriscenje pokazivaca i operatora indirekcije

    #include

    using namespace std;

    - 70 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    72/413

    int main(){

    int i;

    int* i_ptr = &i;cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    73/413

    Sledeu dodelu ne smete da uradite:

    nums_ptr = nums[2]; // neispravna dodela pointeru

    Ime niza je konstantan pokaziva u smislu da ni jedna naredba C++ne moe da promeni njegovu vrednost. Sledi, neispravna dodela:

    nums = nums_ptr; // neispravna dodela

    Memorijski prikaz veze pokazivaa i niza:

    Operacije sabiranja i oduzimanja mogu da se primene na pointere.

    Na primer, pretpostavimo sledeu dodelu

    nums_ptr = nums;

    Moemo sada da izvrimo ++nums_ptr. Ovo kao rezultat daje uveanjevrednosti pokazivaa num_ptr za 1, odnosno on sada pokazuje na sledeucelobrojnu vrednost elementa nums[1], ili 4, kao na donjoj slici. Trebanapomenuti, meutim da ++nums je neispravno zato to je to pokuajpromene imena niza, to je konstantan pokaziva.

    - 72 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    74/413

    Vano je napomenuti da je aritmetika pokazivaa unutar nizaskalirana na tip niza. Na primer, pretpostavimo sledeu deklaraciju

    double d_array[4] = {3.2, 4.3, 5.4, 6.5};double* d_ptr = d_array;

    Sledi, pokaziva d_ptrpokazuje na prvi elemenat niza d_array, ija jevrednost 3.2. Naredba ++d_ptr kao rezultat daje da d_ptrpokazuje na sledeidouble u nizu, ija je vrednost 4.3. Ako ponovo izvrimo ++d_ptr, d_ptr epokazivati na sledei double niza, tj. 5.4.

    Moete da koristite aritmetiku pointera na ime niza, ako to ne

    rezultuje promenom vrednosti imena niza, sledi:

    nums_ptr = nums + 2; // validna dodela pokazivacu

    Ova dodela kao rezultat daje da pointernums_ptrpokazuje na elementniza nums[2], kao na slici. Generalno, izraz nums + i je pointer na i-ti elementniza nums[i]. Zato, *(nums + i) je isti elemenat kao i nums[i].

    - 73 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    75/413

    Treba voditi rauna da aritmetika pokazivaa ne pree brojelemenata niza. C++ kompajler nee vas upozoriti ako napravite ovakvugreku. Pristup takvim lokacijama moe da prouzrokuje run-time greku u

    programu ili moe da prouzrokuje nekorektne rezultate.//Ovaj program prikazuje aritmetiku pokazivaca i nizova

    #include #include

    using namespace std;

    int main()

    { int nums[5] = {3, 4, 5, 6, 7};int* nums_ptr;int i;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    76/413

    - 75 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    77/413

    6. C-stringovi, pokazivai, nizovi, funkcije, korisnikidefinisani tipovi podataka i tabele

    Ova sekcija razmatra rad sa stringovima. Poinjemo sa osnovnimidejama i tehnikama za rad sa stringovima.

    6.1 Definicija i inicijalizacija stringa

    U jeziku C++ stringovi se mogu implementirati na dva naina.Definisaemo string kao niz karaktera koji je zavren null karakterom. Nullkarakter je bajt iji su svi bitovi nule. Ovaj bajt oznaavamo specijalnimsimbolom '\0'. Ako niz karaktera ne sadri na kraju null karakter, niz nepredstavlja string.

    Ovako definisan string se naziva C-string zato to je tako definisan uC programskom jeziku. Podsetimo se da je C++ baziran na programskomjeziku C i da sadri sve mogunosti C programskog jezika (C++ je uzminimalne izuzetke nadskup jezika C). Kasnije emo videti kako sestringovi mogu implementirati koristei string klasu.

    Sledea deklaracija i inicijalizacija kreiraju string sastavljen od rei"Hello". C-string je oblika:

    char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

    Drugi pristup za inicijalizaciju stringa koristi string konstantu, kojaje niz karaktera pod znacima navoda, kao u primeru koji sledi:

    char greeting[6] = "Hello";

    Programer ne smeta null character na kraj string konstante. C++

    kompajler automatski smeta '\0' na kraj stringa kada inicijalizuje niz.Prethodna deklaracija kao rezultat daje da kompajler inicijalizuje memorijuna sledei nain

    greeting

    H e l l o \0Takoe, podsetimo se da ako inicijalizujete niz u njegovoj

    deklaraciji, ne treba da postavite veliinu niza. C++ kompajler e izvesti

    - 76 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    78/413

    zakljuak o veliini niza iz inicijalizovanih vreednosti. Sledi, ovadeklaracija je ekvivalentna prethodnoj deklaraciji.

    char greeting[] = "Hello";

    String i ulaz sa tastature i izlaz na displej

    Pretpostavimo da elimo da napiemo jednostavan program koji pitakorisnika za naziv proizvoda i njegovu cenu. Program treba nakon toga daprikae na displeju naziv proizvoda, porez na cenu i konanu cenu kotanja(cena + porez).

    Podsetimo se da za dobijanje jednog karaktera sa tastature i ulaznogbafera, koristimo cin.get(), a za dobijanje stringa sa tastature i ulaznog bafera,koristimo cin.getline(). Funkcija lan getline() zahteva dva argumenta. Prviargument mora biti ime niza u koji se smeta string. Drugi argument trebada bude veliina niza koji je prvi argument. Funkcija lan getline() uzima svekaraktere iz ulaznog bafera tastature ukljuujui i karakter za novi red, ili zajedan manje od broja karaktera koji je odreen drugim argumentom.Dodatna pozicija je ostavljena za zavrni null karakter. Funkcija smetakaraktere, zavrene null karakterom u niz sa imenom odreenim prvimargumentom. Na primer, pretpostavimo sledeu deklaraciju i naredbu:

    char buffer[6];cin.getline(buffer, 6);

    Naredba cin.getline() ita sve karaktere koje korisnik unese sa tastaturezakljuno sa karakterom za novi red do 5 karaktera. Fukcija smeta string,sa dodatnim nullkarakterom u niz buffer[]. Ako se '\n' proita sa cin.getline(),ne smeta se u bafer.

    // Ovaj program prikazuje koriscenje cin.getline() za ubacivanje string-a// i prikazuje na displeju stringove na nekoliko naina

    #include #include

    using namespace std;

    int main(){

    double const TAX_RATE = 0.0825;

    - 77 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    79/413

    char item_name[51];double price,

    tax,total;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    80/413

    6.2 String konstante i pokazivai

    Vana veza izmeu pokazivaa i stringa je da je string konstanta,kao to je "Hello", ustvari pokaziva na niz karaktera. Kada kompajler radisa string konstantom, on tretira string konstantu kao pokaziva na prvikarakter stringa tako da je sledea deklaracija i inicijalizacija legalna:

    char* greeting_ptr = "Hello";

    Na donjoj slici izraz *(greeting_ptr + 4) pokazuje na karakter '0' ustringu.

    U nastavku ovog poglavlja dati su primeri koji koriste pokazivae i

    odreenu aritmetiku za rad sa stringovima.Brojanje karaktera u stringu

    Sledei primer broji karaktere u stringu koji unosi korisnik, koristeiwhile petlju i pokaziva za kretanje kroz niz.

    // Ovaj program broji karaktere jedne linije sa ulaza koje unosi korisnik.// Koristi se pointer za kretanje kroz string i while petlja za brojanje karaktera

    #include

    using namespace std;

    int main(){

    char line[81];char* ch_ptr = line;int count = 0;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    81/413

    while ( *ch_ptr != '\0' ){++count;

    ++ch_ptr;}cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    82/413

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    83/413

    #include

    using namespace std;

    int main(){char line[81];char* ch_ptr;int word_count = 0;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    84/413

    6.3 Nizovi stringova i pokazivaa

    U jeziku C++ elementi niza mogu biti podaci bilo kog tipa. U ovompoglavlju posmatraemo nizove stringova i nizove pokazivaa.

    Definisanje niza stringova

    Podsetimo se da je dvodimenzionalni niz ustvari niz iji su svielementi takoe nizovi. Na primer, niz

    char dani_u_nedelji[7][10];

    je niz od sedam elemenata od kojih je svaki niz od deset karaktera.Niz karaktera moe da skladiti string. Zbog toga, dvodimenzionalni nizkaraktera, kao to je dani_u_nedelji[][], je sposoban za smetanje stringova.Razmotrimo, na primer, sledeu deklaraciju i inicijalizaciju:

    char dani_u_nedelji [7][10] = {"Ponedeljak", "Utorak", "Sreda","Cetvrtak", "Petak", "Subota", "Nedelja"};

    Niz karakteradani_u_nedelji[][] veliine 7 x 10 karaktera prikazan jena slici:

    Sada kada smo smestili imena dana u nedelji, kako im pristupiti uprogramu? Svaki element niza dani_u_nedelji[][] je niz karaktera. Sledi,referenciranje dani_u_nedelji[3] pristupa elementu broj tri niza, to je nizkaraktera koji sadri string "Cetvrtak."

    - 83 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    85/413

    Korienje niza stringova - primer

    Menader prodaje eli da zna ukupnu prodaju za svakog prodavca u

    svom departmanu i da pronae dan u nedelji kada neko iz prodaje imanajveu prodaju. Sledi reenje:

    // Ovaj program pronalazi dan najvece prodaje u nedelji.// Koristi se niz stringova za skladistenje imena dana u nedelji

    #include #include

    using namespace std;

    int main(){char dani_u_nedelji[7][10] = {"Ponedeljak", "Utorak", "Sreda",

    "Cetvrtak", "Petak", "Subota", "Nedelja"};double sales[7];char salesperson[41];double max_sales,

    total_sales;int day,

    max_day;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    86/413

    {max_sales = sales[day];max_day = day;

    }total_sales += sales[day];}cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    87/413

    char* dani_u_nedelji [7] = {"Ponedeljak", "Utorak", "Sreda","Cetvrtak", "Petak", "Subota", "Nedelja"};

    Ova deklaracija dani_u_nedelji[] kao niza pokazivaa, uva memorijuzato to svaki string dobija onoliko memorije kolike je duine.

    6.4 Pokazivai, reference na promenljive i funkcije

    Funkcija moe da ima pokaziva kao argument i pozivajuoj funkcijimoe da se vrati pokaziva. Moe da vrati pokaziva pozivajuoj funkciji.

    Ovo poglavlje objanjava tu problematiku.Poziv po adresi pokazivai kao argumenti funkcija

    Argumenti funkcija u C++ se prosleuju po vrednosti. Ovo znai dase vrednost argumenta, ne sam argument, prosleuje funkciji. Razmotrimosledei program:

    // Ovaj program prikazuje prosledjivanje argumenata po vrednosti

    #include

    using namespace std;

    int Neg_By_Value(int);

    int main(){

    int i = 4;

    i = Neg_By_Value(i);

    - 86 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    88/413

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    89/413

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    90/413

    Prosleivanje adrese varijable funkcije se oznaava kao poziv poadresi (eng. call by address).

    Funkcija moe da vrati najvie jednu vrednost pozivajuoj funkciji.Meutim, koristei poziv po adresi, mogua je promena dve ili vie varijabliu pozivajuoj funkciji. Podsetimo se da je funkcija zamene dve celobrojnepromenljive (Swap_Int()) definisana ranije kao deo bubble sortalgoritma.

    #include

    using namespace std;

    void Swap_Int(int*, int*);

    int main(){

    int i = 3,j = 5;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    91/413

    Prototip funkcije Swap_Int() deklarie njenu povratnu vrednost dabude tipa void zato to funkcija ne vraa vrednost. Umesto toga, Swap_Int()zamenjuje vrednosti dve celobrojne promenljive u pozivajuoj funkciji

    koristei pokazivae. Oba argumenta funkcije su deklarisana kao integerpointeri. Sledi, mora da prosledimo adrese dve celobrojne promenljivefunkciji.

    Deklaracija varijabli i i j u main() funkciji inicijalizuje varijable na 3 i5, respektivno. Naredba cout prikazuje poetne vrednosti za i ij. Zatim main()funkcija izvrava Swap_Int() funkciju izvravajui sledeu naredbu, kojaprosleuje adrese za i ij funkciji Swap_Int().

    Swap_Int(&i, &j);

    Funkcija Swap_Int() dodeljuje ove adrese parametrima a_ptr i b_ptr.Swap_Int() koristi operator indirekcije za razmenu vrednosti targeta a_ptr ib_ptr, sa imenima i ij. Na taj nain funkcija menja vrednosti dve promenljiveu funkciji main().

    Reference na varijable i poziv po referenci

    Reference na promenljive i argumente su ponekad alternativapokazivaima. Referenca na promenljivu (izvedeni tip) je alias, odnosnodrugo ime za varijablu koja ve postoji. Na primer, pretpostavimo da imamosledee deklaracije

    int i = 7;double d = 1.2;

    Moemo da deklariemo reference na varijable za i i d na sledei

    nain:int& r = i;double& s = d;

    Znak & u ovim deklaracijama se ita kao "referenca". Prvadeklaracija se ita kao "r je integer referenca (referenca na promenljivu tipainteger) inicijalizovana na i" a "s je double referenca inicijalizovana na d."

    Razmiljajte o imenu varijable kao o oznaci pridruenoj lokaciji

    varijable u memoriji, odnosno o drugoj oznaci pridruenoj memorijskoj

    - 90 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    92/413

    lokaciji. Sledi, moete pristupiti sadraju varijable ili preko originalnogimena varijable ili preko reference.

    Moemo da promenimo sadraje promenljive i koristei identifikatori ili referencu r. Na primer, bilo koja od ovih naredbi promenie vrednostpromenljive i na 9.

    i = 9;r = 9;

    Kao i kod pokazivaa, dodajemo & u deklaraciji reference na krajutipa podataka da bi naglasili da je referenca drugi tip. Znak ampersand

    moemo smestiti bilo gde izmeu tipa podatka i imena reference navarijablu ispravno je:

    double & s = d; //ispravna deklaracija reference

    int &r = i; // ispravna deklaracija reference

    Pokazivai i reference

    Slinosti izmeu pokazivaa i reference:-pristup do objekta i preko pokazivaa i preko reference jeposredan,-mnoga pravila, a naroito pravila konverzije, vae i za pokazivaei za reference.

    Razlike izmeu pokazivaa i reference:-pokaziva se moe preusmeriti tako da ukazuje na drugi objekat,

    dok je referenca od trenutka svog nastanka, tj. od inicijalizacije,trajno vezana za isti objekat,-pokaziva moe da ukazuje ni na ta (vrednost 0), dok referencauvek, od poetka do kraja svog ivotnog veka, upuuje na jedan(isti) objekat,-pristup do objekta preko pokazivaa vri se preko operatora *, dokje pristup do objekta preko reference neposredan.

    Ne postoje nizovi referenci, pokazivai na reference, ni reference nareference. U mnogim sluajevima, lake je koristiti reference od pokazivaa

    - 91 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    93/413

    kao argumente funkcija. U ovim sluajevima, prosleujemo argumente poreferenci ili koristei poziv po referenci. Kao primer poziva po referenciposmatrajmo sledei program:

    // Ovaj program prikazuje prosledjivanje argumenata po referenci

    #include

    using namespace std;

    void Neg_By_Reference(int&);

    int main(){

    int i = 4;

    Neg_By_Reference(i);

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    94/413

    int main(){

    int i = 3,

    j = 5;cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    95/413

    double Avg(int [], int);

    Funkcija Avg() vraa vrednost tipa double i ima dva parametra. Prviparametar je niz promenljivih tipa int. Srednje zagrade [] kau kompajleru dase radi o nizu. Definicija funkcije koja odgovara prethodnom prototipu je:

    double Avg(int arr[], int size)

    Sledei program nalazi srednju vrednost skupa od 10 poena (ocena)sa kviza koje korisnik unosi sa tastature, ali koristi funkciju Avg().

    // Ovaj program pokazuje kako se nalazi srednja vrednost elemenata niza// prosledjivanjem niza funkciji

    #include #include

    using namespace std;

    double Avg(int [], int);

    int main(){

    const int NUM_QUIZZES = 10;

    int grade[NUM_QUIZZES]; // niz za skladistenje ocena sa kvizaint quiz; // Indeks nizadouble grade_avg;

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    96/413

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    97/413

    Sortiranje niza

    Prosleivanjem niza funkciji koristei ime niza kao argument,

    prosleuje se adresa niza funkciji. Sledi, bilo koja promena koju funkcijanaini nad parametrom niz menja niz u pozivajuoj funkciji.U sledeem programu korisnik sa tastature unosi elemente niza (10),

    program prikazuje niz, pa se zatim koristi bubble sortalgoritam za sortiranjepo rastuem redosledu. Konano, program prikazuje sortiran niz.

    // Ovaj program prikazuje kako se sortiraju elementi niza.// Program koristi funkcije za rad sa nizovima.// Funkcija Swap_Int() koristi poziv po referenci

    #include #include

    using namespace std;

    void Get_Grades(int [], int);void Display_Array(int [], int);void Bubble_Sort(int [], int);void Swap_Int(int&, int&);int main(){

    const int NUM_QUIZZES = 10;

    // Niz za skladitenje ocena sa kvizaint grade[NUM_QUIZZES];

    Get_Grades(grade, NUM_QUIZZES);

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    98/413

    void Get_Grades(int arr[], int size){

    int quiz;cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    99/413

    return;

    } // Kraj funkcije Bubble_Sort()

    void Swap_Int(int& a, int& b){int temp; // privremena promenljiva za zamenu celobrojnih vrednostitemp = a;a = b;b = temp;return;

    } // Kraj Swap_Int() funkcije

    Kada glavna funkcija main() poziva funkciju Bubble_Sort(), onaprosleuje adresu niza grade[]. Sledi, Bubble_Sort() manipulie elementima

    niza grade[]. Na taj nain kada funkcija Bubble_Sort() zavri sortiranje niza,elementi niza grade[] su ureeni po rastuem redosledu. Nakon toga, glavnafunkcija main() prikazuje na displeju poruku i koristi funkciju Display_Array()da bi prikazala elemente niza grade[] u rastuem redosledu.

    6.6 Stringovi i funkcije

    Poto je C-string ekvivalentan pokazivau na karaktere,

    prosleivanje stringa funkciji je ekvivalentno prosleivanju pokazivaafunkciji. U ovoj sekciji prikazaemo kako se prosleuju stringovi

    - 98 -

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    100/413

    funkcijama. Takoe, prikazaemo kako se definie i koristi funkcija kojavraa pokaziva.

    Korienje funkcije za brojanje karaktera u stringu

    Program pita korisnika da unese sa tastature string a zatim programprikazuje broj karaktera u stringu. Program koristi funkciju Len_String() kojauzima string kao svoj jedini argument i vraa ceo broj jednak brojukaraktera u stringu. Prototip funkcije je definisan na sledei nain:

    int Len_String(char*);

    // Ovaj program izracunava broj karaktera jedne linije koju korisnik unese sa// tastature// Za brojanje karaktera koristi se funkcija Len_String()

    #include using namespace std;

    int Len_String(char*);

    int main(){char line[81];

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    101/413

    return length;} // Kraj funkcije Len_String()

    Parametar deklarisan u hederu funkcije Len_String() je karakterpointer ch_ptr. Kada glavna funkcija main() izvrava poziv funkcijeLen_String(line), ona prosleuje vrednost line (to je pokaziva na prvielemenat niza line[]) funkciji Len_String(). Vrednost line se dodeljuje ch_ptr.Sledi, u funkciji Len_String(), ch_ptr inicijalno pokazuje na prvi karakterstringa koji je smeten u line[]. Lokalna promenljiva length, koja predstavljaduinu stringa, inicijalizovana je na 0.

    Petlja while u funkciji Len_String() testira target pokazivaa ch_ptr. Akotarget nije null karakter, koji je kraj stringa, onda se u telu petlje broji tajkarakter poveavajui vrednost varijable length. Zatim, petlja poveavapokaziva za jedan.

    Korienje funkcije za reverzno smetanje elemenata stringa

    Ova funkcija menja elemente niza reverzno, tj. prikazuje obrnutoelemente niza.

    // Ovaj program koristi funkciju za reverzni prikaz stringa.

    #include

    using namespace std;

    void Reverse_String(char*);

    int main(){

    char line[81];

    cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    102/413

    Reverse_String(line);cout

  • 7/22/2019 US - Programski jezik C++ sa reenim zadacima - Laslo Kraus

    103/413

    Reverse_String(line);

    Funkcija Reverse_String() reverzno menja string "u mestu". Da biuradila ovo funkcija deklarie dva karakter pointera front i end. Druga petljawhile reverzno menja string zamenjujui karaktere na koje pokazuju front iend.

    Standardna biblioteka string funkcija

    C++ jezik sadri oko dvadeset bibliotekih funkcija koje manipuliuC-stringovima. Ove funkcije nam dozvoljavaju da izvrimo neke prostestring operacije.

    Prototipovi svih funkcija za rad sa stringovima nalaze se u hederfajlu cstring (u starijim implementacijama C++ jezika, koristio se heder fajlstring.h). Sledi, treba ukljuiti sledeu pretprocesorsku direktivu:

    #include

    Duina stringa - funkcija strlen()

    Biblioteka funkcija strlen() nalazi duinu stringa.