6 - Spojové struktury, práce se soubory

* pro vyučující: 06

Zapůjčení desek Nucleo STM32F446RE pro domácí seznámení s připojením a programování na platformě https://developer.mbed.org/platforms/ST-Nucleo-F446RE/.

Procvičovaná témata

  • Dynamická alokace
  • Rekurze
  • Valgrind
  • Spojový seznam
  • Zásobník vs. fronta
  • Práce se soubory

Úkoly na cvičení

  1. Implementujte frontu, která bude obsahovat celá čísla, která bude uživatel zadávat z klávesnice.
    1. Společně s cvičícím navrhněte vhodnou datovou stukturu, na které bude fronta založena.
    2. Společně s cvičícím navrhněte prototypy funkcí, které umožní vkládání dat do fronty (PUSH), odebírání z fronty (POP), dotaz na poslední prvek.
    3. Vytvořte funkci, která vypíše na konzoli obsah celé fronty.
    4. Nezapomeňte implementovat i funkci, která uvolní všechna data spojená s implementovanou frontou.
    5. Kontrolujte správnost dynamické alokace paměti pomocí Valgrindu.
  2. Upravte vhodně kód tak, abyste naimplementovali zásobník.
    1. S cvičícím diskutujte změny, které jste v kódu provedli.

Další úkoly na procvičení

  1. Implementujte spojový seznam, který v sobě bude obsahovat vždy dvojici dat - dvě celá čísla - první bude datová složka a druhé bude představovat prioritu.
  2. Upravte předchozí seznam tak, aby implementoval prioritní frontu tak, aby funkce PUSH od začátku vytvářela vnitřní stukturu seznamu seřazenou podle priority.

Práce se soubory

  • Funkce:

FILE *fopen(const char *path, const char *mode);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

Úkoly

  • Načtěte ze vstupu seznam čísel a uložte je do binárního souboru. Poté soubor načtěte a vypište seznam čísel. Prohlédněte si uložený soubor programem xxd nebo hexdump -C.
  • Naplňte strukturu test, uložte ji do binárního souboru, binární soubor načtěte do struktury a její obsah vypište.

struct test {
    int ival;
    char cval;
};
typedef struct test test_t;

  • Totéž udělejte se strukturou test2, do které uložíte i pointer na řetězec. Zamyslete se, jak správně uložit řetězec v položce .str, jak ho správně načíst a jak rozlišit, zda .str obsahuje NULL nebo odkaz na prázdný řetězec.

struct test2 {
    int ival;
    char cval;
    char *str;
};
typedef struct test2 test2_t;

  • Udělejte totéž s polem struktur test a test2.
  • Jak to bude, pokud použijete atribute packed? Jak se změní velikost struktury a proč? Musíte něco změnit ve vašem kódu? Jak ukládání a načítání naprogramovat, aby byl nezávislý na tomto atributu?

__attribute__((packed))

  • Naprogramujte funkce le_to_be(), která převede integer z little endian na big endian. (Pro uint32_t budete potřebovat stdint.h.)

uint32_t le_to_be(uint32_t v);

  • Nyní uložte a načtěte struktury test a test2 nezávisle na architektuře. Diskutujte limity vašeho řešení.
  • Diskutujte, jak uložit hodnoty typu float nezávisle na architektuře.

  • Načítejte čísla ze stdin a postupně je ukládejte do BST. Nakonec vyhledejte některá čísla a vypište, kolik kroků bylo potřeba k vyhledání.
  • Výsledný BST pravděpodobně není vyvážený. Jak upravíte načítání, aby byl strom vyvážený?
  • Pokud jste použili strukturu z přednášky, napadá vás, jak tuto úlohu vyřešit úsporněji bez pointerů .left a .right?
courses/b3b36prg/labs/lab06.txt · Last modified: 2018/02/06 17:18 (external edit)