#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
int compare (const void * a, const void * b)
{
return (int)( *(double*)a - *(double *)b );
}
int main()
{
double d_temp, // Временная переменная
*m; // Наш массив
int size, // Размер массива
i; // Счетчик
printf ("Programma sortirovki i analiz sortirovki\n\n");
// Приглашение ввести размерность массива
printf ("Vvedite razmernost' massiva:");
scanf ("%lf", &d_temp);
// Проверка введенных данных
while ((d_temp<1) || (fabs(d_temp-ceil(d_temp))>1.e-32))
{
printf ("Vvedite razmernost' massiva:");
scanf ("%lf", &d_temp);
}
size=(int)d_temp;
// Если размерность массива равен 1
if (size==1)
{
printf ("Oshibka: sortirovat' nechego\n");
return 0;
}
// Выдиление динамической памяти для массива
m=(double*)malloc(size*sizeof(double));
// Инициализация генератора случайных чисел
srand((unsigned)time(NULL));
// Наполнение динамической памяти элементами (от -10 до 10) и выводы их значений
for (i=0; i<size; i++)
{
m=(double)rand()/(RAND_MAX+1)*20-10;
printf ("m[%d]=%lf\n", i, m);
}
// Начало
qsort(m, size, sizeof(double), compare);
printf ("\n");
for (i=0; i<size; i++)
{
printf ("m[%d]=%lf\n", i, m);
}
free(m);
return 0;
}
Функция qsort сортирует не полностью верно
Код:
Теоретически программа должна выводить сначала начальные данные, затем вывести данные по возрастанию. Но qsort сортирует "не полостью верно". Пример результата:
m[0]=-9.783325
m[1]=-7.217407
m[2]=-8.132935
m[3]=-3.205566
m[4]=-1.138306
m[5]=-2.065430
m[6]=0.677490
m[7]=0.004272
m[8]=1.956177
m[9]=1.948242
m[10]=1.348267
m[11]=4.169312
m[12]=4.981689
m[13]=6.091309
m[14]=7.343140
Вопрос: Такое получается из-за неверного вызова функции qsort или сама функция является "ненадежной"?
ЗЫ: Извиняюсь, что не там создал тему. Это одно из заданий лабы по программированию. Можно было создавать в "C/C++/C# - общие вопросы".
Цитата: Bonez92
Теоретически программа должна выводить сначала начальные данные, затем вывести данные по возрастанию. Но qsort сортирует "не полостью верно". Пример результата:
m[0]=-9.783325
m[1]=-7.217407
m[2]=-8.132935
m[3]=-3.205566
m[4]=-1.138306
m[5]=-2.065430
m[6]=0.677490
m[7]=0.004272
m[8]=1.956177
m[9]=1.948242
m[10]=1.348267
m[11]=4.169312
m[12]=4.981689
m[13]=6.091309
m[14]=7.343140
Вопрос: Такое получается из-за неверного вызова функции qsort или сама функция является "ненадежной"?
Проблема в вашей функции compare, которую вы используете в функции qsort:
Код:
int compare (const void * a, const void * b)
{
return (int)( *(double*)a - *(double *)b );
}
{
return (int)( *(double*)a - *(double *)b );
}
Для сравнения чисел, вы делаете вычитание двух чисел double, и результат вычитания преобразуете в int. Если разность двух чисел будет больше нуля и меньше единицы, то при преобразовании в int получится ноль и функция compare соответственно вернет 0, что для функции qsort означает, что два сравниваемых при сортировке числа равны. И соответственно перестановку этих чисел она не произведет.
Возможно, что то же самое будет, если разность будет больше -1 но меньше нуля, но не уверен.
Вам нужно переписать compare - вместо простого cast в int результата вычитания double, сделать более сложную проверку.
Код:
int compare (const void * a, const void * b)
{
if ((*(double*)a-*(double *)b)>0)
{
return 1;
}
if ((*(double*)a-*(double *)b)<0)
{
return -1;
}
return 0;
}
{
if ((*(double*)a-*(double *)b)>0)
{
return 1;
}
if ((*(double*)a-*(double *)b)<0)
{
return -1;
}
return 0;
}
Так массив сортируется полностью.
Теперь я более менее понял про роль такой функции.
Ghox - выражаю благодарность за ваш ответ.