Есть задание: Динамически выделить память под 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");
}
Предлагаю такое решение:
Создать 2 дополнительных указателя в вашей функции, которые будут хранить в себе адреса минимального и максимального элемента в столбце:
int *min_element_ptr = *arr + i;
int *max_element_ptr = *arr + i;
При каждом успешном прохождении проверок минимальности и максимальности записывать адрес элемента, прошедшего проверку, в указатели из п.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;
}
Реализовать функционал по обмену этих указателей:
void SwapElements(int *lhs, int *rhs)
{
int tmp = *lhs;
*lhs = *rhs;
*rhs = tmp;
}
Непосредственно вызвать:
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);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
По определённым причинам имеется необходимость реализовать собственный итератор (Forward iterator) здесь сказано следующее:
Есть такой пример использования condition_variable:
Учу С++ самостоятельно, вот решил написать программу, которая определяет, есть ли повторяющиеся цифры в числеЧтобы усложнить себе жизнь, добавил...