C-код для использования qsort() для сортировки в порядке, который пользователь хочет использовать с помощью указателей на функции

Я создаю код C для сортировки с использованием qsort(). Мне нужно получить массив от пользователя, и после этого мне нужно получить от пользователя, чтобы распечатать этот массив в порядке возрастания и d, если я хочу напечатать его в порядке убывания. Проблема в том, что мне нужно использовать указатели функций для этого. Я пытался использовать массив указателей на функции, но проблема в том, что пользователю нужно ввести два символа.

#include <stdio.h>
#include <stdlib.h>


int  a( const void *va , const void * vb )
 {
    const int * a = ( const int *) va ;
    const int * b = ( const int *) vb ;
    if (* a < *b ) return -1;
    else if (* a > * b) return 1;
    else return 0;
 }

 int  d( const void *va , const void * vb )
 {
    const int * a = ( const int *) va ;
    const int * b = ( const int *) vb ;
    if (* a < *b ) return 1;
    else if (* a > * b) return -1;
    else return 0;
 }


int main()
{
    int *arr;
    int n, i;
    char c;

    scanf("%d", &n);

    arr=(int*)malloc(sizeof(int)*n);

    for(i=0;i<n;i++)
    {
        scanf("%d", &arr[i]);
    }

    while(1)
    {
        scanf("%c", &c);
        getchar();
        if(c=='e')
            break;


        qsort ( arr , n , sizeof(arr[0]) , d);
    }

    for(i=0;i<n;i++)
    {
    printf("%d", arr[i]);
    }
    return 0;
}

1 ответ

Решение

Итак, объявите переменную указатель на функцию comparison_funcи установите его в if заявление:

int (*comparison_func)(const void *, const void *);

if (c == 'a') {
    comparison_func = a;
}
else if (c == 'c') {
    comparison_func = d;
}

затем используйте это comparison_func в вызове к qsort:

qsort(arr, n, sizeof(arr[0]), comparison_func);

или вы можете объявить struct у которого есть символ опции и соответствующий указатель:

typedef struct sortfunc {
    char option;
    int (*comparison_func)(const void *, const void *);
} SORTFUNC;

SORTFUNC sort_funcs[] = {
    {'a', a},
    {'d', d},
    {0,   0}
};

затем просмотрите этот массив и найдите соответствующий символ опции:

SORTFUNC *i;
for (i = sort_funcs; i->option && i->option != c; i++);
if (! i->comparison_func) {
    printf("choice %c is invalid\n", c);
}
else {
    qsort(..., i->comparison_func);
}
Другие вопросы по тегам