Использование класса matr
Вариант №28.
Постановка задачи. Дана целочисленная квадратная матрица N <=20 (вводится). В заштрихованной области найти максимальный элемент. Если это четное число, то для каждой строки во всей матрице найти количество положительных элементов и упорядочить строки всей матрицы по убыванию количества положительных элементов.
Тестовые примеры
1. |
Максимум выделенной области четен, строки матрицы упорядочиваются по убыванию количества положительных элементов.
|
2. |
Максимум выделенной области – нечетное число. Далее ничего не происходит.
|
3. |
Максимум выделенной области четен, строки матрицы упорядочиваются по убыванию количества положительных элементов.
|
Метод
Массив В задается рандомно или с клавиатуры. Создаем функцию поиска максимума в выделенной области. В основной функции проверяем четность найденного максимума. Если максимум четный, то создаем массив, вызываем функцию нахождения количества положительных элементов, которые сразу записываем в этот массив. Далее вызываем функцию сортировки, которая упорядочивает массив и строки матрицы согласно условию задачи.
Программа
/*
28. Дана целочисленная квадратная матрица N <=20 (вводится).
В заштрихованной области найти максимальный элемент,
Если это четное число, то для каждой строки во всей матрице
найти количество положительных элементов и упорядочить строки
всей матрицы по убыванию количества положительных элементов.
*/
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <ctime>
using namespace std;
class matr
{
int **base;
int x_size,y_size;
public:
matr(int r,int s);
~matr();
void print();
void print_obl();
void random_fill();
void change_str(int i, int j)
{
int *t =new int [x_size];
t=base[i];
base[i]=base[j];
base[j]=t;
}
// Надо понимать разницу между следующими двумя функциями
int& elem(int i,int j) {return (base[i][j]);}
int elem1(int i,int j) {return (base[i][j]);}
int ox_size() {return(x_size);}
int oy_size() {return(y_size);}
};
//конструктор
matr::matr(int r=1,int s=1)
{
y_size=r;
x_size=s;
base=new int *[y_size];
for(int i=0;i<y_size;i++)
{
base[i]=new int[x_size];
}
}
//деструктор
matr::~matr()
{
for(int i=0;i<y_size;i++)
delete []base[i];
delete []base;
}
//вывод матрицы
void matr::print()
{
for (int i=0;i<y_size;i++)
{ for (int j=0;j<x_size;j++)
cout<<setw(6)<<base[i][j]<<" "; //делаем красивый вывод матрицы
cout<<endl;
}
}
//Выводим область
void matr::print_obl()
{
for (int i=0;i<y_size;i++)
{
for (int j=0;j<x_size;j++)
{
if (i<y_size/2 && j<x_size-i-1)
cout<<setw(7)<<" ";
else cout<<setw(6)<<base[i][j]<<" ";
}
cout<<endl;
}
}
//заполнение матрицы рандомно
void matr::random_fill()
{
srand(time(0));
for (int i=0;i<y_size;i++)
{ for (int j=0;j<x_size;j++)
base[i][j]=rand()%200-100;
//base[i][j]=(double)(rand()%10000)/100-50;
}
}
//Формируем массив
void fill_mass(matr& zm, int *mass)
{
for (int i=0; i<zm.ox_size();i++)
{
mass[i]=0;
for (int j=0; j<zm.oy_size();j++)
{
if (zm.elem1(i,j)>0)
mass[i]++;
}
}
//zm.min_elem(i);
}
//сортируем матрицу и массив
void sort_mass(matr& zm, int *mass)
{
int temp;
for (int j=0; j<zm.oy_size(); j++)
for (int i=0; i<zm.oy_size()-1; i++)
if (mass[i]<mass[i+1])
{
temp=mass[i];
mass[i]=mass[i+1];
mass[i+1]=temp;
zm.change_str(i,i+1);
}
}
//главная
int main(void)
{
int i,j, n,t;
int max;
cout<<"Input size of matrix ";
do { cin>>n;} while (n<2);
matr B(n,n);
int find_max_obl (matr &zm); // Все понимают, что здесь сделано и зачем? А можно было как-то по-другому?
cout<<"Choose matrix filling: 1 - random; 2 - hand\n";
do { cin>>t;} while (t!=1&&t!=2);
if (t==1) B.random_fill();
else {
cout<<"Input matrix "<<B.oy_size()<<"x"<<B.ox_size()<<endl;
for(i=0;i<B.oy_size();i++)
for(j=0;j<B.ox_size();j++)
cin>>B.elem(i,j);
}
B.print();
cout<<"Oblast'"<<endl;
B.print_obl();
max=find_max_obl(B);
cout<<"Maximum = "<<max;
if (max%2==0)
{
int *mass=new int[n];
//Формируем массив кол-ва "+" элементов в каждой строке
fill_mass(B,mass);
cout<<endl<<"Positiv massiv: ";
for (int i=0; i<n; i++)
cout<<mass[i]<<" ";
//сортируем массив и строки матрицы
sort_mass(B,mass);
cout<<endl<<"Sorted matrix: "<<endl;
B.print();
delete []mass;
}
}
//ф-я поиска максимума в области
int find_max_obl (matr &zm)
{
int i,j;
int max=zm.elem1(0,zm.ox_size()-1);
for(i=0;i<zm.oy_size();i++)
for(j=0;j<zm.ox_size();j++)
{
if(zm.elem1(i,j)>max && (i>zm.oy_size()/2 || j>=zm.ox_size()-i-1))
max=zm.elem1(i,j);
}
return(max);
}