лабки / ооп_10лаб
.docxВаріант 10
Лабораторна робота №10
Код програми:
#include <iostream>
using namespace std;
class Vektor;
class Matrix;
class Vektor
{
private:
int rows = 5;
int columns = 1;
int* mas = new int[rows];
public:
Vektor()
{
}
void Filling(int rows, int columns)
{
this->columns = columns;
this->rows = rows;
if (rows > columns)
{
for (int i = 0; i < rows; i++)
{
mas[i] = rand() % 16 - 2;
}
}
if (rows < columns)
{
for (int i = 0; i < columns; i++)
{
mas[i] = rand() % 16 - 2;
}
}
}
void Output()
{
cout << "-----------------" << endl;
if (rows > columns)
{
for (int j = 0; j < rows; j++)
{
cout << mas[j] << " ";
}
cout << endl;
}
if (rows < columns)
{
for (int i = 0; i < columns; i++)
{
cout << mas[i] << endl;
}
}
cout << "-----------------" << endl;
}
~Vektor()
{
delete[] mas;
cout << endl << endl << "Деструктор успешно удалил одномерный динамический массив mas." << endl;
}
friend Matrix;
friend void Matrix_Multiply_Vektor(Matrix& arr, Vektor& mas);
friend void Vektor_Multiply_Matrix(Vektor& mas, Matrix& arr);
friend void Number_Multiply_Matrix(int number, Matrix& arr);
friend void Matrix_Multiply_Number(Matrix& arr, int number);
friend void Matrix_Multiply_Matrix(Matrix& arr1, Matrix& arr2);
friend void Vektor_Multiply_Vektor(Vektor& mas1, Vektor& mas2);
};
class Matrix
{
private:
int rows = 4;
int columns = 5;
int** arr = new int* [rows];
public:
Matrix()
{
}
~Matrix()
{
for (int i = 0; i < rows; i++)
{
delete[] arr[i];
}
delete[] arr;
cout << endl << endl << "Деструктор успешно удалил двумерный динамический массив arr." << endl;
}
void Array_Initialization(int rows, int columns)
{
this->rows = rows;
this->columns = columns;
for (int i = 0; i < rows; i++) // создание динамического массива в каждом элементе строки
{
arr[i] = new int[columns];
}
}
void Filling()
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
arr[i][j] = rand() % 16 - 2;
}
}
}
void Output()
{
cout << "-----------------" << endl;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
cout << "-----------------" << endl;
}
friend Vektor;
friend void Matrix_Multiply_Vektor(Matrix& arr, Vektor& mas);
friend void Vektor_Multiply_Matrix(Vektor& mas, Matrix& arr);
friend void Number_Multiply_Matrix(int number, Matrix& arr);
friend void Matrix_Multiply_Number(Matrix& arr, int number);
friend void Matrix_Multiply_Matrix(Matrix& arr1, Matrix& arr2);
friend void Vektor_Multiply_Vektor(Vektor& mas1, Vektor& mas2);
};
void Matrix_Multiply_Vektor(Matrix& arr, Vektor& mas)
{
///
int** answer = new int* [arr.rows]; // создание третьего динамического массива для записи туда ответа
for (int i = 0; i < arr.rows; i++)
{
answer[i] = new int[arr.columns];
}
///
for (int i = 0; i < arr.rows; i++) // подсчёт
for (int j = 0; j < arr.columns; j++)
answer[i][j] = arr.arr[i][j] * mas.mas[j];
for (int i = 0; i < arr.rows; i++) // вывод
{
for (int j = 0; j < arr.columns; j++)
{
cout << answer[i][j] << " ";
}
cout << endl;
}
///
for (int i = 0; i < arr.rows; i++) // удаление динамического массива для ответа
{
delete[] answer[i];
}
delete[] answer;
///
}
void Vektor_Multiply_Matrix(Vektor& mas, Matrix& arr)
{
///
int** answer = new int* [arr.rows]; // создание третьего динамического массива для записи туда ответа
for (int i = 0; i < arr.rows; i++)
{
answer[i] = new int[arr.columns];
}
///
for (int i = 0; i < arr.rows; i++) // подсчёт
for (int j = 0; j < arr.columns; j++)
answer[i][j] = mas.mas[j] * arr.arr[i][j];
for (int i = 0; i < arr.rows; i++) // вывод
{
for (int j = 0; j < arr.columns; j++)
{
cout << answer[i][j] << " ";
}
cout << endl;
}
///
for (int i = 0; i < arr.rows; i++) // удаление динамического массива для ответа
{
delete[] answer[i];
}
delete[] answer;
///
}
void Number_Multiply_Matrix(int number, Matrix& arr)
{
///
int** answer = new int* [arr.rows]; // создание третьего динамического массива для записи туда ответа
for (int i = 0; i < arr.rows; i++)
{
answer[i] = new int[arr.columns];
}
///
for (int i = 0; i < arr.rows; i++)
{
for (int j = 0; j < arr.columns; j++)
{
answer[i][j] = number * arr.arr[i][j];
}
}
for (int i = 0; i < arr.rows; i++) // вывод
{
for (int j = 0; j < arr.columns; j++)
{
cout << answer[i][j] << " ";
}
cout << endl;
}
///
for (int i = 0; i < arr.rows; i++) // удаление динамического массива для ответа
{
delete[] answer[i];
}
delete[] answer;
///
}
void Matrix_Multiply_Number(Matrix& arr, int number)
{
///
int** answer = new int* [arr.rows]; // создание третьего динамического массива для записи туда ответа
for (int i = 0; i < arr.rows; i++)
{
answer[i] = new int[arr.columns];
}
///
for (int i = 0; i < arr.rows; i++)
{
for (int j = 0; j < arr.columns; j++)
{
answer[i][j] = arr.arr[i][j] * number;
}
}
for (int i = 0; i < arr.rows; i++) // вывод
{
for (int j = 0; j < arr.columns; j++)
{
cout << answer[i][j] << " ";
}
cout << endl;
}
///
for (int i = 0; i < arr.rows; i++) // удаление динамического массива для ответа
{
delete[] answer[i];
}
delete[] answer;
///
}
void Matrix_Multiply_Matrix(Matrix& arr1, Matrix& arr2)
{
///
int** answer_plus = new int* [arr1.rows]; // создание третьего динамического массива для записи туда ответа
for (int i = 0; i < arr2.columns; i++)
{
answer_plus[i] = new int[arr2.columns];
}
///
for (int i = 0; i < arr1.rows; i++) // затирание массива нулями чтобы не было мусора
{
for (int j = 0; j < arr2.columns; j++)
{
answer_plus[i][j] = 0;
}
}
for (int i = arr1.rows - 1; i >= 0; --i)
{
for (int j = arr2.columns - 1; j >= 0; --j)
{
for (int k = arr1.columns - 1; k >= 0; --k)
{
answer_plus[i][j] += arr1.arr[i][k] * arr2.arr[k][j];
}
}
}
for (int i = 0; i < arr2.columns; i++) // вывод
{
for (int j = 0; j < arr1.rows; j++)
{
cout << answer_plus[i][j] << " ";
}
cout << endl;
}
///
for (int i = 0; i < arr2.columns; i++) // удаление динамического массива для ответа
{
delete[] answer_plus[i];
}
delete[] answer_plus;
///
}
void Vektor_Multiply_Vektor(Vektor& mas1, Vektor& mas2)
{
if (mas1.rows > mas1.columns)
{
int** answer = new int* [mas1.rows]; // создание третьего динамического массива для записи туда ответа
for (int i = 0; i < mas1.rows; i++)
{
answer[i] = new int[mas2.columns];
}
for (int i = 0; i < mas1.rows; i++)
{
for (int j = 0; j < mas2.columns; j++)
{
answer[i][j] = mas1.mas[i] * mas2.mas[j];
}
}
for (int i = 0; i < mas1.rows; i++)
{
for (int j = 0; j < mas2.columns; j++)
{
cout << answer[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < mas1.rows; i++) // удаление динамического массива для ответа
{
delete[] answer[i];
}
delete[] answer;
}
if (mas1.rows < mas1.columns)
{
int answer_number = 0;
int answer[15];
for (int i = 0; i < mas1.columns; i++)
{
answer[i] = mas1.mas[i] * mas2.mas[i];
answer_number = answer_number + answer[i];
}
cout << answer_number << endl;
}
}
int main()
{
int change;
setlocale(LC_ALL, "Russian");
Matrix matrix1;
Matrix matrix2;
Vektor vektor1;
Vektor vektor2;
cout << "1 - умножение вектора на матрицу;" << endl << "2 - умножение матрицы на вектор;" << endl << "3 - умножение матрицы на матрицу;" << endl << "4 - умножение числа на матрицу;" << endl << "5 - умножение матрицы на число." << endl << "6 - умножение вектора на вектор" << endl << endl;
cout << "Выберите операцию: ";
cin >> change;
cout << endl;
switch (change)
{
int rowsM1, columnsM1, rowsM2, columnsM2;
int rowsV1, columnsV1, rowsV2, columnsV2;
int number;
case 1:
cout << "Введите количество строк матрицы: ";
cin >> rowsM1;
cout << "Введите количество столбцов матрицы: ";
cin >> columnsM1;
cout << "Введите количество строк вектора: ";
cin >> rowsV1;
cout << "Введите количество столбцов вектора: ";
cin >> columnsV1;
if (columnsM1 != rowsV1)
{
cout << "Количество столбцов матрицы должно совпадать с количеством строк вектора";
return 0;
}
vektor1.Filling(rowsV1, columnsV1); // заполнение рандомными числами вектора
vektor1.Output();
matrix1.Array_Initialization(rowsM1, columnsM1); // инициализация двумерного динамического массива
matrix1.Filling(); // заполнение рандомными числами матрицы
cout << "Матрица содержит следующие числа: " << endl;
matrix1.Output();
cout << "Исходная матрица, умноженная на вектор выглядит следующим образом: " << endl;
cout << "-----------------" << endl;
Vektor_Multiply_Matrix(vektor1, matrix1); // умножение вектора на матрицу
cout << "-----------------" << endl;
break;
case 2:
cout << "Введите количество строк матрицы: ";
cin >> rowsM1;
cout << "Введите количество столбцов матрицы: ";
cin >> columnsM1;
cout << "Введите количество строк вектора: ";
cin >> rowsV1;
cout << "Введите количество столбцов вектора: ";
cin >> columnsV1;
if (columnsM1 != rowsV1)
{
cout << "Количество столбцов матрицы должно совпадать с количеством строк вектора";
return 0;
}
vektor1.Filling(rowsV1, columnsV1); // заполнение рандомными числами вектора
vektor1.Output();
matrix1.Array_Initialization(rowsM1, columnsM1); // инициализация двумерного динамического массива
matrix1.Filling(); // заполнение рандомными числами матрицы
cout << "Матрица содержит следующие числа: " << endl;
matrix1.Output();
cout << "Исходная матрица, умноженная на вектор выглядит следующим образом: " << endl;
cout << "-----------------" << endl;
Matrix_Multiply_Vektor(matrix1, vektor1); // умножение вектора на матрицу
cout << "-----------------" << endl;
break;
case 3:
cout << "Введите количество строк матрицы: ";
cin >> rowsM1;
cout << "Введите количество столбцов матрицы: ";
cin >> columnsM1;
cout << "Введите количество строк второй матрицы: ";
cin >> rowsM2;
cout << "Введите количество столбцов второй матрицы: ";
cin >> columnsM2;
matrix1.Array_Initialization(rowsM1, columnsM1); // инициализация двумерного динамического массива
matrix2.Array_Initialization(rowsM2, columnsM2); // инициализация двумерного динамического массива
matrix1.Filling(); // заполнение рандомными числами матрицы
matrix2.Filling(); // заполнение рандомными числами матрицы
if (columnsM1 != rowsM2)
{
cout << "Количество столбцов первой матрицы должно быть равно количеству строк второй матрицы" << endl;
return 0;
}
cout << "Первая матрица содержит следующие числа: " << endl;
matrix1.Output();
cout << "Вторая матрица содержит следующие числа: " << endl;
matrix2.Output();
cout << "Первая матрица, умноженная на вторую матрицу, выглядит следующим образом: " << endl;
cout << "-----------------" << endl;
Matrix_Multiply_Matrix(matrix1, matrix2);
cout << "-----------------" << endl;
break;
case 4:
cout << "Введите количество строк матрицы: ";
cin >> rowsM1;
cout << "Введите количество столбцов матрицы: ";
cin >> columnsM1;
cout << "Введите число, на которое будет умножена матрица: ";
cin >> number;
matrix1.Array_Initialization(rowsM1, columnsM1); // инициализация двумерного динамического массива
matrix1.Filling(); // заполнение рандомными числами матрицы
cout << "Матрица содержит следующие числа: " << endl;
matrix1.Output();
cout << "Исходная матрица, умноженная на (" << number << ") выглядит следующим образом: " << endl;
cout << "-----------------" << endl;
Number_Multiply_Matrix(number, matrix1); // умножение вектора на матрицу
cout << "-----------------" << endl;
break;
case 5:
cout << "Введите количество строк матрицы: ";
cin >> rowsM1;
cout << "Введите количество столбцов матрицы: ";
cin >> columnsM1;
cout << "Введите число, на которое будет умножена матрица: ";
cin >> number;
matrix1.Array_Initialization(rowsM1, columnsM1); // инициализация двумерного динамического массива
matrix1.Filling(); // заполнение рандомными числами матрицы
cout << "Матрица содержит следующие числа: " << endl;
matrix1.Output();
cout << "Исходная матрица, умноженная на (" << number << ") выглядит следующим образом: " << endl;
cout << "-----------------" << endl;
Matrix_Multiply_Number(matrix1, number); // умножение вектора на матрицу
cout << "-----------------" << endl;
break;
case 6:
cout << "Введите количество строк первого вектора: ";
cin >> rowsV1;
cout << "Введите количество столбцов первого вектора: ";
cin >> columnsV1;
cout << "Введите количество строк второго вектора: ";
cin >> rowsV2;
cout << "Введите количество столбцов второго вектора: ";
cin >> columnsV2;
if (rowsV2 != columnsV1)
{
cout << "Количество строк первого вектора должно совпадать с количеством столбцов второго вектора";
return 0;
}
vektor1.Filling(rowsV1, columnsV1); // заполнение рандомными числами вектора
cout << "Первый вектор содержит следующие числа: " << endl;
vektor1.Output();
vektor2.Filling(rowsV2, columnsV2); // заполнение рандомными числами вектора
cout << "Второй вектор содержит следующие числа: " << endl;
vektor2.Output();
cout << "Первый вектор, умноженный на второй вектор выглядит следующим образом: " << endl;
cout << "-----------------" << endl;
Vektor_Multiply_Vektor(vektor1, vektor2); // умножение вектора на матрицу
cout << "-----------------" << endl;
default:
cout << "Введите числа из выше преведенных." << endl;
break;
}
return 0;
}
Скріншот роботи програми:
Висновок: На лабораторній роботі я покращив свої вміння з дисципліни ООП.