Politechnika Warszawska - Centralny System Uwierzytelniania
Strona główna

Podstawy współczesnego języka C++

Informacje ogólne

Kod przedmiotu: 103A-ELEIF-ISP-PWJC
Kod Erasmus / ISCED: (brak danych) / (brak danych)
Nazwa przedmiotu: Podstawy współczesnego języka C++
Jednostka: Wydział Elektroniki i Technik Informacyjnych
Grupy: ( Przedmioty obieralne )-Elektronika i fotonika-inż.-EITI
( Przedmioty obieralne )-Elektronika i inżynieria komputerowa-inż.-EITI
( Przedmioty techniczne )---EITI
Punkty ECTS i inne: 3.00 Podstawowe informacje o zasadach przyporządkowania punktów ECTS:
  • roczny wymiar godzinowy nakładu pracy studenta konieczny do osiągnięcia zakładanych efektów uczenia się dla danego etapu studiów wynosi 1500-1800 h, co odpowiada 60 ECTS;
  • tygodniowy wymiar godzinowy nakładu pracy studenta wynosi 45 h;
  • 1 punkt ECTS odpowiada 25-30 godzinom pracy studenta potrzebnej do osiągnięcia zakładanych efektów uczenia się;
  • tygodniowy nakład pracy studenta konieczny do osiągnięcia zakładanych efektów uczenia się pozwala uzyskać 1,5 ECTS;
  • nakład pracy potrzebny do zaliczenia przedmiotu, któremu przypisano 3 ECTS, stanowi 10% semestralnego obciążenia studenta.
Język prowadzenia: polski
Jednostka decyzyjna:

103000 - Wydział Elektroniki i Technik Informacyjnych

Kod wydziałowy:

PWJC

Numer wersji:

1

Skrócony opis:

Celem przedmiotu jest zapoznanie studentów z najnowszymi właściwościami języka C++ (w standardach C++17 i C++20) usprawniającymi efektywne tworzenie oprogramowania w z wykorzystaniem metodyk: obiektowej i funkcyjnej z elementami programowania generycznego.

Pełny opis:

Informacje ogólne:

Przedmiot podzielony jest na dwie części: wykładową i laboratoryjną. W trakcie wykładu studenci zostają zaznajomieni z podstawami współczesnego języka C++. Sygnalizowane zagadnienia rozwijane są w trakcie zajęć praktycznych w laboratorium. Aktywnie prowadzone zajęcia uzupełniają wiedzę przedstawianą na wykładzie. Zakłada się, że student zna i rozumie zagadnienia związane z programowaniem strukturalnych oraz obiektowym. Na koniec wykładu studenci uczestniczą w sprawdzianie potwierdzającym zdobytą wiedzę.

Laboratoria realizowane są w dwuosobowych zespołach. W trakcie laboratorium studenci pod nadzorem prowadzących zajęcia rozwiązują zadania programistyczne. Każde z nich podlega ocenie. Studenci zapoznają się ze specyfiką najpopularniejszych kompilatorów (gcc, clang, msvc) oraz zintegrowanych środowisk programistycznych (QtCreator, VisualStudio). Studenci uczą się wytwarzania przenośnego kodu poprzez aktywne wykorzystywanie narzędzi do zarządzania kodem (git) oraz narzędzi automatycznego budowania projektów (qmake, cmake). Studenci poznają metodyki wytwarzania kodu (programowanie sterowane testami) oraz pracy w małych zespołach (podział zadań / programowanie ekstremalne).


