Paweł Rzechonek

Zainteresowania zawodowe: programowanie (C++, Java, C#, F#), technologie webowe, szeroko rozumiana algorytmika, metematyka klasyczna.

C++
język programowania

data ostatniej modyfikacji dokumentu

Data ostatniej modyfikacji tego dokumentu (cpp.phtml) to wtorek 21 czerwca 2022 roku (o godzinie 13:14).

ogłoszenia
13 czerwca 2022 r.
ostatnie zadania:
Wystawiłem już komplet zadań do zrealizowania w tym semestrze - w sumie jest ich 11 (maksymalnie 110 punktów do zebrania za ich realizację).
Dwa ostatnie zadania 12 (grafika SVG) i 13 (kalkulator ONP) są dodatkowe - można za nie otrzymać dodatkowe punkty, co może wpłynąć na ocenę zaliczeniową. Zadania dodatkowe należy oddać przed końcem semestru (do 24 czerwca).

6 czerwca 2022 r.
termin dla zadania 12:
Przedłużyłem o kilka dni termin oddawania zadania 12 (grafika SVG), czyli do 14(17) czerwca.

28 lutego 2022 r.
pierwsze laboratoria:
Pierwsze zajęcia laboratoryjne odbędą się dopiero w przyszłym tygodniu 7-11 marca 2022.

28 lutego 2022 r.
punkt informacyjny:
W tym miejscu będą się pojawiać ważne ogłoszenia dotyczące organizacji wszystkich zajęć związanych z tym przedmiotem. Proszę czytać te ogłosznia na bieżąco.
terminarz
wykład:
poniedziałek 16-18 (Paweł Rzechonek)

laboratoria:
poniedziałek 18-20 (Paweł Rzechonek)
wtorek 16-18 (Filip Chudy)
czwartek 16-18 (Marek Piotrów)
czwartek 16-18 (Robert Kraus)
czwartek 18-20 (Robert Kraus)
piątek 10-12 (Filip Chudy)
licznik wejść na stronę

2 dzisiaj
31 w obecnym miesiącu
85 w bieżącym roku
3263 od powstania strony

artykuły

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 podstawowa
  •   J.Grębosz: Opus magnum C++11. Programowanie w języku C++. Tom 1, 2, 3. Wydawnictwo Helion, Gliwice 2018.
  •   B.Stroustrup: Język C++. Kompendium wiedzy. Wydanie 4. Wydawnictwo Helion, Gliwice 2014.
Literatura uzupełniająca
  •   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.
  •   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
  1. rozkład liczb całkowitych na czynniki pierwsze
  2. zbiór zmiennych
  3. kolejka napisów
  4. wielomiany
  5. kolory i punkty
  6. wyrażenia arytmetyczne
  7. tablica bitów
  8. macierze
  9. liczby wymierne
  10. drzewa BST
  11. szyfr Cezara
  12. grafika wektorowa SVG - zadanie dodatkowe
  13. kalkulator ONP - zadanie dodatkowe

wykłady

28 lutego 2022 r: łagodne wprowadzenie do C++

organizacja zajęć: pdf

  • 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
  • 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

slajdy: cpp1wstep.pdf

7 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

14 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

21 marca 2022 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

28 marca 2022 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

4 kwietnia 2022 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

11 kwietnia 2022 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

25 kwietnia 2022 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

9 maja 2022 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

16 maja 2022 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

23 maja 2022 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

30 maja 2022 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

6 czerwca 2022 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

13 czerwca 2022 r: obiekty funkcyjne i lambdy

  • funktory i predykaty
  • predefiniowane obiekty funkcyjne
  • algorytm for_each
  • wyrażenia lambda

slajdy: cpp14lambdy.pdf

20 czerwca 2022 r: funkcje i obiekty 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 i przestrzeń nazw std::rel_ops

slajdy: cpp15narzedzia.pdf

For Erasmus Students

Tutorials
  1. C++ Language (www.cplusplus.com)
  2. C++ Tutorial (www.javatpoint.com)
  3. C++ Tutorial (www.tutorialspoint.com)
  4. C++ reference (en.cppreference.com)
Exercises
  1. Numbers in Roman notation
  2. Figures on the plane
  3. Queue
  4. Polynomials
  5. Expression trees
  6. Array of bits
  7. Rational numbers