Сортировка столбцов матрицы

92
06 февраля 2021, 19:20

Задание звучит так:

Характеристикою стовпця матриці назвемо суму його від’ємних непарних елементів. Переставляючи стовпці матриці, розташувати їх відповідно до спадання характеристик.

То есть, рассмотрим пример на вот такой матрице:

-3 -5 1 0

1 -3 -1 0

-2 3 0 0

По заданию мы должны из каждого столбца узнать сумму его отрицательных нечетных элементов.

Из первого столбца мы достаем только -3, из второго сумму -3 и -5, то есть -8, из третьего берем -1, а в четвертом у нас 0.

Из этих сумм у нас строится вот такой масивчик:

-3 -8 -1 0

и сортируется по убыванию:

0 -1 -3 -8

Как мне теперь доработать код в 130 строке, чтобы по этому массиву у меня сортировались столбцы основного массива? Помогите, пожалуйста.

Код:

#include "pch.h"
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <iomanip>
#include <conio.h>
using namespace std;
float Scaner();
struct Matrix {
    int rows, columns;
    int **ptr;
};
void inputMatrixRandom(Matrix matrix);
void inputMatrixKeyboard(Matrix matrix);
void sortMatrix(Matrix matrix);
void outputMatrix(Matrix matrix);
void removeMasiv(Matrix matrix);
Matrix vidileniePamiati(int rows, int columns);
int main() {
    setlocale(LC_ALL, "rus");
    char v;
    int rows, columns;
    cout << "Введите кол-во строк матрицы:\n";
    cout << " > ";
    rows = (int)Scaner();
    cout << "Введите кол-во столбцов матрицы:\n";
    cout << " > ";
    columns = (int)Scaner();
    Matrix t = vidileniePamiati(rows, columns);
    do {
        cout << "\nВыберите действие:" << endl;
        cout << " 1 - Заполнение матрицы рандомными числами" << endl;
        cout << " 2 - Заполнение матрицы с клавиатуры" << endl;
        cout << " 3 - Выполнение задания" << endl;
        cout << " 4 - Вывод матрицы на консоль" << endl;
        cout << " 0 - Выход" << endl;
        cout << "  > ";
        v = _getche();
        switch (v) {
        case '1':
            inputMatrixRandom(t);
            break;
        case '2':
            cout << "\n\nЗаполните массив:\n";
            inputMatrixKeyboard(t);
            break;
        case '3':
            sortMatrix(t);
            break;
        case '4':
            cout << "\n\nПостроенная матрица:\n";
            outputMatrix(t);
            break;
        case '0':
            removeMasiv(t);
            break;
        default:
            cout << " [ERROR] Вы ввели некорректное значение." << endl;
        } // закрывающая switch
    } while (v != '0');
    return 0;
}
void inputMatrixRandom(Matrix matrix) {
    for (int i = 0; i < matrix.rows; i++)
        for (int j = 0; j < matrix.columns; j++)
            matrix.ptr[i][j] = rand() % 100;
}
void inputMatrixKeyboard(Matrix matrix) {
    for (int i = 0; i < matrix.rows; i++) {
        for (int j = 0; j < matrix.columns; j++)
            cin >> matrix.ptr[i][j];
    }
}
void outputMatrix(Matrix matrix) {
    for (int i = 0; i < matrix.rows; i++) {
        for (int j = 0; j < matrix.columns; j++) {
            cout << matrix.ptr[i][j] << " ";
        }
        cout << endl;
    }
}
void sortMatrix(Matrix matrix) {
    int *chislo = new int[matrix.columns];
    for (int j = 0; j < matrix.columns; j++) {
        chislo[j] = 0;
    }
    cout << "\n\nПроверка на подходимость числа:" << endl;
    // Проверка на подходимость и занесение подходящих чисел в массив chislo
    for (int i = 0; i < matrix.rows; i++) {
        for (int j = 0; j < matrix.columns; j++) {
            if (matrix.ptr[i][j] % 2 == -1) {
                cout << " +"; // отладочный вывод
                chislo[j] += matrix.ptr[i][j];
            }
            else {
                cout << " -"; // отладочный вывод
                chislo[j] += 0;
            }
        }
        cout << endl;
    }
    cout << endl;
    for (int i = 1; i < matrix.columns; ++i) {
        for (int j = 0; j < matrix.columns - i; j++) {
            if (chislo[j] < chislo[j + 1]) {
                int temp = chislo[j];
                chislo[j] = chislo[j + 1];
                chislo[j + 1] = temp;
                for () {
                }
            }
        }
    }
    cout << "Отсортированные характеристики:" << endl;
    // Проверял такой массив:
    // -3 -5  1  0
    //  1 -3 -1  0
    // -2  3  0  0
    // Проверка корректного занесения подходящих чисел со столбцов матрицы в одномерный массив chislo
    for (int j = 0; j < matrix.columns; j++) {
        cout << chislo[j] << " ";  // отладочный вывод 
    }                                            
    cout << "\n" << endl;
    cout << "Отсортированная матрица:" << endl;
    outputMatrix(matrix);
}
void removeMasiv(Matrix matrix) {
    for (int i = 0; i < matrix.rows; i++) {
        for (int j = 0; j < matrix.columns; j++) {
            delete[] matrix.ptr[j];
            delete[] matrix.ptr[i];
        }
    }
    delete[] matrix.ptr;
}
Matrix vidileniePamiati(int rows, int columns) {
    Matrix matrix;
    matrix.rows = rows;
    matrix.columns = columns;
    matrix.ptr = new int*[matrix.rows];
    for (int i = 0; i < matrix.rows; i++)
        matrix.ptr[i] = new int[matrix.columns];
    return matrix;
}
float Scaner() {
    bool good = true;
    float a;
    do {
        cin >> a;
        if (!(cin.good())) {
            good = false;
            cout << " [ERROR] Некорректное значение, повторите попытку:" << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << " > ";
        }
        else
            good = true;
    } while (!good);
    return a;
}
Answer 1

