Как применить в текущем коде указатели и сделать его более лаконичным?
В универе задали задачу:
в данной действительной матрице размера 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 шт):
Я так понимаю, что решить задачу с использованием указателей - работать с динамическим массивом, а не статическим(как у вас в примере)?
#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;
}