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

C語言鞍點問題:邏輯錯誤修正與代碼重構指南

     編輯:C 語言問答

問題定義

矩陣中的「鞍點」:該位置元素在所在行最大、所在列最小。若存在則輸出值及坐標,否則提示不存在。

原代碼四大致命傷

  1. 賦值誤寫為比較:if (flag = 0) 永真,應為 if (flag == 0);
  2. min 未初始化:直接參與比較導致未定義行為;
  3. 列最小判斷邏輯反了:if (min < a[k][maxj]) 應為 if (max > a[k][maxj]),即行最大值是否大於該列其他元素;
  4. 輸出坐標變量錯誤:用 a[j][k] 而非 a[maxi][maxj]。

修正版核心邏輯

for (i = 0; i < 3; i++) {
    max = a[i][0]; maxj = 0;
    for (j = 1; j < 3; j++)           // 找行最大值及列號
        if (a[i][j] > max) { max = a[i][j]; maxj = j; }

    flag = 0;
    for (k = 0; k < 3; k++)           // 檢查該列是否為最小
        if (max > a[k][maxj]) { flag = 1; break; }

    if (flag == 0) {                  // 找到鞍點
        printf("鞍點:%d,位置(%d,%d)\n", max, i+1, maxj+1);
        return 0;
    }
}
printf("不存在鞍點\n");

進階優化:O(n²) → O(n²) 但常數更小

預計算每行最大值及其列索引、每列最小值及其行索引,再做集合交集,代碼更清晰且易於擴展至 N×M 矩陣。

調試技巧

  • 加入中間變量打印:printf("Row %d max=%d at col %d\n", i, max, maxj);;
  • 使用斷點單步執行,觀察 flag 變化;
  • 測試用例覆蓋:多鞍點、無鞍點、邊界值相等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved