Paweł Rzechonek

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

C++17 i STL
kurs zaawansowany

data ostatniej modyfikacji dokumentu

Data ostatniej modyfikacji tego dokumentu (cpp2018.phtml) to poniedziałek 21 października 2019 roku (o godzinie 12:50).

ogłoszenia
3 grudnia 2018 r.
laboratorium 6 (wyrażenia regularne):
Ze względu na niską frekwencję na dzisiejszym laboratorium, przesuwam termin oddnania zadania z wyrażeniami regularnymi na następny tydzień: 10-11 grudnia 2018 r.

1 października 2018 r.
pierwsze laboratorium:
W pierwszym tygodniu nauki laboratoria nie odbywają się. Pierwsze laboratorium zaplanowałem dopiero na przyszły tydzień: 8-9 października 2018 r.

1 października 2018 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 17-18 s.25 (Paweł Rzechonek)

laboratoria:
poniedziałek 18-20 s.137 (Paweł Rzechonek)
wtorek 18-20 s.107 (Marek Szykuła)
licznik wejść na stronę

1 dzisiaj
8 w obecnym miesiącu
37 w bieżącym roku
8107 od powstania strony

o przedmiocie

Kurs C++17 i STL

C++17 to najnowsza wersja języka C++. Język C++ prawdza się, gdy chcemy zapewnić wysoką wydajność programu. Język ten jest stale rozwijany a kolejne jego specyfikacje, czyli C++11, C++14 i C++17, przyniosły wiele udogodnień. Aby w pełni wykorzystać potencjał języka C++ należy go używać wraz z biblioteką standardową STL. C++ wraz z STL to doskonałe narzędzie do implementowania oprogramowania wysokiej jakości.

Wymagane przygotowanie
  •   Umiejętność programowania obiektowego w języku C++98.
  •   Podstawowa znajomość algorytmiki.
  •   Umiejętność czytania dokumentacji technicznej w języku angielskim.
Cel kursu
  •   Nauka programowania w języku C++17.
  •   Poznanie obszernych fragmentów biblioteki STL.

literatura

Literatura papierowa
  •   N.M.Josuttis: C++. Biblioteka standardowa. Podręcznik programisty. Wydanie 2. Wydawnictwo Helion, Gliwice 2014.
  •   B.Stroustrup: Język C++. Kompendium wiedzy. Wydanie 4. Wydawnictwo Helion, Gliwice 2014.
  •   J.Galowicz: C++17 STL. Receptury. Wydawnictwo Helion, Gliwice 2018.
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. 15, 16 października 2018: sprytne wskaźniki
  2. Zdefiniuj klasę opakowującą plik tekstowy line_reader. Obiekt takiej klasy ma przetrzymywać wskaźnik/referencję do strumienia plikowego ifstream. Zadaniem obiektów tej klasy będzie czytanie z pliku wiersz po wierszu. Gdy strumień nie będzie już mógł odczytać następnej linii (koniec pliku) należy zgłosić wyjątek ios_base::failure. Klasa ta nie powinna zamykać strumienia w destruktorze.

    W programie testowym stwórz sprytny wskaźnik shared_ptr, który zamknie plik w momencie, gdy ostatni sprytny wskaźnik na ten zasób będzie likwidowany.

  3. 22, 23 października 2018: czasomierze
  4. Zdefiniuj klasę dla macierzy kwadratowej zawierającej liczby rzeczywiste. Należy umożliwić dostęp porzez referencję do poszczególnych elementów macierzy (do odczytu i zapisu). W klasie tej zdefiniuj statyczną operację mnożenia macierzy o takim samym rozmiarze (argumenty przekaż jako referencje do stałych macierzy).

    Dalej w programie testowym stwórz macierze o rozmiarach odpowiednio 10×10, 100×100, 1000×1000 i 10000×10000 i wypełnij je losowymi wartościami z zakrsu od 0.5 do 2.0. Następnie podnieś do kwadratu każdą z tych macierzy mierząc czas wykonania tych operacji za pomocą obiektu duration. Dla małych macierzy powtórz tą operację wielokrotnie a potem zmierzony czas podziel przez tą wielokrotność. Do pomiaru czasu użyj czasomierzy opartych na zegarze high_resolution_clock.

  5. 29, 30 października 2018: funktory
  6. Stwórz w swoim programie trzy zbiory danych różnego typu vector<double>, list<string> i set<int>. Wypełnij te kontenery przypadkowymi wartościami (możesz losować albo arbitralnie coś wpisać). Następnie na zbiorach tych wykonaj pewne obliczenia z użyciem zdefiniowanych przez ciebie funktorów (obiekty funkcyjne albo lambdy):

    1. wypisz wszystkie wartości z zadanego zakresu (większe od a i mniejsze od b);
    2. wypisz co k-tą wartość zaczynając od pozycji p-tej;
    3. wyznacz sumę/konkatenację wszystkich elementów;
    4. dodaj do każdego elementu w kolekcji zadaną wartość;
    5. wyznacz średnią arytmetyczną (dotyczy kolekcji z liczbami);
    6. wyznacz element minimalny i maksymalny (zwróć parę iteratorów);
    7. dodaj coś ekstra od siebie.
  7. 19, 20 listopada 2018: kolekcje standardowe
  8. Zaprogramuj algorytm stacji rozrządowej Dijkstry, który przekształca wyrażenie arytmetyczne z postaci infiksowej z nawiasami do postaci postfiksowej bez nawiasów (Odwrotna Notacja Polska). Wykorzystaj do tego celu kolekcje standardowe.

    W swoim algorytmie najpierw podziel wejściowe wyrażenie arytmetyczne na kolejkę/listę leksemów. Wynikiem działania procedury przekształcającej ma być kolejka/lista symboli.

  9. 26, 27 listopada 2018: liczby pseudolosowe
  10. Napisz program, który wygeneruje 1000 losowych liczb z rozkładem:

    1. jednostajnym, używając uniform_real_distribution;
    2. dwumianowym, używając binomial_distribution;
    3. Poissona, używając poisson_distribution;
    4. normalnym, używając normal_distribution.

    Wygenerowane liczby zapisz w pliku .csv (dla każdego rozkładu w osobnym pliku). Zrób w arkuszu kalkulacyjnym wykresy dla wygenerowanych danych w taki sposób, aby sprawdzić poprawność zastosowanego rozkładu prawdopodobieństwa.

  11. 10, 11 grudnia 2018: wyrażenia regularne
  12. Napisz program, który elegancko sformatuje plik w formacie XML:

    1. znaczniki podwójne zawsze rozpoczynają się w nowej linii;
    2. treść w znacznikach podwójnych z 4-spacjowym wcięciem;
    3. znaczniki pojedyncze pozostają w jednej linii razem z treścią;
    4. znaczniki zagnieżdżone zachowują odziedziczone wcięcia;
    5. grupy białych znaków zastąp pojedynczą spacją (za wyjątkiem wcięć).

    Nazwę pliku do sformatowania przekaż poprzez argumenty wywołania. Wyniki formatowania wypisz na standardowym wyjściu.

  13. 17, 18 grudnia 2018: metaprogramowanie
  14. Wykorzystując metaprogramowanie zdefiniuj szablon obiektu funkcyjnego, pozwalającego obliczyć na poziomie kompilacji:

    1. n-tą liczbę Lucasa dla n ≥ 0;
    2. współczynnik dwumianowy (nk) dla 0 ≤ k ≤ n;
    3. największy wspólny dzielnik NWD(a, b) dla a, b ≥ 1.

    Obliczenia te powinny się wykonać w co najwyżej liniowym czasie.

    Uwaga: wybierz jedno z zadań.

  15. 14, 15 stycznia 2019: lokalizacja
  16. Napisz program, który:

    1. wylosuje liczbę całkowitą z zakresu od -1000000000 do +1000000000 i wypisze tą liczbę, używając odpowiednich separatorów pomiędzy grupami cyfr;
    2. odczyta podaną przez użytkownika kwotę ze standardowego wejścia i wypiszę ją używając odpowiedniego sumbolu walutowego;
    3. odczyta lokalny czas systemowy i wypisze bieżącą datę (dzień tygodnia i datę) i bieżącą godzinę (godziny i minuty).

    Dane wypisz podwójnie, używając ustawień zarówno globalnych (domyślnych) jak i polskich (albo angielskich, jeśli domyślne ustawienia będą polskie).

  17. 21, 22 stycznia 2019: współbieżność
  18. Napisz program, który zilustruje problem czytelników i pisarzy z wykorzystaniem operacji czytania z i pisania do jednego pliku tekstowego.

    W swoim programie zdefiniuj klasy Czytelnik, Pisarz i Arbiter (pisarze i czytelnucy posiadają swoje unikatowe dwucyfrowe identyfikatory). Czytelnicy co pewien czas (określany na bieżąco w sposób losowy) czytają plik dane.txt i wyświetlają na standardowym wyjściu ostatnią zapisaną w pliku liczbę (poprzedzoną identyfikatorem czytelnika). Natomiast pisarze dopisują także co jakiś czas (określany na bieżąco w sposób losowy) do tego pliku losowe liczby naturalne (rozpoczynające się od identyfikatora pisarza). Z przyczyn oczywistych czytelnicy mogą działać jednocześnie, natomiast pisarze nie. Co więcej, działalność pisarza wyklucza w tym czasie także działalność czytelników. Rolą arbitra jest dopuszczanie w odpowiedni sposób czytelników i pisarzy do pliku dane.txt.

    Problem należy rozwiązać na różne sposoby:

    1. dopuszczając zagłodzenie pisarzy;
    2. dopuszczając zagłodzenie czytelników;
    3. nie dopuszczając do zagłodzenia ani czytelników ani pisarzy.

wykłady

8 października 2018 r: sprytne wskaźniki

organizacja zajęć

sprytne wskaźniki: shared_ptr, weak_ptr, unique_ptr

slajdy: organizacja.pdf, wskazniki.pdf

15 października 2018 r: czasomierze

współczynniki ratio

zegary clock, punkty time_point i odcinki czasowe duration

slajdy: czasomierze.pdf

22 października 2018 r: funktory

obiekty funkcyjne

lambdy

slajdy: funktory.pdf

29 października 2018 r: kolekcje standardowe

...

slajdy: kolekcje.pdf

5 listopada 2018 r: nowe elementy języka

...

slajdy: nowe.pdf

19 listopada 2018 r: generatory liczb losowych

generatory liczb

rozkłady prawdopodobieństwa

slajdy: losowe.pdf

26 listopada 2018 r: wyrażenia regularne

budowa wyrażeń regularnych

klasa regex

funkcje dopasowujące

podwyrażenia

iterowanie po dopasowaniach

slajdy: regularne.pdf

3 grudnia 2018 r: metaprogramowanie I

idea metaprogramowania

...

slajdy: meta1.pdf

10 grudnia 2018 r: metaprogramowanie II

funkcja typowa Conditional

funkcja typowa Select

iteracja za pomocą szalonów rekurencyjnych

definicja warunkowa Enable_if

slajdy: meta2.pdf

17 grudnia 2018 r: lokalizacja I

kodowanie znaków

...

slajdy: lokalizacja1.pdf

7 stycznia 2019 r: lokalizacja II

klasa locale

aspekty facet

slajdy: lokalizacja2.pdf

14 stycznia 2019 r: współbieżność I

...

slajdy: watki1.pdf