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

C 語言:輸入 10 數找最小值並輸出鄰近元素——邊界檢查與指標修正

     編輯:程式設計綜合問答

題目要求:從鍵盤輸入 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,避免多次遍歷。

關鍵學習點總結

  1. 初始化所有索引變數:int index = 0; 防止未定義行為。
  2. 比較邏輯要正向:if (current < min) 而非 if (min < fixed)。
  3. 陣列存取必須做邊界檢查:首尾元素無左/右鄰,需分支處理。
  4. 函式參數用指標 + 長度:void func(double *arr, int n) 通用且避免退化為指標失去大小資訊。

修正上述三點,程式即能穩定正確運行,不再出現「Bounds error」或輸出錯誤鄰近值。

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