首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言計算球體積:標準輸入流處理、球體積公式與浮點格式化輸出

     編輯:關於C語言

球體積計算:從數學公式到 C 語言工程化實現

給定球半徑 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;
}

三、 關鍵技術點深度解析

1. scanf("%lf", &r) 返回值與 EOF 判斷

  • scanf 返回成功匹配並賦值的項數。此處期望 1,若返回 EOF (通常為 -1) 表示輸入流結束或讀取錯誤。
  • while (scanf("%lf", &r) == 1) 等價且語義更清晰(明確表示「成功讀取一個」)。
  • 交互式終端輸入 EOF:Linux/macOS Ctrl+D,Windows Ctrl+Z 後按 Enter。

2. 浮點除法陷阱: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... (浮點除法)
// 公式中必須保證至少一個操作數為浮點數

3. pow(r, 3) vs r*r*r`

  • pow() 通用冪函數,處理非整數指數,有函數調用開銷,極簡情況下精度略差。
  • r*r*r 編譯器優化為兩次乘法指令,更快、精度更高、無庫依賴。推薦寫法:
double volume = (4.0/3.0) * PI * r * r * r;

4. 格式化輸出 %.3lf` vs %.3f`

  • printf 系列:%f、%lf、%Lf 均輸出 double(float 會默認提升為 double)。%lf 是 C99 引入的兼容 scanf 的語法,%f 更通用。
  • scanf 系列:必須區分 %f (float*)、%lf (double*)、%Lf (long double*),錯誤導致內存越界/數據錯誤。

四、 進階優化與健壯性增強

1. 使用更高精度的 π

#define PI acos(-1.0)  // 編譯期常量(現代編譯器優化),精度達 double 極限
// 或 #include  使用 M_PI (需 _USE_MATH_CONSTANTS 或 _GNU_SOURCE)

2. 輸入驗證與錯誤處理

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;
    }
    // 計算並輸出
}

3. 大數據場景:快速 IO

// 關閉同步流,使用無鎖讀寫
// int main() { ios::sync_with_stdio(false); cin.tie(nullptr); ... } // C++ 專用
// C 語言可用 fread/fwrite 大塊讀寫,或 getchar_unlocked (非標準) 逐字符解析

五、 測試用例

輸入輸出說明
14.1894/3*π*1 ≈ 4.18879 → 4.189
2.565.4504/3*π*15.625 ≈ 65.4498 → 65.450
00.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 標準輸出。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved