Struktury a dynamická paměť



Definujte strukturu TRadek pro dynamické pole dat typu double.

Definujete strukturu TRadky, která bude obsahovat dynamické pole struktur TRadek. Struktury TRadek , budou nést pole dat, která si můžeme představit jako řádky matice, která však nemusí mít řádky stejně dlouhé. Jelikož je počet prvků této struktury dynamický, je možné měnit počet řádků.

Pomocí těchto struktur realizujte program, který načte řádky ze souboru a vytvoří jejich součet.



Výsledný pohled: jedna struktura TRadky obsahuje pole struktur TRadek, které obsahují pole dat typu double. V každé struktuře je proměnná, která nese informaci o počtu prvků ve struktuře.





Pozn.: při realizaci můžete samostatně postupovat podle následujících bodů, nebo si stáhnout projekt, kde jsou již některé body (částečně) vyřešené.



  1. Založte projekt a v něm vytvořte dva zdrojové soubory (main.c; tdata.c) a soubor hlavičkový (tdata.h). V prvním zdrojovém souboru bude funkce main, ve druhém budou funkce pracujcí se strukturami. Pro kontrolu správnosti práce se soubory a pamětí použijte knihovnu check.

  2. V hlavičkovém souboru proveďte deklaraci struktury TRadek, která obsahuje pole hodnnot iValue typu double. Pole může mít libovolnou délku (dynamické, alokované). Pro délku pole nadefinujte proměnnou size_t iSize. Strukturu můžete doplnit proměnnou pro kód chyby.

  3. V souboru s funkcí main naincludujte hlavičkový soubor.

  4. Ve funkci main nadefinujte proměnnou input typu TRadek a inicializujte ji na nulové hodnoty.
    Napište funkci CreateData(struct TRadek *aData, size_t aSize), která alokuje data pro aSize hodnot typu double. Na základě výsledků nastaví proměnné struktury.
    Pomocí funkce CreateData(struct TRadek *aData, size_t aSize) připravte proměnnou input na uložení deseti hodnot. Hodnoty pole v proměnné input nastavte ve funkci main od nuly do devíti pomocí přímého přístupu k proměnným.
    Pokud používáte předpřipravený projekt, nahraďte předchozí nastavení hodnot, nastavením hodnot pomocí funkce SetAt (nastavte od nuly do devíti).

  5. Napište funkci pro tisk hodnot struktury TRadek. Funkce bude mít prototyp
    int TiskData(const struct TRadek* const aData, FILE *aOutp)
    a vytiskne na jeden řádek data struktury ve formátu
    pocet/Hodnota0;Hodnota1;...;HodnotaN
    Pro tisk počtu rezervujte pole o pěti prvcích ("%5zu "), hodnoty tiskněte do pole o šesti prvcích s dvěma desetinnými místy pomocí ("%6.2lf ").
    Pro testovávní využijte na místě druhého parametru stream pro konzolu stdout.
    Pozn.: pro tisk typu size_t se používá znak z – tj. je-li size_t bezznaménkový typ: “%5zu“
    Pozn.: Soustřeďte se na vlastní činnost funkce. Po dokončení ostatních bodů funkci doplňte o testování vstupních proměnných a jako návratovou hodnotu pro typ chyby použijte typ a hodnoty z enum TDataErrCode ze vzorového projektu

  6. Pomocí funkce TiskData vytiskněte strukturu z bodu 3 na konzolu.

  7. Napište funkci DestroyData(struct TRadek *aData), která odalokuje data ve struktuře a nastaví proměnné tak, aby signalizovaly, že ve struktuře nejsou platná data (=0, NULL)..
    Strukturu z předchozích bodů uvolněte pomocí funkce DestroyData(struct TRadek *aData);




  8. Ve funkci main otevřete textové soubory jejichž názvy jsou dány jako parametry příkazové řádky. První soubor je textový soubor s daty, otevřete ho pro čtení (data.in) a druhý je textový soubor pro zápis výsledné struktury (data.out).
    V souboru pro čtení budou vstupní data ve formátu
    počet řádků dat
    počet hodnot na řádku/hodnota;hodnota;...;hodnota;

    počet hodnot na řádku/hodnota;hodnota;... ...;hodnota;



    Vzor s hodnotami:
    4
    3/3.15;21;546;
    6/33.5;5.15;21;54;6;-3;
    4/3.15;22.1;46;-15;
    6/33.5;5.15;21;54;6;-3;

  9. Struktura TRadek bude sloužit k uložení jednoho pole, tj. jednoho řádku ze souboru.
    Napište funkci NactiData(struct TRadek *aData, FILE *aInput), která načte jeden řádek souboru do struktury TRadek. Funkce bude mít jako parametr otevřený vstupní soubor FILE * a struct TRadek*.
    Funkce načte první hodnotu na řádku, alokuje pole pro data – v případě úspěchu počet prvků i alokované pole uloží do struktury.
    Načte ze souboru hodnoty a uloží je do pole ve struktuře.
    Návratové hodnoty:
    0 v pořádku
    1 špatně vstupní parametr (NULL)
    2 nepodařilo se alokovat
    3 chyba v souboru (formát vstupních dat)
    Pozn.: Soustřeďte se na vlastní činnost funkce. Po dokončení ostatních bodů funkci doplňte o testování vstupních proměnných a jako návratovou hodnotu pro typ chyby použijte typ a hodnoty z enum TDataErrCode ze vzorového projektu

  10. Napište strukturu TRadky, která bude obsahovat pole struktur TRadek v a jejich počet. Struktura bude obsahovat proměnnou iData pro uložení dat typu struct TRadek a hodnotu iPocet udávající počet dat ve struktuře (typ size_t). Strukturu můžete doplnit proměnnou pro kód chyby.

  11. Ve funkci main vytvořte proměnnou typu TRadky. Vytvořenou proměnnou inicializujte v definici na hodnotu NULL,0.
    Následně ji naplňte ze vstupního otevřeného souboru pomocí funkce NactiRadky.
    Dále strukturu vytiskněte na konzolu pomoci funkce TiskRadky.
    Pomocí volání funkce PridejSoucet přidejte na první řádek struktury součet ostatních řádků.
    Výslednou strukturu uložte do výstupního souboru.

  12. Napište funkci NactiRadky(struct TRadky *aData, FILE *aInput), která načte postupně řádky souboru do struktury TRadky. Funkce bude mít jako parametr FILE * a struct TRadky*.
    Funkce načte první řádek souboru, kde je hodnota udávající počet řádků v souboru tj. i počet hodnot/řádků ve struktuře. V předané struktuře alokuje datové prvky pro načítání řádků a nastaví proměnnou pro počet hodnot ve struktuře.
    Pomocí funkce NactiData postupně načte hodnoty/pole řádků.
    Návratové hodnoty:
    0 v pořádku
    1 špatně vstupní parametr (NULL)
    2 nepodařilo se alokovat
    3 chyba v souboru (formát vstupních dat)
    Pozn.: Soustřeďte se na vlastní činnost funkce. Po dokončení ostatních bodů funkci doplňte o testování vstupních proměnných a jako návratovou hodnotu pro typ chyby použijte typ a hodnoty z enum TDataErrCode ze vzorového projektu

  13. Napište funkci TiskRadky(const struct TRadky* const aData, FILE *aOutp), která vytiskne do souboru data ze struktury TRadky. Na první řádek vytiskne hodnotu počtu řádků a následně data pro jednotlivé řádky pomocí funkce TiskData. Pro tisk se použije stejný formát jako je ve vstupním souboru.
    Pozn.: Soustřeďte se na vlastní činnost funkce. Po dokončení ostatních bodů funkci doplňte o testování vstupních proměnných a jako návratovou hodnotu pro typ chyby použijte typ a hodnoty z enum TDataErrCode ze vzorového projektu

  14. Napište funkci PridejSoucet(struct TRadky* const aData), která přidá do struktury TRadky jeden řádek na první pozici (o délce nejdelšího pole ze stávajících struktur) a do něj uloží součet polí z ostatních struktur/řádků. Pokud nejsou v poli hodnoty (je kratší), potom se tyto hodnoty nepřičítají (považují se za nulové).
    Pozn.: Soustřeďte se na vlastní činnost funkce. Po dokončení ostatních bodů funkci doplňte o testování vstupních proměnných a jako návratovou hodnotu pro typ chyby použijte typ a hodnoty z enum TDataErrCode ze vzorového projektu

  15. Výslednou strukturu z bodu 13 uložte do výstupního souboru (viz bod 10)

  16. Napište funkci ZrusRadky, která korektně uvolní paměť struktury TRadky. Proměnné struktury nastavte do nulových hodnot.
    Pozn.: Soustřeďte se na vlastní činnost funkce. Po dokončení ostatních bodů funkci doplňte o testování vstupních proměnných a jako návratovou hodnotu pro typ chyby použijte typ a hodnoty z enum TDataErrCode ze vzorového projektu

  17. Korektně ukončete (paměť, soubory) funkci main a vraťte hodnotu 0. V případě, že během vykonávání funkce main dojde k chybě, program korektně ukončete a vraťte hodnotu 1.