2016-04-29 2 views
0

Я пытаюсь сортировать массив типа double в C, но я не получаю ожидаемый результат. Кажется, что сортировка адресов памяти вместо фактических значений. Я попытался изменить vairables на (* grade [i]), но затем я получаю «недопустимый аргумент типа unary *». Вот скрипп кода, о котором идет речь.Сортировка массива double в C

void sortGrade(double grade[], int n){ 
int i, j, swapped; 
double temp; 
for (i = 0; i < n; ++i) 
{ 
    for (j = i + 1; j < n; ++j) 
    { 
     if (grade[i] < grade[j]) 
     { 
      temp = grade[i]; 
      grade[i] = grade[j]; 
      grade[j] = temp; 
     }//end if 
    }//end inner for 
}//end outer for 
printf("After sort:\nGrade\n"); 
for (i = 0; i < n; ++i) 
{ 
    printf("%d\n", grade[i]); 
}//end for 
}//end sortGrade 

Любая помощь была бы принята с благодарностью. Полное раскрытие информации, это для школы, но задание уже представлено, теперь я просто пытаюсь выяснить, как на самом деле заставить его работать.

+12

Ваш алгоритм сортировки в порядке. Ошибка при печати: используйте '% f' или'% g' для печати чисел с плавающей запятой. –

+1

Трудно сказать, если вы не сообщите нам, каков ожидаемый результат. Очевидно, что вы должны включить предупреждения в свой компилятор, поэтому нам не нужен совет M Oehms. С учетом этого он будет отсортирован, но, возможно, не так, как вы ожидаете. – gnasher729

+0

И если вы отсортировали адреса памяти, то, очевидно, порядок элементов не изменился бы. Элементы массива _allways_ отсортированы по адресу памяти. – gnasher729

ответ

1

Как уже упоминалось @M Oehm, вы должны использовать %f вместо %g при печати двойных значений. Поэтому делать

printf("%f\n", grade[i]); 

вместо

printf("%d\n", grade[i]); 

Я полагаю, что цель писал алгоритм сортировки вручную. Если нет, вы можете взглянуть на qsort, предоставленный stdlib. Эта функция выполняет алгоритм сортировки быстрой сортировки.

// qsort(array pointer, number of elements, size of one element, compare function); 
qsort(grade, n, sizeof(double), compare); 

Для того, чтобы сравнить элементы, вам также нужна функция сравнения.

// the compare function for double values 
static int compare (const void * a, const void * b) 
{ 
    if (*(double*)a > *(double*)b) return 1; 
    else if (*(double*)a < *(double*)b) return -1; 
    else return 0; 
} 
0

Это должно работать:

int i, j, swapped; 
    double temp; 
    for (i = 0; i < n; ++i) 
    { 
     for (j = i + 1; j < n; ++j) 
     { 
      if (grade[i] < grade[j]) 
      { 
       temp = grade[i]; 
       grade[i] = grade[j]; 
       grade[j] = temp; 
      }//end if 
     }//end inner for 
    }//end outer for 
    printf("After sort:\nGrade\n"); 
    for (i = 0; i < n; ++i) 
    { 
     printf("%f\n", grade[i]); 
    }//end for 
    }//end sortGrade 

Алгоритм работы. Единственная ошибка была Printf:

printf("%f\n", grade[i]); //for double values 

или лучше

printf("%lf\n", grade[i]); //for double values 
Смежные вопросы