Основные операции с матрицами в C#: сложение и вычитание

Категория:

В данной статье будут рассмотрены две основные операции с матрицами: вычитание и сложение. Реализация будет производиться на языке программирования сишарп (C#, CSharp). Для простоты понимания примера в качестве входных данных будут целые числа, а также не будет реализовываться какая либо проверка на валидность вводимых чисел. Так сделано, чтобы новый материал проще было воспринять. Также здесь не будет подробной теории по матрицам, так как упор идет на практическую часть реализации. А найти теорию можно без проблем на каком-либо стороннем сайте или прочитать в книге.

Теоритическая часть

  • Для сложения или вычитания матриц, они должны быть абсолютно одинаковыми. То есть количество строк и столбцов первой матрицы, должно совпадать с количеством строк и столбцов второй матрицы. 
  • Сложение и вычитание выполняется поэлементно. Текущий элемент с индексом ij матрицы "A" складывается с текущим элементом индекса ij матрицы "B".

Подготовительная часть - проектирование формы

Для начала нужно создать новый проект в Visual Studio (в примере будет использоваться Visual Studio 2017, но можно использовать, ту, которая установлена на данный момент). Если Вы не знаете как это делается, то можно предварительно прочитать статью по созданию нового проекта Visual C#.

Далее размещаем нужные компоненты на форму. Кнопки Button, сетки DataGridView, метки Label, флажок CheckBox, контейнер GroupBox, поля редактирования TextBox и несколько элементов RadioButton для переключения между операциями (сложение или вычитание).

В итоге форма будет выглядеть как на изображении ниже.

Поля ввода будут использоваться для ввода размерностей матриц. В данной реализации размерность будет задаваться сразу двум матрицам (сетки DataGridView). После инициализации матриц можно выполнять вычисление.

Создание программного кода

Первое, что делаем - создаем основной класс в котором будет содержаться код для работы с матрицами. Его необходимо назвать Matrix (далее будет вызываться в основной программе). Данный класс приложен в конце статьи в виде текстового файла matrix.cs.txt, чтобы не загромождать страницу большим объемом кода.

Еще необходимо создать GridParams, в котором будет помещены общие константы и статические методы, которые будут использоваться в основной форме и в форме вывода результата.

В нем имеется три статических метода:  

  • SetColumnWidth - задание ширины столбцов;
  • SetRowsHeight - задание высоты сток;
  • FillGrids - загрузка чисел из класса Matrix.

Класс GridParams также добавлен в конце статьи. 

Перед тем как начать писать обработчики на основной форме, нужно объявить несколько переменных в которых будут храниться матрицы:

private Matrix matrixA;
private Matrix matrixB;

Чтобы найти нужное место в коде программы нужно в обозревателе решений щелкнуть по названию формы, в которой размещены элементы управления для работы с матрицами. В данном примере файл формы назван как GridMatrix.cs, а ее имя frmMatrix для обращения в коде. Щелкаем по треугольникам с раскрывающимися списками и там выбираем GridMatrix.cs->GridMatrix.Designer.cs->frmMatrix. Далее в раскрывшейся структуре класса формы выбираем frmMatrix() двойным кликом.

В итоге код в начале класса будет выглядеть следующим образом:

public partial class frmMatrix : Form
{
    private Matrix matrixA;
    private Matrix matrixB;

    public frmMatrix()
   {
       InitializeComponent();
    }

   // Другой код...

Теперь создаем обработчик для кнопки "Инициализация матриц". Предварительно данной кнопке нужно дать имя btnSetMatrixSize.

private void btnSetMatrixSize_Click(object sender, EventArgs e)
{
     // Код обработчика

}

В данном обработчике сначала из полей задания размерностей матриц берется количество строк и столбцов (также соответствующим полям на форме необходимо задать имена - editRows и editCols соответственно). Затем происходит создание двух экземпляров класса Matrix путем выполнения следующих инструкций:

matrixA = Matrix.SetColAndRow(countsRows, countsCols);
matrixB = Matrix.SetColAndRow(countsRows, countsCols);

Задаем количество строк и столбцом для матриц на форме:

// Задание кол-ва строк и столбцов матрицы А
gridMatrixA.RowCount = countsRows;
gridMatrixA.ColumnCount = countsCols;

// Задание кол-ва строк и столбцов матрицы В
gridMatrixB.RowCount = countsRows;
gridMatrixB.ColumnCount = countsCols;

Производим настройки ширины и высоты ячеек матриц на форме:

GridParams.SetColumnWidth(gridMatrixA, GridParams.COLUMN_WIDTH);
GridParams.SetColumnWidth(gridMatrixB, GridParams.COLUMN_WIDTH);
GridParams.SetRowsHeight(gridMatrixA, GridParams.ROWS_HEIGHT);
GridParams.SetRowsHeight(gridMatrixB, GridParams.ROWS_HEIGHT);

Производим генерацию чисел, если был установлен соответсвующий флаг на форме (необходимо предварительно задать имя chkGenNumber):

if (chkGenNumber.Checked)
{
    matrixA.FillRandomNumber(GridParams.MIN_VALUE, GridParams.MAX_VALUE);
    matrixB.FillRandomNumber(GridParams.MIN_VALUE, GridParams.MAX_VALUE);

Заполняем созданные объекты массивов из сеток с числами для матриц:

GridParams.FillGrids(gridMatrixA, matrixA);
GridParams.FillGrids(gridMatrixB, matrixB);

Теперь возвращаемся на форму и щелкаем по кнопке "Вычислить", чтобы создать еще один обработчик. Данную кнопку необходимо назвать btnCalk.

В итоге у нас выйдет такой обработчик:

private void btnCalk_Click(object sender, EventArgs e)
{
    frmResults frmRes;

    if (radAdd.Checked)
    {
        frmRes = new frmResults(matrixA.Add(matrixB));
    } else
    {
        frmRes = new frmResults(matrixA.Sub(matrixB));
    }

    frmRes.ShowDialog();
   frmRes = null;
}

В данном коде создается переменная формы для вывода результата. Потом проверяется условие, чтобы определить какая операция необходима для выполнения. В форму в конструктор сразу передается результат вычисления в формате объекта Matrix. Выполняется метод Add (сложение) или Sub (вычитание). В первый объект матрицы в качестве аргумента функции передается другой объект матрицы.

И там уже происходит вычисление и возвращение новой матрицы:

public Matrix Add(Matrix MatrixB)
{
    Matrix resultMatrix = SetColAndRow(this.countRow, this.countCol);

    int result;
    for (int i = 0; i < this.countRow; i++)
    for (int j = 0; j < this.countCol; j++)
    {
        result = this.grid[i, j] + MatrixB.GetElementValue(i, j);
        resultMatrix.SetElementValue(i, j, result);
    }

    return resultMatrix;
}

В данном коде происходит поэлементный перебор двух матриц и сложение этих элементов. А затем после перебора возвращается новый объект матрицы. 

Для метода Sub все происходит аналогичным способом, но вместо операции "+" используется операция "-". 

Заключение

На этом данную статью завершу. Здесь не стал выкладывать весь код, чтобы не раздувать материал до очень больших размеров. Весь исходный код можно загрузить на свой компьютер и посмотреть уже в своей студии.

Файлы к статье: 
Возможно заинтересует: 

Свежая подборка идей по разработке программ на 2021 год

Категория:

Очередная подборка идей программ по программированию на 2021 год. Идеи подойдут для любого языка высокого уровня - Delphi, Visual C#, Java и даже можно создать полноценное веб приложение.

Программа для работы с матрицами в Visual C# .NET 2017

Код продукта: 
463

Готовый проект для лабораторной работы по практикуму объектно-ориентированного программирования на языке C# реализующий базовую работу с матрицами: сложение, вычитание и умножение.

Дипломная работа по программированию калькулятора в Delphi

Код продукта: 
253

Пояснительная записка для дипломного проекта по разработке инженерного калькулятора в Delphi 7 состоит из 21 листа стандартным размером шрифта (14 пт.) с одинарным интервалом, приложениями и в качестве бонуса блок-схема в Corel Draw.