Projekt - vzor zadání
V následujícím textu je vzor zadání. Červeně jsou označeny prvky, které se mohou lišit a které platí obecně pro třídu kontejner a které je nutné nahradit (černým textem). Čím více červených položek využijete, tím více vlastností si osvojíte a tím hodnotnější program bude. V tomto okamžiku nás nezajímá implementace, (konkrétní realizace tedy názvy proměnných a jak uvnitř fungují metody), pouze u metod popíšeme jejich činnost slovně. Zelené komentáře v zadání nebudou, jsou pouze informativní. U některých tříd mohou nastat problémy s tím, že daný typ metody pro ně nemá nejlogičtější využití – zkuste si nějaké (byť méně logické) využití vymyslet (z hlediska programátorské praxe je to samozřejmě špatně, protože metody by měly být logické a snadno chápatelné, ale my zde dáme prioritu procvičení daného typu metod). Každý z autorů by měl napsat alespoň jednu metodu daného typu.
Text zadání:
Navrhněte třídu CKontejner, která bude realizovat knihovnu pro práci s vybraným jednoduchým (int, float ...) typem, který bude zapouzdřen v dodané třídě CNode. Třída CNode je připravena pro práci s lineárním seznamem a její využití při tvorbě seznamu je povinnou součástí projektu. Tato knihovna bude realizovat činnost s kontejnerem podle následujících bodů (pokud je to možné, bude splňovat očekávané chování (podobné jako u jednoduchých typů (int, float ...))). Navržená třída CKontejner umožní:
0. Třída CNode zapouzdřuje datový typ: jeden základní (int, float), jiný než bool. Tuto definovanou třídu vytvoříme v jejím jmenném prostoru : CNode_bool.
1. Vznik objektu – implicitní konstruktor, (konverzní) konstruktor z CNode, z typu int (seznam o daném počtu prvků CNode), ..., dále pak konstruktor z dvojice hodnot reprezentujících pole prvků CNode a počet prvků, ... dále bude možné konstruovat na základě C řetězce (char *), ve kterém budou hodnoty jednotlivých CNode oddělené čárkami. Kopykonstruktor. Pozn.: Celkem tedy – implicitní, kopykonstruktor, konverzní, konverzní z řetězce, s více parametry, ... – (minimální počet 6ks)
2. Počet vzniklých a aktuálních instancí třídy CKontejner bude možné sledovat za pomoci statických proměnných třídy a bude možné je získat voláním statických metod. Každá instance třídy CKontejner bude obsahovat privátní proměnnou iIndex s unikátní hodnotou sloužící k identifikaci instance (odpovídající pořadí vzniku). Hodnota této proměnné musí být přístupná mimo třídu pomocí vhodné metody - VratIndex.
3. Zánik objektu - destruktor kontejneru bude implementován s mechanizmem odpočtu aktivních prvků přes statické proměnné.
4. Budou implementovány operátory kontejneru s příslušnými činnostmi: operátor = pro přiřazení, operátor – jako unární operátor pro inverzi kontejneru například: jako: reverzace (otočení pořadí prvků), doplněk do plného kontejneru, nebo inverze jednotlivých hodnot CNode. Dále operátor – jako binární operátor pro rozdíl kontejnerů, operátor + pro … , operátor += realizující a = a+b;, logické operátory ==, !=, <=, >,... pro srovnání dvou kontejnerů (na základě obsahujících hodnot a jejich počtu). Dále konverzní operátor na int, který bude reprezentovat počet prvků kontejneru. Nečlenský operátor, využívající friend vlastností realizující součet CNode, float, int hodnoty a kontejneru. (Pozn. Celkem tedy – unárních (nejméně 3ks) , binárních (nejméně 3ks), konverzní, nečlenský, logické (nejméně 3ks) – (celkem minimálně 12ks).
5. Standardní vstup a výstup z instance třídy CKontejner bude realizován pomocí streamů (realizovaný friend funkcí s využitím jejích vlastností) – přetížením operátorů << a >> ve stejném formátu navrženém pro konstruktor z char * (tj.čárkami oddělený seznam hodnot).
6. Budou realizovány privátní a veřejné metody: veřejná metoda PocetPrvku pro zjištění prvků v kontejneru, která nebude mít parametry. Metody pro vložení a vyzvednutí prvku dle funkce kontejneru. Dále metoda … která bude …. Privátní metoda Compare, která srovná dva kontejnery podle délky a vrací hodnotu (-1,0 nebo 1). Dále CompareDeep, která srovná kontejnery i dle hodnot CNode. Tyto metody budou používat logické operátory.(Pozn. Pro privátní metody jsou nejvýhodnější funkce typu „uprav“, „přepočítej“, „zkontroluj“. (Celkem tedy – minimálně 2ks privátní a 4ks veřejné.)
7. Budou realizovány metody, pro reverzaci (například otočení
pořadí prvků kontejner):
a)
umožňující volání bbb=aaa.Reverzuj(),
která mění kontejner
aaa
na reverzovaný kontejner
bbb
b) umožňující volání bbb=Reverzuj(aaa),
která nechává kontejner aaa
nezměněn a vrací (temp objekt) reverzovaný kontejner.
8. Použití dynamických dat ve třídě – (ne)předpokládám.
9. Dědění ve třídě – (ne)předpokládám.
10. Použití výjimek - (ne)předpokládám.
11. Ve vlastním projektu se předpokládá i implementace metod vytvářených překladačem implicitně.
12. Ve třídě bude pro kontrolu dat implementována knihovna Check.
Poznámky k řešení (jsou součástí zadání):
Vytvořená implementace kontejneru
musí umožňovat bezchybný překlad s libovolnou třídou CNode
(zapouzdřující některý z jednoduchých datových typů) bez nutnosti
zásahu do zdrojových textů kontejneru
!!!!
Implementace kontejneru
tedy nebude závislá na typu ukládaných hodnot, protože bude využívat
pouze definované rozhraní třídy CNode,
tak jak je uvedeno v testovacím příkladu. CKontejner
proto implementujte tak, aby nevyužíval ani Setter a Getter metody
třídy CNode, jejichž hlavička je na
zapouzdřujícím typu závislá!!!
Vlastní realizace třídy pro kontejner bude rozdělena na hlavičkový a zdrojový soubor. Další zdrojový soubor bude reprezentovat program demonstrující vlastnosti a použití definované třídy, který bude realizován jako konzolová aplikace přeložitelná ve Visual C++ (prázdný projekt, přísnost (stupeň) 3 na detekci chybových a varovných hlášení). Soubory budou obsahovat úvodní poznámku o svém názvu, řešitelích).
Tento demonstrační program bude napsán tak, aby při činnosti nevyžadoval zásahy obsluhy ani vstupní data z jiných zdrojů (s výjimkou operátoru pro standardní vstup). Demonstrační programu bude inicializovat proměnné (v něm definovanými daty nezadávanými uživatelem) a na jejich základě bude demonstrovat činnost třídy a dále zobrazovat data na konzolu, nebo ukládat výsledky do souboru.
K odevzdávanému zadání nezapomeňte připsat hlavičku (tj. jména řešitelů, název projektu, datum zadání … budou součástí odevzdávaného souboru)
Pro lepší orientaci uvádíme krátkou motivaci k pojmu třída.
Poslední změna: 2010-10-07