Home page

BPPC home page

výuka home page



BPPC – praktické programování v C++

Náplň cvičení 2018

náplň přednášek najdete zde





!!! Stránky jsou ve vývoji !!!
Cvičení upravené pro Zimní semestr 2018/19: 1-8

Týden 1: 

Úvod

Organizace cvičení - cvičící, laboratoř, bezpečnost, plán cvičení, bodování, páteční cvičení oborného základu

Cvičení

Vstupní test – opakování jazyka C – konzultace výsledků

Cvičení

Základy práce se strukturami

Procvičení

Práce se soubory, zjištění statistiky znaků v souboru

Procvičení

Jednoduchá grafika (načtení dat, grafický výstup, cykly)

Projekt DU

Zjistěte, co je ADT (abstraktní datový typ; základní vlastnosti; např. wikipedia;)



Týden 2

Projekt

Co je ADT? Jaké má základní vlastnosti?

Cvičení

Kontrola dokončení příkladu z minulého cvičení

Cvičení

Procvičení neobjektových vlastností (tisk, new, delete, výjimky)

Procvičení

Vytvořte interpret jazyka Brainfuck

Projekt DU

Jaké jsou základní ADT? Jaké jsou jejich vlastnoti? Jak se jmenují jejich základní funkce/operace? (Fronta/zásobník/množina/asociativní pole/strom... ; List/Stack/Set/Queue/...) Zdroj např. wikipedia z hesla ADT/příklady; zde.


Týden 3

Projekt

Jaké jsou základní ADT? Jaké jsou jejich vlastnoti? Jak se jmenují jejich základní funkce?

Cvičení

Kontrola dokončení příkladu z minulého cvičení

Cvičení

Příklad pro seznámení se s prací pomocí Referencepráce s prvky v paměti, předávání proměnných do funkcí a z funkcí pomocí reference.

Cvičení

Procvičení neobjektových vlastností 2 (reference, přetěžování funkcí, namespace)

Procvičení

Prostudujte a doplňte funkci pro morseovku tak aby byla funkční (převodní tabulka je na konci souboru, nutno rozdělit cpp a h soubory)

Procvičení

Binární strom - morseovka

Projekt DU

Seznamte se s pojmy: lineární (spojový) seznam (jednosměrný/obousměrný/cyklický(kruhový)); (datový struktura) strom. Jak se tvoří struktura seznamu/stromu? Jak se vkládají a vybírají prvky (jednoduchý algoritmus)?


Týden 4

Projekt

Co je lineární seznam? Jaký je jeho základní realizační prvek (struktura pro uzel/node) a jaké má vlastnosti? Jaké má základní modifikace?
Co je (binární) strom?

Cvičení

Kontrola dokončení příkladu z minulého cvičení

Cvičení

Vytvořte template pro třídu TVector

Procvičení

Podobné zadání 2D pole trochu jinak pro procvičení.
Zpracujte 2D pole podle zadání:
2D pole (
ukazatele, práce s dynamickou pamětí, alokace, odalokace)
2D pole úpravy
(namespace, new, struct, výjimky)
Oba programy (projekty) budou ve stejném řešení (solution) v prostředí Visual Studio.

V dalším cvičení bude zadáno rozšíření.

Projekt DU

Co znamená, že je lineární seznam (či ADT) intruzivní nebo neintruzivní? Jak tento princip funguje pro prvky vkládané pomocí hodnoty či ukazatele? Jak funguje pro prvky uchovávané (v seznamu) pomocí ukazatele nebo hodnty? Jak realizovat různé varianty kombinací vkládání a uchování pomocí hodnoty či ukazatele.


Týden 5

Projekt

Co znamená, že je lineární seznam (či ADT) intruzivní nebo neintruzivní? Jak tento princip funguje pro prvky vkládané pomocí hodnoty či ukazatele? Jak funguje pro prvky uchovávané (v seznamu) pomocí ukazatele nebo hodnty? Jak realizovat různé varianty kombinací vkládání a uchování pomocí hodnoty či ukazatele.

Cvičení

Kontrola dokončení příkladu z minulého cvičení

Cvičení

Vytvořte základy třídy CVector

Procvičení

2D pole rozšíření (reference, const, dokončení včetně funkcí „pro pokročilé“)

Projekt DU

lineární seznam

Lineární seznam (fronta, …) se snažte tvořit tak, aby mohl pracovat jak se základními typy (int, double, .., enum...) tak s nově definovanými složenými typy (třídy, struktury).


Týden 6

Projekt

Realizace lineární seznam – řešení problémů

Cvičení

Kontrola dokončení příkladu z minulého cvičení

