錯誤代碼片段
do {
scanf("%lf%lf", &leftlimit, &rightlimit);
if (leftlimit > rightlimit)
printf("積分下限應該小於上限,請重新輸入:");
} while (leftlimit < rightlimit); // ❌ 條件反了
邏輯分析
- **需求**:用戶輸入下限 `leftlimit`、上限 `rightlimit`,要求 `leftlimit < rightlimit`。若輸入錯誤 (`leftlimit > rightlimit`),提示重新輸入。
- **當前代碼**:`do...while(leftlimit < rightlimit)`。
- 若用戶**正確輸入** (如 `0 10`):`leftlimit < rightlimit` 為真 → **循環繼續** → 要求重新輸入 → **陷入無限循環**。
- 若用戶**錯誤輸入** (如 `10 0`):`leftlimit < rightlimit` 為假 → **循環結束** → 程序繼續執行錯誤數據。
- **結論**:循環條件**完全相反**。
修正代碼
do {
printf("請輸入被積分函數的上限及下限 (下限 < 上限):\n");
scanf("%lf%lf", &leftlimit, &rightlimit);
if (leftlimit >= rightlimit) { // 允許等於? 通常積分上下限不相等
printf("錯誤:下限必須小於上限,請重新輸入!\n");
}
} while (leftlimit >= rightlimit); // ✅ 條件:只要不合法就繼續循環
同類邏輯錯誤避坑指南
| 意圖 | 正確 while 條件 | 口訣 |
| 輸入合法才退出 | `while (!合法條件)` | 「不合法就繼續」 |
| 輸入非法才退出 | `while (合法條件)` | 「合法就繼續」 |
完整積分程序關鍵修正點
- 上下限輸入驗證邏輯修正 (如上)。
- 劃分數 `n` 非法處理:`if (n <= 0) n = -n;` → 應為 `if (n <= 0) { printf("劃分數必須為正整數"); continue; }` 或循環讀取直到合法。
- 梯形公式實現正確:`area += h * (f(x_i) + f(x_{i+1})) / 2;`。