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