Cvičení
Projekt

Stručné seznámení s tvorbou projektu. Práce ve skupinách.
Význam volených datových typů pro tvorbu projektu.

Cvičení

Vytvořte základní konstruktory a destruktor pro třídu CVector

Projekt
DU


Projekt DU

Vytvoření tří- nebo čtyřčlenných skupin, které budou na projektu pracovat společně. Zvolit datové typy – jednoduchý, složený. Zvolit typ kontejneru.


Jednoduchý typ: Základní datové typy (mimo bool), (zvolte jednu z možností):
- Jeden z celočíselných typů: např.: (signed / unsigned) char, short int, int, long int
- Jeden z reálných typů: např.: float, double, long double
- Výčtový typ enum např.: měsíce, výčet barev, znak Morseovy abecedy, znamení zvěrokruhu

Složený typ: Vámi realizovaná třída CValue_TYP2 bude zapouzdřovat jeden ze složených datových typů. Složené datové typy (struktury, pole) (mimo TWeekDay - Dny v týdnu), (zvolte jednu z možností):
- Komplexní číslo
- Textový řetězec (dynamický)
- Bod v prostoru (x,y,z)
- Číselný interval <min,max>
- Barevná informace (RGB složky)
- Pole číselných hodnot typu double
- Libovolný další např.: tón, krevní skupina, jméno a příjmení (dva členy),

Kontejner. Realizovaná třída typu kontejner pracující s prvky vybranými výše. Charakter a funkci kontejneru si zvolte:
- Fronta – jeden vstup, jeden výstup, architektura FIFO. Prvky jsou ve frontě v pořadí určeném dobou vstupu. Pořadí prvků na výstupu je shodné s pořadím prvků na vstupu.
- Zásobník – jeden vstup, jeden výstup, architektura LIFO. Prvky jsou ve frontě v pořadí vstupu a při výskytu prvku je pořadí prvků na výstupu opačné o proti pořadí prvků na vstupu.
- Prioritní fronta – jeden vstup, jeden výstup, architektura FIFO. Prvky vstupují do fronty vždy s dodatečnou informací o své prioritě, prvky vystupují z fronty v pořadí určeném prioritou a při stejné prioritě je pořadí prvků na výstupu shodné s pořadím prvků na vstupu.
- Prioritní zásobník – jeden vstup, jeden výstup, architektura LIFO. Prvky vstupují do fronty vždy s dodatečnou informací o své prioritě, prvky vystupují z fronty na základě své priority a při výskytu prvku se stejnou prioritou je pořadí prvků na výstupu opačné o proti pořadí prvků na vstupu.
- Množina – souhrn (kolekce) prvků, neumožňuje indexaci jednotlivých prvků, prvky stejné hodnoty se nemohou v množině opakovat. Mezi definované operace patří tzv. řezy. (tj. vznik nové množiny obsahující všechny prvky původní množiny, které jsou menší (resp. větší) než zadaná hodnota).
- Multimnožina - (totéž co množina, navíc může obsahovat více prvků stejné hodnoty) – tj. hodnoty prvků se mohou opakovat, zajistěte efektivní využití paměti (neduplikujte fyzicky v seznamu prvky stejné hodnoty).
- Asociativní pole – pole prvků typu CValue umožňující indexaci hodnotou typu int. Asociativní pole předpokládá, že indexy jednotlivých vložených prvků nemusí tvořit spojitou řadu (tj. asociativní pole je pole prvků, který nemusí obsahovat všechny indexy v daném rozsahu posloupnosti).
- Mapa - představuje seznam hodnot typu int a umožňuje indexaci těchto prvků pomocí hodnoty typu CValue. Bude obsahovat metody pro vložení a odebrání prvku. Pro jednu konkrétní hodnotu indexu existuje vždy pouze jedna hodnota typu int.
- Multimapa - (totéž co mapa, navíc může obsahovat pro jeden index typu CValue obecně více prvků s různou hodnotou) – tj. pro jednu konkrétní hodnotu indexu může existovat několik hodnot typu int.


Týden 7

Projekt

Volba skupin a názvů tříd pro dané skupiny vypracování projektu. Nahlášení zvoleného tématu projektů a spolupracovníků.

Cvičení

Kontrola dokončení příkladu z minulého cvičení

Cvičení

Nástroj pro dokumentování projektů Doxygen

Procvičení

Projekt 2D pole jako třída a dokumentace – založení třídy a základní komentář v Doxygen

Procvičení

Ukázky tříd komplex a string

Projekt DU

Nainstalujte si Doxygen a Graphviz


Týden 8

Projekt

Základy svn, jména a přístupová hesla. Návod k práci s svn pro pro postupné vypracování a odevzdávání projektů. Adresářová struktura. Význam dodaných projektů. Stávající dokumentace a její úpravy. Stávající kód a jeho úpravy.
Základní činnost/operace s svn. Logy a statistiky svn.

Cvičení

Seznámení se základní třídou projektu CItem a prací s ní. Doporučení pro tvorbu vlastních tříd do projektu včetně testů a komentářů v Doxygen.
Projděte si rozdíly Doxyfile oproti defaultně vygenerovanému. Vygenerujte si pomocí Doxygen dokumentaci a projděte si její zdrojovou i přeloženou formu.
Trasujte projekt CItem a seznamte se se základní strukturou tříd – návaznost kódu v main na definici třídy v jejích zdrojových souborech. Promyslete, jak napíšete své dvě třídy (podle typu vybraného v minulém cvičení).

Procvičení

Pokračování 2D pole jako třída – konstruktory, statické metody a datové členy

Procvičení

Template – předělejte 2D pole na obecný typ pomocí šablon

Projekt DU

1) Nainstalujte si svn. Nastavte si svn. Zkuste se připojit a ověřte funkčnost (checkout, update, změna kódu/textu, commit).
2) Prostudujte si zadání v adresáři CItem a začněte vytvářet dva vlastní CItem včetně dokumentace.
3) Prostudujte si zadání v adresáři Project a upravte ho podle daných pokynů.
4) Rozdělení prací na projektu mezi členy týmu (do zadání napište monogramy, kdo bude danou metodu dělat). Pokud je to možné, každý z týmu by měl dělat část (=metodu) z daného bodu zadání.
5) Každý z týmu by měl mít v týdnu před odevzdáním alespoň tři komity (u dalších pokračování projektu cca jeden komit na metodu).


Týden 9

Projekt

Konzultace projektu – při problémech uložte aktuální verzi do svn. Poznačte si číslo revize. Do komentáře komitu co nejlépe popište problém. Napište mail cvičícímu se subjektem „konzultace v svn cislo_revize“ a názvem skupiny. To je: „konzultace v svn 145 ut11_fronta1“ bez dalšího textu. Pokusíme se podívat a dáme vám vědět.

Konzultace na cvičeních jen nejnutnější dotazy – hlavní náplní je sekce „Cvičení“.

Cvičení

Doplnění konstruktorů o počítání vzniklých a aktuálně existujících prvků pomocí statických proměnných. Tisk těchto hodnot před, uprostřed a na konci programu.

TDD – unit testy na počítání objektů.

Procvičení

Operátory pro třídu CVector (unární + (nejjednodušší, vrací referenci), unární – (liší se od + vracením hodnoty); operátor = (vrací *this, kontrola varianty a=a), operátor == (vrací bool) , konverzní operátor int (vrací počet prvků), friend operátor * pro double * CVector (friend funkce), ...)

Procvičení

Pokračování 2D pole jako třída - operátory

Projekt DU

Přečtěte si loňské připomínky k odevzdání zadání a snažte se uvedených nedostatků vyvarovat.
Dokončete vaše dvě verze třídy CItem (včetně dokumentace) v projektu CItem a zkopírujte je do projektu Project (udržujte v obou projektech stejné verze kódu).
Napište zadání v Project („modrá verze“ dokumentace).



Týden 10

Projekt

PRJ poslední konzultace CItem (2x) a zadání Project – odevzdání

Cvičení

Operátory

Cvičení


Projekt

Tvorba hlavičkového souboru ke kontejneru v adresáři Project – odevzdání týden 12. Psát společně hlavičky metod, volání (bez kontroly činnosti) v main a dokumentovat. Main demonstruje činnost všech metod kontejneru. Musí splňovat podmínky původního zadání (počty a typ metod/funkcí).
Tvorba hlavičky.
Každý autor navrhne a napíše jeden test (zatím jednoduchý s jedním assertem, ostatní testy a jejich funkčnost (zatím nejsou těla metod) až v konečném projektu).



Týden 11

Přednášky

Pozvánka na poslední přednášku:
- Použití C++ v praxi
- konzultace ke zkoušce - rozbor typových příkladů

Projekt

