c - 检查矩阵的恒等性是否有问题?

标签 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;
}

最佳答案

始终启用编译警告。

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

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;

您应该添加大括号以明确 if 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 时打破循环。

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

关于c - 检查矩阵的恒等性是否有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59540637/

相关文章:

c - 将链接列表的链接列表保存到二进制文件

c - 将 FORTRAN EXTERNAL 数据类型传递给 C

javascript - 将 for 循环转换为 forEach 循环时重新分配变量值的问题

Python:如何在遍历列表时只保留所有先前子列表中的元素?

javascript - 如何将EventListener 添加到此for 循环中的每个innerHTML += ?

Javascript 循环遍历列表不起作用

使用 pthreads 在挂起模式下创建线程

c - 在密码学、C 编程方面需要帮助

python - 'for' 循环中的 i = i + 1 和 i += 1 有什么区别?

c - 如何找到给定的正确面具?