Úkoly pro čtvrtý seminář

Zadání

  1. Naprogramujte vlastní verze knihovních funkcí strlen a strcmp (string.h), které nepoužijí indexů, ale pouze pointerové aritmetiky a dereference.

  2. Vytvořte strukturu s několika položkami a aspoň jednu její proměnnou. Vypište informace o layoutu této proměnné: pro každou položku vypište její adresu a velikost. Vypište i adresu a velikost samotné proměnné.

  3. Naprogramujte funkci pro výpočet průměru a mediánu pole čísel (např. float). Jednu z hodnot vraťte pomocí argumentu předaného odkazem. (Funkce může změnit pořadí prvků v poli.)

  4. Napište funkci swap_int, která prohodí hodnoty dvou proměnných typu int.

  5. Napište funkci, která v poli řetězců najde znak, který se vyskytuje v nejvíce řetězcích v tomto poli.

  6. Uvažujme následující strukturu pro řetězec. Položka data není zakončená 0, místo toho si pamatuje svoji délku v položce len.

    typedef struct
    {
        char *data;
        size_t len;
    } String;

    Řětězce budeme vytvářet pomocí funkce (není nutno se zabývat jejím tělem, zejména ne funkcí malloc).

    String clone_from_cstring(char *cstring)
    {
        String ret = {0};
        ret.len = strlen(cstring);
        if (ret.len == 0) { ret.data = 0; }
        else 
        {
            ret.data = malloc(ret.len);
            assert(ret.data);
            memcpy(ret.data, cstring, ret.len);
        }
        return ret;
    }

    Naprogramujte následující funkce

    String get_prefix(String str, char delimiter, String* remainder);

    Funkce vrátí prefix řetězce str až do znaku delimiter, který ovšem do výsledku nepatří. Do argumentu remainder zapíše zbytek řetězce bez delimiteru. Tedy pokud spojíme návratovou hodnotu, delimiter a remainder dostaneme str (vše chápáno jako řetězce). Pokud je první symbols str roven delimiter, vrací funkce prázdný řetězec. Pokud str delimiter neobsahuje, je výsledkem celý řetězec. Funkce v tomto případě musí nastavit remainder na prázdný řetězec. Funkce vytváří novou strukturu string, ovšem nealokuje novou pamět pro pole typu char, položka data je ukazatelem do pole, na které ukazuje položka str.data. Stejně tak pro remainder.

    int string_to_long(String s, long* result);

    Funkce převede číslo zapsané jako řetězec na long. Předpokládáme kódování v desítkové soustavě. Číslo může být záporné. Pokud je s prázdný, je výsledkem převodu 0. Výsledné číslo je zapsáno do argumentu result. Funkce vrací 1, pokud se povedlo číslo z řetězce převést, jinak vrací 0.

    int compute_the_thing(String s, long* result);

    s je text, který obsahuje na každém řádku mezerami oddělená celá čísla. Funkce vrací číslo, které dostane následovně: čísla v každém řádku sečte; výsledek dostane tak, že sečte součty sudých řádků a od toho odečte součet součtů lichých řádků. Výsledek zapíše do result. Pokud se část řetězce nepovede převést na číslo, vrátí funkce 0, jinak vrací 1. Například, pokud je s

    2 2
    2 2 2
    -2 3

    jsou součty řádků 4, 6, 1 a výsledek je -4 + 6 -1 = 1.