Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Валентин^_^
25 / 25 / 11
Регистрация: 15.10.2009
Сообщений: 174
#1

Помогите плиз с алгоритмом проги (нужно отсортировать матрицу)

17.10.2011, 21:11. Просмотров 633. Ответов 12
Метки нет (Все метки)

Задача: Характеристикой столбца целочисленной матрицы назовём сумму модулей его отрицательных нечётных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик.

Помогите плиз с алгоритмом, прогу-то сам напишу...)

Вот допустим матрица такая:
C++
1
2
3
4
5
6
7
8
int mas[n][m] = {
 {1, 2, 3, 2, -66},
{-2, -1, 2, 1, -99},
{0, 7, 3, -4, -95},
{-1, -1, -10, -15, 1},
{0, 8, 9, 3, 2},
{1, 2, 3, 4, 0} 
};
Посчитал характеристики вручную, суммы модулей нечетных эл-тов в столбцах: 0, 0, 0, 4, 161

КАК мне расставить столбцы матрицы??

Буду сильно благодарен за подсказку!)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2011, 21:11
Ответы с готовыми решениями:

Помогите плиз с алгоритмом проги (переставить слова в строке)
Задача: В заданном тексте поменять местами каждые два соседних слова. Но нужно сделать, не...

Програмка на Си...нужно добавить столбец и отсортировать матрицу по добавленному столбцу.
Дана матрица 1 5 7 3 0 9 2 4 8 1. Добавить столбец. 2. Отсортировать матрицу по добавленному...

Отсортировать каждую строчку матрицы по убыванию элементов алгоритмом Шелла
дана матрица размерности nxn, содержащая целые числа. Отсортировать каждую строчку матрицы по...

Списки (Помогите плиз)
1)Линейный упорядоченный список с удалением,нахождением и вставкой элемента. 2)Список...

Помогите студенту плиз
Было дано задание-"Подобрать несколько примеров тем программных продуктов". Задание корявое, в...

12
Сыроежка
Заблокирован
17.10.2011, 21:16 #2
Цитата Сообщение от Валентин^_^ Посмотреть сообщение
Задача: Характеристикой столбца целочисленной матрицы назовём сумму модулей его отрицательных нечётных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик.

Помогите плиз с алгоритмом, прогу-то сам напишу...)

Вот допустим матрица такая:
C++
1
2
3
4
5
6
7
8
int mas[n][m] = {
 {1, 2, 3, 2, -66},
{-2, -1, 2, 1, -99},
{0, 7, 3, -4, -95},
{-1, -1, -10, -15, 1},
{0, 8, 9, 3, 2},
{1, 2, 3, 4, 0} 
};
Посчитал характеристики вручную, суммы модулей нечетных эл-тов в столбцах: 0, 0, 0, 4, 161

КАК мне расставить столбцы матрицы??

Буду сильно благодарен за подсказку!)
Лично я не понял, почему характеристика первого столбца равна 0. В С и С++ строки и столбцы нумеруются, начиная с нуля.

Начните с того, что напишите код, подсчитывающий характеристику столбца.
0
Валентин^_^
25 / 25 / 11
Регистрация: 15.10.2009
Сообщений: 174
17.10.2011, 21:50  [ТС] #3
Знаю, что нумерация с нуля) просто для удобства думал будет лучше, если с первого, не суть вобщем..

Таак, написал код, который бы посчитал характеристики:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int haract[m];
for(int j = 0; j < m; j++)
{
    haract[j] = 0;
    for(int i = 1; i < n; i+=2)
    {
        if(mas[i][j] < 0)
            haract[j] += abs(mas[i][j]);
    }
}
 
cout << endl;
for(int k = 0; k < m; k++)
    cout << haract[k] << "\t";
cout << endl;
Вот дальше хз как
0
valeriikozlov
Эксперт С++
4684 / 2510 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
17.10.2011, 21:59 #4
Цитата Сообщение от Валентин^_^ Посмотреть сообщение
Задача: Характеристикой столбца целочисленной матрицы назовём сумму модулей его отрицательных нечётных элементов.
Валентин^_^, а Вы считаете элементы стоящие на нечетной позиции.
все-таки это разные вещи.
0
Валентин^_^
25 / 25 / 11
Регистрация: 15.10.2009
Сообщений: 174
17.10.2011, 22:10  [ТС] #5
Я так понял, что если элемент находится на нечетной позиции - то есть это 1,3 и 5 строки и, если он отрицательный, то посчитать характеристику. Так вышеприведенный код и работает, в итоге для данной матрицы получаем: 3, 2, 10, 15 и 99. ...или я сам не въехал в задание...
0
aeshes
442 / 205 / 21
Регистрация: 07.10.2011
Сообщений: 462
17.10.2011, 22:49 #6
Валентин^_^, в вашем задании не важно на каком месте стоит число, главное, чтобы оно было отрицательное и нечетное, т.е. в приведенной вами матрице в первом столбце - это число -1, соответственно, и характеристика его равна 1; во втором -1 и -1 (характеристика 2) и т.д.
0
Валентин^_^
25 / 25 / 11
Регистрация: 15.10.2009
Сообщений: 174
17.10.2011, 23:01  [ТС] #7
aeshes, Спс, суть задания понял)

код исправил
C++
1
2
3
4
5
int haract[m] = {0, 0, 0, 0, 0};
for(int j = 0; j < m; j++)
    for(int i = 1; i < n; i++)
        if((mas[i][j] < 0) && (mas[i][j] % 2 != 0))
            haract[j] += abs(mas[i][j]);
Как опираясь на массив характеристик, переставить столбцы матрицы?
0
aeshes
442 / 205 / 21
Регистрация: 07.10.2011
Сообщений: 462
17.10.2011, 23:11 #8
Валентин^_^, самый простой подход - это завести еще один массив int index [5] ={0,1,2,3,4}, который хранит индексы столбцов в исходной матрице.
Теперь сортируете массив характеристик по возрастанию. Как только переставляете в нем местами два элемента, такую же перестановку делаете и в массиве index.
Затем в результирующий массив записываете строки исходного массива в том порядке, в котором получились индексы в массиве index.
Например, у вас будут характеристики 3 2 8 7 1
и массив индексов 0 1 2 3 4
После сортировки характеристики станут 1 2 3 7 8, а массив индексов 4 1 0 3 2
Именно в таком порядке и заполняете столбики в результирующей матрице: сначала 4-й, потом 1-й и т.д.
1
Валентин^_^
25 / 25 / 11
Регистрация: 15.10.2009
Сообщений: 174
18.10.2011, 00:26  [ТС] #9
aeshes,
написал функцию, которая сортирует массив характеристик и выстраивает массив индексов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Sort(int k, int x[], int y[]) 
{
    int i, j, buf, buf2;
 
    for(i = k - 1; i > 0; i--)
        for(j = 0; j < i; j++)
            if(x[j] > x[j+1])
            {
                buf = x[j];
                x[j] = x[j + 1];
                x[j + 1] = buf;
                
                buf2 = j;
                y[j] = j + 2;
                y[j + 1] = buf2;
            }
}
...
Sort(m, haract, index);
Имею массив индексов:2, 0, 1, 3, 4

..не получается столбцы расставить в соответствии с индексами,... если не затруднит, можно так же на словах?)
0
aeshes
442 / 205 / 21
Регистрация: 07.10.2011
Сообщений: 462
18.10.2011, 15:08 #10
Валентин^_^, насколько я поняла, x - это у вас матрица характеристик, y - матрица индексов. В ней обмен должен быть такой же, как в матрице х, т.е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(i = k - 1; i > 0; i--)
                for(j = 0; j < i; j++)
                        if(x[j] > x[j+1])
                        {
                                buf = x[j];
                                x[j] = x[j + 1];
                                x[j + 1] = buf;
                                
                                buf = y[j];
                                y[j] = y[j+1];
                                y[j + 1] = buf;
                        }
Перед этим матрица y должна быть заполнена
C++
1
2
for(j=0;j<m;j++)
   y[j]=j;
