Как создать матрицу в c

от admin

Лекция 13

Допустим нам необходимо создать матрицу 3×4, тогда мы можем попробовать реализовать её следующим образом.

Но так сделать не получится, потому что произойдёт ошибка компиляции: мы не определили конструктор по умолчанию. Необходимо добавить в класс myvector следующую строку.

Теперь мы имеем 3 экземпляра класса myvector с размером 0. Чтобы увеличить размер всех векторов выполним для каждого из них resize() .

В данном случае значение элемента будет присваиваться по ссылке, поэтому передаваемый объект будет очень маленьким.

Рассмотрим, как данная матрица будет выглядеть в памяти.

Будет ли данная динамическая память возвращена системе?

При выходе из блока < … m[1][2] = 777; >, будет вызван деструктор

m() выполняющий delete[] data .

Замечание. Если data является массивом объектов некоторого класса, тогда до возврата своей памяти он вызывает деструкторы всех элементов этого массива. То есть сначала будут освобождены массивы int , а за тем массив data .

Реализация класса matrix

Если в списке инициализации мы забыли вызвать конструктор подобъекта являющегося объектом другого класса, то сгенерируется код вызывающий конструктор этого объекта по умолчанию.

Деструктор для данного класса писать не надо. Будет сгенерирован деструктор по умолчанию

Правило. Деструкторы всех подобъектов вызываются автоматически в эпилоге (перед закрытием фигурной скобки деструктора основного объекта). Первым вызовется деструктор основного объекта. Деструкторы вызываются в порядке обратном порядку вызова конструкторов. То есть последовательность вызовов конструкторов и деструкторов будет следующая.

  1. Конструктор подобъекта
  2. Конструктор основного объекта
  3. Деструктор основного объекта
  4. Деструктор подобъекта

Операция доступа по индексу в matrix

m[1, 2] — в C++ так писать нельзя

m[1][2] — класс matrix не контролирует [2]

Поэтому лучше всего перегрузить operator() , тогда обращение по индексу будет выглядеть следующим образом m(1, 2) .

Так как operator() будет inline -функцией, то в результате вызов m(1, 2) будет преобразован следующим образом:

Конструктор копий и operator= для класса matrix

Их писать не нужно. Они сгенерируются автоматически и будут работать правильно. Конструктор копии и operator= необходимо писать вручную, только если мы в конструкторе данного класса выделяем динамическую память, а в деструкторе ее явно возвращаем. Если в классе есть подобъект, который берет на себя все функции, то определять эти члены не нужно.

Как работают автоматически сгенерированные конструктор копии и операция присваивания?

Автоматически сгенерированный конструктор копии вызывает конструкторы копий для всех своих полей. Автоматически сгенерированная операция присваивания вызывает операции присваивания для всех своих полей.

C#: Класс "Матрица" (сложение, вычитание, умножение матриц)

Данный класс позволяет производить некоторые операции над матрицами:

  1. Сложение матрицы А с матрицой Б
  2. Вычитание матрицы Б из матрицы А
  3. Умножение матрицы А на матрицу Б
  4. Умножение матрица А на число
  5. Проверка матрицы А на единичность
  6. Выполнение нексольких операций над матрицами одновременно, образуя матрицу D

Так же он содержит операторы перегрузки и скрытые поля для соблудения инкапсуляции.

Csharp Star

Tutorials, Tips and Tricks on Microsoft Technologies !!

Create a Matrix and different Matrix operations in C#

In this article, we will learn:

  • Create a Matrix in C#
  • Matrix Addition in C#
  • Matrix Subtraction in C#
  • Matrix Multiplication in C#
  • Transpose a Matrix in C#

Let’s start with how to create a matrix in C#.

1. Creation Of Matrix in C# :

Output:

1 2 3
4 5 6
7 8 9

Press any key to continue…

2. Matrix addition in C# :

Output:

Enter Number Of Rows And Columns Of Matrices A and B :3
2
Enter The First Matrix :5
4
8
6
1
3
Enter The Second Matrix :9
2
8
6
3
0
Sum Matrix:14 6
16 12
4 3

3. Matrix Subtraction in C# :

Output:

Enter Number Of Rows And Columns Of Matrices A and B : 2
3
Enter The First Matrix :7
6
9
4
8
2
Enter The Second Matrix :6
9
1
2
5
7
Matrix A:
7 6 9
4 8 2
Matrix B:
6 9 1
2 5 7
Difference Matrix:
1 -3 8
2 3 -5

4. Matrix Multiplication in C# :

Output:

Enter the number of Rows and Columns:2
3
Enter the First Matrix:
7
6
1
2
3
8
First Matrix is :
7 6 1
2 3 8
Enter the Second Matrix:
4
9
1
7
3
8
Second Matrix is :
4 9
7 3
Matrix multiplication is :
70 81 55
29 27 26

5. Transpose of a matrix:

Transpose of a matrix is formed by turning all rows of a matrix into columns and columns into rows.

Output:

Enter the Order of the Matrix :2
3
Enter the Matrix Elements:
7
2
9
1
6
3
Matrix A:
7 2 9
1 6 3
Transpose Matrix:
7 1 0
2 6 0
9 3 0

Пример создания двумерной матрицы на форме. Аналог компонента TStringGrid в Delphi

Часто в задачах нужно ввести числа или другие данные в двумерный массив (матрицу) и иметь возможность их обрабатывать.

В работе реализован аналог компонента TStringGrid используемого в Delphi для представления данных в виде двумерной таблицы строк. Для этого в C# используется двумерный массив элементов управления типа TextBox .

Содержание

Поиск на других ресурсах:

Условие задачи

Составить программу, которая осуществляет произведение двух матриц размерностью n . Матрицы вводятся из клавиатуры в отдельной форме и заносятся во внутренние структуры данных. Пользователь имеет возможность просмотреть результирующую матрицу.

Также есть возможность сохранения результирующей матрицы в текстовом файле “ Res_Matrix.txt ”.

Выполнение

1. Запуск Microsoft Visual Studio . Создание проекта

Подробный пример запуска Microsoft Visual Studio и создания приложения по шаблону Windows Forms Application описывается в теме:

Сохранить проект под любым именем.

2. Создание главной формы Form1

Создать форму, как показано на рисунке 1.

Разместить на форме элементы управления следующих типов:

  • четыре элемента управления типа Button . Автоматически будут созданы четыре объекта (переменные) с именами button1 , button2 , button3 , button4 ;
  • три элемента управления типа Label с именами label1 , label2 , label3 ;
  • один элемент управления типа TextBox , доступ к которому можно получить по имени textBox1 .

Сформировать свойства элементов управления типа Button и Label:

  • в объекте button1 свойство Text = “ Ввод матрицы 1 … «;
  • в объекте button2 свойство Text = “ Ввод матрицы 2 … «;
  • в объекте button3 свойство Text = “Результат …» ;
  • в объекте button4 свойство Text = “ Сохранить в файле “Res_Matr.txt” ”;
  • в элементе управления label1 свойство Text = “ n = ”.

Для настройки вида и поведения формы нужно выполнить следующие действия:

  • установить название формы. Для этого свойство Text = “ Произведение матриц ”;
  • свойство StartPosition = “ CenterScreen ” (форма размещается по центру экрана);
  • свойство MaximizeBox = “ false ” (убрать кнопку развертывания на весь экран).

C# Windows Forms Форма приложения

Рис. 1. Форма приложения

3. Создание второстепенной формы Form2

Во второстепенной форме Form2 будут вводиться данные в матрицы и выводиться исходный результат.

Пример создания новой формы в MS Visual Studio – C# подробно описан здесь .

Добавить новую форму к приложению, вызвав команду

В открывшемся окне выбрать « Windows Form ». Имя файла оставить без изменений « Form2.cs ».

Разместить на форме в любом месте элемент управления типа Button (рис. 2). В результате будет получен объект с именем button1.

В элементе управления button1 нужно установить следующие свойства:

  • свойство Text = “ OK ”;
  • свойство DialogResult = “ OK ” (рис. 3). Это означает, что при нажатии (клике «мышкой») на button1, окно закроется с кодом возвращения равным “ OK ”;
  • свойство Modifiers = “Public”. Это означает, что кнопка button1 будет видимой из других модулей (из формы Form1).

Настроить свойства формы Form2:

  • свойство Text = “ Ввод матрицы ”;
  • свойство StartPosition = “CenterScreen” (форма размещается по центру экрана);
  • свойство MaximizeBox = “false” (убрать кнопку развертывания на весь экран).

C# Windows Forms Форма Form2

Рис. 2. Форма Form2 после настройки

C# Windows Forms Свойство DialogResult элемент управления Button

Рис. 3. Свойство DialogResult элемента управления button1 формы Form2

4. Ввод внутренних переменных

Следующий шаг – введение внутренних переменных в текст модуля “ Form1.cs ”.

Для этого сначала нужно активировать модуль “ Form1.cs ”.

В тексте модуля “ Form1.cs ” добавляем следующий код:

Объясним некоторые значения переменных:

  • Max – максимально-допустимая размерность матрицы;
  • n – размерность матрицы, введенная пользователем из клавиатуры в элементе управления TextBox1;
  • MatrText – двумерная матрица элементов управления типа TextBox. В эту матрицу будут вводиться элементы матрицы в виде строк. Ввод данных будет формироваться в форме Form2;
  • Matr1, Matr2 – матрицы элементов типа double, в которые будут копироваться данные из матрицы MatrText;
  • Matr3 – результирующая матрица, которая равная произведению матриц Matr1 и Matr2;
  • f1, f2 – переменные, определяющие были ли введенные данные соответственно в матрицы Matr1 и Matr2;
  • dx, dy – габариты одной ячейки типа TextBox в матрице MatrText;
  • form2 – объект класса формы Form2, по которыму будет получен доступ к этой форме.
5. Программирование события Load формы Form1

Процесс программирования любого события в Microsoft Visual C# подробно описан здесь .

Листинг обработчика события Load формы Form1 следующий:

Объясним некоторые фрагменты кода в методе Form1_Load().

Событие Load генерируется (вызывается) в момент загрузки любой формы. Поскольку форма Form1 есть главной формой приложения, то событие Load формы Form1 будет вызываться сразу после запуска приложения на выполнение. Поэтому, здесь целесообразно ввести начальную инициализацию глобальных элементов управления и внутренних переменных программы. Эти элементы управления могут быть вызваны из других методов класса.

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

Память выделяется в два этапа:

  • для самой матрицы MatrText – как двумерного массива;
  • для каждого элемента матрицы, который есть сложным объектом типа TextBox.

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

Также каждая созданная ячейка добавляется (размещается) на форму Form2 с помощью метода Add() из класса Controls. Каждая новая ячейка может быть добавлена в любую другую форму приложения.

6. Разработка дополнительного метода обнуления данных в матрице MatrText

В будущем, чтобы многократно не использовать код обнуления строк матрицы MatrText, нужно создать собственный метод (например, Clear_MatrText()) реализующий этот код.

Листинг метода Clear_MatText() следующий:

7. Программирование события клика на кнопке button1 (« Ввод матрицы 1 … »)

При нажатии (клике) на button1 должно вызываться окно ввода новой матрицы. Размер матрицы зависит от значения n .

Листинг обработчика события клика на кнопке button1 следующий:

В вышеприведенном листинге читается значение n . После этого осуществляется настройка ячеек матрицы строк MatrText.

На основе введенного значения n формируются размеры формы form2 и позиция кнопки button1.

Если в форме Form2 пользователь нажал на кнопке OK (button2), то строки с MatrText переносятся в двумерную матрицу вещественных чисел Matr1. Преобразование из строки в соответствующее вещественное число выполняется методом Parse() из класса Double.

Также формируется переменная f1, которая указывает что данные в матрицу Matr1 внесены.

8. Программирование события клика на кнопке button2 (“ Ввод матрицы 2… «)

Листинг обработчика события клика на кнопке button2 подобен листингу обработчика события клика на кнопке button1. Только он отличается шагами 7-8. На этом участке формируются матрица Matr2 и переменная f2.

9. Программирование события Leave потери фокуса ввода элементом управления textBox1

В приложении может возникнуть ситуация, когда пользователь изменяет значение n на новое. В этом случае должны заново формироваться флажки f1 и f2. Также изменяется размер матрицы MatrText, которая выводится в форме Form2.

Изменение значения n можно проконтролировать с помощью события Leave элемента управление textBox1. Событие Leave генерируется в момент потери фокуса ввода элементом управления textBox1 (рис. 4).

C# Windows Forms Событие Leave элемента управления textBox1

Рис. 4. Событие Leave элемента управления textBox1

Листинг обработчика события Leave следующий:

10. Программирование события клика на кнопке button3 (« Результат »)

Вывод результата будет осуществляться в ту же форму, в которой вводились матрицы Matr1 и Matr2. Сначала произведение этих матриц будет сформировано в матрице Matr3. Потом значение с Matr3 переносится в MatrText и отображается на форме Form2.

Листинг обработчика события клика на кнопке button3.

11. Программирование события клика на кнопке button4 (« Сохранить в файле «Res_Matr.txt” ”)

Для сохранения результирующей матрицы Matr3 можно использовать возможности класса FileStream.

Класс FileStream описан в модуле System.IO . Поэтому в начале приложения нужно добавить следующий код:

Листинг обработчика события клика на кнопке button4 следующий:

12. Запуск приложения на выполнение

После этого можно запускать приложение на выполнение и тестировать его работу.

Читать:
Как найти все пифагоровы тройки включающие число

Похожие статьи