Ошибка при сравнении значений в массиве с плавающей запятой

Я сделал программу, которая вычисляет и сохраняет данные в виде структуры массива, и в конце кода я найду номер автомобиля с самой медленной и максимальной скоростью. НО я столкнулся со странным выводом для «найти самый медленный автомобиль». раздел".

это показывает что-то вроде этого Самая низкая скорость = 0,000000 Автомобиль = 6954000

Максимальная скорость = 300.000000 Автомобиль = 13 Процесс вернул 9 (0x9) время выполнения: 24,881 с Нажмите любую клавишу для продолжения.

//странно, потому что "самый быстрый" может работать, а самый медленный просто не может//

#include <stdio.h>

struct Car
{
    int plate;
    float time,distance,speed;

};

int main ()
{
    int n;
    struct Car car[10];
    int fcar,scar;
    for (n=1;n<=10;n++){

        printf ("\nPlate = ");
        scanf("%d",&car[n].plate);

        printf ("Distance = ");
        scanf("%f",&car[n].distance);

        printf ("Time = ");
        scanf("%f",&car[n].time);

        (car[n].speed) = (car[n].distance)/(car[n].time);
        printf ("Speed = %f",car[n].speed);
//-----------------------------------------------------------------//
        if (car[n].speed< 70){
            printf("\nSlow\n");

        }else if (car[n].speed>=70 && car[n].speed<110){
            printf("\nNormal\n");

        }else{
            printf("\nFast\n");

        }

        printf("-----------------------------------------------------");
    }


    float minn = car[0].speed;
    for (n=1;n<=10;n++){
        if ( car[n].speed < minn){
            minn = car[n].speed;
            scar = car[n].plate;
        }
    }
   printf("\n\nSlowest speed = %f",minn);
    printf("\nCar = %d",scar);

    float maxx = car[0].speed;
    for (n=1;n<=10;n++){
        if ( car[n].speed > maxx){
            maxx = car[n].speed;
            fcar = car[n].plate;
        }
    }
   printf("\n\nFastest speed = %f",maxx);
    printf("\nCar = %d",fcar);




    }

//-------------------------------
for (n=1;n<=10;n++){ должен начинаться с 0
IrAM 11.12.2020 18:20

вы делаете все в цикле, вместо этого сначала читаете записи, а затем пишете алгоритм, чтобы найти медленную и быструю скорость

IrAM 11.12.2020 18:40

Используйте for (n=1;n<10;n++){ (<= --> <)

chux - Reinstate Monica 11.12.2020 19:30

OT: относительно: if (car[n].speed< 70){ и }else if (car[n].speed>=70 && car[n].speed<110){ Переменная speed является float, и эти операторы сравнивают значение float со значением int. Предложите: if (car[n].speed< 70.0f){ и }else if (car[n].speed>=70.0f && car[n].speed<110.0f){, которые объявляют литералы как имеющие тип float

user3629249 13.12.2020 12:49
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
4
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

«Это странно, потому что «самый быстрый» может работать, а самый медленный просто не может».

Ваш код, вероятно, вызывает неопределенное поведение. Читай дальше...

Массив:

   struct Car car[10];

Определяет массив, содержащий 10 элементов, и поскольку массивы C основаны на нуле, они индексируются от 0 до 9, а не от 1 до 10. Таким образом, оператор:

for (n=1;n<=10;n++){

Достигает индекса за пределами в 'n == 10', где он попытается записать в память, не принадлежащую вашему процессу. Обратите внимание, что хотя это будет компилироваться без предупреждения и даже может показаться, что какое-то время работает, это всегда будет потенциал для вызова неопределенного поведения во время выполнения, что приведет к сбою вашей программы, что может показаться без причины.

Изменить на:

for (n=0;n<10;n++){

Примечание. Эта же ошибка возникает в двух местах. Примените одно и то же редактирование к обоим.

В сторону: относительно следующей инициализации:

     float minn = car[0].speed;

Я предлагаю использовать явно большое значение, чтобы оно гарантировало триггер во время первого теста на минимум, например:

  float minn = 200.0f;   

потому что это значение находится за пределами любого возможного значения, которое будет измерено для minn, и, таким образом, вынуждает первый тест сделать новый новый Аналогично для инициализации maxx. Например;

 float maxx = -1.0f;

но у меня есть 10 данных для хранения, следует ли изменить на <11?

brian 11.12.2020 18:42

когда мы array[10] начальный элемент сохраняется в 0, а последний элемент сохраняется в 9, поэтому от 0 до 9 дает 10 элементов, что касается циклов, которые вы можете использовать for(int i =0; i<10; i++) в этом случае

IrAM 11.12.2020 18:51

Студент @siah yih Hoong - индексирование в C основано на нуле. Таким образом, в вашем примере может храниться 10 элементов массива с индексами от 0 до 9.

ryyker 11.12.2020 18:56

ОТ: относительно: float maxx = -1.0; и float minn = 200.0;-1.0 и 200.0 являются double литералами. Должно быть: -1.0f и 200.0f

user3629249 13.12.2020 12:55

@ user3629249 - Хороший звонок. Отредактировано. Спасибо .

ryyker 13.12.2020 18:42

Другие вопросы по теме