Paweł Rzechonek

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

język programowania C++

Instytut Informatyki Uniwersytetu Wrocławskiego
rok akademicki 2016/17 semestr letni

godzina wejścia na stronę

Godzina wejścia na tą stronę to 11:20 (czwartek 4 czerwca 2020 roku).

data ostatniej modyfikacji dokumentu

Data ostatniej modyfikacji tego dokumentu (cpp-2017.phtml) to czwartek 8 czerwca 2017 roku (o godzinie 14:30).

ogłoszenia
30 maja 2017 r.
zadania studentów z grupy MMa:
Ze względu na wyjazd Marka Materzoka, studenci z jego gupy powinni wysłać swoje zadania na Skos.

25 kwietnia 2017 r.
skos:
W lokalnym serwisie edukacyjnym skos.ii.uni.wroc.pl utworzyłem nowy przedmiot kurs języka C++ z możliwością składowania tam programów studenckich. Począwszy od listy 6 proszę tam umieszczać ocenione programy. Uwaga: tylko programy umieszczone na skosie będą punktowane!

14 kwietnia 2017 r.
magazynowanie zadań:
Ostatnio miał miejszce incydent z plagiatem. Aby uszczelnić system sprawdzania samodzielności programowania zadań, od najbliższej pracowni studenci będą przesyłali swoje rozwiązania nauczycielom prowadzącym na wskazany przez nich aders mailowy. Zadania te będą później weryfikowane pod kątem podobieństw w celu wyeliminowania plagiatów.

12 kwietnia 2017 r.
laboratorium 5 (bufory):
To zadanie należało zrealizować przez Świętami Wielkanocnymi ale niewielu studentów się z tym uporało. Ja w mojej grupie PRz postanowiłem, że będę je jeszcze odbierał po Świętach (za maksymalnie 8 punktów) 19 kwietnia.

7 kwietnia 2017 r.
odwołany wykład (L4):
Najbliższy wykład we wtorek 11 kwietnia nie odbędzie się - wykładowca na zwolnieniu lekarskim L4.

29 marca 2017 r.
laboratorium 5 (bufory):
To zadanie należy zrealizować przez Świętami Wielkanocnymi (dopiero po Świętach wstawię nowe zadanie do zaprogramowania).

29 marca 2017 r.
laboratorium 4 (wielomiany) w grupie PRz:
A wszystko to przez zmianę czasu! Od trzech dni chodzę nieprzytomny i nie potrawię się przestawić na nowe... Zamiat pójść do s.7 to czekałem na Was w s.108. Trudno - mleko się rozlało. Zadanie 4 odbiorę w przyszłym tygodniu 5 marca.

28 lutego 2017 r.
pierwsze laboratorium:
W pierwszym tygodniu nauki laboratoria nie odbywają się. Pierwsze laboratorium zaplanowałem dopiero na przyszły tydzień: 6-10 marca 2017 r.

22 lutego 2017 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 12-14 s.25 (Paweł Rzechonek)

laboratoria:
wtorek 17-19 s.7 (Marek Materzok)
środa 8-10 s.7 (Paweł Rzechonek)
środa 14-16 s.108 (Krystian Bacławski)
piątek 10-12 s.108 (Przemysław Gospodarczyk)
licznik wejść na stronę

1 dzisiaj
6 w obecnym miesiącu
186 w bieżącym roku
3433 od powstania strony

×
szerokość ekranu:
telefon (xs) 480...719 tablet (sm) 720...959 laptop (md) 960...1199 ekran komputera (lg) 1200...

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

laboratorium

Zasady zaliczenia przedmiotu
Ogólnie:
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).
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.
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. liczby w systemie rzymskim
  2. figury na płaszczyźnie
  3. kolejka zbudowana na tablicy
  4. wielomiany
  5. bufory zaimplementowane na listach
  6. wyrażenia arytmetyczne
  7. liczby wymierne
  8. drzewo BST
  9. bezpieczne pliki tekstowe
  10. odwrotna notacja polaska
  11. automaty skończone
  12. liczby losowe (zadanie dodatkowe)
Ranking
Skos

wykłady

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

organizacja zajęć: cpp0.ppt

  • 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
  • wektory vector<>
  • używanie wektorów zamiast tablic
  • inicjalizacja tablic i kolekcji za pomocą listy wartości
  • przeglądanie tablic i kolekcji za pomocą pętli 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: cpp1.ppt

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

slajdy: cpp2.ppt

14 marca 2017 r: inicjalizacja, kopiowanie, przenoszenie

  • jednolita inicjalizacja
  • inicjalizacja listą wartości initialization_list<>
  • konstruktor kopiujący i przenoszący
  • przypisanie kopiujące i przenoszące
  • 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

slajdy: cpp3.ppt

21 marca 2017 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: cpp4.ppt

28 marca 2017 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
  • 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: cpp5.ppt

4 kwietnia 2017 r: polimorfizm, przestrzenie nazw

  • 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
  • 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: cpp6.ppt

19 kwietnia 2017 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: cpp7.ppt

25 kwietnia 2017 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
  • para danych - klasa pair<F, S>
  • wymiana danych - funkcja swap<T>
  • opakowanie dla tablicy dynamicznej - klasa vector<T>
  • opakowanie dla dwukierunkowej tablicy dynamicznej - klasa deque<T>

slajdy: cpp8.ppt

9 maja 2017 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
  • definiowanie szablonów w plikach nagłówkowych

slajdy: cpp9.ppt

16 maja 2017 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: cppA.ppt

23 maja 2017 r: kolekcje i iteratory

  • 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: cppB.ppt

30 maja 2017 r: obiekty funkcyjne, algorytmy

  • funktory i predykaty
  • predefiniowane obiekty funkcyjne
  • funkcje lambda
  • 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: cppC.ppt