Opis wykładu:

  1. (1h) Podstawowe praktyki tworzenia czytelnego „czystego kodu”:
    • zasady: KISS, DRY, YAGNI,
    • zasady nazewnictwa zmiennych, funkcji, klas i szablonów,
    • hermetyzacja, poprawność ze względu na stałość obiektów (const-correctness),
    • rewizja i refaktoryzacja kodu źródłowego,
    • piramida testów: testy jednostkowe, testy komponentów, testy integracyjne, testy GUI,
    • obsługa błędów na etapie działania – obsługa wyjątków oraz asercje dynamiczne.
  2. (2h) Podstawowe elementy programowania generycznego:
    • pojęcie szablonu: funkcji i klasy,
    • elementy biblioteki standardowej <concepts>
    • specjalizacje szablonów,
    • szablony o zmienne liczbie parametrów (variadic templates),
    • konkretyzowanie szablonów przy pomocy klas wytycznych,
    • sprawdzanie typów przy pomocy klas cech, asercje statyczne,
    • automatyczna dedukcja typów: auto i inicjalizacja obiektów z użyciem nawiasów klamrowych,
    • wyrażenia obliczanie w czasie kompilacji, słowo kluczowe constexpr.
  3. (1h) mechanizmy nowoczesnego zarządzania zasobami na stercie, sprytne wskaźniki, semantyka przenoszenia:
    • zarządzanie pamięcią, czasem życia i własnością obiektów,
    • technika zarządzanie zasobami RAII,
    • pojęcia: l-value i r-value i referencje do nich,
    • konstruktor przenoszący i przenoszący operator przypisania,
    • rule of five, rule of zezro,
    • inteligentne wskaźniki: unique_ptr, shared_ptr, weak_ptr,
    • tworzenie inteligentnych wskaźników: funkcje: make_unique, make_shared.
  4. (3h) Kontenery i algorytmy STL:
    • pojęcie iteratora , elementy biblioteki standardowej <ranges>,
    • kontenery danych przechowywanych obok siebie: std::array, std::vector,
    • kontenery przechowujące dane w postaci list: std::list, std::forward_list,
    • drzewa wyszukiwań: std:set, std:map, std::multiset, std::multimap,
    • kontenery wartości hash:std::unordered_set, std::unordered_map,
    • adaptery kontenerów: std::stack, std::queue, std::priority_queue,
    • struktury: std::tuple, std::pair,
    • wykonywanie czynności na elementach krotek std::apply.
  5. (2h) Wyrażenia lambda:
    • funktory i wyrażenia lambda,
    • generyczne wyrażenia lambda,
    • wybrane elementy programowania funkcyjnego: elementy biblioteki standardowej <functional>.
  6. (1h) Wybrane klasy narzędziowe:
    • obsługa i konwersje wartości czasu: std::chrono,
    • obsługa systemu plików: std::path, std::directory_iterator, std::file_status,
    • wykorzystanie typów definiowanych przez użytkownika do obliczeń na wartościach fizycznych.
  7. (2h) Elementy programowania równoległego i współbieżnego:
    • automatyczne zrównoleglanie wykonywania wybranych algorytmów STL,
    • uruchamianie i zatrzymywanie wątków,
    • synchronizacja wątków,
    • komunikacja pomiędzy wątkami procesu.
  8. (2h) Tworzenie wielo-platformowego GUI
    • wprowadzenie do biblioteki wxWidgets,
    • wprowadzenie do biblioteki Qt.

Laboratorium:

  1. (3h) Zapoznanie się z elementami środowiska deweloperskiego:
    • narzędzia do automatycznego zarządzania procesem kompilacji: CMake i Qmake,
    • oprogramowanie wspomagające tworzenie testów jednostkowych: Google C++
    • Testing Framework, Boost Test, Catch 2,
    • implementacja zadanej klasy autonomicznej z wykorzystaniem metodyki TDD w formie biblioteki statycznej i dynamicznej.
  2. (3h) Zarządzanie pamięcią, semantyka przenoszenia i inteligentne wskaźniki:
    • pojęcie klasy narzędziowej
    • definicja i implementacja interfejsu klasy
    • konstruktora, konstruktor kopiujący, konstruktor przenoszący, operatora przypisania, przenoszący operator przypisania, destruktor
    • obiekty służące do podglądu i obiekty „uchwyty”.
  3. (3h) Tworzenie szablonów klas i funkcji:
    • definiowanie szablonów funkcji, specjalizacja i konkretyzacja, wykorzystanie klas cech,
    • szablon klasy na przykładzie samodzielnie zdefiniowanego kontenera wraz z dedykowanymi iteratorami,
    • wykorzystanie klas wytycznych np. do wyboru algorytmu sortowania kontenera.
  4. (3h) Funktory i wyrażenia Lambda:
    • pojęcie funktora i jego definiowanie,
    • pojęcie wyrażenia Lambda: definiowanie, lista przechwytywania,
    • słowo kluczowe const i wyrażenia Lambda jako elementy programowania funkcyjnego,
    • zastosowania constexpr.
  5. (3h) Praca z kontenerami z wykorzystaniem algorytmów STL.
  6. (3h) Rozdanie problemów programistycznych. Definiowanie funkcjonalności z punktu widzenia użytkownika końcowego. Dekompozycja na warstwy i mechanizmy komunikacji. Szkielet GUI.
  7. (3h) Projekt hierarchii klas z użyciem UML, wstępna implementacja.
  8. (2x3h) Implementacja mechanizmów zrównoleglania z wykorzystaniem metodyki programowania generycznego.
  9. (3h) Implementacja i integracja z GUI.


Projekt:

W ramach laboratorium, pod ścisłym nadzorem prowadzących studenci wykorzystując poznane techniki projektowania i wytwarzania oprogramowania w języku C++ przygotowują projekt prostej aplikacji z interfejsem graficznym.

