2017-02-18 5 views
2

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

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

Есть много решений в Интернете, поиск – Jadeye

+1

Примечания: общая идиому для 'а()' -> возвращения '(* а > * b) - (* a <* b); ' – chux

+1

C не требует всех этих приводов. Более того, они могут скрывать ошибки. Просто удалите их. – alk

ответ

3

Таким образом, объявить переменную 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); 
} 
Смежные вопросы