簡體   English   中英

比較浮點數組中的值時出錯

[英]Error when comparing values in float array

我做了一個程序,以數組結構的形式計算和存儲數據,在代碼的最后,我會找到速度最慢的車牌。部分”。

它顯示類似這樣的東西 最慢的速度 = 0.000000 汽車 = 6954000

最快速度 = 300.000000 Car = 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);




    }

//-------------------------------

“這很奇怪,因為‘最快的’可以工作,但最慢的卻不能”

您的代碼可能會調用未定義的行為 繼續閱讀...

數組:

   struct Car car[10];

定義一個具有 10 個元素的數組,並且因為 C arrays 是從零開始的),它們的索引范圍是 0 - 9。不是 1 - 10。所以語句:

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

在“n == 10”處達到索引超出范圍,它將嘗試寫入不屬於您的進程的 memory。 請注意,盡管這將在沒有警告的情況下編譯,甚至可能工作一段時間,但它總是有可能在運行時調用未定義的行為,從而導致您的程序無緣無故地崩潰。

改成:

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

注意:同樣的錯誤出現在兩個地方。 對兩者應用相同的編輯。

旁白:關於以下初始化:

     float minn = car[0].speed;

我建議使用顯式較大的值,以保證在第一次測試期間觸發最小值,例如:

  float minn = 200.0f;   

因為這個值超出了 minn 測量的任何可能值的范圍,因此強制第一個測試為 maxx 初始化創建一個新的相似值。 例如;

 float maxx = -1.0f;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM