Warunki zaliczenia:
(Iustitia est constans et perpetua voluntas ius suum cuique tribuere, czyli „Sprawiedliwość jest to stała i niezłomna wola oddawania każdemu tego, co mu się należy„)
- Do 2 nieusprawiedliwionych nieobecności
- 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).
- Średnia ocena z kolokwium stanowi bazową ocenę końcową, którą modyfikuje praca na zajęciach.
- Jeśli ktoś nie zda któregokolwiek z dwóch kolokwium to pod koniec kolokwium poprawkowe ze wszystkiego
- 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.
- 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.
- 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:
- Zadania:
- 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 - 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 - 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 - Proszę o napisanie klasy jw., ale z metodami:
Array* clone(); – wykonuje głęboką kopię naszego obiektu przy pomocy dynamicznej allokacji - 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 - Proszę o napisanie klasy jw., ale z metodami:
… toText(); – zamienia nasz obiekt na tekst
void print(); – wypisuje nasz obiekt na ekran - 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 - *Proszę o napisanie klasy jw., ale z metodami (operatory strumienia):
friend std::ostream& operator<>(std::istream& os, Array& array);
- Proszę napisać klasę Array, która będzie przechowywała liczby, pamiętając ile ich przechowuje, proszę też o napisanie metod:
- 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
- Zadania domowe:
- 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:- funkcja dodająca Item do naszego Equipment
- funkcja wyświetlająca istniejące elementy z numeracją i zadanym wcięciem
- funkcja zapisująca Itemy do pliku
- funkcja wczytująca Itemy z pliku
- funkcja zwracająca sumę wartości statystyk dla określonej wartości bonusType np. dla ataku
- funkcja wyświetlająca elementy tylko dla określonej wartości bonusType
- funkcja łącząca dwa obiekty Equipment
- *funkcja sortująca Itemy wg bonusType, potem wg wartości, potem dopiero wg nazwy
- 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)
- 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
- Na następny raz do uzupełnienia (odkryto braki na zajęciach):
- Proszę o napisanie struktury Item, która będzie zawierała:
- Zadania:
Zajęcia 3 dnia 12 III:
- 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:- operator+(const char* text)
operator+(const String& text) - operator==(const char* text)
operator==(const String& text) - operator<(const String& text) operator>(const String& text)
- operator[](size_t index); – wersja zwykła i constowa
operator() zwracający rozmiar
operator(const char* text) zwracający pozycję tekstu text - operator konwersji do boola lub size_t
jawny operator konwersji do std::string - operatory strumienia:
std::ostream& <<() std::istream&>>() - 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 - *operator<<(double), który dopiszę daną liczbę na koniec tekstu
operator<<(int)
- operator+(const char* text)
- Na następny raz do przeczytania:
- dziedziczenie -wszystko co Państwo znajdą o dziedziczeniu (bez dziedziczenia virtualnego, chociaż warto wiedzieć że coś takiego jest).
- umieć użyć std::vector (podstawy użycia)
- poczytać co to jest std::string
- zapoznać się z materiałami na UPELu rozumiejąc co się dzieje w kodzie i dlaczego
Zajęcia 4, 19 III:
- Na następny raz do przeczytania:
- std::list: jak dodawać elementy, jak je przeglądać (wystarczy for-ranged loop), na czy polega lista jako struktura danych
- polimorfizm (dynamiczny) w C++ – jak tego użyć, na czym to polega
- rzutowanie w C++ w hierarchii dziedziczenia w dół i w górę (ogólnie)
- 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:- StringObject, która będzie zawierała implementacje metod klasy bazowej, może też zawierać swoje metody
- 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
- DoubleObject, jw., ale dla obiektów typu double
- Proszę o napisanie funkcji, które będą przyjmować listę obiektów Object:
save2File(const std::list<Object*> objects). - Jak w 4. ale taką funkcję, która skopiuje wszystkie obiekty typu DoubleObject do innej listy.
- Jak w 4. ale taką funkcję, która zwróci std::vector ze wszystkimi wartościami z listy, które są typu IntObject.
- Jak w 4. ale taką funkcję, która zwróci std::string będący sumą tekstów z całej listy
- *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:
- Do doczytania na następny raz:
- Dziedziczenie wielo-bazowe, problem diamentu, dziedziczenie wirtualne.
- Semantyka przenoszenia (konstruktory przenoszące i przenoszący operator przypisania).
- Wiedzieć na czym polega lista jako struktura danych, aby umieć ją zaimplementować.
- Poczytać na temat śledzenia przebiegu programu (debugowanie).
- 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):
- Metoda push_back() i operator+=(), która dorzuca element na koniec.
- Metoda pop_back() i operator–(), która usuwa element z końca.
- Metodę at() i operator[] , która zwraca element o danym indeksie.
- Metoda size() i operator konwersji do size_t zwracający ilość elementów listy.
- to co grupa 4.
- to co grupa 3.
- to co grupa 2.
- to co grupa 1
- Dla chętnych alternatywna treść szczegółowa
Zajęcia 6, dnia 2 IV:
- Na następny raz do doczytania:
- przejrzenie załączonego kodu (i zrozumienie)
- przejrzenie tego co robiliśmy do tej pory
- przejrzenie tego co do tej pory trzeba było się nauczyć (jak ktoś coś pominął najwyższy czas)
- wyjątki (podstawy)
- wczesne i późne wiązanie
- umieć w podstawach użyć słownik (std::map) wraz z podstawowymi operacjami – dodać, sprawdzić czy jest, przejrzenie wszystkich elementów
debugowanie– innym razem
- Proszę w oparciu o nasz kod z ostatnich zajęć:
- 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); - 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*)); - 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); - 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:
- 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.
- 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) - 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; - 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.
- * Proszę o napisanie do naszej listy którejś z poniższych metod:
- sortowania
- usuwania duplikatów (przy posortowanej liście)
- łączenia dwóch list posortowanych z zachowaniem porządku posortowanego
- Napisać funkcję, która przy użyciu wyrażeń regularnych sprawdzi, czy podany Obiekt jest StringObject i zawiera poprawny mail:
Zajęcia 7 i 8 dnia 9 i 16 kwietnia:
- Do obeznania się na następny raz:
- to czego nie dokończyliśmy ostatnio
debbugowanie – kiedyś tam będzie- klasy zagnieżdżone
- iteratory (implementacja własnych, użycie do wyświetlania zawartości kontenera)
- std::set i std::string
- umieć użyć printf do podstawowych typów
- Zadania dla wszystkich: Proszę do naszej List utworzyć klasę zagnieżdżoną iterator, która będzie pamiętać aktualną pozycję w liście
- proszę do niego zdefiniować metody:
- operator* pobierający aktualny element (zupełnie jak przy wstkaźnikach). Jeśli iterator nie wskazuje na żaden element proszę wyrzucić wyjątek
- operator++, który przesunie iterator na następny element w liście
- operator!=(iterator it), który sprawdzi, czy iteratory nie wskazują na ten sam element
- proszę też o zdefiniowanie metod w naszym List:
- begin, która zwróci iterator wskazujący na pierwszy element
- 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ć)
- Proszę o dostosowanie naszych Object, aby można było używać ich w kontenerze std::set.
- Proszę o zrobienie iteratora, który by czytał plik linijka w linijkę i wyświetlał na ekranie.
- to co grupa 4
- to co grupa 3
- to co grupa 2
- *skopiować pliki przy pomocy iteratorów
- *wyświetlić std::vector w jednej linijce przy pomocy std::copy i ostream_iterator
- proszę do niego zdefiniować metody:
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:
- Na te zajęcia prosze doczytać:
- Szablony klas, funkcji, funkcji składowych
- 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:-
- konstruktory – domyślny (nic nie robiący), kopiujący, przenoszący, destruktor
- 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]);
- 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 - metoda at(size_t index), która w razie wyjścia poza zakres wyrzuci wyjątek
metoda size() zwracająca rozmiar - 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 {..}
- Prosze o zaimplementowanie mechanizmu do iteracji, aby działało:
for (auto a : ourVector) cout << a << endl; - Proszę o zaimplementowanie metody:
template<typename Predicate> size_t count_if(Predicate predicate);
wraz z przykładowym predykatem (własnym, lub standardowym, bez lambd)
- *Zadania dla pro (ekspert mode):
- konstruktor, aby działało Vector v = {3, 4, 1, 56};
- 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:
- Proszę przeczytać o tym jak rozpoznawać typy w C++, o sposobach rzutowania.
- Zadania dla wszystkich grup (wszystko poniższe obowiązuje wszystkich):
- 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.
- 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.