С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 531
#1

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

12.09.2012, 18:19. Просмотров 751. Ответов 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++):

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

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

Вывод из вектора самого короткого и самого длинного string значения - C++
Вывод из вектора самого короткого и самого длинного string значения Подскажите как таковое сделать, если кому не трудно сможете ли вы...

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

Дана строка, содержащая текст. Найти длину самого короткого и самого длинного слова. - C++
1. Дана строка, содержащая текст. Найти длину самого короткого и самого длинного слова. 2. 14.14. Имеется строка, содержащая буквы...

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

11
Toshkarik
1147 / 864 / 51
Регистрация: 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 / 121
Регистрация: 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
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
12.09.2012, 18:56 #4
бгг.
на все случаи жизни
в данном примере в функцию arraySort можно передавать каждый столбец матрицы.
все там весьма примитивно. даже сортир пузырьковый


надо же пиарить тему свою
1
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
12.09.2012, 18:59 #5
co6ak, как Вы собираетесь передавать столбец в функцию, если его элементы расположены в разных выделенных частях памяти?
1
valeriikozlov
Эксперт С++
4675 / 2501 / 321
Регистрация: 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
75 / 75 / 6
Регистрация: 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 / 15
Регистрация: 26.02.2011
Сообщений: 531
12.09.2012, 19:27  [ТС] #8
Мужики,прям порадовали,спасибо,столько ответов пасиб кто помог,будем дальше продолжать ,это только начало))
1
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 531
18.09.2012, 14:27  [ТС] #9
Можете еще раз помочь сделать,написать сортировку выбором и пузырьком тоесть 2 функции добавить в одной будет выбором во второй пузырьком?

Добавлено через 15 минут
и кстате сортировка то по не возрастанию(тоесть убыванию),во всех примерах наоборот
1
co6ak
Кошковед
409 / 502 / 29
Регистрация: 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 / 15
Регистрация: 26.02.2011
Сообщений: 531
18.09.2012, 14:31  [ТС] #11
а нет верно вроде все,тупанул,просто сортировки нужны

Добавлено через 1 минуту
Глобальные переменные не использую никогда,и где здесь сортировка первая и где вторая?
1
co6ak
Кошковед
409 / 502 / 29
Регистрация: 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
Привет! Вот еще темы с ответами:

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

Найти длину самого длинного и самого короткого слова - C++
Дана строка символов. Найти длину самого длинного и самого короткого символа. Написать задачу с обращением к процедуре...

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

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


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

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

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