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

C語言二維數組輸入與行最大值查找的常見錯誤分析

     編輯:C 語言問答

前言

在學習 C 語言時,二維數組的輸入、遍歷以及查找每行最大值是基礎且關鍵的練習。然而,初學者往往會在數組下標的使用、循環變量的作用域以及輸入輸出格式上犯錯。本文通過一個典型的錯誤示例,詳細分析常見問題並給出正確的實現方案。

錯誤代碼回顧

#define M 3
#define N 5
#include <stdio.h>
void main()
{
    int a[M][N];
    int i, j, k, t;
    for(i=0; i<M; i++){
        for(j=0; j<N; j++){
            scanf("%d", &a[M][N]);  // 錯誤 1
        }
    }
    for(i=0; i<M; i++){
        k=1;
        for(j=1; j<N; j++){
            if(a[i][k] < a[i][j]) k=j;
        }
    }
    for(i=0; i<M; i++){
        printf("%d", a[i][k]);  // 錯誤 2
        printf("\n");
    }
}

主要錯誤分析

1. 數組下標錯誤:輸入時使用了常量而非循環變量

在第一組雙層循環中,scanf("%d", &a[M][N]) 應為 scanf("%d", &a[i][j])。M 和 N 是宏定義的常量(3 和 5),導致所有輸入都寫入同一個越界位置 a[3][5],不僅無法正確存儲數據,還會造成未定義行為。

2. 查找最大值邏輯缺陷:k 未在每行重置

第二組循環中,k=1 放在行循環內部是正確的,但內層循環從 j=1 開始比較,忽略了第 0 列。且比較條件 a[i][k] < a[i][j] 在 k 初始為 1 時,實際比較的是第 1 列與後續列,導致第 0 列永不參與比較。正確做法是初始化 k=0,內層循環從 j=1 開始。

3. 輸出階段使用了錯誤的列索引

第三組循環中,printf("%d", a[i][k]) 使用的 k 是上一輪行循環結束後留下的值(即最後一行的最大值列索引),並非當前行 i 的最大值列。應在查找最大值後立即輸出,或將每行的最大值列索引存入另一個數組。

正確代碼示例

#include <stdio.h>
#define M 3
#define N 5

int main() {
    int a[M][N];
    int i, j, k;

    // 1. 正確輸入
    printf("請輸入 %d 行 %d 列的整數:\n", M, N);
    for (i = 0; i < M; i++) {
        for (j = 0; j < N; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    // 2. 查找並輸出每行最大值
    for (i = 0; i < M; i++) {
        k = 0;                    // 假設第 0 列最大
        for (j = 1; j < N; j++) { // 從第 1 列開始比較
            if (a[i][k] < a[i][j]) {
                k = j;            // 記錄最大值所在列
            }
        }
        printf("第 %d 行最大值:%d (位於第 %d 列)\n", i, a[i][k], k);
    }
    return 0;
}

總結與建議

  • 下標檢查:輸入/輸出數組元素時,務必使用循環變量作為下標,避免誤用常量或錯誤變量。
  • 初始化位置:查找最值時,初始化假設的最值索引應在外層循環內部,確保每行/每列獨立計算。
  • 邊界條件:內層循環起始索引應為 0 或 1,視初始化策略而定,確保所有元素均被比較。
  • 即時輸出或存儲:查找結果最好在內層循環結束後立即使用,避免變量被後續循環覆蓋。

掌握這些細節,能幫助你編寫出更健壯、正確的 C 語言程序。

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