Замена элементов матрицы

139
13 октября 2021, 18:20

Есть задание: Динамически выделить память под N*M элементов целого типа int. Разработать алгоритм и программу обработки двумерного динамического массива с использованием указателей. Найти минимальный и максимальный элемент каждого столбца и поменять их местами с первым и с последним элементом этого столбца соответственно.

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

#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
void zapolnit(int** arr, int n, int m)// Функция заполнения
{
srand(time(0));
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < m; j++)
    {
        arr[i][j] = rand() % 10;
        cout << arr[i][j] << "     ";
    }
    cout << endl;
}
}
void max(int** arr, int n, int m)
{
int max = 0;
int min = 9;
//m - cols
//n - rows
for (int i = 0; i < m; i++){
    for (int j = 0; j < n; j++){
        if (arr[j][i] > max){
            max = arr[j][i];
        }
        if (arr[j][i] < min){
            min = arr[j][i];
        }
    }
    cout << i << " : " << min << "; " << max << "\n";
    max = 0;
    min = 9;
   }
  }
  int main()
  {
  int n;
  int m;
cout << "n = " << endl;
cin >> n; //Ввод количества строк массива
cout << "m = " << endl;
cin >> m;//Ввод количества столбцов массива
cout << endl;
int **arr = new int*[n];//объявление массива
for (int i = 0; i < n; i++)
{
    arr[i] = new int[m];
}
zapolnit(arr, n, m);
max(arr, n, m);
system("pause");
}
Answer 1

Предлагаю такое решение:

  1. Создать 2 дополнительных указателя в вашей функции, которые будут хранить в себе адреса минимального и максимального элемента в столбце:

    int *min_element_ptr = *arr + i;
    int *max_element_ptr = *arr + i;
    
  2. При каждом успешном прохождении проверок минимальности и максимальности записывать адрес элемента, прошедшего проверку, в указатели из п.1

    if (arr[j][i] > max)
    {
        max = arr[j][i];
        max_element_ptr = *(arr + j) + i;
    }
    if (arr[j][i] < min)
    {
        min = arr[j][i];
        min_element_ptr = *(arr + j) + i;
    }
    
  3. Реализовать функционал по обмену этих указателей:

    void SwapElements(int *lhs, int *rhs)
    {
        int tmp = *lhs;
        *lhs = *rhs;
        *rhs = tmp;
    }
    
  4. Непосредственно вызвать:

    SwapElements(min_element_ptr, max_element_ptr);
    

Также несколько замечаний по поводу вашего кода: 1. Не освобождаете память 2. max и min лучше инициализировать первым элементом из исходного массива, и также перенести их инициализацию внутрь первого цикла, так вам не придется самостоятельно переинициализировать их в конце.

Полный код:

#include <iostream>
#include <ctime>
using namespace std;
void InitializeMatrix(int ***arr_ptr, int n, int m)
{
    *arr_ptr = new int*[n];
    for (int i = 0; i < n; i++)
    {
        (*arr_ptr)[i] = new int[m];
    }
}
void DeleteMatrix(int ***arr_ptr, int n, int m)
{
    for (int i = 0; i < n; i++)
    {
        delete[] (*arr_ptr)[i];
    }
    delete[] (*arr_ptr);
}
void FillRandom(int** arr, int n, int m)
{ 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            arr[i][j] = rand() % 10;
        }
    }
}
void PrintMatrix(int** arr, int n, int m)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << arr[i][j] << "     ";
        }
        cout << endl;
    }
}
void SwapElements(int *lhs, int *rhs)
{
    int tmp = *lhs;
    *lhs = *rhs;
    *rhs = tmp;
}
void SwapMaxMinElements(int** arr, int n, int m)
{
    for (int i = 0; i < m; i++)
    {
        int max = arr[0][i];
        int min = arr[0][i];
        int *min_element_ptr = *arr + i;
        int *max_element_ptr = *arr + i;
        for (int j = 0; j < n; j++)
        {
            if (arr[j][i] > max)
            {
                max = arr[j][i];
                max_element_ptr = *(arr + j) + i;
            }
            if (arr[j][i] < min)
            {
                min = arr[j][i];
                min_element_ptr = *(arr + j) + i;
            }
        }
        cout << "column=[" << i << "] " << " : " << "min=[" << min << "] " << "max=[" << max << "]\n";
        SwapElements(min_element_ptr, max_element_ptr);
    }
}
int main()
{
    int n;
    int m;
    srand(time(nullptr));
    cout << "n = " << endl;
    cin >> n;
    cout << "m = " << endl;
    cin >> m;
    cout << endl;
    int **arr = nullptr;
    InitializeMatrix(&arr, n, m);
    FillRandom(arr, n, m);
    PrintMatrix(arr, n, m);
    SwapMaxMinElements(arr, n, m);
    PrintMatrix(arr, n, m);
    DeleteMatrix(&arr, n, m);
}
READ ALSO
Итераторы, rvalue и lvalue

Итераторы, rvalue и lvalue

По определённым причинам имеется необходимость реализовать собственный итератор (Forward iterator) здесь сказано следующее:

248
Коллекции &lt;?, array&lt;type&gt;&gt; на C++/CLI

Коллекции <?, array<type>> на C++/CLI

Доброго времени суток

82
condition_variable почему не залочился в unique_lock?

condition_variable почему не залочился в unique_lock?

Есть такой пример использования condition_variable:

101
Вычисление одинаковых цифр числа. Код есть, он работает. Но вылетает при использовании больших чисел

Вычисление одинаковых цифр числа. Код есть, он работает. Но вылетает при использовании больших чисел

Учу С++ самостоятельно, вот решил написать программу, которая определяет, есть ли повторяющиеся цифры в числеЧтобы усложнить себе жизнь, добавил...

352