Сортировка чисел типа double - C (СИ)
Формулировка задачи:
Что-то никак не получается сделать.
Не пойму, в чем проблема.
#include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <math.h> #include <string.h> #define BUF 1000 int cmp (const void *p1, const void *p2); void error(char *s); int main(int argc, char **argv) { if (argc == 1) return 1; int f, d; size_t k = BUF, i = 0; char err[] = "Can't open file\n", err2[] = "Not enough memory\n"; double *a; if ((f = open(argv[1], O_RDONLY)) < 0) error(err); a = malloc(k*sizeof(double)); if (a == NULL) error(err2); while ((d = read(f, &a[i], BUF*sizeof(double))) > 0) { i += (size_t) d/sizeof(double); if (i == k) { k += BUF; a = realloc(a, k*sizeof(double)); if (a == NULL) error(err2); } } qsort(a, i, sizeof(double), cmp); for (size_t j = 0; j < i; j++) write(1, &a[j], sizeof(double)); free(a); close(f); return 0; } int cmp (const void *p1, const void *p2) { double a = *(double *) p1, b = * (double *) p2; if (fabs(a) > fabs(b)) return 1; if (fabs(a) < fabs(b)) return -1; if (a > 0) return -1; else return 1; } void error(char *s) { write(2, s, strlen(s)); exit(1); }
Решение задачи: «Сортировка чисел типа double»
textual
Листинг программы
int cmp (const void *p1, const void *p2) { double a = *(const double *) p1, b = *(const double *) p2; double abs_a = fabs(a), abs_b = fabs(b); if (abs_a > abs_b) return -1; if (abs_a < abs_b) return 1; if (a > b) return -1; if (a < b) return 1; return 0; }
Объяснение кода листинга программы
В представленном коде реализована функция сравнения, которая будет использоваться в алгоритме сортировки. Эта функция сравнивает два числа типа double и возвращает значение меньше 0, если первое число больше второго, значение больше 0, если второе число больше первого, и 0, если числа равны. Вот список действий, которые выполняются в этой функции:
- Получение указателей на два числа типа double, которые нужно сравнить.
- Приведение этих указателей к типу const double*, чтобы обеспечить константность.
- Вычисление абсолютного значения первого числа с помощью функции fabs().
- Вычисление абсолютного значения второго числа с помощью функции fabs().
- Сравнение полученных абсолютных значений. Если первое число больше второго, функция возвращает -1.
- Если первое число меньше второго, функция возвращает 1.
- Если абсолютные значения чисел равны, функция сравнивает сами числа. Если первое число больше второго, функция возвращает -1.
- Если первое число меньше второго, функция возвращает 1.
- Если числа равны, функция возвращает 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д