检查矩阵的身份是否有问题?

时间:2019-12-31 06:50:07

标签: c loops

我有一个问题要检查输入矩阵是否为单位矩阵。我不知道为什么我无法使用自己的程序进行正确的检查,并且没有收到任何语法错误。我认为我有逻辑错误,但我无法弄清楚。

#include <stdio.h>
#include <ctype.h>
#define MAX 100

int main()
{
  int a[MAX][MAX];
  int n, error=0, i=0, j=0;
  do
    {
      printf("The size of the matrix you want to check: \n");
      scanf("%d", &n);
      if(n<1)
    printf("Your number is invalid\n");
    }while(n<1);
  for(i=0; i<n; i++)
  {
    for(j=0; j<n; j++)
      {
    printf("a[%d][%d]= ", i+1, j+1);
    do
      {
        scanf("%d", &a[i][j]);
        if(isdigit(a[i][j]))
          printf("Yo number is invalid\n");
      }while(isdigit(a[i][j]));
      }
  }
  for(i=0; i<n; i++)
    {
    for(j=0; j<n; j++)
      {
    if(i=j)
      if(a[i][j]!=1)
        error=1;
      else
       if(a[i][j]!=0)
        error=1;
      }
    }
  if(error==1)
    printf("This matrix is not an identity\n");
  else
    printf("This matrix is is an indentity\n");
  return 0;
}

2 个答案:

答案 0 :(得分:0)

始终启用编译警告。

您的代码给出了以下编译警告:

warning: suggest parentheses around assignment used as truth value [-Wparentheses]
warning: suggest explicit braces to avoid ambiguous ‘else’ [-Wparentheses]

第一个警告是因为您使用的是=,它是赋值运算符。我尝试过的编译器建议使用括号,但这实际上并不是您所需要的。但是,至少,编译器指出了一个问题,在该问题中您将赋值用作真值。 当然,编译器不会知道您是否真的想将其作为真实值来知道,或者您只是错误地使用了=而不是==。但是您知道是指比较而不是分配。

第二条警告位于程序的以下部分:

if(i==j)
  if(a[i][j]!=1)
    error=1;
  else
   if(a[i][j]!=0)
    error=1;

您应该添加大括号以明确else语句所属的括号。 C编译器不通过缩进来推断。因此,以下两个部分将完全相同:

if(i==j)
    if(a[i][j]!=1)
        error=1;
    else
        if(a[i][j]!=0)
            error=1;
if(i==j)
    if(a[i][j]!=1)
        error=1;
else
    if(a[i][j]!=0)
        error=1;

您需要添加大括号以使其清晰可见。我也认为您有逻辑错误。如下所示:

if(i==j)
{
    if(a[i][j]!=1)
        error=1;
}
else
{
    if(a[i][j]!=0)
        error=1;
}

看看这是多么干净,易读且没有编译警告吗?


还有另一件事引起了我的注意,那就是您使用isdigit。您对isdigit的使用是完全错误的。该函数采用一个表示ASCII码的int值,如果该ASCII码表示一个数字,则它返回一个正整数;否则返回0。您实际上没有传递ASCII代码(char变量)。该变量已经是int类型,仅此而已。您无需对此进行任何检查。

另一件事不是很重要,就是稍微提高性能,但是在error变量设置为1时中断循环。

如果您已经知道它不是单位矩阵,则无需继续循环。

答案 1 :(得分:-1)

如果您发现if(i=j)不是比较而是分配。用if(i==j)更新以进行比较