Ciljevi kolegija Objektno programiranje (C++)

  • Uvod u objektno orijentirano i generičko programiranje kroz programski jezik C++;

  • Detaljna prezentacija jezika C++-a;

  • Napredno korištenje standardne biblioteke STL. Druge bilioteke, Boost, …;

  • Tehnike programiranje, softverski predlošci;

  • Upoznavanje sa sustavom za upravljanjem kodom (Git, GitHub), sustavom za distribuciju koda (CMake) i softverom za testiranje koda (googletest).

Pretpostavke:

  • Poznavanje osnova programskog jezika C++.

  • Poznavanje osnova STL-a: ulaz/izlaz, stringovi, vektori, itd.

Organizacija kolegija

  • Predavanja: srijeda 10-12 (A102), vježbe: 14-16 (Pr2) i 16-18 (Pr2)

  • Stranica kolegija se nalazi na sustavu merlin.srce.hr. Potrebno je ulogirati se svojim AAI@EduHr identitetom.

    • Studenti se trebaju prijaviti u Merlin sustav. Kod prve prijave treba upisati osobne podatke

    • Zatim treba upisati kolegij Objektno programiranje (C++). Upis će biti moguć samo prvi tjedan nastave. Upis će se nakon toga obavljati tako da se na jurak@math.hr pošalje email sa zahtjevom za upis.

  • Stranica kolegija: web.math.hr/nastava/opepp. Na Merlin-u se nalazi poveznica na nju.

  • Ispit: završni pismeni ispit i domaće zadaće. Nema kolokvija usred semestra.

  • Materijali na web-u: Web je vrlo bogat materijalima koji se odnose na C++. Stranica en.cppreference.com/w/ je temeljni resurs za učenje i korištenje standardne biblioteke.

Ocjenjivanje

Elementi ocjenivanja

  1. Završni ispit (50 %),

  2. Domaće zadaće (50 %).

  3. Aktivnost u nastavi.

Prvi element ocjenjivanja

  • Završni pismeni ispit piše se na papiru i uključuje čitavo gradivo. Pravo pristupa ispitu dobiva se ispunjavanjem uvjeta prema drugom i trećem elementu ispitivanja.

  • Minimalni uvjeti za prolaz na prvom elementu ocjenjivanja je postići 30 od mogućih 100 bodova na završnom ispitu.

  • Popravni završni ispit organizira se za sve studente koji su pristupili završnom ispitu i nisu postigli dovoljno bodova za prolaznu ocjenu, kao i za studente koji nisu pristupili završnom ispitu.

Drugi element ocjenjivanja

  • Sastoji se od zadaća koje se boduju ako su predane u zadanom roku. Neke zadaće su manje i uključuju samo doradu programa rađenih na vježbama, dok druge mogu biti opsežnije.

  • Minimalni uvjeti za prolaz na drugom elementu ocjenjivanja je postići 30 od mogućih 100 bodova na zadaćama. To je uvjet za pristup završnom ispitu.

  • Mogućnosti popravka drugog elementa ocjenjivanja nema.

Treći element ocjenjivanja

  • Aktivnost u nastavi je nužan preduvjet za bodovanje zadaća te stoga i za pristup završnom ispitu. Nužno je biti prisutan na 70 % vježbi i 50 % predavanja.

  • Manju aktivnost od minimalno propisane moguće je opravdati samo posebnim razlozima.

Zaključivanje ocjene

  • Ukupni broj bodova = (bodovi na završnom ispit + bodovi na zadaćama)/2.

  • Ocjena se dobiva iz ukupnog broja bodova prema sljedećoj tablici:

bodovi ocjena

0 do 44

nedovoljan

45 do 59

dovoljan

60 do 74

dobar

75 do 89

vrlo dobar

90 do 100

izvrstan

Literatura

Osnovna:

  • Stanley B. Lippman, Josée Lajoie, Barbara E. Moo: C++ Primer, Fifth Edition, Addison Wesley Professional, 2012.

Napredna:

  • Bjarne Stroustrup: The C++ Programming Language, Fourth Edition, Addison Wesley, 2013.

  • Nicolai Josuttis: The C++ Standard Library - A Tutorial and Reference, 2nd Edition, Addison Wesley, 2012.

  • Nicolai Josuttis: C++17 - The Complete Guide: First Edition, NicoJosuttis, 2019.

  • David Vandevoorde, Nicolai Josuttis, Douglas Gregor: C++ Templates: The Complete Guide, 2nd Edition, Addison Wesley, 2018.

  • Scott Meyers: Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14, O’Reilly Media Inc, 2015.

  • Scott Meyers: Effective C++, Third Edition, Addison-Wesley, 2006.

  • Scott Meyers: Effective STL, Addison-Wesley, 2001.

  • Herb Sutter: Exceptional C++, Addison Wesley, 2000.

  • Stephen C. Dewhurst: C++ Common Knowledge, Addison Wesley, 2005.

  • Erich Gamma, et. all: Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley Professional Computing Series).

  • Andrei Alexandrescu: Modern C++ Design: Generic Programming and Design Patterns Applied, Addison-Wesley, 2001.

Programski jezik C++

Povijest

  • Programski jezik C++ nastao je razvojem jezika C i zadržava visoku kompatibilnost s njime.

  • Kreator jezika je Bjarne Stroustrup (www.stroustrup.com). Razvoj je započeo 1979. g.; ime C++ skovano je 1983. godine, a prva komercijalna implementacija pojavila se 1985.

  • Između 1985. i 1989. jezik je doživio veće inovacije: zaštićeni članovi, parametrizirane klase, višestruko nasljeđivanje itd.

  • Jezik je 1997. godine definiran je ISO standardnom. To je prva standardizacija jezika.

  • Godina 2003. — manja revizija prvog standarda.

  • Godina 2011. — novi standard s brojnim novostima i poboljšanjima.

  • Godina 2014. — Revizija standarda iz 2011. godine.

  • Godina 2017. — Revizija standarda iz 2014. godine.

  • Godina 2020. — Očekuje se novi standard.

