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

C語言找最小值邏輯錯誤分析:為何結果為 min=0, row=2, col=3?

     編輯:C 語言問答

經典陷阱:每次都與第一個元素比較

以下程式碼試圖找出 3×4 矩陣中的最小值及其位置,但輸出結果錯誤:

#include <stdio.h>

int main() {
    int a[3][4] = {{1,2,3,4},{9,8,7,6},{-1,-2,3,0}};
    int i, j, row, col, min;

    min = a[0][0]; // 初始化為第一個元素
    for (i = 0; i < 3; i++)
        for (j = 0; j < 4; j++)
            if (a[i][j] < a[0][0]) { // 錯誤:永遠拿 a[0][0] 比較
                min = a[i][j];
                row = i;
                col = j;
            }
    printf("min=%d, row=%d, col=%d\n", min, row, col);
    return 0;
}

錯誤原因

條件判斷 if (a[i][j] < a[0][0]) 永遠與「固定的第一個元素」比較,而非「目前找到的最小值」。導致:

  • 若矩陣第一個元素 不是 最小值,程式仍能找到比它小的值(如範例中 -1, -2)。
  • 但若第一個元素 就是 最小值,條件永遠不成立,row、col 保持未初始化狀態(亂碼)。
  • 範例中 a[0][0]=1,比它小的有 -1, -2, 0。迴圈最後一次符合條件的是 a[2][3]=0,故輸出 min=0, row=2, col=3,真正的最小值 -2 被略過。

正確寫法

min = a[0][0];
row = 0; col = 0; // 同步記錄位置
for (i = 0; i < 3; i++)
    for (j = 0; j < 4; j++)
        if (a[i][j] < min) { // 改為與動態更新的 min 比較
            min = a[i][j];
            row = i;
            col = j;
        }

核心原則

尋找極值時,比較對象必須是「目前的極值變數」,而非固定的陣列元素。 同理適用於最大值、總和等累積運算。

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