Теперь вы должны завести матрицу res такого же размера, как исходная матрица - res[n][m] и в цикле копировать туда исходную матрицу по столбцам в соответствии с матрицей индексов. Примерно так
C++
1
2
3
4
5
6
7
int ind;
for(j=0;j<m;j++)
{
   ind=index[j];
   for(i=0;i<n;i++)
       res[i][j]=mas[i][ind];
}
P.S. я воспользовалась обозначениями res[n][m], как и у вас, но вообще говоря, вы должны выделять память под массив динамически, если n и m у вас не являются константами
0
valeriikozlov
Эксперт С++
4684 / 2510 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
18.10.2011, 16:05 #11
aeshes, слишком много дополнительных массивов. Хватит начального массива mas[][] и массива haract[].
После заполнения значениями массива haract[], делаем сортировку выбором в массиве haract[], одновременно меняя точно также столбцы в массиве mas[][].
0
aeshes
442 / 205 / 21
Регистрация: 07.10.2011
Сообщений: 462
18.10.2011, 19:21 #12
valeriikozlov, можно и так, я не говорила, что это лучший способ, я сказала - самый простой
0
Валентин^_^
25 / 25 / 11
Регистрация: 15.10.2009
Сообщений: 174
18.10.2011, 22:41  [ТС] #13
В общем вот что получилась:

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
#include "stdafx.h"
#include <clocale>
#include <windows.h>
#include <iostream>
 
using namespace std;
 
void Sort(int k, int x[], int y[]); //ф-ия сортировки
 
int main()
{
    setlocale(LC_ALL, "russian");
 
    const int n = 6;
    const int m = 5;
    int mas[n][m] = { {1, 2, 3, 2, -66},
                    {-2, -1, 2, 1, -99},
                    {0, 7, 3, -4, -95},
                    {-1, -1, -10, -15, 1},
                    {0, 8, 9, 3, 2},
                    {1, 2, 3, 4, 0} };
 
    cout << "Исходная матрица:" << endl;
    for(int i = 0; i < n; i++, cout << endl)
        for(int j = 0; j < m; j++)
            cout << mas[i][j] << "\t";
 
 
    int haract[m] = {0, 0, 0, 0, 0}; //характеристика
 
    for(int j = 0; j < m; j++)
        for(int i = 1; i < n; i++)
            if((mas[i][j] < 0) && (mas[i][j] % 2 != 0))
                haract[j] += abs(mas[i][j]);
 
    int index[m] = {0, 1, 2, 3, 4}; //индексы столбцов
 
    int result[n][m]; //результирующая матрица
 
    Sort(m, haract, index); //отсортируем индексы столбцов с учетом хар-ик
 
    int ind;
    for(int j = 0; j < m; j++)
    {
       ind = index[j];
       for(int i = 0; i < n; i++)
           result[i][j] = mas[i][ind];
    }
 
    cout << endl << "Отсортированная матрица: " << endl;
        for(int i = 0; i < n; i++, cout << endl)
        for(int j = 0; j < m; j++)
            cout << result[i][j] << "\t";
 
    cout << endl << endl;
 
    system("PAUSE");
        return 0;
}
 
void Sort(int k, int x[], int y[]) 
{
    int buf;
 
    for(int i = k - 1; i > 0; i--)
        for(int j = 0; j < i; j++)
            if(x[j] > x[j + 1])
            {
                buf = x[j];
                x[j] = x[j + 1];
                x[j + 1] = buf;
 
                buf = y[j];
                                y[j] = y[j + 1];
                                y[j + 1] = buf;
            }
}
Прога работает правильно, спс всем=)

Только все равно сортировку нужно будет вынести в отдельную функцию, попробовал передать двумерный массив в ф-ию также, как и одномерный.. но так нельзя. Над этим буду еще думать..
0
18.10.2011, 22:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2011, 22:41

Помогите с алгоритмом
Нужно написать программу сравнения 3 чисел. Без использования массивов, функций, управляющего else....

Помогите с алгоритмом
Даны координаты вершин двух трапеций. нужно проверить вложена ли одна трапеция в другую ....

помогите с алгоритмом!
Заполните пустые ячейки пирамиды числами так, чтобы каждое число, которое содержится в...


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

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

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