Объединить функции в одну

Хотел объединить функции maximum и minimum в одну, получилась minmax. Но в итоге все поломалось и не могу понять, что не так.

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#define swap(a, b) { int t = (a); (a) = (b); (b) = t; }
#define N 10
 
void gen_mass (int a[], int size);
void print_mass (int a[], int size);
void minmax (int a[], int size, int *pmin, int *pmax);
//int maximum (int a[], int size);
//int minimum (int a[], int size);
int sort_mass (int a[], int size, int (* get_position) (int a[], int size, int *pmin, int *pmax));
 
int main () {
    int a[N], minp, maxp;
    gen_mass(a, N);
    print_mass(a, N);
    // minp = minimum(a, N); было
    // maxp = maximum(a, N); было
    minmax(a, N, &min_pos, &max_pos);
    if (minp < maxp) {
        sort_mass(a, minp, minmax); // было (a, minp, maximum)
        sort_mass(a+minp+1, maxp-minp, minmax); // было (a+minp+1, maxp-minp, minimum)
        sort_mass(a+maxp+1, N-maxp-1, minmax); // было (a+maxp+1, N-maxp-1, maximum)
    }
    else {
        sort_mass(a, maxp, minmax); // было(a, maxp, minimum)
        sort_mass(a+maxp+1, minp-maxp, minmax); // было (a+maxp+1, minp-maxp, maximum)
        sort_mass(a+minp+1, N-minp-1, minmax); // было (a+minp+1, N-minp-1, minimum)
    }
    
 
    print_mass(a, N);
    return 0;
}
 
void gen_mass (int a[], int size) {
    int i = 0;
    for (; i < size; i++)
        scanf("%d", &a[i]);
}
 
void print_mass(int a[], int size) {
    int i = 0;
    for (; i < size; i++)
        printf("%d ", a[i]);
    printf("\n");
}

/* хотел заменить(объединить) эти две функции
int minimum (int a[], int size) {
    int pos = 0, i;
    for (i = 1; i < size; i++) 
        if (a[i] < a[pos])
            pos = i;
    return pos;
}

int maximum (int a[], int size) {
    int pos = 0, i;
    for (i = 1; i < size; i++) 
        if (a[i] > a[pos])
            pos = i;
    return pos;
}
*/

// на эту функцию
int minmax (int a[], int size, int *pmin, int *pmax) {
    int pos_min = 0, pos_max = 0, i = 1;
    for (; i < size; i++)
        if (a[i] < a[pos_min])
            pos_min = i;
        else if (a[pos_max] < a[i])
            pos_max = i;
    *pmin = pos_min;
    *pmax = pos_max;
}

int sort_mass (int a[], int size, int (* get_position) (int a[], int size, int *pmin, int *pmax)) {
    int pos, i=0, t, minp, maxp;
    for (; i < size; i++) {
        pos = i + get_position(a + i, size - i, minp, maxp);
        swap(a[i], a[pos]);
    }
    return minp, maxp;
}

Ответы (1 шт):

Автор решения: AlexGlebe

Задача из комментария

Дан массив, найти максимум и минимум. Расположить элементы массива таким образом, чтобы к максимуму они возрастали, а к минимуму убывали. Положение максимального и минимального элементов изменять запрещено, их расположение в массиве может быть любым. Максимум и минимум могут быть только в единственном экземпляре

говорит, что сортировка должна быть между двумя точками экстремума. Возвращаете назад функции minimum и maximum. И передаёте для функции сортировки. Как и было изначально.

minmax(a, N, &minp, &maxp);
if (minp < maxp)
    sort_mass(a+minp+1, maxp-minp, minimum);
else 
    sort_mass(a+maxp+1, minp-maxp, maximum);

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#define swap(a, b) { int t = (a); (a) = (b); (b) = t; }
#define N 10
 
void gen_mass (int a[], int size);
void print_mass (int a[], int size);
void minmax (int a[], int size, int *pmin, int *pmax);
int maximum (int a[], int size);
int minimum (int a[], int size);
void sort_mass (int a[], int size, int (* fun) (int a[], int size));
int main () {
    srand(time(NULL));
    int a[N], minp, maxp;
    gen_mass(a, N);
    print_mass(a, N);
    minmax(a, N, &minp, &maxp);
    printf("minp = %d , maxp = %d\n",minp,maxp);
    if (minp < maxp)
        sort_mass(a+minp+1, maxp-minp, minimum); 
    else 
        sort_mass(a+maxp+1, minp-maxp, maximum); 
    print_mass(a, N);
    return 0;
}
 
void gen_mass (int a[], int size) {
    int i = 0;
    for (; i < size; i++)
      a[i]=rand()%10000-5000;
        //scanf("%d", &a[i]);
}
 
void print_mass(int a[], int size) {
    int i = 0;
    for (; i < size; i++)
        printf("%d ", a[i]);
    printf("\n");
}

// хотел заменить(объединить) эти две функции
int minimum (int a[], int size) {
    int pos = 0, i;
    for (i = 1; i < size; i++) 
        if (a[i] < a[pos])
            pos = i;
    return pos;
}

int maximum (int a[], int size) {
    int pos = 0, i;
    for (i = 1; i < size; i++) 
        if (a[i] > a[pos])
            pos = i;
    return pos;
}

// на эту функцию
void minmax (int a[], int size, int *pmin, int *pmax) {
    int pos_min = 0, pos_max = 0, i = 1;
    for (; i < size; i++)
        if (a[i] < a[pos_min])
            pos_min = i;
        else if (a[pos_max] < a[i])
            pos_max = i;
    *pmin = pos_min;
    *pmax = pos_max;
}

void sort_mass (int a[], int size, int (* get_position) (int a[], int size)) {
    int pos, i=0;
    for (; i < size; i++) {
        pos = i + get_position(a + i, size - i);
        swap(a[i], a[pos]);
    }
}
→ Ссылка