【问题标题】:Matrix and swapping rows矩阵和交换行
【发布时间】:2021-04-29 20:19:47
【问题描述】:

我的任务是在矩阵中找到最小值和最大值,如果它们在同一行中,则打印它们在同一行中,如果它们不相等则交换它们的行。我的程序在它们不相等时工作,但是当它们相等时它在a = [imin1][j] 处崩溃,我不知道为什么。我希望你能帮助我。

#include <stdio.h>

int main() {
    int m[10][10], i, j, min, max, imin1, imax1, imin2, imax2, a;
    printf ("Elements of matrix: ");
    for (i = 0; i < 10; i++) {
        for (j = 0; j < 10; j++) {
            scanf("%d", &m[i][j]);
        }
    }
    min = m[0][0];
    max = m[0][0];
    for (i = 0; i < 10; i++) {
        for (j = 0; j < 10; j++) {
            if (m[i][j] < min) {
                min = m[i][j];
                imin1 = i;
                imin2 = j;
            }
            if (m[i][j] > max) {
                max = m[i][j];
                imax1 = i;
                imax2 = j;
            }
        }
    }

    if (imin1 == imax1)
        printf ("Same row");
    else {
        for (j = 0; j < 10; j++) {
            a = m[imin1][j];
            m[imin1][j] = m[imax1][j];
            m[imax1][j] = a;
        }
        printf ("New matrix: \n");
        for (i = 0; i < 10; i++) {
            for (j = 0; j < 10; j++) {
                printf ("%d ", m[i][j]);
            }
            printf("\n");
        }
    }
}

【问题讨论】:

  • 您应该将iminimax 变量初始化为(0)。如果m[0][0] 是最小元素,则imin 永远不会被初始化,并且可以包含任何值。考虑使用临时的printf 跟踪语句来调试您的代码。

标签: arrays c matrix


【解决方案1】:

maxmin 相同的情况下,您的问题是由于imax1imnin1 未初始化。问题在这里浮出水面:

    if(imin1==imax1)                      /* <== here */
        printf("Same row");
    else {
        for(j=0;j<10;j++){
            a=m[imin1][j];
            m[imin1][j]=m[imax1][j];      /* <=== and here */
            m[imax1][j]=a;
        }
        printf("New matrix: \n");
        for(i=0;i<10;i++){
            for(j=0;j<10;j++){
                printf("%d ", m[i][j]);
            }
            printf("\n");
        }
    }

由于您已将 minmax 设置为相同的第一个元素。如果所有元素都相同,if(m[i][j]&lt;min)if(m[i][j]&gt;max) 始终为 false,imax1imnin1 永远不会被赋值。

对于具有自动存储持续时间的变量,尝试在其值不确定时访问变量的值会导致 Undefined Behavior(坏 JuJu)

C11 Standard - 6.7.9 Initialization(p10) "如果一个具有自动存储时长的对象没有被显式初始化,它的值是不确定的。" and C11 Standard - J.2 Undefined Behavior"一个具有自动存储时长的对象的值在不确定时使用(6.2.4、6.7.9、6.8)。"

您可以通过始终将min 初始化为该类型的最大值并将max 初始化为该类型的最小值来消除该问题,例如

#include <limits.h>
...
        min = INT_MAX,
        max = INT_MIN,

把它放在一起并消除 Magic-Numbers 的使用,你可以这样做:

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

#define ROWS  10        /* if you need a constant, #define one (or more) */
#define COLS  ROWS

int main() {
    
    int m[ROWS][COLS] = {{0}},
        min = INT_MAX,
        max = INT_MIN,
        iminx = 0, iminy = 0, imaxx = 0, imaxy = 0;
    
    puts ("Original matrix:");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            if (scanf("%d", &m[i][j]) != 1) {   /* validate EVERY input */
                fputs ("error: invalid integer input.\n", stderr);
                return 1;
            }
            printf (" %2d", m[i][j]);
        }
        putchar ('\n');
    }
    
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            if (m[i][j] < min){
                min = m[i][j];
                iminx = i;
                iminy = j;
            }
            if (m[i][j] > max) {
                max = m[i][j];
                imaxx = i;
                imaxy = j;
            }
        }
    }
    
    printf ("\nmin: %2d (%d,%d)\nmax: %2d (%d,%d)\n\n",
            min, iminx, iminy, max, imaxx, imaxy);
    
    if (iminx == imaxx)
        puts ("Same row\n");
    else {
        int a = m[iminx][iminy];
        m[iminx][iminy] = m[imaxx][imaxy];
        m[imaxx][imaxy] = a;
        
        printf("New matrix: \n");
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                printf(" %2d", m[i][j]);
            }
            putchar ('\n');
        }
    }
}

(注意:例如imin1imin2的变量名改为iminximinyimax.也一样,只是为了简化@ 987654343@ 作为坐标索引而不是 1, 2 -- 完全取决于您)

使用/输出示例

$ ./bin/arr_max_min_swap < dat/arr_int_10x10.txt
Original matrix:
 41 48  2 35  6 74 92 89 70 14
 32 85 74 78 37 25 49 36 93 17
 79 73 23 88 22 83 21 42 85 86
 67 26 66  2 62 72 76 86 94 78
 32 26 63  7 37  1 64 86 69 57
 36 81 62 59  1 84 42 23 27 59
 41 26 86 39 60 80 11 68 98 37
 47 30 64 10 69 33 43 33 51 45
 90 87 26 52 46 27 69 21 82 28
 80 23 86 98 62 47 10  6 15  8

min:  1 (4,5)
max: 98 (6,8)

New matrix:
 41 48  2 35  6 74 92 89 70 14
 32 85 74 78 37 25 49 36 93 17
 79 73 23 88 22 83 21 42 85 86
 67 26 66  2 62 72 76 86 94 78
 32 26 63  7 37 98 64 86 69 57
 36 81 62 59  1 84 42 23 27 59
 41 26 86 39 60 80 11 68  1 37
 47 30 64 10 69 33 43 33 51 45
 90 87 26 52 46 27 69 21 82 28
 80 23 86 98 62 47 10  6 15  8

相同的值:

$ ./bin/arr_max_min_swap < dat/arr_int_10x10_7.txt
Original matrix:
  7  7  7  7  7  7  7  7  7  7
  7  7  7  7  7  7  7  7  7  7
  7  7  7  7  7  7  7  7  7  7
  7  7  7  7  7  7  7  7  7  7
  7  7  7  7  7  7  7  7  7  7
  7  7  7  7  7  7  7  7  7  7
  7  7  7  7  7  7  7  7  7  7
  7  7  7  7  7  7  7  7  7  7
  7  7  7  7  7  7  7  7  7  7
  7  7  7  7  7  7  7  7  7  7

min:  7 (0,0)
max:  7 (0,0)

Same row

如果您还有其他问题,请告诉我。

【讨论】:

    【解决方案2】:

    您需要将imin1imax1imin2imax2 的值初始化为零,因为您使用第一个元素作为maxmin 的初始值,如下所示:

    min = m[0][0];
    max = m[0][0];
    imin1 = imax1 = imin2 = imax2 = 0;
    

    【讨论】:

      猜你喜欢
      • 2019-03-24
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2016-03-30
      相关资源
      最近更新 更多