Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как поменять столбцы матрицы так чтобы максимальные элементы были на главной диагонали?

88K
18 апреля 2015 года
tomililizzi
2 / / 18.04.2015
Здравствуйте, помогите пожалуйста. Мучаюсь с этой задачей уже две недели))
Вообще задание такое:Найти все самые нижние максимальные элементы в столбцах и перестановкой столбцов добиться их расположения на главной диагонали.
Задание почти выполнено, осталось только поменять столбцы так чтоб эти самые максимальные элементы стояли по диагонали.
Очень нужна ваша помощь
[ code=CPP ]
#include <iostream>
#include<iomanip>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(int argc, char** argv)
{
int b,N,M,max,t,k;
int i,j;
cout<<"VVedite kolichestvo strok i stolbzov massiva"<<endl;
cin>>N;
int **a=new int* [N];
for (int i = 0; i < N; i++)
{
a = new int [N];
}
int *d;
d = new int[N];
cout<<"Esli vi hotite vvesti massiv sami, vvedite 1 esli net to 2"<<endl;
cin>>b;
if (b==1)
{
cout<<"Vvodimie chisla prinadlechat intervalu (-10;10)"<<endl;
cout << "Ishodnii massiv"<<endl;
for (i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin>>a[j];
}
}
for (int i= 0; i < N; i++)
{
for(int j = 0; j < N; j++)
cout << setw(4) << a[j] << " ";
cout << endl;
}
}
else
{
srand(time(0));
cout<<"Ishodnii massiv"<<endl;
for (i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
a[j] = (rand() % 21-10);
}
}
for (int i= 0; i < N; i++)
{
for(int j = 0; j < N; j++)
cout << setw(4) << a[j] << " ";
cout << endl;
}
}
for(j=0; j<N; ++j)
{
max=0;
for (int i=0;i<N;i++)
{
if(a[j]>=a[max][j])
{
max=i;
}
}
d[j]=max;
cout<<"max "<<a[max][j]<<" v stolbze "<<j+1;
cout<<" i stroke "<< max+1 <<""<<endl;
}
for (int i= 0; i < N; i++)
{
cout << setw(4) << d+1 << " ";
cout << endl;
}
int flag = 0;
for (i=0;i<N;i++)
{
for(k=i+1;k<N;k++)
{
if(d==d[k])
{
flag=1;
break;
}
}
if(flag)
break;
}
if(flag)
{
cout<<"nelza vipolnit zadanie"<<endl;
}
else
{
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{

}
}
cout<<"Poluchili massiv"<<endl;
for (int i= 0; i < N; i++)
{
for(int j = 0; j < N; j++)
cout << setw(4) << a[j] << " ";
cout << endl;
}
}
for (int i = 0; i < N; i++)
{
delete []a;
}
delete[] a;
system ("PAUSE");
return 0;
}
[ /code ]
392
19 апреля 2015 года
cronya
421 / / 03.01.2009
что значит самые нижние максимальные элементы?
PS: у вас ошибок много в коде, то что он работает сомнительно :)
вот пример
у вас
 
Код:
int **a = new int*[N];
for (int i = 0; i < N; i++)
{
    a = new int[N];
}
а надо:
 
Код:
int **a = new int*[N];
for (int i = 0; i < N; i++)
{
    a[i] = new int[N];
}
Далее смотреть бессмыслено
-1 за транслит.
-1 за не правильное оформление кода на сайте, нечитабельно.
-1 за код с ошибками.
326
19 апреля 2015 года
sadovoya
757 / / 19.11.2005
Тоже заметил. Автор все-таки пытался код форматированно вставит с помощью тэгов (судя по [ code=CPP ] в посте), хоть и неудачно. Простим новичку?

По алгоритму. Столбцы и строки - понятие относительное. Мне удобней со строками обращаться. Вот код, сортирующий строки в матрице по росту индекса максим. элемента в строке.
Код:
//Компил. с поддержкой C++11
//Сортировка матрицы (вектора векторов) по индексу макс. элемента в строке
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct comp_class {
    bool operator() ( vector<int> a, vector<int> b) {
        return ( (max_element(a.begin(), a.end()) - a.begin())
                < (max_element(b.begin(), b.end()) - b.begin()) );
    }
} comp_obj;

int main() {
    vector<vector<int>> matr {
        {1,2,3},
        {2,3,1},
        {3,2,1}
    };

    sort(matr.begin(), matr.end(), comp_obj);
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 3; j++)
            cout << matr[i][j] << "; ";
        cout << endl;
    }

    return 0;
}
Литература:
std::sort
std::max_element
Если C++11 не поддерживается, просто ввод векторов переделайте по старому стандарту.
Остальную часть программы и переход к столбцам сами, думаю, осилите.
Это все написано, закрывая глаза на нижние. Так и не понял, что это :)

UPD
Лучше по константной ссылке вектора передавать, измените так:
 
