輸入華氏溫度,按公式 C = 5/9 × (F - 32) 轉換為攝氏溫度。核心考點:整數除法截斷陷阱、浮點字面量強制類型、公式運算順序。
#include <stdio.h>
int main() {
float C, F;
printf("請輸入華氏溫度: ");
scanf("%f", &F);
C = 5.0/9 * (F - 32); // 關鍵:5.0 強制浮點除法
printf("%.3f 華氏度 = %.3f 攝氏度\n", F, C);
return 0;
}
// ❌ 錯誤寫法
C = 5/9 * (F - 32); // 5/9 = 0 (整數除法),結果恆為 0
// ❌ 錯誤寫法
C = (5/9) * (F - 32); // 同上,括號不改變整數除法
// ✅ 正確寫法 (任一)
C = 5.0/9 * (F - 32); // 5.0 是 double,提升整個表達式
C = 5.0f/9 * (F - 32); // 5.0f 是 float
C = (float)5/9 * (F - 32); // 強制轉換
C = 5/9.0 * (F - 32); // 9.0 是 double
// 方案 A: 5.0/9 * (F-32)
// 步驟: 5.0/9 → 0.555... → ×(F-32)
// 誤差: 5/9 無限循環小數,double 約 15 位精度
// 方案 B: (F-32) * 5 / 9
// 步驟: (F-32)×5 → 再除 9
// 優勢: 先乘後除,中間結果較大,相對精度略好
// 推薦: C = (F - 32) * 5.0 / 9;
| 華氏度 F | 攝氏度 C (公式) | 關鍵點 |
|---|---|---|
| 32 | 0 | 冰點 |
| 212 | 100 | 沸點 |
| -40 | -40 | 兩制相等點 |
| 98.6 | 37 | 人體正常溫度 |
| 0 | -17.777... | 華氏零度 |
float f_to_c(float f) { return (f - 32) * 5.0f / 9; }
float c_to_f(float c) { return c * 9.0f / 5 + 32; }
// 通用轉換
typedef enum { FAHRENHEIT, CELSIUS } Scale;
float convert(float temp, Scale from, Scale to) {
if (from == to) return temp;
if (from == FAHRENHEIT) return f_to_c(temp);
return c_to_f(temp);
}
// 原代碼 %3f 寬度3右對齊,小數點後6位(默認)
// 建議:
printf("%.2f °F = %.2f °C\n", F, C); // 兩位小數,人類閱讀友好
// 科學計算:
printf("%.6f °F = %.6f °C\n", F, C); // 六位小數
華氏轉攝氏是「整數除法陷阱」的經典教學案例。關鍵收穫:
5.0/9 或 5/9.0;(F-32) * 5.0 / 9 先乘後除減輕精度損失;float 足夠溫度轉換精度 (7 位有效數字);%.2f 平衡精度與可讀性。