#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;
}