#include #include int read_print_median(size_t size); int read_values(long double* values, size_t size); int comp(const void* const a, const void* const b); void print_array(long double values[], size_t size); int main() { int result = 0; size_t size = 0; while ( scanf("%zu", &size) != EOF ) if ( (result = read_print_median(size)) != 0 ) return result; return result; } int read_print_median(size_t size) { if ( size == 0 ) return 1; // Create an array of long doubles allocated on dynamic memory long double* const values = (long double*)malloc(size * sizeof(long double)); if ( values == NULL ) { fprintf(stderr, "median: error: not enough memory\n"); return 2; } // Read values from stdin, test they were read successfully int result = read_values(values, size); if ( result != 0 ) return result; // Sort values qsort(values, size, sizeof(long double), comp); #if defined(DEBUG) print_array(values, size); putchar('\n'); #endif long double median = 0.0; if ( size % 2 == 0 ) median = (values[size / 2 - 1] + values[size / 2]) / 2.0; else median = values[size / 2]; printf("%Lg\n", median); free(values); return 0; } int read_values(long double* values, size_t size) { for ( size_t index = 0; index < size; ++index ) if ( scanf("%Lg", values + index /*&values[index]*/) != 1 ) return 3; return 0; } int comp(const void* const a, const void* const b) { // const long double* a_ld = (const long double*)a; return *(const long double*)a - *(const long double*)b; } void print_array(long double values[], size_t size) { for ( size_t index = 0; index < size; ++index ) printf("%zu: %Lg\n", index, values[index]); }