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, tedy jaká data se používají 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 kontejner, která bude realizovat knihovnu pro práci s vybraným jednoduchým (int, float ...) typem, který bude zapouzdřen v dodané třídě CData. 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í jednoduchých typů (int, float ...)). Navržená třída umožní:

1. Vznik objektu – implicitní konstruktor, (konverzní) konstruktor z typu int (pole o daném počtu prvků), ..., dále pak konstruktor z dvojice hodnot reprezentujících pole prvků CData a počet prvků, ... dále bude možné konstruovat na základě řetězce, ve kterém budou hodnoty jednotlivých CData oddělené čárkami. Kopykonstruktor. Pozn.: Celkem tedy – implicitní, kopykonstruktor, konverzní, konverzní z řetězce, s více parametry, ... – minimálně 6ks)

2. Počet vzniklých a aktuálních instancí třídy kontejner (oprava-upřesnění 2009-11-10) 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 kontejner bude obsahovat privátní proměnnou index 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 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 CData. 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 převádět kontejner na jeho velikost v celých číslech. Nečlenský operátor, využívající friend vlasností realizující součet float/int čísla 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 kontejner bude realizován pomocí streamů (realizovaný friend funkcí s využitím jejích vlastností) – přetížením operátorů << a >> ve formě navržené pro konstruktor z řetězce (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). Tuto metodu budou používat logické operátory. Dále CompareDeep, která srovná kontejnery i dle hodnot CData. (Pozn. Celkem tedy – minimálně 2ks privátní a 4s veřejné. Pro privátní metody jsou nejvýhodnější funkce typu „uprav“, „přepočítej“, „zkontroluj“)

7. Budou realizovány metody, pro reverzaci (otočení pořadí prvků):
a) umožňující volání bbb=aaa.Reverz(), která mění kontejner aaa na reverzovaný kontejner bbb
b) umožňující volání bbb=Reverz(aaa), která nechává kontejner aaa nezměněn a vrací (temp objekt) reverzovaný kontejner.

8. Použití dynamických dat ve třídě – nepředpokládám.

9. Dědění ve třídě – nepředpokládám.

10. Ve vlastním projektu se předpokládá i implementace metod vytvářených implicitně.

 

Poznákmy k řešení:

Vytvořená implementace kontejneru musí umožňovat bezchybný překlad s libovolnou třídou CData (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 CData, tak jak je uvedeno v testovacím příkladu. Kontejner proto implementujte tak, aby nevyužíval ani Setter a Getter metody třídy CData, 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 zasílané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: 2009-10-13