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
Для продолжения нажмите любую клавишу . . .
Как поменять столбцы матрицы так чтобы максимальные элементы были на главной диагонали?
Вообще задание такое:Найти все самые нижние максимальные элементы в столбцах и перестановкой столбцов добиться их расположения на главной диагонали.
Задание почти выполнено, осталось только поменять столбцы так чтоб эти самые максимальные элементы стояли по диагонали.
Очень нужна ваша помощь
[ 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 ]
PS: у вас ошибок много в коде, то что он работает сомнительно :)
вот пример
у вас
Код:
int **a = new int*[N];
for (int i = 0; i < N; i++)
{
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];
}
for (int i = 0; i < N; i++)
{
a[i] = new int[N];
}
-1 за транслит.
-1 за не правильное оформление кода на сайте, нечитабельно.
-1 за код с ошибками.
По алгоритму. Столбцы и строки - понятие относительное. Мне удобней со строками обращаться. Вот код, сортирующий строки в матрице по росту индекса максим. элемента в строке.
Код:
//Компил. с поддержкой 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;
}
//Сортировка матрицы (вектора векторов) по индексу макс. элемента в строке
#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){
...
}
...
}
Код:
#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;
}
}
#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;
}
}
Код:
Прошу прощения за код и за оформление. Действительно пыталась. Но это мое первое сообщение здесь. И кстати я не знаю как так скопировался мой код, но у меня нет ошибки там где вы указали. Очень странно, может все остальные ошибки тоже из этой серии)))) но, к сожалению, ни один из ответов не является правильным( а нижние это значит, что если в столбце два одинаковых максимальных элемента, то нужен тот который расположен ниже в столбце.
Код:
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;
}
}
{
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;
}
}
Код:
#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;
}
#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
Для продолжения нажмите любую клавишу . . .
-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
Для продолжения нажмите любую клавишу . . .