Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
a.n.o.n.i.m
137 / 137 / 39
Регистрация: 26.02.2011
Сообщений: 535
#1

Сортировка самого столбца - C++

12.09.2012, 18:19. Просмотров 793. Ответов 11

Вообщем возникли затруднения со следующим
Матрица есть,раньше как то делал сортировку столбцов матрицы,а чтобы сами столбцы сортировались оставаясь на своих местах не приходилось,надеюсь поможет кто кодом

Нужно отсортировать САМ столбец по убыванию элементов,и так про каждый столбец.Пример
Исходная
Код
1.33  4.14  2.14  7.44
0.41  8.87     9  1.44
5.53  7.12  3.01  4.45
Отсортированная должна быть так(сам столбец сортируется)

C++ (Qt)
1
2
3
0.41  4.14  2.14  1.44
1.33  7.12  3.01  4.45
5.53  8.87     9  7.44
Заготовка
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
#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <conio.h>
#include <ctime> 
#include <iomanip> 
 
using namespace std;
 
int main()
{
    int m,n,i,j,k,temp=0;
    float x;
    
    setlocale(LC_ALL, "RUSSIAN");
    cout<<"\tVvedite razmernost matrix\n";
    cout<<"\nStrok: ";
        cin>>m;
    cout<<"Stolbcov: ";
    cin>>n;
    float **a=new float*[m];
    float *b=new float[m*n];
    for(i=0;i<m;i++)                       
    {
            a[i]=new float[n];
    }
    cout<<endl<<"\tMatrix\n\n";
    srand(time(NULL));
    for(i=0;i<m;i++)                        
    {
        for (j=0;j<n;j++)                  
        {
            a[i][j]=(rand() % 10 + 1) / float((rand() % 10 + 1));//числа от a до b рамдомно расположенные в матрице
             cout << setw(4) <<setprecision(2) <<a[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl<<"\tSortMatrix\n\n";
 
/*код.......*/
 
    for(i=0;i<m;i++)                        
    {
        for (j=0;j<n;j++)                  
        {
             cout << setw(4) <<setprecision(2) <<a[i][j]<<" ";
        }
        cout<<endl;
    }
    for(int i = 0; i < m; i++)
                {
                    delete [] a[i];
                }
                delete [] a;
    getch();
    return 0;
}
По идее в голову идет следующий алгоритм
1)Выписать столбец в одномерный массив
2)Упорядочить масив по убыванию
3)Записать полученный масив как столбец
4)Взять следующий столбец матрицы

Если это верно то на деле пока не получается реализовать,мож поможет кто кодом))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2012, 18:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сортировка самого столбца (C++):

Число. Вывести только цифры самого младшего и самого старшего разряда
Дано n-значное целое число введеное с клавиатуры. Вывести только цифры самого...

Определить координаты самого нижнего и самого правого из отрицательных элементов матрицы
В двумерном массиве имеются отрицательные элементы. Определить координаты...

Массив структур: найти самого младшего и самого старшего школьника
Кароч , я хз как работать со структурами, помогите плиз, желательно со...

Вывод из вектора самого короткого и самого длинного string значения
Вывод из вектора самого короткого и самого длинного string значения Подскажите...

Файлы: отсортировать и найти самого младшего и самого страшего с правами и без прав
Прошу помочь!!!:wall: В этой задачке мне необходимо отсортировать и найти...

Дана строка содержащая текст. Найти длину самого короткого и самого длинного слова.
помогите написать программу =) очень нужно=) Дана строка содержащая текст....

