【问题标题】:Error when comparing values in float array比较浮点数组中的值时出错
【发布时间】:2021-03-23 03:10:34
【问题描述】:

我做了一个程序,以数组结构的形式计算和存储数据,在代码的最后,我会找到速度最慢和速度最大的车牌。但是我遇到了一个奇怪的“find”输出最慢的车段”。

它显示了这样的东西 最慢速度 = 0.000000 汽车 = 6954000

最快速度 = 300.000000 汽车 = 13 进程返回 9 (0x9) 执行时间:24.881 s 按任意键继续。

//这很奇怪,因为“最快的”可以工作,但最慢的却不能//

#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&lt;=10;n++){ 应该从 0 开始
  • 你在循环中做所有事情,而不是先读取条目,然后编写算法以找到慢速和快速
  • 使用for (n=1;n&lt;10;n++){ (&lt;= --> &lt;)
  • OT:关于:if (car[n].speed&lt; 70){}else if (car[n].speed&gt;=70 &amp;&amp; car[n].speed&lt;110){ 变量speedfloat,这些语句将float 值与int 值进行比较。建议:if (car[n].speed&lt; 70.0f){}else if (car[n].speed&gt;=70.0f &amp;&amp; car[n].speed&lt;110.0f){ 将文字声明为具有类型 float

标签: arrays c if-statement structure


【解决方案1】:

“这很奇怪,因为“最快的”可以工作,但最慢的却不能”

您的代码可能会调用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;

【讨论】:

  • 但我有 10 个数据要存储,我应该更改为
  • 当我们array[10] 开始元素存储在 0 并且最后一个元素存储在 9,所以 0 到 9 给出 10 个元素,至于循环你可以使用 for(int i =0; i&lt;10; i++) 在这种情况下
  • @siah yih Hoong 学生 - C 中的索引是从零开始的。因此,在您的示例中,10 值可以存储索引为 0 到 9 的数组元素
  • OT:关于:float maxx = -1.0;float minn = 200.0; -1.0200.0double 文字。应该是:-1.0f200.0f
  • @user3629249 - 好电话。已编辑。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多