При выводе массива, выводятся лишние элементы, я бы сказал несуществующие

У меня есть двумерный массив (я его использую как матрицу 4х5), я заполняю его через клавиатуру, а потом располагаю ряды по неубыванию их наибольших элементов. Но при выводе итогового массива, там появляется какой-то несуществующий ряд. Как это исправить, сделать так чтобы эта строчка со странными числами не выводилась? Вот код:

#include <iostream>
using namespace std;

int main()
{
    const int MATRIX_SIZE = 4;
    const int MATRIX_SIZE2 = 5;
    int matrix[MATRIX_SIZE][MATRIX_SIZE2] = {};

    int maxes[MATRIX_SIZE2] = {};
    int id_array[MATRIX_SIZE2] = {};


    for (int i = 0; i < MATRIX_SIZE; i++)
    {
        for (int j = 0; j < MATRIX_SIZE2; j++)
        {
            cout << "Enter a number for the " << i + 1 << " row of the " << j + 1 << " column -> ";
            cin >> matrix[i][j];
        }
    }

    cout << endl << "Matrix:\n";

    for (int i = 0; i < MATRIX_SIZE; i++)
    {
        for (int j = 0; j < MATRIX_SIZE2; j++)
        {
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }


    for (int i = 0; i < MATRIX_SIZE2; i++)
    {
        id_array[i] = i;
    }


    for (int i = 0; i < MATRIX_SIZE; i++)
    {
        for (int j = 1; j < MATRIX_SIZE2; j++)
        {
            if (matrix[i][j] > matrix[i][0])
            {
                maxes[i] = matrix[i][j];
            }
        }
    }



    


    for (int i = 0; i < MATRIX_SIZE2 - 1; i++)
    {
        for (int j = 0; j < MATRIX_SIZE2 - i - 1; j++)
        {
            if (maxes[j] > maxes[j + 1])
            {
                int temp = maxes[j];
                maxes[j] = maxes[j + 1];
                maxes[j + 1] = temp;

                int temp_id = id_array[j];
                id_array[j] = id_array[j + 1];
                id_array[j + 1] = temp_id;

            }
        }
    }



    

    cout << endl << "Matrix:\n";

    for (int i = 0; i < MATRIX_SIZE2; i++)
    {
        for (int j = 0; j < MATRIX_SIZE2; j++)
        {
            cout << matrix[id_array[i]][j] << "\t";
        }
        cout << endl;
    }
}
/*
test 1
input
2 3 2 2 3    3
3 1 4 2 2    4
2 2 2 2 2    2
1 5 3 4 4    5

result
2 2 2 2 2
2 3 2 2 3
3 1 4 2 2
1 5 3 4 4
-----------------------

test 2
input
-1 0 5 6 8          8
-5 -2 -8 -69 6      6
5 8 6 3 4           8
0 0 0 0 0           0

result
0 0 0 0 0
-5 -2 -8 -69 6
5 8 6 3 4
-1 0 5 6 8
*/

Вот такие большие и непонятные числа при любом тесте


Ответы (1 шт):

Автор решения: Harry

Если вы не умеете работать с отладчиком, достаточно добавить одну строку с отладочным выводом:

for (int i = 0; i < MATRIX_SIZE2; i++)
{
    cout << "id_array[i] = " << id_array[i] << endl;
    for (int j = 0; j < MATRIX_SIZE2; j++)
    {

И тут же вы увидите, что id_array[i] равен для вашего второго ввода 4, т.е. вы получаете выход за пределы массива (в нем только 4 строки).

Поскольку вопрос вами так и не был задан, только констатация фактов, я воспринял его как "почему это происходит", и дал ответ на него.

А вот почему у вас вычисления дают вот такой эффект — это уже совсем другой вопрос, для которого неплохо бы понимать, что вы хотите делать, какую задачу решаете. Навскидку — этот массив id_array, судя по его размеру, вообще не предназначался для работы со строками...

→ Ссылка