Cvičení 1 - Práce se strukturami
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 (2× hodnota, 1× 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.