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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 126, средняя оценка - 4.76
MarKuSs
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 14
#1

Упорядочить строки матрицы по возростанию их максимальных элементов - C++

06.12.2010, 22:57. Просмотров 15305. Ответов 17
Метки нет (Все метки)

Здравствуйте!
Помогите пожалуюста разобраться в данном задании
"Дана матрица NxM.Упорядочить её строки по возростанию их максимальных элементов"

вот мой код, но программа не работает, можете показать где у меня допущена ошибка и обьяснить работу 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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
int *b;
int i,j,n,m,k,g,t;
 
 
//--- Ввод двумерного динамического массива NxM
 
 
cout <<"Vvedite kolichestvo strok (N): ";
cin >> n;
cout <<"Vvedite kolichestvo stolbcov (M): ";
cin >> m;
 
//--- Выделение памяти
int **massiv = new int*[n];
for(k= 0; k < n; k++)
massiv[k] = new int[m];
 
//--- Тут massiv[i][j]
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
{
cout <<"s["<<i<<"]["<<j<<"]:";
cin >> massiv[i][j];
}
// --- Построение строк матрицы по возрастанию их максимальных членов
 
for (i=0;i<n;i++)
{
b[i]=massiv[i][0];
for (j=1;j<m;j++)
if (massiv[i][j]>b[i]) b[i]=massiv[i][j];
}
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if (b[i]>b[j])
{
t=b[i];
b[i]=b[j];
b[j]=t;
for (g=0;g<m;g++)
{
t=massiv[i][g];
massiv[i][g]=massiv[j][g];
massiv[j][g]=t;
}
} 
// --- Вывод двумерного массива NxM
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
cout <<setiosflags(ios::fixed)<<setw(10) <<setprecision(3)<<
massiv[i][j]<<
" ";
cout<<endl;
}
 
 
//--- Освобождение выделенной памяти
for (int s = 0; s <n; s++)
delete[]massiv[s];
delete[]massiv;
 
return 0;
}
Добавлено через 21 час 46 минут
Вот немного подкоректировал код, но при подсчете программа выбивает ошибку

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
#include <iostream.h>
#include <iomanip.h>
 
int main()
{
int n,m,i,j,k;
double t;
// Ввод размерности массива
cout << "Vvedite razmer n m" << endl;
cin >> n >> m;
 
// Выделение памяти под массив
double  **umas2;
umas2=new double*[n];  
for(i=0; i<n; i++) 
umas2[i]=new double[m];
 
// Тут ввод массива
for (i=0; i<n; i++) 
for (j=0; j<m; j++) 
{
cout << "Vvedite umas2[" << i << "][" << j << "]: " ;
cin >> umas2[i][j];
}
 
// Выделение памяти под массив b
double  *b;
b=new double[n]; 
 
    
 
// Действия
for (i=0; i<n; i++) 
{
              
b[i]=umas2[i][0];
for (j=1;j<m;j++)
if (umas2[i][j]>b[i]) b[i]=umas2[i][j];
}
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if (b[i]>b[j])
{
t=b[i];
b[i]=b[j];
b[j]=t;
for (k=0;k<m;k++)
{
t=umas2[i][k];
umas2[i][k]=umas2[j][k];
umas2[j][k]=t;
}
}
 
//  Вывод на экран
for (i=0; i<n; i++) 
{
for (j=0; j<m; j++) 
cout << setw (9) << umas2[i][k] << " "; 
cout << endl;
}
 
// Очистка выделенной под umas2 памяти
for(i=0; i<n; i++) 
delete []umas2[i];
delete []umas2;
umas2=NULL;
 
// Очистка выделенной под b памяти
delete []b; 
b=NULL;
return 0;
}
Добавлено через 1 час 52 минуты
up
нет ни малейшей идеи

 Комментарий модератора 
Используйте теги форматирования кода.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2010, 22:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Упорядочить строки матрицы по возростанию их максимальных элементов (C++):

Переставить строки матрицы по возрастанию максимальных элементов каждой строки - C++
Дана целочисленная матрица м*н. Переставить строки матрицы по возрастанию максимальных элементов каждой строки.

Упорядочить массив по возростанию и найти сумму положительных элементов - C++
Упорядочить массив X(N)по возростанию,найти сумму положительных элементов массива.

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

Вычислить сумму максимальных элементов каждой строки матрицы - C++
дана матрица А(4,5),В(5,6).вычислить Z=Pa+Pb, где n max{Xij} P = ∑ - сумма максимальных элементов каждой...

Найти вектор максимальных элементов каждой строки матрицы - C++
Дана действительная матрица размером m n Найти вектор максимальных элементов каждой строки матрицы

Упорядочить строки матрицы D (m. n) Лексикографически по неубыванию первых k элементов строки - C++
Помогите решить задачу C++ пожалуйста, пожалуйста Упорядочить строки матрицы D (m. n) Лексикографически по неубыванию первых k...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
06.12.2010, 23:06 #2
перед меин замени все на
C++
1
2
3
4
#include <iostream>
#include <iomanip>
 
using namespace std;
Дальше не разбирался, но ты применяешь Си-шний стиль заголовков а надо новый #include <iostream> #include <iomanip> и так как ты используешь cout, cin и т.д они находятся в стандартном пространстве имен то бишь или using namespace std; или перед ставить имя пространства имен и оператор разрешения видимости std::cout, std::cin

Добавлено через 3 минуты
Цитата Сообщение от MarKuSs Посмотреть сообщение
"Дана матрица NxM.Упорядочить её строки по возростанию их максимальных элементов"
тебе надо упорядочить матрицу или просто упорядочить каждую строку матрицы?
MarKuSs
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 14
06.12.2010, 23:36  [ТС] #3
упорядочить строки

Добавлено через 11 минут
ну т.е каждую строку матрицы
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
06.12.2010, 23:42 #4
Цитата Сообщение от MarKuSs Посмотреть сообщение
ну т.е каждую строку матрицы
смотри можно упорядочить матрицу, а можно упорядочить каждую строку матрицы отдельно, результат будет разный, так тебе надо строки упорядочить или всю матрицу?
MarKuSs
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 14
06.12.2010, 23:49  [ТС] #5
У меня Задание упорядочить строки матрицы, но я тебя не понял вот смотри у меня матрица
3 4 2
2 7 1
1 10 2


когда упорядочитть строки то будет

4 3 2
7 2 1
10 2 1
а как ты можешь всю матрицу упорядочить?
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
06.12.2010, 23:54 #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от MarKuSs Посмотреть сообщение
а как ты можешь всю матрицу упорядочить?
например вот так
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
#include <stdlib.h>
 
const int m = 4, n = 5;
 
void sort(int (*p_matr)[n], int limit, int m, int n);
void get_max(int (*p_matr)[n], struct Sfor_swap *pfor_swap, int limit, int m, int n);
void swap(int (*p_matr)[n], struct Sfor_swap* pfor_swap);
 
struct Sfor_swap
{
    int* max;
    int last_m;
    int last_n;
 
};
 
int main(void)
{
    int matr[m][n] = {
        {2, -5, 10, 100, 6},
        {-1, 0, 22, 33, -6},
        {99, -5, -7, 1, 9},
        {4, -4, -9, 12, -666},
    };
    int (*p_matr)[n] = matr;
    int limit = m * n;
 
    printf("Before Sorting\n");
 
    for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
            printf((j != n - 1) ? "%d  " : "%d\n", matr[i][j]);
 
    sort(p_matr, limit, m, n);
    printf("\n");
 
    printf("After Sorting\n");
 
    for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
            printf((j != n - 1) ? "%d  " : "%d\n", p_matr[i][j]);
 
    printf("\n");
    system("PAUSE");
    return 0;
 
}
 
void sort(int (*p_matr)[n], int limit, int m, int n)
{
 
    struct Sfor_swap sfor_swap;
    //static int limit = m * n;
 
    if (limit == 1) return;
 
    get_max(p_matr, &sfor_swap, limit, m, n);
 
    swap(p_matr, &sfor_swap);
 
    // Recursion
    sort(p_matr, --limit, m, n);
 
    return;
}
 
void get_max(int (*p_matr)[n], struct Sfor_swap *pfor_swap, int limit, int m, int n)
{
    int max = **p_matr;
    int *ptr = p_matr[0];
    int *p_max;
    int count = 0;
 
    pfor_swap->max = ptr;
    for (int i = 0; i < m; ++i)
    {
        ptr = p_matr[i];
        for (int j = 0; j < n; ++j)
        {
            if (ptr[j] > max)
            {
                max = ptr[j];
                p_max = ptr + j;
                pfor_swap->max = p_max;
            }
 
            ++count;
            if (count == limit)
            {
                pfor_swap->last_m = i;
                pfor_swap->last_n = j;
 
                return;
            }
        }
    }
 
    return;
}
 
