Práce se strukturami (2018)
Zadání:
Napište program, který pracuje s dvourozměrným polem.
Dvourozměrné pole realizujte pomocí struktury pro řádek TVector (obsahující pole X prvků double) a struktury TMatrix (obsahující Y prvků typu TVector).
Struktura TVector bude obsahovat proměnnou iSize pro počet využitých prvků pole (maximálně X) a proměnnou iData pro vlastní hodnoty pole.
X a Y definujte jako konstantní proměnné (pomocí klíčového slova const).
Napište funkce pro přístup k prvkům vektoru - pro čtení Get a pro zadávání prvku Set. Tyto jednoduché funkce realizujte jako inline. Funkce Set bude mít jako první parametr strukturu, ve které se bude nastavovat hodnota; druhý parametr bude index prvku v poli, který se bude nastavovat a třetí parametr bude obsahovat hodnotu, na kterou se prvek na dané pozici má nastavit. V případě indexu mimo rozměr pole se funkce ukončí s hodnotou jedna, jinak vrátí hodnotu nula. Funkce Get bude mít jdva parametry – prvním bude struktura, a druhá proměnná bude index prvku jehož hodnotu vrátí. V případě indexu mimo rozměr pole vrátí funkce hodnotu nula (vymyslíte jiné/lepší řešení?).
Napište funkce Add pro sčítání vektoru - funkce bude mít tři parametry TVector (2x hodnota, 1x ukazatel) - dva pro předání vstupních proměnných a třetí pro uložení výsledku.
Napište funkce Sub pro odečítání vektoru - funkce bude mít dva parametry pro předání vstupních proměnných, výsledek bude předán pomocí návratové hodnoty.
Strukturu TMatrix realizujte pomocí struktury (sloupce) obsahující pole Y prvků typu TVector.
Struktura TMatrix bude obsahovat proměnnou iSize pro počet využitých prvků pole (maximálně Y) a proměnnou iData typu pole hodnot TVector. Prvky (uvnitř) struktury TVector obsahují hodnoty matice.
Napište funkce Get a Set pro prvek TMatrix (se stejnými vlastnostmi jako funkce pro TVector, hlavičky funkcí budou navíc obsahovat hodnotu pro pozici prvku ve druhém rozměru). V C++ je možné mít více funkcí se stejným názvem, liší-li se v parametrech (přetěžování funkcí).
Napište funkci Add a Sub pro sčítání a odečítání matic (se stejnými vlastnostmi jako funkce pro TVector).
Pozn. : proměnné typu struct jsou "velké". Jak probíhá jejich předávání do funkcí (hodnotou)? Jak se dá nevýhodě zabránit?
Pozn.2: Pokud se parametr předává pomocí ukazatele a ne hodnoty, jaký je rozdíl při změně členských proměnných struktury ve funkci? Jak se dá změně zabránit?
Doporučené řešení:
Vytvořte nový projekt – prázdnou konzolovou aplikaci
Vytvořte soubory projektu:
main01.cpp
- ve kterém bude funkce main
s definicí proměnných a ukázkami volání funkcí
Matice01.cpp
- ve kterém budou funkce pro práci s vektorem a maticí, které tvoří
kód (funkčné volání)
Matice01.h
- ošetřený hlavičkový soubor umožňující volání funkcí ze souboru
Matice01.cpp a dále
obsahující definice struktur a inline
funkce (které netvoří kód a proto je umisťujeme do hlavičkového
souboru)
Následující umísťujte do souborů, do kterých logicky patří.
Nakreslete si jak bude vypadat výsledná proměnná TMatrix složená z členských proměnných iSize a iData. Rozkreslete i proměnnou iData typu pole TVector (každá s proměnnými iSize a iData).
Nadefinujte konstantní proměnné X a Y pomocí vhodného konstantního typu a nastavte je na hodnoty 10 a 5.
Nadefinujte strukturu TVector s datovými proměnnými iData a iSize.
Ve funkci main vytvořte proměnné vect, vect1 a vect2 typu TVector. V C++ již není nutné uvádět struct.
Inicializujte proměnné vect,vect1 a vect2 v definici na nulové hodnoty v poli iData a X v iSize.
Napište inline funkci Set pro nastavení prvků vektoru. V případě úspěchu (pozice není mimo pole) vraťte hodnotu nula, jinak jedničku. Funkci bude předán vektor, pozice a hodnota, která se má na danou pozici nastavit.
Proměnné vect1 a vect2 naplňte (pomocí funkce Set) hodnotami vzrůstajícími o 1, vect1 od 0, vect2 od 10.
Správné nastavení hodnot ověřte tiskem hodnot v proměnné vect2 pomocí funkce pro získání hodnot Get.
Napište funkci pro součet dvou vektorů Add - funkce bude mít tři parametry - dva pro předání vstupních proměnných a třetí pro uložení výsledku. Pokud budou vstupní vektory různé délky vrátí hodnotu 1 a součet neprovede. Délku výstupního vektoru nastaví podle délky vstupních proměnných. Při úspěchu vrátí hodnotu 0.
Napište funkci pro rozdíl dvou vektorů Sub -funkce bud mít dva parametry pro předání vstupních proměnných, výsledek bude předán pomocí návratové hodnoty. Pokud budou vektory různé délky vrátí strukturu s poctem nastaveným na hodnotu 0 a rozdíl neprovede.
Pomocí proměnných vect otestujte ve funkci main správnost funkcí Add a Sub.
Vytvořte proměnnou vect3
typu ukazatel na TVector.
Vlastní strukturu vytvořte pomocí alokace funkcí calloc
(knihovna cstdlib;
nezapomeňte,že každá alokace musí mít odalokaci).
Calloc/malloc
vrací typ void *. C++ nedovoluje implicitní konverzi ukazatelů
různých typů. Jak se provede konverze explicitní?
Ve vytvořené
proměnné nastavte hodnotu iSize
na X a hodnoty pole od 30. Zkuste použít jako vstupní a výstupní
parametr při volání funkcí Get
a Set.
Obdobně (body 5 až 14) postupujte pro strukturu TMatrix.
Pozn.: Ve cvičeních se snažte vyřešit co nejvíce, zbytek dopracujte za DU.
Poslední úpravy 2018-09-18