C-矩阵-主对角线和反对角线的元素相同

时间:2020-12-23 23:03:59

标签: c matrix

你好! 我的任务是检查二次矩阵的主对角线和反对角线的元素是否相同。如果满足此条件,则应打印“是”; '不'在相反的情况下。例如,矩阵 3x3 满足条件,所有行等于:1 2 3。我的代码适用于所有矩阵,除了 带有负数的一种和尺寸为 5x5 的 4 行:1 2 3 4 5 第 5 行:1 2 3 4 6,我不知道为什么。我是初学者。希望能帮到你。

      int i,j,M,b=0,m[100][100];
      do{
      printf("Dimension of matrix: ");
      scanf("%d", &M);
      if (M<0 || M>100)
      printf("Wrong input!\n");
      }while (M<0 || M>100);
      printf("Enter the elements: ");
      
      for (i=0;i<M;i++){
      for (j=0;j<M;j++){
      scanf("%d", &m[i][j]);
       }
        }  
      for (i=0;i<M;i++){
      for (j=0;j<M;j++){
      if(m[i][j]!=m[M-(i+1)][j])
      b=0;
      else if ((i==j || i+j==M-1) && (m[i][j]==m[M-(i+1)][j]))
      b=1;
      else b=0;
 }
 }
     if(b==1)
     printf("YES");
     else printf("NO");
     }
     

2 个答案:

答案 0 :(得分:1)

正如@Bob__ 已经指出的那样,代码存在一些问题:

  1. 首先,在 C 中,数组索引从 0 开始。

  2. 此外,在您的内部循环中,在 j 上,您只读取了一个条目,但随后您尝试将对角条目与您尚未读入的反对角条目进行比较。您可能想先读入整个矩阵,然后在单独的循环中检查对角线和反对角线是否相同。

for (i=0; i < M; i++){
    for (j = 0; j< M; j++){
      scanf("%d", &m[i][j]);
    }
}
  1. 鉴于 C 中的数组索引从 0 开始,矩阵索引计算中缺少一对括号:反对角条目的索引应为 m[ M - (i+1) ][j]。一旦您阅读了整个矩阵,这样的事情应该可以工作:
for(i = 0; i < M; i++){
    if( m[i][i] != m[M - (i+1)][i] ){
        b = 0;
    }
}

答案 1 :(得分:0)

让我们考虑已发布代码中的主要问题。

  • if (M<0 || M>100) printf("Wrong input!\n"); 我认为 0 维矩阵是不可接受的,但您的里程可能会有所不同。

  • 矩阵的值从标准流中“扫描”同时检查。 m 未初始化,因此其值不确定。在设置第一行的元素时,代码试图将这些元素与尚未输入的最后一行进行比较。有必要在输入所有元素后执行检查。

  • 在 C 中,数组索引从 0 开始,而在此代码段中,循环类似于 for (i=1; i<=M; i++),跳过第一个元素并访问末尾的元素(具有未定义的行为)。反对角线应由 i + j == M - 1 定义。