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
- B.Stroustrup: Język C++. Kompendium wiedzy. Wydanie 4. Wydawnictwo Helion, Gliwice 2014.
- 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.
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 pozostają w liniowej zależności od przedstawionych
wymagań granicznych.
Zadania laboratoryjne
- rozkład liczb całkowitych na czynniki pierwsze
- punkty i koła na płaszczyźnie
- kolejka punktów
- wielomiany
- kolorowe piksele
- liczby zespolone
- wyrażenia i instrukcje
- samotnik
SKOS
wykłady
3 marca 2025 r: łagodne wprowadzenie do C++
organizacja zajęć: sprawy organizacyjne
- pierwsze programy w C++
- struktura programu w C++
- zmienne ustalone const
- wyrażenia stałe constexpr
- referencje i referencje do stałych
- 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<T>
- używanie wektorów zamiast tablic
- pary pair<K, V>
- 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: łagodne wprowadzenie do C++
10 marca 2025 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: klasy i obiekty
17 marca 2025 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: kopiowanie i przenoszenie
przykładowy program:
napis.hpp
napis.cpp
test_napis.cpp
24 marca 2025 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: operatory
31 marca 2025 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: dziedziczenie
7 kwietnia 2025 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: przestrzenie nazw
14 kwietnia 2025 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: polimorfizm
28 kwietnia 2025 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: wyjątki
5 maja 2025 r: konwersje