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

C語言迴圈輸入確認機制:while 迴圈實現半徑重新輸入邏輯

     編輯:C 語言問答

原始代碼問題分析


#define PI 3.1415926
#include <stdio.h>
void main() {
    float bj; float zc,mj,tj; int pd;
    scanf("%f",&bj);
    zc=2*bj*PI;
    mj=bj^2*PI;      // ^ 是位元 XOR,非冪次!
    tj=3/4*bj^3*PI;  // 3/4 整數除法 = 0,^ 為 XOR
    printf("確認輸入%f?",bj);
    printf("是否重新輸入?1是,2否.");
    scanf("%d",&pd);
    printf("輸入的半徑為:%f",bj);
    printf("周長:%f,面積:%f,體積:%f",zc,mj,tj);
    return 0;
}

三大關鍵錯誤

錯誤代碼正確寫法說明
冪次運算bj^2, bj^3bj*bj, bj*bj*bj 或 pow(bj,2)^ 是位元異或,非冪次。C 無冪次運算子。
整數除法3/43.0/4.0 或 0.753/4 兩整數相除,結果為 0。
主函數簽名void main()int main()標準要求 int main() 返回 0。

修正版:輸入確認迴圈 + 正確幾何計算


#include <stdio.h>
#include <math.h>   // 需連結 -lm

#define PI 3.14159265358979323846

int main() {
    double radius = 0.0;      // 用 double 提高精度
    int confirm = 0;
    int valid_input = 0;

    // 輸入確認迴圈:至少執行一次,直到使用者確認
    do {
        printf("請輸入圓半徑:");
        if (scanf("%lf", &radius) != 1) {  // 輸入失敗處理
            printf("輸入無效,請輸入數字。\n");
            while (getchar() != '\n');  // 清空輸入緩衝區
            continue;
        }
        if (radius < 0) {
            printf("半徑不能為負數。\n");
            continue;
        }

        printf("您輸入的半徑為:%.4f,確認無誤?(1=確認, 2=重新輸入):", radius);
        if (scanf("%d", &confirm) != 1) {
            printf("輸入無效。\n");
            while (getchar() != '\n');
            continue;
        }
        
        if (confirm == 1) {
            valid_input = 1;
        } else if (confirm == 2) {
            printf("請重新輸入。\n");
        } else {
            printf("選項無效,預設重新輸入。\n");
        }
    } while (!valid_input);

    // 幾何計算
    double circumference = 2 * PI * radius;
    double area = PI * radius * radius;
    double volume = (4.0/3.0) * PI * radius * radius * radius;  // 球體積 4/3 πr³

    printf("\n=== 計算結果 ===\n");
    printf("半徑:%.4f\n", radius);
    printf("圓周長:%.4f\n", circumference);
    printf("圓面積:%.4f\n", area);
    printf("球體積:%.4f\n", volume);

    return 0;
}

關鍵設計點解析

1. do-while 保證至少執行一次

符合「先輸入、再確認」的業務流程,比 while(flag) 更語意清晰。

2. 輸入驗證與緩衝區清理


if (scanf("%lf", &radius) != 1) { ... }
while (getchar() != '\n');  // 清除殘留非數字字元,防止無限迴圈

3. 正確的數學運算

  • 面積:PI * r * r(非 r^2)
  • 球體積:(4.0/3.0) * PI * r^3(原代碼 3/4 倒置且整數除法歸零)
  • 使用 double + %lf,精度遠優於 float

4. math.h 與連結數學庫

  • 若用 pow(r, 3) 需 #include <math.h> 並編譯加 -lm(GCC/Clang)
  • 本例直接乘法避免函數呼叫開銷與連結麻煩

編譯執行示範


$ gcc -std=c17 -Wall -Wextra -o circle circle.c
$ ./circle
請輸入圓半徑:abc
輸入無效,請輸入數字。
請輸入圓半徑:-5
半徑不能為負數。
請輸入圓半徑:2.5
您輸入的半徑為:2.5000,確認無誤?(1=確認, 2=重新輸入):2
請重新輸入。
請輸入圓半徑:3
您輸入的半徑為:3.0000,確認無誤?(1=確認, 2=重新輸入):1

=== 計算結果 ===
半徑:3.0000
圓周長:18.8496
圓面積:28.2743
球體積:113.0973

常見變體擴充

需求實作要點
限制重試次數加計數器 retry++,超過上限退出或預設值
支援 'y'/'n' 字元確認scanf(" %c", &ch),注意前導空格跳過換行
多參數同時確認結構體封裝參數,確認整個結構體
預設值機制直接按 Enter 採用預設,fgets + sscanf 解析

總結

迴圈輸入確認的核心模式:do-while + 輸入驗證 + 緩衝區清理 + 業務邏輯判斷。配合正確的數學運算(拒絕 ^、整數除法)、標準主函數、double 精度,即可寫出健壯、專業的互動式 C 程式。

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