Цифры после десятичной точки исчезают после сортировки - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь сделать алгоритм сортировки пузырьков.Однако при вводе некоторых чисел с плавающей точкой (тип double) после десятичной точки исчезают цифры.

#include <stdio.h>
#include <stdbool.h>

void bubbleSort(double numbers[], int SIZE);

int main(int argc, char** argv)
{
    const int SIZE = 10;
    double numbers[SIZE];

    // read in SIZE numbers
    printf("Please enter %d numbers: ", SIZE);
    for (int i = 0; i < SIZE; i++)
    {
        scanf("%lf", &numbers[i]);
    }

    // print array contents
    for (int i = 0; i < SIZE; i++)
    {
        printf("%lf ", numbers[i]);
    }
    printf("\n");

    bubbleSort(numbers, SIZE);
    for (int i = 0; i < SIZE; i++)
    {
        printf("%.2f ", numbers[i]);
    }
}

void bubbleSort(double numbers[], int SIZE)
{
    int swap = 0;
    bool isSorted = false;
    int lastUnsorted = SIZE - 1;
    while (!isSorted)
    {
        isSorted = true;
        for (int i = 0; i < lastUnsorted; i++) {
            if (numbers[i]> numbers[i + 1])
            {
                swap = numbers[i];
                numbers[i] = numbers[i + 1];
                numbers[i + 1] = swap;
                isSorted = false;
            }
        }
        lastUnsorted--;
    }
}

Ниже приведен пример.

Please enter 10 numbers: 5.4 4.1 0.0 -1.5 2.7 9.8 -2.2 3.3 4.1 8.1
-2.200000 -1.000000 0.000000 2.000000 3.300000 4.000000 4.100000 5.000000 8.100000 9.000000
--------------------------------
Process exited after 17.78 seconds with return value 0
Press any key to continue . . .

Как видите, некоторые цифры отображаются как введенные.но другие видятся по-другому.например) Я ввел 9.8, но это выглядит как 9.000000.

Можете ли вы сказать мне, что я сделал не так?

Ответы [ 2 ]

5 голосов
/ 28 сентября 2019

Тип вашей переменной swap (в настоящее время int) должен соответствовать типу значений, которые вы меняете (в настоящее время double)

Так что каждый раз, когда вы меняете два значения, то, котороеприсваивается swap в настоящее время понижается до типа int.

0 голосов
/ 28 сентября 2019

Проблема в том, как вы меняете местами.Вы приводите double к int (вашей переменной подкачки), что может привести к неопределенному поведению.

Стандарт C, 6.3.1.4, пункт 1, говорит:

КогдаКонечное значение реального плавающего типа преобразуется в целочисленный тип, отличный от _Bool, дробная часть отбрасывается (т. е. значение усекается до нуля).Если значение интегральной части не может быть представлено целочисленным типом, поведение не определено.

Таким образом, в вашем входном случае результатом является потеря точности.

Просто изменитетип переменной подкачки, соответствующий типу чисел, которые вы сортируете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...