o przedmiocie
Kurs programowania w C++
C++ to obiektowo zorientowany język programowania.
Został on zaprojektowany przez Bjarne'a 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++.
- Umiejętność czytania dokumentacji technicznej w języku angielskim.
- Podstawowa znajomość algorytmiki.
Cel kursu
- Nauka programowania obiektowego w języku C++.
- Poznanie wybranych fragmentów biblioteki STL.
literatura
Literatura podstawowa
- J.Grębosz: Opus magnum C++. Programowanie w języku C++11. Wydanie 2 poprawione. Tom 1, 2, 3. Wydawnictwo Helion, Gliwice 2020.
- J.Grębosz: Opus magnum C++. Misja w nadprzestrzeń C++14/17. Tom 4. Wydawnictwo Helion, Gliwice 2020.
- B.Stroustrup: Język C++. Kompendium wiedzy. Wydanie 4. Wydawnictwo Helion, Gliwice 2014.
Literatura uzupełniająca
- S.Meyers: Skuteczny nowoczesny C++. Wydawnictwo Helion, Gliwice 2020.
- 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.
- A.Allain: C++. Przewodnik dla początkujących. Wydawnictwo Helion, Gliwice 2014.
- N.M.Josuttis: C++. Biblioteka standardowa. Podręcznik programisty. Wydanie 2. Wydawnictwo Helion, Gliwice 2014.
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
- liczby rzymskie
- figury na płaszczyźnie
- zmienna z historią zmian wartości
- tablica bitów
- kolorowe piksele
- wyrażenia arytmetyczne
- kółko i krzyżyk
- liczby wymierne
- lista jednokierunkowa
- manipulatory i pliki
- kalkulator ONP
- lambdy - zadanie dodatkowe
Ranking
- grupa pn.18.PRz (pdf)
- grupa wt.18.PRz (pdf)
SKOS
wykłady
23 lutego 2023 r: łagodne wprowadzenie do C++
organizacja zajęć: organizacja.pdf
- pierwsze programy w C++
- struktura programu w C++
- zmienne ustalone const
- wyrażenia stałe constexpr
- 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
- pary pair<K, V>
- wektory vector<T>
- 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: wstep.pdf
9 marca 2022 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: cpp2klasy.pdf
16 marca 2022 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: cpp3kopiowanie.pdf
przykładowy program:
napis.hpp
napis.cpp
test_napis.cpp
23 marca 2023 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: cpp4operatory.pdf
30 marca 2023 r: dziedziczenie
- III paradygmat OOP - dziedziczenie (specjalizacja klasy)
- dziedziczenie - budowanie klasy za pomocą rozbudowywania istniejącej klasy
- porównanie dziedziczenia i kompozycji
- 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
- 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
slajdy: cpp5dziedziczenie.pdf
13 kwietnia 2023 r: polimorfizm
- 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
slajdy: cpp6polimorfizm.pdf
20 kwietnia 2023 r: przestrzenie nazw
- 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
- przestrzenie zagnieżdżone
slajdy: cpp7przestrzenie.pdf
27 kwietnia 2023 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: cpp8wyjatki.pdf
4 maja 2023 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: cpp9konwersje.pdf
11 maja 2023 r: szablony
- definicja szablonu
- funkcje i klasy szablonowe
- szablony funkcji
- przeciążanie szablonów funkcji
- trejty czyli specyfikowanie strategii za pomocą parametrów szablonu
- parametry domyślne w szablonach
- specjalizacja szblonów
- szablony klas
- składowe statyczne w szablonach
- przyjaźń a szablony
- dziedziczenie w przypadku szablonów
slajdy: cpp10szablony.pdf
18 maja 2023 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: cpp11strumienie.pdf
25 maja 2023 r: kolekcje i iteratory
- kontenery i ich elementy (semantyka wartości)
- kontenery sekwencyjne vector, deque i list
- kontenery uporządkowane set, multiset, map i multimap
- kontenery nieuporządkowane unordered_set i unordered_map
- łańcuchy i tablice jako kontenery
- adaptatory kontenerów stack, queue i priority_queue
- iteratory
slajdy: cpp12kolekcje.pdf
1 czerwca 2023 r: algorytmy
- klasyfikacja algorytmów
- algorytm for_each
- algorytmy niemodyfikujące
- algorytmy modyfikujące
- algorytmy usuwające
- algorytmy mutujące
- algorytmy sortujące
- algorytmy bazujące na posortowanych danych
slajdy: cpp13algorytmy.pdf
1 czerwca 2023 r: obiekty funkcyjne i lambdy
- funktory i predykaty
- predefiniowane obiekty funkcyjne
- algorytm for_each
- wyrażenia lambda
- rekurencyjne lambdy
slajdy: cpp14lambdy.pdf
15 czerwca 2023 r: funkcje i klasy narzędziowe
- pary i tuple
- sprytne wskaźniki shared_pointer i unique_pointer
- ograniczenia liczbowe numeric_limits
- minimum i maksimum
- zamiana wartości
- operatory porównywania
- typy wyliczeniowe
- szablony zmienne - ze zmienną liczbą parametrów
- składanie wyrażeń - folding
- koncepty
slajdy: cpp15narzedzia.pdf
For Erasmus Students
Tutorials
- C++ Language (www.cplusplus.com)
- C++ Tutorial (www.javatpoint.com)
- C++ Tutorial (www.tutorialspoint.com)
- C++ reference (en.cppreference.com)