CItem a zadání projektu Projekt - hodnocení a rozbor nejčastějších chyb. Jak opravit výtky opravujících.
Spojení (merge) aktuální verze (trunk) s opravenou (branch)
Zapracování opravených souborů do projektu - (Před začátkem spojování Update.). Opravené a vaše soubory je možné „spojit“ pomocí (pravé tlačítko myši) tortoiseSVN/Merge na adresáři kam budeme spojovat (trunk), dále volba merge a range of revisions („vedlejší“ větev se vrací do původní), nastavit URL adresu (svn:\\savanna ....\tags\opravena_hlavicka) s opraveným projektem v adresáři \tags (Kontrola správnosti volby: Podadresáře v obou zvolených adresářích by mělý být stejné). Volba Specific Range (s prázdným obsahem) zajistí spojení všech revizí, které ještě nebyly připojeny. Pomocí Test merge je možné překontrolovat zda nedojde ke kolizi (spojení „nanečisto“, kdy se výsledek nezapíše). Následně se spojí „naostro“ pomocí volby merge a vyřeší se případné konflikty (změny na jednom řádku). Je-li výsledek v pořádku, zapíšeme ho pomocí Commit do SVN.

Cvičení

Vstupy a výstupy, prostory jmen - implementujte vstupy a výstupy pomocí streamů (na konzolu i do souboru).
Na základě předchozího příkladu dopište operátory vstupu a výstupu do třídy CVector (řetězec předpokládejte ve stejném formátu jako je v konstruktoru z řetězce).

Procvičení

Vytvořte třídu CMatice, která zdědí základní vlastnosti ze třídy pro obecné 2D pole.
Pro třídu CMatice vytvořte samostatné h a cpp soubory.
Vyzkoušejte v main, že lze použít jak třídu CMatice (včetně použití jejích metod) i třídu pro 2D pole.
Vyzkoušejte různé způsoby dědění (private, protected, public) a zvolte ten nejvhodnější. Všimněte si rozdílu při přístupu (pro různé typy dědění) k metodám základní třídy 2D pole při jejich použití pro objekty CMatice ve funkci main.
Pokud ve třídě pro 2D pole existují metody, které jsou vhodnější pro matici, potom je přesuňte.
Doplňte třídu CMatice o metody pro sčítání matic a násobení matice konstantou (zleva i zprava).
Napište funkci (operator<<) pro tisk matice.

Projekt

Práce na hlavičkovém souboru projektu. Vytvořte hlavičky metod a funkcí podle zadání projektu. Těla mohou být prázdná (hodnocení kódu a testů je až součástí konečného odevzdání), ale musí již vracet správný datový typ (hodnota, reference, return Value; …). Projekt bude řádně dokumentován (viz. dokumentace u CItem).
V main bude ukázáno volání/použití každé funkce/metody.
Každý autor navrhne a napíše jeden test (celý scénář AAA s minimálně třemi asserty; zatím bez „green“; jeho doplnění, ostatní testy a jejich funkčnost (zatím nejsou těla metod) až v konečném projektu).



Týden 12

Projekt

Poslední konzultace hlavičkového souboru a main v Projekt - odevzdání

Cvičení

Dědění. Volání konstruktorů a destruktorů, virtuální metody - příklad

Cvičení

zabalený“ ukazatelvytvořte třídu (šablony) vhodnou pro práci s dynamickými proměnnými (ukazateli, inicializace, použití ...) tak aby se zlepšila práce s ukazateli při vyvolání výjimek

Projekt

Zadání tvorby kódu, testů a finalizace projektu (dokumentace, zdroje, testy, main).



Týden 13


Projekt

Hodnocení a rozbor nejčastější chyby v hlavičkovém souboru a main v Project. Jak opravit výtky opravujících.
Spojení (merge) aktuální verze (trunk) s opravenou (branch)
Konzultace projektu.

Cvičení

Dokončení příkladů z minulých cvičení

Cvičení

konzultace C++

Projekt

Finalizace tvorby kódu, testů a projektu (dokumentace, zdroje, testy, main).

Opravení minulých bugů (přeměna na bugfix).

Změny oproti již odevzdaným částem (např. v zadání) jsou povoleny.

Stránka Dokumentace - popis změn oproti původnímu zadání; popis třídy (filozofie návrhu; volba datových členů; rozviňte popis ze zadání podle skutečné realizace);známé nedostatky; Závěr: možné vylepšení; důvod ponechaných nedostatků (rozsah několik delších vět).

Komentáře pro doxygen dokumentaci: souborů; namespace ; třídy; funkcí; metod; proměnných

Přítomné metody musí množstvím a typem odpovídat původnímu zadání. U parametrů metod preferujte reference a const (včetně this). Operátory by měly respektovat vlastnosti standardních typů (ne/měnit prvky, když to ne/dělají standardní operátory ...)

