Úkoly ze šestého semináře

Úkoly

  1. Implementujte funkci, která vrátí nově alokovaný řetězec, jehož obsah vznikne spojením dvou řetězců předaných funkci jako argumenty.

  2. Implementuje zásobník pomocí dynamického pole.

    typedef struct {
        int *data;    // pole pro vlozena data
        int top;      // pocet vlozenych prvku
        int cap;    // velikost pole data
    } Stack;
    
    Stack create_stack() {
        return (Stack){0};
    }

    Doprogramujte operaci push tak, aby v momentě, kdy je zásobník zaplněn, tato operace realokovala položku data na dvojnásobnou velikost.

    Doprogramujte operaci ‘pop’ tak, aby v momentě, kdy je zásobník zaplněn z jedné čtvrtiny, zmenšila položku data na polovinu.

    První nenulovou velikost zásobníku vyberte jako malou mocninu 2, např. 16.

  3. Vytvořte strukturu struct matrix pro matici desetinných čísel (double), s položkami pro rozměry matice (počet řádků a sloupců) a data (obsah matice). O vnitřním uložení a adresování jednotlivých prvků matice rozhodněte sami.

    Naprogramujte funkce:

    void allocate_matrix(struct matrix *m, int rows, int cols)

    Funkce nastaví v m položky pro rozměry matice a alokuje pamět pro data.

     void initialize_matrix_from_array(struct matrix *m, double *array)

    Funkce inicializuje obsah podle pole array v row-major pořadí: řádky matice jsou naskládány za sebe, jako reprezentaci dvourozměrného pole jednorozměrným. Můžete předpokládat, že array je dostatečně velké.

    void destroy_matrix(struct matrix *m);

    Funkce dealokuje paměť a nastaví odpovídající pointery na 0.

    struct matrix multiply_matrix(struct matrix a, struct matrix b);

    Funkce vynásobí matice (předpokládejme, že vynásobit jdou). Pro data výsledné matice alokuje novou paměť.

    void print_matrix(struct matrix a);

    Funkce vytiskne matici jako tabulku.

  4. Naprogramujte následující funkci.

    char** split_string(char *str, char delimiter, int *n);

    Funkce rozdělí řetězec str na části oddělené znakem delimiter, ten přitom do žádné části nepatří. Funkce vrátí takto vzniklé řetězce v nově alokovaném poli, každý z jeho prvků je klonem části původního řetězce, tj. jeho paměť je
    nově alokována. Počet vzniklých řetězců zapíše na adresu n.

    Příklady rozdělení řetězce (delimiter je '-')

    "ahoj-svete"       -> "ahoj", "svete"
    "ahoj--svete"      -> "ahoj", "", "svete"
    "-ahoj-svete"      -> "", "ahoj", "svete"
    "ahoj-svete-"      -> "ahoj", "svete", ""
    "ahoj"             -> "ahoj"