c - 从 C 中的矩阵交换 2 个变量

标签 c

所以我必须编写一个程序,可以根据矩阵的对角线确定最大值。然后我必须将矩阵 (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;

您需要用第一个对角线元素初始化 maxmax_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/

相关文章:

c - 未定义的对 memcpy_s 的引用

c - 将 char 数组传递给 (void const *p)

在指针指向的地址处创建结构体

java - 从 BMP 照片中提取内存初始化文件 (MIF)

C 编程时间和时钟函数

c++ - 适用于 C 或 C++ 的 Google Drive API

c - malloc、参数、内存泄漏等方面的错误很少

c - 为什么这个递归函数返回正确的值?

c++ - 如何将 gdb 用于多线程网络程序

c++ - C/C++ 中的 JSON <-> XML