Literatura:

Literatura:

  • Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku

  • Robert C. Martin, Zwinne wytwarzanie oprogramowania. Najlepsze zasady, wzorce i praktyki

  • Stephan Roth, Czysty kod w C++17

  • IDE: QtCreator, Clion, Visal Studio


    Oprogramowanie:

    • Systemy operacyjne: Linux / Windows

  • Zintegrowane środowiska programistyczne: QtCreator, Clion, Visual Studio

  • System kontroli wersji: git, git-bash

  • Kompilatory: gcc, clang, cl(msvc)

  • Zajęcia w cyklu "rok akademicki 2023/2024 - sem. letni" (w trakcie)

    Okres: 2024-02-19 - 2024-09-30
    Wybrany podział planu:
    Przejdź do planu
    Typ zajęć:
    Laboratorium, 30 godzin, 20 miejsc więcej informacji
    Wykład, 15 godzin, 20 miejsc więcej informacji
    Koordynatorzy: Marcin Bączyk, Marek Niewiński
    Prowadzący grup: Marcin Bączyk, Marek Niewiński
    Lista studentów: (nie masz dostępu)
    Zaliczenie: Ocena łączna
    Jednostka realizująca:

    103300 - Instytut Systemów Elektronicznych

    Zajęcia w cyklu "rok akademicki 2023/2024 - sem. zimowy" (zakończony)

    Okres: 2023-10-01 - 2024-02-18
    Wybrany podział planu:
    Przejdź do planu
    Typ zajęć:
    Laboratorium, 30 godzin, 24 miejsc więcej informacji
    Wykład, 15 godzin, 24 miejsc więcej informacji
    Koordynatorzy: Marcin Bączyk, Marek Niewiński
    Prowadzący grup: Marcin Bączyk, Grzegorz Krawczyk, Marek Niewiński
    Lista studentów: (nie masz dostępu)
    Zaliczenie: Ocena łączna
    Jednostka realizująca:

    103300 - Instytut Systemów Elektronicznych

    Zajęcia w cyklu "rok akademicki 2022/2023 - sem. letni" (zakończony)

    Okres: 2023-02-20 - 2023-09-30
    Wybrany podział planu:
    Przejdź do planu
    Typ zajęć:
    Laboratorium, 30 godzin, 20 miejsc więcej informacji
    Wykład, 15 godzin, 20 miejsc więcej informacji
    Koordynatorzy: Marcin Bączyk, Marek Niewiński
    Prowadzący grup: Marcin Bączyk, Marek Niewiński
    Lista studentów: (nie masz dostępu)
    Zaliczenie: Ocena łączna
    Jednostka realizująca:

    103300 - Instytut Systemów Elektronicznych

    Zajęcia w cyklu "rok akademicki 2022/2023 - sem. zimowy" (zakończony)

    Okres: 2022-10-01 - 2023-02-19
    Wybrany podział planu:
    Przejdź do planu
    Typ zajęć:
    Laboratorium, 30 godzin, 30 miejsc więcej informacji
    Wykład, 15 godzin, 30 miejsc więcej informacji
    Koordynatorzy: Marcin Bączyk, Marek Niewiński
    Prowadzący grup: Marcin Bączyk, Marek Niewiński
    Lista studentów: (nie masz dostępu)
    Zaliczenie: Ocena łączna
    Jednostka realizująca:

    103300 - Instytut Systemów Elektronicznych
    103500 - Instytut Mikroelektroniki i Optoelektroniki

    Zajęcia w cyklu "rok akademicki 2021/2022 - sem. letni" (zakończony)

    Okres: 2022-02-23 - 2022-09-30
    Wybrany podział planu:
    Przejdź do planu
    Typ zajęć:
    Laboratorium, 30 godzin, 30 miejsc więcej informacji
    Wykład, 15 godzin, 30 miejsc więcej informacji
    Koordynatorzy: Marcin Bączyk, Marek Niewiński
    Prowadzący grup: Marcin Bączyk, Marek Niewiński
    Lista studentów: (nie masz dostępu)
    Zaliczenie: Ocena łączna
    Jednostka realizująca:

    103500 - Instytut Mikroelektroniki i Optoelektroniki

    Opisy przedmiotów w USOS i USOSweb są chronione prawem autorskim.
    Właścicielem praw autorskich jest Politechnika Warszawska.
    pl. Politechniki 1, 00-661 Warszawa tel: (22) 234 7211 https://pw.edu.pl kontakt deklaracja dostępności USOSweb 7.0.0.0-7 (2024-03-18)