給定球半徑 r,計算體積 V = (4/3) * π * r³。本題考察標準輸入循環讀取(EOF 判斷)、math.h 庫函數調用、浮點精度控制與格式化輸出。
#define PI 3.1415927 // 或使用 M_PI (需 #define _USE_MATH_CONSTANTS 在 Windows/MSVC) // 體積公式:V = 4/3 * π * r^3 // 注意:4/3 在整數除法中為 1,必須用 4.0/3.0 或 4/3.0 強制浮點運算
#include#include #define PI 3.1415927 int main() { double r; // 半徑用 double 提高精度 // 循環讀取直到 EOF (Ctrl+D / Ctrl+Z) while (scanf("%lf", &r) != EOF) { double volume = (4.0 / 3.0) * PI * pow(r, 3); // %.3lf 保留三位小數,lf 在 printf 中等價於 f (C99) printf("%.3lf\n", volume); } return 0; }
scanf("%lf", &r) 返回值與 EOF 判斷scanf 返回成功匹配並賦值的項數。此處期望 1,若返回 EOF (通常為 -1) 表示輸入流結束或讀取錯誤。while (scanf("%lf", &r) == 1) 等價且語義更清晰(明確表示「成功讀取一個」)。4/3` vs 4.0/3.0`int a = 4/3; // 結果 1 (整數除法截斷) double b = 4/3; // 結果 1.0 (整數除法後隱式轉 double) double c = 4.0/3; // 結果 1.333... (浮點除法) double d = 4/3.0; // 結果 1.333... (浮點除法) // 公式中必須保證至少一個操作數為浮點數
pow(r, 3) vs r*r*r`pow() 通用冪函數,處理非整數指數,有函數調用開銷,極簡情況下精度略差。r*r*r 編譯器優化為兩次乘法指令,更快、精度更高、無庫依賴。推薦寫法:double volume = (4.0/3.0) * PI * r * r * r;
%.3lf` vs %.3f`printf 系列:%f、%lf、%Lf 均輸出 double(float 會默認提升為 double)。%lf 是 C99 引入的兼容 scanf 的語法,%f 更通用。scanf 系列:必須區分 %f (float*)、%lf (double*)、%Lf (long double*),錯誤導致內存越界/數據錯誤。#define PI acos(-1.0) // 編譯期常量(現代編譯器優化),精度達 double 極限 // 或 #include使用 M_PI (需 _USE_MATH_CONSTANTS 或 _GNU_SOURCE)
while (1) {
int ret = scanf("%lf", &r);
if (ret == EOF) break; // 正常結束
if (ret == 0) { // 非數字輸入
scanf("%*s"); // 丟棄無效 token
fprintf(stderr, "無效輸入,已跳過\n");
continue;
}
if (r < 0) { // 業務邏輯檢查
fprintf(stderr, "半徑不能為負,已跳過\n");
continue;
}
// 計算並輸出
}
// 關閉同步流,使用無鎖讀寫
// int main() { ios::sync_with_stdio(false); cin.tie(nullptr); ... } // C++ 專用
// C 語言可用 fread/fwrite 大塊讀寫,或 getchar_unlocked (非標準) 逐字符解析
| 輸入 | 輸出 | 說明 |
|---|---|---|
1 | 4.189 | 4/3*π*1 ≈ 4.18879 → 4.189 |
2.5 | 65.450 | 4/3*π*15.625 ≈ 65.4498 → 65.450 |
0 | 0.000 | 邊界值 |
1\n2\n3\n (多行) | 4.189\n33.510\n113.097\n | 循環讀取多組 |
總結:球體積計算看似簡單,實則包含輸入流循環控制、浮點除法類型提升、數學庫調用選擇、格式化輸出規範四大 C 語言核心技能點。工程中請遵循:
double存儲、4.0/3.0強制浮點、r*r*r替代pow、acos(-1.0)獲取高精度 π、scanf 返回值檢查健壯讀取、%.3f標準輸出。