#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^3 | bj*bj, bj*bj*bj 或 pow(bj,2) | ^ 是位元異或,非冪次。C 無冪次運算子。 |
| 整數除法 | 3/4 | 3.0/4.0 或 0.75 | 3/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;
}
do-while 保證至少執行一次符合「先輸入、再確認」的業務流程,比 while(flag) 更語意清晰。
if (scanf("%lf", &radius) != 1) { ... }
while (getchar() != '\n'); // 清除殘留非數字字元,防止無限迴圈
PI * r * r(非 r^2)(4.0/3.0) * PI * r^3(原代碼 3/4 倒置且整數除法歸零)double + %lf,精度遠優於 floatmath.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 程式。