11
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
12.09.2012, 18:37 #2
Все намного проще:
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
int main() {
   std::size_t size = 5;
   int **array = new int *[ size ];
   int temp;
   bool flag = true;
   
   for ( std::size_t i = 0; i < size; i++ ) {
      array[ i ] = new int [ size ];
      
      for ( std::size_t j = 0; j < size; j++ )
         std::cout << ( array[ i ][ j ] = std::rand() % ( size + size )) << ' ';
      
      std::cout << std::endl;
   }
   
   std::cout << std::endl;
   
   for ( std::size_t i = 0; i < size; i++ ) {
      flag = true;
      
      for ( std::size_t lowBorder = size, curPos; flag; lowBorder-- ) {
         for ( curPos = 1, flag = false; curPos < lowBorder; curPos++ ) {
            if ( array[ curPos ][ i ] < array[ curPos - 1 ][ i ]) {
               temp = array[ curPos ][ i ];
               array[ curPos ][ i ] = array[ curPos - 1 ][ i ];
               array[ curPos - 1 ][ i ] = temp;
               flag = true;
            }
         }
      }
   }
   
   
   for ( std::size_t i = 0; i < size; i++ ) {
      for ( std::size_t j = 0; j < size; j++ )
         std::cout << array[ i ][ j ] << ' ';
      
      std::cout << std::endl;
   }
 
   return 0;
}
1
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
12.09.2012, 18:44 #3
a.n.o.n.i.m, через доп массив конечно можно, но можно и так:
C++
1
2
3
4
5
 for (int l=0; l<m; l++) 
   for (i=0; i<m; i++)
    for (j=0; j<m; j++)
      if (a[i][l]<a[j][l])
       swap(a[i][l],a[j][l]);
1
co6ak
Кошковед
515 / 503 / 63
Регистрация: 12.04.2010
Сообщений: 1,392
12.09.2012, 18:56 #4
бгг.
на все случаи жизни
в данном примере в функцию arraySort можно передавать каждый столбец матрицы.
все там весьма примитивно. даже сортир пузырьковый


надо же пиарить тему свою
1
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
12.09.2012, 18:59 #5
co6ak, как Вы собираетесь передавать столбец в функцию, если его элементы расположены в разных выделенных частях памяти?
1
valeriikozlov
Эксперт С++
4683 / 2509 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
12.09.2012, 19:03 #6
вариант (из первичного кода):
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
57
58
59
60
61
62
63
64
65
66
67
#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <conio.h>
#include <ctime> 
#include <iomanip> 
 
using namespace std;
 
