087 字符串化和粘贴记号

#include <stdio.h>
#include <stdarg.h>

double median_odd(int n, ...)
{
    int i = n / 2;
    double m;
    va_list argptr;
    va_start(argptr, n); 
    while (i-- > 0) va_arg(argptr, double);
    m = va_arg(argptr, double);
    va_end(argptr);
    return m;
}

double median_even(int n, ...)
{
    int i = n / 2;
    double m;
    va_list argptr;
    va_start(argptr, n); 
    while (--i > 0) va_arg(argptr, double);
    m = ((va_arg(argptr, double) +
        va_arg(argptr, double)) / 2.0);
    va_end(argptr);
    return m;
}

#define MEDIAN_ODD(n, ...) \
    median_odd(n, __VA_ARGS__)
#define MEDIAN_EVEN(n, ...) \
    median_even(n, __VA_ARGS__)

#define OBJ_MEDIAN(x) MEDIAN_ ## x

#define MEDIAN_VO_TIPS(v) \
    "median of " #v " is"

int main(int argc, char *argv[])
{
    double *arr_odd = (double []){ 1.0, 3.5, 7.5 };
    double *arr_even = (double []){ 1.0, 2.5, 3.5, 7.5 };

    printf("%s %.2f\n", 
        MEDIAN_VO_TIPS(((double []){ 1.0, 3.5, 7.5 })), 
        OBJ_MEDIAN(ODD)(3, *arr_odd, *(arr_odd+1), *(arr_odd+2)));
    printf("%s %.2f\n",
        MEDIAN_VO_TIPS(((double []){ 1.0, 2.5, 3.5, 7.5 })),
        OBJ_MEDIAN(EVEN)(4, *arr_even, *(arr_even+1),
        *(arr_even+2), *(arr_even+3)));

    return 0;
}