Код:
bool operator() (const vector<int>& a, const vector<int>& b){
     ...
}
392
19 апреля 2015 года
cronya
421 / / 03.01.2009
У меня так получилось, как понял задание:
Код:
#include <iostream>
#include <ctime>

using std::cout;
using std::endl;
using std::system;

int**  Matrix(int size);
void PrintMatrix(int** matrix, int size);
void FreeMemmory(int** matrix, int size);
void Exchange(int** matrix, int size);

int main()
{
    srand((unsigned)time(0));
    int size = rand() % 5 + 2;
    if (size == 0) size += 2;
    if (size % 2 != 0) size += 1;
    int** matrix = Matrix(size);
    cout << "Matrix:" << endl;
    PrintMatrix(matrix, size); 
    Exchange(matrix, size);
    cout << "New Matrix:" << endl;
    PrintMatrix(matrix, size);
    FreeMemmory(matrix, size);
    cout << endl;
    system("pause");
    return 0;
}

int**  Matrix(int size)
{
    int **matrix = new int*[size];
    for (int idx = 0; idx < size; idx++)
    {
        matrix[idx] = new int[size];
    }
    for (int idx = 0; idx < size; idx++)
    {
        for (int jdx = 0; jdx < size; jdx++)
        {
            matrix[idx][jdx] = rand() % 21 - 10;
        }
    }
    return matrix;

}
void PrintMatrix(int** matrix, int size)
{
    for (int idx = 0; idx < size; idx++)
    {
        for (int jdx = 0; jdx < size; jdx++)
        {
            cout << matrix[idx][jdx] << "\t";
        }
        cout << endl;
    }
}
void FreeMemmory(int** matrix, int size)
{
    for (int idx = 0; idx < size; idx++)
    {
        delete[] matrix[idx];
    }
    delete[] matrix;
}

void Exchange(int** matrix, int size)
{
    for (int jdx = 0; jdx < size; jdx++)
    {
        int index = 0;
        bool flag = false;
        do
        {
            flag = false;
            for (int idx = 0; idx < size - 1; idx++)
            {
                if (matrix[idx][jdx] > matrix[idx + 1][jdx])
                {
                    int tmp = matrix[idx][jdx];
                    matrix[idx][jdx] = matrix[idx + 1][jdx];
                    matrix[idx + 1][jdx] = tmp;
                    flag = true;                   
                }
            }
        } while (flag);    
    }
    cout << "Sort matrix by up" << endl;
    PrintMatrix(matrix, size);
    for (int jdx = 0; jdx < size; jdx++)
    {
        cout << "Maximum element = " << matrix[size - 1][jdx] << " of column # = " << jdx << endl;
        int tmp = matrix[size - 1][jdx];
        matrix[size - 1][jdx] = matrix[jdx][jdx];
        matrix[jdx][jdx] = tmp;
    }
}
Код:
Matrix:
-10     4       3       -10
9       4       -10     7
5       -6      -1      1
0       -1      0       -7
Sort matrix by up
-10     -6      -10     -10
0       -1      -1      -7
5       4       0       1
9       4       3       7
Maximum element = 9 of column # = 0
Maximum element = 4 of column # = 1
Maximum element = 3 of column # = 2
Maximum element = 7 of column # = 3
New Matrix:
9       -6      -10     -10
0       4       -1      -7
5       4       3       1
-10     -1      0       7

Для продолжения нажмите любую клавишу . . .
Сортируем столбцы по возрастанию, максимальные получаются в конце, меняем местами с главной диагональю
88K
19 апреля 2015 года
tomililizzi
2 / / 18.04.2015
Прошу прощения за код и за оформление. Действительно пыталась. Но это мое первое сообщение здесь. И кстати я не знаю как так скопировался мой код, но у меня нет ошибки там где вы указали. Очень странно, может все остальные ошибки тоже из этой серии)))) но, к сожалению, ни один из ответов не является правильным( а нижние это значит, что если в столбце два одинаковых максимальных элемента, то нужен тот который расположен ниже в столбце.
392
19 апреля 2015 года
cronya
421 / / 03.01.2009
ищите тогда максимальный в столбце и все. Либо задание не корректно, так как максимальный элемент может быть на любой позиции в столбце, так что при переставление как вы говорите столбцов, задача становиться с непредсказуемым результатом, возможно вы не поняли сути задания, либо от вас требуют ерунду, сидеть и подгонять максимальные в столбце это бред, чтобы их потом выставить по линии, как в диагонали. Тут либо как я первый раз написал, либо так:
Код:
void Exchange(int** matrix, int size)
{
    for (int jdx = 0; jdx < size; jdx++)
    {
        int index = 0; 
       
        for (int idx = 0; idx < size; idx++)
        {
            if (matrix[idx][jdx] > matrix[index][jdx])
            {
                index = idx;
            }
        }
            cout << "Maximum element = " << matrix[index][jdx] << " of column # = " << jdx << endl;
            int tmp = matrix[index][jdx];
            matrix[index][jdx] = matrix[jdx][jdx];
            matrix[jdx][jdx] = tmp;
    }
   
}
совет на будущее, рисуйте на бумажке, чтобы была полная картина :) как Пикассо
392
19 апреля 2015 года
cronya
421 / / 03.01.2009
короче посидел подумал как то так наверно
Код:
#include <iostream>
#include <ctime>

