我想用C语言编写一个交换矩阵对角线的代码。
矩阵必须是M*M。这是我目前的代码:
#include <stdio.h>
#define m 4
int
main()
{
// Write C code here
int arr[m][m] = {
{1, 2, 3, 5},
{4, 1, 6, 0},
{7, 8, 1, 3},
{0, 5, 4, 1}
};
int i, j, k, temp1, temp2, z, l;
for (z = 0; z < m; z++) {
for (l = 0; l < m; l++) {
printf("%d ", arr[z][l]);
}
printf("\n");
}
for (i = 0; i < m; i++) {
for (j = 0; j < m; j++) {
if (i == j) {
temp1 = arr[i][j];
for (k = m - 1; k >= 0; k--) {
temp2 = arr[i][k - i];
arr[i][j] = temp2;
arr[i][k - i] = temp1;
break;
}
}
}
}
printf(" \n\n");
z = 0;
l = 0;
for (z = 0; z < m; z++) {
for (l = 0; l < m; l++) {
printf("%d ", arr[z][l]);
}
printf("\n");
}
}
我想知道我的代码在这里是否正确地完成了工作,或者是否有错误。我试图了解我的代码的步骤是否正确。
1条答案
按热度按时间h5qlskok1#
你的代码在不同大小的矩阵上产生了看似合理的输出,但是它使用了三重嵌套循环来进行交换,而一个循环就足够了,这是一种浪费。它可能对小矩阵不太重要,但对大得多的矩阵就很重要了。
你还应该使用一个函数来打印矩阵,因为
m
是一个常量,所以你要处理的是定长矩阵,而不是变长矩阵,但是你可以很容易地编写一个打印函数来处理变长矩阵。例如:
输出:
这也适用于不同大小的矩阵。
最后,你还需要创建一个函数来交换对角线上的元素,在函数中使用VLA符号,你可以处理任意大小的矩阵,如下所示:
输出:
这就是为什么你要使用函数--需要的代码要少得多。3行的段落也可以变成一个函数,但现在还不是必要的,而另外两个函数是非常有益的(虽然,我想,你可以多次写出代码,所以这不是很必要,但代码重复的风险是一个长期的维护问题)。
让
print_matrix()
函数也打印非方阵几乎是微不足道的:对于方阵,您需要为
rows
和cols
参数传递相同的大小。