2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Перестановка строк в матрице по некоему признаку.I курс[C++]
Сообщение07.05.2016, 17:42 


05/01/16
26
Здравствуйте.
Задача: Дана матрица действительных чисел размера 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 


27/08/14
207
Ошибка в строке:
Используется синтаксис 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 


05/01/16
26
Воу. Действительно.
Спасибо, Progger!
Тема закрыта.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group