反转C ++中的二维数组

时间:2020-03-27 01:06:00

标签: c++ arrays sorting

因此,我尝试采用随机数输入并采用某种格式的10x10数组,然后显示其反转版本(位置[0] [0]现在将为[9] [9],依此类推)依此类推,但是我在应该创建反向数组的部分出现C6385错误(问题部分包裹在\\中)

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    const int ROW = 10;
    const int COLUMN = 10;
    srand(time(NULL));

    int array[ROW][COLUMN] = {};
    int transposed[ROW][COLUMN] = {};

    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COLUMN; j++)
        {
            array[i][j] = rand() % 10;

        }
    }
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COLUMN; j++)
        {
            int it = ROW - i;
            int jt = COLUMN - j;
            transposed[i][j] = array[it][jt];
        }
    }
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

    cout << "     ORIGINAL" << endl;
    for (int i = 0; i < ROW; i++)
    {
        if (i == 0)
        {
            cout << "     1   2   3   4   5   6   7   8   8   10" << endl;
            cout << "   +---+---+---+---+---+---+---+---+---+---+" << endl;
        }
        for (int j = 0; j < COLUMN; j++)
        {
            if (((j > 0) && (j < 9)) && (i < 10))
            {
                cout << " | " << array[i][j];
            }
            else if (j == 9)
            {
                cout << " | " << array[i][j] << " |";
            }
            else if ((j == 0) && (i == 9))
            {
                cout << i + 1 << " | " << array[i][j];
            }
            else if ((j == 0) && (i < 9))
            {
                cout << i+1 << "  | " << array[i][j];
            }

        }
        cout << endl;
        if (i < 10)
        {
            cout << "   +---+---+---+---+---+---+---+---+---+---+" << endl;
        }
    }

    cout << "     Transposed" << endl;
    for (int i = 0; i < ROW; i++)
    {
        if (i == 0)
        {
            cout << "     1   2   3   4   5   6   7   8   8   10" << endl;
            cout << "   +---+---+---+---+---+---+---+---+---+---+" << endl;
        }
        for (int j = 0; j < COLUMN; j++)
        {
            if (((j > 0) && (j < 9)) && (i < 10))
            {
                cout << " | " << transposed[i][j];
            }
            else if (j == 9)
            {
                cout << " | " << transposed[i][j] << " |";
            }
            else if ((j == 0) && (i == 9))
            {
                cout << i + 1 << " | " << transposed[i][j];
            }
            else if ((j == 0) && (i < 9))
            {
                cout << i + 1 << "  | " << transposed[i][j];
            }

        }
        cout << endl;
        if (i < 10)
        {
            cout << "   +---+---+---+---+---+---+---+---+---+---+" << endl;
        }
    }
    return (0);
}

3 个答案:

答案 0 :(得分:2)

这是有问题的:

'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

        'mysql2' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE_SECOND', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

int it = ROW - i; int jt = COLUMN - j; i时,0it。与10相同,请记住,jt映射到[0,0],因为数组总是从索引0开始。[9,9]大小的数组中的最后一个有效元素是N,不是[N-1]

因此,当执行此行时:

N

糟糕。 transposed[i][j] = array[it][jt]; 。那不是你想要的。

因此,您需要这样做:

transposed[0][0] = array[10][10]

因此,此时的代码运行良好:

            int it = ROW - i - 1;
            int jt = COLUMN - j - 1;

答案 1 :(得分:1)

它对我进行了编译,没有错误,但是this之类的值存在问题 我正在使用Clion v3.15和c ++ 14

答案 2 :(得分:1)

除了通过@serbie解决索引问题的答案外,您还可以简化用于反转数组本身的算法-就地还原,而无需第二个数组。使用您当前的算法,您不需要反转数组,而只是用相反的顺序用第一个元素填充第二个数组。如果您尝试实际上就地反转array,则最终将交换每个元素两次并最终获得与开始时相同的数组。此外,奇数或偶数行将提供不同的结果。

对于带注释的输出,您仍将需要输出具有所需标题和行号的数组,但是对于反转本身,可以将其减少为例如:

#define ROW  3
#define COL ROW

void rev2d (int (*a)[COL])
{
    /* loop rows increment from 0 while row < end row decrementing from ROW-1 */
    for (int i = 0, j = ROW-1; i <= j; i++, j--) {
        /* loop cols 0->COL-1 and COL-1->0 while i != j or col < endcol */
        for (int k = 0, l = COL-1; i != j ? k < COL : k < l; k++, l--) {
            /* swap element */
            int n = a[i][k];
            a[i][k] = a[j][l];
            a[j][l] = n;
        }
    }
}

注意:如果您不使用常量,则可以修改函数以使用rowcol值)

该算法将适用于rowcol大于或等于2的值(您可以添加大小为1x1的数组的检查,并在以下情况下发出警告,或者只是让事物保持当前状态不变。

行数奇数/偶数的处理是通过内部循环条件中使用的三元数完成的,例如i != j ? k < COL : k < l将反转整行,除非行数为奇数,然后在i = j时将其反转为中间元素

它提供了阵列的完整反转,例如:

示例

$ ./bin/revarr2da
original array:
  1  2  3
  4  5  6
  7  8  9

reversed array:
  9  8  7
  6  5  4
  3  2  1

如果您想填充一个单独的数组,您的算法很好,如果您有兴趣交换适当的值,这只是使用

进行处理的另一种方式