Задание звучит так:
Характеристикою стовпця матриці назвемо суму його від’ємних непарних елементів. Переставляючи стовпці матриці, розташувати їх відповідно до спадання характеристик.
То есть, рассмотрим пример на вот такой матрице:
-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;
}
Подход правильный. Осталось только поменять столбцы и их характеристики. Вспоминайте метод сортировки самый простой основываясь на характеристики столбов.
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; }
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
На странице нужно поместить два дива рядом в один контейнерКаждый див имеет фиксированную ширину, но правый див может скрываться и нужно,...
Как задать кнопке такой же размер как и ячейке таблицы, но так, чтобы она изменяла свой размер при разных разрешениях монитора как и эта самая...
Я думаю название уже звучит глупо, но давайте разберемсяСуть такова, что мне в столбец DataGrid'а нужно передать коллекцию коллекций, но не просто...