o przedmiocie
Kurs programowania w C++
C++ to obiektowo zorientowany język programowania.
Został on zaprojektowany przez Bjerna Stroustrupa z myślą o programowaniu
systemowym oraz do zaawansowanych obliczeń inżynierskich.
Świadome używanie C++ do rozwiązywania problemów algorytmicznych
daje dużo satysfakcji doświadczonym programistom, zwłaszcza dlatego,
że generowany przez kompilator kod jest bardzo efektywny.
Celem kursu jest zapoznanie studentów z bogatą składnią języka C++,
różnorodnymi technikami stosowanymi w programowaniu w C++ oraz z obszernymi
fragmentami biblioteki STL.
Wymagane przygotowanie
- Umiejętność programowania strukturalnego i proceduralnego w języku C/C++.
- Podstawowa znajomość algorytmiki.
- Umiejętność czytania dokumentacji technicznej w języku angielskim.
Cel kursu
- Nauka programowania obiektowego w języku C++.
- Poznanie obszernych fragmentów biblioteki STL.
literatura
Literatura papierowa
- B.Stroustrup: Język C++. Kompendium wiedzy. Wydanie 4. Wydawnictwo Helion, Gliwice 2014.
- N.M.Josuttis: C++. Biblioteka standardowa. Podręcznik programisty. Wydanie 2. Wydawnictwo Helion, Gliwice 2014.
- S.Rao: C++. Dla każdego. Wydanie 7. Wydawnictwo Helion, Gliwice 2014.
- S.Prata: Język C++. Szkoła programowania. Wydanie 6. Wydawnictwo Helion, Gliwice 2012.
- J.Grębosz: Opus magnum C++11. Programowanie w języku C++. Tom 1, 2, 3. Wydawnictwo Helion, Gliwice 2018.
Literatura elektroniczna
laboratorium
Zasady zaliczenia przedmiotu
- Ogólnie:
-
W semestrze będzie opublikowanych (na tej stronie)
kilkanaście prostych zadań do zaprogramowania.
Za każde samodzielnie zaprogramowane zadanie i oddane
w terminie można będzie dostać do 10 punktów
(chociaż zadania będą różnej trudności).
- Terminy:
-
Zadania do zaprogramowania będą ogłaszane w tygodniu poprzedzającym termin ich realizacji.
Zadania należy oddawać w wyznaczonym terminie.
Spóźnienia nie będą tolerowane, za wyjątkiem uzasadnionych sytuacji życiowych:
choroba potwierdzona zwolnieniem lekarskim, wezwanie do Sądu, itp.
- Prezentacje:
-
Programy należy prezentować osobiście w czasie pracowni (proszę nie wysyłać
programów pocztą elektroniczną, ani nie przekazywać ich poprzez innych studentów).
W trakcie prezentacji programu trzeba się liczyć z pytamiami dotyczącymi zadania:
metoda rozwiązania, zastosowane konstrukcje językowe, wykorzystane technologie, itp.
- Rozwiązania:
-
Kody źródłowe własnych programów należy zapisywać na SKOS,
ponieważ tylko wtedy rozwiązania zadań będą podlegały weryfikacji autorskiej i ocenie.
- Oceny:
-
Aby zaliczyć laboratorium na ocenę dostateczną trzeba do końca
semestru zdobyć 50% z wszystkich możliwych do uzyskania punktów;
na ocenę bardzo dobrą trzeba będzie zgromadzić 90% punktów;
oceny pośrednie pozostją w liniowej zależności od przedstawionych
wymagań granicznych.
Zadania laboratoryjne
- rozkład liczb całkowitych na czynniki pierwsze
- prosta na płaszczyźnie
- stos zbudowany na tablicy
- tablica bitów
- wydarzenia w czasie
- wyrażenia arytmetyczne
- macierze
- liczby wymierne
- drzewo BST
- manipulatory i pliki
- grafy (zadanie dodatkowe)
Ranking
wykłady
21 lutego 2018 r: łagodne wprowadzenie do C++
organizacja zajęć: cpp0.ppt
- pierwsze programy w C++
- struktura programu w C++
- zmienne ustalone const
- wyrażenia stałe constexpr
- zmienne ulotne volatile
- referencje i referencje do stałych
- typ void i void*
- wskaźnik pusty nullptr
- typy całkowite int8_t, int16_t, int32_t i int64_t
- ułożenie obiektów w pamięci i operator alignof
- typy znakowe char16_t i char32_t
- łańcuchy znakowe string
- używanie łańcuchów znakowych zamiast napisów w stylu C
- wektory vector<>
- używanie wektorów zamiast tablic
- inicjalizacja tablic i kolekcji za pomocą listy wartości
- przeglądanie tablic i kolekcji za pomocą pętli zakresowej for-each
- standardowe wejście cin, wyjście cout oraz wyjście dla błędów cerr i clog
- zgłaszanie błędów za pomocą rzucania wyjątków standardowych instrukcją throw
- listy wartości initalizer_list<>
slajdy: cpp1.ppt
28 lutego 2018 r: klasy i obiekty, ukrywanie implementacji
- I paradygmat OOP - abstrakcja (grupowanie danych i procedur)
- klasy - typy danych
- obiekty - instancje określonej klasy
- stan obiektu
- funkcjonalność klasy
- definicja klasy class
- składowe w klasie - pola i metody
- odwołania do składowych za pomocą operatorów . (kropka) i -> (strzałka)
- tworzenie nowych obiektów na stosie i na stercie za pomocą operatora new
- inicjalizacja obiektu za pomocą konstruktora
- konstruktory delegatowe
- inicjalizacja składowych w obiekcie przed uruchomieniem konstruktora
- lista inicjalizacyjna do sparametryzowanej inicjalizacji pól składowych w obiekcie
- usuwanie niepotrzebnych obiektów ze stosu i ze sterty za pomocą operatora delete
- likwidacja obiektu z udziałem destruktora
- automatyczne uruchomienie destruktora przed likwidacją obiektu
- wskaźnik this i jego wykorzystanie w metodach instancyjnych
- kompozycja - budowanie klasy za pomocą wypełniania obiektami innych klas
- II paradygmat OOP - hermetyzacja (ukrywanie implementacji)
- udostępnianie bezpiecznych narzędzi do manipulowania ukrytym stanem obiektu i
- ukrywanie składowych w sekcji private
- upublicznianie składowych w sekcji public
- przeciążanie funkcji i konstruktorów
- konstruktor domyślny wygenerowany przez kompilator
- wymuszenie wygenerowania konstruktora domyślnego za pomocą frazy =default
- stałe pola w klasie
- inicjalizacja pól stałych w obiekcie za pomocą listy inicjalizacyjnej
- upublicznianie stałych pól w klasie
- stałe funkcje składowe do operowania na stałych obiektach
slajdy: cpp2.ppt
7 marca 2018 r: składowe statyczne, inicjalizacja, kopiowanie, przenoszenie
- składowe statyczne w klasie deklarowane za pomocą static
- odwołania do składowych statycznych
- inicjalizacja pól statycznych
- funkcje wbudowane
- argumenty domyślne w funkcjach
- inicjalizacja typów podstawowych
- jednolita inicjalizacja
- inicjalizacja listą wartości initialization_list<>
- l-wartości i r-wartości
- obiekty tymczasowe
- argumenty tymczasowe w funkcjach
- semantyka przenoszenia
- konstruktor kopiujący i przenoszący
- przypisanie kopiujące i przenoszące
slajdy: cpp3.ppt
14 marca 2018 r: przeciążanie operatorów
- funkcje i klasy zaprzyjaźnione
- przeciążanie operatorów
- operatory składowe kontra zaprzyjaźnione
- operatory zwiększania ++ i zmniejszania --
- przypisanie kopiujące i przenoszące =
- operator wywołania funkcji ()
- operator indeksowania []
- operator dostępu do składowych ->
- statyczne operatory składowe new i delete
- zaprzyjaźnione operatory czytania z i pisania do strumienia >> i <<
slajdy: cpp4.pdf
21 marca 2018 r: dziedziczenie
- III paradygmat OOP - dziedziczenie (specjalizacja klasy)
- dokładanie nowych składowych w trakcie dziedziczenia
- lista pochodzenia
- dostęp do odziedziczonych składników
- przywracanie pierwotnej widoczności odziedziczonych składników za pomocą deklaracji using
- projektowanie hierarchii klas
- blokowanie dziedziczenia za pomocą deklaratora final
- dziedziczenie wielobazowe
- dziedziczenie wirtualne
- konwersje standardowe dla wskaźników i referencji przy dziedziczeniu
- konstruktory delegatowe
- inicjalizacja i destrukcja obiektów w warunkach dziedziczenia
- przenoszenie konstruktorów z klasy bazowej za pomocą deklaracji using
- inicjalizacja pól składowych w definicji klasy
- dziedziczenie - budowanie klasy za pomocą rozbudowywania istniejącej klasy
- porównanie dziedziczenia i kompozycji
slajdy: cpp5.pdf
28 marca 2018 r: polimorfizm, przestrzenie nazw
- IV paradygmat OOP - polimorfizm (wydobycie adekwatnej dla obiektu funkcjonalności)
- składowe funkcje wirtualne
- nadpisywanie funkcji wirtualnych
- wywołania polimorficzne za pomocą wskaźników i referencji
- implementacja wywołań polimorficznych
- wczesne i późne wiązanie
- wirtualne destruktory
- klasy abstrakcyjne
- fabrykowanie obiektów
- przestrzenie nazw jako struktury grupujące definicje
- przestrzenie nazw jako struktury otwarte
- deklaracja użycia i dyrektywa użycia
- przestrzeń anonimowa
- komponowanie i wybór w przestrzeniach nazw
- standardowa przestrzeń nazw
- klasy zagnieżdżone
slajdy: cpp61.pdf, cpp62.pdf
11 kwietnia 2018 r: wyjątki
- zastosowanie wyjątków do sygnalizowania błędów
- zgłaszanie wyjątków instrukcją throw
- łapanie wyjątków w instrukcji try-catch
- przepływ sterowania przy zgłoszeniu wyjątku
- funkcje call-back’owe
- rozróżniane wyjątków po typie
- grupowanie wyjątków w hierarchie klas
- dopasowywanie wyjątków
- złapanie każdego wyjątku w bloku catch(...)
- odwikłanie stosu po zgłoszeniu wyjątku
- implementacja mechanizmu zgłaszania i łapania wyjątków
- wyjątki w konstruktorach i w destruktorach
- RAII czyli zdobywanie zasobów poprzez inicjalizację
- wsparcie techniki RAII przez shared_ptr
- specyfikacja wyjątków zgłaszanych przez funkcje
- wyjątek bad_alloc zgłaszany przez operator new
- klasa exception i wyjątki z biblioteki standardowej
- definiowanie własnych wyjątków
- asercje
slajdy: cpp7.pdf
18 kwietnia 2018 r: konwersje
- konwersje tradycyjne dla typów podstawowych
- konstruktory konwertujące i notacja konstruktorowa
- blokowanie konwersji za pomocą explicit
- operatory konwersji w klasie
- szablonowe operatory konwersji
- statyczna konwersja typów danych przy użyciu operatorów konwertujących za pomocą static\_cast<>
- zmiana deklaratorów const i volatile za pomocą const\_cast<>
- zmiana interpretacji typu danych za pomocą reinterpret\_cast<>
- dynamiczna konwersja wskaźników i referencji to klas polimorficznych za pomocą dynamic\_cast<>
- RTTI - informacja o typie danych
- automatyczne określanie typu - deklaracja auto
- wydobycie typu wyrażenia za pomocą decltype
slajdy: cpp8.pdf
25 kwietnia 2018 r: szablony
- definicja szablonu
- funkcje i klasy szablonowe
- przeciążanie szablonów funkcji
- trejty czyli specyfikowanie strategii za pomocą parametrów szablonu
- parametry domyślne w szablonach
- specjalizacja szblonów
- klasy szablonowe
- składowe statyczne w szablonach
- przyjaźń a szablony
- dziedziczenie w przypadku szablonów
slajdy: cpp9.pdf
16 maja 2018 r: podstawowe narzędzia
- pary i tuple
- wyznaczanie minimum i maksimum w tablicy
- dodatkowe operatory porównujące w przestrzeni nazw std::rel\_ops
- limity typów numerycznych
- liczby zespolone
- współczynniki wymierne
slajdy: cpp10.pdf
23 maja 2018 r: strumienie
- pojęcie strumienia jako obiektu transportującego dane
- strumienie konsolowe cin, cout, clog i cerr
- hierarchia klas strumieni w bibliotece standardowej
- formatowane operacje na strumieniach za pomocą operatorów << i >>
- przeciążanie operatorów strumieniowych << i >>
- sterowanie formatem strumienia - flaga fmtflags
- manipulatory z biblioteki standardowej
- definiowanie własnych manipulatorów
- nieformatowane operacje czytania i pisania na strumieniach
- błędy w strumieniu - flaga io_state
- zgłaszanie wyjątków przez strumień
- strumienie związane z plikami
- strumienie związane z łańcuchami znakowymi
- synchronizacja strumieni
- bufory strumieniowe
slajdy: cpp11.pdf