【问题标题】:How to swap array elements on C language and integrate it to code?如何在 C 语言中交换数组元素并将其集成到代码中?
【发布时间】:2020-03-18 22:25:28
【问题描述】:

我在更改数组并将它们集成到我的代码中时遇到问题,任务是

“给定一个n阶实数方阵,找出位于矩阵阴影部分的元素的最小值并交换它们。

"

前半部分的代码我弄明白了,但是后半部分我想不通,那就是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

#define N 5

int main ()
{
    int a[N][N], min, i, j;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            a[i][j] = rand () % 10;
    }
    printf ("n\n The generated matrix has the form");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            printf ("%d  ", a[i][j]);
        printf ("\n");
    }
    min = a[0][N - 1];
    for (i = 0; i < N; i++) {
        for (j = N / 2; j < N; j++)
            if ((j + i) > N && (i <= j) && (min > a[i][j]))
                min = a[i][j];
    }
    printf ("n\n Minimum element in the shaded area");
    printf ("\n\n min_element=%d ", min);
    getch ();
}

【问题讨论】:

  • 你能格式化一下吗?每个范围至少有一个空间会很好,但四个更好。
  • “交换它们”是您想要做的部分吗?目前尚不清楚用什么交换什么。也许为大小为 4x4 和 5x5 的矩阵添加一个示例?你可以edit你的问题澄清一下。
  • 我的意思是改变矩阵阴影部分表示的元素的值。这是 5x5 矩阵,结果是 1.(1 7 4 0 9)、2.(4 8 8 2 4)、3.(5 5 1 7 1)、4.(1 5 2 7 6)、5。 (1 4 2 3 2)
  • @Ramazan 我不明白要交换什么。在您的问题中放置一个原始矩阵和交换最小值后矩阵的示例。

标签: c arrays matrix


【解决方案1】:

你的逻辑有点混乱。您必须在调用rand() 之前调用srand() 为随机数生成器播种,例如

#include <time.h>
...
int main (void) {

    int a[N][N], min = INT_MAX, i, j;

    srand (time(NULL));             /* seed random number generator */

注意:min如何初始化为INT_MAX

您可以在一个循环中填充和输出原始数组。请注意,% 10 在所有象限中定期生成0,使用% 100 获得更大范围的值,例如

    /* fill elements with random values 0-99, output array */
    puts ("\nThe generated matrix has the form:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            a[i][j] = rand () % 100;
            printf ("  %2d", a[i][j]);
        }
        putchar ('\n');
    }

注意:不要使用printf ("\n"); 来输出单个字符'\n',这就是putchar('\n'); 的用途——尽管好的编译器会为您进行优化)

您可以在一个循环中比较上下三角形中的值,例如:

    for (i = 0; i < N - i; i++) {           /* loop rows 0 - N-i-1 */
        for (j = i; j < N - i; j++) {       /* loop cols i - N-i-1 */
            if (a[i][j] < min)              /* test upper value */
                min = a[i][j];
            if (a[N-i-1][j] < min)          /* test lower value */
                min = a[N-i-1][j];
        }
    }

你只需要一个printf就可以输出结果,不管你是怎么做的:

    printf ("\nMinimum element in the shaded area\n\n  min_element = %d\n", min);

或喜欢

    printf ("\nMinimum element in the shaded area\n\n"
            "  min_element = %d\n", min);

最后不要使用conio.hgetch(); 来保持终端窗口打开。 conio.h 是一个 100% 不可移植的古老 DOS 标头。只需使用标准&lt;stdio.h&gt; 提供的getchar()

总而言之,您将拥有:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>

#define N 5

int main (void) {

    int a[N][N], min = INT_MAX, i, j;

    srand (time(NULL));             /* seed random number generator */

    /* fill elements with random values 0-99, output array */
    puts ("\nThe generated matrix has the form:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            a[i][j] = rand () % 100;
            printf ("  %2d", a[i][j]);
        }
        putchar ('\n');
    }

    for (i = 0; i < N - i; i++) {           /* loop rows 0 - N-i-1 */
        for (j = i; j < N - i; j++) {       /* loop cols i - N-i-1 */
            if (a[i][j] < min)              /* test upper value */
                min = a[i][j];
            if (a[N-i-1][j] < min)          /* test lower value */
                min = a[N-i-1][j];
        }
    }

    printf ("\nMinimum element in the shaded area\n\n  min_element = %d\n", min);
}

使用/输出示例

$ ./bin/array_upper_lower_triangle