Za informacije o standardu vidjeti: isocpp.org/std/.

Karakteristike jezika

Jezik opće namjene visoke efikasnosti. Omogućava programiranje niske razine i programiranje s apstrakcijama. Slijedi princip da apstrakcija ne smije negativno utjecati na efikasnost koda.

Razvoj softvera

Razvoj programske aplikacije ili programske biblioteke zahtjeva korištenje niza softverskih alata i sustava među kojim su temeljni sljedeći:

  • Programski jezici i njihovi prevodioci/interpreteri;

  • Softverske biblioteke;

  • Integrirane okoline za razvoj programa;

  • Sustav za upravljanje kodom;

  • Sustav distribucije koda;

  • Biblioteke za testiranje koda.

Prevodioci za C++

Linux

Microsoft Windows

Softverske biblioteke

  • Prevodilac za C++ dolazi uvijek zajedno sa standardnom bibliotekom koja se kratko naziva STL (standard template library).

  • Druga najznačajnija softverska biblioteka za jezik C++ je www.boost.org. Boost je na određen način ekstenzija standardne biblioteke.

Standardna biblioteka ne uključuje biblioteku za konstrukciju grafičkog sučelja. S druge strane, postoji čitav niz različitih C++-biblioteka za konstrukciju grafičkog sučelja. Na primjer:

Sustav za upravljanje kodom

  • Softver se razvija proširivanjem funkcionalnosti inicijalne verzije programa, optimizacijom algoritama i ispravljanjem grešaka. Kada promjene postanu dovoljno značajne i potpune izdaje se nova verzija programa.

  • Na softveru najčešće radi više programera koji izvornom kodu pristupaju s prostorno različitih lokacija, manje više istovremeno.

Stoga se javlja potreba za sustavom koji bilježi sve promjene učinjene u svakoj izvornoj datoteci i nudi mogućnost rješavanja konflikata koji nastaju kada više programera pokušava mijenjati istu datoteku. Takvi se sustavi nazivaju sustavima za upravljanje kodom (eng. version control systems).

Sustavi za upravljenje kodom otvorenog tipa

Distribuirani

Centralizirani

Sustav distribucije koda

Softverski sustavi mogu se distribuirati kao binarni kod spreman za izvršavanje ili kao izvorni kod koji prvo treba kompilirati.

  • Binarni kod se može distribuirati samo na operacijskim sustavima onog tipa na kojem je kod razvijen. Ako se koristi interpreterski jezik, kao Java, onda je moguće binarni kod distribuirati na različitim operacijskim sustavima koji imaju instaliran interpreter.

  • Softver otvorenog tipa distribuira se kao izvorni kod koji treba prethodno kompilirati. To u principu omogućava da se kod distribuira na različitim operacijskim sustavima. Prije kompilacije programa na svakoj platformi treba izvršiti konfiguraciju u kojoj se softver prilagođava platformi na kojoj će se kompilirati.

Distribucija izvornog koda

koji zajedno čine autotools (Unix/Linux platforme)

Autotools sustav je danas istisnut CMake sustavom koji je postao industrijski standard.

Integrirane okoline za razvoj programa

Integrirane okoline za razvoj programa nude editor za pisanje programa i različite alate za prevođenje, analizu, ispravljanje programa itd. One često integriraju i sustav za upravljanjem kodom i sustav za distribuciju koda.

Microsoft Windows

Ostali sustavi:

Objektno orijentirano programiranje

U centru interesa softverskog inženjerstva su složene aplikacije. Problemi:

  • Održivost — mogućnost lakog održavanja koda.

  • Proširivost — mogućnost lakog dodavanja nove funkcionalnosti.

  • Prenosivost — mogućnost prijenosa koda na druge platforme bez velikih izmjena.

Tehnike programiranja:

Proceduralna.

  • Razlaganje programa na manje cjeline — implementacija pomoću funkcija, procedura.

  • Nemogućnost definiranja apstrakcije koncepata iz aplikacijske domene.

  • Ne nudi podršku za postizanje održivosti i proširivosti.

Objektno orijentirana.

  • Klase predstavljaju koncepte iz aplikacijske domene.

  • Program se sastoji od objekta (instance klasa) i njihove komunikacije.

  • Objekti imaju punu odgovornost za svoje ponašanje.

Osnovni elementi OO tehnike:

  • Apstrakcija — Koncepti iz aplikacijske domene se reprezentiraju neposredno u programu, a izvedbeni detalji su skriveni iza sučelja (eng. interface) koje reprezentira koncept.

  • Enkapsulacija — Sposobnost osiguravanja da se apstrakcija koristi prema svojim specifikacijama. Enkapsulacijom se sprečava narušavanje apstrakcije, odnosno prodiranje implementacijskih odluka izvan granica apstrakcije.

  • Polimorfizam — Skrivanje različitih implementacija iza istog sučelja. Osigurava široku primjenjivost koda i reducira zavisnost o implementaciji.

  • Naslijeđivanje — Konstrukcija novih apstrakcija polazeći od već postojećih.

Generičko programiranje

Pojam generičkog programiranja odnosi se na generalizaciju softverskih komponenti kako bi se lako mogle koristiti u različitim situacijama. Osnovni elementi generičkog programiranja u C++-u su parametrizirane klase i funkcije.