Как применить в текущем коде указатели и сделать его более лаконичным?

В универе задали задачу:

в данной действительной матрице размера m x n поменять местами строку, содержащую элемент с наибольшим значением, со строкой, содержащей элемент с наименьшим значением. Предполагается, что такой элемент единственный. Необходимо решить задачу двумя способами - с использованием указателей и без указателей.

Без указателей я решил задачу так:

#include<iostream>

using namespace std;

int main() {
    int A[256][256];
    int i, j, m, n, A_min = 100, A_max = 0, i_min, i_max;
    int A_min1, A_max1, tmp;
    cout << "input m: ";
    cin >> m;
    cout << "input n: ";
    cin >> n;
    printf("\n");
    cout << "input array A " << m << " x " << n << ":";
    printf("\n");
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            scanf("%d", &A[i][j]);
        }
    }
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
           if (A_min > A[i][j]) A_min = A[i][j];
           if (A_max < A[i][j]) A_max = A[i][j];
        }
        if (i == 0) i_min = 0, A_min1 = A_min;
        else if (A_min1 > A_min) i_min++,  A_min1 = A_min;
        if (i == 0) i_max = 0, A_max1 = A_max;
        else if (A_max1 < A_max) i_max++,  A_max1 = A_max;
    }
        for (j = 0; j < n; j++) {
        tmp = A[i_min][j];
        A[i_min][j] = A[i_max][j];
        A[i_max][j] = tmp;
    }
    cout << "\n";
    cout << "Array A:" << endl;
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            cout << A[i][j] << " ";
        }
        cout << "\n";
    }
}

К тому же я уверен, что код вообще не лаконичен и написан криво. Особенной в той части, где я ищу номера строк с минимальным и максимальным элементом.

Помогите применить указатели в коде и сделать его более лаконичным.

Краткое описание кода: -ввод размерности будущего массива; -ввод элементов массива; -поиск максимального и минимального элемента массива, поиск номера строк, в которых они лежат; -взаимная замена строк; -вывод новой матрицы.


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

Автор решения: Cеньер Помидор

Я так понимаю, что решить задачу с использованием указателей - работать с динамическим массивом, а не статическим(как у вас в примере)?

    #include<iostream>
    
    using namespace std;
    
    int main() {
        int n, m, max, min, max_i = 0 , min_i = 0; // n - размер строки, m - столбца
        cout << "Input n, m:\n";
        cin >> n >> m;
    
        // int mtr[256][256]; // ваш способ
    
        int** mtr = new int* [m]; // выделение памяти под матрицу с использованием указателей (динамически)
        for (int i = 0; i < m; i++) {
            mtr[i] = new int[n];
        }
        cout << "Input matrix " << n << " x " << m << ":\n";
    
        
        for (int i = 0; i < m; i++) { // вводим значения матрицы
            for (int j = 0; j < n; j++) {
                cin >> mtr[i][j];
            }
        }
    
        min = max = mtr[0][0]; // пусть минимальный и максимальный - первый элемент матрицы
    
        for (int i = 0; i < m; i++) { // проходимся по всем элементам матрицы и ищем максимальный и минимальный элемент
            for (int j = 0; j < n; j++) {
                if (mtr[i][j] > max) {
                    max = mtr[i][j];
                    max_i = i;
                }
                if (mtr[i][j] < min) {
                    min = mtr[i][j];
                    min_i = i;
                }
            }
        }
    
        if (max_i != min_i) { // если min и max в одной строке то ничего не меняем
            for (int j = 0; j < n; j++) { // меняем строки местами
                swap(mtr[min_i][j], mtr[max_i][j]); // вместо swap можем менять элементы нативно
            }
        }
    
        cout << "\nMatrix:\n";
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                cout << mtr[i][j] << ' ';
            }
            cout << '\n';
        }
    
        for (int i = 0; i < m; i++) { // освобождаем память занятую под матрицу в строках 12, 14
            delete[] mtr[i];
        }
        delete[] mtr;
    
        return 0;
    }

→ Ссылка