The generated matrix has the form:

  20  79  30  60  89
   2   5  38  15  33
  64  63  52  93  38
  77  89  54  38  89
  25  15  87  43  53

Minimum element in the shaded area

  min_element = 5

编辑——上下三角形交换最小值

看到您的评论后,您也很清楚您想要交换上下三角形的最小元素。为此,您需要保留单独的最小值,例如 min_uppermin_lower 以及它们出现的数组索引,例如 iu, ju(对于 ij 上)和 il,@ 987654350@ 为更低。

然后在找到每个中的最小值后,您可以交换它们。更改将是:

    int a[N][N], min, min_upper=INT_MAX, min_lower=INT_MAX, i, j, iu, ju, il, jl;
    ...
    for (i = 0; i < N - i; i++) {           /* loop rows 0 - N-i */
        for (j = i; j < N - i; j++) {       /* loop cols i - N-i-1 */
            if (a[i][j] < min_upper) {      /* test upper value */
                min_upper = a[i][j];
                iu = i, ju = j;
            }
            if (a[N-i-1][j] < min_lower) {  /* test lower value */
                min_lower = a[N-i-1][j];
                il = N-i-1, jl = j;
            }
        }
    }
    i = a[iu][ju];              /* swap uppwer/lower triangle minimum values */
    a[iu][ju] = a[il][jl];
    a[il][jl] = i;

注意: i 用作交换中的临时变量,因为它在循环之间可用)

交换的完整示例是:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>

#define N 5

int main (void) {

    int a[N][N], min, min_upper=INT_MAX, min_lower=INT_MAX, i, j, iu, ju, il, jl;

    srand (time(NULL));             /* seed random number generator */

    /* fill elements with random values 0-99, output array */
    puts ("\nThe generated matrix has the form:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            a[i][j] = rand () % 100;
            printf ("  %2d", a[i][j]);
        }
        putchar ('\n');
    }

    for (i = 0; i < N - i; i++) {           /* loop rows 0 - N-i */
        for (j = i; j < N - i; j++) {       /* loop cols i - N-i-1 */
            if (a[i][j] < min_upper) {      /* test upper value */
                min_upper = a[i][j];
                iu = i, ju = j;
            }
            if (a[N-i-1][j] < min_lower) {  /* test lower value */
                min_lower = a[N-i-1][j];
                il = N-i-1, jl = j;
            }
        }
    }
    i = a[iu][ju];              /* swap uppwer/lower triangle minimum values */
    a[iu][ju] = a[il][jl];
    a[il][jl] = i;

    printf ("\nmin_upper : %d\nmin_lower : %d\n", min_upper, min_lower);

    puts("\nSwapped min from upper/lower triangles:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            printf ("  %2d", a[i][j]);
        putchar ('\n');
    }

    min = min_upper < min_lower ? min_upper : min_lower;

    printf ("\nMinimum element in the shaded area\n\n  min_element = %d\n", min);
}

使用/输出示例

$ ./bin/array_upper_lower_triangle_swap

The generated matrix has the form:

  31  52  50  21  40
  48  63  65  15  48
  77  70  69  90  18
  56  22  36  71  14
  13  14  53  26  32

min_upper : 15
min_lower : 13

Swapped min from upper/lower triangles:

  31  52  50  21  40
  48  63  65  13  48
  77  70  69  90  18
  56  22  36  71  14
  15  14  53  26  32

Minimum element in the shaded area

  min_element = 13

希望能满足您的所有要求。如果您需要更多帮助,尽管问。

【讨论】:

  • 哦,伙计,谢谢我有一个问题,随机数没有出去,但同样的数字出来了,我对这一切感到困惑,我已经住在早上 5 点了这段时间一直没睡,但原来的问题依然存在,我需要改变位于矩阵阴影部分的元素的值。你能帮忙吗?
  • 等一下,我还有一个修改上下左右交换最小值的编辑,我会在一秒钟内发布。祝你编码好运!
  • @Ramazan - 更新了用于在上下三角形区域之间交换最小元素的示例代码。
  • 如果您需要交换所有元素,只需在循环中声明一个新的临时 int 并在每次迭代中交换每个元素——我不清楚您是否只需要交换最小值或从上到下的每个值。无论哪种方式,它的工作原理都是一样的——如果你交换每个元素,你不必保持单独的最小值——如果你遇到困难,请告诉我,如果这是你需要做的。
  • 为了兴趣,我会尝试交换所有元素,但首先我需要睡觉,这是漫长的一天))))谢谢,如果我有任何困难,我会写信给你马上;)
猜你喜欢
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多