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í:

  1. Vytvořte nový projekt – prázdnou konzolovou aplikaci

  2. 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ří.

  1. 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).

  2. Nadefinujte konstantní proměnné X a Y pomocí vhodného konstantního typu a nastavte je na hodnoty 10 a 5.

  3. Nadefinujte strukturu TVector s datovými proměnnými iData a iSize.

  4. Ve funkci main vytvořte proměnné vect, vect1 a vect2 typu TVector. V C++ již není nutné uvádět struct.

  5. Inicializujte proměnné vect,vect1 a vect2 v definici na nulové hodnoty v poli iData a X v iSize.

  6. 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.

  7. Proměnné vect1 a vect2 naplňte (pomocí funkce Set) hodnotami vzrůstajícími o 1, vect1 od 0, vect2 od 10.

  8. Správné nastavení hodnot ověřte tiskem hodnot v proměnné vect2 pomocí funkce pro získání hodnot Get.

  9. 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.

  10. 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.

  11. Pomocí proměnných vect otestujte ve funkci main správnost funkcí Add a Sub.

  12. 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.

  13. 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