2009年3月16日 星期一

[C++]攝氏溫度轉華氏溫度

這是給學生的一個簡單的作業題目,但很多學生卡在公式的寫法,會產生誤差。

double c;  // 攝氏溫度
double f;  // 華氏溫度

cin >> c;
f=9/5*c+32;

cout << "攝氏 " << c << " 度 = 華氏 " << f << "";

上面的程式,若由鍵盤輸入 37 指派給變數 c ,則運算後,變數 f 的值為 69 ,而不是正確答案 98.6 。可是,若把計算 f 的計算式寫成如下:

f=c*9/5+32;

則可以得到正確的計算結果。為什麼呢?

上課時有教,若算術運算子的優先順序相同,則一律要由左而右運算。還有一個重點,兩個整數相除,求的是整數除法的商,不會有小數以下的部份。

所以,第一個算式 f=9/5*c+32=1*c+32=c+32 ;第二個算式 f=c*9/5+32 ,因為變數 c 為 double 型別,所以先做 c*9 時,就已經是 double 型別的運算結果了,再來 double 與整數 5 相除則會得到 double 的運算結果,所以答案是正確的。

其實第一種寫法有個變通的地方,將運算式改寫如下:

f=9.0/5*c+32;

強迫數值常數使用浮點數,計算結果自然就正確了。

4 則留言:

  1. 何不強迫其做 casting 呢?例如

    f = (double)c * 9 / 5 + 32;

    如此一來 c 會被 cast 到 double,接下來的運算只要其中一項是 double 就會被 cast 到 double,也就不會有錯了 (?)

    casting 好像對於 C 初學者是比較困難的? XD

    回覆刪除
  2. hi chitsaou:

    變數 c 原本就宣告為 double 了, f=c*9/5+32 本來就會有正確的運算結果。會出問題的是 f=9/5*c+32 哦!

    回覆刪除
  3. 啊 不好意思眼睛塗到蛤仔肉了 :p

    回覆刪除
  4. 大大你好

    我很困擾

    想請問我key的哪裡錯了


    /* my_program.c */
    #include
    #include
    int main(void)
    {
    float x,y;
    /*攝氏c=x 華氏f=y*/
    printf("輸入你想要的攝氏(c)溫度: x= ");

    scanf("%d" ,&x);

    y=(x+32)*9/5; /*華氏溫度 y=(9/5)*(x 攝氏溫度 +32)*/

    printf("轉換的華氏(F)溫度y為: y= %4.2f\n",y);

    system("pause");
    return 0;
    }

    回覆刪除