在max 和min 相同的情况下,您的问题是由于imax1 和imnin1 未初始化。问题在这里浮出水面:
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");
}
}
由于您已将 min 和 max 设置为相同的第一个元素。如果所有元素都相同,if(m[i][j]<min) 和 if(m[i][j]>max) 始终为 false,imax1 和 imnin1 永远不会被赋值。
对于具有自动存储持续时间的变量,尝试在其值不确定时访问变量的值会导致 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');
}
}
}
(注意:例如imin1、imin2的变量名改为iminx和iminy,imax.也一样,只是为了简化@ 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
如果您还有其他问题,请告诉我。