с++ удалить из матрицы нечетные строки, передвинув на их место следующие
Задача: удалить из матрицы 5х7 строки, сумма элементов которых нечетна, передвинув на их место следующие, без нарушения порядка их следования. Я создал матрицу, посчитал её элементы, но с логикой перемещения элементов какая-то беда. Матрица остается без изменений при выводе.
#include <iostream>
#include <cstdlib>
using namespace std;
int** createMatrix(int row, int col);
void fillingMatrix(int** matrix, int row, int col);
int** countRowMatrix(int** matrix, int row, int col);
void deletingRow(int** matrix, int row, int counting);
void showMatrix(int** matrix, int row, int col);
static int countDeleting = 0; //считаем сколько строк нужно удалить по итогу
int main()
{
int row, col;
setlocale(LC_ALL, "Russian");
cout << "введите количество строк: ";
cin >> row;
cout << "введите количество столбцов: ";
cin >> col;
int** matrix;
matrix = createMatrix(row, col);
fillingMatrix(matrix, row, col);
cout << "before" << endl;
showMatrix(matrix, row, col);
int** newmatrix = createMatrix(row, col);
newmatrix = countRowMatrix(matrix, row, col);
cout << "afrer:" << endl;
showMatrix(newmatrix, row, col);
cout << countDeleting;
}
int** createMatrix(int row, int col)
{
int** matrix; //двумерный указатель
matrix = new int* [row];
for (int i = 0; i < col; i++) { //для каждого элемента создаем "следующий уровень" вложенности
matrix[i] = new int[col];
}
return matrix;
}
void fillingMatrix(int** matrix, int row, int col)
{
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
matrix[i][j] = rand(); //случайные значения
}
}
}
int** countRowMatrix(int** matrix, int row, int col)
{
int sum = 0;
for (int i = 0; i < row; i++) { //i - номер текущей строки
for (int j = 0; j < col; j++) {
sum = sum + matrix[i][j];
}
if (sum % 2 == 1) {//если сумма значений текущей строки удовлетворяет условию, то
countDeleting++;
for (int nrow = i+1; i < row; i++) {
for (int ncol = col; ncol < col; ncol++) {
matrix[nrow - 1][ncol] = matrix[nrow][ncol];
}
}
}
sum = 0;//обнуляем значение суммы
}
return matrix;
}
void deletingRow(int** matrix, int row, int counting)
{
int newrow = row - counting; //новое количество строк в матрице
for (int i = row; i > newrow; i--) {
delete[] matrix[i];
}
}
void showMatrix(int** matrix, int row, int col)
{
int sum=0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cout << matrix[i][j] << '\t';
sum += matrix[i][j];
}
cout << sum;
cout << endl;
}
}
Ответы (2 шт):
Автор решения: vlad9i2
→ Ссылка
Матрица остаётся без изменений т.к. в вашем цикле путаница с переменными.
int** countRowMatrix(int** matrix, int row, int col)
{
int64_t sum = 0;
for (int i = 0; i < row - countDeleting; i++) { //i - номер текущей строки
for (int j = 0; j < col; j++) {
sum = sum + matrix[i][j];
}
if (sum % 2 == 1) {//если сумма значений текущей строки удовлетворяет условию, то
countDeleting++;
for (int nrow = i + 1; nrow < row; nrow++) {
for (int ncol = 0; ncol < col; ncol++) {
matrix[nrow - 1][ncol] = matrix[nrow][ncol];
}
}
i--;
}
sum = 0;//обнуляем значение суммы
}
return matrix;
}
Ещё у вас в showMatrix сумма строк не обнуляется после каждой итерации.
Также в этих строках:
int** newmatrix = createMatrix(row, col);
newmatrix = countRowMatrix(matrix, row, col);
Вы навсегда потеряете указатель на выделенную доп. память в createMatrix и у вас утечёт память.