Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

Как обратиться к *m[]?

#cpp #массивы #указатели


Задача стоит реализовать функцию, которая принимает на вход двумерный массив целых
чисел, ищет в этом массиве строку, содержащую наименьшее среди всех элементов массива
значение, и меняет эту строку местами с первой строкой массива. 

Также рекомендуется обменять строки массива, не обменивая элементы строк по-отдельности. 

Не могу понять как обратиться к *m[] ? Это массив указателей или указатель на массивы?

Спасибо!

void swap_min(int *m[], unsigned rows, unsigned cols){
    int row_with_min = 0;

    for ( int i = 0; i != rows ; i++ ){
        for ( int j = 0; j != cols ; j++ ){
                if (m[i][j] < min){
                    row_with_min = i;
                    cout << i << endl;
                }
                //... Как здесь с помощью указателей поменять строки местами?...//
        }
    }
}

    


Ответы

Ответ 1



Ваша функция объявлена как void swap_min(int *m[], unsigned rows, unsigned cols); Ее первый параметр задан как int *m[] , то есть это массив неопределенный длины, элементы которого имеют тип int *, то есть массив указателей. Из условия задачи очевидно, что это динамически выделенный одномерный массив указателей на одномерные массивы. Неявно этот параметр преобразуется к типу int **m, и представляет собой указатель на первый элемент массива, если действительно в качестве аргумента был передан массив. Но в виду данного преобразования типа параметра в качестве аргумента можно также передать и указатель типа int **. Данный массив мог быть определен следующим образом: int **m; m = new int *[rows]; for ( unsigned int i = 0; i < rows; i++ ) { m[i] = new int [cols]; } // заполнение массива значениями. swap_min( m, rows, cols ); Ниже представлена демонстрационная программа #include #include #include #include void swap_min( int *m[], unsigned int rows, unsigned int cols ) { unsigned int min_row = 0, min_col = 0; for ( unsigned int i = 0; i != rows ; i++ ) { for ( unsigned int j = 0; j != cols ; j++ ) { if ( m[i][j] < m[min_row][min_col] ) { min_row = i; min_col = j; } } } if ( min_row != 0 ) { int *tmp = m[0]; m[0] = m[min_row]; m[min_row] = tmp; } } int main() { unsigned int rows = 4; unsigned int cols = 5; int **m = new int *[rows]; for ( unsigned int i = 0; i < rows; i++ ) { m[i] = new int[cols]; } std::srand( ( unsigned int )std::time( nullptr ) ); for ( unsigned int i = 0; i < rows; i++ ) { for ( unsigned int j = 0; j < cols; j++ ) { m[i][j] = std::rand() % ( rows * cols ); } } for ( unsigned int i = 0; i < rows; i++ ) { for ( unsigned int j = 0; j < cols; j++ ) { std::cout << std::setw( 2 ) << m[i][j] << ' '; } std::cout << std::endl; } std::cout << std::endl; swap_min( m, rows, cols ); for ( unsigned int i = 0; i < rows; i++ ) { for ( unsigned int j = 0; j < cols; j++ ) { std::cout << std::setw( 2 ) << m[i][j] << ' '; } std::cout << std::endl; } std::cout << std::endl; for ( unsigned int i = 0; i < rows; i++ ) { delete [] m[i]; } delete [] m; } Ее вывод на консоль может выглядеть следующим образом: 7 1 11 17 13 14 0 8 3 2 3 14 1 9 9 1 12 16 18 12 14 0 8 3 2 7 1 11 17 13 3 14 1 9 9 1 12 16 18 12 Вы также могли воспользоваться стандартными алгоритмами std::min_element для поиска минимального элемента в строке и std::swap для обмена значениями двух элементов. Имейте в виду, что на самом деле на вход функции принимается одномерный массив массивов, а не двумерный массив, как у вас сказано в описании. Для работы с двумерными массивами программа может выглядеть следующим образом #include #include #include #include const unsigned int rows = 4; const unsigned int cols = 5; void swap_min( int m[][cols], unsigned int rows ) { int tmp[cols]; unsigned int min_row = 0, min_col = 0; for ( unsigned int i = 0; i != rows ; i++ ) { for ( unsigned int j = 0; j != cols ; j++ ) { if ( m[i][j] < m[min_row][min_col] ) { min_row = i; min_col = j; } } } // std::swap( m[0], m[min_row] ); if ( min_row != 0 ) { for ( unsigned int i = 0; i < cols; i++ ) tmp[i] = m[0][i]; for ( unsigned int i = 0; i < cols; i++ ) m[0][i] = m[min_row][i]; for ( unsigned int i = 0; i < cols; i++ ) m[min_row][i] = tmp[i]; } } int main() { int m[rows][cols]; std::srand( ( unsigned int )std::time( nullptr ) ); for ( unsigned int i = 0; i < rows; i++ ) { for ( unsigned int j = 0; j < cols; j++ ) { m[i][j] = std::rand() % ( rows * cols ); } } for ( unsigned int i = 0; i < rows; i++ ) { for ( unsigned int j = 0; j < cols; j++ ) { std::cout << std::setw( 2 ) << m[i][j] << ' '; } std::cout << std::endl; } std::cout << std::endl; swap_min( m, rows ); for ( unsigned int i = 0; i < rows; i++ ) { for ( unsigned int j = 0; j < cols; j++ ) { std::cout << std::setw( 2 ) << m[i][j] << ' '; } std::cout << std::endl; } std::cout << std::endl; } Ее примерный вывод на консоль 12 10 15 14 16 7 18 1 16 14 9 6 1 9 18 4 8 15 11 3 7 18 1 16 14 12 10 15 14 16 9 6 1 9 18 4 8 15 11 3 Опять-таки для обмена двух строк двумерного массива вы могли бы применить стандартный алгоритм std::swap, как это указано в комментарии внутри функции.

Ответ 2



int *m[] - это массив указателей. Точнее, это указатель на указатель, поскольку в подпрограмму массивы так не передаются. Вы можете просто поменять местами два указателя - это будет выглядеть как обмен двух строк местами.

Комментариев нет:

Отправить комментарий