Форум программистов, компьютерный форум CyberForum.ru

Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию - C++

Восстановить пароль Регистрация
 
Nadia Trofimova
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 25
29.10.2013, 22:21     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #1
Срочно понадобилась помощь! Дано такое условие:

Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию.
Способ сортировки я знаю. Знаю, естественно, как ввести матрицу. Но как сделать так, как в условии, а именно нужным образом переставить строки?
Хотелось бы подсказочку, что за чем идёт(
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2013, 22:21     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию
Посмотрите здесь:

Матрицы, Ассемблерная вставка. Всем элементам второй строки присвоить соответствующие элементы последнего столбца C++
C++ Преобразовать строку так, чтобы все буквы в ней были отсортированы по возрастанию
Преобразовать строку так, чтобы все буквы в ней были отсортированы по возрастанию (работайте с английским алфавитом). C++
C++ Преобразовать строку так, чтобы буквы каждого слова были остортированы по возрастанию
Преобразовать строку таким образом, чтобы буквы каждого слова в ней были отсортированы по возрастанию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
29.10.2013, 22:31     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #2
Nadia Trofimova, алгоритм: представьте последний столбец как простой одномерный массив. А теперь вместо того, что бы поменять местами 2 элемента в нем (при сортировке), впишите замену 2 строк в цикле
что то типа:
C++
1
2
3
4
5
6
for (int i = 0; i < n; i++)
{
int temp = a[j][i];
a[j][i]=a[j][i];
a[j+1][i]=temp;
}
Ну или с помощью swap
Писал функцию, ориентируясь на способ сортировки пузырьком. У нас его так называли
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,698
Записей в блоге: 3
30.10.2013, 02:18     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>//это всегда хорошо (потоки cin,cout,cerr)
#include <ctime>   //time() - для получения числа засевающего (случайно инициализирующего) random()
#include <cstdlib> //srand() - засевает рандомайзер длинным целым от которого тот генерит псевдослучайное число, rand() - сам рандомайзер
#include <windows.h>
using namespace std;
 
int main()
{
SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
int sz_matr_columns;//количество элементов в строке (столбцов)
cout << "Введите количество элементов в строке 2-D матрицы " << endl;
cin >> sz_matr_columns;
int sz_matr_rows;//количество элементов в столбцe (строк)
cout << "Введите количество элементов в столбце 2-D матрицы " << endl;
cin >> sz_matr_rows;
int **matrix_2d = new int *[sz_matr_rows];
for( int i = 0; i < sz_matr_rows; ++i) matrix_2d[i] = new int[sz_matr_columns];
srand((int)time(0));//сеем рандомайзер
//диапазон элементов задайте сами, а для примера: 
int minElemArr=0;
int maxElemArr=sz_matr_columns*sz_matr_rows;
//выводим полученную матрицу
cout<<"\nСгененерировали::"<<endl;
for( int i = 0; i < sz_matr_rows; ++i){
    for( int j = 0; j < sz_matr_columns; ++j){
matrix_2d[i][j] = minElemArr +rand()%(maxElemArr - minElemArr+1);
cout<<matrix_2d[i][j]<<"\t";
    }
cout<<endl;
}
//пузырёк:)
//сортируем указатели на строки матрицы по знаяению последнего элемента строки
int *ptr_tmp=0;
for(int i = 0; i<sz_matr_rows-1; ++i){
for(int j = sz_matr_rows-1; j > i; --j){
    if(matrix_2d[j-1][sz_matr_columns-1] > matrix_2d[j][sz_matr_columns-1]){
ptr_tmp = matrix_2d[j-1];
matrix_2d[j-1] = matrix_2d[j];
matrix_2d[j] = ptr_tmp;
    }
}
}
cout<<"\nОтсортировали:"<<endl;
//выводим отсортированную матрицу
for( int i = 0; i < sz_matr_rows; ++i){
    for( int j = 0; j < sz_matr_columns; ++j){
cout<<matrix_2d[i][j]<<"\t";
    }
cout<<endl;
}
 
cout << endl;
system ("pause" );
    return 0;
}
Nadia Trofimova
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 25
30.10.2013, 21:41  [ТС]     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #4
Спасибо большое)

Добавлено через 1 час 56 минут
И всё-таки, не смотря на хороший пример, я должна написать код так, как от меня хотят - а именно несколько попроще. Мой тип сортировки - прямой обмен.
Вот мой код, он не компилируется( Где здесь ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<iostream>
 
using namespace std;
 
int main()
{
setlocale(LC_ALL, "Russian");
const int r=5;
    int a[r][r]; 
        int b[r][r];
    int i,j;
    int k,n, l, x;
    int m;
 
 
        cout << "Enter n:" << endl;
        cin >> n; // размерность матрицы в пределах 5
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
            {
                cout <<"\n a["<<i<<"]["<<j<<"]=";
                cin>>a[i][j];
            }
 
            cout << "Не отсортированный массив:"<< endl;
            cout << "\n";
            for(k=0;k<n;k++)
            {
                cout << endl;
                for(j=0;j<n;j++)
                    cout <<  a[k][j]<< " ";
            }
            cout << "\n";
 
            //СОРТИРОВКА
              for (k=0; k<j-1; k++)
               {
                    x=a[k][j]; l=k;
                   for(j=j-1;j>k;k--)
    {
          if (a[j-1]<x) 
          {
              l=j; x=a[l];
          }
      a[l]=a[k][j-1]; a[k][j-1]=x;
      cout<<"\n"<<i+1<<" prochod"<<endl;
      for(i=0;i<n;i++)
            for(j=0;j<n;j++)
      {
          cout<<a[i][j]<<" ";
      }
 
    }
               }
 
    }
В часности, сообщение выдаёт такое, но я его не понимаю.
Миниатюры
Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию  
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
30.10.2013, 21:43     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #5
Nadia Trofimova, а на что ругается? На какую конкретно строку?
Nadia Trofimova
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 25
30.10.2013, 22:01  [ТС]     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #6
Вот здесь видно.
Миниатюры
Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию  
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
30.10.2013, 22:14     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #7
Nadia Trofimova, у вас на миниатюре выделена строка, вот строкой выше у вас идет обращение массиву а, как к одномерному. И не только там...
Nadia Trofimova
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 25
30.10.2013, 22:46  [ТС]     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #8
Заметила) Спасибо)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 1.   Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию. Прямой выбор.
 
