I. Выраженный:
Матрица с К=1 не изменяется.
II. Невыраженный:
Пример работы с матрицей В:
if (K%2==0)
{
k=K/2;
}
else
{
k= K%2;
}
for (int i=0; i<k; i++)
{
for (int j=0; j<k; j++)
{
temp = A[i][j];
A[i][j]= A[k+1-i][j];
A[k+1-i][j] = temp;
}
}
1 вариант: К=1
1. temp = A[0][0]; A[0][0]= A[1+1-0][0]; A[1+1-0][0] = temp; | temp = 1; A[0][0]= 7; A[2][0] = 1; |
2. temp = A[0][1]; A[0][1]= A[1+1-0][1]; A[1+1-0][1] = temp; | temp = 2; A[0][1]= 8; A[2][1] = 2; |
3. temp = A[0][2]; A[0][2]= A[1+1-0][2]; A[1+1-0][2] = temp; | temp = 3; A[0][2]= 9; A[2][2] = 3; |
2 вариант: К=2
1. temp = A[0][0]; A[0][0]= A[2+1-0][0]; A[2+1-0][0] = temp; | temp = 1; A[0][0]= 13; A[3][0] = 1; |
2. temp = A[0][1]; A[0][1]= A[2+1-0][1]; A[2+1-0][1] = temp; | temp = 2; A[0][1]= 14; A[3][1] = 2; |
3. temp = A[0][2]; A[0][2]= A[2+1-0][2]; A[2+1-0][2] = temp; | temp = 3; A[0][2]= 15; A[3][2] = 3; |
4. temp = A[0][3]; A[0][3]= A[2+1-0][3]; A[2+1-0][3] = temp; | temp = 4; A[0][3]= 16; A[3][3] = 4; |
5. temp = A[1][0]; A[1][0]= A[2+1-1][0]; A[2+1-1][0] = temp; | temp = 5; A[1][0]= 9; A[2][0] = 5; |
6. temp = A[1][1]; A[1][1]= A[2+1-1][1]; A[2+1-1][1] = temp; | temp = 6; A[1][1]= 10; A[2][1] = 6; |
7. temp = A[1][2]; A[1][2]= A[2+1-1][2]; A[2+1-1][2] = temp; | temp = 7; A[1][2]=11; A[2][2] = 7; |
8. temp = A[1][3]; A[1][3]= A[2+1-1][3]; A[2+1-1][3] = temp; | temp = 8; A[1][3]= 12; A[2][3] = 8; |
Пример работы с матрицей А:
int i, j, temp;
for(i=pos1,n=sub.pos1;i<pos1+k;i++,n++)
{
for(j=pos2,z=sub.pos2;j<pos2+l;j++,z++)
{
temp = m[i][j];
m[i][j] = sub.m[n][z];
sub.m[n][z] = temp;
}
}
1 вариант: K=2
temp = m[i][j]; m[i][j] = sub.m[n][z]; sub.m[n][z] = temp; | temp = m[0][1]; m[0][1] = sub.m[1][0]; sub.m[1][0] = temp; |
2 вариант: K=3
1. temp = m[i][j]; m[i][j] = sub.m[n][z]; sub.m[n][z] = temp; | temp = m[0][1]; m[0][1] = sub.m[1][0]; sub.m[1][0] = temp; |
2. temp = m[i][j]; m[i][j] = sub.m[n][z]; sub.m[n][z] = temp; | temp = m[0][2]; m[0][2] = sub.m[2][0]; sub.m[2][0] = temp; |
3. temp = m[i][j]; m[i][j] = sub.m[n][z]; sub.m[n][z] = temp; | temp = m[1][2]; m[1][2] = sub.m[2][1]; sub.m[2][1] = temp; |
Разработанная программа для решения данного задания
matrix.h
#include<string>
#ifndef MATRIX_H
#defineMATRIX_H
classSubmatrix;
classMatrix
{
public:
Matrix(int _k, int _l);//конструктор с параметрами
~Matrix();//деструктор
Submatrix **sub;//специально занесенный указатель на указатель класса подматриц в Public.
void enterData(std::string path);//ввод данных из файла
void print();//печать матрицы
int maxiA();//мах элемент в матрице А
int getMaxA(){return max1;};//возвращение элемента
private:
void initialize();//инициализор подматриц.
private:
int **a,k,l,max1;//а - подматрица, k,l - размер подматриц
};
classSubmatrix
{
public:
Submatrix():m(0),pos1(0),pos2(0),cotan(false){}//конструктор по умолчанию.
void initialize(int _pos1, int _pos2, int _k, int _l, int **matrix);//иницализируем подматрицу
void rotate();//переворот относительно горизонтальной оси
int setMAX(int max1);//изменение/присваивание значения другой переменной
void operator=(Submatrix&sub);//перестановка подматриц местами
int cotanMax();//проверка есть ли мах элемент в подматрице
int getMaxB(){return maxB;}
private:
int **m,pos1,pos2,k,l,maxB;//m-матрица, pos1/pos2-координаты подматрицы, k,l - размер
bool cotan;//false || true
};
#endif
matrix.cpp
#include"matrix.h"
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
Matrix::Matrix(int_k, int_l):k(_k),l(_l)//конструктор матрицы
{
a = newint*[k*k];
for(int i=0;i<k*k;i++)
a[i] = newint[l*l];
initialize();
}
Matrix::~Matrix()//диструктор
{
for(int i=0;i<k;i++)
delete[] sub[i];
delete[] sub;
for(int i=0;i<k*k;i++)
delete[] a[i];
delete[] a;
}
intMatrix::maxiA()//максимальный элемент в матрице А
{
max1=a[0][0];
for(int i=0;i<k*k;i++)
{
for(int j=0;j<l*l;j++)
{
if(max1<a[i][j])
{
max1=a[i][j];
}
}
}
return max1;
}
intSubmatrix::setMAX(intmax1)//меняем значение махВ
{
int maxB=max1;
return maxB;
}
voidMatrix::initialize()//инициализатор подматриц
{
sub = newSubmatrix*[k];
for(int i=0;i<k;i++)
sub[i] = newSubmatrix[l];
for(int i=0,n=0;i<k*k;i+=k,n++)
for(int j=0,m=0;j<l*l;j+=l,m++)
sub[n][m].initialize(i,j,k,l,a);
}
voidMatrix::enterData(std::stringpath)//считываем данные с файла
{
std::ifstream file(path);
for(int i=0;i<k*k;i++)
for(int j=0;j<l*l;j++)
file >> a[i][j];
file.close();
}
voidMatrix::print()//печать матриц на экран
{
for(int i=0;i<k*k;i++)
{
if(!(i%k))
std::cout << std::endl;
for(int j=0;j<l*l;j++)
{
if(!(j%l))
std::cout <<" ";
std::cout << std::setw(2) << a[i][j];
}
std::cout << std::endl;
}
}
voidSubmatrix::initialize(int_pos1,int_pos2,int_k, int_l, int **matrix)//иницализая подматрицы
{
m = matrix;
pos1 = _pos1;
pos2 = _pos2;
k = _k;
l = _l;
}
intSubmatrix::cotanMax()//проверка есть ли мах элемент в подматрице
{
for(int i=pos1;i<pos1*k;i++)
{
for(int j=pos2;j<pos2*l;j++)
{
if(m[pos1][pos2]==(maxB))
{
cotan=true;
}
}
}
return cotan;
}
voidSubmatrix::rotate()//переворот подматрицы относительно строк
{
for(int i=pos1,c=0;i<pos1+k/2;i++,c++)
for(int j=pos2;j<pos2+l;j++)
{
int temp = m[i][j];
m[i][j]=m[pos1+k-c-1][j];
m[pos1+k-c-1][j]=temp;
}
}
voidSubmatrix::operator=(Submatrix&sub)//перестановка подматриц местами
{
int pos1,pos2,n,z;
for(int i=pos1,n=sub.pos1;i<pos1+k;i++,n++)
for(int j=pos2,z=sub.pos2;j<pos2+l;j++,z++)
{
int temp = m[i][j];
m[i][j] = sub.m[n][z];
sub.m[n][z] = temp;
}
}
main.cpp
#include<iostream>
#include"matrix.h"
#definek 3
#definel 3
usingnamespace std;
int main()
{
int maxA,maxB,max1,pos1=0,pos2=0;
Matrix a(k,l);
Submatrix sub;
setlocale(0,"Rus");
a.enterData("C:\\test.txt");
a.print();
cout <<"\n------------------------------------------------------------------";
std::cout<<"\nМаксимальный элемент: ";
cout << a.maxiA();
sub.setMAX(max1);
maxB=a.maxiA();
cout <<"\n------------------------------------------------------------------\n";
std::cout<<"\nРазворот вокруг строк где есть мах элемент"<<endl;
for(pos1=0;pos1<k;pos1++)
{
for(pos2=0;pos2<l;pos2++)
{
if(a.sub[pos1][pos2].cotanMax()==true)//определение мах элемента в подматрице
{
a.sub[pos1][pos2].rotate();//переворот если есть мах эелемент
}
}
}
a.print();
cout <<"\n------------------------------------------------------------------\n";
std::cout<<"\nПеремещение подматричек"<<endl;
sub.operator=(sub);//перемещение подматриц
a.print();
return 0;
}