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


Tvorba této třídy navazuje na předchozí příklad 2D pole (úkol1) - 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 3.11, odevzdává se do 18.11.2012)

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


Nadefinujte třídu C2DPole.
Nadefinujte dvě statické proměnné iCelkem a iAktualni 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 GetCelkem a GetAktualni. 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ů za chodu vzniklo.
Pro kontrolu správné manipulace s pamětí použijte knihovnu check.
Vytvořte privátní metodu Alokuj, která vrací naalokované pole a má parametry rozměry x a y pole.
Vytvořte privátní metodu Odalokuj na odalokaci 2D pole, které je jí předáno jako parametr.
K manipulaci s rozměry 2D pole používejte pouze metody Alokuj a Odalokuj.
Vytvořte implicitní konstruktor, který pouze vynuluje členské proměnné.
Vytvořte kopykonstruktor (vytvoří si vlastní kopii pole)
Vytvořte konstruktor ze dvou prvků, který vytváří čtvercovou matici o rozměru daném prvním parametrem (otestujte, že parametr může být rozměr). Vytvořené pole bude naplněno hodnotou v druhém parametru. Tento konstruktor upravte tak, aby byl zároveň konverzním z typu int (pole bude inicializováno nulovým prvkem).



Úkol 3 (zadáno 17.11., odevzdává se do 28.11.2012)

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 Resize(xx,yy), která změní rozměry pole na xx a yy. Prvky v průniku starého a nového pole zkopírujte, ostatní vynulujte.
Vyzkoušejte i dynamický vznik objektu třídy C2DPole *aaaa = new C2DPole(3,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 ne, odalokuje se staré pole, naalokuje a zkopíruje pole nové).
Napište dvojici metoda a funkce Transpozice tak, že:
a) metoda umožňující volání bbb=aaa.Transpozice(), která mění instanci aaa na transponovanou instanci bbb (aaa je po provedení transponovaná).
b) funkce umožňující volání bbb=Transpozice(aaa), která nechává instanci aaa nezměněnu a vrací (temp objekt) transponovaný, který je přiřazen instanci bbb.



Úkol 4 (zadáno 03.12., odevzdává se do 13.12.2012)

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 rovná se (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 hodnot prvků.
Napište operátory unární + a -.
Napište operátory binární + a -.
Napište konverzní operátor na double, jehož výsledkem bude součet hlavní diagonály (prvků majících stejný index u řádku i sloupce).
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 13.12., odevzdává se do 03.01.2013)

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í činnost (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 TMatice, 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 2011-12-04