Tři testovací metody na autora. Testovány budou významné metody kontejneru. Každá testovací metoda bude obsahovat alespoň tři Asserty (významově různé). Minimálně dva z těchto Assertů musí pracovat s neprázdným objektem kontejneru. Jeden z testů každého autora bude pracovat s pamětí (tj. bude kontrolovat metodu kontejneru pracující s pamětí pomocí metod knihovny check). Na kvalitu a rozsah testů se podívejte v testech u Citem. Testy musí fungovat pro všechny čtyři Citemy.

V main volejte všechny (public) metody. Musí fungovat pro všechny CItemy. V hlavičce kontejneru nadefinujte pro každý CItem namespace a v něm dvě metody TestStringKontejner0 a TestStringKontejer1 pro získání vzorových testovacích řetězcú pro kontejner s daným Citem - řetězce budou obsahovat 3-5 prvků.Pomocí těchto metod se v mainu inicializují dvě proměnné typu kontejner - s jejich pomocí demonstrujte činnost metod/operátorů. (např. vytiskněte vstupní proměnné, název operace a výsledek) Main nebude vyžadovat vstup z klávesnice - vstupní stream demonstrujte pomocí istrsream.

U kódu těl se hodnotí celková kvalita realizace. Metoda musí pracovat a správně reagovat i na vstupní proměnnou, která nemá platná data („prázdná“, neinicializovaná proměnná).

Tento seznam se bude upřesňovat na základě dotazů.














Projekt
starý


Formulace zadání
Odevzdání zadání
Odevzdání hlavičky
tvorba zdrojové části, konzultace,
Obhajoba projektů
Bližší informace k odevzdání u cvičícího na disku R. Další aktualizace k odevzdání se budou objevovat na základě dotazů.
Odevzdání dokumentace. Odevzdání prj – zdroje. Odevzdává se společně ve zdrojových textech s dokumentací generovanou pomocí Doxygen


Dědění
staré

dědění seznamte se s děděním.
Připravte rozšíření tříd na dědění a využití virtuálních metod (vlastnosti bázové třídy), přepište
ze základní třídy vytvořte
děděním matici pro znaky (libovolný text, piškvorky ...). V základní třídě vytvořte virtuální metodu tisk a předveďte, že když použijete společně třídy matice (reálná čísla) a matici se znaky, je možné pomocí metody tisk tisknout obě, aniž bychom znali typ matice.
Virtuální metody


Cvičení

Vytvoření třídy

 



Další náměty pro procvičování:

 

 Rozdělení třídy elementu na bázovou třídu a třídu zděděnou/specializovanou (vytvořit alespoň dvě různé). Pro specializaci využít virtuální funkce. Předvést společnou práci obou (různých) odvozených tříd.



Zjistěte, zda by při tvorbě projektu nepomohla STL, přepracujte (neplatí pro kategorii PRJ!!!)

Implicitní parametry – automaticky doplňované při volání funkcí bez parametrů

Přetěžování funkcívíce stejně pojmenovaných funkcí

Implementujte funkční operátor jako operátor pro přístup k prvkům pole (využijte návrat hodnoty pomocí reference)

Vytvořte projekt a jeho soubory (cpp a h). Hlavičky ošetřete a navrhněte třídy a jejich data. Metody pro nastavení a čtení prvků.Navrhněte vhodné konstruktory a destruktory.

Implementace Checker nebo VLD do 2D pole pro kontrolu paměti

Přemýšlejte o implementaci (způsobu realizace) třídy CPole2D (promyslete také například třídy CKomplex, CString, váš projekt...), zvolte datovou reprezentaci, promyslete vznik a zánik, manipulaci s instancemi třídy z hlediska vnějšího i vnitřního uspořádání. Proveďte návrh třídy kterou budete vypracovávat.

Přepracování 2D pole na třídu. Pole musí umožnit dynamickou změnu rozměrů. (Implementujte (a otestujte) - vhodná data, napište konstruktory (implicitní, kopy, konverzní z int, ze dvou prvků, z řetězce) a destruktor, metody pro čtení, zápis, změnu rozměrů)



přepracovat 2D pole na obecný typ pomocí šablon (template)

Šablony ( prostudujte program na výpočet matic realizovaný pomocí šablon, vyzkoušejte si napsat šablony pro jednoduché funkce)

rozšíření 2D pole o statická data a metody, friend funkce, Statická data pro počítání objektů vzniklých a aktuálních. Implementujte statické metody pro tisk statických proměnných. Implementujte nastavení pro nastavení a čtení, proveďte rozdělení do hlavičky a zdrojů. Dále pro svou třídu napište základní funkčnost

Členské a nečlenské „funkce“, alokace paměti

 

 

Poslední úpravy 2018-11-07