我想知道如何在NxN矩阵中打印某行,某列和反对角线。到目前为止,我知道如何打印矩阵本身和主对角线。正如你在代码中看到的那样,我打印了主对角线。
#include <stdio.h>
int main() {
int r1, c1;
printf("\n Enter number of rows for M1");
scanf("%d", &r1);
printf("\n Enter number of columns for M1");
scanf("%d", &c1);
int m1[r1][c1];
// int m2[][];
int i, j;
printf("\n Enter first Matrix: \n");
for(i = 0; i < r1; i++){
for(j = 0; j < c1; j++){
scanf("%d", &m1[i][j]);
}
}
for(i = 0; i < r1; i++){
for(j = 0; j < c1; j++){
if(i == j){
printf("%d", m1[i][j]);
}
}
printf("\n");
}
return 0;
}
答案 0 :(得分:1)
本练习旨在教您如何将任务转换为正确的循环。
为了理解如何做到这一点,我建议这样: 举一个具体的例子(矩阵),写下预期的结果。然后通过理解指数模式:
,尝试将其反向工程为正确的循环代码让我们采用这个矩阵:
1 6 4 3
9 3 5 2
3 3 8 0
1 5 4 4
示例1 - 主对角线
预期结果为1384
实际上是细胞(0,0)(1,1)(2,2)(3,3)。现在,查看索引列表并找出模式 - 它是一个在每次迭代中递增的索引==&gt;一个索引(一个循环)就足够了:
for(i = 0; i < r1; i++) {
printf("%d", m1[i][i]);
}
示例2 - 反对角
预期结果为3531
,实际上是单元格(0,3)(1,2)(2,1)(3,0)。再次,看看这个索引列表并找出模式 - 它是一个在每次迭代中递增而另一个递减的索引。但是如果你考虑一下,第二个索引是第一个索引的函数。这意味着这个也只能用一个索引来完成:
for(i = 0; i < r1; i++) {
printf("%d", m1[i][r1 - i + 1]);
}
因为second-index = r1 - first-index + 1
,所以始终。
我试着在这里解释一下如何在给定任务的情况下思考和编写正确的循环。现在尝试将此方法用于其余任务 - 特定行和某个列(它比对角线更容易)。
对于第2行,指数将是(2,0)(2,1)(2,2)(2,3) - 那么模式是什么?
祝你好运。