void swap(int (*p_matr)[n], struct Sfor_swap* pfor_swap)
{
    int c = 0;
 
    c = p_matr[pfor_swap->last_m][pfor_swap->last_n];
    p_matr[pfor_swap->last_m][pfor_swap->last_n] = *pfor_swap->max;
    *pfor_swap->max = c;
 
    return;
}
Добавлено через 39 секунд
Цитата Сообщение от MarKuSs Посмотреть сообщение
У меня Задание упорядочить строки матрицы, но я тебя не понял вот смотри у меня матрица
ок, я тебя понял
MarKuSs
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 14
07.12.2010, 00:15  [ТС] #7
хмм... ну впринципе да матрицу можно и всю
но я уже сам запутался вот мое задание "Упорядочить строки матрицы по неубыванию их максимальных эементов"
но мне кажется все таки через маой вариант,т.е каждой строки от максимального до минимального

Добавлено через 8 минут
вот я вывод какой сделал
C++
1
2
3
4
5
6
7
//  Вывод
for (k=0; k<n; k++) 
{
for (j=0; j<m; j++) 
cout << setw (9) <<umas2[j][k] << " "; 
cout << endl;
}
Добавлено через 7 минут
видите у меня ошибку в коде,я уже 3 час втыкаю в монитор но не могу сообразить
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
07.12.2010, 00:30 #8
Цитата Сообщение от MarKuSs Посмотреть сообщение
видите у меня ошибку в коде,я уже 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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <iomanip>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    int n = 0, m = 0;
 
    // Ввод размерности массива
    cout << "Vvedite razmer n m" << endl;
    cin >> n >> m;
 
    // Выделение памяти под массив
    double  **vect;
 
    try
    {
        vect = new double* [n];
    } catch (bad_alloc ba)
        {
            cout << "cannot allocate mas in memory " << endl;
            system("PAUSE");
            exit(1);
        }
 
    for(int i = 0; i < n; ++i)
        try
        {
            vect[i] = new double[m];
        } catch (bad_alloc ba)
            {
                cout << "cannot allocate mas in memory" << endl;
                system("PAUSE");
                exit(1);
            }
 
 
    // Тут ввод массива
    for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < m; ++j)
            {
                cout << "Vvedite umas2[" << i << "][" << j << "]: " ;
                cin >> vect[i][j];
            }
 
            cout << endl;
        }
 
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < m; ++j)
        {
            int min = j;
            for(int k = j; k < m; ++k)
            {
                if(vect[i][k] < vect[i][min])
                    min = k;
            }
 
            int c;
            c = vect[i][j];
            vect[i][j] = vect[i][min];
            vect[i][min] = c;
        }
 
    //Вывод на экран
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
            cout << setw (9) << vect[i][j] << " ";
        cout << endl;
    }
 
    system("PAUSE");
    return 0;
 
}
освобождение памяти думаю сделаете сами

Добавлено через 2 минуты
Цитата Сообщение от MarKuSs Посмотреть сообщение
ошибку
у вас трудно читается код по этому тяжело искать ошибки, возьмите норм редактор с автовыравниванием кода или используйте отступы хотябы так как в моей программе, далее
C++
1
for (j=0; j<m; j++)
лучше написать
C++
1
for (j = 0; j < m; j++)
Правда же более выразительно?
MarKuSs
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 14
07.12.2010, 00:41  [ТС] #9
Спасибо сейчас сяду разбираться, А как теперь изменить данную программу под следующее условие
"Упорядочить ее столбцы по возростанию наименьших элементов"