#include<iostream>
 
using namespace std;
 
int main()
{
setlocale(LC_ALL, "Russian");
const int p=5;
    int a[p][p]; 
    int i,j;
    int k,n, l, x;
 
        cout << "Enter n:" << endl;
        cin >> n; // размерность матрицы в пределах 5
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
            {
                cout <<"\n a["<<i<<"]["<<j<<"]=";
                cin>>a[i][j];
            }
 
            cout << "Не отсортированный массив:"<< endl;
            cout << "\n";
            for(k=0;k<n;k++)
            {
                cout << endl;
                for(j=0;j<n;j++)
                    cout <<  a[k][j]<< " ";
            }
            cout << "\n";
 
            //СОРТИРОВКА
              for (k=0; k<j-1; k++)
               {
                    x=a[k][j]; l=k;
                   for(j=j-1;j>k;k--)
    {
          if (a[k][j-1]<x) 
          {
              l=j; x=a[k][j];
          }
      a[k][j]=a[k][j-1];
      a[k][j-1]=x;
    }
               }
      cout << "Отсортиорованный массив:" << endl;
      for(i=0;i<n;i++)
            for(j=0;j<n;j++)
      {
          cout<<a[k][j]<<" ";
          cout << "\n";
      }
 
    }
Код на данный момет... Но теперь просто не выполняет условие задачи( Если кто-нибудь увидит ошибку, буду очень благодарна. Выводится только не отсортированный массив и всё.
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
30.10.2013, 23:54     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #9
Здесь ( сообщение #4 ) приведён пример кода на Pascal'е.
Отсортировать содержимое файла F методом прямого обмена, и записать в файл G
Перепишем на C, учитывая, что нумерация элементов начинается с 0.
C++
1
2
3
4
5
6
7
8
9
10
for( i = 0; i < n-2; ++i )
for( j = i + 1; j < n; ++j )
{
    if( a[i][n-1] > a[j][n-1] )  // a[i][n-1] - элемент i-й строки последнего (n-1) столбца
    {
        // поменяем i-ю и j-ю строки матрицы 
        // ... 
    }
 
}
Scythian
 Аватар для Scythian
58 / 58 / 8
Регистрация: 01.01.2010
Сообщений: 222
31.10.2013, 01:20     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #10
C++
1
2
3
4
5
6
for(i=0;i<n;i++)
            for(j=0;j<n;j++)
      {
          cout<<a[k][j]<<" ";
          cout << "\n";
      }
a[k][j]? Проверьте индексы

Добавлено через 1 час 22 минуты
C++
1
2
3
4
5
6
7
8
9
10
temp=0;
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
            if(matrix[i][N-1]<matrix[j][N-1])
                for(int k=0;k<N;k++)
                {
                    temp=matrix[i][k];
                    matrix[i][k]=matrix[j][k];
                    matrix[j][k]=temp;
                }
Вот наваял сортировку, а ваша меня как то смущает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2013, 13:59     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию
Еще ссылки по теме:

C++ Дана произвольная матрица n m. Меняя местами строки и столбцы упорядочите элементы матрицы так, чтобы элементы
C++ В матрице Т размером nxn переставить столбцы так, чтоб на побочной диагонали элементы матрицы были упорядочены
Переставить строки матрицы так, чтобы суммы элементов строк были расположены в порядке их возрастания C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
31.10.2013, 13:59     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию #11
Nadia Trofimova,
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <QTextStream>
using namespace std;
 
void view (int** arr, int n, int m)
{
    QTextStream cout(stdout);
    cout << "---------------------------" << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cout << arr[i][j] << "   ";
        cout << endl;
    }
    cout << "---------------------------" << endl;
}
 
void swap_lines(int** arr, int m, int j)
{
    int temp;
    for (int k = 0; k < m; k++)
    {
        temp = arr[j][k];
        arr[j][k] = arr[j+1][k];
        arr[j+1][k] = temp;
    }
}
 
int main(int argc, char *argv[])
{
    QTextStream cout(stdout);
    QTextStream cin(stdin);
    int n,m; // матрица NxM
    cout << "N:" << endl;
    cin >> n;
    cout << "M:" << endl;
    cin >> m;
    int** arr = new int*[n];
    for (int i = 0; i < n; i++)
        arr[i] = new int[m];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            cout << "arr[" << i << "][" << j << "]:" << endl;
            cin >> arr[i][j];
        }
    /* Вывод */
    cout << "Array:" << endl;
    view(arr,n,m);
    /* Сортировка */
    int temp;
    for (int i=n-1;i>0;i--)
        for (int j=0;j<i;j++)
            if (arr[j][m-1] > arr[j+1][m-1]) swap_lines(arr,m,j);
    cout << "New Array:" << endl;
    view(arr,n,m);
    cout << "End!" << endl;
    for (int i = 0; i < n; i++)
        delete []arr[i];
    delete []arr;
    return 0;
}
вот. Вроде все ок
Yandex
Объявления
31.10.2013, 13:59     Переставить строки матрицы так, чтобы элементы последнего столбца были отсортированы по возрастанию
Ответ Создать тему
Опции темы

Текущее время: 00:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru