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