int main()
{
    int m,n,i,j,k,temp;
    float x;
    
    setlocale(LC_ALL, "RUSSIAN");
    cout<<"\tVvedite razmernost matrix\n";
    cout<<"\nStrok: ";
        cin>>m;
    cout<<"Stolbcov: ";
    cin>>n;
    float **a=new float*[m];    
    for(i=0;i<m;i++)                       
    {
            a[i]=new float[n];
    }
    cout<<endl<<"\tMatrix\n\n";
    srand(time(NULL));
    for(i=0;i<m;i++)                        
    {
        for (j=0;j<n;j++)                  
        {
            a[i][j]=(rand() % 10 + 1) / float((rand() % 10 + 1));//числа от a до b рамдомно расположенные в матрице
             cout << setw(4) <<setprecision(2) <<a[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl<<"\tSortMatrix\n\n";
    for(i=0; i<n; i++)
    {
        for(j=0; j<m-1; j++)
        {
            temp=j;
            for(k=j+1; k<m; k++)
                if(a[temp][i]>a[k][i])
                    temp=k;
            x=a[j][i]; a[j][i]=a[temp][i]; a[temp][i]=x;
        }
    }
 
 
 
    for(i=0;i<m;i++)                        
    {
        for (j=0;j<n;j++)                  
        {
             cout << setw(4) <<setprecision(2) <<a[i][j]<<" ";
        }
        cout<<endl;
    }
    for(i = 0; i < m; i++)
                {
                    delete [] a[i];
                }
                delete [] a;
    getch();
    return 0;
}
2
ProNoooob
76 / 76 / 8
Регистрация: 14.10.2009
Сообщений: 121
12.09.2012, 19:20 #7
Просто берем и сортируем столбцы. ^_^
И да отучайтесь писать код как в первом посте.

Если бы я был студентом, то в этой задаче написал бы свой итератор. Чтобы пожоще было.
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#define _CRT_SECURE_NO_WARNINGS
#include <algorithm>
#include <functional>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
float **matrix;
int rows, columns;
 
float **BuildMatrix(int _rows, int _columns);
void    PrintMatrix(float **_matrix, int _rows, int _columns);
 
int main()
{
    srand(GetTickCount());
 
    printf("Universal matrix column sorting programm.\n");
    printf("Enter Matrix data.\n");
    printf("rows num: ");
    scanf("%d", &rows);
    printf("columns num: ");
    scanf("%d", &columns);
    printf("Building matrix %dx%d ...\n\n", rows, columns);
    matrix = BuildMatrix(rows, columns);
 
    PrintMatrix(matrix, rows, columns);
 
    printf("\nSorting columns ... \n\n");
 
    for(int i = 0; i < rows; i++)
    {
        std::sort(&matrix[i][0], &matrix[i][columns], std::less<float>());
    }
 
    PrintMatrix(matrix, rows, columns);
 
    printf("\n");
    system("pause");
 
    return 0;
}
 
float **BuildMatrix(int _rows, int _columns)
{
    float **matrix;
 
    matrix = new float *[_rows];
 
    for(int i = 0; i < _rows; i++)
    {
        matrix[i] = new float[_columns];
 
        for(int k = 0; k < _columns; k++)
        {
            matrix[i][k] = (rand() % 10 + 1) / float((rand() % 10 + 1));
        }
    }
    return matrix;
}
 
void PrintMatrix(float **_matrix, int _rows, int _columns)
{
    for(int i = 0; i < _columns; i++)
    {
        for(int k = 0; k < _rows; k++)
        {
            printf("%.2f ", matrix[k][i]);
        }
 
        printf("\n");
    }
}
1
a.n.o.n.i.m
137 / 137 / 39
Регистрация: 26.02.2011
Сообщений: 535
12.09.2012, 19:27  [ТС] #8
Мужики,прям порадовали,спасибо,столько ответов пасиб кто помог,будем дальше продолжать ,это только начало))
1
a.n.o.n.i.m
137 / 137 / 39
Регистрация: 26.02.2011
Сообщений: 535
18.09.2012, 14:27  [ТС] #9
Можете еще раз помочь сделать,написать сортировку выбором и пузырьком тоесть 2 функции добавить в одной будет выбором во второй пузырьком?

Добавлено через 15 минут
и кстате сортировка то по не возрастанию(тоесть убыванию),во всех примерах наоборот
1
co6ak
Кошковед
515 / 503 / 63
Регистрация: 12.04.2010
Сообщений: 1,392
18.09.2012, 14:28 #10
Цитата Сообщение от ProNoooob Посмотреть сообщение
Просто берем и сортируем столбцы. ^_^
И да отучайтесь писать код как в первом посте.

Если бы я был студентом, то в этой задаче написал бы свой итератор. Чтобы пожоще было.
Кликните здесь для просмотра всего текста
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#define _CRT_SECURE_NO_WARNINGS
#include <algorithm>
#include <functional>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
float **matrix;
int rows, columns;
 
float **BuildMatrix(int _rows, int _columns);
void    PrintMatrix(float **_matrix, int _rows, int _columns);
 
int main()
{
    srand(GetTickCount());
 
    printf("Universal matrix column sorting programm.\n");
    printf("Enter Matrix data.\n");
    printf("rows num: ");
    scanf("%d", &rows);
    printf("columns num: ");
    scanf("%d", &columns);
    printf("Building matrix %dx%d ...\n\n", rows, columns);
    matrix = BuildMatrix(rows, columns);
 
    PrintMatrix(matrix, rows, columns);
 
    printf("\nSorting columns ... \n\n");
 
    for(int i = 0; i < rows; i++)
    {
        std::sort(&matrix[i][0], &matrix[i][columns], std::less<float>());
    }
 
    PrintMatrix(matrix, rows, columns);
 
    printf("\n");
    system("pause");
 
    return 0;
}
 
float **BuildMatrix(int _rows, int _columns)
{
    float **matrix;
 
    matrix = new float *[_rows];
 
    for(int i = 0; i < _rows; i++)
    {
        matrix[i] = new float[_columns];
 
        for(int k = 0; k < _columns; k++)
        {
            matrix[i][k] = (rand() % 10 + 1) / float((rand() % 10 + 1));
        }
    }
    return matrix;
}
 
void PrintMatrix(float **_matrix, int _rows, int _columns)
{
    for(int i = 0; i < _columns; i++)
    {
        for(int k = 0; k < _rows; k++)
        {
            printf("%.2f ", matrix[k][i]);
        }
 
        printf("\n");
    }
}
и отучайтесь использовать глобальные переменные, ога
0
a.n.o.n.i.m
137 / 137 / 39
Регистрация: 26.02.2011
Сообщений: 535
18.09.2012, 14:31  [ТС] #11
а нет верно вроде все,тупанул,просто сортировки нужны

Добавлено через 1 минуту
Глобальные переменные не использую никогда,и где здесь сортировка первая и где вторая?
1
co6ak
Кошковед
515 / 503 / 63
Регистрация: 12.04.2010
Сообщений: 1,392
18.09.2012, 15:17 #12
возможные ошибки поправишь. компиль не съест мой код
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <cstdlib>
#include <ctime>
 
 
void matrPrint      ( flaot **, int, int );
void matrSortBubl   ( flaot **, int, int );
void matrSortChng   ( flaot **, int, int );
void matrRandom     ( flaot **, int, int );
 
int main() {
    srand( time ( 0 ) );
    int row;
    int column;
    float **matrix;
    
    
    std::cout << "\nEnter number of rows: ";
    std::cin >> row;
    std::cout << "\nEnter number of columns: ";
    std::cin >> column;  
 
    matrix = new int* [ row ];
    for ( int i = 0; i < row; i ++ )
        matrix[i] = new int [ column ] ;
    matrRandom( matrix, row, column );
    
    matrSortBubl( matrix, row, column );
    matrPrint( matrix, row, column );
    
    
    
    std::cout << "New one";
    
    matrRandom(matrix, row, column );
    matrSortChng( matrix, row, column );
    matrPrint( matrix, row, column );
    
    for ( int i = 0; i < row; i ++ )
       delete [] matrix[i];
    delete [] matrix;
    
    return 0;
}
 
 
void matrRandom( float ** matr, int row, int column )
{
    for ( int i = 0; i < row; i ++ )
        for ( int j = 0; j < column; j ++ )
            matr[i][j] = (std::rand() % 50 - std::rand() % 25) / std::rand() % 10;
    matrPrint( matr, row, column );
}
 
void matrSortBubl( float **matr, int row, int column )
{
    float tmp;
    for ( int i = 0; i < column; i ++ )
    {
        for ( int j = 0; j < row - 1; j ++ )
            if (  matr[i][j + 1] > matr[i][j] ) 
            {
                tmp = matr[i][j+1];
                matr[i][j+1] = matr[i][j];
                matr[i][j] = tmp;
            }
    }
}
void matrSortChng( float **matr, int row, int column ) {
    float tmp;
    for ( int l = 0; k < column; k ++ ) {
        for(int i = 0; i < row-1; i++){
            int min = i;
            for (int j = i + 1;j < row; j++){
                if( matrix[j][l]< matrix[j][min])
                    min=j;
            }
        matrix[i][l] = matrix[min][l]);
        }
    }
}
 
void matrPrint ( float **matrix, int row, int column )
{
    std::cout << std::endl;
    for ( int i = 0; i < row; i ++ )
    {
        for ( int j = 0; j < column; j ++ )
            std::cout << matrix[i][j] << "\t";
        std::cout << std::endl;
    }
}
1
18.09.2012, 15:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2012, 15:17
Привет! Вот еще темы с решениями:

Разработать программу, осуществляющую поиск самого короткого и самого длинного слова во вводимом тексте
Разработать программу, осуществляющую поиск самого короткого и самого длинного...

Дана строка, содержащая текст. Найти длину самого короткого и самого длинного слова.
1. Дана строка, содержащая текст. Найти длину самого короткого и самого...

Определить длину самого длинного и самого короткого слова
Помогите пожалуйста Я не понимаю как написать ввести массив символов,...

Найти длину самого короткого и самого длинного слова
помогите решить Дана символьная строка, содержащая текст, который...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru