Bodování
Zápočet:
Cvičení 9 bodovaných cvičení, každé za 4 body, hodnocena bude účast od začátku do konce a aktivita při plnění úkolů. Celkem 36 bodů.
Projekt - demonstrace získaných znalostí. (9 bodů)
Cvičení 9 bodovaných cvičení, každé za 4 body, hodnocena bude účast od začátku do konce a aktivita při plnění úkolů. Celkem 36 bodů.
Projekt - demonstrace získaných znalostí. (9 bodů)
Demonstrační projekt
- Projekt musí splňovat následující body:
- Bude obsahovat alespoň 6 rozdílných tříd. Třídy budou obsahovat vlastní atributy, konstruktory a destruktor této třídy.
- Alespoň jednou bude v projektu implementováno dynamické pole (buď dynamicky zvětšovat klasické pole, nebo použít datové struktury vector, list, ...) objektů jiné vaší třídy.
- Alespoň u jedné třídy bude vytvořen přetížený konstruktor.
- V projektu bude existovat dědičná struktura.
- V projektu bude deklarována alespoň jedna čistě abstraktní třída a její metody budou implementovat alespoň dvě jiné třídy.
- V hlavní části bude vytvoření a použití několika instancí a volání metod.
- Všechny třídy budou implementovány ve svém vlastním souboru.
- U každé třídy je vhodné také do poznámky v kódu krátce popsat, co třída reprezentuje.
- Nástřel témat:
- Zoo - Projekt může obsahovat výběhy, ošetřovatele, zvířata. Dědičnost může být implementována nad třídami zvířat nebo můžete přidat třídu návštěvník, která by měla společného předka s ošetřovatelem.
- Malá sociální síť - Uživatelé sociální sítě mohou mezi sebou navázat propojení, vytvářet komentáře a články. S dědičností je to tady horší, ale komentář i článek na zdi mají společné atributy - čas, autor, počet liků. Pojmenování může být např příspěvek. Dále by šlo přidat různé typy uživatelů (user, admin) s nějakým společným předkem.
- UI aplikace - Třídy, které budou simulovat dědičnou strukturu UI elementů. Od nejmenšího čistě abstraktního prvku renderable, přes label, button a další.
- Nebo jakékoli vlastní téma.
- Termín odevzdání: bude doplněn.
Cvičení
7.2. Opakování - C vs. C++
- Vytvořte dvě pole typu double, které budou reprezentovat N-rozměrný vektor.
- Napište funkci, která vektor naplní náhodnými hodnotami v rozmezí daném vstupními hodnotami. Funkce rand. Použijte předdefinovanou konstantu RAND_MAX
- Napište funkci, která obdrží na vstupu pole typu double a vypíše jeho prvky.
- Napište funkci, která vrátí součet prvků v poli.
- Napište funkci, která sečte dva vektory po složkách a vrátí tento součet jako nové pole. Např. [1,2,3] + [1,5,10] = [1+1,2+5,3+10] = [2,7,13]
- Vytvořte libovolný textový řetězec, jako pole typu char.
- Napište funkci find, která bude mít na vstupu dvě pole typu char, první pole bude reprezentovat prohledávaný řetězec a druhé pole bude reprezentovat hledaný řetězec. Funkce vrátí počáteční pozici druhého řetězce v prvním řetězci (pouze první výskyt), pokud se druhý řetězec nebude vyskytovat, pak vrátíte předdefinovanou zápornou konstantu STRING_NOT_FOUND = -1.
- Napište funkci substring, která vrátí podřetězec vstupního textového řetězce od pozice a do pozice b, tyto pozice budou na vstupu funkce.
- Napište funkci compare, která porovná dva řetězce typu char a vrátí true pokud jsou stejné a false pokud ne.
- Napište funkci prefix, která vrátí prvních K symbolů řetězce.
- Napište funkci suffix, která vrátí posledních K symbolů řetězce.
- Napište funkci insert, která má na vstupu dvě pole typu char a pozici typu int, funkce vrátí nové pole typu char, kde druhé pole bude vloženo do prvního řetězce na danou pozici.
- Napište funkci remove, která v poli typu char odstraní K znaků z pozice P a vrátí nové pole znaků.
- Napište funkci replace, která má na vstupu dvě pole typu char a pozici typu int, funkce vrátí nové pole typu char, kde druhé pole nahradí symboly z prvního řetězce od dané pozice.
- Vytvořte strukturu MyString, struktura bude obsahovat pole znaků a délku řetězce, pojmenujte proměnné a přiřaďte jim správné datové typy.
- [Pro pokročilé] - vložte do struktury ukazatel na funkci length.
- [Pro pokročilé] - vytvořte funkci length, která bude mít na vstupu strukturu MyStr.
- [Pro pokročilé] - vytvořte funkci CreateMyString, která bude mít na vstupu pole znaků. Ve funkci vytvořte ukazatel na strukturu MyString a nastavte hodnoty struktury, tedy pole znaků, jeho délku a ukazatel na funkci length.
- [Pro pokročilé] - ve funkci main vytvořte ukazatel na strukturu MyString pomocí zavolání funkce CreateMystring a na struktuře zavolejte funkci length.
14.2. Třída I (4 body)
- Konstruktor a Destruktor
- Stáhněte si následující kód: Kody.
- Pomocí krokování programu, zjistěte, kdy se zavolá destruktor objektu.
- Ve všech úkolech oddělte deklarace třídy do hlavičkového souboru .h a definice mějte v souboru .cpp. Pro každou třídu tak mějte jeden .h soubor a jeden .cpp soubor.
- Třída Obdelník (0.5 bodu)
- Implementujte třídu Obdelnik.
- V konstruktoru předejte dva parametry, délky hran. Hodnoty uložte do privátních proměnných.
- Vytvořte metodu Obsah, která spočítá a vrátí obsah obdelníku.
- Vytvořte metodu Show, která vypíše délky hran obdelníka.
- Vytvořte metodu IsSquare, která vrátí true, pokud je obdelník čtvercem, jinak false.
- Metody otestujte.
- Třída Soubor (0.5 bodu)
- Implementujte třídu Soubor.
- Soubor je popsán svým názvem(string) a velikostí(unsigned int).
- Napište metodu Show, která vypíše jméno souboru a jeho velikost na jeden řádek.
- Napište metodu Rename, která změní název souboru na název předaný argumentem funkce.
- Napište metodu IsImage, která vrátí true, pokud název souboru končí .png nebo .jpg , jinak false.
- Metody otestujte.
- Třída Kostka (0.5 bodu)
- Implementujte třídu Kostka. Tato třída bude reprezentovat hrací kostku.
- Kostka je dána počtem stěn.
- Napište metodu Hod, která vrátí náhodné číslo v intervalu od 1 do počtu stěn.
- Vytvořte objekt typu Kostka a v cyklu několikrát zavolejte funkci Hod, výsledek hodu vypište na nový řádek.
- Třída Figurka (0.5 bodu)
- Vytvořte třídu Figurka.
- Figurka se v nějaké hře vyskytuje na pozici dané nezáporným celým číslem.
- Napište metodu Posun, která posune figurku o hodnotu danou argumentem metody
- Napište metodu Pozice, která vrátí aktuální pozici figurky.
- Pomocí objektu typu Kostka provádějte v cyklu posun objektu typu Figurka, dokud nedosáhne figurka nějaké předdefinované pozice, kterou si sami vytvoříte.
- Implementujte třídu KeyValue dle přednášky a vytvořte zřetězenou lineární strukturu mnoha (např. tisíce) objektů a pracujte s ní (vypište např. všechny klíče od prvního do posledního objektu). (1 bod)
21.2. Třída II (4 body)
- Navrhněte, deklarujte a definujte jednoduché třídy a napište kód, který pracuje s objekty této třídy:
- E-mail (0.5 bodu)
- Osoba (0.5 bodu)
- Vytvořte podobnou třídu jako KeyValue, ale s hodnotou i klíčem typu (třídy) string a se dvěma sousedícími (next) objekty. Výsledkem bude tzv. strom.(1 bod)
- Implementuje strukturu (rozhodovací strom) na identifikaci zvířat nebo rostlin. Klíčem uzlu stromu je rozhodovací kritérium, hodnotou uzlu je název zvířete nebo rostliny, resp. druhu apod. Naplňte klíč alespoň deseti objekty a vypište celou strukturu na obrazovku.(1 bod)
28.2. Třída III (4 body)
- Ve všech úkolech oddělte deklarace třídy do hlavičkového souboru .h a definice mějte v souboru .cpp
- Třída Datum (0.5 bodu)
- Implementujte třídu Date
- V třídě si budete uchovávat den, měsíc a rok. Navrhněte konstruktor třídy.
- Napište funkce setDay, setMonth, setYear.
- Napište funkce getDay, getMonth, getYear.
- Z přednášky - Třída a objekty
- Dle přednášky č.2: Implementujte příklad z přednášky a do třídy KeyValues přidejte metodu KeyValue* RemoveObject(int k), která odebere objekt s daným klíčem a vrátí ukazatel na něj. (1 bod)
- Dle přednášky č.2: Faktura. Implementujte třídu Faktura, která bude obsahovat číslo, objekt třídy Osoba (se jménem a adresou) a pole objektů PolozkaFaktury (s názvem a cenou). Navrhněte konstruktor a destruktor a další potřebné metody. Faktura bude mít metodu (funkci), která spočítá a vrátí celkovou cenu. (1.5 bodu)
7.3. - Třída IV
- Konstruktory a Destruktory, Předávání objektů do funkcí.
- Prostudujte si následující zdrojový kód: Odkaz
- Zjistěte kdy se volá normální konstruktor a kdy copy konstruktor.
- Opravte zdrojový kód, tak aby došlo ke správnému smazání pole hodnoty.
- Knihovna
- Implementujte třídu Knihovna, která bude obsahovat pole knih(nebo seznam, či jinou strukturu) objektů třídy Kniha. Dále navrhněte a naimplementujte třídu Uzivatel.
- Navrhněte metody třídy Knihovna, tak aby uzivatel mohl provést operace vypůjčení knihy a vrácení knihy.
- Napište metodu, která vypíše všechny uživatele, kteří mají vypůjčenu nějakou knihu.
14.3. - Návrh programu I (4 body)
- Banka
- Implementujte příklad z přednášky a navrhněte kód, který bude používat všechny třídy. (1.5 bodu)
- Vytvořte desítky klientů a účtů v bance a nasimulujte některé běžné úkony prováděné v bance. (0.5 bodu)
- Napište metodu totalDeposit, která vrátí součet všech prostředků na účtech. (0.5 bodu)
- Napište metodu printAccounts, která vypíše vlastníky všech účtů a jejich bilanci. (0.5 bodu)
21.3. - Návrh programu
- Navrhněte a implementujte podobnou úlohu jako na minulém cvičení, jako například lékařskou ordinaci, malou školu, pneuservis apod.
- Návrh by měl obsahovat zadání - textový popis zkoumaného problému, toto zadání by mělo být převedeno na třídy, jejich vlastnosti a metody.
- Bonusová úloha - Burza kryptoměn
- V této úloze byste měli navrhnout třídy pro reprezentaci informací z burzy kryptoměn.
- Budete potřebovat vytvořit třídu Burza, která se připojí k API burzy a stáhne si základní informace jako např. aktuální knihu příkazů, historii obchodů či seznam obchodních párů (např. BTC_CZK) Obrázek rozhraní.
- Protože v C++, nemáme implicitně nástroje pro dotazování na weřejná webová api, budete si muset stáhnout a nainstalovat knihovnu curl (v tomto budou ve výhodě uživatele Linuxu, kteří curl nejspíše již nainstalován mají). Nastavení pro Visual Studio
- Příklad volání API pomocí curl: curl příklad
- Coinmate API
- V řešení byste měli vytvořit následující třídy:
- StockExchange - zodpovědná za dotazování na webové API. Ke každému volání API by měla být vlastní metoda (tradePairs, orderBook, tradesHistory). Zároveň by výsledky těchto metod měly být ve třídě uloženy ve formě vhodných vhodných objektů či struktur.
- OrderBook - třída zodpovědná za uchování informace o aktuálním stavu knihy příkazů a poskytování těchto informací klientům třídy.
- TradeAlgorithm - třída, která používá objekt StockExchange pro získání informací, na základě kterých pak provádí konkrétní obchodování (např. pokud je cena nižší než X, pak nekup Y dané měny).
28.3. - Statická data a metody (4 body)
- Z přednášky
- Implementujte příklady z přednášky a doplňte do tříd Client a Account počítání existujících objektů.(0.5 bodu)
- Navrhněte a implementujte stejnou úrokovou sazbu pro všechny účty, kterým nebyla sazba zadána v konstruktoru a kterou lze prostřednictvím metody třídy změnit. (1 bod)
- Další úkoly
- V databázových systémech se pracuje s objektem databáze, která umožňuje uživateli dotázat se na hodnotu v tabulkách. Na databázi samotnou můžeme nahlížet, jako na soubor na disku, například se záznamy o studentech, kde každý řádek souboru obsahuje informaci o jednom studentovi. Pokud byste vyvíjeli webovou aplikaci, která by používala databázi, pak byste chtěli, aby takový databázový objekt existoval pouze jeden, protože jinak by vám mohlo více databázových objektů soutěžit o přístup k jednomu souboru na disku. Takovému přístupu se říká návrhový vzor Singleton, více viz. Wikipedia - Singleton
Naimplementujte třídu Databaze. V ní si vytvořte statickou proměnnou Databaze* instance. Dále vytvořte statickou metodu GetInstance, která bude vracet statickou proměnnou instance (v případě, že statická proměnná instance ještě nebyla vytvořena, pak ji vytvořte).(0.5 bodu)
- Použijte třídu Datum ze cvičení Třída II: Naimplementujte metodu instance toString, která převede datum na textový řetězec a vrátí jej, např. 28.3.2022. Naimplementujte statickou metodu fromString, která bude mít na vstupu datum zadané datovým typem string, např. "28.3.2022". Pokud je zadané datum v pořádku, pak vrátí nový objekt typu Datum, jinak vrátí NULL.(1 bod)
- V databázových systémech se pracuje s objektem databáze, která umožňuje uživateli dotázat se na hodnotu v tabulkách. Na databázi samotnou můžeme nahlížet, jako na soubor na disku, například se záznamy o studentech, kde každý řádek souboru obsahuje informaci o jednom studentovi. Pokud byste vyvíjeli webovou aplikaci, která by používala databázi, pak byste chtěli, aby takový databázový objekt existoval pouze jeden, protože jinak by vám mohlo více databázových objektů soutěžit o přístup k jednomu souboru na disku. Takovému přístupu se říká návrhový vzor Singleton, více viz. Wikipedia - Singleton
Naimplementujte třídu Databaze. V ní si vytvořte statickou proměnnou Databaze* instance. Dále vytvořte statickou metodu GetInstance, která bude vracet statickou proměnnou instance (v případě, že statická proměnná instance ještě nebyla vytvořena, pak ji vytvořte).(0.5 bodu)
- (Volitelné) API burza
- Zpracujte JSON soubor obsahující data pro OrderBook. Vytvořte třídu JSON a načtěte strukturu souboru, tak abyste ve výsledku měli přístup ke dvěma polím, jedno pro asks a jedno pro bids.
4.4. - Dědičnost I - základy a rozšiřování vlastností tříd
- Z přednášky
- Implementujte příklad z přednášky a vytvořte banku s mnoha klienty a účty. Zaměřte se na pochopení principu zastupitelnosti a na to, jak fungují konstruktory v dědičnosti. (0.5 bodu)
- Navrhněte a implementujte příklady s dědičností rozšířením společného stavu a chování:
- Auto, Osobni auto, Nákladní auto, Auto s řidičem - dávejte si pozor, aby Vaše rozšíření bázové třídy ve skutečnosti nebyl objekt v jiném stavu (např. pokud má auto vlastnost počet kol, pak auto se čtyřmi koly nebo šesti koly je jenom jiný stav třídy Auto) (1.5 bodu).
- Další úkoly
- Vytvořte třídu Osoba, která má základní vlastnosti, jako jméno, email, apod. a naimplementujte alespoň jeden z následujích příkladů. (1 bod)
- Vytvořte třídu Učitel, která dědí vlastnosti třídy Osoba, navíc má vlastnost předměty, které vyučuje, doplňte vlastnosti a metody, které umožní přidávat a odebírat vyučované předměty.
- Vytvořte třídu Student, která dědí vlastnosti třídy Osoba, navíc má vlastnost předměty, které studuje a známky z předmětů. Napište metody, které umožní přidat předměty a známky.
- Vytvořte třídu Programátor, která dědí vlastnosti třídy Osoba, navíc má vlastnost programovací jazyky, kterými umí psát, každý jazyk umí používat na určité úrovni(základní, střední, pokročila, expertní). Napište metody, které umožní přidat znalost programovacího jazyka a upravit jeho znalostní úroveň.
- Vytvořte třídu Osoba, která má základní vlastnosti, jako jméno, email, apod. a naimplementujte alespoň jeden z následujích příkladů. (1 bod)
- (Volitelné) API burza
- Vytvořte rodičovskou třídu Exchange a dvě třídy Coinmate a Kraken.
- Do rodičovské třídy Exchange implementujte funkcionalitu potřebnou pro vyžadání dotazů.
- Implementujte do třídy Kraken metody tradePairs, orderBook, tradesHistory, které zašlou požadavky na aktuální data. Použijte k tomu připravené metody rodičovské třídy Exchange. Dokumentace Kraken
11.4. - Dědičnost II - Změna chování
- Implementujte příklady z přednášky. Zaměřte se na překrytí, vyzkoušejte použití „protected“.
- Navrhněte a implementuje jednoduchou dědičnou hierarchii geometrických objektů, které budou mít společné metody „Obsah“ a „Obvod“. Využijte překrytí a rozeberte chování při využití substitučního principu. (1 bod)
- Formuláře (2 body)
- Formulářové prvky jako textová políčka, výčtové nabídky, vícenásobné výčtové nabídky jsou jednou typickou aplikací dědičnosti. Obvykle máme nějakou základní formulářovou komponentu s metodami jako draw(pro vykreslení komponenty, reakcemi na události např. onClick a další) a tyto její metody modifikujeme v potomcích dané třídy.
- Vytvořte třídu Otázka, tato třída má dvě vlastnosti typu string: textOtázky a odpověd. Vytvořte dvě veřejné metody:
- PolozOtazku - zobrazí text otázky. Použijte např. cout.
- ZiskejOdpoved - zpracuje odpověď. Použijte např. cin.
- Vytvořte třídu VyctovaOtazka, která dědí z třídy Otázka a nabízí uživateli jako odpověď volbu z více předem daných možností, přičemž připouští pouze jednu odpověď:
- Navrhněte několik přetížených konstruktorů, např. (textOtazky, moznost1, moznost2) nebo (textOtazky, poleMoznosti, delkaPoleMoznosti).
- Použijte překrytí k přeformulování výpisu otázky v metodě PolozOtazku, tak aby se k textu otazky vypsaly možné odpovědi.
- Použijte překrytí k přeformulování metody ZiskejOdpoved, tak aby jste zajistili, ze uživatel vybral právě jednu z možností, pokud by neodpověděl jednou z možností (např. a nebo 1), informujte jej a položte otázku znovu.
- Navrhněte a naimplementujte třídu CiselnaOtazka, odpovědí na tuto otázku je nezáporné celé číslo. Např. Jaký je Váš věk?
- Ke všem výše uvedeným třídám doplňte metodu Souhrn, ve které vypíšete otázku i odpověd uživatele.
- Všechny třídy otestujte.
- Nepoužívejte polymorfismus (klíčové slovo virtual), ten bude použit až příště!!!
- Vytvořte třídu Otázka, tato třída má dvě vlastnosti typu string: textOtázky a odpověd. Vytvořte dvě veřejné metody:
- Formulářové prvky jako textová políčka, výčtové nabídky, vícenásobné výčtové nabídky jsou jednou typickou aplikací dědičnosti. Obvykle máme nějakou základní formulářovou komponentu s metodami jako draw(pro vykreslení komponenty, reakcemi na události např. onClick a další) a tyto její metody modifikujeme v potomcích dané třídy.
25.4. - Dědičnost III - Polymorfismus (4 body)
- Ukázka polymorfismus: Prostudujte si následující zdrojový kód a zjistěte, jak použití klíčového slova virtual ovlivní volání metod Test a Test2 na objektech typu Predek a Potomek. Zdrojový kód
- Implementuje příklady z přednášky, zaměřte se na využití virtuální metody a pochopení, jak funguje při polymorfním přiřazení.
- Navrhněte a implementujte jednoduchou dědičnou hierarchii geometrických objektů, které budou mít společné virtuální metody „Obsah“ a „Obvod“. Využijte polymorfní datovou strukturu (např. pole ukazatelů).(1.5 bodu)
- Další úkoly
- Formuláře - pokračování z předchozího cvičení. (1.5 bodu)
- Vytvořte pole nebo jinou strukturu pro uložení různých otázek z formuláře, tato struktura bude udržovat objekty typu Otazka, ale naplnit jej můžete pomocí různých potomků této třídy.
- Toto pole naplňte alespoň jedním objektem od každé třídy z minulého cvičení.
- Zajistěte, abyste strukturou prošli v cyklu a ke každé otázce položili otázku a obdrželi odpověď.
- Formuláře - pokračování z předchozího cvičení. (1.5 bodu)
- (Doplňkové) Zvířata
- Vytvořte dědičnou hierarchii zvířat, třída Zvíře a k ní několik potomků.
- Zvíře bude mít virtuální metodu vydejZvuk(Stačí implementovat pomocí výpisu).
- Ve všech potomcích implementujte metodu vydejZvuk, pro konkrétní zvíře.
- (Volitelné) API burza
- Třídě TradeAlgorithm vytvořte virtuální metody handleRequest, handleCleanup.
- Burzy obvykle umožňují pouze omezený počet dotazů za minutu (Coinmate 100), proto když voláme jednotlivé algoritmy musíme hlídat kolik dotazů jsme za poslední minutu provedli.
- Napište dvě třídy, které budou dědit ze třídy TradeAlgorithm a budou implementovat metody handleRequest a handleCleanup.
- Metoda handleRequest je metodou, která si vyžádá aktuální orderBook z Burzy a na jeho základě provede obchodní rozhodnutí (řešte pouze výpisem do řádky), např. pokud je cena větší než X, pak nakup Y, následně potom lze řešit také prodej. (Ukládejte si informace o nakoupených položkách)
- Metoda handleCleanup, například chceme aplikaci ukončit, pak v metodě zrušíme aktuální nákupní příkazy, nebo si aktuální stav serializujeme do souboru.
2.5. - Abstraktní třída
- Z přednášky
- Implementuje příklady z přednášky, zaměřte se na využití abstraktní a čistě abstraktní třídy a na to, jak fungují konstruktory a destruktory.
- Reimplementuje jednoduchou dědičnou hierarchii geometrických objektů tak, aby jste využili abstraktní a čistě abstraktní třídy.(1 bod)
- Další úkoly
- Přeimplementujte formuláře z minulého úkolu, vytvořte čistě abstraktní třídu pro reprezentaci proměnných a metod, které definují společné chování prvků (různých typů otázek). (1 bod)
- Desková hra - v tomto úkolu si otestujete použití abstraktní třídy (1 bod).
- Vytvořte třídu Deskova Hra
- Vytvořte abstraktní třídu AbstractPlayer, hráč má jméno a alespoň jednu virtuální metodu provedTah. Navrhněte parametry této metody vzhledem ke hre, kterou budete vytvářet.
- Z abstraktní třídy AbstractPlayer odvoďte dvě třídy HumanPlayer - reprezentující lidského hráče a AIPlayer - reprezentující počítač. Obě třídy budou implementovat metody třídy AbstractPlayer.
- Do třídy Deskova hra přidejte vlastnost reprezentující hráče hry. Zároveň zajistěte aby se hráči střídali v tazích. Nemusíte implementovat žádnou konkrétní hru, i když, kdo by chtěl může vytvořit např. piškvorky, nebo dámu.