// Máximo genérico al estilo de CS201: void *, tamaños y un puntero a función.
#include <stddef.h>
#include <stdio.h>

typedef int (*compare_fn)(const void *, const void *);

const void *max_of(const void *items, size_t count, size_t size, compare_fn compare) {
    const char *bytes = items;
    const void *best = items;
    for (size_t i = 1; i < count; i++) {
        const void *item = bytes + i * size;
        if (compare(item, best) > 0) {
            best = item;
        }
    }
    return best;
}

int compare_int(const void *a, const void *b) {
    int x = *(const int *)a;
    int y = *(const int *)b;
    return (x > y) - (x < y);
}

int compare_double(const void *a, const void *b) {
    double x = *(const double *)a;
    double y = *(const double *)b;
    return (x > y) - (x < y);
}

int main(void) {
    int numbers[] = {3, 9, 4};
    const int *best = max_of(numbers, 3, sizeof numbers[0], compare_int);
    printf("%d\n", *best);

    double prices[] = {1.5, 0.25, 7.75};
    const double *top = max_of(prices, 3, sizeof prices[0], compare_double);
    printf("%.2f\n", *top);
    return 0;
}
