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é.
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.
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.
V souboru s funkcí main naincludujte hlavičkový soubor.
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).
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
Pomocí funkce TiskData vytiskněte strukturu z bodu 3 na konzolu.
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);
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;
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
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.
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.
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
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
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
Výslednou strukturu z bodu 13 uložte do výstupního souboru (viz bod 10)
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
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.