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