Я сделал программу, которая вычисляет и сохраняет данные в виде структуры массива, и в конце кода я найду номер автомобиля с самой медленной и максимальной скоростью. НО я столкнулся со странным выводом для «найти самый медленный автомобиль». раздел".
это показывает что-то вроде этого Самая низкая скорость = 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++){
(<=
--> <
)
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
«Это странно, потому что «самый быстрый» может работать, а самый медленный просто не может».
Ваш код, вероятно, вызывает неопределенное поведение. Читай дальше...
Массив:
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?
когда мы array[10]
начальный элемент сохраняется в 0, а последний элемент сохраняется в 9, поэтому от 0 до 9 дает 10 элементов, что касается циклов, которые вы можете использовать for(int i =0; i<10; i++)
в этом случае
Студент @siah yih Hoong - индексирование в C основано на нуле. Таким образом, в вашем примере может храниться 10 элементов массива с индексами от 0 до 9.
ОТ: относительно: float maxx = -1.0;
и float minn = 200.0;
-1.0
и 200.0
являются double
литералами. Должно быть: -1.0f
и 200.0f
@ user3629249 - Хороший звонок. Отредактировано. Спасибо .
for (n=1;n<=10;n++){
должен начинаться с 0