Добавил:
t.me Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 семестр / Примеры. Матрица, дружественные и перегрузка-2.docx
Скачиваний:
2
Добавлен:
16.07.2023
Размер:
204.5 Кб
Скачать

Использование класса matr

Вариант №28.

  1. Постановка задачи. Дана целочисленная квадратная матрица N <=20 (вводится). В заштрихованной области найти максимальный элемент. Если это четное число, то для каждой строки во всей матрице найти количество положительных элементов и упорядочить строки всей матрицы по убыванию количества положительных элементов.

  1. Тестовые примеры

1.

Максимум выделенной области четен, строки матрицы упорядочиваются по убыванию количества положительных элементов.

2.

Максимум выделенной области – нечетное число. Далее ничего не происходит.

3.

Максимум выделенной области четен, строки матрицы упорядочиваются по убыванию количества положительных элементов.

  1. Метод

Массив В задается рандомно или с клавиатуры. Создаем функцию поиска максимума в выделенной области. В основной функции проверяем четность найденного максимума. Если максимум четный, то создаем массив, вызываем функцию нахождения количества положительных элементов, которые сразу записываем в этот массив. Далее вызываем функцию сортировки, которая упорядочивает массив и строки матрицы согласно условию задачи.

  1. Программа

/*

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);

}