ЛР №2

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 6

Вінницький Національний Технічний Університет

Факультет інформаційних технологій та комп’ютерної інженерії


Кафедра обчислювальної техніки

Лабораторна робота №2
з програмування
Тема: “Розробка класів’’

Виконала
студентка гр. КІ-23мсз
Язвінська Д. І.
Перевірив
Кисюк Д.В.

Вінниця 2023
Варіант 11
11. Скласти описи класу, що забезпечує подання матриці заданого
розміру nm та будь-якого мінору в ній. Пам'ять для матриці виділяти
динамічно. Написати кілька конструкторів, зокрема конструктор копіювання.
Реалізувати методи для відображення на екрані як матриці загалом,
так і заданого мінору, а також зміни мінору; додавання, віднімання, множення
мінорів. Перевантажити операції додавання, віднімання, множення та
присвоювання для даного класу. Створити масив об'єктів даного класу і
передати їх у функцію, яка змінює для матриці її мінор шляхом множення на
константу.

using System;
using System.Text;

class Matrix
{
private int[,] data;
private int rows;
private int cols;
public const int MatrixSize = 3; // Розмір кожної матриці

public Matrix(int n, int m)


{
rows = n;
cols = m;
data = new int[n, m];
RandomFill();
}

public Matrix(Matrix other)


{
rows = other.rows;
cols = other.cols;
data = (int[,])other.data.Clone();
}

public (int Rows, int Cols) Size => (rows, cols);

public int this[int row, int col]


{
get => data[row, col];
set => data[row, col] = value;
}

public void DisplayMatrix()


{
for (int i = 0; i < rows; i++)
{
Console.WriteLine(string.Join("\t", GetRowElements(i)));
}
}

public void DisplayMinor(int startRow, int startCol, int minorRows, int minorCols)
{
if (startRow + minorRows > rows || startCol + minorCols > cols)
{
Console.WriteLine("Невірні розміри мінора.");
return;
}

for (int i = startRow; i < startRow + minorRows; i++)


{
Console.WriteLine(string.Join("\t", GetRowElements(i, startCol, minorCols)));
}
}

public void ChangeMinor(int startRow, int startCol, int minorRows, int minorCols, int[,] newValues)
{
if (startRow + minorRows > rows || startCol + minorCols > cols)
{
Console.WriteLine("Невірні розміри мінора.");
return;
}

for (int i = startRow; i < startRow + minorRows; i++)


{
for (int j = startCol; j < startCol + minorCols; j++)
{
data[i, j] = newValues[i - startRow, j - startCol];
}
}
}

public void MultiplyByScalar(int scalar)


{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
data[i, j] *= scalar;
}
}
}

public static Matrix operator +(Matrix matrix1, Matrix matrix2)


{
if (matrix1.Size != matrix2.Size)
{
throw new ArgumentException("Розміри матриць повинні співпадати для додавання.");
}

Matrix result = new Matrix(matrix1.rows, matrix1.cols);

for (int i = 0; i < result.rows; i++)


{
for (int j = 0; j < result.cols; j++)
{
result[i, j] = matrix1[i, j] + matrix2[i, j];
}
}

return result;
}

public static Matrix operator -(Matrix matrix1, Matrix matrix2)


{
if (matrix1.Size != matrix2.Size)
{
throw new ArgumentException("Розміри матриць повинні співпадати для віднімання.");
}

Matrix result = new Matrix(matrix1.rows, matrix1.cols);


for (int i = 0; i < result.rows; i++)
{
for (int j = 0; j < result.cols; j++)
{
result[i, j] = matrix1[i, j] - matrix2[i, j];
}
}

return result;
}

public static Matrix operator *(Matrix matrix1, Matrix matrix2)


{
if (matrix1.cols != matrix2.rows)
{
throw new ArgumentException("Кількість стовпців у першій матриці повинна співпадати з кількістю рядків
у другій для множення.");
}

int resultRows = matrix1.rows;


int resultCols = matrix2.cols;
Matrix result = new Matrix(resultRows, resultCols);

for (int i = 0; i < resultRows; i++)


{
for (int j = 0; j < resultCols; j++)
{
int sum = 0;
for (int k = 0; k < matrix1.cols; k++)
{
sum += matrix1[i, k] * matrix2[k, j];
}
result[i, j] = sum;
}
}

return result;
}

public static Matrix operator *(Matrix matrix, int scalar)


{
Matrix result = new Matrix(matrix.rows, matrix.cols);

for (int i = 0; i < matrix.rows; i++)


{
for (int j = 0; j < matrix.cols; j++)
{
result[i, j] = matrix[i, j] * scalar;
}
}

return result;
}

private int[] GetRowElements(int rowIndex, int startCol = 0, int count = int.MaxValue)


{
return Enumerable.Range(startCol, Math.Min(count, cols - startCol))
.Select(col => data[rowIndex, col])
.ToArray();
}

private void RandomFill()


{
Random random = new Random();

for (int i = 0; i < rows; i++)


{
for (int j = 0; j < cols; j++)
{
data[i, j] = random.Next(1, 10); // Заповнення випадковими числами від 1 до 9 (можна змінити діапазон за
потреби)
}
}
}
}

class Program
{
static void Main(string[] args)
{
Console.InputEncoding = Console.OutputEncoding = Encoding.Unicode;
Matrix[] matrices = new Matrix[3]
{
new Matrix(Matrix.MatrixSize, Matrix.MatrixSize),
new Matrix(Matrix.MatrixSize, Matrix.MatrixSize),
new Matrix(Matrix.MatrixSize, Matrix.MatrixSize)
};

for (int k = 0; k < matrices.Length; k++)


{
Console.WriteLine($"Матриця {k + 1}:");
matrices[k].DisplayMatrix();
Console.WriteLine();
}

int scalar = 2;
MultiplyMatricesByScalar(matrices, scalar);

Console.WriteLine($"Множення всіх матриць на {scalar}:");


for (int k = 0; k < matrices.Length; k++)
{
Console.WriteLine($"Матриця {k + 1} після множення:");
matrices[k].DisplayMatrix();
Console.WriteLine();
}

Console.ReadKey();
}

static void MultiplyMatricesByScalar(Matrix[] matrices, int scalar)


{
foreach (var matrix in matrices)
{
matrix.MultiplyByScalar(scalar);
}
}
}

You might also like