predavanje_1_pj2

202
PROGRAMSKI JEZICI 2 PREDAVANJE 1 Visoka tehnička škola strukovnih studija NIŠ, Prof. dr Borivoje Milošević 2012.

Upload: nightdevilx

Post on 14-Sep-2015

19 views

Category:

Documents


0 download

DESCRIPTION

asdf

TRANSCRIPT

  • PROGRAMSKI JEZICI 2 PREDAVANJE 1

    Visoka tehnika kola strukovnih studija NI, Prof. dr Borivoje Miloevi2012.

  • Sadraj, ciljevi i preduslovi

    Sadraj:

    Osnovni koncepti OOP ( Object Oriented Programming ) i objektne paradigme

    Jezik C++

    Laboratorijske vebe

    Ciljevi:

    Upoznati se sa osnovnim konceptima objektne paradigme i njihovim pogodnostima

    Osposobiti se za projektovanje i pisanje programa korienjem objektnih koncepata

    Osposobiti se za programiranje na jeziku C++

  • Preduslovi:

    Dobro poznavanje osnovnih principa i koncepata proceduralnog programiranja

    Poznavanje rada sa raunarom i osnovnim alatkama za programiranje (editor, prevodilac, debager)

    Dobro savladano gradivo predmeta Programski jezici 1, sa praktikumom iz programiranja

    Vetina u programiranju na jeziku C

    Samostalan, praktian i kontinuiran rad!

  • Organizacija nastave i praktian rad

    Predavanja: 2 asa nedeljno

    Kolokvijumi: Ukupno 2

    u semestru

    Raunske vebe:

    2 asa nedeljno

    zadaci za razumevanje koncepata i uvebavanje jednostavnih programerskih principa

    diskusija, demonstracije i konsultacije

    Laboratorijske vebe:

    2 asa nedeljno

    reavanje zadataka u vezi sa nastavnim temama upotrebom raunara na platformi Visual C++

    diskusija, demonstracije i konsultacije

    Praktian samostalan rad:

    domai zadaci u toku semestra

    rade se i brane samostalno, usmeno i na raunaru

    ulaze u konanu ocenu

  • LITERATURA:

    DRAGAN MILIEV, Objektno orijentisano programiranje na jeziku C++, Mikro knjiga Beograd, 2001

    JESSE LIBERTY,

    Nauite C++, Kompjuter biblioteka, 1998, aak

    LASLO KRAUS,

    Programski jezik C++, Akademska misao, Beograd, 2001

    MILENA STANKOVI,

    Programsko jezici, Elektronski fakultet, Ni, 2000

    BORIVOJE MILOEVI

    Programski jezici 2 , Ni, SIKC, 2010

    MAGDALINA TODOROVA,

    Programiranje na C++, Siela Soft and Publishing, Sofia, Bulgaria, 2002

  • DENNIS

    RITCHIEC- 1972

    BJAR

    NE STROUSTRUP

    C++ 1984C++ JE NADSKUP JEZIKA C

    PROGRAMSKI JEZICI 2 C++

  • Bjarne Stroustrup etalon za C++

    The C++ Programming Language

    and The Design and Evolution of C++.

    Professor and holder of the College of Engineering Chair in Computer Science Texas A&M University

  • (

    11.

    1950.

    , )

    (

    ), 1975,

    .

    1979.

    .

    C++

    .

    C++.

  • POVEZUJE

    COBJEKTNO

    PROGRAMIRANJE

    C++

    ANSI STANDARD 1997

  • THE AUTOADDED C++ REFERENCE MANUAL from MARGARET ELLIS and BJARNE STROUSTRUP

    1991 GOD.

    VIESTRUKO NASLEIVANJE

    APSTRAKTNE KLASE

    MEHANIZMI GENERIKIH KLASA

    IZUZECI I GREKE

  • OPERATIVNI SISTEMI I OBJEKTNO ORIJENTISANI JEZICI

    C++

    MS DOS

    UNIX

    LIN

    UXW

    IND

    OW

    S

    SIMULA 40 god. pre

  • Pregled

    tehnika

    programiranja

    Nestrukturno

    -

    proceduralno

    programiranje

    Glavni

    program direktno

    operie sa

    globalnim

    podacima.

    Dugi i nepregledni programi

    Copy paste-

    Kod

    se viestruko

    koristi

    kopiranjem

    delova

  • Pregled

    tehnika

    programiranja

    Proceduralno programiranje

    Program se moe posmatrati kao sekvenca poziva potprograma (procedura).

    Strukture podataka se modeliraju odvojeno od koda procedura koje ih obrauju.

    Viestruko korienje koda postie se preko biblioteka procedura i funkcija.

  • Pregled

    tehnika

    programiranja

    Modularno programiranje

    Procedure sa zajednikom funkcionalnou su integrisane u jedan modul

    Svaki modul moe da ima svoje sopstvene podatke.

    Viestruko korienje struktura podataka i procedura

  • Pregled

    tehnika

    programiranja

    Object Oriented Programming

    Strukture podataka i procedure integrisane u klase

    Program moe da se posmatra kao mrea objekata koji su u interakciji pri

    emu ssvaki objekat svoje stanje.

    Apstracija, inkapsulacija, nasleivanje i polimorfizam

    Ponovno korienje objekata

  • Pregled

    tehnika

    programiranja

    Komponentno programiranje (Component Development)

    Aplikacija se gradi od prekompajliranih softverskih blokova, slino konceptu integrisanih kola u elektronici

    Akcenat je na modeliranju interfejsa

    Komponente se mogu viestruko koristiti (Binary reuse of functionality)

    Nezavisnost od programskog jezika i platforme na kojoj se aplikacija koristi.

  • BLOK DIJAGRAM PROCEDURALNOG PROGRAMIRANJA

    PODACI

    PROGRAMI

    I

    PROCEDURE

    REZULTATI

  • BLOK DIJAGRAM OBJEKTNOG PROGRAMIRANJA

    KLASE, OBJEKTI, RELACIJE

    "Objektno-orijentisano programiranje bie osamdesetih ono to je strukturno programiranje bilo sedamdesetih. Svako e biti za njega. Svaki proizvoa e promovisati svoje proizvode kao takve. Svaki menader e davati prazna obeanja u vezi sa njim. Svaki programer e ga praktikovati (na svoj nain). I niko nee znati ta je to ustvari. "

    Tim Rentch, Odsek kompjuterskih nauka, UCLA

  • ta ini OO tehnologiju?

    Programming Languages

    C++ Java

    Smalltalk Eiffel

    C#

    Others

    UML Patterns

    LibrariesFrameworks

    Tools and Environments

  • PRIMER:

    Napisati program na nekom od Objektno orijentisanih jezika za crtanje kruga sa krstom na sredini.

    (x,y)

    r

  • REENJE:

    Da bi nacrtali traeni crte, potrebna su tri objekta:

    KRUG: krug pripada klasi CIRCLE

    VERT: vertikalna linija pripada klasi LINE

    HORI: horizontalna linija pripada klasi LINE

    Za svaku klasu postoji elementaran konstruktor koji se moe koristiti za kreiranje objekata sa nekom inicijalnom strukturom. Za inicijalizaciju novokreiranih objekata mogu se definisati konstruktori sa istim imenom a razliitim brojem i tipom argumenata. Tada sledi, koristei C++ notaciju:

  • KRUG

    = new CIRCLE (x,y,r)

    VERT

    = new LINE (x,x-r,x,y+r)

    HORI

    = new LINE (x-r,y,x+r,y)

    KRUG

    display ( )

    VERT display ( )

    HORI

    display ( )

  • ZATO OOP ?

    SOFTVERSKA KRIZA

    Drastino poveanje zahteva korisnika jer su programeri pokazali ta sve raunari mogu da rade.

    Poveanje korisnikih zahteva uslovljava poveanu produktivnost programera ( ili njihovog broja ), ali dostupno proceduralno programiranje tada je doputalo projektovanje softvera u modulima sa relativno jakom interakcijom

    svaka promena u programu mora biti izvrena u svim modulima.

    Poveanje produktivnosti mogue je ponovnim korienjem delova softvera koji je ve ranije uraen i korien, ali bez mnogo dorade za nove stvari i reenja ( slaba interakcija ) to predstavlja veliki problem korienjem standardnog naina programiranja.

    Drastino poveanje trokova odravanja softvera utiu na to da softver mora biti itljiviji, laki za nadgradnju i modifikovanje i samo odravanje.

  • Objektno orijentisano programiranje

    OO karakteristike

    Sve je objekat.

    Objekat

    je

    definisan

    podacima

    i skupom metoda

    koji opisuju njegovo ponaanje.

    Objekti komuniciraju meusobno slanjem poruka.

    Svaki objekat pripada svojoj klasi (ima svoj tip).

    Klasa opisuje strukturu objekta i njegovo ponaanje.

    Svi objekti iste klase mogu da odgovore na iste poruke.

  • Objektno orijentisano programiranje

    Osnovni koncepti-

    Klasa

    Definie strukturu objekata (podatke) i njihovu funkcionalnost (ponaanje). Klasa moe da se posmatra kao ablon objekata, (template) kojim se opisuje model po kome ae se kreirati novi objekat. Klase se ponekad nazivaju fabrikama objekata (Cox 1986)

    -

    Objekat

    Primerci (istace) klasa. pojedninaeni,.

    Svi objekti jedne klase imaju strukturu definisanu klasom i nad njima se mogu izvravati samo operacije definisane klasom kojoj pripadaju.

    - Poruka

    Objekat odgovara na poruku time to se izvrava odgovarajui metod.

    Kaemo da na objekte delujemo porukama, pri emu svaka poruka pretstavlja poziv metoda (funkcije ili procedure) definisanog u klasi kojoj objekat pripada.

  • Objektno-orijentisano programiranje

    Prema Alan Kay-u, isto pristup objekt orijentisanom programiranju poseduje pet esencijalnih karakteristika:

    Sve je objekat.

    Posmatrajmo objekat kao sofisticiranu promenljivu koja omoguava: uskladitenje vrednosti i podrku operacijama nad tom vrednou.

    Program se transformie u skup objekata koji sarauju razmenom poruka. Poruku moemo posmatrati kao mehanizam poziva operacije nad objektima.

    Svaki sloeni objekat je izveden kao kolekcija objekata.

    Svaki objekat pripada odreenom tipu tj. predstavlja instancu KLASE (tip = klasa).

    Svi objekti iste klase mogu primati iste poruke

    polimorfizam.

  • Objektno orijentirano programiranje OOP

    OOP je nain ugradnje programske podrke kod kojeg su programi organizovani kao kooperativni skupovi objekata, od kojih svaki predstavlja pojavu neke klase, a sve klase su lanovi neke hijerarhije klasa sjedinjene preko nasleivanja

    Programiranje bez nasleivanja nije objektno orijentisano, ve

    je re

    o programiranju sa

    apstraktnim tipovima podataka

    Osnovni gradivni element jezika je objekt a ne algoritam

    Jezik je objektno orijentisan ako i samo ako:

    podrava objekte koji predstavljaju apstrakciju stvarnog

    sveta sa skrivenim lokalnim stanjem i sa interfejsom koji defini[e operacije nad tim objektima

    objekti pripadaju nekoj klasi (class)

    klase mogu nasleivati svojstva od nadklasa

    Za jezik bez nasleivanja kae se da je zasnovan na objektima (object-based)

  • OOP uvodi drugaiji nain razmiljanja u programiranje!

    U OOP-u, mnogo vie vremena troi se na projektovanje, a mnogo manje na samu implementaciju (kodovanje).

    U OOP-u, razmilja se najpre o problemu, a tek naknadno o programskom reenju.

    U OOP-u, razmilja se o delovima sistema (objektima) koji neto rade, a ne o tome kako se neto radi (algoritmima). Drugim reima, OOP prvenstveno koristi objektnu dekompoziciju umesto iskljuivo algoritamske dekompozicije.

    U OOP-u, panja se prebacuje sa realizacije na medusobne veze izmeu delova. Tei se to veoj redukciji i strogoj kontroli tih veza. Cilj OOP-a je da smanji interakciju izmeu softverskih delova.

  • OOP uvodi drugaiji nain razmiljanja

    Posmatrajmo na primer izraz log 1000. Da li je ovde u sreditu panje funkcija log

    ili njen argument 1000?

    Ukoliko razmiljamo da se ovde radi o funkciji log

    kojoj se alje argument 1000

    i koja daje kao rezultat broj 3, razmiljamo na proceduralni nain.

    Sa druge strane, ukoliko smatramo da se u ovom sluaju na broj 1000

    primenjuje operacija (funkcija) log

    koja ga transformie u broj 3, tada razmiljamo na objektno orijentisani nain.

    Dakle, proceduralno razmiljanje forsira funkciju, kojoj se alje podatak koji se obrauje, dok objektno orijentisano razmiljanje forsira podatak nad kojim se funkcija primenjuje.

  • OOP uvodi drugaiji nain razmiljanja

    Navedimo jo

    jedan primer.

    Posmatrajmo izraz 5 + 3. Proceduralna filozofija ovdje stavlja sredite panje na operaciju sabiranja (+) kojoj se kao argumenti alju podaci 5

    i 3, i koja daje kao rezultat 8.

    Meutim, sa aspekta objektno orijentisane filozofije, u ovom sluaju se nad podatkom 5

    primjenjuje akcija + 3

    (koju moemo tumaiti kao poveaj se za 3) koja ga transformie u novi podatak 8.

    Meutim ne moe se rei da je bilo koja od ove dve filozofije ispravna a da je druga neispravna. Obe su ispravne, samo imaju razliita gledita. Meutim, praksa je pokazala da se za potrebe razvoja sloenijih programa objektno orijentisana filozofija pokazala znatno

    efikasnijom, produktivnijom, i otpornijom na greke u razvoju programa.

  • Prednosti OOP

    Sposobnost jednostavnog korienja delova koda u razliitim programima, tedei vreme u analizi, dizajnu, razvoju, testiranju, i debagovanju,

    Sposobnost

    kupovine delova postojeeg, testiranog koda da bi se u razvoju omoguio komponentno-zasnovani pristup, smanjeni trokovi razvoja,

    Sposobnost jednostavne podele velikih programerskih projekata izmeu razvojnih timova, poboljane karakteristike debagovanja i testiranja, vii kvalitet softvera,

    Sposobnost

    da se programski zadaci, koji su preveliki da bi se reili u jednom kratkom raunu, podele i ree,

    Sposobnost kreiranja jednostavnih i konzistentnih sredstava za meudelovanje razliitih tipova objekata, pri emu se krije kompleksnost razlika koje postoje iza zavjese.

  • Svi programski jezici obezbeuju podrku odreenim apstraktnim kategorijama.

    Asemblerski jezik

    poseduje nizak nivo apstrakcije u odnosu na fiziku mainu (hardware).

    Veina imperativnih programskih jezika

    (FORTRAN, BASIC, C) su samo apstrakcije asemblerskog jezika pa, iako predstavljaju znaajan napredak u odnosu na asemblerski jezik, u osnovi njihove apstrakcije lee kategorije koje odgovaraju arhitekturi raunarskog sistema a ne problema koji se reava.

    U ovom sluaju, zadatak programera je da uspostavi korespondenciju izmeu domena reenja (apstraktnog modela maine) i domena problema (apstraktnog modela realnog sveta).

    Napor koji je neophodno uloiti u ovo preslikavanje, a koji u jednom delu lei u samoj strukturi korienog programskog jezika,

    esto nema adekvatnu valorizaciju budui da rezultuje programima niskog stepena semantike.

  • Alternativa prethodno opisanom pristupu je modeliranje problema koji se reava.

    Prvi programski jezici koji su razvijeni na problemskoj orijentaciji uvode specifine apstrakcije realnosti na kojima zasnivaju postupak preslikavanja

    domena problema u domen reenja.

    Tipini primeri su sledei pristupi:

    Sve probleme je mogue apstrahovati listom i operacijama nad njom (LISP

    LISt Processing).

    Svi problemi su algoritamske prirode (APL-Algoritmic Programming Language).

    Svi problemi se daju iskazati kao lanci odluivanja (PROLOG

    PROgramming LOGic).

    Svi problemi se mogu iskazati kao skup apstraktnih ogranienja i manipulacija sa njima (Constraint Based Programming).

    Svi navedeni pristupi predstavljali su dobra reenja za odreenu usku klasu problema za koju su objektivno i dizajnirani, ali svaki pokuaj generalizacije iskoraka van inicijalnog domena gotovo bez izuzetka rezultuje neuspehom.

    Objektno-orijentisani pristup

    posebnim ini obezbeenje alata i mehanizama za iskazivanje problema pojmovima iz domena problema.

    Apstrakcije koje ono uvodi su dovoljno opte tako da programer nije ogranien jednim domenom primene. Sada postaje bitno ta uraditi a ne kako uraditi.

  • C++ nije isti OOP jezik jer se moe koristiti kao malo bolji

    C.

    C++ uvodi sasvim drugaiji nain programiranja

    C++ vie vremena troi na projektovanje reenja a manje na implementaciju ( kodiranje )

    C++ razmilja najpre o problemu a tek posle o programskom reenju

    C++ razmilja o delovima sistema ( objektima ) koji neto rade a ne o tome kako se neto radi. Koristi se objektna dekompozicija

    umesto algoritamske dekompozicije.

    C++ panju prebacuje sa relacija na meusobne veze izmeu delova ( vea redukcija i stroga kontrola tih veza ) a smanjuje se interakcija izmeu softverskih delova programa.

    C++

  • Objektno-orijentisano programiranje

    Predstavlja implementacionu metodu kod koje su programi organizovani kao kooperativni skup objekata pri emu svaki objekat predstavlja instancu neke klase iz hijerarhije klasa nastale na bazi relacija nasleivanja (inheritance).

    Objektno-orijentisani dizajn

    Predstavlja projektantsku metodu koja obuhvata proces objektno orijentisane dekompozicije i notaciju za iskazivanje logikih i fizikih kao i statikih i dinamikih modela posmatranog sistema.

    Objektno-orijentisana analiza

    Predstavlja analitiarsku metodu koja zahteve

    (requirements) posmatra iz perspektive KLASA i OBJEKATA

    koji pripada domenu problema.

    Elementi objektnog modeliranja

    Razlikujemo etiri osnovna:APSTRAKCIJA ( Abstraction )ENKAPSULACIJA ( Encapsulation )NASLEIVANJE

    ( Inheritance )POLIMORFIZAM

    ( Polymorphism )

    i tri sporedna:TIPIZACIJA ( Typing )KONKURENCIJA ( Concurency )PERZISTENCIJA ( Persistency )elementa objektnog modeliranja.

  • APSTRAKTNI TIPOVI PODATAKAABSTRACT DATA TYPES

    ENKAPSULACIJAENCAPTULATION

    Pored ( int, float, char ) proizvoljno se definiutipovi ( complex, point, disk, jabuka )

    nad kojima korisnik vri operacije-multiple instances-

    Definie ta se sa tipom moe raditi a nainkako se to radi "sakriva" se od

    korisnika

    NASLEIVANJEINHERITANCE

    POLIMORFIZAMPOLYMORPHISM

    Od klase npr. Printer sa svojim operacijamaprintline, lineFeed, formFeed, dovoljno je

    formirati tip PrinterWithFont kojinesleuje sve osobine starog

    Raniji delovi programa koji koriste Printer nemoraju se prepravljati jer e jednako dobro

    raditi i sa tipom PrinterWithFont,ak se ne moraju prevoditi

    Elementi objektnog modeliranja

  • Apstraktni tipovi podataka - klase, objekti i poruke

    Apstrakcija podataka predstavlja prvi korak ka objektno-

    orijentisanom programiranju.

    Kljuni pojmovi u ovim jezicima su:

    pojam objekta i

    pojam klase. Klasa je slina apstraktnom tipu podataka po tome to

    definie strukturu objekata i eksterni interfejs, funkcije i procedure (u terminologiji objektnih jezika metode) kojima se moe delovati na objekte. Moe se rei da klasa opisuje strukturu i ponaanje objekata. Objekti su pojedninani primerci, instance klase. Svi objekti jedne klase imaju strukturu definisanu klasom i nad njima se mogu izvravati samo operacije definisane klasom kojoj pripadaju.

  • Apstrakcija

    Bitan element objektno orijentisanih jezika. injenica je da se ovek bori sa sloenim situacijama apstrahovanjem.

    Na primer, niko ne zamilja automobil kao skup desetina hiljada pojedinanih delova, ve

    ga prihvata kao dobro definisan objekat koji se ponaa na jedinstven nain.

    Ovakvo apstrahovanje omoguuje nam da sednemo u automobil i obavimo

    kupovinu ne optereujui se

    sloenou mehanizma automobila. Na taj nain moemo

    da zanemarimo

    detalje rada motora,

    prenosnog mehanizma i konica i da objekat koristimo

    kao celinu.

  • Apstrakcija

    Siguran nain za snalaenje u apstrakcijama predstavlja korienje hijerarhijske klasifikacije. To nam dozvoljava da semantiku sloenih sistema uredimo

    po slojevima, razdvajajui ih na celine kojima se lake upravlja.

    Gledajui spolja, automobil predstavlja jedinstven objekat.

    Kada uemo

    u njega, vidite da se on sastoji od vie podsistema:

    za upravljanje,

    za koenje,

    za signalizaciju,

    za obezbeivanje putnika,

    za zagrevanje,

    za komunikaciju itd.

    Svaki od ovih podsistema je sastavljen od delova koji su jo

    vie specijalizovani. Na primer, ozvuenje se sastoji od radio-

    aparata, CD plejera i/ili kasetofona. Vano je da shvatite da vi upravljate sloenim sistemom automobila (ili bilo kojim drugim sloenim sistemom) koristei hijerarhijsko apstrahovanje.

  • Apstrakcija

    Hijerarhijsko apstrahovanje sloenih sistema moe se primeniti i na raunarske programe.

    Podaci iz tradicionalnih procesno orijentisanih programa apstrahovanjem se mogu pretvoriti u sastavne objekte.

    Niz procesnih koraka moe da postane zbirka poruka izmeu dva objekta. Na taj nain, svaki od ovih objekata opisuje sopstveno jedinstveno ponaanje.

    Ove objekte moemo

    smatrati posebnim celinama koje reaguju na poruke kojima im se saoptava da neto urade. To je sutina objektno orijentisanog programiranja.

  • Apstraktni tipovi podataka - klase, objekti i poruke

    Imena korisnika i telefonski brojevi su podaci klase nad kojima se mogu izvravati metodi klase kao to su: dodavanje novog broja, traenje po broju ili imenu i slino.

    Klasa moe da se posmatra kao ablon objekata (template) kojim se opisuje model po kome e se kreirati novi objekat. Klase se ponekad nazivaju fabrikama objekata, ime se naglaava algoritamska priroda kreiranja objekata.

    Kljuni pojam u terminologiji objektnih jezika su poruke. Kaemo da na objekte delujemo porukama, pri emu svaka poruka predstavlja poziv metoda (funkcije ili procedure) definisanog u klasi kojoj objekat pripada. Objekat odgovara na poruku time to se izvrava odgovarajui metod

    Pristup poimenu

    Premetanjesloga

    Promenasloga

    tampanje

    Dodavanje

    Broj

    IMENA

    BROJEVI

  • Apstraktni tipovi podataka - klase, objekti i poruke

    Dok se kod proceduralnih jezika program moe posmatrati kao skup potprograma (procedura i funkcija) kojima se prosleuju podaci, kod objektnih jezika program se razvija kao skup objekata koji deluju jedni na druge slanjem poruka. Odgovor objekta na odreenu poruku zavisi od klase u kojoj je definisan.

    PODACI REZULTATIPROGRAM IPROCEDURE

    BLOK DIJAGRAM PROCEDURALNOG PROGRAMIRANJA

    BLOK DIJAGRAM OBJEKTNOG PROGRAMIRANJA

    Objekti

    podaci

    poruke

  • Apstraktni tipovi podataka - klase, objekti i poruke

    Generiko stablo klase motornih vozila

    Grupisanjem slinih objekata stvara se klasa kao novi tip podataka koji sadri zajednika svojstva objekata iz svog

    sastava.

    motorno vozilo

    vazdu vozilo

    no plovilo kopneno vozilo

    avion pomorsko drumskohelikopter reno insko

    motorni brod gliser

    teglja

    leper

    autobuskamion

    automobil

    tramvaj voz

  • Kapsuliranje

    Kapsuliranje (engl. encapsulation) predstavlja mehanizam koji povezuje naredbe i podatke sa kojima one rade, i oboje titi od spoljnih uplitanja i zloupotreba. Kapsulirani kd dobija "zatitnu auru"

    koja titi naredbe i podatke od proizvoljnog pristupa izvan aure. Pristupanje naredbama i podacima unutar aure strogo se kontrolie pomou dobro definisanih standarda.

    Da bismo ovu situaciju pribliili stvarnosti, razmotrimo ponaanje automatskog menjaa u automobilu. Ovaj sistem kapsulira na stotine podataka o motoru, na primer, ubrzanje, zatim podatke o nagibu puta, kao i o poloaju ruice menjaa. Kao korisnik, vi moete da utiete na ovu sloenu strukturu samo na jedan nain: pomeranjem ruice menjaa. Na ponaanje menjaa ne moete da utiete pritiskajui migavce, na primer, ili pokreui brisae. Shodno tome, ruica menjaa jeste ono to predstavlja dobro definisan (u stvari, i jedini) nain pristupa menjau. tavie, ono to se dogaa unutar menjaa ne utie na objekte izvan njega.

  • Kapsuliranje

    Osnova kapsuliranja je

    klasa. Mada emo o

    klasama detaljnije govoriti u nastavku, potrebno je da na ovom mestu ukaemo na sledee:

    Klasa (engl. class) definie strukturu i ponaanje (podatke i naredbe) zajednike za skup objekata.

    Svaki objekat odreene klase ima strukturu i ponaanje definisane klasom, ba

    kao da

    predstavlja repliku klase.

    Zbog ovoga se objekti ponekad nazivaju primercima ili instancama klase. Na taj nain klasa predstavlja logiku konstrukciju; objekat predstavlja fiziku realnost.

  • Kapsuliranje

    Poto je svrha klase da kapsulira sloenost, postoje mehanizmi za skrivanje sloenosti naina rada unutar klase. Svaka metoda ili promenljiva unutar klase moe da bude privatna ili javna.

    Javni (engl. public)

    deo klase predstavlja sve ta

    spoljni korisnici klase treba ili mogu da znaju.

    Privatnim (engl. private)

    metodama i podacima moe da pristupi samo kd klase. Kd izvan te klase ne moe da pristupi privatnoj metodi ili promenljivoj.

    Poto privatne lanove klase drugi lanovi naeg programa mogu da dosegnu samo preko javnih metoda klase, na taj nain se obezbeujete od neodgovarajuih akcija.

  • Nasleivanje

    Veina ljudi smatra da je svet prirodno sainjen od objekata meusobno povezanih na hijerarhijski nain, npr. ivotinja, sisara i pasa. Ako bi eleli da ivotinje opiemo apstraktno, rekli bi da one imaju izvesne osobine, npr. veliinu, inteligenciju i vrstu skeletnog sistema. ivotinje imaju i odreene aspekte ponaanja: one jedu, diu i spavaju. Ovakav opis osobina i ponaanja predstavlja definiciju klase ivotinja.

    Ako elimo da definiemo odreeniju klasu ivotinja, npr. sisare, oni bi takoe morali imati odreenije osobine, npr. mlene lezde i tip zuba. Kaemo da su sisari potklasa (engl. subclass) ivotinja, a ivotinje su sisarima natklasa (engl. superclass).

    Poto su sisari samo ue definisane ivotinje, oni nasleuju sve osobine ivotinja.

    Potklasa koja se nalazi duboko u hijerarhiji nasleuje osobine svih svojih predaka u hijerarhiji klase.

  • Nasleivanje

    Nasleivanje (engl. inheritance) je proces kojim jedan objekat dobija svojstva drugog objekta.

    Nasleivanje je vano jer podrava koncepciju hijerarhijske klasifikacije (tj. odozgo nadole).

    Na primer zlatni retriver je deo klase pas, koja je deo klase sisar, koja je deo vee klase ivotinja.

    Bez postojanja hijerarhije, za svaki objekat bi se morale eksplicitno zadati sve njegove karakteristike.

    Meutim, ako postoji nasleivanje, za objekat treba definisati samo one karakteristike koje ga ine jedinstvenim u klasi.

    Opta svojstva objekat moe da nasledi od roditelja. Na taj nain, nasleivanje predstavlja mehanizam koji omoguuje da jedan objekat bude poseban sluaj nekog optijeg objekta.

  • Nasleivanje

    Nasleivanje je povezano i sa kapsuliranjem.

    Ako klasa kapsulira neke osobine, onda e svaka potklasa imati te osobine ali i osobine kojima se potklasa izdvaja.

    Ovo je kljuna koncepcija koja omoguuje da sloenost objektno orijentisanih programa raste linearnom, umesto geometrijskom progresijom.

    Nova potklasa nasleuje sve osobine svih svojih predaka.

    Ona ne dolazi u dodir sa veinom ostalog

    koda u sistemu na nepredvidljiv nain.

  • Nasleivanje

    Nasleuju se sva svojstva postojee klase i njima se dodaju nova.

    Uspostavlja se is-like-a

    relacija

    Class Derived extends Base {}

  • Nasleivanje

    Nasleivanje omoguava da se definiu nove klase na osnovu postojeih.

    Nova klasa se definie kao specijalizacija ili proirenje neke klase koja ve

    postoji.

    Nova klasa inicijalno ima sva svojstva klase koju nasleuje.

    Novoj klasi mogu da budu pridodata nova svojstva.

    Kada jedna klasa, u OO

    terminologiji podklasa (subclass, child class, derived class),

    nasleuje neku klasu ,

    u OO

    terminologiji superklasa (superclass, parent class, base class), onda podklasa nasleuje sva svojstva superklase.

  • Nasleivanje

    Podklasi mogu biti pridodata nova svojstva (podaci, metodi, poruke), a neka svojstva (prvenstveno metodi) mogu biti izmenjena sa ciljem da se nova klasa prilagodi specifinimpotrebama.

    Sva dodata svojstva i izmene odnose se na poklasu (subclas) dok originalna klasa (superclas) ostaje nepromenjena.

    Svojstva koja nisu definisana u podklasi automatski se preuzimaju iz njene superklase.

  • ta se moe menjati

    Nove poruke, time se proiruje interfejs nove klase. Za svaku novu poruku treba da bude definisan odgovarajui metod.

    Novi podaci instanci,

    time se proiruje struktura objekata. Posmatrano sa strane apstrakcije objekti podklasa su specijalizovani (detaljnije opisani) od objekata superklasa. Subklase ne samo da imaju veu funkcionalnost ve

    imaju i vie svojstava..

    Postojei metodi mogu biti predefinisani,

    na taj nain se modifikuje ponaanje objekta. U ovom sluaju govorimo o predefinisanju (overriding)

    metoda.

  • Primer nasleivanja

  • IS A relacija

    Nasleivanjem se definie

    IS A

    relacija izmeu originalne klase i nove, izvedene klase.

    Kako objekti podklase mogu da prime sve poruke kao i objekti superklase oni se mogu koristiti svuda gde se mogu koristiti i objekti superklase.

    Svaki objekat jedne klase je i (is an)

    objekat njene superklase.

  • Hierarhija klasa

    Object C1 C1a

    C1b

    C2 C2a

    C2bPrimer hierarhije klasa

    Kada se nasleivanje primeni viestruko dobija se struktura tipa stabla koja se obino naziva hierarhija klasa.

  • Polimorfizam

    Polimorfizam (engl. polymorphism), re

    grkog porekla, znai "mnogo oblika"

    i predstavlja osobinu koja omoguuje da se jedan nain pristupa koristi za optu klasu akcija.

    Specifinost akcije bie odreena tanom prirodom situacije. Razmotrimo stek (strukturu "poslednji koji ue, prvi izlazi"):

    Moemo da imamo program kome su potrebne tri vrste steka: jedan za cele brojeve, drugi za brojeve u pokretnom zarezu, a trei za znake.

    Algoritam kojim se obrazuju stekovi uvek je isti, bez obzira na to to se u njima uvaju razliiti podaci. U jezicima koji nisu objektno orijentisani morali bi za svaki stek da napiemo poseban skup naredbi u kojima bi se koristila razliita imena. Meutim, zbog postojanja polimorfizma, u C*++ moemo da definiemo opti skup naredbi za stekove koji e imati ista imena.

  • Polimorfizam

    Uopteno govorei, koncept polimorfizma esto se prikazuje frazom "jedan nain pristupa, vie metoda".

    Ovo znai mogunost pravljenja opteg naina pristupa za rad sa grupom srodnih aktivnosti.

    To pomae smanjenju sloenosti, omoguujui da se istim nainom pristupa zada opta klasa akcija.

    Na prevodiocu je da odabere specifinu akciju (tj. metodu) shodno situaciji. Programer ne mora runo da bira. Potrebno je samo da zapamti i iskoristi opti pristup.

  • Polimorfizam

    Polimorfizam se esto navodi kao najae svojstvo OO jezika.

    Termin oznaava vie formi

    -

    "many forms", i u kontekstu objektnih jezika ukazuje na mogunost da se metodi vie objekata pozivaju preko istog interfejsa.

    Sposobnost da raziliiti objekti odgovore ne iste objekte (na sebi svojstven nain).

    Koristi se isti interfejs za ratliite objekte.

  • Polimorfizam

    Zakasnelo povezivanje.

  • Jo

    jedan primer polimorfizma

    Shape c = new Circle();Shape t = new Triangle();Shape s = new Square();// ...c.draw();t.draw();s.draw();

  • Polimorfizam, kapsuliranje i nasleivanje meusobno sarauju

    Kada se primene na odgovarajui nain, polimorfizam, kapsuliranje i nasleivanje stvaraju programsko okruenje koje podrava razvoj mnogo robusnijih i prilagodljivijih programa nego to omoguuje procesno orijentisan model.

    Dobro dizajnirana hijerarhija klasa predstavlja osnovu za ponovljeno korienje koda u ije smo

    razvijanje i proveravanje uloili vreme i trud.

    Kapsuliranje omoguuje da tokom vremena menjamo

    unutranju konstrukciju ne remetei kd koji se oslanja na javni interfejs naih klasa.

    Polimorfizam omoguuje da napravimo

    ist, smislen, itljiv i elastian kd.

  • Polimorfizam, kapsuliranje i nasleivanje meusobno sarauju

    Od dva primera iz stvarnog sveta koja smo koristili, automobil potpunije ilustruje snagu objektno orijentisanog dizajna. O psima je zabavno raspravljati kada govorimo o precima, ali automobil vie lii na program.

    Svi vozai se oslanjaju na nasleivanje kada sedaju u razliite vrste (potklase) automobila.

    Nije vano da li je u pitanju kolski autobus, Mercedes sedan, Pore ili porodini kombi, svi vozai e uglavnom pronai i umeti da koriste upravlja, konice i pedalu gasa.

    Nakon izvesnog kranja zupanika, veina vozaa e shvatiti razliku izmeu obinog i automatskog menjaa, jer svi u osnovi shvataju njihovu natklasu, prenosni mehanizam.

  • Apstraktne klase i interfejsi

    Osnovne klase koje slue kao osnova za generisanje novih klasa.

    Shapeprintresize

    Lineprintresize

    Circleprintresize

    BoldLineprintresize

  • -

    ima krila,

    leti

    Apstrakcija

    Mentalni

    proces

    izdvajanja

    nekih

    karakteristika

    isvojstava

    i iskljuivanja

    preostalih koja nisu relevantna

    44z Apstrakcija je uvek sa nekim ciljem, namenomz Istre stvari mogue je apstrakovati na vie razliitih nainaz Svaka apstrakcija je nepotpuna slika realnosti Ne elimo potpunost, ve samo adekvatno modeliranje!

  • Tipovi

    apstrakcije

    Klasifikacija

    grupa

    slinih

    instanci

    objekta

    DBMSsoftware

    Sybase. . .Access Oracle

    Istiu se zajednika svojstva i ignoriu posebna

    Microsoftsoftware

    Word PowerPoint . . .

    RelacijaIS_MEMBER_OF

    RelacijaIS_MEMBER_OF

  • Tipovi apstrakcije

    agregacija

    grupa

    razliitih skupova

    objekataavion

    Motori. . .Krila Tokovi

    RelacijaIS_PART_OF

    ignoriu se razlike izmeu delova -Koncentriemo se na injenicu da oni ine

    celinu

  • Tipovi apstrakcije

    generalizacija

    grupa

    slinih skupova

    objekata

    student

    poslediplomci. . .redovni vanredni

    IS_Arelationship

    Uoimo razliku izmeu klasifikacije i generalizacije

    klasifikacija

    primenjuje se na

    individualne

    instance

    objekata

    generalizacija

    na skup objekata

    (klase)

    superclass/supertype

    subclass/subtype

  • Tipovi apstrakcijestudent

    Redovni student

    Jovan. . .Saa Tijana

    . . .Ime Broj indekasa

    generalizageneralizacijacija

    agregaagregacijacija

    klasifikacijaklasifikacija

  • OO jeziciALGOL Objective-C

    Smalltalk

    Pascal

    C

    C++

    Eiffel

    SIMULA

    LISP Flavors Loops CLOS

    Object Pascal

    Actor

    Java

    Delphi

  • Smalltalk

    Smalltalk-80 verzija iz

    1980.

    Program se sastoji od poruka ija sintaksa odgovara uproenom engleskom jeziku

    Na objekte se deluje porukama koje prestavljaju pozive metoda.

    Dinamika implementacija, kasno povezivanje.

    krug

    := Circle new;krug

    center: x @ y radius:r;vert

    := Line new; vert

    start: x @ (y-r);vert

    end: x @ (y+r);hori

    := Line new; hori

    start: (x-r) @ y;hori

    end: (x+r) @ y;ckrug

    display; vert

    display; hori

    display;

  • C++

    1980 Bjarne

    Stroustrup

    je projektovao skup jezika koji su bili nazvani "C With Classes"

    to je posluilo kao osnova za definisanje jezika C++.

    Proirenje programskog jezika C

    Statika implementacija. Klase su ujedno i tipovi podataka

    krug

    = new Circle(x,y,r)vert

    = new Line(x, x-r, x, y+r)hori

    = new Line(x-r, y, x+r, y)krug

    -> display()vert

    -> display()hori

    -> display()

  • Object Pascal

    -

    Delphi In 1986 Apple

    realizuje Object Pascal za

    Mac.

    1995 pojavljuje se Delphi-

    popularna verzija razvojnog okruenja (

    RAD tool) zasnovanog na Object Pascalu.

    New(krug); krug.ICircle(x,,y,,r);New(vert); vert.ILine(x,x-

    r,x,y+r);New(hori); hori.ICircle(x-

    r,y,x+r,y);krug.display; vert.display, hory.display

  • Java May 1995.

    Popularan je jer je jednostavniji od C++.

    Ima primenu u razvoju Internet aplikacija

  • O programskom jeziku C++

    ANSI

    stnadard za jezik C++ usvojen je l4. II. 1997. godine. Jezik C ++

    danas je jedan od

    najmonijih jezika za objektno orijentisano programiranje. Operativni sistem UNIX predstavlja prirodno okruenje za jezik C++, kao to je to sluaj i sa jezikom C. Ali, s obzirom da se radi o jeziku opte namene, nudi se i pod drugim operativnim sistemima kao to je MS-DOS i MS-Windows na danas vrlo populamirn linim raunarima tipa IBM-PC.

  • O programskom jeziku C++

    Ansi standard je pokuaj da se osigura da je C++ portabilan, da e se programski kod koji piete za Microsoftov prevodilac, prevesti bez greaka i kada koristite prevodilac nekog drugog proizvoaa. Poto programski kod u ovoj knjizi odgovara ANSI standardu trebalo bi da se prevede bez greke na Macintosh, Windows ili Alpha raunarima. Za veinu ljudi koji ue C ++ ANSI standard e biti neprimetan.

    Standard je stabilan ve

    neko vreme i svi glavni proizvodai ga podravaju. Uinili smo maksimalne napore da budemo sigurni da sav programski kod u ovom izdanju knjige odgovara ANSI standardu.

  • Visual C++ application build process

    Microsoft Foundation Class (MFC)

    biblioteka osnovnih klasa

  • Ulaz -

    Izlaz

    Ulaz i izlaz podataka treba da omoguava komunikaciju programa sa spoljnim svetom radi unoenja podataka za obradu i prikazivanje ili odlaganje rezultata. Zbog toga ne moe da se zamisli program bez ulaza i izlaza podataka. Uprkos tome, ulaz i izlaz podataka nije deo jezika C++ u tom smislu to ne postoje zasebne naredbe za izvodenje tip radnji. Umesto toga postoje odgovarajue biblioteke klase za njihovo ostvarivanje.

  • Ulaz -

    Izlaz

    Za rad sa datotekama

    ( tokovima na magnetnim diskovima ) postoje tri klase opisane u zaglavlju fstream.h.:

    Klasa ofstream predviena je samo za izlazne datoteke,

    klasa ifstream

    samo za ulazne datoteke, dok

    klasa fstream

    za ulazno-izlazne datoteke.

  • Ulaz -

    Izlaz

    Za rad sa tokovima u operativnoj memoriji, takoe postoje tri klase. Opisane su u zaglavlju strstream.h.

    Klasa ostrstream

    slui samo za smetanje podataka u tokove,

    klasa istrstream

    samo za uzimanje podatka iz tokova, dok

    klasa strstream

    omoguava kako uzimanje tako i smetanje podatka u tokove.

  • Ulaz -

    Izlaz

  • Ulaz -

    Izlaz

    cin

    -glavni (standradni) ulaz tipa istream.

    Predstavlja tastaturu dok se ne izvri skretanje glavnog ulaza unutar samog programa ili u komandi operativnog sistema za izvravanje programa.

    cout

    -glavni (standardni) izlaz tipa ostream. Predstavlja ekran dok se ne izvri skretanje glavnog izlaza unutar samog programa ili u komandi operativnog sistema za izvravanje programa. Koristi se za ispisivanje podataka koji ine rezultate izvravanog programa.

  • Ulaz -

    Izlaz

    Letimian pogled na operatore toka :>

    Operatori toka >

    alternativa su funkcijama printf, scanf i ostalima iz datoteke stdio.h. Ovi operatori imaju dve prednosti:

    ne morate da koristite oznake formata ako ste zadovoljni podrazumevanim formatom;

    znaenje operatora se moete proiriti tako da rade i sa vaim klasama.

  • Ulaz -

    Izlaz

    f.ja iostream.h

    #include void main(){double a,b; cout > a;cout > b; cout

  • Ulaz -

    IzlazUoite sledee vane take u verziji koja koristi operatore toka cin i cout:

    Koristi se datoteka zaglavlja iostream.h, a ne datoteka stdio.h.

    Nisu potrebne oznake formata; nain prenosa odreuje tip objekta ( u ovom primeru a i b ). U tom pogledu, operatori toka su nalik iskazu PRINT u BASIC-u i malo se lake koriste nego funkcije printf i scanf.

    Operator adrese (&) ne primenjuje se na operande kad se koristi cin, kao to je sluaj kod funkcije scanf. (Tu ulazni tokovi vie lie na BASIC, jer koriste reference argumenata.)

    Podaci teku ka standardnom izlaznom toku (cout), to je obino ekran: cout > a;

    U objekte toka se znak za kraj reda upisuje pomou endl , dok se u

    C-u koristi izlazna sekvenca /n (to moe da se koristi i u C++-u).

  • Ulaz -

    IzlazU predhodnom primeru, poslednja dva reda :

    cout

  • Ulaz -

    Izlaz

    Ovaj trik moete upotrebiti i za itanje nekoliko brojeva u istom iskazu, jer svaki izraz oblika cin >> argument daje rezultat cin:

    cin >> a >> b >> c >> n;

  • Ulaz -

    Izlaz

    Operator za ulaz -

    cin

    >> ( dvostruko vee

    prevodi se kao jedan znak )

    sintaksa je:

    cin >>

    gde je cin objekat ( promenljiva ) klase ili tipa istream, unet sa tastature

    semantika je: cin >> ;

    cin >> {>>};

    cin >> promenljiva1>>

    promenljiva2>> ...>>promenljivaN;

  • Ulaz -

    Izlaz

    Da bi podatke uneli sa tastature moramo ih ukucati i preneti u operativnu memoriju pritiskanjem tastera ENTER kao to sledi na primeru:

    double a,b,c;

    cin >> a>>b>>c;

    moe biti uneto na razne naine pretpostavljajui da je a=1.1,b=2.2,c=3.3 :

    1.1 2.2 3.3 ENTER

    1.1 2.2 ENTER

    3.3 ENTER

    1.1 ENTER

    2.2 3.3 ENTER

    1.1ENTER 2.2ENTER 3.3 ENTER

  • Ulaz -

    Izlaz

    Operator za izlaz -

    cout

  • Ulaz -

    Izlaz

    ta biva ako broj elite da ispiete u heksadecimalnom ili oktalnom formatu? Funkcijom printf moete da uradite sledee:

    int n = 16; printf("n je %x heksadecimalno, %o oktalno, i %d dekadno.\n", n, n, n) ;

    Rezultat ovoga primera je:

    n je 10 heksadecimalno, 20 oktalno i 16 dekadno.

    Sledei primer koristi operatore toka i ispisuje isti rezultat:

    int n = 16;

    cout

  • FUNKCIJE STANDARDNIH BIBLIOTEKA

    Na ovom mestu nije loe napomenuti da standard ISO 98 jezika C++ predvia da standardna biblioteka jezika C++

    obavezno mora sadrati biblioteke sa sledeim zaglavljima:

    algorithm bitset cassert cctype cerrno cfloat

    ciso64 climits clocale math complex csetjmp

    csignal cstdarg cstddef cstdio cstdlib string

    ctime cwchar cwtype deque exception fstream

    functional iomanip ios iosfwd iostream

    iterator limits list locale map memory

    new numeric ostream queue set

    stack stdexcept streambuf string typeinfo

    utility

    valarray vector

    skup nestandardnih biblioteka:

    biblioteka sa zaglavljem Windows.h

    koja slui za pisanje Windows aplikacija

  • FUNKCIJE STANDARDNIH BIBLIOTEKA

  • FUNKCIJE STANDARDNIH BIBLIOTEKA

  • FUNKCIJE STANDARDNIH BIBLIOTEKA

  • Kljune rei u jeziku C++ su sledee:

  • Delovi C++ programa

    C++ program se sastoji od objekata, funkcija, promenljivih, konstanti i drugih delova. Ako posmatramo, raunajui na to da ve

    imamo dovoljno iskustva u pisanju programa na jeziku

    C, jednostavan program koji ima zadatak da na ekranu ispie poruku " Zdravo svete ":

    lin 1.

    #include

    lin 2.

    lin 3.

    int main()

    lin 4.

    {

    lin 5.

    cout

  • Delovi C++ programa

    U liniji 1.

    datoteka iostream.h je ukljuena u program. Prvi karakter u liniji je # znak to predstavlja signal predprocesoru. Svaki put kada pokrenete svoj prevodilac predrocesor se izvrava. Predprocesor analizira izvorni kod, traei linije koje poinju sa # i deluje na te linije pre nego to se prevodilac pokrene. Ovo je GLAVA PROGRAMA.

    Include

    je instrukcija predrocesoru koja kae, "Ono to sledi je naziv datoteke. Nai tu datoteku i postavi je na ovo mesto." Znai manje i vee oko naziva datoteke ukazuju predprocesoru da potrai tu datoteku na svim uobiajenim mestima. Ukoliko je va

    prevodilac pravilno konfigurisan, znaci < i > e ukazati predrocesoru da potrai datoteku iostream.h u direktorijumu koji sadri sve h datoteke za va

    prevodilac. Datoteka iostream.h (Input-Output-Stream) se koristi od strane naredbe cout, koja pomae pri ispisivanju na ekran. Rezultat linije 1. je da ukljui datoteku iostream.h u program, kao da ste je sami ukucali.

    Predprocesor (eng, preprocessor) se izvrava pre prevodioca, svaki put kada se prevodilac pozove. Predprocesor prevodi svaku liniju

    koja poinje znakom # u specijalnu komandu, pripremajui Vau izvornu datoteku za prevodilac.

  • Delovi C++ programa

    Linija 3.

    oznaava stvarni poetak programa funkcijom main(

    ). Svaki C++ program ima main(

    ) funkciju. Generalno, funkcija je blok koda, koja obavlja jednu, ili vie akcija. Obino funkcije pozivaju druge funkcije, ali funkcija main( ) je posebna. Kada se Va

    program pokrene main(

    ) se poziva automatski. Poput ostalih funkcija, main ( ) mora da iskae koju vrednost e vratiti. Tip povratne vrednosti za main(

    ) u ZDRAVO.CPP je void, to znai da ova funkcija nee vratiti nikakvu vrednost. .

    Sve funkcije poinju otvorenom velikom zagradom ( {

    ) i zavravaju se zatvorenom velikom zagradom ( }

    ). Zagrade za main(

    ) funkciju su u linijama 4 i 7. Sve izmeu otvorene i zatvorene velike zagrade se smatra kao deo funkcije

    -

    TELO PROGRAMA.

    Glavni deo programa je u liniji 5. Objekat cout se koristi za tampanje poruke na ekran. Evo kako se cout koristi: otkucajte re cout, iza koje treba da se nae operator izlazne redirekcije (

  • Delovi C++ programa

    //Kratak pogled na cout

    #include

    int main( )

    {

    cout

  • Delovi C++ programa

    ANALIZA:

    U liniji 3. naredba #include dovodi do ukljuivanja datoteke iostream.h u izvorni kod. Ovo je potrebno ako konstite cout i srodne funkcije.

    U liniji 6. je jednostavan primer upotrebe cout za tampu niza karaktera. Znak /n je specijalni znak za formatiranje. On ukazuje cout da tampa znak za novi red na ekran. Tri vrednosti su prosleene za cout u liniji 7 i svaka vrednost je odvojena operatorom izlazne redirekcije

  • Delovi C++ programa

    U liniji 8.

    tampa se poruka sa informacijom na ekran i zatim se posle nje koristi manipulator endl. Namena endl je tampanje znaka za prelazak u novi red na ekranu.

    U liniji 9.

    uvodimo /t

    novi znak za formatiranje. On umee tab karakter

    i koristi se u linijama 8. do l2. da bi se poravnao prikaz na ekranu. Linija 9. pokazuje da mogu biti tampane ne samo celobrojne vrednosti, ve

    i dugake celobrojne vrednosti ( eng. long integer ).

    Linija 10.

    je primer jednostavnog sabiranja unutar cout. Vrednost od 8+5 je prosleena cout. ali je 13 odtampano.

    U liniji 11. za cout je prosleeno 5./8. Termin ( float ) je pokazao cout da elite da se ovo izrauna kao decimalni broj, pa je zato odtampan razlomak.

    U liniji 12. za cout je prosleeno 7000*7000 a termin ( double) se koristi da ukae da elite prikaz rezultata u eksponencijalnom zapisu.

    U liniji 13.

    napisali ste uz svoje ime i prezime da je C ++ programer.

  • Delovi C++ programa

    Na sledeem primeru vidimo upotrebu naredbi za ulaz -

    izlaz i komentare:

    // Program Zad2.cpp

    #include

    int main()

    {

    // Ucitavanje prve promenljive

    cout > a;

    // Ucitavanje druge promenljive

    cout > b;

    // Postavljanje parametra p

    double p;

    p = 2*(a+b) ;

    // Postavljanje parametra s

    double s;

    s = a*b;

    // Stampanje p i s

    cout

  • Delovi C++ programa

    Sledi primer programa koji zahteva unos dva cela broja sa tastature, a koji zatim ispisuje njihov zbir:

    #include int main() {int broj_1, broj_2;cout > broj_1;cout > broj_2;cout

  • Komentari

    Kada piete program, sve je uvek jasno i, samo po sebi, razumljivo je ta elite da uradite. Zanimljivo je, medutim, da kada se mesec dana kasnije vratite programu, isti kod moe biti krajnje zbunjujui i nejasan. Nisam siguran kako se to uvlai u program, ali uvek tako biva.

    Tipovi komentara

    C++ komentari se mogu pojavljivati u dva oblika: kao dupla kosa crta ( //

    u jednom redu ) i kao kosa crta -zvezdica ( /*.......*/ u vie redova ).

    Komentar u obliku duple kose crte, koji emo pominjati kao komentar u C++ stilu, ukazuje prevodiocu da ignorie sve to sledi iza komentara, sve do kraja linije.

    Komentar kosa crta -zvezdica ukazuje prevodiocu da ignorie sve to ga sledi, sve dok ne naie na oznaku kraja komentara zvezdica -kosa crta (*/).

    Ovaj komentar emo pominjati kao komentar u C stilu. Svaki /* mora imati zatvarajui */.

    Kako ste i sami moda predpostavili, komentari u C stilu se koriste i u programskom jeziku C, dok komentari u C++ stilu nisu deo zvanine definicije C-a. Mnogi C++ programeri koriste stalno komentare u C++ stilu u svojim programima, dok komentare u C stilu koriste samo za izbacivanje velikih blokova koda u programu. Moete ukljuiti komentare u C++ stilu unutar bloka koda, stavljenog u komentar u C stilu: sve, ukljuujui i komentare u C++ stilu, ignorie se unutar oznaka komentara u C stilu.

  • Korienje komentara

    Kao generalno pravilo, ceo program treba da ima komentare na poetku, koji vam govore ta program radi. Svaka funkcija, takoe, treba da ima komentar za objanjenje ta funkcija radi i koje vrednosti vraa. Na kraju, svaki deo Vaeg programa koji je sloen treba komentarisati.

    Sledei listing demonstrira korienje komentara pokazujui da oni ne utiu na izvravanje programa, niti na njegov izlaz:

    1: //Program za objanjenje korienja komentara

    2: #include

    3: int main( )

    4: {

    5: /* Ovo je komentar

    6: i nastavlja se sve do zatvarajue

    7: oznake komentara zvezdica-kosa crta */

    8: cout

  • Komentari na poetku svake datoteke

    Dobra je ideja pisati blok komentara na poetku svake datoteke sa kodom, koju napiete. Stvarni stil tog bloka komentara je stvar linog ukusa. ali svako takvo zaglavlje treba da ukljui bar sledee informacije:

    naziv funkcije ili programa

    naziv datoteke

    ta ta funkcija ili program rade

    opis kako program radi

    ime autora

    istorijat revizija (beleka o svakoj promeni)

    koji prevodioci, povezivai i drugi alati su koneni pri izradi progama )

    dodatne beleke po potrebi.

    Veoma je vano obezbediti aurnost beleki i opise aurnim. Standardni problem sa zaglavljima je to se zanemare posle poetnog kreiranja i tokom vremena postanu vie smetnja nego pomo. Ali, ako se propisno auriraju, ona mogu biti od neprocenjive pomoi u razumevanju celog programa.

  • Obratite panju na taku i zarez!Verovatno najea greka poetnika u jezicima C i C++ jeste izostavljanje znaka taka i zarez ( ; ), ali se deava da se nae i tamo gde je izlian. Pravilo za korienje take i zareza je sledee: svaki iskaz zavrite takom i zarezom osim u sluaju:

    pretprocesorske komande, kao to su #include i #define,

    Sloenog iskaza: U praksi, ovo znai da taku i zarez ne piete posle zavrne vitiaste zagrade }

    izuzev ako je to kraj klase ili deklaracije promenljive.

    Jednostavan program prikazan u produetku ilustruje ovo pravilo i oba izuzetka.

  • Formatiranje ispisa

    Poznato je da funkcija printf nasleena iz jezika C poseduje obilje mogunosti za formatiranje ispisa. Sline mogunosti mogu se ostvariti pomou objekata izlaznog toka, samo na drugi nain. Funkcija width

    primenjena nad objektom cout

    postavlja eljenu irinu ispisa podataka

    ( irina se zadaje kao argument ), dok funkcija precision

    postavlja eljenu preciznost ispisa ( tj. broj tanih cifara )

    prilikom ispisa realnih podataka. Tako, na primer, ukoliko izvrimo sledeu sekvencu naredbi:

    cout

  • Formatiranje ispisacout
  • Formatiranje ispisa

    Biblioteka iomanip

    ( skraeno od engl. input-output Manipulators ) poseduje tzv. manipulatore (odnosno manipulatorske objekte) poput setw.

    Manipulatori

    su specijalni objekti koji se alju na izlazni tok

    ( pomou operatora

  • Formatiranje ispisa

    \b povratnik \f form feed \n nova linija \r carriage return \t horizontalni tab \v vertikalni tab \

    \

    obrnuta kosa crta \" dvostruke navodnice \

    ' jednostruke navodnice \

    (carriage return) nastavak linije \

    nnn vrednost karaktera

    Tabela Escape karaktera

  • Tipovi podataka

    Tipovi podataka

    Tipovi podataka odreuju mogue vrednosti

    koje podaci mogu da imaju i mogue operacije

    koje mogu da se izvode nad tim podacima. Podaci mogu da budu prosti

    (skalarni, nestrukturirani) ili sloeni

    (strukturirani). Prosti podaci ne mogu da se dele na manje delove koji bi mogli nezavisno da se

    obraduju, sloeni podaci sastoje se od nekoliko elemenata koji i sami mogu da budu prosti ili sloeni.

    Od prostih tipova jezik C++ poznaje samo numerike tipove: Medu njima razlikuju se celi brojevi i realni brojevi.

    Osnovne celobrojne tipove ine tipovi char

    i int. Varijante tih tipova oznaavaju se dodavanjem modifikatora ispred ovih oznaka:

    unsigned char, signed char, short int, long int, unsigned int, unsigned short int i unsigned long int.

    Ako se koristi modifikator, re

    int moe da se izostavi (na primer: short

    znai short int).

  • Tipovi podatakaIme/ Simbol

    formata Duina u bajtima Opis Dijapazon

    char/

    %c 1 Znak ili broj duine 8 bita

    signed:-128 -127unsigned: 0-255

    short/

    %d 2 Celi broj od 16 bita -32763 do 327620 do 65535long/

    %d 4 Celi broj od 32 bita -2147483648 do 2147483647

    0 do 4294967295

    int/

    %d 16,32,64 ? System Celi broj vidi short i long

    float/

    %f 4 Broj sa dec. zarezom 3.4 e38 (7 cifre)

    double/

    %f 8 Broj sa dec. zarezomdvostruke tanosti

    1.7e308(15 cifre)

    long

    double/ %f

    10 Broj sa dec. zarezomviestruke tanosti

    1.2e4932(19 cifri)

    bool 1 logiki true ili false

  • Tipovi podataka

    Osnovne realne tipove

    ine tipovi float

    (jednostruka tanost) i

    double

    (dvostruka tanost), a jedina varijanta tih tipova oznaava se sa long double

    (viestruka tanost).

    U programskom jeziku C++ promenljiva

    ( engl. variable ) je mesto za uvanje informacija odreeno svojim imenom i lokacijom u memoriji raunara. Ime promenljive, npr. mojaPromenljiva moe zauzeti zavisno od veliine ( tipa ) jednu ili vie memorijskih adresa.

    Kada definiete promenljivu u programskom jeziku C ++ , morate da prevodiocu date do znanja o kojem tipu promenljive je re: celobrojnoj (integer), znakovnoj (character) ili nekoj drugoj. Ove informacije saoptavaju prevodiocu koliko prostora da rezervie i koju vrstu vednosti elite da skladitite u svojoj promenljivoj.

  • Tipovi podataka

    //Primer za prezentaciju velicine odredjenih podataka u bajtima preko funkcije sizeof()

    1:#include

    2:

    3: int main()

    4:{

    5: cout

  • KONSTANTE

    U jeziku C, konstantne vrednosti se obino definiu pomou preprocesorske direktive #define:

    #define BrojStudenata 50#define PI 3.141592654

    Ovaj nain posjeduje mnoge nedostatke. Najvei nedostatak je to preprocesorski elementi ne podleu sintaksnoj kontroli i tipizaciji jezika, tako da eventualna greka u njihovoj definiciji esto ostaje neotkrivena, ili bude otkrivena tek prilikom njihove

    upotrebe. Stoga, u jeziku C++ ovaj nain treba izbegavati. Generalno, preprocesor nije u duhu

    C++-a, tako da njegovu upotrebu u C++-u treba smanjiti na najnuniji minimum ( po mogunosti, samo na direktivu #include

    ). Umesto toga, u C++-u konstante deklariemo kao i promjenljive, uz dodatak kljune rei const:

    const int BrojStudenata = 50;const double PI = 3.141592654;

    S obzirom da se kod konstanti moe govoriti samo o inicijalizaciji (a ne o dodeli), uputnije jekoristiti sintaksu koja ne koristi znak dodele, nego zagrade:

    const int BrojStudenata(50);const double PI(3.141592654);

    Konstante moraju biti inicijalizirane, tako da deklaracija poput

    const int broj; nije dozvoljena.

  • Logike promenljive

    Recimo nekoliko stvari o tipu bool.

    U jeziku C vrednosti tano

    i 1

    odnosno vrednosti netano

    i 0

    su poistoveene). Dugo vremena ( sve do pojave ISO 98 C++ standarda ) ista konvencija je vaila i u jeziku C++. Meutim standard ISO 98 C++ uveo je dve nove kljune rei true

    i false

    koje respektivno predstavljaju vrednosti tano

    odnosno netano. Tako je vrednost svakog tanog izraza true, a vrednost svakog netanog izraza false. Uvedena je i kljuna rije

    bool

    kojom se mogu deklarisati promjenljive koje mogu imati samo vrednosti true

    odnosno false. Na primer, ako imamo sledee deklaracije:

    bool u_dugovima, punoletan, polozio_ispit;

    tada su sasvim ispravne sledee dodele (uz pretpostavku da takoe imamo deklarisane brojane promjenljive stanje_kase

    i starost):

    u_dugovima = stanje_kase < 0;punoljetan = starost >= 18;polozio_ispit = true;

  • Pobrojani tipovi -

    enum

    Na ovom mestu dobro je rei neto o pobrojanim (engl. enumerated) tipovima.

    Pobrojani tipovi su postojali i u jeziku C, ali su oni predstavljali samo manje ili vie preruene celobrojne tipove. Njihov tretman u jeziku C++ je kompletno izmenjen, pri emu su, naalost, morale nastati izvesne nekompatibilnosti sa jezikom C. U jeziku C++ pobrojani tipovi predstavljaju prvi korak ka korisniki definisanim tipovima. Pobrojani tipovi opisuju konaan skup vrednosti koje su imenovane i ureene (tj. stavljene u poredak) od strane programera. Definiemo ih pomou deklaracije enum,

    iza koje sledi ime tipa koji definiemo i popis moguih vrednosti tog tipa unutar vitiastih zagrada

    ( kao mogue vrednosti mogu se koristiti proizvoljni identifikatori koji nisu ve

    iskoriteni za neku drugu svrhu ). Na primer, pomou deklaracija

    enum

    Dani {Ponedeljak, Utorak, Sreda, Cetvrtak, Petak, Subota, Nedelja};identino kao celobrojne konstante iz sledee deklaracije:

    const int

    Ponedeljak(0), Utorak(1), Sreda(2), Cetvrtak(3),Petak(4), Subota(5), Nedelja(6);

    enum

    Rezultat {Poraz, Nereeno, Pobeda};definiemo dva nova tipa nazvana Dani

    i Rezultat. Promenljive pobrojanog tipa moemo deklarisati na uobiajeni nain, na primer:

    Rezultat danasnji_rezultat;

    Dani danas, sutra;

  • Kompleksni brojevi

    Kompleksni brojevi predstavljaju korisno obogaenje jezika C++, koje je ulo u standard ISO 98 jezika C++. Kompleksni tip spada u tzv. izvedene tipove

    (engl. derived types) i predstavljen je reju complex. Kako ovaj tip nije ugraen u samo jezgro C++ nego je definisan u standardnoj biblioteci jezika C++, za njegovo korienje potrebno je ukljuiti u program zaglavlje biblioteke koje se takoe zove complex.

    U matematici je kompleksni broj formalno definisan kao par realnih brojeva, ali kako u jeziku C++ imamo nekoliko tipova za opis realnih brojeva (float, double i long double), kompleksne brojeve je mogue izvesti iz svakog od ovih tipova. Sintaksa za deklaraciju kompleksnih promjenljivih je

    complex popis_promjenljivih;

    gde je osnovni_tip tip iz kojeg izvodimo kompleksni tip. Na primer, deklaracijom oblika

    complex z;

    deklariemo kompleksnu promjenljivu z

    iji su realni i imaginarni deo tipa double. Kompleksni tipovi se mogu izvesti ak i iz nekog od celobrojnih tipova. Na primer, complex gauss;

    deklarie kompleksnu promjenljivu gauss

    iji realni i imaginarni brojevi mogu biti samo celobrojne vrednosti tipa int. Inae, kompleksni brojevi iji su realni i imaginarni dio celi brojevi imaju veliki znaaj u teoriji brojeva i algebri, gdje se nazivaju Gaussovi celi brojevi ( to je i bila motivacija da ovu promjenljivu nazovemo gauss

    ).complex z1(2, 3.5);

  • Sledei primer prikazuje program za reavanje kvadratne jednaine, uz upotrebu kompleksnih

    promenljivih:#include #include #include int main() {double a, b, c;cout > a >> b >> c;double d = b * b

    4 * a * c;if(d >= 0) {double x1 = (-b -

    sqrt(d)) / (2 * a);double x2 = (-b + sqrt(d)) / (2 * a);cout

  • VEKTORI

    Moemo rei da rad sa C-nizovima, mada sasvim legalan, nije u duhu

    jezika C++. Da bi se ovi problemi izbegli, u standard ISO 98 jezika C++ uveden je novi tip podataka, nazvan vector, koji je definisan u istoimenom zaglavlju standardne biblioteke

    jezika C++ (tako da za koritenje ovog tipa podataka moramo ukljuiti u program zaglavlje biblioteke vector).

    Ovaj tip podataka (zovimo ga prosto vektor) zadrava veinu svojstava koji poseduju standardni nizovi, ali ispravlja neke njihove nedostatke. Promenljive tipa vector

    mogu se deklarisati na nekoliko naina, od kojih su najei sledei:

    vector< tip_elemenata > ime_promenljive;vector< tip_elemenata > ime_promenljive(broj_elemenata);vector< tip_elemenata > ime_promenljive(broj_elemenata, inicijalna_vrednost);

    Na primer, vektor ocene, iji su elementi celobrojni, moemo deklarisati na jedan od sledeih

    naina:vector ocene;

    student[20]vector ocene(10);

    PetBroja[5]={10,20,30,40,50}vector ocene(10, 5);

    Prva deklaracija deklarie vektor ocene, koji je inicijalno prazan, odnosno ne sadri niti jedan element (videemo kasnije kako moemo naknadno dodavati elemente u njega). Druga deklaracija (koja se najee koristi) deklarie vektor ocene, koji inicijalno sadri 10 elemenata, a koji su automatski inicijalizirani na vrednost 0. Trea deklaracija deklarie vektor ocene, koji inicijalno sadri 10 elemenata, a koji su automatski inicijalizirani na vrednost 5.

  • VIEDIMENZIONALNI VEKTORI

    Vektori, o kojima smo govorili na prethodnom predavanju, lepo se

    mogu iskoristiti za kreiranje dvodimenzionalnih struktura podataka, poput matrica, i jo

    opitije, viedimenzionalnih struktura

    podataka. Tako se, na primer, matrice mogu formirati kao vektori iji su elementi vektori. Tako, recimo, matricu sa m redova i n kolona moemo formirati kao vektor od m elemenata iji su elementi vektori od n elemenata. To je najlake uraditi ovako:

    vectorime_matrice(m,vector(n));

    Na primer, matricu a

    sa 10 redova i 5 kolona, iji su elementi realni brojevi tipa double, moemo deklarisati ovako:

    vector Polje(5, vector(3)); ili

    Int Polje[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}

    Int Polje[5][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15}}

    Ova prividno rogobatna sintaksa zahtijeva paljiviju analizu. Prvo, mi ovim zapravo deklariemo vektor iji su elementi tipa vector, odnosno vektor vektora realnih brojeva, a to nam upravo i treba. Primetimo razmak izmeu dva znaka >

    u ovoj deklaraciji. Prvi parametar, 10, kao to znamo, predstavlja dimenziju vektora, drugi parametar predstavlja vrednost koja se koristi za inicijalizaciju elemenata vektora, konano dobijamo vektor od 5 elemenata, pri emu je svaki element vektor od 3 elementa, to nije nita drugo nego traena matrica formata 5

    3.

  • VIEDIMENZIONALNI VEKTORI//kreiranje visedimenzionalnog niza:#includeint main(){int SomeArray[5][2]={{0,0},{1,2},{2,4},{3,6},{4,8}};for(int i = 0; i < 5; i++)for(int j = 0; j < 2; j++) {cout
  • Program unosi sa tastature matricu sa zadanim brojem redova i kolona i vraca je kao rezultat

    vector UnesiMatricu(int br_redova, int br_kolona) {vector m = KreirajMatricu(br_redova, br_kolona);for(int i = 0; i < br_redova; i++)for(int j = 0; j < br_kolona; j++) {cout

  • KARAKTERI I STRINGOVI

    Sada emo prei na tretman stringova u jeziku C++. Kao to od ranije znamo, u C-u se stringovi predstavljaju kao obini nizovi iji su elementi znakovi (karakteri),

    tj. tipa char,

    pri

    emu se specijalni znak sa ASCII ifrom 0 koristi kao oznaka kraja stringa (zbog toga obino govorimo o nul-terminiranim nizovima znakova). Sve manipulacije sa stringovima posmatranim kao nul-terminiranim nizovima znakova rade i dalje bez ikakvih izmena u C++-u. Meutim, u C++-u je uveden novi tip podataka, nazvan

    string,

    koji nudi znatne

    olakice u radu sa stringovima u odnosu na pristup nasleen iz C-a. Stoga se u C++-u preporuuje korienje tipa string

    kad

    god se zahteva elegantna i fleksibilna manipulacija sa stringovima.

  • KARAKTERI I STRINGOVI

    Promjenljive tipa char

    se automatski ispisuju kao znakovi, bez potrebe da to naglaavamo i na kakav nain. Sledea sekvenca naredbi ilustruje ove injenice:

    char prvi, drugi, treci, cetvrti;cin >> prvi >> drugi >> treci >> cetvrti;cout

  • KARAKTERI I STRINGOVI//Program za demonstraciju rada sa karakternim podacima

    #includeint main(){char recenica[80];cout >recenica;cout

  • KARAKTERI I STRINGOVIObjanjenje programa za demonstraciju rada sa karakternim podacima:

    Bafer je definisan kao niz od 80 karaktera. On prihvata 79 karaktera dugaak string i

    null karakter za terminiranje. U liniji 6 korisnik unosi string koji se prenosi u bafer. Ako korisnik unese string dui od 79 karaktera viak se nee videti. Kada korisnik unese prazno mesto cin e to shvatiti kao kraj stringa i prestae da upisuje u bafer. Reenje ovog problema je funkcija cin.get.

    ?

  • KARAKTERI I STRINGOVI

    Ukoliko iz bilo kojeg razloga elimo da izdvojimo znak

    iz ulaznog toka, bez ikakvog ignorisanja, ma kakav on bio

    (ukljuujui razmake, specijalne znake tipa oznake novog reda '\n', itd.) moemo koristiti poziv funkcije get

    bez parametara nad objektom ulaznog toka. Ova funkcija izdvaja

    sledei znak iz ulaznog toka, ma kakav on bio, i vraa ga kao rezultat (ako je ulazni tok prazan, ova funkcija zahteva da se ulazni tok napuni sveim podacima). Da bismo shvatili kako deluje funkcija cin.get(), razmotrimo sledeu sekvencu naredbi:

    char prvi, drugi, treci, cetvrti;prvi = cin.get();drugi = cin.get();treci = cin.get();cetvrti = cin.get();cout

  • KARAKTERI I STRINGOVI

    Dva mogua scenaria izvravanja ovog programa prikazana su na sledeoj slici:

    U prvom scenariju, nakon izvrenog unosa, promenljive prvi

    i drugi

    sadre znakove a

    i b, promenljiva treci

    sadri oznaku za kraj reda, dok promenljiva cetvrti

    sadri znak c, koji sledi iza oznake kraja reda. Sada je sasvim jasno zbog ega ispis ovih promenljivih daje prikazani ispis. U drugom scenariju, nakon izvrenog unosa, promenljive prvi

    i drugi, treci

    i cetvrti

    sadre respektivno znak a, razmak, znak b

    i ponovo razmak.

  • KARAKTERI I STRINGOVI//Meutim, ako proirimo naredbu sa parametrima promenljive, njene duine i po potrebi definiemo terminator, onda je:

    #includeint main(){char recenica[80];cout

  • KARAKTERI I STRINGOVI

    Bilo kakva iole sloenija manipulacija sa tekstualnim podacima bila bi izuzetno mukotrpna ukoliko bi se oni morali obraivati iskljuivo znak po znak.

    Stoga je pomou funkcije getline

    nad objektom ulaznog toka mogue uitati itav niz

    znakova odjedanput. Ukoliko se koristi sa dva parametra, tada prvi parametar predstavlja niz znakova u koji se smjetaju proitani znakovi, dok drugi parametar predstavlja broj koji je za jedinicu vei od maksimalnog broja znakova koji e se proitati.

    char recenica[50];cin.getline(recenica, 51);

    Ukoliko se funkcija getline

    pozove sa tri parametra, tada prva dva parametra imaju isto znaenje kao i u prethodnom sluaju, dok trei parametar predstavlja znak koji e se koristiti kao oznaka zavretka unosa. Drugim reima, itae se svi znakovi sve dok se ne proita navedeni znak ili dok se ne proita onoliko znakova koliko je zadano drugim parametrom. Tako e poziv funkcije

    cin.getline(recenica, 51, '.');zatraiti unos sa ulaznog ureaja, a zatim proitati najvie 49 znakova iz ulaznog toka u niz recenica, pri emu se itanje prekida ukoliko se proita znak '.' (taka).

  • KARAKTERI I STRINGOVI

    Na primer, sledea sekvenca koristi dobro poznatu funkciju strlen

    iz biblioteke cstring za odreivanje duine niza karaktera:

    char a[100];cout

  • Whitespace eater-

    guta

    praznina

    Guta

    praznina

    (engl. c ili whitespace extractor), je u jeziku C++ imenovan prosto imenom ws.

    Drugim reima, nakon izvrenja izraza poput cin >> ws

    eventualne praznine sa poetka ulaznog toka bie uklonjene.

    int broj;char tekst[100];cout > broj >> ws;cout

  • Promjenljive tipa string

    Promenljive tipa string,

    koje za razliku od nul-terminiranih nizova znakova moemo zvati dinamiki stringovi, deklariu se na uobiajeni nain, kao i sve druge promenljive (pri tome re

    string, poput complex

    ili vector, nije kljuna re). Za razliku od obinih nizova znakova, pri deklaraciji promenljivih tipa string

    ne navodi se maksimalna duina stringa, s obzirom da se njihova veliina automatski prilagoava tokom rada. Promenljive tipa string, ukoliko se eksplicitno ne inicijaliziraju, automatski se inicijaliziraju na prazan string (tj. string koji ne sadri niti jedan znak, odnosno string duine 0), Dakle, deklaracija

    string s;

    deklarie promenljivu s

    tipa string

    koja je automatski inicijalizirana na prazan string.-

    string s = "Ja sam string!";cout

  • Funkcije tipa strcpy() i strncpy()

    Ovo su nasleene f-je iz bibliotele C jezika I slue za kopiranje jednog stringa u drugi:strcpy(string2,string1) i strncpy(string2,string1,MaxLength)

    Obavezno zahtevaju pozivanje hederske funkcije string.h.

    #include#includeint main(){char String1[]=Covek nije ostrvo;char String2[80];strcpy(String2,String1);cout

  • Funkcije tipa strcpy() i strncpy()//Funkcija STRNCPY#include#includeint main(){cons int MaxLength=80char String1[]=Covek nije ostrvo;char String2[MaxLength+1];strncpy(String2,String1,MaxLength);cout
  • Funkcije tipa strlen()

    Najee koriena funkcija koja vraa duinu nul-terminiranog niza je strlen().

    //Funkcija STRLEN#include#includeint main(){char buffer[80];cout

  • ALGEBRA KARAKTERA

    Primjenom operatora +konstrukcije

    bi se mogle napisati na sledei nain (

    i to bez potrebe za pisanjem

    posebne funkcije

    ):

    str3 = str1 + str2 + str3;

    str3 = str1 + "bla bla";

    str3 = "bla bla" + str1;

    str3 = znakovi_1 + str1;

    U posljednje tri konstrukcije dolazi do automatskog

    pretvaranja

    operanda koji je tipa niz znakova

    u

    tip string. Ipak, za primenu operatora +

    barem jedan od operanada

    mora biti dinamiki string.

    Stoga, sedee konstrukcije nisu legalne:

    str3 = "Dobar " + "dan!";

    str3 = znakovi_1 + "bla bla";

    str3 = znakovi_1 + znakovi_2;

    Naravno, kao i u mnogim drugim slinim situacijama, problem je reiv uz pomo

    eksplicitne konverzije tipa, na primer, kao u sledeim konstrukcijama (

    mogue su i brojne druge varijante

    ):

    str3 = znakovi_1 + string("bla bla");

    str3 = string(znakovi_1) + znakovi_2;

  • Operatori i

    izraziTip operacije Operacija Operator

    stepenovanje-korenovanje pow(x,y) mnoenje * deljenje /

    Multiplikovane operacije

    ostatak deljenja % sabiranje + Aditivne operacije

    oduzimanje - plus + Unarne operacije

    minus - manje <

    manje ili jednako

    vee ili jednako >= jednako =

    Relacije

    nejednako =

    Operatori predstavljaju radnje koje se izvravaju nad operandima dajui pri tome odreene rezultate. Izrazi su proizvoljno sloeni sastavi operanada i operatora.

  • Aritmetiki operatori

    Aritmetiki operatori

    slue za izvoenje osnovnih

    aritmetikih operacija. U njih spadaju binarni operatori za sabiranje (+), oduzimanje (-), mnoenje (*), deljenje (/) i nalaenje ostatka deljenja celih brojeva (%).

    Unarni operator + nema nikakvog efekta, a slui za izmenu algebarskog znaka broja. U jeziku C++ postoje jo

    dva unarna operatora( inkrementa i dekrementa

    )

    za poveavanje ( ++ ) i smanjivanje ( --

    ) vrednosti operanda za jedan. Ova dva operatora mogu da budu napisana ispred operanda (prefiksna notacija) kada je vrednost izraza nova vrednost operanda, ili iza operanda (postfiksna notacija) kada je vrednost izraza vrednost operanda pre promene.

  • Relacijski operatori

    Relacijski operatori slue za uporeivanje numerikih podataka i daju logike vrednosti.

    U jeziku C++ to

    znai celobrojnu vrednost 0 za logiku neistinu, odnosno celobrojnu vrednost 1 za logiku istinu. Ti operatori se obeleavaju sa

    == (jednako),

    ! = (razliito),

    < (manje),

    (vee) i

    >= (vee ili jednako).

  • Logiki operatori

    Logiki operatori

    slue za izvoenje logikih operacija nad

    logikim podacima dajui logiki rezultat.

    U jeziku C++ nulta vrednost operanda smatra se logikom neistinom, a bilo koja nenulta vrednost logikom istinom. Rezultati su 0 za logiku neistinu i iskljuivo 1 za logiku istinu.

    Postoje unarni operator za logiku ne( ! )

    operaciju i binarni operatori za logiku i

    (&&) i ili ( ||

    )

    operaciju. U sluaju

    operatora && prvo se izraunava vrednost prvog operanda i ako je to =0, rezultat je 0 i vrednost drugog operanda uopte se ne izraunava. u sluaju operatora ||

    prvo izraunava se

    vrednost prvog operanda i ako je to razliit od 0, rezultat je 1 i vrednost drugog operanda se uopte ne izraunava.

  • Operatori po bitovima

    Operatori po bitovima

    od standardnih viih

    programskih jezika postoje samo u jeziku C i jezika koji su proizali iz jezika C (C++, Java). Oni slue za manipulacije sa bitovima unutar celobrojnih podataka.

    Postoje unarni operator za komplementiranje bit po bit (~

    ) i binarni operatori za logike operacije i

    (&),

    ukljuivo ili (|) i iskljuivo ili (^), bit po bit. Pored toga postoje binarni operatori za pomeranje binarne vrednosti prvog operanda ulevo () za broj mesta koji je jednak vrednosti drugog operanda.

  • Uslovni operator

    Uslovni operator

    (?:) je specifian ternarni

    operator jezika C. lma tri operanda i pie se u obliku a?b:c. Prvo se izraunava vrednost izraza a i ako ima vrednost logike istine (razliito od 0), izraunava se vrednost izraza b i to predstavlja vrednost celog izraza. Ako a ima vrednost logike neistine (=0), izraunava se vrednost izraza c i to predstavlja rezultat celog izraza. Bitno je da se od izraza b i c uvek izraunava samo jedan.

  • Adresni operatori

    Adresni operatori slue

    za manipulisanje sa adresama

    podataka. U uem smislu, tu spadaju unarni operatori za nalaenje adrese datog podatka (&) i za posredni pristup podatku pomou pokazivaa (*) -

    koji se naziva i operatorom

    indirektnog adresiranja. U irem smislu u adresne operatore spadaju i aditivni aritmetiki operatori. Naime, dozvoljeno je na vrednost nekog pokazivaa (adrese) dodati celobrojnu vrednost, odnosno od nje oduzeti celobrojnu vrednost. Jedinica mere promene adrese u tim sluajevima je veliina pokazivanih podataka. Drugim reima ako pokaziva

    p

    pokazuje na neku komponentu datog niza, tada je p+l pokaziva

    na narednu, a p-l na prethodnu komponemu tog

    niza. Na kraju, dozvoljeno je i uporeivati vrednosti dva pokazivaa relacijskim operatorima, s tim da upotreba operatora = ima smisla samo ako oba operanda pokazuju na komponente istog niza.

  • Operatori inkrementiranja i dekrementiranja

    Operatori inkrementiranja i dekrementiranja:

    Operator inkrementiranja ++ i dekrementiranja --

    su unarni operatori istog prioriteta kao i unarni. Oba operatora primenjuju se iskljuivo na promenljive i javljaju se u prefiksnom i postfiksnom obliku.

    Operator inkrementiranja: + +

    promenljivoj p dodaje vrednost 1 , pa vai:

    p++ je ekvivalentno p=p+1

    ++ p je ekvlvalentno p=p+1

    Operator dekrementiranja

    --

    promenljivoj p oduzima vrednost 1, pa vai:

    p--

    je ekvivalentno p = p-1

    --p je ekvivalenlno p = p-1

    Ako u nekom izrazu postoji p++ ( postfiksni oblik

    ) vrednost promenljive se prvo koristi u izrazu, pa tek onda inkrementira. U sluaju da u izrazu postoji ++p ( prefiksni oblik ) promenljiva se prvo inkrementira, pa se tek onda njena vrednost koristi u izrazu.

    Slino prethodnom, ako u izrazu postoji p--

    ( postfiksni oblik

    ) vrednost se prvo koristi u izrazu, pa tek onda dekrementira, a u sluaju --p ( prefiksni oblik ) vrednost se dekrementira i tako aurirana koristi u izrazu.

  • Operatori inkrementiranja i dekrementiranja

    /*Program za prikaz inkrementa i dekremanta */

    #include

    main()

    {

    int a = 0, b = 0, c = 0;

    cout

  • :

    9 ()9 9

    :

    9 9

  • , :

    ,

    ,

    ,

  • 9

    9

    9 9

  • (

    : 0, 1

    )

    (

    )

  • ( )

  • :

    9

    9

    ()

  • Funkcije

    U C++-u postoji samo jedna vrsta podprogramiranja -

    funkcija. Funkcije koje ne vraaju nikakvu vrednost deklariu se sa void,

    a one koje je vraaju imaju povratni tip kao to je int, double

    ili float. Ovo pojednostavljuje sintaksu C++-a -ne postoje zasebne rei Sub i Function kao u Visual Basicu.

    Sigurno ste se ranije sretali s funkcijama. Funkcija moe imati jedan argument ili vie njih, a ne mora imati nijedan ( u zavisnosti od toga kako je deklarisana ) i izraunavanjem daje vrednost koja se potom moe koristiti u veem izrazu. Na narednoj slici je prikazano kako bi mogao da radi poziv funkcije

    Hipotenuza.

    Rezultat izraza Hipotenuza(3.0. 4.0) je poziv funkcije Hipotenuza i prosleivanje vrednosti dva parametra 3.0 i 4.0. Funkcija koristi iskaz return da bi vratila kontrolu onome ko je pozvao funkciju i da bi vratila rezultat, duinu hipotenuze -vrednost 5.0.

    double Hipotenuze (double a, double b){

    return sqrt( a*a + b*b );

    }

  • Opta sintaksa za funkcije

    Opta sintaksa u C++ programu kada su u pitanju funkcije sledi po ablonu prikazanom na sledeoj slici.

    Pre nego to funkciju pozovete morate je deklarisati; tome slue prototipi_funkcije. Prototip funkcije prua prevodiocu informacije o tipu tako da on

    zna koji tip argumenata da oekuje.

    direktive_include i ostale predprocesorske direktive

    prototipi_funkcija ;

    void main()

    {

    deklaracije_i_iskazi }

    povratni_tip ime funkcije (argumenti)

    {

    deklaracije i iskazi }

    Format prototipa funkcije izgleda skoro identino kao format prvog reda (zaglavlja) definicije funkcije:

    povratni_tip ime_funkcije( argumenti) ;

    Prototip

    funkcije se zavrava takom i zarezom (;).

    Nemojte stavljati taku i zarez iza zavrne vitiaste zagrade }

    definicije

    funkcije. Po tome ih i jeste lako razlikovati.

  • Opta sintaksa za funkcije

    Primer: Sintaksa funkcije ima vie smisla kada se pokae na primeru. Slika u nastavku ilustruje svaki deo sintakse funkcije ukljuujui prototip, poziv funkcije i definiciju funkcije. Prototip priprema za poziv funkcije (tako to javlja prevodiocu za koje tipove treba da proverava), poziv funkcije izvrava funkciju, a definicija funkcije govori programu kako da izvri funkciju.

    U ovom primeru morate naznaiti dve datoteke zaglavlja (stdio.h i math.h) jer program koristi ulazno-izlazne funkcije (printf i scanf) kao i matematiku funkciju (sqrt), koja vraa kvadratni koren broja. Datoteke zaglavlja imaju prototipe za ove funkcije.

    Uradi na C++nain

  • Demonstracija funkcije

    // Demonstiranje pozivanja funkcije

    #include

    void DemonstrationFunction() ;

    //Funkcija: Demonstracija funkcije

    //tampa korisnu poruku

    int main()

    {

    cout

  • Korienje funkcija

    Funkcije vraaju ili vrednost ili void, to znai da ne vraaju nita. Funkcija koja sabira dva cela broja moe da vrati zbir

    i zato bi se definisala da vraa celobrojnu (eng. integer) vrednost. Funkcija koja samo tampa poruku nema ta da vrati

    i zato se deklarie da vraa void.

    Funkcija se sastoji od zaglavlja i tela. Zaglavlje se sastoji, po redosledu pojavljivanja, od tipa vrednosti koja se vraa, naziva funkcije i parametara funkcije. Parametri funkcije omoguavaju da se vrednosti proslede funkciji. Zato, ako funkcija treba da sabere dva broja, brojevi bi trebalo da budu parametri funkcije. Tipino zaglavlje funkcije izgleda ovako:

    int main(int a, int b)

    Parametar funkcije (eng. parameter) je deklaracija tipa vrednosti, koja e biti prosleena funkciji: stvarna vrednost prosleena pozivanjem funkcije naziva se argument funkcije. Mnogi programeri koriste ova dva pojma, parametre i argumente, kao sinonime. Drugi, s druge strane, vode rauna o tehnikoj razlici. U ovoj knjizi termini e biti korieni kao sinonimi.

    Znai, telo funkcije se sastoji od otvorene velike zagrade, bez ijedne ili sa vie naredbi i zatvorene velike zagrade. Naredbe obavljaju posao za koji je funkcija namenjena. Funkcija moe da vrati vrednost, koristei naredbu return. To e, takode, dovesti do kraja rada funkcije. Ukoliko ne stavite naredbu return

    u svoju funkciiu, ona e, automatski, vratiti void na kraju funkcije. Vrednost koja se vraa mora biti tipa koji je deklarisan u zaglavlju funkcije.

  • Korienje funkcijaU listingu je prikazana funkcija sa dva celobrojna parametra, koja vraa celobrojnu

    vrednost. Nemojte brinuti o sintaksi ili specifinosti rada sa celobrojnim vrednostima ( na primer int x ).

    #include

    int Add (int x, int y) ;

    int main()

    {cout a;

    cin >> b;

    cout

  • Podrazumevani argumenti funkcija

    Prilikom poziva funkcije potrebno je navesti listu argumenata koja odgovara listi argumenata

    u zaglavlju funkcije. C++ doputa da se neki od argumenata u pozivu funkcije izostave, tako

    da se umesto njih koriste podrazumevane

    difolt vrednosti.

    Primer:

    #include

    void funkcija(int a, int b=5)

    {cout

  • Prenos po referenci

    Prenos po referenci

    dolazi do punog izraaja kada je potrebno preneti vie od jedne vrednosti iz

    funkcije nazad na mesto njenog poziva.

    Poto funkcija ne moe vratiti kao rezultat vie vrednosti, kao

    rezultat se namee korienje prenosa parametara po referenci, pri emu e funkcija koristei reference

    prosto smestiti traene vrednosti u odgovarajue stvarne parametre koji su joj prosleeni. Ova tehnika

    je ilustrovana u sledeem programu u kojem je definisana funkcija RastaviSekunde, iji je prvi

    parametar broj sekundi, a koja kroz drugi, trei i etvrti parametar prenosi na mesto poziva informaciju

    o broju sati, minuta i sekundi koji odgovaraju zadanom broju sekundi. Ovaj prenos se ostvaruje tako to

    su drugi i trei formalni parametar ove funkcije (sati, minute

    i sekunde) deklarisani kao

    reference, koje se za vreme izvravanja funkcije vezuju za odgovarajue stvarne argumente:

    #include

    void RastaviSekunde(int br_sek, int &sati, int &minute, int &sekunde);

    int main()

    {int sek, h, m, s;

    cout > sek;

    RastaviSekunde(sek, h, m, s);

    cout

  • Primeri funkcija

    /*Primer 1*/

    #include

    void ispis(int i1, int i2, int i3);

    /* F-ja ne vraca nikakvu vrednost*/

    void main()

    {

    int a,b,c;

    a=b=c=1;

    ispis(a,b,c);

    a=b=c=2;

    ispis(a,b,c);

    }

    void ispis(int i1, int i2, int i3)

    {

    cout

  • Primeri funkcija

    /*Primer 2 kada program poziva dve funkcije*/

    #include

    #include

    void Hipotenuza(void);

    void Ucitaj(void);

    double a,b,c;/* deklaracija globalne promenljive, pre pocetka programa*/

    void main()

    {

    Ucitaj();

    Hipotenuza();

    cout

  • Primeri funkcija

    /* Primer 3 za izracunavanje y=sin2(x)+cos2(x)*/

    #include

    #include

    double Funkcija(double x);

    void main()

    {

    double x,y; /* deklaracija lokalnih promenljivih, posle pocetka programa*/

    coutx;

    y=Funkcija(x);

    cout

  • -

    -

    :

    9 1. ,

    9 2. ,

    9 3. .

  • 9 ()

    #include

    #include

    void duplo(int x, int &ptr1, double &ptr2);

    main ()

    { int a=10, rez1; double rez2;

    duplo(a, rez1, rez2); /*adrese promenljivih*/

    cout

  • ( :: )

    ,

  • POINTERI-Pokazivai

    Uvek kada se startuje program on se obino sa diska uitava u memoriju raunara. Ona je sastavljena od sekvencijalne serije memorijskih lokacija koje imaju svoje adrese a duine su onoliko bita, kolika je duina rei word size

    dotine maine:

    #include void f(int pet) {cout

  • POINTERI-Pokazivai

    Primer:

    int *pa, x;

    int a[20];

    double d;

    Ova naredba koristi adresni operator:

    pa = &a[5]; Adresni

    operator (&) uzima adresu svih est elemenata polja a. Ovaj rezultat se smeta u pointer promenljive pa.

    x = *pa;

    Operator

    indirekcije

    (*) se koristi u ovom primeru da pristupi int

    vrednosti na aresi memorisanoj u pa. Ova vrednost se pridruuje inteder promenljivoj x.

  • POINTERI-Pokazivai

    #include

    int dog, cat, bird, fish;

    void f(int pet)

    {cout

  • POINTERI-Pokazivai

    #include

    void f(int* p) ;

    int main() {

    int x = 47;

    cout

  • POINTERI-PokazivaiPredstavljaju dakle jedan od najmonijih alata koji stoje na raspolaganju C++ programerima, kojima se direktno manipulie sa memorijom raunara. Mogu biti

    pokazivai adresa ili pokazivai indirekcije.

    Pokaziva

    adresa

    je promenljiva koja uva memorijsku adresu elije ili lvalue. Prikaz promenljive theAge tipa Integer moe izgledati:

    Memorija& theAge

    10110101 01110110 11101110 11110110 podatak

    101 102 103 104 105

    106svaka lokacija 1 bajt

    unsigned long int &theAge = 4 bajta = 32 bita, a ime promenljive &theAge pokazuje na prvi bajt pa je 102 adresa promenljive theAge

  • POINTERI

    andy

    25 stvarni podatak u memoriji na adresi 1776

    1775 1776 1777 -

    memorijske adrese

    fred & ted

    25 1776

    andy=25; //promenljiva andy postavlja se na vrednost 25 i dodeljujejoj se memorijska

    adresa 1776

    fred=andy;

    //promenljiva fred uzima vrednost promenljive andy tj. 25

    ted=&andy

    /*promenljiva ted uzima vrednost adrese promenljive andy

    a to je 1776*/

    Sintaksa operatora adresa je:

    &

  • POINTERI

    //Demonstriranje operatora adresa od, i adresa lokalnih promenljivih

    #include

    int main()

    {

    unsigned short shortProm=5;

    unsigned long longProm=65535;

    long sProm = -65535;

    cout

  • POINTERI

    Pokaziva

    indirekcije sa operatorom *

    ( naziva se i operator dereferenciranja ) omoguuje da i bez znanja specifine adrese date promenljive uvamo njenu adresu u pokazivau. Predpostavimo da je how0ld celobrojna promenljiva. Da bi deklarisali pokaziva

    nazvan pAge za uvanje njene adrese napisali bi: int *pAge=0. Ovo deklarie promenljivu pAge kao pokaziva

    na int, to je deklarie i za uvanje adrese od int. U ovom primeru pAge ima vrednost nula -

    divlji pokazivai, ali bi uglavnom svi pokazivai morali da imaju vrednost razliitu od nule.

    unsigned short int how0ld=50;

    //kreiranje promenljive

    unsigned short int * pAge=0

    ;

    //kreiranje pokazivaa

    pAge=&how0ld;

    //stavi adresu od how0ld upAge

  • POINTERI

    Prva linija kreira promenljivu how0ld iji je tip unsigned short int, a inicijalizuje je na vrednost 50.

    Druga linija definie pAge kao pokaziva

    za tip unsigned short int i inicijalizuje ga na 0.

    Trea linija dodeljuje adresu promenljive how0ld pokazivau pAge. Znai korienjem pAge moemo odrediti vrednost promenljive how0ld, pristupajui joj preko pokazivaa. Ovakav pristup se naziva indirekcija. Indirekcija znai pristupanje vrednosti preko adrese, koja se uva u pokazivau. On obezbeuje indirektan nain za dobijanje vrednosti, koja se uva na toj adresi. Ako pogledamo sledei primer:

    ted=1776;