2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Перестановка строк в матрице по некоему признаку.I курс[C++]
Сообщение07.05.2016, 17:42 
Здравствуйте.
Задача: Дана матрица действительных чисел размера n x m. Переформировать матрицу таким образом, чтобы ее строки располагались в порядке невозрастания сумм модулей нечетных элементов строк.
Получается выполнить для матриц с количеством строк или столбцов больше 2 (двух). Матрица 3x2 обрабатывается неправильно, а на матрице 2x3 консоль просто закрывается. Затуп, как я вижу, в трех вложенных циклах "for". Но где - не понимаю.
Помогите, пожалуйста. Буду очень рад как увидеть другую организацию циклов "for", так и просто другое решение, чтобы матрицы 3x2 и 2x3 не глючили.
Возможно ведь определить какой-то общий кусок кода, где по параметру строки (сумма модулей нечетных элементов, произведение четных элементов крученое из-под коленки), строки можно сортировать. Потому что по большому счету кроме трех вложенных циклов "for" остальное - рутина-рутинная.
Спасибо.
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#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 --

Здравая ли это идея: сформировать помимо массива модулей элементов еще и массив индексов строк и, обращаясь к нему, сформировать новую матрицу в соответствии с условием?

 
 
 
 Re: Перестановка строк в матрице по некоему признаку. I курс
Сообщение07.05.2016, 19:04 
Ошибка в строке:
Используется синтаксис C++
for (int counter2 = counter1+1; counter2 < columns; counter2++)
Должно быть:
Используется синтаксис C++
for (int counter2 = counter1+1; counter2 < rows; counter2++)


-- 07.05.2016, 23:12 --

dmitry4xy в сообщении #1121837 писал(а):
Здравая ли это идея: сформировать помимо массива модулей элементов еще и массив индексов строк и, обращаясь к нему, сформировать новую матрицу в соответствии с условием?
При сортировке можно переставлять указатели на строки, это позволит обойтись без дополнительных массивов:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
int *buffer2;
for (int counter1 = 0; counter1 < rows-1; counter1++)
{
    for (int counter2 = counter1+1; counter2 < rows; counter2++)
    {
        if (pointer_arr1[counter1]<pointer_arr1[counter2])
        {
            buffer = pointer_arr1[counter1];
            pointer_arr1[counter1] = pointer_arr1[counter2];
            pointer_arr1[counter2] = buffer;

            buffer2 = a[counter1];
            a[counter1] = a[counter2];
            a[counter2] = buffer2;
        }
    }
}

 
 
 
 Re: Перестановка строк в матрице по некоему признаку. I курс
Сообщение07.05.2016, 19:13 
Воу. Действительно.
Спасибо, Progger!
Тема закрыта.

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group