Paweł Rzechonek

kurs języka C++

semestr letni 2016

strona główna

kurs języka 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 w języku ANSI C
  • znajomość podstawowych struktur danych (tablice, listy, drzewa, grafy)

literatura papierowa

  • B.Stroustrup: Język C++. Kompendium wiedzy. Wydanie 4. Wydawnictwo Helion, Gliwice 2014.
  • N.M.Josuttis: C++. Biblioteka standardowa. Podręcznik programisty. Wydanie 2. Wydawnictwo Helion, Gliwice 2014.
  • 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.
  • J.Grębosz: Symfonia C++ Standard. Programowanie w języku C++ orientowane obiektowo. Tom 1 i 2. Wydawnictwo Helion, Gliwice 2010.

 

literatura elektroniczna

wykłady

zakres materiału

  • konstrukcje językowe w C++
  • udogodnienia i techniki w C++
  • programowanie obiektowe w C++
  • szablony funkcji i klas
  • wybrane fragmenty STL

lista wykładów


sparwy organizacyjne (24 lutego 2016 r.)

  • kontakt z wykładowcą
  • zakres materiału
  • zasady zaliczania przedmiotu
  • historia C++
  • najważniejsze cechy C++
  • literatura
slajdy
organizacja zajęć

szybkie wprowadzenie do C++ (24 lutego 2016 r.)

  • 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
  • wektory vector<>
  • używanie wektorów zamiast tablic
  • listy wartości initalizer_list<>
  • inicjalizacja tablic i kolekcji za pomocą listy wartości
  • przeglądanie tablic i kolekcji za pomocą pętli for-each
  • ułożenie obiektów w pamięci i operator alignof
  • wskaźnik pusty nullptr
  • typ void
  • typy całkowite int8_t, int16_t, int32_t i int64_t
  • typy znakowe char16_t i char32_t
  • łańcuchy znakowe string
  • używanie łańcuchów znakowych zamiast napisów w stylu C
  • 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
szybkie wprowadzenie do C++
programy
program powitalny
przeliczanie milimetrów na cale

klasy i obiekty (2 marca 2016 r.)

  • 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ą new
  • inicjalizacja obiektu za pomocą konstruktora
  • 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ą delete
  • likwidacja obiektu z udziałem destruktora
  • automatyczne uruchomienie destruktora przed likwidacją obiektu
  • wskaźnik this i jego wykorzystanie w metodach instancyjnych
  • 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
  • składowe statyczne w klasie deklarowane za pomocą static
  • odwołania do składowych statycznych
  • inicjalizacja pól statycznych
slajdy
klasy i obiekty
programy
punkt na płaszczyźnie: punkt.hpp, punkt.cpp, test_punkt.cpp

    kopiowanie i przenoszenie (9 marca 2016 r.)

    • konstruktor kopiujący
    • przypisanie kopiujące
    • blokowanie wygenerowania konstruktorów i przypisań za pomocą frazy =delete
    • l-wartości i r-wartości
    • obiekty tymczasowe
    • argumenty tymczasowe w funkcjach
    • semantyka przenoszenia
    • konstruktor przenoszący
    • przypisanie przenoszące
    • inicjalizacja za pomocą list wartości initialization_list<>
    • konstruktory delegatowe
    • funkcje wbudowane
    • argumenty domyślne w funkcjach
    slajdy
    kopiowanie i przenoszenie
    programy
    funkcja z parametrem tymczasowym
    klasa opakowująca tablicę

      praktyka programowania w C++ (16 marca 2016 r.)

      programy
      kopiowanie i przenoszenie zasobów

        przeciążanie operatorów (23 marca 2016 r.)

        • funkcje i klasy zaprzyjaźnione
        • przeciążanie operatorów
        • operatory składowe i 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 <<
        programy
        liczby zespolone: lzesp.hpp, lzesp.cpp, test_lzesp.cpp

          dziedziczenie (30 marca 2016 r.)

          • dziedziczenie, czyli tworzenie nowych klas na bazie starych
          • porównanie dziedziczenia i kompozycji
          • lista pochodzenia
          • dostęp do odziedziczonych składników
          • przywracanie pierwotnej widoczności odziedziczonych składników za pomocą deklaracji using
          • projektowanie hierarchii klas
          • dziedziczenie wielobazowe
          • dziedziczenie wirtualne
          • konwersje standardowe dla wskaźników i referencji przy dziedziczeniu
          • konstruktory delegatowe
          • przenoszenie konstruktorów z klasy bazowej za pomocą deklaracji using
          • inicjalizacja pól składowych w definicji klasy
          slajdy
          dziedziczenie
          programy
          hierarchia klas dla punktów

            polimorfizm (6 kwietnia 2016 r.)

            • polimorfizm, czyli inteligentne rozszerzanie hierarchii klas
            • 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
            • klasa vector<>
            • klasa pair<>
            slajdy
            polimorfizm
            programy
            wyrażenia boolowskie

              konwersje (13 kwietnia 2016 r.)

              • konwersje tradycyjne dla typów podstawowych
              • konstruktory konwertujące i notacja konstruktorowa
              • blokowanie konwersji za pomocą explicit
              • operatory konwersji w klasie
              • szablonowe operatory konwersji
              • RTTI
              • automatyczne określanie typu
              • wydobycie typu wyrażenia
              • 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
              konwersje
              programy
              zastosowanie const i volatile
              ...

                wyjątki (20 kwietnia 2016 r.)

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

                  szablony (27 kwietnia 2016 r.)

                  • 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
                  • definiowanie szablonów w plikach nagłówkowych
                  slajdy
                  szablony
                  programy
                  szblon funkcji ze specjalizacjami
                  rekurencyjny szablon klasy macierzy z wersją specjalizowaną

                    strumienie (4 maja 2016 r.)

                    • 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
                    strumienie
                    programy
                    ...

                      kolekcje standardowe (11 maja 2016 r.)

                      • struktura STL
                      • pary i tuple
                      • sprytne wskaźniki shared_pointer i unique_pointer
                      • ograniczenia liczbowe numeric_limits
                      • minimum, maksimum i zamiana wartości
                      • operatory porównywania i przestrzeń std::rel_ops
                      • 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
                      kolekcje standardowe
                      programy
                      ...

                        obiekty funkcyjne, biblioteki (18 maja 2016 r.)

                        • funktory i predykaty
                        • predefiniowane obiekty funkcyjne
                        • algorytm for_each
                        • funkcje lambda
                        • kompilacja i łączenie poszczególnych jednostek translacji
                        • programowanie modularne
                        • biblioteki statyczne, współdzielone i dynamiczne
                        • tworzenie bibliotek
                        • szablony zewnętrzne
                        slajdy
                        funktory, predykaty, lambdy
                        programy
                        ...

                          narzędzia programistyczne (1 czerwca 2016 r.)

                          • współczynniki wymierne
                          • pomiar czasu
                          • liczby pseudolosowe
                          slajdy
                          narzędzia programistyczne
                          programy
                          ...

                            algorytmy (8 czerwca 2016 r.)

                            • 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
                            • algorytmy numeryczne
                            slajdy
                            algorytmy
                            programy
                            ...

laboratoria

zasady zaliczenia laboratorium

W semestrze będzie opublikowanych (na tej stronie) kilkanaście prostych zadań do zaprogramowania. Za każde poprawnie zaprogramowane zadanie i oddane w terminie można będzie dostać do 10 punktów (chociaż zadania będą różnej trudności). Celem studenta ma być programowanie zadań w wyznaczonym terminie, ich prezentacja przed prowadzącym zajęcia laboratoryjne i gromadzenie punktów za zrobione zadania (na podstawie zdobytych punktów na koniec semestru zostanie wystawiona ocena).

 

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 kolegów czy koleżanki). W trakcie prezentacji programu trzeba się liczyć z pytamiami dotyczącymi zadania: metoda rozwiązania, zastosowane konstrukcje językowe, wykorzystane funkcje i klasy z biblioteki standardowej, itp.

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

Zadania laboratoryjne należy wykonywać samodzielnie. W trakcie prezentacji programu należy odpowiadać na pytania związane z programem - używane konstrukcje językowe, stosowane funkcje lub klasy z biblioteki standardowej, itp.

zadanie 1

rozkład liczb całkowitych na czynniki pierwsze
(29 lutego - 3 marca 2016 r.)

zadanie 2

prosta na płaszczyźnie
(7-10 marca 2016 r.)

zadanie 3

stos liczb rzeczywistych
(14-17 marca 2016 r.)

zadanie 4

lista napisów
(21-24 marca 2016 r.)

zadanie 5

operacje na wielomianach
(4-7 kwietnia 2016 r.)

zadanie 6

wyrażenia arytmetyczne
(18-21 kwietnia 2016 r.)

zadanie 7

liczby wymierne
(25-28 kwietnia 2016 r.)

zadanie 8

drzewo BST
(4-11 maja 2016 r.)

zadanie 9

zadanie 10

kalkulator ONP
(23 maja - 2 czerwca 2016 r.)

zadanie 11 (dodatkowe)

liczby losowe
(6-9 czerwca 2016 r.)

ranking

  • grupa PRz pn.18-20