Úkoly ze sedmého semináře

  1. Navhněte strukturu pro komplexní číslo a naprogramujte variadickou funkci pro výpočet sumy komplexních čísel využívají prvního přístupu k určení počtu volitelných argumentů.

  2. Napište funkci long double prumer(char* format, ...), která výpočítá aritmetický průměr ze zadaných hodnot různých datových typů. Typy předávaných hodnot jsou určeny pomocí parametru format, který může tvořit libovolná posloupnost znaků odpovídající typům následujících parametrů - i pro typ int, d pro typ double a l pro long double.

  3. Naprogramujte vlastní verzi funkce printf, která s podporou tiskových direktiv %i, %f a %z, kde poslední direktiva vede k tisku zlomku. Při řešení lze využít funkci printf.

  4. Napište funkci double* map(double (*fce)(double), double* input, int len), která na hodnoty pole input aplikuje funkci fce a vrátí pole výsledných hodnot. Velikost pole input parametrem len.

  5. Napište funkci double akumulator(double (*fce)(double, double), double numbers[], int len), která zpracuje pomocí předané funkce fce hodnoty z pole numbers, jehož velikost je dána parametrem len. Můžete předpokládat, že len je vždy alespoň 2.

  6. S použitím příkladu z kapitoly vytvořte funkci pro binární vyhledávání zlomků.

  7. Do následujícího kódu doprogramujte generickou funkci pro třídění a s její pomocí funkce pro třídění zlomků a short int. (Můžete si doprogramovat libovolné pomocné funkce.) Je zakázáno použít třídicí funkci ze standardní knihovny.

    typedef struct
    {
        int numerator;
        int denominator;
    } Fraction;
    
    typedef int compare_fn(void*, void*);
    
    int compare_fraction(void *a, void *b)
    {
        // TODO
    }
    
    int compare_unsigned(void *a, void *b)
    {
        // TODO
    }
    
    void generic_sort(void *array, size_t n, size_t element_size, compare_fn* cmp)
    {
        // TODO
    }
    
    void fraction_sort(Fraction *array, int n)
    {
        // TODO
    }
    
    void unsigned_sort(unsigned int* array, int n)
    {
        // TODO
    }