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

Дружественные функции

  1. Постановка задачи

Та же самая задача, но для массива количества положительных чисел использовать класс vect. Использовать несколько дружественных функций.

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

1.

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

2.

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

3.

Максимальный элемент выделенной области нечетный. Программа завершает работу.

  1. Метод

Используем классы matr и vect для решения нашей задачи. В классе vect создадим функцию fill_mass, которая будет заполнять массив на основании данных матрицы B, и объявим ее дружественной к классу matr. Добавим глобальную дружественную функцию sort_mass для сортировки массива и матрицы согласно условиям задачи.

  1. Программа

/*

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

}