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