predavanje_1_pj2
DESCRIPTION
asdfTRANSCRIPT
-
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;