Projekt třída dvourozměrného dynamického pole


Tvorba této třídy navazuje na předchozí příklad 2D pole (DU2) - prostudujte si připomínky k němu.

Příklad komentujte pomocí doxygen (komentujte jen třídu - pokud možno pouze v hlavičkovém souboru)

Prostudujte si „teoretické“ návrhy a návody obecný a orientovaný na 2D pole.

Třída dynamické 2D pole patří ke složitějším, proto by bylo vhodné na základě skript (kde je naznačeno jak třída postupně vzniká) nejprve naprogramovat třídy komplex a string a po jejich pochopení pokračovat s třídou 2D pole.


Pozn.: na základě dotazů může být zadání modifikováno/upřesněno.


Úkol 2 (zadáno 9.11, odevzdává se do 21.11.2013)

Pro vlastní činnost použijte soubory:
- main2d.cpp pro funkci main, ve které předvedete volání všech metod,
- poledyn.cpp a poledyn.h jako zdrojové a hlavičkový soubor třídy (standardně ho ošetřete).


Nadefinujte třídu CPole2D.
Nadefinujte dvě statické proměnné iTotal a iZive pro počítání celkově vzniklých a aktuálně existujících instancí dané třídy.
Nadefinujte členské proměnné pro 2D pole typu MUJTYP (nadefinujte pomocí #define). Tento název používejte všude, kde se jedná o typ, související s prvky v poli.
Pro získání hodnot statických proměnných nadefinujte statické metody GetTotal a GetZive. Za pomoci jejich volání ukažte, že na začátku i konci main je počet aktuálních prvků roven nula a vytiskněte na konci kolik prvků třídy CPole2D za chodu programu vzniklo.
Pro kontrolu správné manipulace s pamětí použijte knihovnu check.
Vytvořte privátní metodu Alok, která vrací v návratové hodnotě naalokované pole a má dva parametry rozměry x a y pole (nepoužívá interní proměnné třídy, všechny parametry má lokální).
Vytvořte privátní metodu Odalok na odalokaci 2D pole, které je jí předáno jako parametr (Opět pouze práce s lokálními proměnnými. Nezapomeňte „označit“ pole jako prázdné/“nepoužitelné“).
K manipulaci (tj. pro změny) rozměrů 2D pole používejte pouze metody Alok a Odalok.
Vytvořte implicitní konstruktor, který pouze vynuluje členské proměnné.
Vytvořte kopykonstruktor (vytvoří si vlastní kopii pole z dodaného parametru, parametr dán jako konstantní reference)
Vytvořte konstruktor ze tří prvků, který vytváří matici o rozměrech daných prvními dvěma parametry (otestujte, že parametry mobou být rozměr). Vytvořené pole bude naplněno hodnotou ve třetím parametru. Tento konstruktor upravte tak, aby byl zároveň konverzním z typu int (vytvářené pole bude čtvercové, prvky inicializovány na nulovou hodnotou).



Úkol 3 (zadáno 23.11., odevzdává se do 4.12.2013)

Pokračujte v souborech z minulého cvičení:
Vytvořte konverzní konstruktor z char *, když řetězec má tento tvar “<(rozměrx,rozměry)[data]>“ (například <(2,3)[1,2,3;4,5,6]>)
Vytvořte metodu Zmen(xx,yy), která změní rozměry pole na xx a yy. Prvky v průniku rozměrů starého a nového pole zkopírujte, ostatní vynulujte.
Vyzkoušejte v main dynamický vznik objektu třídy CPole2D *aaaa = new CPole2D(3,6,9.2);
Napište operátor= (operátor musí zjistit, zda se nejedná o aaa=aaa (kdy nemůže provést následující postup). Pokud jsou prvky různé, odalokuje se staré pole, naalokuje a zkopíruje se pole nové).
Napište dvojici metoda a funkce Abs tak, že splní:
a) metoda umožňující volání CPole2D bbb=aaa.Abs(), která mění instanci aaa na instanci bbb, která má záporné prvky změněny na kladné (aaa má po provedení všechny prvky nezáporné).
b) funkce umožňující volání CPole2D bbb; bbb=Abs(aaa), která nechává instanci aaa nezměněnu a vrací (temp objekt), který je přiřazen instanci bbb.



Úkol 4 (zadáno 07.12., odevzdává se do 18.12.2013)

Pokračujte v souborech z minulého cvičení:
Napište operátory vstupu a výstupu (>> a <<) s řetězcem ve formátu <(rozmer_x, rozmery) [d11, d12, ... ; d21, d22, ...]>
Napište operátor () pro přístup k prvkům pole, který bude použitelný i nalevo od operátoru rovná se (výsledkem tedy bude L-hodnota. Tato koncepce umožňuje přístup k privátním prvkům, což není ideální)
Napište operátor== který porovná objekty podle velikosti i podle hodnot prvků.
Napište operátory unární + a -.
Napište operátory binární + a -. (nezapomeňte na kontroly, zda je takový výpočet možný)
Napište konverzní operátor na int, jehož výsledkem bude počet prvků v poli.
Demonstrujte použití pro všechny vytvořené operátory. Ošetřete možné chyby (práce s různými rozměry objektů, nedefinovaný/prázdný objekt...)



Úkol 5 (zadáno 21.12., odevzdává se do 03.01.2014)

Uchovejte si projekt z minulého cvičení. Na jeho základě vytvořte dva samostatné projekty.

Projekt 1:
Upravte tak aby třída 2D pole fungovala pro jakýkoli datový typ (realizovat se bude pomocí template - vše se přesune do hlavičkového souboru). Funkci demonstrující použití a činnost třídy (z minulého cvičení) přesuňte do několika funkcí (minimálně 3) a v každé z nich ukažte, že funguje pro jiný datový typ.
Projekt 2:
Rozdělte třídu z minulého cvičení na vlastnosti (data a metody), které souvisí s obecným 2d polem (např. jsou schopny pracovat i s polem ukazatelů), a které už patří spíše do maticového počtu (aritmetické operace s daty). Ze základních vlastností vytvořte bázovou třídu, z ní odvoďte třídu TMat, ve které budou zbylé/specializované metody a data. Funkci demonstrující činnost rozdělte na dvě - v první nadefinuje proměnné jako pole, ve druhé jako matice - nefungující části zakomentujte.








Poslední změna 2013-11-13