Добавлено через 6 минут
Цитата Сообщение от norge_goth Посмотреть сообщение
Правда же более выразительно?
да
на много
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
07.12.2010, 00:45 #10
Цитата Сообщение от MarKuSs Посмотреть сообщение
"Упорядочить ее столбцы по возростанию наименьших элементов"
вот так:

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 <iomanip>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    int n = 0, m = 0;
 
    // Ввод размерности массива
    cout << "Vvedite razmer n m" << endl;
    cin >> n >> m;
 
    // Выделение памяти под массив
    double  **vect;
 
    try
    {
        vect = new double* [n];
    } catch (bad_alloc ba)
        {
            cout << "cannot allocate mas in memory " << endl;
            system("PAUSE");
            exit(1);
        }
 
    for (int i = 0; i < n; ++i)
        try
        {
            vect[i] = new double[m];
        } catch (bad_alloc ba)
            {
                cout << "cannot allocate mas in memory" << endl;
                system("PAUSE");
                exit(1);
            }
 
 
    // Тут ввод массива
    for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < m; ++j)
            {
                cout << "Vvedite umas2[" << i << "][" << j << "]: " ;
                cin >> vect[i][j];
            }
 
            cout << endl;
        }
 
    for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
        {
            int min = j;
            for (int k = j; k < n; ++k)
            {
                if (vect[k][i] < vect[min][i])
                    min = k;
            }
 
            int c;
            c = vect[j][i];
            vect[j][i] = vect[min][i];
            vect[min][i] = c;
        }
 
 
    //Вывод на экран
    for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j < n; ++j)
            cout << setw (9) << vect[j][i] << " ";
        cout << endl;
    }
 
    /*
    // Очистка выделенной под umas2 памяти
    for(i = 0; i < n; ++i)
        delete [] vect[i];
    delete [] vect;
 
    umas2 = NULL;
 
    // Очистка выделенной под b памяти
    delete []b;
    b = NULL; */
 
    system("PAUSE");
    return 0;
 
}
кстати, не забиваем сказать "Спасибо"
MarKuSs
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 14
07.12.2010, 00:49  [ТС] #11
Огромадное спасибо!
Завтро с утра на свежую голову буду построчно сидеть разбираться,а сейчас спакойно ночи
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
07.12.2010, 00:52 #12
Цитата Сообщение от MarKuSs Посмотреть сообщение
umas2
еще одно не используй имена в которых легко запутаться, не очевидные имена, слишком длинные, слишком короткие и лучше всего переменные(счетчики) цикла объявляй как локальные по отношению к их блоку, например:
C++
1
for (i = 0; i < m; ++i)
лучше не объявлять в начале меин, а потом использовать, а сделать так:
C++
1
for (int i = 0; i < m; ++i)
эта переменная автоматически уничтожается при выходе с блока {} и создается каждый раз по входу в блок
MarKuSs
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 14
07.12.2010, 15:58  [ТС] #13
нет у меня во втором случае немного не такое задание
т.е. уже надо посартировать не строки а столбцы, как в этом случае будет выглядеть программа?
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
07.12.2010, 19:47 #14
в посте №10 все правильно там просто вывод сделан не по столбцам, а по строкам
C++
1
2
3
4
5
6
for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j < n; ++j)
            cout << setw (9) << vect[j][i] << " ";
        cout << endl;
    }
n - количество столбцов, и то есть строки будут выводится раньше чем столбцы(во внешнем цикле), можно сделать как обычно:
C++
1
2
3
4
5
6
for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
            cout << setw (9) << vect[i][j] << " ";
        cout << endl;
    }
это было сделано просто для удобства
MarKuSs
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 14
07.12.2010, 20:21  [ТС] #15
Да, все увидел.
Вы не подскажите как можно исправить ошибку
C++
1
conversion from 'double' to 'int', possible loss of data
и не могли бы прокомментировать данную часть

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
        {
            int min = j;
            for (int k = j; k < n; ++k)
            {
                if (vect[k][i] < vect[min][i])
                    min = k;
            }
 
            int c;
            c = vect[j][i];
            vect[j][i] = vect[min][i];
            vect[min][i] = c;
        }
Заранее большое спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2010, 20:21
Привет! Вот еще темы с ответами:

Упорядочить строки матрицы лексикографически по неубыванию первых k элементов строки. - C++
Помогите решить задачу, пожалуйста Упорядочить строки матрицы D ( m, n) лексикографически по неубыванию первых k элементов строки. ...

Создать векторы из максимальных элементов каждой строки и каждого столбца матрицы - C++
Помогите решить, пожалуйста! Получить вектор B, каждый элемент которого максимальный элемент соответствующей строки и вектор C, каждый...

Сформировать вектор, состоящий из максимальных элементов каждого столбца (строки) матрицы - C++
Данная прямоугольная матрица. Сформировать вектор, состоящий из максимальных элементов каждого столбца (строки) матрицы. Поиск...

Сформировать вектор, состоящий из максимальных элементов каждого столбца (строки) матрицы - C++
Всем привет! Помогите пожалуйста мне написать вот такую программу: Данная прямоугольная матрица. Сформировать вектор, состоящий из...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.12.2010, 20:21
Ответ Создать тему
Опции темы

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