所以我必须编写一个程序,可以根据矩阵的对角线确定最大值。然后我必须将矩阵 (a[1][1]) 的第一个变量的位置与该矩阵的最大值交换,其他元素保持不变。
这是我的代码:
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int a[20][20];
int main(){
int i, j, n1, n2, max;
printf ("\nIntroduceti numarul de coloane pentru matricea A: ");
scanf (" %d", &n2);
printf ("\nIntroduceti numarul de randuri pentru matricea A: ");
scanf (" %d", &n1);
printf("\nIntroduceti elementele primei matrice: ");
for(i=1;i<=n1;i++){
for(j=1;j<=n2;j++){
printf("\na[%d][%d] = ", i, j);
scanf("%d",&a[i][j]);
}
}
printf("\nMatricea A este:\n");
for(i=1;i<=n1;i++){
printf("\n");
for(j=1;j<=n2;j++){
printf("%d\t",a[i][j]);
}
}
do {
for(i=1;i<=n1;i++){
if(a[i][i]>max) {
max=a[i][i];
}
}
} while (i<=n1);
printf ("\nMaximul de pe diagonala este: %d", max);
a[1][1]=a[1][1]^max;
max=max^a[1][1];
a[1][1]=max^a[1][1];
for(i=1;i<=n1;i++){
printf("\n");
for(j=1;j<=n2;j++){
printf("%d\t",a[i][j]);
}
}
return 0;
}
我做错了什么?我的程序仅将最大值与第一个变量 a[1][1] 交换,但忘记将 a[1][1] 放在最大值所在的位置。
最佳答案
您完全遍历对角线元素,仅跟踪最大值,然后(在循环之后)您尝试将该值与矩阵的第一个元素交换。问题是您不再知道最大值在哪里,因为您从未记录过它!您只需记录 什么 值(在 max
中),而忽略其在矩阵中的 index。
例如,假设您的最大值恰好在 a[2][2]
。您遍历对角线元素,找到最大值 value,将其存储在 max
中。在循环结束时,您不能将 a[2][2]
与 a[0][0]
交换,因为您丢失了最大值为在 a[2][2]
。 (假设您了解了数组索引从 0 开始的问题。)您正在做的是将 max
写入第一个元素 a[0][0]
。 a[2][2]
未更改,因为您没有更改它,而且您忘记了更改它的位置。
您需要跟踪某个变量中的最大值值(现在编写的max
很好)并添加另一个变量(例如,max_pos
例如)以跟踪此最大值所在位置的索引。 (你只需要一个 int
因为它们是对角线元素,所以两个数组索引总是相同的。)任何时候你改变最大值 max
,同时更新最大值位置 max_pos
。这样你就会知道最后要交换 a[0][0]
和 a[max_pos][max_pos]
。
代码大概是什么样子的简要草图(我会留给你填写任何细节):
添加新变量的声明以跟踪最大值的位置(例如,max_pos
):
int i, j, n1, n2, max, max_pos;
您需要用第一个对角线元素初始化 max
和 max_pos
,然后遍历其他元素。
max = a[0][0];
max_pos = 0;
for (i=0; i<n1; i++){
if (a[i][i] > max) {
max = a[i][i];
max_pos = i; // update max_pos anytime max is updated
}
}
请注意我是如何将索引的范围从 1...n1 更改为 0..n1-1。 (使其与您的其余代码保持一致。)C 中的数组索引以 0 开头,而不是 1。请注意,您不需要 do {} while ()
循环。想想它到底在做什么(提示:什么都没有)。
然后,在此之后,您可以交换 a[0][0]
和 a[max_pos][max_pos]
。顺便说一下,XOR swap不是必需的,并且会使代码更难阅读。只需用一个临时变量交换值。现代编译器非常擅长优化,并且很可能使用寄存器来实现这一点,因此您可能不会获得您认为的任何效率(而且您只会这样做一次)。不要试图超越你的编译器。
关于c - 从 C 中的矩阵交换 2 个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40962258/