Не могу разобрать, как подсчитать количество столбцов, элементы которых расположены в порядке возрастания в двумерно массиве?

Не могу разобрать, как подсчитать количество столбцов, элементы которых расположены в порядке возрастания в двумерно массиве ? c++

Я написал заполнение цикла, но не могу додуматься до остольного:

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

Вот фрагмент кода программы которой не могу доделать:

    #include <iostream>

using namespace std;

int main()
{
    // Объявление переменных
    int numRows,numCols;
    
    
    // Запрос данных пользователя
    cout << "введите кол-во строк для матрицы: ";
    cin >> numRows ;
    cout << "введите кол-во столбоцов для матрицы: ";
    cin >> numCols;
    // cout << "Матрицы NxN равняется: " << numRows << "x" << numCols << endl;
    int a[numRows][numCols];
    
    // Заполнение массива 
    for (int i = 0; i < numRows;i++){
        cout << "Вводим " << i + 1 << " строку\n";
        for (int j = 0; j < numCols; j++){
            cout << "Введите целое число: ";
            cin >> a[i][j];
            }
    }
     // Вывод матрицы пользователя 
    cout << "Ваша матрица: " << endl;
    for (int i = 0; i < numRows; i++) {
        for (int j = 0; j < numCols; j++) {
            cout << a[i][j] << ' ';
        }
        cout << endl;
    }
    
    for(int j =1; j<numCols;j++){
        int count = 0;
        for(int i = 1; i<numRows - 1;i++){
            
            if( a[i + 1][j] > a[i][j] ){
                break;
            }
            if( i = numRows - 1 ){
                count = count + 1;
            }
            
        }
        cout << count;
    }

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

Автор решения: V-Mor

В последнем цикле есть пара логических ошибок. Рассмотрим Ваш код подробнее:

for(int j =1; j<numCols;j++)
{
    int count = 0;
    for(int i = 1; i<numRows - 1; i++)
    {
        if( a[i + 1][j] > a[i][j] )
        {
            break;
        }
        if( i = numRows - 1 )
        {
            count = count + 1;
        }
    }
}

Во-первых, опечатка, которую я указал в комментарии: if( i = numRows - 1 ). У вас здесь вместо знака равенства оператор присваивания. Вот что произойдёт при вычислении результата условия: переменной i будет присвоено значение numRows - 1, а потом, т.к. if работает только с данными логического типа, i будет преобразована к типу bool по правилу "Если 0, то false, иначе – true". Таким образом, условие будет выполнено в каждом случае, когда numRows - 1 не равно нулю.

Во-вторых, если поправить это условие, столкнёмся с другой, уже логической, ошибкой: тело цикла выполняется до тех пор, пока i < numRows - 1, следовательно, условие, заключённое в этом теле, if( i == numRows - 1 ) никогда не будет выполнено, т.к. к моменту, когда оно будет достигнуто, цикл уже перестанет выполняться. Следовательно, скорее всего, нужно заменить numRows - 1 на numRows - 2.

В-третьих, циклы почему-то начинаются от 1, хотя наименьший индекс массива в c++ – 0.

В-четвёртых, конструкция

    if( a[i + 1][j] > a[i][j] )
    {
        break;
    } 

вероятно, предназначена, чтобы, когда не выполняется условие "элементы идут по возрастанию", переходить к следующему столбцу. Но, если a[i + 1][j] > a[i][j], то элементы как раз идут по возрастанию. Значит данное условие нужно заменить на обратное:

    if( a[i + 1][j] <= a[i][j] )
    {
        break;
    } 

Я намеренно не стану прилагать к ответу готовый код с полным решением, чтобы автор вопроса прочитал мои замечания и постарался сам разобраться в своих ошибках и исправить их, а не просто скопировал готовый код, не обратив внимания на всё, что я так старательно здесь расписывал. Замечаний, представленных выше, достаточно, чтобы исправить программу до рабочего состояния.

→ Ссылка