Дружественные функции
Постановка задачи
Та же самая задача, но для массива количества положительных чисел использовать класс vect. Использовать несколько дружественных функций.
Тестовые примеры
1. |
Максимум выделенной области четен, строки матрицы упорядочиваются по убыванию количества положительных элементов.
|
2. |
Строки матрицы уже упорядочены по убыванию количества положительных элементов.
|
3. |
Максимальный элемент выделенной области нечетный. Программа завершает работу.
|
Метод
Используем классы matr и vect для решения нашей задачи. В классе vect создадим функцию fill_mass, которая будет заполнять массив на основании данных матрицы B, и объявим ее дружественной к классу matr. Добавим глобальную дружественную функцию sort_mass для сортировки массива и матрицы согласно условиям задачи.
Программа
/*
28. Дана целочисленная квадратная матрица N <=20 (вводится).
В заштрихованной области найти максимальный элемент,
Если это четное число, то для каждой строки во всей матрице
найти количество положительных элементов и упорядочить строки
всей матрицы по убыванию количества положительных элементов.
*/
// Используем дополнительно класс vect
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <ctime>
using namespace std;
class matr;
class vect
{
int *base;
int size;
public:
vect(int n=1) { size=n; base=new int[size];}
~vect() {delete [] base;}
void print();
void add(vect& v1);
vect& add1(vect& v1,vect&v2);
void fill_mass(matr& zm);
friend void sort_mass(matr&, vect&); //глобальная дружественная функция
};
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);}
friend void vect::fill_mass(matr& zm); //дружественная функция другого класса
friend void sort_mass(matr&, vect&); //глобальная дружественная функция
};
void vect:: print()
{
// cout<<"Массив: "<<endl;
for(int i=0;i<size;i++)
cout<<setw(6)<<base[i]<<" ";
cout<<endl;
}
void vect::add(vect & v1)
{
for(int i=0;i<size;i++)
base[i]=base[i]+v1.base[i];
}
vect& vect::add1(vect & v1,vect& v2)
{
int z;
z=v1.size>v2.size?v1.size:v2.size;
for(int i=0; i<z; i++)
this->base[i] = v2.base[i]+v1.base[i];
return (*this);
}
//конструктор
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 vect::fill_mass( matr& zm)
{
for (int i=0; i<zm.x_size;i++)
{
base[i]=0;
for (int j=0; j<zm.y_size;j++)
{
if (zm.elem1(i,j)>0)
base[i]++;
}
}
}
//сортируем матрицу и массив
void sort_mass(matr& zm, vect& mass)
{
int temp;
for (int j=0; j<zm.x_size; j++)
for (int i=0; i<zm.y_size; i++)
if (mass.base[i]<mass.base[i+1])
{
temp=mass.base[i];
mass.base[i]=mass.base[i+1];
mass.base[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)
{
vect mass(n);
//Формируем массив кол-ва "+" элементов в каждой строке
mass.fill_mass(B);
cout<<endl<<"Positiv massiv: ";
mass.print();
//сортируем массив и строки матрицы
sort_mass(B,mass);
cout<<endl<<"Sorted matrix: "<<endl;
// mass.print();
B.print();
}
}
//ф-я поиска максимума в области
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);
}