Сортировка чисел типа 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, если числа равны. Вот список действий, которые выполняются в этой функции:

  1. Получение указателей на два числа типа double, которые нужно сравнить.
  2. Приведение этих указателей к типу const double*, чтобы обеспечить константность.
  3. Вычисление абсолютного значения первого числа с помощью функции fabs().
  4. Вычисление абсолютного значения второго числа с помощью функции fabs().
  5. Сравнение полученных абсолютных значений. Если первое число больше второго, функция возвращает -1.
  6. Если первое число меньше второго, функция возвращает 1.
  7. Если абсолютные значения чисел равны, функция сравнивает сами числа. Если первое число больше второго, функция возвращает -1.
  8. Если первое число меньше второго, функция возвращает 1.
  9. Если числа равны, функция возвращает 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.385 из 5
Похожие ответы