根据 C++ 特性重新排列矩阵列

Rearranging the matrix column accordance to characteristics C++

我的任务听起来像:整数矩阵的一列的特征是它的负奇数元素之和。重新排列给定矩阵的列,按照特征的增长排列。

我正在制作两个子阵列。首先,它被称为“nesort”,我看不到数组的排序特征。在另一个称为“选项卡”的地方,我看到根据我的任务进行了排序。然后我按元素比较子数组并生成新的子数组。但问题是当在开始数组中生成时是数字的重播。最终数组会比我们需要的大。你能帮我看看我的代码吗?特别是我的循环。有什么问题?

There is example of my code :
enter code here 




#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>

using namespace std;

int main()
{
    setlocale(LC_ALL, "ru");
    cout << "Практическая работа по практике Казаков 9903:" << endl;

    const int ROWS = 5;
    const int COLS = 5;

    int arr[ROWS][COLS];
    int nesort[COLS];
    int tab[COLS];


    //Array generating
    srand(time(NULL));
    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            arr[i][j] = rand() % 41 - 20;
        }
    }

    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            cout << arr[i][j] << "\t";
        }

        cout << endl;
    }

    cout << "Массив построен!" << endl << "\n";

    //Counting and output of characteristics
    cout << "Суммы нечётных, отрицательных элементов столбцов: " << endl;


    for (int j = 0; j < COLS; j++)
    {
        int sum = 0;
        for (int i = 0; i < ROWS; i++)
        {
            if (arr[i][j] < 0 && arr[i][j] & 1)
            {
                sum = sum + arr[i][j];
            }

        }
        nesort[j] = sum;
        tab[j] = sum;
    }



    for (int s = 0; s < COLS; s++)
    {
        cout << nesort[s] << "\t";
        cout << endl;
    }

    cout << endl;

    //Sorting of columns characteristics
    cout << "Отсортированные характеристики столбцов: " << endl;

    int n = sizeof(tab) / sizeof(tab[0]);
    sort(tab, tab + n);


    for (int r = 0; r < COLS; r++)
    {
        cout << tab[r] << "\t";
        cout << endl;
    }

    cout << endl;

    cout << "Отсортированный по хар-кам массив: " << endl;

    //Sorting the start array by characteristics

    for (int n = 0; n < ROWS; n++)
    {
        for (int i = 0; i < ROWS; i++)
        {
            if (tab[n] == nesort[i])
            {
                for (int j = 0; j < COLS; j++)
                {
                    cout << arr[j][i] << "\n";
                }
                cout << endl;
            }
        }
    }
}

你在最后一个循环中有一个错误。这可以很容易地修复:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>

using namespace std;

int main()
{
    setlocale(LC_ALL, "ru");
    cout << "Практическая работа по практике Казаков 9903:" << endl;

    const int ROWS = 5;
    const int COLS = 5;

    int arr[ROWS][COLS];
    int nesort[COLS];
    int tab[COLS];


    //Array generating
    srand(time(NULL));
    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            arr[i][j] = rand() % 41 - 20;
        }
    }

    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            cout << arr[i][j] << "\t";
        }

        cout << endl;
    }

    cout << "Массив построен!" << endl << "\n";

    //Counting and output of characteristics
    cout << "Суммы нечётных, отрицательных элементов столбцов: " << endl;


    for (int j = 0; j < COLS; j++)
    {
        int sum = 0;
        for (int i = 0; i < ROWS; i++)
        {
            if (arr[i][j] < 0 && arr[i][j] & 1)
            {
                sum = sum + arr[i][j];
            }

        }
        nesort[j] = sum;
        tab[j] = sum;
    }



    for (int s = 0; s < COLS; s++)
    {
        cout << nesort[s] << "\t";
        cout << endl;
    }

    cout << endl;

    //Sorting of columns characteristics
    cout << "Отсортированные характеристики столбцов: " << endl;

    int n = sizeof(tab) / sizeof(tab[0]);
    sort(tab, tab + n);


    for (int r = 0; r < COLS; r++)
    {
        cout << tab[r] << "\t";
        cout << endl;
    }

    cout << endl;

    cout << "Отсортированный по хар-кам массив: " << endl;

    //Sorting the start array by characteristics

    for (int sortedColSumIndex = 0; sortedColSumIndex < COLS; ++sortedColSumIndex) {
        for (int colSumIndex = 0; colSumIndex < COLS; ++colSumIndex) {
            if (tab[sortedColSumIndex] == nesort[colSumIndex]) {
                for (int row = 0; row < ROWS; ++row) {
                    std::cout << arr[row][colSumIndex] << '\n';
                }
                std::cout << '\n';
            }
        }
    }
}

但是如果 comums 的总和是两倍或多倍,这将无助于列将出现多次的主要设计问题。

那不是那么容易治愈的。

有必要更改设计。您需要根据 index.

列进行排序

所以,像这样:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>

using namespace std;


int main()
{
    setlocale(LC_ALL, "ru");
    cout << "Практическая работа по практике Казаков 9903:" << endl;

    const int ROWS = 5;
    const int COLS = 5;

    int arr[ROWS][COLS];
    int nesort[COLS];
    int tab[COLS];


    //Array generating
    srand(time(NULL));
    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            arr[i][j] = rand() % 41 - 20;
        }
    }

    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            cout << arr[i][j] << "\t";
        }
        cout << endl;
    }

    cout << "Массив построен!" << endl << "\n";

    //Counting and output of characteristics
    cout << "Суммы нечётных, отрицательных элементов столбцов: " << endl;


    for (int j = 0; j < COLS; j++)
    {
        int sum = 0;
        for (int i = 0; i < ROWS; i++)
        {
            if (arr[i][j] < 0 && arr[i][j] & 1)
            {
                sum = sum + arr[i][j];
            }

        }
        nesort[j] = sum;
        tab[j] = j;
    }

    for (int s = 0; s < COLS; s++)
    {
        cout << nesort[s] << "\t";
        cout << endl;
    }

    cout << endl;

    //Sorting of columns characteristics
    cout << "Отсортированные характеристики столбцов: " << endl;

    int n = sizeof(tab) / sizeof(tab[0]);
    sort(tab, tab + n, [&](const int i1, const int i2) {return nesort[i1] < nesort[i2]; });


    for (int r = 0; r < COLS; r++)
    {
        cout << tab[r] << "\t";
        cout << endl;
    }

    cout << endl;

    cout << "Отсортированный по хар-кам массив: " << endl;

    //Sorting the start array by characteristics
    for (int row = 0; row < ROWS; ++row) {
        for (int sortedColSumIndex = 0; sortedColSumIndex < COLS; ++sortedColSumIndex) {
            std::cout << arr[row][tab[sortedColSumIndex]] << '\t';
        }
        std::cout << '\n';
    }
}