Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабки / ооп_10лаб

.docx
Скачиваний:
1
Добавлен:
27.01.2024
Размер:
883.51 Кб
Скачать

Варіант 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;

}

Скріншот роботи програми:

Висновок: На лабораторній роботі я покращив свої вміння з дисципліни ООП.

Соседние файлы в папке лабки