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

Варіант 6

Лабораторна робота10

Тема роботи: Проектування і реалізація програми

з перевантаженням функцій.

Основні завдання роботи

Розробити та реалізувати програмний додаток, який оперує над

множенням матриць та векторів. Для цього:

1. Розробити та реалізувати програмно клас матриця.

2. Розробити та реалізувати програмно клас вектор.

3. Реалізувати програмно перевантаження функції множення вектора

на матрицю, матриці на вектор, матриці на матрицю, множення числа на

матрицю, матриці на число.

4. Продемонструвати роботу створених класів та їх функцій в

основній частині програми.

Код програми:

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

}

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

Висновки:

На лабораторній роботі №10 я засвоїв поняття статичного поліморфізму через перевантаження функцій; набув навичок використання практичних прийомів перевантаження функцій та аргументів за замовчуванням.

Соседние файлы в папке еще какието лабки разных вариантов