Подход правильный. Осталось только поменять столбцы и их характеристики. Вспоминайте метод сортировки самый простой основываясь на характеристики столбов.

    for (int i = 1; i < matrix.columns; ++i) {
      size_t smallest_stolb = matrix.columns - i ;
      // находим самый маленькую характеристику столбов
      for (int j = 0; j < matrix.columns - i; j++)
        if (chislo[j] < chislo[smallest_stolb])
          smallest_stolb = j ;       
      // столбы меняем, и их характеристику
      for (int j = 0; j < matrix.rows; j++) {
        int tmp = matrix.ptr[j][matrix.columns - i];
        matrix.ptr[j][matrix.columns - i] = matrix.ptr[j][smallest_stolb];
        matrix.ptr[j][smallest_stolb] = tmp ; }
      { int temp = chislo[matrix.columns - i];
        chislo[matrix.columns - i] = chislo[smallest_stolb];
        chislo[smallest_stolb] = temp; } }

Ещё ошибка удаления матрицы:

void removeMasiv(Matrix matrix) {
    for (int i = 0; i < matrix.rows; i++) {
        /*for (int j = 0; j < matrix.columns; j++) {
            delete[] matrix.ptr[j];*/
            delete[] matrix.ptr[i];
        //}
    }
    delete[] matrix.ptr; }
READ ALSO
Выравнивание дивов

Выравнивание дивов

На странице нужно поместить два дива рядом в один контейнерКаждый див имеет фиксированную ширину, но правый див может скрываться и нужно,...

109
Получить html сайта

Получить html сайта

На Go написал функцию для того чтобы получать html сайтов по url:

104
Размер кнопки над ячейкой таблицы

Размер кнопки над ячейкой таблицы

Как задать кнопке такой же размер как и ячейке таблицы, но так, чтобы она изменяла свой размер при разных разрешениях монитора как и эта самая...

109
Передача коллекции коллекций в TextBlock

Передача коллекции коллекций в TextBlock

Я думаю название уже звучит глупо, но давайте разберемсяСуть такова, что мне в столбец DataGrid'а нужно передать коллекцию коллекций, но не просто...

97