你好! 我的任务是检查二次矩阵的主对角线和反对角线的元素是否相同。如果满足此条件,则应打印“是”; '不'在相反的情况下。例如,矩阵 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");
}
答案 0 :(得分:1)
正如@Bob__ 已经指出的那样,代码存在一些问题:
首先,在 C 中,数组索引从 0 开始。
此外,在您的内部循环中,在 j
上,您只读取了一个条目,但随后您尝试将对角条目与您尚未读入的反对角条目进行比较。您可能想先读入整个矩阵,然后在单独的循环中检查对角线和反对角线是否相同。
for (i=0; i < M; i++){
for (j = 0; j< M; j++){
scanf("%d", &m[i][j]);
}
}
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
定义。