比较浮点数组中的值时出错
Error when comparing values in float array
我做了一个程序,以数组结构的形式计算和存储数据,在代码的最后,我会找到速度最慢和最大的车牌speed.BUT我遇到了一个奇怪的输出对于“找到最慢的车段”。
它显示了这样的东西
最慢速度 = 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);
}
//-------------------------------
“这很奇怪,因为“最快”可以工作,但最慢的就不能工作”。
您的代码可能会调用 undefined behavior。继续阅读...
数组:
struct Car car[10];
定义一个有 10 个元素的数组,因为 C 数组是从零开始的),它们的索引范围是 0 - 9。而不是 1 - 10。所以语句:
for (n=1;n<=10;n++){
在 'n == 10' 达到 索引超出范围 ,它将尝试写入不属于您的进程的内存。请注意,尽管这将在没有警告的情况下编译,甚至可能 出现 工作一段时间,但它始终有可能在 运行 时调用 undefined behavior,导致您的程序崩溃,似乎没有任何原因。
更改为:
for (n=0;n<10;n++){
注意:同样的错误出现在两个地方。对两者应用相同的编辑。
旁白:关于以下初始化:
float minn = car[0].speed;
我建议使用一个明确较大的值,这样它可以保证在第一次测试期间触发最小值,例如:
float minn = 200.0f;
因为这个值超出了将为 minn 测量的任何可能值的范围,因此迫使第一个测试进行新的测试
与 maxx 初始化类似。例如;
float maxx = -1.0f;
我做了一个程序,以数组结构的形式计算和存储数据,在代码的最后,我会找到速度最慢和最大的车牌speed.BUT我遇到了一个奇怪的输出对于“找到最慢的车段”。
它显示了这样的东西 最慢速度 = 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);
}
//-------------------------------
“这很奇怪,因为“最快”可以工作,但最慢的就不能工作”。
您的代码可能会调用 undefined behavior。继续阅读...
数组:
struct Car car[10];
定义一个有 10 个元素的数组,因为 C 数组是从零开始的),它们的索引范围是 0 - 9。而不是 1 - 10。所以语句:
for (n=1;n<=10;n++){
在 'n == 10' 达到 索引超出范围 ,它将尝试写入不属于您的进程的内存。请注意,尽管这将在没有警告的情况下编译,甚至可能 出现 工作一段时间,但它始终有可能在 运行 时调用 undefined behavior,导致您的程序崩溃,似乎没有任何原因。
更改为:
for (n=0;n<10;n++){
注意:同样的错误出现在两个地方。对两者应用相同的编辑。
旁白:关于以下初始化:
float minn = car[0].speed;
我建议使用一个明确较大的值,这样它可以保证在第一次测试期间触发最小值,例如:
float minn = 200.0f;
因为这个值超出了将为 minn 测量的任何可能值的范围,因此迫使第一个测试进行新的测试 与 maxx 初始化类似。例如;
float maxx = -1.0f;