Здравствуйте.
Задача: Дана матрица действительных чисел размера n x m. Переформировать матрицу таким образом, чтобы ее строки располагались в порядке невозрастания сумм модулей нечетных элементов строк.
Получается выполнить для матриц с количеством строк или столбцов больше 2 (двух). Матрица 3x2 обрабатывается неправильно, а на матрице 2x3 консоль просто закрывается. Затуп, как я вижу, в трех вложенных циклах "for". Но где - не понимаю.
Помогите, пожалуйста. Буду очень рад как увидеть другую организацию циклов "for", так и просто другое решение, чтобы матрицы 3x2 и 2x3 не глючили.
Возможно ведь определить какой-то общий кусок кода, где по параметру строки (сумма модулей нечетных элементов, произведение четных элементов крученое из-под коленки), строки можно сортировать. Потому что по большому счету кроме трех вложенных циклов "for" остальное - рутина-рутинная.
Спасибо.
#include <conio.h>
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <stdlib.h>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
void show_matrix(int **, int , int );
void show_arr (int *, int );
//--------------------------------------------
int rows, columns;
int **a;
cout << "Введите количество строк: "; cin >> rows; cout << "\n";
cout << "Введите количество столбцов: "; cin >> columns; cout << "\n";
// Выделим память на массив a. Каждый элемент массива - указатель на int.
a = new int *[rows];
// Выделение памяти для каждого элемента a[i]. a[i] адресует columns элементов типа int.
for (int i = 0; i < rows; i++) {a[i] = new int [columns];}
// Ввод матрицы.
cout << "Введите матрицу: \n";
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
cin >> a[i][j];
}
}
cout << "\nВведенная матрица: \n";
show_matrix(a, rows, columns);
//--------------------------------------------
// Суммируем элементы в строке.
int *pointer_arr1 = new int [rows];
for(int i = 0; i < rows; i++)
{
pointer_arr1[i] = 0;
for(int j = 0; j < columns; j += 2)
{
pointer_arr1[i] += abs(a[i][j]);
}
}
cout << "Сумма модулей элементов, стоящих на нечетных позициях в строках: \n";
show_arr (pointer_arr1, rows);
cout << "\n";
// Определим буферную матрицу.
int **b;
b = new int *[rows];
for (int i = 0; i < rows; i++) {b[i] = new int [columns];}
int buffer = 0; // Буферная переменная.
for (int counter1 = 0; counter1 < rows-1; counter1++)
{
for (int counter2 = counter1+1; counter2 < columns; counter2++)
{
if (pointer_arr1[counter1]<pointer_arr1[counter2])
{
buffer = pointer_arr1[counter1];
pointer_arr1[counter1] = pointer_arr1[counter2];
pointer_arr1[counter2] = buffer;
for (int i = 0; i < columns; i++)
{
b[counter1][i] = a[counter1][i];
a[counter1][i] = a[counter2][i];
a[counter2][i] = b[counter1][i];
}
}
}
}
cout << "Сумма модулей элементов, стоящих на нечетных позициях в строках, расположенная в порядке невозрастания: \n";
show_arr (pointer_arr1, rows);
cout << "Измененная матрица: \n";
show_matrix(a, rows, columns);
for (int i=0; i<rows; i++)
//освобождение памяти для каждого элемнта a[i]
delete [] a[i];
//освобождение памяти для а
delete []a;
for (int i=0; i<rows; i++)
//освобождение памяти для каждого элемнта b[i]
delete [] b[i];
//освобождение памяти для b
delete [] b;
system ("pause");
return 0;
}
void show_matrix(int **a, int rows, int columns){
for (int i=0; i<rows; cout<<"\n", i++)
for (int j=0; j<columns; j++)
cout<<a[i][j]<<"\t";
}
void show_arr (int *pointer_arr1, int arr_length) {
for (int counter = 0; counter < arr_length; counter++)
{
cout << pointer_arr1[counter] << " ";
}
cout << "\n";
}
-- 07.05.2016, 17:51 ---- 07.05.2016, 17:55 --Здравая ли это идея: сформировать помимо массива модулей элементов еще и массив индексов строк и, обращаясь к нему, сформировать новую матрицу в соответствии с условием?