【问题标题】:how to interchange the maximum and minimum members indices of a 2D array如何交换二维数组的最大和最小成员索引
【发布时间】: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)

标签: c++ c arrays dev-c++


【解决方案1】:

您的代码中几乎没有问题。

  1. 循环遍历整个数组,然后交换成员。所以在两个循环之后放置交换代码
  2. 第一个元素本身可能是最小值或最大值..所以 rmin/cmin 或 rmax/cmax 可能根本不会设置..所以将它们初始化为 0
  3. 使用适当的索引..不要混合列索引和行索引

    void interchange (int a[][n],int m) {
        int i,j;
        int cmin=0,cmax=0,rmin=0,rmax=0,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];
               }
               if (a[i][j]>max) {
                   rmax=i;
                   cmax=j;
                   max=a[i][j];
               }
            }
        }
    
        temp=a[rmin][cmin];
        a[rmin][cmin]=a[rmax][cmax];
        a[rmax][cmax]=temp;
    }
    

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 2022-01-12
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多