【发布时间】:2014-06-12 17:59:34
【问题描述】:
所以这应该是在一个二维数组中找到最大值和最小值并交换它们的位置,如果对应的是 2x2 数组的 1234,它应该是 4231。 这是我所做的:
void interchange (int a[][n],int m) {
int i,j;
int cmin,cmax,rmin,rmax,temp;
int max=a[0][0],min=a[0][0];
for(i = 0; i < m; i++) {
for(j = 0; j < n; j++) {
if (a[i][j]<min) {
rmin=i;
cmin=j;
min=a[i][j];
} else if (a[i][j]>max) {
rmax=i;
cmax=j;
max=a[i][j];
}
temp=a[cmin][rmin];
a[cmin][rmin]=a[cmax][rmax];
a[cmax][rmax]=temp;
}
}
}
我使用另一个函数来打印旧数组和新数组,但它总是打印旧数组,当我尝试在交换函数中打印以查看发生了什么时,它输出一个零。
if..if else 语句部分,我认为这样会更有效率:
if (a[i][j]<min) {
rmin = i;
cmin = j;
min = a[rmin][cmin];
}
...但它仍然有同样的问题。这是整个代码:
#include<iostream.h>
const int n = 2;
const int m = 2;
void read(int a [][n], int m);
void write(int a [][n], int m);
void interchange(int a [][n], int m);
main(){
int a[n][m];
read(a, m);
write(a, m);
interchange(a, m);
write(a, m);
return 0;
}
void read(int a [][n], int m){
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
cin >> a[i][j];
}
void write(int a [][n], int m){
int i, j;
for (i = 0; i < m; i++){
for (j = 0; j < n; j++)
cout << a[i][j] << "\t";
cout << endl;
}
}
void interchange(int a [][n], int m){
int i, j;
int cmin, cmax, rmin, rmax, temp;
int max = a[0][0], min = a[0][0];
for (i = 0; i < m; i++){
for (j = 0; j < n; j++)
if (a[i][j] < min){
rmin = i;
cmin = j;
min = a[rmin][cmin];
}
else if (a[i][j] > max){
rmax = i;
cmax = j;
max = a[rmax][cmax];
}
temp = a[cmin][rmin];
a[cmin][rmin] = a[cmax][rmax];
a[cmax][rmax] = temp;
}
}
【问题讨论】:
-
请正确缩进您的代码。
-
您可能也应该向我们展示您的打印功能。您是否使用调试器查看了您的数组在函数末尾的样子?
-
我已在我的问题中添加了详细代码。
-
次要内容:1) 建议要么将
m,n都传递给函数,要么不传递并使用全局函数。现在代码正在使用其中的一个。 2) Pedantic 函数会在尝试访问a[0][0]之前测试 m 和 n > 0。 3) 可以使用write(const int a [][n], int m)