題目要求:從鍵盤輸入 10 個 double 數,找出最小值並輸出其左右相鄰的數。原始代碼存在最小值判斷邏輯反轉、索引未初始化、邊界未檢查導致非法記憶體存取三大問題。以下給出修正版與詳細解析。
| 問題 | 原代碼 | 後果 |
|---|---|---|
| 最小值判斷反了 | if (min < a[0]) 應為 if (a[i] < min) | 永遠不更新 min,index 保持 0 |
| index 未初始化 | int index; 無初值 | 若最小值在第 0 位以外,讀取垃圾值導致野指標 |
| 邊界不檢查直接存取 | a[index-1]、a[index+1] | 最小值在首尾時存取 a[-1] 或 a[10],觸發段錯誤 |
#include
void findMinAndNeighbors(double *arr, int n) {
if (n <= 0) return;
int index = 0; // ✅ 初始化
double min = arr[0];
for (int i = 1; i < n; ++i) { // 從 1 開始比較
if (arr[i] < min) { // ✅ 正確判斷
min = arr[i];
index = i;
}
}
printf("最小值: %.2f (索引 %d)\n", min, index);
// ✅ 邊界檢查:分三種情況輸出
if (index == 0) {
printf("右鄰: %.2f\n", arr[1]);
} else if (index == n - 1) {
printf("左鄰: %.2f\n", arr[index - 1]);
} else {
printf("左鄰: %.2f 右鄰: %.2f\n", arr[index - 1], arr[index + 1]);
}
}
int main() {
const int N = 10;
double a[N];
printf("請輸入 %d 個數字:\n", N);
for (int i = 0; i < N; ++i) {
scanf("%lf", &a[i]);
}
findMinAndNeighbors(a, N);
return 0;
}
請輸入 10 個數字:
5.5 2.1 8.9 2.1 3.0 7.2 1.5 9.0 4.4 6.6
最小值: 1.50 (索引 6)
左鄰: 7.20 右鄰: 9.00
若後續需求擴展為「輸出最小值及其前後兩個數」,可在同一迴圈維護 min1, idx1, min2, idx2,避免多次遍歷。
int index = 0; 防止未定義行為。if (current < min) 而非 if (min < fixed)。void func(double *arr, int n) 通用且避免退化為指標失去大小資訊。修正上述三點,程式即能穩定正確運行,不再出現「Bounds error」或輸出錯誤鄰近值。