Program zajęć AGH: Języki i metody programowania 2

Warunki zaliczenia:
(Iustitia est constans et perpetua voluntas ius suum cuique tribuere, czyli „Spra­wied­li­wość jest to stała i niezłom­na wo­la od­da­wania każde­mu te­go, co mu się na­leży„)

  1. Do 2 nieusprawiedliwionych nieobecności
  2. Dwa kolokwia po 2-3 zadania, z których obydwa trzeba zdać (kolokwia w formie podobnej do egzaminu, dla więcej niż moich grup równocześnie).
    1. Średnia ocena z kolokwium stanowi bazową ocenę końcową, którą modyfikuje praca na zajęciach.
  3. Jeśli ktoś nie zda któregokolwiek z dwóch kolokwium to pod koniec kolokwium poprawkowe ze wszystkiego
  4. Zadania domowe, które otrzymuje grupa 2-osobowa, które następnie referuje się na projektorze, w dowolnym momencie może być spytana dowolne z osób ze wszystkich na laboratoriach dlaczego tak, jeśli nie umie to , jeśli umie to +. WSZYSTKIE GRUPY CO ZAJĘCIA BĘDĄ PRZEPYTANI PRZY TABLICY + reszta po parę razy przy okazji jeśli by tamci czegoś nie wiedzieli.
    1. Każdy +/- modyfikuje średnią ocenę z kolokwiów, jeśli więc ktoś ma kolokwia zdane na styk, a ma minusa to nie ma zaliczenia.
  5. Osoby chcące mieć 5.0 na koniec poza wymaganą ilością ocen powinni zrobić zadanko, które wykracza poza standard C++

Zajęcia 1 dnia 26 II

  • Sprawy organizacyjne:
    • konsultacje i kontakt
    • książka
    • grupy
    • instrukcja konfiguracji środowiska programistycznego qtCreator
    1. Zadania:
      1. Proszę napisać klasę Array, która będzie przechowywała liczby, pamiętając ile ich przechowuje, proszę też o napisanie metod:
        int get(int index); -pobierająca element o zadanym indeksie
        void set(int index, int newValue); – ustawiająca element o zadanym indeksie
      2. Proszę o napisanie klasy jw., ale z metodami:
        int* front(); – zwracająca wskaźnik do pierwszego elementu
        int* back(); – zwracająca wskaźnik do ostatniego elementu
        int size(); – zwracająca ilość elementów
      3. Proszę o napisanie klasy jw., ale z metodami:
        void fill(int value); – ustawia wszystkim elementom tablicy daną wartość
        void assign(const int tab[], int tabSize); – kopiuje elementy z tablicy do naszego Array
      4. Proszę o napisanie klasy jw., ale z metodami:
        Array* clone(); – wykonuje głęboką kopię naszego obiektu przy pomocy dynamicznej allokacji
      5. Proszę o napisanie klasy jw., ale z metodami:
        void reverse(); – odwraca kolejność elementów w tablicy
        int count(int value); – zwraca ilość wystąpień danego elementu
      6. Proszę o napisanie klasy jw., ale z metodami:
        … toText(); – zamienia nasz obiekt na tekst
        void print(); – wypisuje nasz obiekt na ekran
      7. Proszę o napisanie klasy jw., ale z metodami:
        void swap(Array& anotherArray); – funkcja do zamiany zawartości między tablicami
        int find(int value); – funkcja która zwraca pozycję znalezionej liczby
      8. *Proszę o napisanie klasy jw., ale z metodami (operatory strumienia):
        friend std::ostream& operator<>(std::istream& os, Array& array);
    2. Na następny raz z wykładu, oraz z czego się Państwo uda przeczytać o zagadnieniu „Deklarowanie prostych klas, kontenery prostych klas.”

    Zajęcia 2 dnia 5 III

    1. Zadania domowe:
      1. Proszę o napisanie struktury Item, która będzie zawierała:
        value, description, bonusType (atak, obrona, …)
        struktura ma odzwierciedlać bonusy za różne przedmioty w grze RPG.
        Proszę o napisanie klasy Equipment, która będzie zawierała wiele elementów struktury Item. Poza tym proszę o napisanie następujących funkcji:

        1. funkcja dodająca Item do naszego Equipment
        2. funkcja wyświetlająca istniejące elementy z numeracją i zadanym wcięciem
        3. funkcja zapisująca Itemy do pliku
        4. funkcja wczytująca Itemy z pliku
        5. funkcja zwracająca sumę wartości statystyk dla określonej wartości bonusType np. dla ataku
        6. funkcja wyświetlająca elementy tylko dla określonej wartości bonusType
        7. funkcja łącząca dwa obiekty Equipment
        8. *funkcja sortująca Itemy wg bonusType, potem wg wartości, potem dopiero wg nazwy
      2. Na następny raz do przeczytania:
        metody składowe klasy, konstruktory (domyślny, kopiujący, przenoszący), destruktory. Kolejność wołania konstruktorów i destruktorów. Zapis/odczyt plików tekstowych. Dynamiczna allokacja pamięci. Enum i enum class. Debbugowanie ogólnie (można przeczytać u mnie w zakładce Debugger)

        1. Na następny raz do uzupełnienia (odkryto braki na zajęciach):
          statyczne składowe klasy, zmienne constexpr, przeładowywanie nazw funkcji, słówko auto (w znaczeniu automatycznej dedukcji typów, tutaj wystarczy ogólnie zrozumieć co to jest), nowa pętla for z c++ (zwana for-zakresowym), referencja

Zajęcia 3 dnia 12 III:

  1. Zadanie na następny raz następny raz (treść w trakcie pisania):
    Napisanie klasy String, do obsługi tekstu, która allokuje tyle pamięci ile trzeba na przechowanie danego rozmiaru tekstu, oraz informacji ile tekstu jest w danej chwili zaalokowanego (tekst przez char*). Proszę o napisanie konstruktorów (domyślnego i kopiującego głęboko), destruktora i operatorów przypisania, a poza tym:

    1. operator+(const char* text)
      operator+(const String& text)
    2. operator==(const char* text)
      operator==(const String& text)
    3. operator<(const String& text) operator>(const String& text)
    4. operator[](size_t index); – wersja zwykła i constowa
      operator() zwracający rozmiar
      operator(const char* text) zwracający pozycję tekstu text
    5. operator konwersji do boola lub size_t
      jawny operator konwersji do std::string
    6. operatory strumienia:
      std::ostream& <<() std::istream&>>()
    7. operator++() i operator++(int) – pre i post inkrementacji, który np. doda z tyłu tekstu jedną spację
      operatory jw. ale dekrementacji, które usunie ostatni znak
    8. *operator<<(double), który dopiszę daną liczbę na koniec tekstu
      operator<<(int)
  2. Na następny raz do przeczytania:
    1. dziedziczenie -wszystko co Państwo znajdą o dziedziczeniu (bez dziedziczenia virtualnego, chociaż warto wiedzieć że coś takiego jest).
    2. umieć użyć std::vector (podstawy użycia)
    3. poczytać co to jest std::string
    4. zapoznać się z materiałami na UPELu rozumiejąc co się dzieje w kodzie i dlaczego

Zajęcia 4, 19 III:

  1. Na następny raz do przeczytania:
    1. std::list: jak dodawać elementy, jak je przeglądać (wystarczy for-ranged loop), na czy polega lista jako struktura danych
    2. polimorfizm (dynamiczny) w C++ – jak tego użyć, na czym to polega
    3. rzutowanie w C++ w hierarchii dziedziczenia w dół i w górę (ogólnie)
  2. Zadania na następny raz:
    Proszę o zdefiniowanie abstrakcyjnej klasy Object, która będzie zawierała metody:
    whatAmI() – zwracająca informacje jakiego tak naprawdę typu jest ten obiekt
    toString() lub operator konwersji do std::string – zwracająca tekstową reprezentacje danego obiektu
    clone() – wykonująca głęboką kopię obiektu
    append() lub operator+= – wykonująca dodawanie na obiektach tego samego typu (do typu można użyć whatAmI()).
    Dla poszczególnych grup proszę o umiejętność implementacji:

    1. StringObject, która będzie zawierała implementacje metod klasy bazowej, może też zawierać swoje metody
    2. IntObject, która będzie zawierała implementacje metod klasy bazowej, może też zawierać swoje metody, z założenia ma to być klasa obudowująca inta
    3. DoubleObject, jw., ale dla obiektów typu double
    4. Proszę o napisanie funkcji, które będą przyjmować listę obiektów Object:
      save2File(const std::list<Object*> objects).
    5. Jak w 4. ale taką funkcję, która skopiuje wszystkie obiekty typu DoubleObject do innej listy.
    6. Jak w 4. ale taką funkcję, która zwróci std::vector ze wszystkimi wartościami z listy, które są typu IntObject.
    7. Jak w 4. ale taką funkcję, która zwróci std::string będący sumą tekstów z całej listy
    8. *Proszę o napisanie funkcji sortującej listę wg typu (std::list ma własną wersję funkcji sortującej, tylko trzeba dostarczyć mechanizm do porównywania typów)

Zajęcia 5, dnia 26 III:

  1. Do doczytania na następny raz:
    1. Dziedziczenie wielo-bazowe, problem diamentu, dziedziczenie wirtualne.
    2. Semantyka przenoszenia (konstruktory przenoszące i przenoszący operator przypisania).
    3. Wiedzieć na czym polega lista jako struktura danych, aby umieć ją zaimplementować.
    4. Poczytać na temat śledzenia przebiegu programu (debugowanie).
  2. Zadanie na zajęciach (z części wspólnej będę pytał na wyrywki): Proszę umieć napisać kontener List (czyli listę 1-kierunkową), która będzie przechowywać obiekty typu Object z ostatnich zajęć. Proszę w liście umieć zaimplementować wszystkie domyślnie generowane 6 metod (do przenoszenia też) (co jest generowane, str. 28). Będziemy też przeglądać kod w trakcie wykonywania przy pomocy debugera. Poza tym proszę o implementację następujących metody (nr odpowiada grupie):
    1. Metoda push_back() i operator+=(), która dorzuca element na koniec.
    2. Metoda pop_back() i operator–(), która usuwa element z końca.
    3. Metodę at() i operator[] , która zwraca element o danym indeksie.
    4. Metoda size() i operator konwersji do size_t zwracający ilość elementów listy.
    5. to co grupa 4.
    6. to co grupa 3.
    7. to co grupa 2.
    8. to co grupa 1
  3. Dla chętnych alternatywna treść szczegółowa

Zajęcia 6, dnia 2 IV:

  1. Na następny raz do doczytania:
    1. przejrzenie załączonego kodu (i zrozumienie)
    2. przejrzenie tego co robiliśmy do tej pory
    3. przejrzenie tego co do tej pory trzeba było się nauczyć (jak ktoś coś pominął najwyższy czas)
    4. wyjątki (podstawy)
    5. wczesne i późne wiązanie
    6. umieć w podstawach użyć słownik (std::map) wraz z podstawowymi operacjami – dodać, sprawdzić czy jest, przejrzenie wszystkich elementów
    7. debugowanie – innym razem
  2. Proszę w oparciu o nasz kod z ostatnich zajęć:
    1. Napisać funkcję, która przy użyciu wyrażeń regularnych sprawdzi, czy podany Obiekt jest StringObject i zawiera poprawny mail:
      bool isMail(const Object* obj);
    2. Napisać funkcję, która na każdym z elementów listy zawoła pewną funkcję, oraz zwróci listę kopii elementów prawdziwych dla zawołania funkcji
      List getElementsPassingPredicate(const List& myList, bool(*predicate)(const Object*));
    3. Proszę o napisanie funkcji, która zwróci parę: numer miesiąca i jego nazwę tekstową przyjmującą indeks miesiąc jako typ wyliczeniowy:
      std::pair<IntObject, StringObject> getMonthNumberAndText(Month month);
    4. Proszę o napisanie struktury Predicate, która będzie miała czysto wirtualną operator() przyjmujący argument typu const Object*, zwracająca bool. Proszę o napisanie też implementacji:
      1. Strukturę IsGreaterThan, która w konstruktorze przyjmie liczbę, a jej operator() będzie sprawdzał, czy dany Object* trzyma liczbę większą niż to co podaliśmy w konstruktorze.
    5. Proszę o napisanie funkcji podobnej jak w 2, ale przyjmującej pochodną od Predicate i zwracającej liczbę elementów, dla których zawołanie ów Predicate jest spełnione
      size_t countElementsPassingPredicate(const List& myList, const Predicate& predicate)
    6. Proszę o napisanie przeciążenie operatora&& dla naszego List, która będzie zwracać true, jeśli dany Object znajduje się już w naszej liście:
      bool operator&&(const Object& obj) const;
    7. Proszę o zdefiniowanie dla naszej List operatora->, który będzie służył do wołania metod z losowego elementu listy, w razie gdy pusta lista proszę wyrzucić wyjątek.
    8. * Proszę o napisanie do naszej listy którejś z poniższych metod:
      1. sortowania
      2. usuwania duplikatów (przy posortowanej liście)
      3. łączenia dwóch list posortowanych z zachowaniem porządku posortowanego

