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 czwartek 18 czerwca 2020 roku (o godzinie 22:17).

ogłoszenia
28 maja 2020 r.
komplet zadań:
Wystawiłem już komplet zadań do zrealizowania w tym semestrze. W sumie jest ich 10 (100 punktów do zebrania za ich zaprogramowanie).

9 kwietnia 2020 r.
termin dla zadaniea 5:
Przedłużyłem o tydzień termin oddawania zadania 5 (tablica bitów), czyli do 16 kwietnia 2020 r.

26 marca 2020 r.
laboratoria zdalne:
Wszystkie laboratoria powinny się odbywać w zaplanowanych na początku semestru terminach (chyba że grupa i prowadząc laboratorium umówią się inaczej). Laboratoria będą miały charakter konsultacji prowadzonych za pomocą MS Teams:
C++ laboratorium
Zadania laboratoryjne należy umieszczać na SKOS'ie w wyznaczonym terminie.

26 marca 2020 r.
wykłady zdalne:
Zdalne wykłady będę prowadzić we czwartki w zaplanowanych wcześniej godzinach, czyli 14:15-16:00. Aby dołączyć do wykładu prowadzonego z wykorzystaniem MS Teams należy wejść na stronę:
C++ wykład

19 marca 2020 r.
koronawirus COVID-19:
Koronawirus mocno pomieszał nam w szykach. Musimy bardzo mocno przeorganizować zajęcia. Od następnego tygodnia wykłady będę prowadził online najprawdopodobniej z wykorzystaniem Google Meet. Link do wideokonferencji umieszczę tutaj w ogłoszeniach (dodatkowo otrzymacia mailem z zaproszeniem).

19 marca 2020 r.
trzecie zadanie laboratoryjne:
Proste trzecie zadanie do zaprogramowania umieściłem na liście.

27 lutego 2020 r.
pierwsze laboratoria:
Pierwsze zajęcia laboratoryjne odbędą się dopiero w przyszłym tygodniu 2-5 marca 2020.

27 lutego 2020 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:
czwartek 14-16 s.119 (Paweł Rzechonek)

laboratoria:
poniedziałek 12-14 s.107 (Przemysław Uznański)
poniedziałek 14-16 s.108 (Michał Gańczorz)
wtorek 16-18 s.7 (Marek Piotrów)
wtorek 18-20 s.110 (Robert Kraus)
czwartek 16-18 s.108 (Paweł Rzechonek)
licznik wejść na stronę

1 dzisiaj
32 w obecnym miesiącu
2593 w bieżącym roku
2593 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. prosta na płaszczyźnie
  3. liczby w systemie rzymskim
  4. stos zbudowany na tablicy
  5. tablica bitów
  6. wyrażenia arytmetyczne
  7. liczby wymierne
  8. szablon listy jednokierunkowej
  9. manipulatory i pliki
  10. kalkulator ONP
Ranking
  • grupa PRz (pdf) (hasło: stat)
Skos

wykłady

27 lutego 2020 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 2020 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

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

program z wykładu: wyklad3.cpp

2 kwietnia 2020 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

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

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

23 kwietnia 2020 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

30 kwietnia 2020 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 2020 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

14 maja 2020 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

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

28 maja 2020 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

4 czerwca 2020 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

18 czerwca 2020 r: podstawowe 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ń std::rel_ops

slajdy: cpp14narzedzia.pdf

18 czerwca 2020 r: obiekty funkcyjne i lambdy

  • funktory i predykaty
  • predefiniowane obiekty funkcyjne
  • algorytm for_each
  • funkcje lambda

slajdy: cpp15lambdy.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