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 (cpp2019.phtml) to wtorek 28 maja 2019 roku (o godzinie 17:14).

ogłoszenia
30 kwietnia 2019 r.
wykłady w maju:
Wykłady w dniach 7, 14 i 21 maja będą się rozpoczynały pół godziny wcześniej, czyli o 7:45, i będą prowadzone bez przewy (oczywiście adekwatnie wcześniej będą się kończyły).

16 kwietnia 2019 r.
wirtualne laboratorium:
Laboratorium w mojej grupie (PRz) zaplanowane na 18 kwietnia odbędzie się wirtualnie. Proszę swoje programy wysłać na SKOSa, omówimy je 25 kwietnia.

16 kwietnia 2019 r.
odwołany wykład:
Wykład zaplanowany na 30 kwietnia nie odbędzie się. Wykładowca będzie w tym czasie na szkoleniu. Wykład ten będzie przeprowadzony 21 maja.

19 marca 2019 r.
laboratorium w grupie PRz:
W tym tygodniu w czwartek 21.03.2019 zajęcia laboratoryjne w mojej grupie (PRz) rozpoczną się godzinę później o 17:15. Na zajęciach będę odbierał od państwa zadanie 2 z figurami.
7 marca 2019 r.
odwołany wykład:
Wykład zaplanowany na 12 marca nie odbędzie się. Wykładowca będzie w tym czasie na szkoleniu. Wykład ten będzie przeprowadzony 19 marca.

21 lutego 2019 r.
odwołane zajęcia:
Wykładowca jest na zwolnieniu lekarskim do 26 lutego. Z tego powodu zostały odwołane wszystkie zajęcia z tego przedmiotu w pierwszym tygodniu semestru.

21 lutego 2019 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:
wtorek 8-10 s.25 (Paweł Rzechonek)

laboratoria:
wtorek 10-12 s.107 (Michał Zapotoczny)
środa 8-10 s.110 (Marek Piotrów)
czwartek 8-10 s.110 (Robert Ferens)
czwartek 12-14 s.108 (Przemysław Uznański)
czwartek 18-20 s.110 (Paweł Rzechonek)
piątek 8-10 s.110 (Paweł Wieczorek)
licznik wejść na stronę

1 dzisiaj
9 w obecnym miesiącu
39 w bieżącym roku
4790 od powstania strony

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. trójkąty i koła
  2. liczby w systemie rzymskim
  3. figury na płaszczyźnie
  4. kolejka zbudowana na tablicy
  5. wielomiany
  6. wyrażenia arytmetyczne
  7. liczby wymierne
  8. drzewa BST
  9. manipulatory
  10. kalkulator ONP
Ranking
Skos

wykłady

5 marca 2019 r: łagodne wprowadzenie do C++

organizacja zajęć: cpp0organizacja.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
  • listy wartości initalizer_list<>

slajdy: cpp1wstep.pdf

5 marca 2019 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

19 marca 2019 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

26 marca 2019 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

2 kwietnia 2019 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: cpp5dziedziczenie.pdf

9 kwietnia 2019 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

9 kwietnia 2019 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
  • klasy zagnieżdżone

slajdy: cpp7przestrzenie.pdf

16 kwietnia 2019 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

7 maja 2019 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: cpp9szablony.pdf

14 maja 2019 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: cppAkonwersje.pdf

21 maja 2019 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

slajdy: cppBnarzedzia.pdf

21 maja 2019 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: cppCstrumienie.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. Roman numerals
  2. Simple geometric figures
  3. Polynomials
  4. Expression trees