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