Zajęcia 7 i 8 dnia 9 i 16 kwietnia:

  1. Do obeznania się na następny raz:
    1. to czego nie dokończyliśmy ostatnio
    2. debbugowanie – kiedyś tam będzie
    3. klasy zagnieżdżone
    4. iteratory (implementacja własnych, użycie do wyświetlania zawartości kontenera)
    5. std::set i std::string
    6. umieć użyć printf do podstawowych typów
  2. Zadania dla wszystkich: Proszę do naszej List utworzyć klasę zagnieżdżoną iterator, która będzie pamiętać aktualną pozycję w liście
    1. proszę do niego zdefiniować metody:
      1. operator* pobierający aktualny element (zupełnie jak przy wstkaźnikach). Jeśli iterator nie wskazuje na żaden element proszę wyrzucić wyjątek
      2. operator++, który przesunie iterator na następny element w liście
      3. operator!=(iterator it), który sprawdzi, czy iteratory nie wskazują na ten sam element
    2. proszę też o zdefiniowanie metod w naszym List:
      1. begin, która zwróci iterator wskazujący na pierwszy element
      2. end(), która zwróci iterator wskazujący za ostatni element listy (najprościej zrobić aby ten iterator wskazywał na nullptr -wyjdzie na to samo, a wygodniej zaimplementować)
    3. Proszę o dostosowanie naszych Object, aby można było używać ich w kontenerze std::set.
    4. Proszę o zrobienie iteratora, który by czytał plik linijka w linijkę i wyświetlał na ekranie.
    5. to co grupa 4
    6. to co grupa 3
    7. to co grupa 2
    8. *skopiować pliki przy pomocy iteratorów
    9. *wyświetlić std::vector w jednej linijce przy pomocy std::copy i ostream_iterator

Zajęcia A dnia 30 kwietnia (nadobowiązkowe),
tylko grupa 15:30-17:00 (zadeklarowało się 8 osób)

Planuję zrobić ciekawe zajęcia, w nietypowej formie (+ paczka), stąd warto utrwalić to co się nauczyliśmy do tej pory. Preferowane własne komputery ze skonfigurowanym wifi AGH i Qt Creator. Zostaje nam na kiedyś:

  • aplikacja okienkowa w QT – padła propozycja, aby zrobić od początku do końca
  • pobieranie czegoś z internetu – to było dzisiaj
  • generowanie PDFa
  • łączenie się z bazą danych
  • generowanie grafiki
  • ciekawostka optymalizacyjna
  • wysyłanie maili
  • strona internetowa w C++
  • zagnieżdżanie pythona wewnątrz Cpp
  • rozpoznawanie osoby po twarzy w OpenCV

Zajęcia B dnia 7-mego maja (dodatkowe -jak zrobić aplikację okienkową w C++ przy użyciu QT) – możemy zrobić, jeśli będą chętni

Zrobiliśmy organizer – notatki na poszczególne dni, kod dostępny na UPELu


Zajęcia 9: KOLOKWIUM: 9-tego maja (czwartek 11:00-12:30 w sali C2-224) w terminie wykładu z Latexa


Zajęcia 10 dnia 14 maja:

  1. Na te zajęcia prosze doczytać:
    1. Szablony klas, funkcji, funkcji składowych
  2. Proszę o przygotowanie zadań na następny 14 maja. Część wspólna:
    Proszę o przygotowanie szablonu klasy Vector (identycznego jak std::vector). Zadania dla poszczególnych grup:

      1. konstruktory – domyślny (nic nie robiący), kopiujący, przenoszący, destruktor
      2. konstruktory – kopiujący z innego kontenera i kolejny konstruktor z tablicy statycznej.
        template<typename Container>
        Vector(const Container& container);
        template<size_t N>
        Vector(T(& staticArray)[N]);
        

         

      3. metoda push_back(T t) – dodaje element na koniec, w razie braku miejsca dokonuje reallokacji
        metoda pop_back(), która usuwa element z końca
      4. metoda at(size_t index), która w razie wyjścia poza zakres wyrzuci wyjątek
        metoda size() zwracająca rozmiar
      5. proszę zamiast ręcznego zarządzania pamięcią zamienić to co w środku na unique_ptr<T[]> data;
        proszę o zamianę aby jako parametr szablonu naszego Vectora podawać również ilość elementów do dodawania przy realokacji:

        template<typename T, size_t resizeStep=5>
        struct V {..}
      6. Prosze o zaimplementowanie mechanizmu do iteracji, aby działało:
        for (auto a : ourVector) cout << a << endl;
      7. Proszę o zaimplementowanie metody:
        template<typename Predicate>
        size_t count_if(Predicate predicate);

        wraz z przykładowym predykatem (własnym, lub standardowym, bez lambd)

      8. *Zadania dla pro (ekspert mode):
        1. konstruktor, aby działało Vector v = {3, 4, 1, 56};
        2. dodanie sprawdzeń na etapie kompilacji, czy typ T spełnia pewne wymagania (należy poczytać o SFINAE w C++, oraz można uzyć enable_if i type_traits).

Zajęcia 11 dnia 21 maja:

  1. Proszę przeczytać o tym jak rozpoznawać typy w C++, o sposobach rzutowania.
  2. Zadania dla wszystkich grup (wszystko poniższe obowiązuje wszystkich):
    1. proszę o wzięcie naszej hierarchii dziedziczenia Object, IntObject, … (zajęcia 4-6), oraz mając wskaźnik/referencje do Object wskazujący na DoubleObject otrzymać wskaźnik/referencję na DoubleObject. Co jeśli się nie uda z referencji/wskaźnika.
    2. proszę rozpoznać typ obiektu na podstawie wskaźnika i porównać z innym typem.

Zajęcia C dnia 21 maja – nadobowiązkowe omówienie kolokwium w terminie odwołanego wykładu z RPISu 11-12:30 w sali B1-H24


Zajęcia 12 dnia 28 maja

Tutaj w ramach przygotowywania się do egzaminu planuję zrobić niezapowiedzianą kartkówkę z:

  • szablonów
  • konstruktorów, destruktorów, operatorów= (przenoszących i kopiujących),
  • pisania własnych iteratorów
  • za wszystko dobrze przedział ocen: za wszystko dobrze +, za nie do końca dobrze -, za totalnie wszystko źle – -.

Zajęcia 14 lub nawet 15 dnia 4 czerwca

Omówienie projektów, to ostatnie zajęcia, gdyż już mieliśmy 14 ponad


Kolokwium poprawkowe (dla kolokwium I): 30 maja w sali C2-224, w godzinach 11-12:30 (termin wykładu z Latexa)


Kolokwium z całego semestru, dla tych, którym się nie udało odbędzie się w najbliższy piątek, 14 czerwca o godzinie 8:30 w sali C2-429.


Kolokwium poprawkowe ostatniej szansy 2 września 2019 roku o godzinie 8:15 u mnie w pokoju C2-428.