#include <iostream>
#include <iomanip>
#include <time.h>
#include <cmath>

using namespace std;

int main(void) {

    // random number for rand()
    srand(time(0));

    int m = 5;  // row count
    int n = 5;  // column count

    // declaration of a dynamic array of pointers
    auto arr = new double*[n];

    // filling the array with pointers
    for (int i = 0; i < n; i++)
        arr[i] = new double[m];

    // array initialization with random numbers
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            arr[i][j] = (double) (rand() % 400 - 199) / 2.0;    // (-100.0; 100.0)

    // matrix output
    cout << "\n\033[92mOriginal array:\033[94m" << endl;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++)
            //printf("%5.1f ", arr[i][j]);
            cout<<setw(6)<<fixed<<setprecision(1)<<arr[i][j];
        cout << endl;
    }


    // array for the sums of modules of the row elements
    auto sumOfAbsolutes = new double[m];

    // Initializing the array with zeros
    for (int i = 0; i < m; i++) 
        sumOfAbsolutes[i] = 0;

    // filling the array with the sums of element modules
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            sumOfAbsolutes[i] += abs(arr[i][j]);

    // output
    cout << "\n\033[92mSums of modules of array row elements:" << endl;
    for (int i = 0; i < m; i++) 
        cout << "\033[92m" << i << ": \033[94m"<< sumOfAbsolutes[i] << "   ";
    cout << "\n\n";


    // sorting
    for (int i = 0; i < (m - 1); i++)
        for (int j = i; j < m; j++)
            if (sumOfAbsolutes[i] > sumOfAbsolutes[j]) {
                double tmp = sumOfAbsolutes[i];
                sumOfAbsolutes[i] = sumOfAbsolutes[j];
                sumOfAbsolutes[j] = tmp;

                double *tmp2 = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp2;
            }

    // matrix output
    cout << "\033[92mSorted array:\033[94m" << endl;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++)
            //printf("%5.1f ", arr[i][j]);
            cout<<setw(6)<<fixed<<setprecision(1)<<arr[i][j];
        cout << endl;
    }


    int columnWithMaxNegNum = 0;        // the column with the maximal negative element
    int minNumber = 0;                  // the column with the minimum element

    // search for the maximal negative element
    double maxNegNum = -100.0;   // tbd
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                if (arr[i][j] < 0 && arr[i][j] > maxNegNum) {
                    columnWithMaxNegNum = j;
                    maxNegNum = arr[i][j]; 
                }    
    // minimum element search
    double minN=100.0;
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            if (arr[i][j] < minN) {
                minNumber = j;
                minN = arr[i][j];
            }

    cout << "\n\033[92mThe column with the maximum negative element: \033[94m" << columnWithMaxNegNum << endl;
    cout << "\033[92mThe column with the minimum element: \033[94m" << minNumber << endl;

    // rearrangement of columns
    for (int i = 0; i < m; i++) {
        double temp = arr[i][columnWithMaxNegNum];
        arr[i][columnWithMaxNegNum] = arr[i][minNumber];
        arr[i][minNumber] = temp;
    }

    cout << "\n\033[92mRearrangement of columns:" << endl;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++)
            printf("\033[94m%5.1f ", arr[i][j]);
        cout << "\n\033[0m";
    }

    // memory cleanup
    delete[]sumOfAbsolutes;
    for (int i = 0; i < n; i++)
        delete[]arr[i];
    delete[]arr;
}
