Как поменять максимальные элементы в столбцах матрицы C++

Суть проблемы: Не получается поменять местами максимальные элементы в столбцах матрицы.

Как мне кажется, я не правильно написал подпрограмму. Хотя когда выводятся максимальные значения 0 и k столбцов, значения верны. Но не понятен тот факт, почему он после команды swap не меняет местами элементы.

Задание: В матрице А (n строк, m столбцов) поменять местами наибольшие элементы в первом и k-том столбцах (2<=k<=m). Для поиска номера наибольшего элемента в заданном столбце матрицы использовать подпрограмму. '''

#include <iostream>
#include <ctime>
using namespace std;
int function(double* A, int n, int m, int k)
{
int max = *A;
for (int i = 0; i < n; i++)
{
    for (int j = k; j < (k + 1); j++)
    {
        if (A[m * i + j] > max)
        {
            max = A[m * i + j];
        }
    }
}
return max;
}

int main()
{
srand(time(NULL));
setlocale(0, "");
cout << "ВНИМАНИЕ! ЗНАЧЕНИЯ СТРОК И СТОЛБОЦОВ НАЧИНАЮТСЯ С 0!\n";
double mas[100] = {};
int i, j, N, M;
int max1 = 0;
int maxk = 0;

cout << "\nВведите кол-во строк n и столбцов m матрицы";
cout << endl;
cin >> N >> M;
cout << "Введите элементы матрицы" << endl;
if (N <= 0 || M <= 0)
{
    cout << "Неверные значения n и m";
}
for (i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
    {
        mas[M * i + j] = rand() % 100;
    }
cout << endl;


cout << "\nВведенная матрица:" << endl;

for (i = 0; i < N; i++)
{
    for (j = 0; j < M; j++)
        cout << mas[M * i + j] << "  ";
    cout << endl;
}
int K = 0;

max1 = function(mas, N, M, K);

cout << "\nВведите k(От 0 до m): ";
cin >> K;
if (K > M - 1)
{
    cout << "Неверное k";
    return 0;
}
maxk = function(mas, N, M, K);

cout << "\nМаксимальное значение в 0 столбце: " << max1 << endl;
cout << "\nМаксимальное значение в " << K << " столбце: " << maxk << endl;
cout << "\nИзмененная матрица:" << endl;

for (i = 0; i < N; i++)
{
    swap(mas[max1], mas[maxk]);
    for (j = 0; j < M; j++)
    {
        cout << mas[M * i + j] << "  ";
    }
    cout << endl;
}
return 0;
}

'''


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

Автор решения: MBo

Ваша функция должна возвращать индекс, а возвращает значение максимума, да и его, похоже, считает неверно.

Попробуйте так (не тестировал):

int getmaxidx(double* A, int n, int m, int k)
{
   int imax = k;
   for (int i = 1; i < n; i++)
       if (A[m * i + k] > A[imax])
            imax = m * i + k;
    return imax;
}

Для вывода значения, понятно, придётся делать

  cout << "\nМаксимальное значение в 0 столбце: " << A[max1] << endl

А обмен-то зачем в цикле? Просто один swap

→ Ссылка