using std::cout;
using std::endl;
using std::system;

int**  Matrix(int size);
void PrintMatrix(int** matrix, int size);
void FreeMemmory(int** matrix, int size);
int SearchIndexMaximum(int** matrix, int idx, int size);
void Exchange(int** matrix, int size);

int main()
{
    srand((unsigned)time(0));  
    int size = 6;
    int** matrix = Matrix(size);
    cout << "Matrix:" << endl;
    PrintMatrix(matrix, size); 
    Exchange(matrix, size);
    cout << "New Matrix:" << endl;
    PrintMatrix(matrix, size);
    FreeMemmory(matrix, size);
    cout << endl;
    system("pause");
    return 0;
}

int**  Matrix(int size)
{
    int** matrix = new int*[size];
    bool* maximum = new bool[size];
    int index = 0;
    for (int idx = 0; idx < size; idx++)
    {
        maximum[idx] = false;
    }
    for (int idx = 0; idx < size; idx++)
    {
        matrix[idx] = new int[size];
    }
    for (int jdx = 0; jdx < size; jdx++)
    {
        bool flag = false;
        do
        {
            flag = true;
            for (int idx = 0; idx < size; idx++)
            {
                matrix[idx][jdx] = rand() % 21 - 10;
            }
            index = SearchIndexMaximum(matrix, jdx, size);
            if (!maximum[index])
            {
                flag = false;
                maximum[index] = true;
            }          
        }
        while (flag);
    }
    delete[] maximum;
    return matrix;
}
void PrintMatrix(int** matrix, int size)
{
    for (int idx = 0; idx < size; idx++)
    {
        for (int jdx = 0; jdx < size; jdx++)
        {
            cout << matrix[idx][jdx] << "\t";
        }
        cout << endl;
    }
}
void FreeMemmory(int** matrix, int size)
{
    for (int idx = 0; idx < size; idx++)
    {
        delete[] matrix[idx];
    }
    delete[] matrix;
}
void Exchange(int** matrix, int size)
{
    int* position = new int[size];
    for (int jdx = 0; jdx < size; jdx++)
    {
        int index = 0;
        for (int idx = 0; idx < size; idx++)
        {
            if (matrix[idx][jdx] >= matrix[index][jdx])
            {
                index = idx;
            }
        }
        cout << "Maximum element = " << matrix[index][jdx] << " of column # = " << jdx << " in row # = " << index << endl;
        position[jdx] = index;
    }  
    bool flag = false;
    do
    {
        flag = false;
        for (int jdx = 0; jdx < size; jdx++)
        {
            if (jdx != position[jdx])
            {
                flag = true;
                for (int idx = 0; idx < size; idx++)
                {
                    int tmp = matrix[idx][jdx];
                    matrix[idx][jdx] = matrix[idx][position[jdx]];
                    matrix[idx][position[jdx]] = tmp;
                }
                int ptr = position[jdx];
                position[jdx] = position[ptr];
                position[ptr] = ptr;
            }
        }
    } while (flag);
    delete[] position;
}

int SearchIndexMaximum(int** matrix, int jdx, int size)
{
    int index = 0;
    for (int idx = 0; idx < size; idx++)
    {
        if (matrix[idx][jdx] >= matrix[index][jdx])
        {
            index = idx;
        }
    }
    return index;
}
Результат:
Код:
Matrix:
-6      -1      -6      9       -5      -7
-7      -3      -3      -8      8       0
5       5       -3      -10     -8      7
-9      -3      2       -5      -6      0
7       -8      -4      3       5       3
3       -10     -8      5       -8      7
Maximum element = 7 of column # = 0 in row # = 4
Maximum element = 5 of column # = 1 in row # = 2
Maximum element = 2 of column # = 2 in row # = 3
Maximum element = 9 of column # = 3 in row # = 0
Maximum element = 8 of column # = 4 in row # = 1
Maximum element = 7 of column # = 5 in row # = 5
New Matrix:
9       -5      -1      -6      -6      -7
-8      8       -3      -3      -7      0
-10     -8      5       -3      5       7
-5      -6      -3      2       -9      0
3       5       -8      -4      7       3
5       -8      -10     -8      3       7

Для продолжения нажмите любую клавишу . . .
Возможно математики где изредка будет косячна, но вроде не заметил при отладке.
Прикрепленные файлы:
2 Кб
Загрузок: 572
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог